]> git.sesse.net Git - casparcg/commitdiff
(no commit message)
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Mon, 12 Jul 2010 15:06:04 +0000 (15:06 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Mon, 12 Jul 2010 15:06:04 +0000 (15:06 +0000)
153 files changed:
BluefishSDK_V5_8_0_31/Inc/BlueC_Api.h [new file with mode: 0644]
BluefishSDK_V5_8_0_31/Inc/BlueHancUtils.h [new file with mode: 0644]
BluefishSDK_V5_8_0_31/Inc/BlueLUTCreation.h [new file with mode: 0644]
BluefishSDK_V5_8_0_31/Inc/BlueTimer.h [new file with mode: 0644]
BluefishSDK_V5_8_0_31/Inc/BlueTypes.h [new file with mode: 0644]
BluefishSDK_V5_8_0_31/Inc/BlueVelvet.h [new file with mode: 0644]
BluefishSDK_V5_8_0_31/Inc/BlueVelvet4.h [new file with mode: 0644]
BluefishSDK_V5_8_0_31/Inc/BlueVelvet_c.h [new file with mode: 0644]
BluefishSDK_V5_8_0_31/Inc/BluefishApi.h [new file with mode: 0644]
BluefishSDK_V5_8_0_31/Inc/bluedriver_p.h [new file with mode: 0644]
BluefishSDK_V5_8_0_31/Inc/bluehanc.h [new file with mode: 0644]
BluefishSDK_V5_8_0_31/Lib/BlueFishFilters.lib [new file with mode: 0644]
BluefishSDK_V5_8_0_31/Lib/BlueHancUtils.lib [new file with mode: 0644]
BluefishSDK_V5_8_0_31/Lib/BlueHancUtils64.lib [new file with mode: 0644]
BluefishSDK_V5_8_0_31/Lib/BlueHancUtils64_d.lib [new file with mode: 0644]
BluefishSDK_V5_8_0_31/Lib/BlueHancUtils_d.lib [new file with mode: 0644]
BluefishSDK_V5_8_0_31/Lib/BlueTimer.lib [new file with mode: 0644]
BluefishSDK_V5_8_0_31/Lib/BlueVelvet3.lib [new file with mode: 0644]
BluefishSDK_V5_8_0_31/Lib/BlueVelvet3_d.lib [new file with mode: 0644]
BluefishSDK_V5_8_0_31/Lib/BlueVelvet64.lib [new file with mode: 0644]
BluefishSDK_V5_8_0_31/Lib/BlueVelvet64_d.lib [new file with mode: 0644]
BluefishSDK_V5_8_0_31/Lib/BlueVelvetCom.lib [new file with mode: 0644]
BluefishSDK_V5_8_0_31/Lib/BlueVelvetCom.tlb [new file with mode: 0644]
BluefishSDK_V5_8_0_31/Lib/BlueVelvetConstant.tlb [new file with mode: 0644]
BluefishSDK_V5_8_0_31/Lib/BluefishApiStatic.lib [new file with mode: 0644]
BluefishSDK_V5_8_0_31/Lib/BluefishApi_d.lib [new file with mode: 0644]
BluefishSDK_V5_8_0_31/Lib/BluefishFilters.tlb [new file with mode: 0644]
GLee5_4/GLee.c [new file with mode: 0644]
GLee5_4/GLee.h [new file with mode: 0644]
GLee5_4/GLee.lib [new file with mode: 0644]
GLee5_4/extensionList.txt [new file with mode: 0644]
GLee5_4/readme.txt [new file with mode: 0644]
WTL80/CPL.TXT [new file with mode: 0644]
WTL80/include/atlapp.h [new file with mode: 0644]
WTL80/include/atlcrack.h [new file with mode: 0644]
WTL80/include/atlctrls.h [new file with mode: 0644]
WTL80/include/atlctrlw.h [new file with mode: 0644]
WTL80/include/atlctrlx.h [new file with mode: 0644]
WTL80/include/atlddx.h [new file with mode: 0644]
WTL80/include/atldlgs.h [new file with mode: 0644]
WTL80/include/atlfind.h [new file with mode: 0644]
WTL80/include/atlframe.h [new file with mode: 0644]
WTL80/include/atlgdi.h [new file with mode: 0644]
WTL80/include/atlmisc.h [new file with mode: 0644]
WTL80/include/atlprint.h [new file with mode: 0644]
WTL80/include/atlres.h [new file with mode: 0644]
WTL80/include/atlresce.h [new file with mode: 0644]
WTL80/include/atlscrl.h [new file with mode: 0644]
WTL80/include/atlsplit.h [new file with mode: 0644]
WTL80/include/atltheme.h [new file with mode: 0644]
WTL80/include/atluser.h [new file with mode: 0644]
WTL80/include/atlwince.h [new file with mode: 0644]
WTL80/include/atlwinx.h [new file with mode: 0644]
WTL80/readme.htm [new file with mode: 0644]
tbb30_20100406oss/bin/ia32/vc10/irml/irml.dll [new file with mode: 0644]
tbb30_20100406oss/bin/ia32/vc10/irml/irml.pdb [new file with mode: 0644]
tbb30_20100406oss/bin/ia32/vc10/irml/irml_debug.dll [new file with mode: 0644]
tbb30_20100406oss/bin/ia32/vc10/irml/irml_debug.pdb [new file with mode: 0644]
tbb30_20100406oss/bin/ia32/vc10/irml_c/irml.dll [new file with mode: 0644]
tbb30_20100406oss/bin/ia32/vc10/irml_c/irml.pdb [new file with mode: 0644]
tbb30_20100406oss/bin/ia32/vc10/irml_c/irml_debug.dll [new file with mode: 0644]
tbb30_20100406oss/bin/ia32/vc10/irml_c/irml_debug.pdb [new file with mode: 0644]
tbb30_20100406oss/bin/ia32/vc10/tbb.dll [new file with mode: 0644]
tbb30_20100406oss/bin/ia32/vc10/tbb.pdb [new file with mode: 0644]
tbb30_20100406oss/bin/ia32/vc10/tbb_debug.dll [new file with mode: 0644]
tbb30_20100406oss/bin/ia32/vc10/tbb_debug.pdb [new file with mode: 0644]
tbb30_20100406oss/bin/ia32/vc10/tbbmalloc.dll [new file with mode: 0644]
tbb30_20100406oss/bin/ia32/vc10/tbbmalloc.pdb [new file with mode: 0644]
tbb30_20100406oss/bin/ia32/vc10/tbbmalloc_debug.dll [new file with mode: 0644]
tbb30_20100406oss/bin/ia32/vc10/tbbmalloc_debug.pdb [new file with mode: 0644]
tbb30_20100406oss/bin/ia32/vc10/tbbmalloc_proxy.dll [new file with mode: 0644]
tbb30_20100406oss/bin/ia32/vc10/tbbmalloc_proxy.pdb [new file with mode: 0644]
tbb30_20100406oss/bin/ia32/vc10/tbbmalloc_proxy_debug.dll [new file with mode: 0644]
tbb30_20100406oss/bin/ia32/vc10/tbbmalloc_proxy_debug.pdb [new file with mode: 0644]
tbb30_20100406oss/bin/ia32/vc10/tbbvars.bat [new file with mode: 0644]
tbb30_20100406oss/bin/ia32/vc10/tbbvars.csh [new file with mode: 0644]
tbb30_20100406oss/bin/ia32/vc10/tbbvars.sh [new file with mode: 0644]
tbb30_20100406oss/bin/tbbvars.bat [new file with mode: 0644]
tbb30_20100406oss/include/index.html [new file with mode: 0644]
tbb30_20100406oss/include/tbb/_concurrent_queue_internal.h [new file with mode: 0644]
tbb30_20100406oss/include/tbb/_concurrent_unordered_internal.h [new file with mode: 0644]
tbb30_20100406oss/include/tbb/_tbb_windef.h [new file with mode: 0644]
tbb30_20100406oss/include/tbb/aligned_space.h [new file with mode: 0644]
tbb30_20100406oss/include/tbb/atomic.h [new file with mode: 0644]
tbb30_20100406oss/include/tbb/blocked_range.h [new file with mode: 0644]
tbb30_20100406oss/include/tbb/blocked_range2d.h [new file with mode: 0644]
tbb30_20100406oss/include/tbb/blocked_range3d.h [new file with mode: 0644]
tbb30_20100406oss/include/tbb/cache_aligned_allocator.h [new file with mode: 0644]
tbb30_20100406oss/include/tbb/combinable.h [new file with mode: 0644]
tbb30_20100406oss/include/tbb/compat/condition_variable [new file with mode: 0644]
tbb30_20100406oss/include/tbb/compat/ppl.h [new file with mode: 0644]
tbb30_20100406oss/include/tbb/compat/thread [new file with mode: 0644]
tbb30_20100406oss/include/tbb/concurrent_hash_map.h [new file with mode: 0644]
tbb30_20100406oss/include/tbb/concurrent_queue.h [new file with mode: 0644]
tbb30_20100406oss/include/tbb/concurrent_unordered_map.h [new file with mode: 0644]
tbb30_20100406oss/include/tbb/concurrent_vector.h [new file with mode: 0644]
tbb30_20100406oss/include/tbb/critical_section.h [new file with mode: 0644]
tbb30_20100406oss/include/tbb/enumerable_thread_specific.h [new file with mode: 0644]
tbb30_20100406oss/include/tbb/index.html [new file with mode: 0644]
tbb30_20100406oss/include/tbb/machine/ibm_aix51.h [new file with mode: 0644]
tbb30_20100406oss/include/tbb/machine/linux_common.h [new file with mode: 0644]
tbb30_20100406oss/include/tbb/machine/linux_ia32.h [new file with mode: 0644]
tbb30_20100406oss/include/tbb/machine/linux_ia64.h [new file with mode: 0644]
tbb30_20100406oss/include/tbb/machine/linux_intel64.h [new file with mode: 0644]
tbb30_20100406oss/include/tbb/machine/mac_ppc.h [new file with mode: 0644]
tbb30_20100406oss/include/tbb/machine/sunos_sparc.h [new file with mode: 0644]
tbb30_20100406oss/include/tbb/machine/windows_ia32.h [new file with mode: 0644]
tbb30_20100406oss/include/tbb/machine/windows_intel64.h [new file with mode: 0644]
tbb30_20100406oss/include/tbb/machine/xbox360_ppc.h [new file with mode: 0644]
tbb30_20100406oss/include/tbb/mutex.h [new file with mode: 0644]
tbb30_20100406oss/include/tbb/null_mutex.h [new file with mode: 0644]
tbb30_20100406oss/include/tbb/null_rw_mutex.h [new file with mode: 0644]
tbb30_20100406oss/include/tbb/parallel_do.h [new file with mode: 0644]
tbb30_20100406oss/include/tbb/parallel_for.h [new file with mode: 0644]
tbb30_20100406oss/include/tbb/parallel_for_each.h [new file with mode: 0644]
tbb30_20100406oss/include/tbb/parallel_invoke.h [new file with mode: 0644]
tbb30_20100406oss/include/tbb/parallel_reduce.h [new file with mode: 0644]
tbb30_20100406oss/include/tbb/parallel_scan.h [new file with mode: 0644]
tbb30_20100406oss/include/tbb/parallel_sort.h [new file with mode: 0644]
tbb30_20100406oss/include/tbb/parallel_while.h [new file with mode: 0644]
tbb30_20100406oss/include/tbb/partitioner.h [new file with mode: 0644]
tbb30_20100406oss/include/tbb/pipeline.h [new file with mode: 0644]
tbb30_20100406oss/include/tbb/queuing_mutex.h [new file with mode: 0644]
tbb30_20100406oss/include/tbb/queuing_rw_mutex.h [new file with mode: 0644]
tbb30_20100406oss/include/tbb/reader_writer_lock.h [new file with mode: 0644]
tbb30_20100406oss/include/tbb/recursive_mutex.h [new file with mode: 0644]
tbb30_20100406oss/include/tbb/scalable_allocator.h [new file with mode: 0644]
tbb30_20100406oss/include/tbb/spin_mutex.h [new file with mode: 0644]
tbb30_20100406oss/include/tbb/spin_rw_mutex.h [new file with mode: 0644]
tbb30_20100406oss/include/tbb/task.h [new file with mode: 0644]
tbb30_20100406oss/include/tbb/task_group.h [new file with mode: 0644]
tbb30_20100406oss/include/tbb/task_scheduler_init.h [new file with mode: 0644]
tbb30_20100406oss/include/tbb/task_scheduler_observer.h [new file with mode: 0644]
tbb30_20100406oss/include/tbb/tbb.h [new file with mode: 0644]
tbb30_20100406oss/include/tbb/tbb_allocator.h [new file with mode: 0644]
tbb30_20100406oss/include/tbb/tbb_config.h [new file with mode: 0644]
tbb30_20100406oss/include/tbb/tbb_exception.h [new file with mode: 0644]
tbb30_20100406oss/include/tbb/tbb_machine.h [new file with mode: 0644]
tbb30_20100406oss/include/tbb/tbb_profiling.h [new file with mode: 0644]
tbb30_20100406oss/include/tbb/tbb_stddef.h [new file with mode: 0644]
tbb30_20100406oss/include/tbb/tbb_thread.h [new file with mode: 0644]
tbb30_20100406oss/include/tbb/tbbmalloc_proxy.h [new file with mode: 0644]
tbb30_20100406oss/include/tbb/tick_count.h [new file with mode: 0644]
tbb30_20100406oss/lib/ia32/vc10/irml/irml.lib [new file with mode: 0644]
tbb30_20100406oss/lib/ia32/vc10/irml/irml_debug.lib [new file with mode: 0644]
tbb30_20100406oss/lib/ia32/vc10/irml_c/irml.lib [new file with mode: 0644]
tbb30_20100406oss/lib/ia32/vc10/irml_c/irml_debug.lib [new file with mode: 0644]
tbb30_20100406oss/lib/ia32/vc10/tbb.lib [new file with mode: 0644]
tbb30_20100406oss/lib/ia32/vc10/tbb_debug.lib [new file with mode: 0644]
tbb30_20100406oss/lib/ia32/vc10/tbbmalloc.lib [new file with mode: 0644]
tbb30_20100406oss/lib/ia32/vc10/tbbmalloc_debug.lib [new file with mode: 0644]
tbb30_20100406oss/lib/ia32/vc10/tbbmalloc_proxy.lib [new file with mode: 0644]
tbb30_20100406oss/lib/ia32/vc10/tbbmalloc_proxy_debug.lib [new file with mode: 0644]

diff --git a/BluefishSDK_V5_8_0_31/Inc/BlueC_Api.h b/BluefishSDK_V5_8_0_31/Inc/BlueC_Api.h
new file mode 100644 (file)
index 0000000..5831699
--- /dev/null
@@ -0,0 +1,107 @@
+// The following ifdef block is the standard way of creating macros which make exporting \r
+// from a DLL simpler. All files within this DLL are compiled with the BLUEC_API_EXPORTS\r
+// symbol defined on the command line. this symbol should not be defined on any project\r
+// that uses this DLL. This way any other project whose source files include this file see \r
+// BLUEC_API_API functions as being imported from a DLL, whereas this DLL sees symbols\r
+// defined with this macro as being exported.\r
+#ifdef BLUEFISH_EXPORTS\r
+#define BLUE_CSDK_API __declspec(dllexport)\r
+#else\r
+#define BLUE_CSDK_API __declspec(dllimport)\r
+#endif\r
+#include "BlueTypes.h"\r
+#include "BlueDriver_p.h"\r
+\r
+#define IGNORE_SYNC_WAIT_TIMEOUT_VALUE (0xFFFFFFFF)\r
+\r
+\r
+#pragma once\r
+\r
+//\r
+//typedef enum _blue_video_engine_flags\r
+//{\r
+//     BLUE_CAPTURE_PREVIEW_ON_OUTPUT_CHANNEL_A=0x1,\r
+//     BLUE_CAPTURE_PREVIEW_ON_OUTPUT_CHANNEL_B=0x2,\r
+//     BLUE_CAPTURE_PREVIEW_ON_OUTPUT_CHANNEL_C=0x3,\r
+//     BLUE_CAPTURE_PREVIEW_ON_OUTPUT_CHANNEL_D=0x4\r
+//}blue_video_engine_flags;\r
+//\r
+typedef enum _EBLUEDMA_DIRECTION\r
+{\r
+       BLUEDMA_WRITE=0,\r
+       BLUEDMA_READ=1,\r
+       BLUEDMA_INVALID=3\r
+}EBLUEDMA_DIRECTION;\r
+\r
+typedef struct _EBlueConnectorPropertySetting\r
+{\r
+       EBlueVideoChannel channel;\r
+       EBlueConnectorIdentifier connector;\r
+       EBlueConnectorSignalDirection   signaldirection;\r
+       EBlueConnectorProperty propType;\r
+       VARIANT Value;\r
+}EBlueConnectorPropertySetting;\r
+\r
+\r
+typedef struct _blue_card_property\r
+{\r
+       EBlueVideoChannel       video_channel;\r
+       EBlueCardProperty       prop;\r
+       VARIANT  value;\r
+}blue_card_property;\r
+\r
+\r
+extern "C" {\r
+BLUE_CSDK_API unsigned int blue_device_count();\r
+BLUE_CSDK_API void * blue_attach_to_device(int device_id);\r
+BLUE_CSDK_API BERR blue_detach_from_device(void ** device_handle);\r
+\r
+//\r
+//BLUE_CSDK_API BERR blue_set_video_engine(            void * device_handle,\r
+//                                                                                     EBlueVideoChannel video_channel,\r
+//                                                                                     EEngineMode * video_engine,\r
+//                                                                                     BLUE_UINT32 video_engine_flag);\r
+BLUE_CSDK_API BERR blue_video_dma(                     void * device_handle,\r
+                                                                                       EBLUEDMA_DIRECTION      dma_direction,\r
+                                                                                       void * pFrameBuffer,\r
+                                                                                       BLUE_UINT32 FrameSize,\r
+                                                                                       BLUE_UINT32 BufferId,\r
+                                                                                       BLUE_UINT32 * dma_bytes_transferred,\r
+                                                                                       BLUE_UINT32 CardFrameOffset,\r
+                                                                                       OVERLAPPED      * pAsync\r
+                                                                       );\r
+\r
+\r
+/*\r
+       functions used to set the card property . This includes the video property \r
+       and the video connection/routing property.\r
+*/\r
+BLUE_CSDK_API BERR     blue_set_video_property(                void * device_handle,\r
+                                                                                       BLUE_UINT32 prop_count,\r
+                                                                                       blue_card_property * card_prop);\r
+\r
+BLUE_CSDK_API BERR     blue_get_video_property(                void * device_handle,\r
+                                                                                       BLUE_UINT32 prop_count,\r
+                                                                                       blue_card_property * card_prop);\r
+\r
+BLUE_CSDK_API BERR     blue_get_connector_property(void * device_handle,\r
+                                                                       BLUE_UINT32 VideoChannel,\r
+                                                                       BLUE_UINT32 *settingsCount,     // In: element count of settings array\r
+                                                                                                                               // Out: if settings is non-NULL, number of valid elements\r
+                                                                                                                               // Out: if settings is NULL, number of elements required\r
+                                                                       EBlueConnectorPropertySetting *settings // Caller allocates/frees memory\r
+                                                                       );\r
+\r
+BLUE_CSDK_API BERR     blue_set_connector_property(\r
+                                                                                       void * device_handle,\r
+                                                                                       BLUE_UINT32 settingsCount,\r
+                                                                                       EBlueConnectorPropertySetting *settings\r
+                                                                                       );\r
+\r
+//BLUE_CSDK_API BERR blue_wait_video_interrupt(void * device_handle,\r
+//                                                                                     EBlueVideoChannel  video_channel,\r
+//                                                                                     EUpdateMethod upd_fmt,\r
+//                                                                                     BLUE_UINT32 field_wait_count,\r
+//                                                                                     BLUE_UINT32 *field_count\r
+//                                                                                     );\r
+}
\ No newline at end of file
diff --git a/BluefishSDK_V5_8_0_31/Inc/BlueHancUtils.h b/BluefishSDK_V5_8_0_31/Inc/BlueHancUtils.h
new file mode 100644 (file)
index 0000000..10d8de2
--- /dev/null
@@ -0,0 +1,228 @@
+#pragma once\r
+\r
+#ifdef HANCUTILS_EXPORTS\r
+       #define HANCUTILS_API __declspec(dllexport)\r
+#elif defined(__APPLE__)\r
+       #define HANCUTILS_API\r
+       #define ATLTRACE        printf\r
+#else\r
+       #define HANCUTILS_API __declspec(dllimport)\r
+#endif\r
+\r
+#include "BlueDriver_p.h"\r
+\r
+\r
+\r
+\r
+extern "C"\r
+{\r
+/**\r
+@defgroup hanc_manipilation_function Embedded audio\r
+@{\r
+*/\r
+\r
+#pragma pack(push, hanc_struct, 1)\r
+/**\r
+@brief The structure is used to extract/insert  Embedded audio to and from the HANC stream of \r
+               Greed and Leon based cards.\r
+*/\r
+struct hanc_stream_info_struct\r
+{\r
+       BLUE_INT32 AudioDBNArray[4]; /**< Contains the DBN values that should be used for each of the embedded audio groups*/\r
+       BLUE_INT32 AudioChannelStatusBlock[4]; /**< channel status block information for each of the embedded audio group*/\r
+       BLUE_UINT32 flag_valid_time_code; /**< flag which identifies the validity of the time code member in the #hanc_stream_info_struct*/\r
+       BLUE_UINT64     time_code; /**< RP188 time code that was extracted from the HANC buffer or RP188 timecode which should be inserted \r
+                                                               into the HANC buffer*/\r
+       BLUE_UINT32 * hanc_data_ptr; /**< Hanc Buffer which should be used as the source or destination for either extraction or insertion */\r
+       BLUE_UINT32 video_mode; /**< video mode which this hanc buffer which be used with. We need this information for do the required audio distribution \r
+                                                               especially NTSC */\r
+       BLUE_UINT64 ltc_time_code;\r
+       BLUE_UINT64 sd_vitc_time_code;\r
+       BLUE_UINT64 rp188_ltc_time_code;\r
+       BLUE_UINT32 pad[126];\r
+};\r
+#define AUDIO_INPUT_SOURCE_EMB 0\r
+#define AUDIO_INPUT_SOURCE_AES 1\r
+struct hanc_decode_struct\r
+{\r
+       void * audio_pcm_data_ptr;                      // Buffer which would be used to store the extracted PCM\r
+                                                                               // audio data.\r
+       BLUE_UINT32 audio_ch_required_mask;     // which all audio channels should be extracted from the \r
+                                                                               // audio frame \r
+       BLUE_UINT32 type_of_sample_required;// type of destination  audio channel\r
+                                                                               //ie 16 bit ,24 bit or 32 bit PCM data \r
+       BLUE_UINT32 no_audio_samples;\r
+       BLUE_UINT64 timecodes[7];                       // Would extract the timecode information from the audio frame.\r
+       void * raw_hanc_pkt_data_ptr;           // This would contain the raw audio frame got from ORAC card.\r
+       BLUE_UINT32 sizeof_hanc_pkt_data_ptr;\r
+       BLUE_UINT32 avail_hanc_pkt_data_bytes;\r
+       BLUE_UINT32 audio_input_source;         // Used to select the audio input source. \r
+                                                                               // whether it is AES or Embedded.\r
+       BLUE_UINT32 audio_temp_buffer[16];      // this is used to store split audio sample \r
+                                                                               // which did not contain all its audio channels\r
+                                                                               // in one audio frame\r
+       BLUE_UINT32 audio_split_buffer_mask; // The mask would be used to make a note of \r
+                                                                               // split audio sample information for a frame.\r
+       BLUE_UINT32 pad[128];\r
+};\r
+\r
+#pragma pack(pop, hanc_struct)\r
+\r
+HANCUTILS_API BLUE_UINT32 encode_hanc_frame(\r
+                                       struct hanc_stream_info_struct * hanc_stream_ptr,\r
+                                       void * audio_pcm_ptr,BLUE_UINT32 no_audio_ch,BLUE_UINT32 \r
+                                       no_audio_samples,BLUE_UINT32 nTypeOfSample,BLUE_UINT32 emb_audio_flag);\r
+HANCUTILS_API BLUE_UINT32 encode_hanc_frame_ex( BLUE_UINT32 card_type,\r
+                                                                                               struct hanc_stream_info_struct * hanc_stream_ptr,\r
+                                                                                               void * audio_pcm_ptr,\r
+                                                                                               BLUE_UINT32 no_audio_ch,\r
+                                                                                               BLUE_UINT32 no_audio_samples,\r
+                                                                                               BLUE_UINT32 nTypeOfSample,\r
+                                                                                               BLUE_UINT32 emb_audio_flag);\r
+\r
+HANCUTILS_API BLUE_UINT32 create_embed_audiosample(void * raw_data_ptr,\r
+                                                                        BLUE_UINT32 * emb_data_ptr,\r
+                                                                        BLUE_UINT32  channels_per_audio_sample,\r
+                                                                        BLUE_UINT32 bytes_per_ch,\r
+                                                                        BLUE_UINT32 no_samples,\r
+                                                                        BLUE_UINT32 emb_audio_flags,\r
+                                                                        BLUE_UINT8 * Audio_Groups_DBN_Array,\r
+                                                                        BLUE_UINT8 * Audio_Groups_statusblock_Array);\r
+\r
+HANCUTILS_API BLUE_UINT32 * get_embed_audio_distribution_array(BLUE_UINT32 video_mode,BLUE_UINT32 sequence_no);\r
+\r
+\r
+HANCUTILS_API bool hanc_stream_analyzer(BLUE_UINT32 *src_hanc_buffer,struct hanc_stream_info_struct * hanc_stream_ptr);\r
+HANCUTILS_API bool hanc_decoder_ex(BLUE_UINT32 card_type,BLUE_UINT32 *src_hanc_buffer,struct hanc_decode_struct * hanc_decode_struct_ptr);\r
+\r
+/**\r
+@}\r
+*/\r
+\r
+/**\r
+@defgroup vanc_manipilation_function vanc packet I/O \r
+@{\r
+*/\r
+\r
+\r
+/**\r
+@brief enumerator used by VANC manipulation function on HD cards to notify whether \r
+               VANC pakcet shoule be inserted/extracted from VANC Y buffers or VANC CbCr buffer.\r
+               This enumerator will only be used on  HD video modes as it is the only with \r
+               2 type of ANC bufers ir Y and CbCr. On SD Modes the ANC data is inserted across \r
+               both Y anc CbCr values.\r
+               \r
+*/\r
+typedef enum blue_vanc_pkt_type_enum\r
+{\r
+       blue_vanc_pkt_y_comp=0, /**< ANC pkt should be inserted/extracted from the  Y component buffer*/\r
+       blue_vanc_pkt_cbcr_comp=1 /**< ANC pkt should be inserted/extracted from the  CbCr component buffer*/\r
+};\r
+\r
+/*!\r
+@brief Use this function to initialise VANC buffer before inserting any packets into the buffer\r
+@param CardType type of bluefish  card to which this vanc buffer was transferred to.\r
+@param nVideoMode video mode under which this vanc buffer will be used.\r
+@param pixels_per_line width in pixels of the vanc buffer that has to be initialised.\r
+@param lines_per_frame height of the vanc buffer that has to be initialised.\r
+@param pVancBuffer vanc buffer which has to be initialised.\r
+@remarks.\r
+\r
+*/\r
+HANCUTILS_API BLUE_UINT32 blue_init_vanc_buffer(BLUE_UINT32 CardType,BLUE_UINT32 nVideoMode,BLUE_UINT32 pixels_per_line,BLUE_UINT32 lines_per_frame,BLUE_UINT32 * pVancBuffer);\r
+/*!\r
+@brief this function can be used to extract ANC packet from HD cards. Currently we can only extract packets in the VANC space.\r
+@param CardType type of the card from which the vanc buffer was captured.\r
+@param vanc_pkt_type This parameter denotes whether to search for the VANC packet in Y Space or Cb/Cr Space.\r
+                                        The values this parameter accepts are defined in the enumerator #blue_vanc_pkt_type_enum\r
+@param src_vanc_buffer Vanc buffer which was captured from bluefish card\r
+@param src_vanc_buffer_size size of the vanc buffer which should be parsed for the specified vanc packet\r
+@param pixels_per_line specifies how many pixels are there in each line of VANC buffer\r
+@param vanc_pkt_did specifies the DID of the Vanc packet which should be extracted from the buffer\r
+@param vanc_pkt_sdid Returns the SDID of the extracted VANC packet\r
+@param vanc_pkt_data_length returns the size of the extracted VANC packet. The size is specifed as number of UDW words\r
+                                                       that was  contained in the packet\r
+@param vanc_pkt_data_ptr pointer to UDW of the VANC packets . The 10 bit UDW words are packed in a 16 bit integer. The bottom 10 bit of the \r
+                                               16 bit word contains the UDW data.\r
+@param vanc_pkt_line_no line number  where the packet was found .\r
+\r
+@remarks.\r
+\r
+*/\r
+HANCUTILS_API BLUE_INT32  vanc_pkt_extract( \r
+                                                                                       BLUE_UINT32 CardType,\r
+                                                                                       BLUE_UINT32 vanc_pkt_type,\r
+                                                                                       BLUE_UINT32 * src_vanc_buffer,\r
+                                                                                       BLUE_UINT32 src_vanc_buffer_size,\r
+                                                                                       BLUE_UINT32 pixels_per_line,\r
+                                                                                       BLUE_UINT32             vanc_pkt_did,\r
+                                                                                       BLUE_UINT16 * vanc_pkt_sdid,\r
+                                                                                       BLUE_UINT16 * vanc_pkt_data_length,\r
+                                                                                       BLUE_UINT16 * vanc_pkt_data_ptr,\r
+                                                                                       BLUE_UINT16 * vanc_pkt_line_no);\r
+\r
+BLUE_INT32  vanc_pkt_extract_for_HD(\r
+                                       BLUE_UINT32 CardType,\r
+                                       BLUE_UINT32 vanc_pkt_type,\r
+                                       BLUE_UINT32 * src_vanc_buffer,\r
+                                       BLUE_UINT32 src_vanc_buffer_size,\r
+                                       BLUE_UINT32 pixels_per_line,\r
+                                       BLUE_UINT32 vanc_pkt_did,\r
+                                       BLUE_UINT16 * vanc_pkt_sdid,\r
+                                       BLUE_UINT16 * vanc_pkt_data_length,\r
+                                       BLUE_UINT16 * vanc_pkt_data_ptr,\r
+                                       BLUE_UINT16 * vanc_pkt_line_no);\r
+\r
+BLUE_INT32  vanc_pkt_extract_for_SD(\r
+                                       BLUE_UINT32 CardType,\r
+                                       BLUE_UINT32 vanc_pkt_type,\r
+                                       BLUE_UINT32 * src_vanc_buffer,\r
+                                       BLUE_UINT32 src_vanc_buffer_size,\r
+                                       BLUE_UINT32 vanc_pkt_did,\r
+                                       BLUE_UINT16 * vanc_pkt_sdid,\r
+                                       BLUE_UINT16 * vanc_pkt_data_length,\r
+                                       BLUE_UINT16 * vanc_pkt_data_ptr,\r
+                                       BLUE_UINT16 * vanc_pkt_line_no);\r
+\r
+/**\r
+@brief use this function to insert ANC packets into the VANC space of the HD cards.\r
+@param CardType type of the card from which the vanc buffer was captured.\r
+@param vanc_pkt_type This parameter denotes whether to search for the VANC packet in Y Space or Cb/Cr Space.\r
+                                        The values this parameter accepts are defined in the enumerator #blue_vanc_pkt_type_enum\r
+@param vanc_pkt_line_no line in th VANC buffer where the ANC packet should inserted.\r
+@param vanc_pkt_buffer vanc ANC packet which should be inserted into the VANC buffer.\r
+@param vanc_pkt_buffer_size size of the ANC packet including the checksum ,ADF , SDID, DID and Data Count\r
+@param dest_vanc_buffer VANC buffer into which the ANC packet will be inserted into.\r
+@param pixels_per_line specifies how many pixels are there in each line of VANC buffer\r
+*/\r
+HANCUTILS_API BLUE_INT32  vanc_pkt_insert(\r
+                                                                                       BLUE_UINT32 CardType,\r
+                                                                                       BLUE_UINT32 vanc_pkt_type,\r
+                                                                                       BLUE_UINT32 vanc_pkt_line_no,\r
+                                                                                       BLUE_UINT32 * vanc_pkt_buffer,\r
+                                                                                       BLUE_UINT32 vanc_pkt_buffer_size,\r
+                                                                                       BLUE_UINT32 * dest_vanc_buffer,\r
+                                                                                       BLUE_UINT32 pixels_per_line);\r
+\r
+/** @} */\r
+\r
+/**\r
+@defgroup vanc_decode_encoder_helper ANC encoder/decoder \r
+       @{\r
+*/\r
+HANCUTILS_API BLUE_UINT32 decode_eia_708b_pkt(BLUE_UINT32 CardType,BLUE_UINT16 * vanc_pkt_data_ptr,BLUE_UINT16 pkt_udw_count,BLUE_UINT16 eia_pkt_subtype,BLUE_UINT8 * decoded_ch_str);\r
+\r
+HANCUTILS_API BLUE_UINT64 decode_rp188_packet(BLUE_UINT32 CardType,BLUE_UINT32 * src_vanc_buffer,BLUE_UINT32 UDW_Count,BLUE_UINT64 *rp188_dbb);\r
+HANCUTILS_API bool blue_vitc_decoder_8bit_fmt(BLUE_UINT8 * raw_vbi_ptr,BLUE_UINT32 pixels_per_line,BLUE_UINT32 mem_fmt,BLUE_UINT32 vitc_line_no,BLUE_UINT64 * vitc_time_code);\r
+HANCUTILS_API bool blue_vitc_decoder_10bit_v210(BLUE_UINT8 * raw_vbi_ptr, BLUE_UINT32 vitc_line_no, BLUE_UINT64 * vitc_time_code);\r
+HANCUTILS_API unsigned int create_rp188_pkt(\r
+                                                         BLUE_UINT32 cardType,\r
+                                                         BLUE_UINT32 * emb_data_ptr,\r
+                                                         BLUE_UINT32 line_no,\r
+                                                         BLUE_UINT32 start_new_line,\r
+                                                         BLUE_UINT64 timecode,\r
+                                                         BLUE_UINT64 rp188_dbb);\r
+\r
+\r
+/** @} */\r
+}
\ No newline at end of file
diff --git a/BluefishSDK_V5_8_0_31/Inc/BlueLUTCreation.h b/BluefishSDK_V5_8_0_31/Inc/BlueLUTCreation.h
new file mode 100644 (file)
index 0000000..6824e58
--- /dev/null
@@ -0,0 +1,32 @@
+#pragma once\r
+\r
+#define ANTI_LOG_LUT_NAME      "Anti Log\0"\r
+\r
+typedef struct _lut_param_name_value_struct\r
+{\r
+       unsigned char param_name[32];\r
+       double value;\r
+}lut_param_name_value_struct;\r
+\r
+typedef struct _lut_information_struct\r
+{\r
+       int index;\r
+       unsigned char lut_name_ptr[256];\r
+       void (*lut_creation_fn)(UINT16 * pLUT,UINT32 param_count,lut_param_name_value_struct * pParamValue,char * fileName);\r
+       void (*lut_param_update_fn)(void * pArg,unsigned char * pLutName,UINT32 param_count,lut_param_name_value_struct * pParamValue);\r
+       unsigned int param_count;\r
+       lut_param_name_value_struct param_array[20];\r
+}lut_information_struct;\r
+\r
+typedef enum AntiLog_Param_Enum\r
+{\r
+       ANTILOG_DISPLAY_GAMMA=0,\r
+       ANTILOG_FILM_GAMMA=1,\r
+       ANTILOG_REF_WHITE=2,\r
+       ANTILOG_REF_BLACK=3,\r
+       ANTILOG_SOFT_CLIP=4,\r
+};\r
+void anitlog_creation_fn(UINT16 * pLUT,UINT32 param_count,lut_param_name_value_struct * pParamValue,char * fileName);\r
+void invert_lut_creation_fn(UINT16 * pLUT,UINT32 param_count,lut_param_name_value_struct * pParamValue,char * fileName);\r
+void transparent_lut_creation_fn(UINT16 * pLUT,UINT32 param_count,lut_param_name_value_struct * pParamValue,char * fileName);\r
+int load_lut_fromfile(UINT16 * pLUT,char * pLutFileName);
\ No newline at end of file
diff --git a/BluefishSDK_V5_8_0_31/Inc/BlueTimer.h b/BluefishSDK_V5_8_0_31/Inc/BlueTimer.h
new file mode 100644 (file)
index 0000000..0701767
--- /dev/null
@@ -0,0 +1,17 @@
+// The following ifdef block is the standard way of creating macros which make exporting \r
+// from a DLL simpler. All files within this DLL are compiled with the BLUETIMER_EXPORTS\r
+// symbol defined on the command line. this symbol should not be defined on any project\r
+// that uses this DLL. This way any other project whose source files include this file see \r
+// BLUETIMER_API functions as being imported from a DLL, whereas this DLL sees symbols\r
+// defined with this macro as being exported.\r
+#ifdef BLUETIMER_EXPORTS\r
+#define BLUETIMER_API __declspec(dllexport)\r
+#else\r
+#define BLUETIMER_API __declspec(dllimport)\r
+#endif\r
+\r
+\r
+extern "C"\r
+{\r
+BLUETIMER_API int BlueBlackTimer(int deviceId, int blackFrames1, int bmpFrames, int blackFrames2);\r
+}\r
diff --git a/BluefishSDK_V5_8_0_31/Inc/BlueTypes.h b/BluefishSDK_V5_8_0_31/Inc/BlueTypes.h
new file mode 100644 (file)
index 0000000..800b69c
--- /dev/null
@@ -0,0 +1,9 @@
+#pragma once \r
+\r
+#define BERR           int\r
+#define BLUE_UINT32 unsigned int\r
+#define BLUE_INT32     int\r
+#define BLUE_UINT64    unsigned __int64\r
+#define BLUE_UINT8     unsigned char\r
+#define BLUE_INT8      char\r
+#define BLUE_UINT16    unsigned short\r
diff --git a/BluefishSDK_V5_8_0_31/Inc/BlueVelvet.h b/BluefishSDK_V5_8_0_31/Inc/BlueVelvet.h
new file mode 100644 (file)
index 0000000..8cb5636
--- /dev/null
@@ -0,0 +1,1302 @@
+/*\r
+// ==========================================================================\r
+//     Bluefish444 BlueVelvet SDK library\r
+//\r
+//  BlueVelvet.h\r
+//  Public Header\r
+//\r
+//  developed by  : Cameron Duffy   (C) 2002 Bluefish444 P/L\r
+//\r
+//  derived from work begun by Vizrt Austria (C) 2001.\r
+//\r
+// ==========================================================================\r
+\r
+  $Id: BlueVelvet.h,v 1.32 2009/01/06 00:13:31 tim Exp $\r
+*/\r
+#ifndef        _BLUEVELVET_H\r
+#define        _BLUEVELVET_H\r
+\r
+#ifdef BLUEFISH_EXPORTS\r
+#define BLUEFISH_API __declspec(dllexport)\r
+#else\r
+#define BLUEFISH_API __declspec(dllimport)\r
+#endif\r
+\r
+//#include "BlueVelvet_c.h"\r
+\r
+#define BLUE_UINT32    unsigned int \r
+#define BLUE_INT32     int \r
+#define BLUE_UINT8     unsigned char\r
+#define BLUE_INT8      char\r
+#define BLUE_UINT16    unsigned short\r
+#define BLUE_INT16     short\r
+#define BLUE_UINT64    unsigned __int64\r
+\r
+\r
+#ifndef BLUEVELVET_2_DLL\r
+#define BLUEVELVET_SDK_VERSION3\r
+#endif\r
+\r
+#include "BlueDriver_p.h"\r
+\r
+/*#else        \r
+       #include "BlueSD_p.h"\r
+#endif*/\r
+//----------------------------------------------------------------------------\r
+// Some simple macros and definitions\r
+#define        BLUEVELVET_MAX_DEVICES  (5)                     // Maximum number of Blue Cards recognised by driver\r
+\r
+typedef int BErr;\r
+\r
+#define        BLUE_OK(a)                              (!a)            // Test for succcess of a method returning BErr\r
+#define        BLUE_FAIL(a)                    (a)                     // Test for failure of a method returning BErr\r
+#define        BLUE_PASS(a)                    (a>=0)          // Use this where +ve return values still indicate success\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+// The class definition\r
+class BLUEFISH_API CBlueVelvet\r
+{\r
+public:\r
+       //      4.1             Startup Functions\r
+       //---------------------------------\r
+       //      4.1.1   device_enumerate\r
+       //                      Counts accessible blue cards in target system. \r
+       virtual\r
+       BErr    device_enumerate(\r
+                                       int& Devices\r
+                                       ) = 0;\r
+\r
+       //      4.1.2   device_attach\r
+       //                      Attach the class instance to the indexed device. \r
+       virtual\r
+       BErr    device_attach(\r
+                                       int                     DeviceId,\r
+                                       int                     do_audio\r
+                                       ) = 0;\r
+\r
+       //      4.1.3   device_detach\r
+       //                      Detach the current device from the class instance.\r
+       virtual\r
+       BErr    device_detach(\r
+                                       void\r
+                                       ) = 0;\r
+\r
+       //      4.1.4   device_attach_audio\r
+       //                      Attach the class instance to the audio I/O component of the current device.\r
+       virtual\r
+       BErr    device_attach_audio(\r
+                                       void\r
+                                       ) = 0;\r
+\r
+       //      4.1.5   device_detach_audio\r
+       //                      Remove audio I/O components of the current device from the class instance.\r
+       virtual\r
+       BErr    device_detach_audio(\r
+                                       void\r
+                                       ) = 0;\r
+\r
+       //      4.1.6   device_attach_audio_in\r
+       //                      Attach the class instance to the audio IINPUT component of the current device.\r
+       virtual\r
+       BErr    device_attach_audio_in(\r
+                                       void\r
+                                       ) = 0;\r
+\r
+       //      4.1.7   device_detach_audio_in\r
+       //                      Remove audio INPUT component of the current device from the class instance.\r
+       virtual\r
+       BErr    device_detach_audio_in(\r
+                                       void\r
+                                       ) = 0;\r
+\r
+       //      4.1.8   device_attach_audio_out\r
+       //                      Attach the class instance to the audio OUTPUT component of the current device.\r
+       virtual\r
+       BErr    device_attach_audio_out(\r
+                                       void\r
+                                       ) = 0;\r
+\r
+       //      4.1.9   device_detach_audio_out\r
+       //                      Remove audio OUTPUT component of the current device from the class instance. \r
+    virtual\r
+       BErr    device_detach_audio_out(\r
+                                       void\r
+                                       ) = 0;\r
+\r
+       //      4.1.10  device_get_bar\r
+       //                      Get device Bar assets from driver\r
+    virtual\r
+       BErr    device_get_bar(\r
+                                       unsigned long   BarN,\r
+                                       void**                  ppAddress,\r
+                                       unsigned long&  Length\r
+                                       ) = 0;\r
+\r
+\r
+\r
+       //      4.2             Feature Assessment Functions\r
+       //---------------------------------\r
+       //      4.2.1   has_timing_adjust\r
+       virtual\r
+       int             has_timing_adjust(\r
+                                       int     DeviceId=0\r
+                                       ) = 0;\r
+\r
+       //      4.2.2   has_vertical_flip\r
+       virtual\r
+       int             has_vertical_flip(\r
+                                       int     DeviceId=0\r
+                                       ) = 0;\r
+\r
+       //      4.2.3   has_half_res\r
+       virtual\r
+       int             has_half_res(\r
+                                       int     DeviceId=0\r
+                                       ) = 0;\r
+\r
+       //      4.2.4   has_dissolve\r
+       virtual\r
+       int             has_dissolve(\r
+                                       int     DeviceId=0\r
+                                       ) = 0;\r
+\r
+       //      4.2.5   has_aperture\r
+       virtual\r
+       int             has_aperture(\r
+                                       int     DeviceId=0\r
+                                       ) = 0;\r
+\r
+       //      4.2.6   has_input_sdi\r
+       virtual\r
+       int             has_input_sdi(\r
+                                       int     DeviceId=0\r
+                                       ) = 0;\r
+\r
+       //      4.2.7   has_output_sdi\r
+       virtual\r
+       int             has_output_sdi(\r
+                                       int     DeviceId=0\r
+                                       ) = 0;\r
+\r
+       //      4.2.8   has_input_composite\r
+       virtual\r
+       int             has_input_composite(\r
+                                       int     DeviceId=0\r
+                                       ) = 0;\r
+\r
+       //      4.2.9   has_output_composite\r
+       virtual\r
+       int             has_output_composite(\r
+                                       int     DeviceId=0\r
+                                       ) = 0;\r
+\r
+       //      4.2.10  has_input_yuv\r
+       virtual\r
+       int             has_input_yuv(\r
+                                       int     DeviceId=0\r
+                                       ) = 0;\r
+\r
+       //      4.2.11  has_output_yuv\r
+       virtual\r
+       int             has_output_yuv(\r
+                                       int     DeviceId=0\r
+                                       ) = 0;\r
+\r
+       //      4.2.12  has_output_rgb\r
+       virtual\r
+       int             has_output_rgb(\r
+                                       int     DeviceId=0\r
+                                       ) = 0;\r
+\r
+       //      4.2.13  has_input_svideo\r
+       virtual\r
+       int             has_input_svideo(\r
+                                       int     DeviceId=0\r
+                                       ) = 0;\r
+\r
+       //      4.2.14  has_output_svideo\r
+       virtual\r
+       int             has_output_svideo(\r
+                                       int     DeviceId=0\r
+                                       ) = 0;\r
+\r
+       //      4.2.15  has_output_key\r
+       virtual\r
+       int             has_output_key(\r
+                                       int     DeviceId=0\r
+                                       ) = 0;\r
+\r
+       //      4.2.16  has_output_key_v4444\r
+       virtual\r
+       int             has_output_key_v4444(\r
+                                       int     DeviceId=0\r
+                                       ) = 0;\r
+\r
+       //      4.2.17  has_letterbox\r
+       virtual\r
+       int             has_letterbox(\r
+                                       int     DeviceId=0\r
+                                       ) = 0;\r
+\r
+       //      4.2.18  has_video_memory\r
+       virtual\r
+       int             has_video_memory(\r
+                                       int     DeviceId=0\r
+                                       ) = 0;\r
+\r
+       //      4.2.18  has_video_memory_base\r
+       virtual\r
+       int             has_video_memory_base(\r
+                                       int     DeviceId=0\r
+                                       ) = 0;\r
+\r
+       //      4.2.19  has_video_cardtype\r
+       virtual\r
+       int             has_video_cardtype(\r
+                                       int     DeviceId=0\r
+                                       ) = 0;\r
+\r
+       //      4.2.20  count_video_mode\r
+       virtual\r
+       int             count_video_mode(\r
+                                       int     DeviceId=0\r
+                                       ) = 0;\r
+\r
+       //      4.2.21  enum_video_mode\r
+       virtual\r
+       EVideoMode enum_video_mode(\r
+                                       int Index,\r
+                                       int     DeviceId=0\r
+                                       ) = 0;\r
+\r
+       //      4.2.22  count_memory_format\r
+       virtual\r
+       int             count_memory_format(\r
+                                       int     DeviceId=0\r
+                                       ) = 0;\r
+\r
+       //      4.2.23  enum_memory_format\r
+       virtual\r
+       EMemoryFormat enum_memory_format(\r
+                                       int     Index,\r
+                                       int     DeviceId=0\r
+                                       ) = 0;\r
+\r
+       //      4.2.24  count_update_method\r
+       virtual\r
+       int             count_update_method (\r
+                                       int     DeviceId=0\r
+                                       ) = 0;\r
+\r
+       //      4.2.25  enum_update_method\r
+       virtual\r
+       EUpdateMethod enum_update_method(\r
+                                       int     Index,\r
+                                       int     DeviceId=0\r
+                                       ) = 0;\r
+\r
+       //      4.2.26  has_audio_input\r
+       virtual\r
+       int             has_audio_input(\r
+                                       int     DeviceId=0\r
+                                       ) = 0;\r
+\r
+       //      4.2.27  has_audio_output\r
+       virtual\r
+       int             has_audio_output(\r
+                                       int     DeviceId=0\r
+                                       ) = 0;\r
+\r
+       //      4.2.28  count_audio_input_rate\r
+       virtual\r
+       int             count_audio_input_rate(\r
+                                       int     DeviceId=0\r
+                                       ) = 0;\r
+\r
+       //      4.2.29  count_audio_output_rate\r
+       virtual\r
+       int             count_audio_output_rate(\r
+                                       int     DeviceId=0\r
+                                       ) = 0;\r
+\r
+       //      4.2.30  enum_audio_input_rate\r
+       //                      Returns the enumeration for the Ith supported audio input rate.\r
+       virtual\r
+       EAudioRate enum_audio_input_rate(\r
+                                       int     Index,\r
+                                       int     DeviceId=0\r
+                                       ) = 0;\r
+\r
+       //      4.2.31  enum_audio_output_rate\r
+       //                      Returns the enumeration for the Ith supported audio output rate.\r
+       virtual\r
+       EAudioRate enum_audio_output_rate(\r
+                                       int     Index,\r
+                                       int     DeviceId=0\r
+                                       ) = 0;\r
+\r
+\r
+       //      4.2.32  has_audio_playthru\r
+       virtual\r
+       int             has_audio_playthru(\r
+                                       int     DeviceId=0\r
+                                       ) = 0;\r
+\r
+       //      4.2.33  has_dma_control\r
+       virtual\r
+       int             has_dma_control(\r
+                                       int     DeviceId=0\r
+                                       ) = 0;\r
+\r
+       //      4.2.34  has_scaled_rgb\r
+       virtual\r
+       int             has_scaled_rgb(\r
+                                       int     DeviceId=0\r
+                                       ) = 0;\r
+\r
+       //      4.3     Control Functions\r
+       //---------------------------------\r
+       //      4.3.1   set_timing_adjust\r
+       //                      Determines the video format of a signal applied to the Link A input. \r
+       virtual\r
+       BErr    set_timing_adjust(\r
+                                       unsigned int    HPhase,\r
+                                       unsigned int    VPhase\r
+                                       ) = 0;\r
+\r
+       //      4.3.2   set_vertical_flip\r
+       virtual\r
+       BErr    set_vertical_flip(\r
+                                       int&    On\r
+                                       ) = 0;\r
+\r
+       //      4.3.3   set_output_key\r
+       virtual\r
+       BErr    set_output_key(\r
+                                       int&    On,\r
+                                       int&    v4444,\r
+                                       int&    Invert,\r
+                                       int&    White\r
+                                       ) = 0;\r
+\r
+       //      4.3.4   set_output_key_on\r
+       virtual\r
+       BErr    set_output_key_on(\r
+                                       int&    On\r
+                                       ) = 0;\r
+\r
+       //      4.3.5   set_output_key_v4444\r
+       virtual\r
+       BErr    set_output_key_v4444(\r
+                                       int&    v4444\r
+                                       ) = 0;\r
+\r
+       //      4.3.6   set_output_key_invert\r
+       virtual\r
+       BErr    set_output_key_invert(\r
+                                       int&    Invert\r
+                                       ) = 0;\r
+\r
+       //      4.3.7   set_output_key_white\r
+       virtual\r
+       BErr    set_output_key_white(\r
+                                       int&    White\r
+                                       ) = 0;\r
+\r
+       //      4.3.8   set_letterbox\r
+       virtual\r
+       BErr    set_letterbox(\r
+                                       unsigned int&   Lines,\r
+                                       int&                    Black\r
+                                       ) = 0;\r
+\r
+       //      4.3.9   set_letterbox_lines\r
+       virtual\r
+       BErr    set_letterbox_lines(\r
+                                       unsigned int&   Lines\r
+                                       ) = 0;\r
+\r
+       //      4.3.10  set_letterbox_black\r
+       virtual\r
+       BErr    set_letterbox_black(\r
+                                       int&                    Black\r
+                                       ) = 0;\r
+\r
+       //      4.3.11  set_safearea\r
+       virtual\r
+       BErr    set_safearea(\r
+                                       int&                    Title,\r
+                                       int&                    Picture\r
+                                       ) = 0;\r
+\r
+       //      4.3.12  set_safearea_title\r
+       virtual\r
+       BErr    set_safearea_title(\r
+                                       int&                    Title\r
+                                       ) = 0;\r
+\r
+       //      4.3.13  set_safearea_picture\r
+       virtual\r
+       BErr    set_safearea_picture(\r
+                                       int&                    Picture\r
+                                       ) = 0;\r
+\r
+       //      4.3.14  set_output_video\r
+       virtual\r
+       BErr    set_output_video(\r
+                                       int&                    Enable\r
+                                       ) = 0;\r
+\r
+       //      4.3.15  set_audio_rate\r
+       virtual\r
+       BErr    set_audio_rate(\r
+                                       unsigned long&  Rate\r
+                                       ) = 0;\r
+\r
+       //      4.3.16  set_audio_playthrough\r
+       virtual\r
+       BErr    set_audio_playthrough(\r
+                                       int&                    Playthru\r
+                                       ) = 0;\r
+\r
+       //      4.3.17  wait_output_video_synch\r
+       virtual\r
+       BErr    wait_output_video_synch(\r
+                                       unsigned long   UpdFmt,\r
+                                       unsigned long&  FieldCount\r
+                                       ) = 0;\r
+\r
+       //      4.3.18  get_output_video_synch_count\r
+       virtual\r
+       BErr    get_output_video_synch_count(\r
+                                       unsigned long&  FieldCount\r
+                                       ) = 0;\r
+\r
+       //      4.3.19  set_scaled_rgb\r
+       virtual\r
+       BErr    set_scaled_rgb(\r
+                                       unsigned long&  On\r
+                                       ) = 0;\r
+\r
+       //      4.3.20  wait_pci_interrupt\r
+       virtual\r
+       BErr    wait_pci_interrupt(\r
+                                       unsigned long   Wait\r
+                                       ) = 0;\r
+\r
+       //      4.3.21  get_audio_rate\r
+       virtual\r
+       BErr    get_audio_rate(\r
+                                       unsigned long&  Rate\r
+                                       ) = 0;\r
+\r
+       //      4.3.22  wait_input_video_synch\r
+       virtual\r
+       BErr    wait_input_video_synch(\r
+                                       unsigned long   UpdFmt,\r
+                                       unsigned long&  FieldCount\r
+                                       ) = 0;\r
+\r
+       //      4.3.23  get_input_video_synch_count\r
+       virtual\r
+       BErr    get_input_video_synch_count(\r
+                                       unsigned long&  FieldCount\r
+                                       ) = 0;\r
+\r
+\r
+       //      4.4             Video STYLE Functions\r
+       //---------------------------------\r
+       //      4.4.1   get_video_input_format\r
+       //                      Determines the video format of a signal applied to the Link A input. \r
+       virtual\r
+       BErr    get_video_input_format(\r
+                                       unsigned long&  VidFmt\r
+                                       ) = 0;\r
+\r
+       //      4.4.2   get_video_genlock_format\r
+       //                      Determines the video format of a signal applied to the GENLOCK input. \r
+       virtual\r
+       BErr    get_video_genlock_format(\r
+                                       unsigned long&  VidFmt\r
+                                       ) = 0;\r
+\r
+       //      4.4.3   get_video_output_format\r
+       //                      Determines the video format of the output signal. \r
+       virtual\r
+       BErr    get_video_output_format(\r
+                                       unsigned long&  VidFmt\r
+                                       ) = 0;\r
+\r
+       //      4.4.4   set_video_output_format\r
+       //                      Changes the output signal video format of Link A output. \r
+       virtual\r
+       BErr    set_video_output_format(\r
+                                       unsigned long&  VidFmt\r
+                                       ) = 0;\r
+\r
+       //      4.4.5   get_video_memory_format\r
+       //                      Determines the pixel format for blue card video buffers. \r
+       virtual\r
+       BErr    get_video_memory_format(\r
+                                       unsigned long&  MemFmt\r
+                                       ) = 0;\r
+\r
+       //      4.4.6   set_video_memory_format\r
+       //                      Changes the pixel format for blue card video buffers. \r
+       virtual\r
+       BErr    set_video_memory_format(\r
+                                       unsigned long&  MemFmt\r
+                                       ) = 0;\r
+\r
+       //      4.4.7   get_video_update_format\r
+       //                      Determines the update synchronisation style of the video buffers. \r
+       virtual\r
+       BErr    get_video_update_format(\r
+                                       unsigned long&  UpdFmt\r
+                                       ) = 0;\r
+\r
+       //      4.4.8   set_video_update_format\r
+       //                      Changes the video synchronisation method. \r
+       virtual\r
+       BErr    set_video_update_format(\r
+                                       unsigned long&  UpdFmt\r
+                                       ) = 0;\r
+       //      4.4.9   get_video_zoom_format\r
+       //                      Determines the video resolution style of the video buffers. \r
+       virtual\r
+       BErr    get_video_zoom_format(\r
+                                       unsigned long&  ResFmt\r
+                                       ) = 0;\r
+\r
+       //      4.4.10  set_video_zoom_format\r
+       //                      Changes the video resolution style of the video buffers. \r
+       virtual\r
+       BErr    set_video_zoom_format(\r
+                                       unsigned long&  ResFmt\r
+                                       ) = 0;\r
+       //      4.4.11  get_video_framestore_style\r
+       //                      Determines the video mode, memory format and update synchronisation\r
+       //                      styles of the blue card video buffers. \r
+       virtual\r
+       BErr    get_video_framestore_style(\r
+                                       unsigned long&  VidFmt,\r
+                                       unsigned long&  MemFmt,\r
+                                       unsigned long&  UpdFmt,\r
+                                       unsigned long&  ResFmt\r
+                                       ) = 0;\r
+\r
+       //      4.4.12  set_video_framestore_style\r
+       //                      Changes the video mode, memory format and update synchronisation styles. \r
+       virtual\r
+       BErr    set_video_framestore_style(\r
+                                       unsigned long&  VidFmt,\r
+                                       unsigned long&  MemFmt,\r
+                                       unsigned long&  UpdFmt,\r
+                                       unsigned long&  ResFmt\r
+                                       ) = 0;\r
+\r
+       //      4.4.13  get_video_engine\r
+       //                              Instruct the device driver to change the operational mode of the\r
+       //                              video engine. \r
+       virtual\r
+       BErr    get_video_engine(\r
+                                       unsigned long&  Mode\r
+                                       ) = 0;\r
+\r
+       //      4.4.14  set_video_engine\r
+       //                              Instruct the device driver to change the operational mode of the\r
+       //                              video engine. \r
+       virtual\r
+       BErr    set_video_engine(\r
+                                       unsigned long&  Mode\r
+                                       ) = 0;\r
+\r
+       \r
+       //      4.5             DMA Memory Functions\r
+       //---------------------------------\r
+       //      4.5.1   system_buffer_map\r
+       //                      Obtains the virtual address of one of the driver managed system buffers. \r
+       virtual\r
+       BErr    system_buffer_map(\r
+                                       void**  ppAddress,\r
+                                       int             BufferId\r
+                                       ) = 0;\r
+\r
+       //      4.5.2   system_buffer_unmap\r
+       //                      Unmaps the virtual address of one of the driver managed system buffers\r
+       //                      from the process address space. \r
+       virtual\r
+       BErr    system_buffer_unmap(\r
+                                       void*           pAddress\r
+                                       ) = 0;\r
+\r
+       //      4.5.3   system_buffer_assign\r
+       //                      Assign an arbitrary usermode buffer to a particular DMA function. \r
+       virtual\r
+       BErr    system_buffer_assign(\r
+                                       void*                   pAddress,\r
+                                       unsigned long   Id,\r
+                                       unsigned long   Length,\r
+                                       unsigned long   Target\r
+                                       ) = 0;\r
+\r
+       //      4.5.4   system_buffer_write\r
+       //                      Instructs the DMA engine to begin a DMA write operation to the\r
+       //                      active blue card host buffer. \r
+       virtual\r
+       int             system_buffer_write(\r
+                                       unsigned char*          pPixels,\r
+                                       unsigned long           Size,\r
+                                       unsigned long           Offset=0\r
+                                       ) = 0;\r
+\r
+       //      4.5.5   system_buffer_read\r
+       //                      Instructs the DMA engine to begin a DMA read operation from the\r
+       //                      active blue card host buffer. \r
+       virtual\r
+       int             system_buffer_read(\r
+                                       unsigned char*          pPixels,\r
+                                       unsigned long           Size,\r
+                                       unsigned long           Offset=0\r
+                                       ) = 0;\r
+\r
+       virtual\r
+       int             system_buffer_write_async(\r
+                                       unsigned char*          pPixels,\r
+                                       unsigned long           Size,\r
+                                       OVERLAPPED                      * pAsync,\r
+                                       unsigned long           BufferID,\r
+                                       unsigned long           Offset=0\r
+                                       ) = 0;\r
+\r
+       //      4.5.5   system_buffer_read\r
+       //                      Instructs the DMA engine to begin a DMA read operation from the\r
+       //                      active blue card host buffer. \r
+       virtual\r
+       int             system_buffer_read_async(\r
+                                       unsigned char*          pPixels,\r
+                                       unsigned long           Size,\r
+                                       OVERLAPPED                      * pAsync,\r
+                                       unsigned long           BufferID,\r
+                                       unsigned long           Offset=0\r
+                                       ) = 0;\r
+\r
+\r
+       //      4.6             Framestore Functions\r
+       //---------------------------------\r
+       //      4.6.1   render_buffer_count\r
+       //                      Determines the number of buffers the blue card memory has been partitioned into. \r
+       virtual\r
+       BErr    render_buffer_count(\r
+                                       unsigned long&          Count\r
+                                       ) = 0;\r
+\r
+       //      4.6.2   render_buffer_update\r
+       //                      Instructs the video digitiser to select a blue card buffer to rasterise. \r
+       virtual\r
+       BErr    render_buffer_update(\r
+                                       unsigned long           BufferId\r
+                                       ) = 0;\r
+\r
+       //      4.6.3   render_buffer_update_b\r
+       //                      Instructs the video digitiser to select a blue card buffer as the video\r
+       //                      channel B source for real-time dissolves. \r
+       virtual\r
+       BErr    render_buffer_update_b(\r
+                                       unsigned long           BufferId\r
+                                       ) = 0;\r
+\r
+       //      4.6.4   render_buffer_dissolve\r
+       //                      Set the percentage of Channel A over Channel B for real-time dissolve. \r
+       virtual\r
+       BErr    render_buffer_dissolve(\r
+                                       unsigned long           Dissolve\r
+                                       ) = 0;\r
+\r
+       //      4.6.5   render_buffer_dissolve_a_b\r
+       //                      Set the video source for Channel A and Channel B and the dissolve\r
+       //                      percentage between them. \r
+       virtual\r
+       BErr    render_buffer_dissolve_a_b(\r
+                                       unsigned long           BufferId_A,\r
+                                       unsigned long           BufferId_B,\r
+                                       unsigned long           Dissolve\r
+                                       ) = 0;\r
+\r
+       //      4.6.6   render_buffer_map\r
+       //                      Get the virtual address of the indexed blue card buffer. \r
+       virtual\r
+       BErr    render_buffer_map(\r
+                                       void**                  pAddress,\r
+                                       unsigned long   BufferId\r
+                                       ) = 0;\r
+\r
+       //      4.6.7   render_buffer_map_aperture\r
+       //                      Get the virtual address of the 8-bit aperture for the indexed blue card buffer. \r
+       virtual\r
+       BErr    render_buffer_map_aperture(\r
+                                       void**                  pAddress,\r
+                                       unsigned long   BufferId\r
+                                       ) = 0;\r
+\r
+       //      4.6.8   render_buffer_map_all\r
+       //                      Generates a table of the virtual addresses for all blue card buffers. \r
+       virtual\r
+       BErr    render_buffer_map_all(\r
+                                       void**                  pTable,\r
+                                       unsigned long&  Count\r
+                                       ) = 0;\r
+\r
+\r
+       //      4.6.9   render_buffer_map_aperture_all\r
+       //                      Generates a table of the virtual addresses for the 8-bit aperture\r
+       //                      of all blue card buffers. \r
+       virtual\r
+       BErr    render_buffer_map_aperture_all(\r
+                                       void**                  pTable,\r
+                                       unsigned long&  Count\r
+                                       ) = 0;\r
+\r
+       //      4.6.10  render_buffer_select\r
+       //                      Specify which blue card buffer will become the target of future DMA transactions. \r
+       virtual\r
+       BErr    render_buffer_select(\r
+                                       unsigned long   BufferId\r
+                                       ) = 0;\r
+\r
+       //      4.6.11  render_buffer_capture\r
+       //                      Specify which blue card buffer will be used for capture. \r
+       virtual\r
+       BErr    render_buffer_capture(\r
+                                       unsigned long   BufferId,\r
+                                       int                             On\r
+                                       ) = 0;\r
+\r
+       //      4.6.12  render_buffer_sizeof\r
+       //                      Determine the maximum byte size of each blue card memory partition. \r
+       virtual\r
+       BErr    render_buffer_sizeof(\r
+                                       unsigned long&  Count,\r
+                                       unsigned long&  Length,\r
+                                       unsigned long&  Actual,\r
+                                       unsigned long&  Golden\r
+                                       ) = 0;\r
+\r
+       //      4.6.13  render_buffer_quantise\r
+       //                      Control whether blue card memory is repartitioned on style changes. \r
+       virtual\r
+       BErr    render_buffer_quantise(\r
+                                       int             On\r
+                                       ) = 0;\r
+\r
+       //      4.7     Audio Functions\r
+       //---------------------------------\r
+       //      4.7.1   audio_playback_start\r
+       //                      Start audio playback. \r
+       virtual\r
+       BErr    audio_playback_start(\r
+                                       unsigned long   Synch\r
+                                       ) = 0;\r
+\r
+       //      4.7.2   audio_playback_stop\r
+       //                      Stop audio playback. \r
+       virtual\r
+       BErr    audio_playback_stop(\r
+                                       void\r
+                                       ) = 0;\r
+\r
+       //      4.7.3   audio_playback_stream\r
+       //                      Register a native interleaved audio file for playback. \r
+       virtual\r
+       BErr    audio_playback_stream(\r
+                                       char*           pName,\r
+                                       int                     Offset,\r
+                                       int                     Flags\r
+                                       ) = 0;\r
+\r
+       //      4.7.4   audio_playback_stream_mono\r
+       //                      Register a native monophonic audio file for playback. \r
+       virtual\r
+       BErr    audio_playback_stream_mono(\r
+                                       unsigned long   Chan,\r
+                                       char*                   pName,\r
+                                       int                             Offset,\r
+                                       int                             Flags\r
+                                       ) = 0;\r
+\r
+       //      4.7.5   audio_playback_stream_stereo\r
+       //                      Register a native stereophonic audio file for playback. \r
+       virtual\r
+       BErr    audio_playback_stream_stereo(\r
+                                       unsigned long   Pair,\r
+                                       char*                   pName,\r
+                                       int                             Offset,\r
+                                       int                             Flags\r
+                                       ) = 0;\r
+\r
+       //      4.7.6   audio_playback_buffer\r
+       //                      Register a native 6-channel interleaved audio buffer for playback. \r
+       virtual\r
+       BErr    audio_playback_buffer(\r
+                                       void*                   pGlobal,\r
+                                       unsigned long*  pBuffer,\r
+                                       unsigned long   Length,\r
+                                       unsigned long   Chunk,\r
+                                       int     (*pFunc)(void* pGlobal, unsigned long* pBuffer, int Offset, int Length),\r
+                                       int                             Flags\r
+                                       ) = 0;\r
+\r
+       //      4.7.7   audio_playback_buffer_mono\r
+       //                      Register a native monophonic audio buffer for playback. \r
+       virtual\r
+       BErr    audio_playback_buffer_mono(\r
+                                       unsigned long   Chan,\r
+                                       void*                   pGlobal,\r
+                                       unsigned long*  pBuffer,\r
+                                       unsigned long   Length,\r
+                                       unsigned long   Chunk,\r
+                                       int     (*pFunc)(void* pGlobal, unsigned long* pBuffer, int Offset, int Length),\r
+                                       int                             Flags\r
+                                       ) = 0;\r
+\r
+       //      4.7.8   audio_playback_buffer_stereo\r
+       //                      Register a native stereophonic audio buffer for playback. \r
+       virtual\r
+       BErr    audio_playback_buffer_stereo(\r
+                                       unsigned long   Pair,\r
+                                       void*                   pGlobal,\r
+                                       unsigned long*  pBuffer,\r
+                                       unsigned long   Length,\r
+                                       unsigned long   Chunk,\r
+                                       int     (*pFunc)(void* pGlobal, unsigned long* pBuffer, int Offset, int Length),\r
+                                       int                             Flags\r
+                                       ) = 0;\r
+\r
+       //      4.7.9   audio_playback_deregister\r
+       //                      De-registers a native 6-channel interleaved audio source from playback. \r
+       virtual\r
+       BErr    audio_playback_deregister(\r
+                                       void\r
+                                       ) = 0;\r
+\r
+       //      4.7.10  audio_playback_deregister_mono\r
+       //                      De-registers a native monophonic audio source from playback. \r
+       virtual\r
+       BErr    audio_playback_deregister_mono(\r
+                                       unsigned long   Chan\r
+                                       ) = 0;\r
+\r
+       //      4.7.11  audio_playback_deregister_stereo\r
+       //                      De-registers a native stereophonic audio source from playback. \r
+       virtual\r
+       BErr    audio_playback_deregister_stereo(\r
+                                       unsigned long   Pair\r
+                                       ) = 0;\r
+\r
+       //      4.7.12  AudioHandlerPlay\r
+       //                      Moves source audio data streams into the playback buffer. \r
+       virtual\r
+       BErr    AudioHandlerPlay(\r
+                                       unsigned long&  Snooze\r
+                                       ) = 0;\r
+\r
+       //      4.7.13  audio_capture_start\r
+       //                      Begin capturing audio. \r
+       virtual\r
+       BErr    audio_capture_start(\r
+                                       unsigned long   Synch,\r
+                                       unsigned long   PlayThru\r
+                                       ) = 0;\r
+\r
+       //      4.7.14  audio_capture_stop\r
+       //                      Stop capturing audio. \r
+       virtual\r
+       BErr    audio_capture_stop(\r
+                                       void\r
+                                       ) = 0;\r
+       //      4.7.15  audio_capture_stream\r
+       //                      Register a file for capture of native interleaved audio. \r
+       virtual\r
+       BErr    audio_capture_stream (\r
+                                       char*                   pName,\r
+                                       int                             Offset,\r
+                                       int                             Flags\r
+                                       ) = 0;\r
+\r
+       //      4.7.16  audio_capture_stream_mono\r
+       //                      Register a file for capture of native monophonic audio. \r
+       virtual\r
+       BErr    audio_capture_stream_mono(\r
+                                       unsigned long   Chan,\r
+                                       char*                   pName,\r
+                                       int                             Offset,\r
+                                       int                             Flags\r
+                                       ) = 0;\r
+\r
+       //      4.7.17  audio_capture_stream_stereo\r
+       //                      Register a file for capture of native stereophonic audio. \r
+       virtual\r
+       BErr    audio_capture_stream_stereo(\r
+                                       unsigned long   Pair,\r
+                                       char*                   pName,\r
+                                       int                             Offset,\r
+                                       int                             Flags\r
+                                       ) = 0;\r
+\r
+       //      4.7.18  audio_capture_buffer\r
+       //                      Register a buffer for capture of native interleaved audio. \r
+       virtual\r
+       BErr    audio_capture_buffer(\r
+                                       void*                   pGlobal,\r
+                                       unsigned long*  pBuffer,\r
+                                       unsigned long   Length,\r
+                                       unsigned long   Chunk,\r
+                                       int     (*pFunc)(void* pGlobal, unsigned long* pBuffer, int Offset, int Length),\r
+                                       int                             Flags\r
+                                       ) = 0;\r
+\r
+       //      4.7.19  audio_capture_buffer_mono\r
+       //                      Register a buffer for capture of native monophonic audio. \r
+       virtual\r
+       BErr    audio_capture_buffer_mono(\r
+                                       unsigned long   Chan,\r
+                                       void*                   pGlobal,\r
+                                       unsigned long*  pBuffer,\r
+                                       unsigned long   Length,\r
+                                       unsigned long   Chunk,\r
+                                       int     (*pFunc)(void* pGlobal, unsigned long* pBuffer, int Offset, int Length),\r
+                                       int                             Flags\r
+                                       ) = 0;\r
+\r
+       //      4.7.20  audio_capture_buffer_stereo\r
+       //                      Register a buffer for capture of native stereophonic audio. \r
+       virtual\r
+       BErr    audio_capture_buffer_stereo(\r
+                                       unsigned long   Pair,\r
+                                       void*                   pGlobal,\r
+                                       unsigned long*  pBuffer,\r
+                                       unsigned long   Length,\r
+                                       unsigned long   Chunk,\r
+                                       int     (*pFunc)(void* pGlobal, unsigned long* pBuffer, int Offset, int Length),\r
+                                       int                             Flags\r
+                                       ) = 0;\r
+\r
+       //      4.7.21  audio_capture_deregister\r
+       //                      De-registers a buffer from capture monitor thread. \r
+       virtual\r
+       BErr    audio_capture_deregister(\r
+                                       void\r
+                                       ) = 0;\r
+\r
+       //      4.7.22  audio_capture_deregister_mono\r
+       //                      De-registers a single monophonic audio buffer from capture monitor thread. \r
+       virtual\r
+       BErr    audio_capture_deregister_mono(\r
+                                       unsigned long   Chan\r
+                                       ) = 0;\r
+\r
+       //      4.7.23  audio_capture_deregister_stereo\r
+       //                      De-registers a stereophonic audio buffer from capture monitor thread. \r
+       virtual\r
+       BErr    audio_capture_deregister_stereo(\r
+                                       unsigned long   Pair\r
+                                       ) = 0;\r
+\r
+\r
+       //      4.7.24  audio_playback_threshold\r
+       //                      Adjust the Chunk and Snooze times for the Audio Playback Monitor Thread\r
+       virtual\r
+       BErr    audio_playback_threshold(\r
+                                       unsigned long   Chunk,\r
+                                       unsigned long   Snooze\r
+                                       ) = 0;\r
+\r
+       //      4.7.25  audio_capture_sample_count\r
+       //                      Number of samples captured. \r
+       virtual\r
+       ULONG   audio_capture_sample_count() = 0;\r
+\r
+       //      4.7.26  audio_capture_sample_count_mono\r
+       //                      Number of samples captured. \r
+       virtual\r
+       ULONG   audio_capture_sample_count_mono(unsigned long Chan) = 0;\r
+\r
+       //      4.7.27  audio_capture_sample_count_stereo\r
+       //                      Number of samples captured. \r
+       virtual\r
+       ULONG   audio_capture_sample_count_stereo(unsigned long Pair) = 0;\r
+\r
+       //      4.7.28  audio_playback_blip\r
+       //                      Channel is to be blipped\r
+       virtual\r
+       BErr    audio_playback_blip(\r
+                                               int Channel\r
+                                               ) = 0;\r
+\r
+       //      4.8     Video Engine Functions\r
+       //---------------------------------\r
+       //      4.8.1   video_playback_start\r
+       //                      Start video playback. \r
+       virtual\r
+       BErr    video_playback_start(\r
+                                       int             Step,\r
+                                       int             Loop\r
+                                       ) = 0;\r
+\r
+       //      4.8.2   video_playback_stop\r
+       //                      Halts the video playback engine. \r
+       virtual\r
+       BErr    video_playback_stop(\r
+                                       int             Wait,\r
+                                       int             Flush\r
+                                       ) = 0;\r
+\r
+       //      4.8.3   video_playback_flush\r
+       //                      Flush all pending display requests from all Channels. \r
+       virtual\r
+       BErr    video_playback_flush(\r
+                                       void\r
+                                       ) = 0;\r
+\r
+       //      4.8.4   video_playback_flush_A\r
+       //                      Flush all pending display requests from Channel A. \r
+       virtual\r
+       BErr    video_playback_flush_A(\r
+                                       void\r
+                                       ) = 0;\r
+\r
+       //      4.8.5   video_playback_flush_B\r
+       //                      Flush all pending display requests from Channel-B. \r
+       virtual\r
+       BErr    video_playback_flush_B(\r
+                                       void\r
+                                       ) = 0;\r
+\r
+       //      4.8.6   video_playback_allocate\r
+       //                      Obtain the address of the next available video memory buffer. \r
+       virtual\r
+       BErr    video_playback_allocate(\r
+                                       void**                  pAddress,\r
+                                       unsigned long&  BufferId,\r
+                                       unsigned long&  Underrun\r
+                                       ) = 0;\r
+\r
+       //      4.8.7   video_playback_release\r
+       //                      Release physical blue card video buffer. \r
+       virtual\r
+       BErr    video_playback_release(\r
+                                       unsigned long   BufferId\r
+                                       ) = 0;\r
+\r
+       //      4.8.8   video_playback_flush_display\r
+       //                      Remove a unique display request from the display lists. \r
+       virtual\r
+       BErr    video_playback_flush_display(\r
+                                       unsigned long   UniqueId\r
+                                       ) = 0;\r
+\r
+       //      4.8.9   video_playback_release_flush\r
+       //                      Purges all pending display requests and returns the frame to the free list.\r
+       virtual\r
+       BErr    video_playback_release_flush(\r
+                                       unsigned long   BufferId\r
+                                       ) = 0;\r
+\r
+       //      4.8.10  video_playback_present\r
+       //                      Present a buffer to the video playback engine Channel-A. \r
+       virtual\r
+       BErr    video_playback_present(\r
+                                       unsigned long&  UniqueId,\r
+                                       unsigned long   BufferId,\r
+                                       unsigned long   Count,\r
+                                       int                             Keep,\r
+                                       int                             Odd=0\r
+                                       ) = 0;\r
+\r
+       //      4.8.11  video_playback_present_dissolve\r
+       //                      Present a frame with a dissolve value to the video playback engine. \r
+       virtual\r
+       BErr    video_playback_present_dissolve(\r
+                                       unsigned long&  UniqueId,\r
+                                       unsigned long   BufferId,\r
+                                       unsigned long   Count,\r
+                                       unsigned long   Dissolve,\r
+                                       int                             Keep,\r
+                                       int                             Odd=0\r
+                                       ) = 0;\r
+\r
+       //      4.8.12  video_playback_present_A\r
+       //                      Present a frame to the video playback engine that will be inserted into Channel-A. \r
+       virtual\r
+       BErr    video_playback_present_A(\r
+                                       unsigned long&  UniqueId,\r
+                                       unsigned long   BufferId,\r
+                                       unsigned long   Count,\r
+                                       unsigned long   Dissolve,\r
+                                       int                             Synch_B,\r
+                                       int                             Keep,\r
+                                       int                             Odd=0\r
+                                       ) = 0;\r
+\r
+       //      4.8.13  video_playabck_present_B\r
+       //                      Present a frame to the video playback engine that will be inserted into Channel-B. \r
+       virtual\r
+       BErr    video_playback_present_B(\r
+                                       unsigned long&  UniqueId,\r
+                                       unsigned long   BufferId,\r
+                                       unsigned long   Count,\r
+                                       unsigned long   Dissolve,\r
+                                       int                             Synch_A,\r
+                                       int                             Keep,\r
+                                       int                             Odd=0\r
+                                       ) = 0;\r
+\r
+       //      4.8.14  video_playback_present_detail\r
+       //                      The general purpose presentation function. \r
+       virtual\r
+       BErr    video_playback_present_detail(\r
+                                       unsigned long&  UniqueId,\r
+                                       unsigned long   BufferId,\r
+                                       unsigned long   Count,\r
+                                       unsigned long   Dissolve,\r
+                                       unsigned long   Flags\r
+                                       ) = 0;\r
+\r
+       //      4.8.15  video_capture_start\r
+       //                      Instruct the device driver to begin capturing images into the video framestore. \r
+       virtual\r
+       BErr    video_capture_start(\r
+                                       int             Step=0\r
+                                       ) = 0;\r
+\r
+       //      4.8.16  video_capture_stop\r
+       //                      Instruct the device driver to stop the video capture. \r
+       virtual\r
+       BErr    video_capture_stop(\r
+                                       void\r
+                                       ) = 0;\r
+\r
+       //      4.8.17  video_capture_harvest\r
+       //                      Get the details about the next frame in a capture sequence. \r
+       virtual\r
+       BErr    video_capture_harvest(\r
+                                       void**                  ppAddress,\r
+                                       unsigned long&  BufferId,\r
+                                       unsigned long&  Count,\r
+                                       unsigned long&  Frames,\r
+                                       int                             CompostLater=0\r
+                                       ) = 0;\r
+\r
+       // not used for anything important...\r
+       virtual\r
+       BErr nudge_frame(LONG nudge) = 0;\r
+\r
+       //      4.8.18  video_playback_pause\r
+       //                      Suspend or Resume playback \r
+       virtual\r
+       BErr    video_playback_pause(\r
+                                       int             Suspend\r
+                                       ) = 0;\r
+\r
+       //      4.8.19  video_capture_compost\r
+       //                      Return a harvested frame for recycling\r
+       virtual\r
+       BErr    video_capture_compost(\r
+                                       unsigned long   BufferId\r
+                                       ) = 0;\r
+\r
+#ifdef BLUEVELVET_SDK_VERSION3\r
+       virtual BErr set_onboard_keyer(int & On)=0;\r
+       virtual BErr get_onboard_keyer_status(int &On)=0;\r
+       virtual BErr get_timing_adjust(unsigned int     & HPhase,unsigned int & VPhase,unsigned int & MaxHPhase,unsigned int & MaxVPhase) = 0;\r
+       virtual BErr get_letterbox_values(unsigned int& Lines,int & bBlackEnableFlag)=0;\r
+       virtual BErr get_safearea_info(int&     Title,int& Picture)=0;\r
+       virtual int has_downconverter_bnc(int deviceId)=0;\r
+       virtual int has_onboard_keyer(int deviceId)=0;\r
+       virtual int has_duallink_input(int deviceId)=0;\r
+       virtual int has_programmable_colorspace_matrix(int deviceId)=0;\r
+\r
+       virtual BErr SetMatrix_Col_Green_Y(double CoeffG_R,double CoeffG_G,double CoeffG_B,double constG)=0;\r
+       virtual BErr GetMatrix_Col_Green_Y(double & CoeffG_R,double & CoeffG_G,double & CoeffG_B,double & constG)=0;\r
+\r
+       virtual BErr SetMatrix_Col_Red_PR(double CoeffR_R,double CoeffR_G,double CoeffR_B,double constR)=0;\r
+       virtual BErr GetMatrix_Col_Red_PR(double & CoeffR_R,double & CoeffR_G,double & CoeffR_B,double & constR)=0;\r
+\r
+       virtual BErr SetMatrix_Col_Blue_PB(double CoeffB_R,double CoeffB_G,double CoeffB_B,double constB)=0;\r
+       virtual BErr GetMatrix_Col_Blue_PB(double & CoeffB_R,double & CoeffB_G,double & CoeffB_B,double & constB)=0;\r
+\r
+       virtual BErr SetDualLink_Output_Conn_SignalColorSpace(unsigned long & signalType,unsigned long  updateMatrixFlag)=0;\r
+       virtual BErr SetDualLink_Input(unsigned long  & EnableDualLink)=0;\r
+       virtual BErr SetDualLink_Input_SignalFormatType(unsigned long &v4444)=0;\r
+       virtual BErr GetDualLink_InputProperty(unsigned long & DualLink,unsigned long & connSignalColorSpace,unsigned long & v4444)=0;\r
+       virtual BErr GetDualLink_OutputProperty(unsigned long & DualLink,unsigned long & connSignalColorSpace,unsigned long & v4444)=0;\r
+\r
+       virtual BErr Set_DownConverterSignalType(unsigned long type)=0;\r
+       virtual BErr GetDownConverterSignalType(unsigned long & connSignalType)=0;\r
+\r
+       virtual BErr SetDualLink_Input_Conn_SignalColorSpace(unsigned long  & signalType)=0;\r
+       virtual int  GetHDCardType(int nDeviceId)=0;\r
+\r
+       // New Audio Interface \r
+       virtual BErr MaxAudioOutBufferSize(long & nSampleCount)=0;\r
+       virtual BErr GetAudioOutBufferFreeSpace(long  & nSampleCount)=0;\r
+       virtual BErr wait_audio_output_interrupt(unsigned long & noQueuedSample,unsigned long & noFreeSample) = 0;\r
+       virtual BErr InitAudioPlaybackMode()=0;\r
+       virtual BErr StartAudioPlayback(int syncCount)=0;\r
+       virtual BErr StopAudioPlayback()=0;\r
+       virtual BErr WriteAudioSample(int nSampleType,void * pBuffer,long  nNoSample,int bFlag,long nNoSamplesWritten)=0;\r
+       virtual BErr EndAudioPlaybackMode()=0; \r
+       virtual int GetPCIRevId()=0;\r
+#endif\r
+\r
+       //      Need this so that derived destructor gets called\r
+       virtual ~CBlueVelvet(){}\r
+       HANDLE          m_hDevice;                                      // Handle to the blue card device driver\r
+};\r
+\r
+\r
+//------------------------------------------------------------------------------------------------------------\r
+extern "C" {\r
+//------------------------------------------------------------------------------------------------------------\r
+//     4.0.0   The Blue Velvet factory\r
+BLUEFISH_API CBlueVelvet*      BlueVelvetFactory();\r
+\r
+\r
+//     4.0.1   Who am I\r
+BLUEFISH_API const char*       BlueVelvetVersion();\r
+\r
+//     4.0.2   Golden Value calculation\r
+BLUEFISH_API unsigned long BlueVelvetGolden(\r
+                                                                               unsigned long   VidFmt,\r
+                                                                               unsigned long   MemFmt,\r
+                                                                               unsigned long   UpdFmt\r
+                                                                               );\r
+//     4.0.3   Bytes Per Line calculation\r
+BLUEFISH_API unsigned long BlueVelvetLineBytes(\r
+                                                                               unsigned long   VidFmt,\r
+                                                                               unsigned long   MemFmt\r
+                                                                               );\r
+//     4.0.4   Bytes Per Frame calculation\r
+BLUEFISH_API unsigned long BlueVelvetFrameBytes(\r
+                                                                               unsigned long   VidFmt,\r
+                                                                               unsigned long   MemFmt,\r
+                                                                               unsigned long   UpdFmt\r
+                                                                               );\r
+\r
+//     4.0.5   Lines Per Frame calculation\r
+BLUEFISH_API unsigned long BlueVelvetFrameLines(\r
+                                                                               unsigned long   VidFmt,\r
+                                                                               unsigned long   UpdFmt\r
+                                                                               );\r
+\r
+//     4.0.6   Pixels per Line calculation\r
+BLUEFISH_API unsigned long BlueVelvetLinePixels(\r
+                                                                               unsigned long   VidFmt\r
+                                                                               );\r
+\r
+BLUEFISH_API unsigned long BlueVelvetVBILines(unsigned long VidFmt,unsigned long FrameType);\r
+\r
+}\r
+\r
+#endif //_BLUEVELVET_H\r
diff --git a/BluefishSDK_V5_8_0_31/Inc/BlueVelvet4.h b/BluefishSDK_V5_8_0_31/Inc/BlueVelvet4.h
new file mode 100644 (file)
index 0000000..992072b
--- /dev/null
@@ -0,0 +1,127 @@
+#ifndef        _BLUEVELVET4_H\r
+#define        _BLUEVELVET4_H\r
+\r
+#include "BlueVelvet.h"\r
+#include "BlueC_Api.h"\r
+typedef struct \r
+{\r
+       VARIANT maxRange;\r
+       VARIANT minRange;\r
+       VARIANT currentValue;\r
+       unsigned long uniqueSteps;\r
+}AnalogPropertyValue;\r
+\r
+#define RS422_SERIALPORT_FLAG(timeout,port,RxFlushBuffer) (((unsigned long)(timeout)<<16)|(port & 0x3) | (RxFlushBuffer<<15))\r
+\r
+class BLUEFISH_API CBlueVelvet4:  virtual  public CBlueVelvet \r
+{\r
+public:\r
+       // Functions for new Analog Card Property \r
+       virtual BErr SetAnalogCardProperty(int propType,VARIANT & propValue)=0;\r
+       virtual BErr GetAnalogCardProperty(int propType,AnalogPropertyValue & propValue)=0;\r
+       virtual BErr GetAnalogCardProperty(int propType,VARIANT & propValue)=0;\r
+\r
+       virtual BErr has_analog_connector(int   DeviceId) = 0;\r
+       virtual int has_svideo_input(int        DeviceId) = 0;\r
+       virtual int has_component_input(int     DeviceId)=0;\r
+       virtual int     has_composite_input(int DeviceId)=0;\r
+       virtual int     has_svideo_output(int   DeviceId)=0;\r
+       virtual int     has_component_output(int        DeviceId)=0;\r
+       virtual int     has_analog_rgb_output(int       DeviceId)=0;\r
+       virtual int     has_composite_output(int        DeviceId)=0;\r
+\r
+       // Functions for new Audio Input architecture\r
+       // Functions for Future use not implemented \r
+       virtual BErr wait_audio_input_interrupt(unsigned long & noQueuedSample,unsigned long & noFreeSample) = 0;\r
+       virtual BErr InitAudioCaptureMode()=0;\r
+       virtual BErr StartAudioCapture(int syncCount)=0;\r
+       virtual BErr StopAudioCapture()=0;\r
+       virtual BErr ReadAudioSample(int nSampleType,void * pBuffer,long  nNoSample,int bFlag,long nNoSamplesWritten)=0;\r
+       virtual BErr EndAudioCaptureMode()=0; \r
+\r
+        \r
+       virtual BErr SetCardProperty(int propType,VARIANT & Value)=0;\r
+       virtual BErr QueryCardProperty(int propType,VARIANT & Value)=0;\r
+\r
+       // RS422 Serial Port Functions\r
+       // Functions for Future use not implemented \r
+       virtual BErr    Wait_For_SerialPort_InputData(unsigned long   bFlag,unsigned long & NoDataAvailable)=0;\r
+       virtual int     IsSerialPort_OutputBuffer_Full(unsigned long bFlag)=0;\r
+       virtual int             Read_From_SerialPort(unsigned long bFlag,unsigned char * pBuffer,unsigned long ReadLength)=0;\r
+       virtual int     Write_To_SerialPort(unsigned long bFlag,unsigned char * pBuffer,unsigned long WriteLength)=0;\r
+};\r
+\r
+\r
+\r
+\r
+extern "C" {\r
+BLUEFISH_API CBlueVelvet4*     BlueVelvetFactory4();\r
+BLUEFISH_API void BlueVelvetDestroy(CBlueVelvet4* pObj);\r
+BLUEFISH_API unsigned int BlueVelvetVANCGoldenValue(   unsigned int CardType,\r
+                                                                                                       unsigned long VidFmt,\r
+                                                                                                       unsigned long MemFmt,\r
+                                                                                                       unsigned long FrameType);\r
+\r
+BLUEFISH_API unsigned int BlueVelvetVANCLineBytes(     unsigned int CardType,\r
+                                                                                                       unsigned long   VidFmt,\r
+                                                                                                       unsigned long   MemFmt);\r
+BLUEFISH_API unsigned int BlueVelvetBytesForGroupPixels(unsigned long MemFmt,unsigned int nPixelCount);\r
+BLUEFISH_API BErr SetVideo_MetaDataInfo(CBlueVelvet4 * pSdk,LPOVERLAPPED pOverLap,ULONG FrameId,ULONG prop,VARIANT value);\r
+\r
+BLUEFISH_API BErr GetVideo_CaptureFrameInfo(CBlueVelvet4 * pSdk,LPOVERLAPPED pOverlap,struct blue_videoframe_info & video_capture_frame,int    CompostLater);\r
+BLUEFISH_API BErr GetVideo_CaptureFrameInfoEx(CBlueVelvet4 * pSdk,LPOVERLAPPED pOverlap,struct blue_videoframe_info_ex & video_capture_frame,int       CompostLater,unsigned int *capture_fifo_size);\r
+\r
+BLUEFISH_API int GetHancQueuesInfo(CBlueVelvet4 * pSdk, LPOVERLAPPED pOverlap, UINT32 video_channel, UINT32* pFreeBuffers, UINT32* pMaximumBuffers, UINT32* pStatus);\r
+BLUEFISH_API int GetHancBuffer(CBlueVelvet4 * pSdk,LPOVERLAPPED pOverlap,UINT32 video_channel);\r
+BLUEFISH_API BERR PutHancBuffer(CBlueVelvet4 * pSdk,LPOVERLAPPED pOverlap,int hanc_buffer_id,UINT32 video_channel);\r
+BLUEFISH_API BERR HancInputFifoControl(CBlueVelvet4 * pSdk,LPOVERLAPPED pOverlap,UINT32 video_channel, UINT32 control);\r
+BLUEFISH_API BERR HancOutputFifoControl(CBlueVelvet4 * pSdk,LPOVERLAPPED pOverlap,UINT32 video_channel, UINT32 control);\r
+BLUEFISH_API int GetHancInputBuffer(CBlueVelvet4 * pSdk,LPOVERLAPPED pOverlap,UINT32 video_channel,UINT32 * signal_type);\r
+BLUEFISH_API BLUE_UINT32 emb_audio_decoder( BLUE_UINT32 * src_hanc_buffer,\r
+                                                                                   void  * dest_data_ptr,\r
+                                                                                   BLUE_UINT32 req_audio_sample_count,\r
+                                                                                   BLUE_UINT32 required_audio_channels,\r
+                                                                                       BLUE_UINT32 sample_type);\r
+BLUEFISH_API BERR blue_wait_video_sync_async(CBlueVelvet4 * pSdk,\r
+                                                                                       LPOVERLAPPED pOverlap,\r
+                                                                                       blue_video_sync_struct * sync_struct);\r
+BLUEFISH_API BERR blue_dma_read_async( CBlueVelvet4 * pSdk,\r
+                                                                               LPOVERLAPPED pOverlap,\r
+                                                                               struct blue_dma_request_struct  *pUserDmaRequest);\r
+\r
+\r
+BLUEFISH_API BERR blue_load_1D_lookup_table(CBlueVelvet4 * pSdk, struct blue_1d_lookup_table_struct * lut);\r
+\r
+BLUEFISH_API BERR blue_control_video_scaler(CBlueVelvet4 * pSdk, unsigned int nScalerId,\r
+                                                                                       bool bOnlyReadValue,\r
+                                                                                       float *pSrcVideoHeight,\r
+                                                                                       float *pSrcVideoWidth,\r
+                                                                                       float *pSrcVideoYPos,\r
+                                                                                       float *pSrcVideoXPos,\r
+                                                                                       float *pDestVideoHeight,\r
+                                                                                       float *pDestVideoWidth,\r
+                                                                                       float *pDestVideoYPos,\r
+                                                                                       float *pDestVideoXPos);\r
+\r
+BLUEFISH_API BERR blue_Epoch_GetTimecodes(CBlueVelvet4 * pSdk, UINT32 VideoChannel, UINT64* pArray, UINT32* FieldCount);\r
+\r
+BLUEFISH_API unsigned int count_scaler_video_mode(CBlueVelvet4 * pSdk,\r
+                                                                                                       int device_id,\r
+                                                                                                       unsigned int video_channel,\r
+                                                                                                       unsigned int video_mode);\r
+BLUEFISH_API EVideoMode enum_scaler_video_mode(CBlueVelvet4 * pSdk,\r
+                                                                                                int device_id,\r
+                                                                                                unsigned int video_channel,\r
+                                                                                                unsigned int video_mode,\r
+                                                                                                unsigned int index);\r
+BLUEFISH_API BERR blue_video_scaler_filter_coefficent( CBlueVelvet4 * pSdk,\r
+                                                                                       unsigned int nScalerId,\r
+                                                                                       bool bOnlyReadValue,\r
+                                                                                       unsigned int nFilterType,\r
+                                                                                       float *pCoefficentWeightArray,\r
+                                                                                       unsigned int nArrayElementCount\r
+                                                                                       );\r
+}\r
+\r
+\r
+#endif //_BLUEVELVET4_H
\ No newline at end of file
diff --git a/BluefishSDK_V5_8_0_31/Inc/BlueVelvet_c.h b/BluefishSDK_V5_8_0_31/Inc/BlueVelvet_c.h
new file mode 100644 (file)
index 0000000..def919b
--- /dev/null
@@ -0,0 +1,131 @@
+/*\r
+// ==========================================================================\r
+//     Bluefish444 BlueVelvet SDK library\r
+//\r
+//  BlueSD_c.h\r
+//  Constants header\r
+//     LARGELY superseded by dynamic calculations\r
+\r
+\r
+  $Id: BlueVelvet_c.h,v 1.4 2002/10/02 00:29:53 cameron Exp $\r
+//\r
+//  developed by  : Cameron Duffy   (C) 2002 Bluefish444 P/L\r
+// ==========================================================================\r
+//\r
+*/\r
+\r
+//----------------------------------------------------------------------------\r
+#ifndef _BLUEVELVET_C_H\r
+#define _BLUEVELVET_C_H\r
+\r
+//----------------------------------------------------------------------------------------------------------------------\r
+// File SUB-types supported\r
+//\r
+typedef enum\r
+{\r
+       EBlue_10BIT_NTSC=0,             // 10 BIT NTSC\r
+       EBlue_10BIT_PAL,                // 10 BIT PAL\r
+       EBlue_08BIT_NTSC,               //  8 BIT NTSC\r
+       EBlue_08BIT_PAL,                //  8 BIT PAL\r
+       EBlue_32BIT_NTSC,               // 32 BIT NTSC (ARGB - uncompressed)\r
+       EBlue_32BIT_PAL         // 32 BIT PAL  (ARGB - uncompressed)\r
+} EBlueFileId;\r
+\r
+// File subtype ID;s\r
+#define        BLUE_FILE_10BIT_NTSC    0       // 10 BIT NTSC\r
+#define        BLUE_FILE_10BIT_PAL             1       // 10 BIT PAL\r
+#define        BLUE_FILE_08BIT_NTSC    2       //  8 BIT NTSC\r
+#define        BLUE_FILE_08BIT_PAL             3       //  8 BIT PAL\r
+#define        BLUE_FILE_32BIT_NTSC    4       // 32 BIT NTSC (ARGB - uncompressed)\r
+#define        BLUE_FILE_32BIT_PAL             5       // 32 BIT PAL  (ARGB - uncompressed)\r
+\r
+// File subtype FOURCC\r
+#define        BLUE_SUBTYPE_10BIT_NTSC 0x52594e5f      //'RYN_'        // 10 BIT NTSC\r
+#define        BLUE_SUBTYPE_10BIT_PAL  0x5259515f      //'RYP_'        // 10 BIT PAL\r
+#define        BLUE_SUBTYPE_08BIT_NTSC 0x52384e5f      //'R8N_'        //  8 BIT NTSC\r
+#define        BLUE_SUBTYPE_08BIT_PAL  0x5238515f      //'R8P_'        //  8 BIT PAL\r
+#define        BLUE_SUBTYPE_32BIT_NTSC 0x52524e5f      //'RRN_'        // 32 BIT NTSC (ARGB - uncompressed)\r
+#define        BLUE_SUBTYPE_32BIT_PAL  0x5252415f      //'RRP_'        // 32 BIT PAL  (ARGB - uncompressed)\r
+\r
+#define        BLUE_ROOTED_SUBTYPE             0x62626262      //'XXXX'\r
+#define        BLUE_FILE_NOVIDEO               0x62626262      //'XXXX'\r
+#define        BLUE_FILE_TYPE                  0x5244565f      //'RDV_'\r
+#define        BLUE_CLASS_ID                   0x52444456      //'RDDV'\r
+\r
+// align this structure on 512 byte boundary!\r
+typedef struct\r
+{\r
+       char                            name[20];               // "PREMIERE RDV_FILE";\r
+       ULONG                           hasAudio;               // See BLUE_SUBTYPE_???\r
+       ULONG                           VideoSubtype;   // See BLUE_SUBTYPE_???\r
+       ULONG                           width;                  // width of frame in pixels\r
+       ULONG                           height;                 // height of frame in pixels (can get video mode)\r
+       ULONG                           rowbytes;               // total bytes in row (can get mem format from this and width)\r
+       ULONG                           numFrames;              // number of frames in file\r
+       ULONG                           frameOffset;    // GOLDEN frame size\r
+       ULONG                           duration;               // TDB - value = total number of frames\r
+       long                            scale;                  // TDB - scale = scale / samplesize = timebase\r
+       long                            sampleSize;             // TDB - sampleSize = 1 or 100 if 29.97 fps\r
+\r
+       ULONG                           gFmtVid;\r
+       ULONG                           gFmtMem;\r
+       ULONG                           gFmtUpd;\r
+       ULONG                           gFmtRes;\r
+       // 76 bytes\r
+       char                            orgtime[20];    // These fields map directly to those in imTimeInfoRec.\r
+       char                            alttime[20];\r
+       char                            orgreel[40];\r
+       char                            altreel[40];\r
+       // 196 bytes\r
+       char                            logcomment[256];\r
+       // 452 bytes\r
+//     char                            pad[512-452-4];\r
+       char                            pad[56];\r
+       // For disk speed to work, this structure MUST be a multiple of sector size\r
+       ULONG                           len;                    // Length of TRAILER, *always* last!\r
+} RDV_File2_OLD;\r
+//#define      SIZE_RDV_FILE   512\r
+\r
+#define kGoldenPageSize        4096\r
+\r
+typedef struct\r
+{\r
+       char                            name[20];               // "PREMIERE RDV_FILE ";\r
+       ULONG                           hasAudio;               // See BLUE_SUBTYPE_???\r
+       ULONG                           VideoSubtype;   // See BLUE_SUBTYPE_???\r
+       ULONG                           width;                  // width of frame in pixels\r
+       ULONG                           height;                 // height of frame in pixels (can get video mode)\r
+       ULONG                           rowbytes;               // total bytes in row (can get mem format from this and width)\r
+       ULONG                           numFrames;              // number of frames in file\r
+       ULONG                           frameOffset;    // GOLDEN frame size\r
+       ULONG                           duration;               // TDB - value = total number of frames\r
+       long                            scale;                  // TDB - scale = scale / samplesize = timebase\r
+       long                            sampleSize;             // TDB - sampleSize = 1 or 100 if 29.97 fps\r
+\r
+       ULONG                           gFmtVid;\r
+       ULONG                           gFmtMem;\r
+       ULONG                           gFmtUpd;\r
+       ULONG                           gFmtRes;\r
+       // 76 bytes\r
+       char                            orgtime[20];    // These fields map directly to those in imTimeInfoRec.\r
+       char                            alttime[20];\r
+       char                            orgreel[40];\r
+       char                            altreel[40];\r
+       // 196 bytes\r
+       char                            logcomment[256];\r
+       // 452 bytes\r
+//     char                            pad[512-452-4];\r
+       ULONG                           audioSampleRate;                // 48000 or 96000\r
+       ULONG                           numChannels;                    // 2, 4, or 6\r
+       ULONG                           numAudioBlocks;                 // how many in the file?\r
+       // 464 bytes\r
+       char                            pad[36];\r
+\r
+       _int64                          audioBlockOffsets[kGoldenPageSize * 4];         // something like 4.5 hours max length (enough for now I guess)\r
+       ULONG                           audioBlockSizes[kGoldenPageSize * 4];\r
+\r
+       // For disk speed to work, this structure MUST be a multiple of sector size\r
+       ULONG                           len;                    // Length of TRAILER, *always* last!\r
+} RDV_File2;\r
+\r
+#endif //_BLUEVELVET_C_H\r
diff --git a/BluefishSDK_V5_8_0_31/Inc/BluefishApi.h b/BluefishSDK_V5_8_0_31/Inc/BluefishApi.h
new file mode 100644 (file)
index 0000000..4a84248
--- /dev/null
@@ -0,0 +1,227 @@
+// The following ifdef block is the standard way of creating macros which make exporting \r
+// from a DLL simpler. All files within this DLL are compiled with the BLUEC_API_EXPORTS\r
+// symbol defined on the command line. this symbol should not be defined on any project\r
+// that uses this DLL. This way any other project whose source files include this file see \r
+// BLUEC_API_API functions as being imported from a DLL, whereas this DLL sees symbols\r
+// defined with this macro as being exported.\r
+#ifdef BLUEFISH_EXPORTS\r
+#define BLUEFISH_API __declspec(dllexport)\r
+#else\r
+#define BLUEFISH_API __declspec(dllimport)\r
+#endif\r
+#include "BlueDriver_p.h"\r
+\r
+\r
+#define IGNORE_SYNC_WAIT_TIMEOUT_VALUE (0xFFFFFFFF)\r
+typedef void * BLUEFISHAPI_HANDLE;\r
+typedef int BErr;\r
+\r
+extern "C" {\r
+\r
+\r
+struct bluefishapi_card_feature\r
+{\r
+       BLUE_UINT32 card_id;\r
+       BLUE_UINT32 video_output_channel;\r
+       BLUE_UINT32 sdi_output_connector;\r
+       BLUE_UINT32 output_analog_connector;\r
+       BLUE_UINT32 no_video_input_channel;\r
+       BLUE_UINT32 no_sdi_input_connector;\r
+       BLUE_UINT32 input_analog_connector;\r
+       BLUE_UINT32 digital_audio_output_connector;\r
+       BLUE_UINT32 digital_audio_input_connector;\r
+       BLUE_UINT32 analog_audio_output_connector;\r
+       BLUE_UINT32 analog_audio_input_connector;\r
+       BLUE_UINT32 pad[128];\r
+};\r
+\r
+BLUEFISH_API unsigned int bluefishapi_device_count();\r
+BLUEFISH_API void * bluefishapi_attach(int device_id,unsigned int *card_type);\r
+BLUEFISH_API BErr bluefishapi_detach(void ** device_handle);\r
+\r
+/**\r
+ * These function can be used set/get various card property\r
+ * Also the is_prop_supported function can be used to check if the particular property is \r
+ * supported on that card or not.\r
+ * This includes the video property and the video connection/routing property.\r
+ */\r
+BLUEFISH_API BErr bluefishapi_set_card_property(BLUEFISHAPI_HANDLE  device_handle,unsigned int video_channel,int card_prop,void *value);\r
+BLUEFISH_API BErr bluefishapi_get_card_property(BLUEFISHAPI_HANDLE  device_handle,unsigned int video_channel,int card_prop,void *value);\r
+BLUEFISH_API bool bluefishapi_is_prop_supported(BLUEFISHAPI_HANDLE  device_handle,unsigned int video_channel,int card_prop,int *no_parameters,int *parameter_type);\r
+/*\r
+BLUEFISH_API BErr      bluefishapi_get_connector_property(BLUEFISHAPI_HANDLE device_handle,\r
+                                                                                               BLUE_UINT32 VideoChannel,\r
+                                                                                               BLUE_UINT32 *settingsCount,     // In: element count of settings array\r
+                                                                                                                               // Out: if settings is non-NULL, number of valid elements\r
+                                                                                                                               // Out: if settings is NULL, number of elements required\r
+                                                                                               EBlueConnectorPropertySetting *settings // Caller allocates/frees memory\r
+                                                                                               );\r
+\r
+BLUEFISH_API BErr      bluefishapi_set_connector_property(\r
+                                                                                               BLUEFISHAPI_HANDLE device_handle,\r
+                                                                                               BLUE_UINT32 settingsCount,\r
+                                                                                               EBlueConnectorPropertySetting *settings\r
+                                                                                               );\r
+*/\r
+/**\r
+ * These function can be used to transfer frames in and out of the \r
+ * card using the DMA engine on the card.\r
+ *\r
+ * These functions are already there in BlueVelvet4.h , wanted to check if you are ok with this interface.\r
+ * In BlueVelvet4.h instead of BLUE_DEVICE_HANDLE being passed as first parameter it is passing a pointer to\r
+ * CBlueVelvet4.\r
+ *\r
+ */\r
+BLUEFISH_API BErr bluefishapi_dma_ex(  BLUEFISHAPI_HANDLE  device_handle,\r
+                                                                               BLUE_UINT32 dma_direction,\r
+                                                                               struct blue_dma_request_struct  *user_dma_request_ptr);\r
+\r
+BLUEFISH_API BErr bluefishapi_dma_async(       BLUEFISHAPI_HANDLE  device_handle,\r
+                                                                                       BLUE_UINT32 dma_direction,\r
+                                                                                       LPOVERLAPPED overlap_ptr,\r
+                                                                                       struct blue_dma_request_struct  *user_dma_request_ptr);\r
+\r
+BErr bluefishapi_dma(  BLUEFISHAPI_HANDLE  device_handle,\r
+                                               BLUE_UINT32 dma_direction,\r
+                                               void * pFrameBuffer,\r
+                                               BLUE_UINT32 video_channel,\r
+                                               BLUE_UINT32 FrameSize,\r
+                                               BLUE_UINT32 BufferId,\r
+                                               BLUE_UINT32 BufferDataType,\r
+                                               BLUE_UINT32 FrameType,\r
+                                               BLUE_UINT32 CardFrameOffset);\r
+\r
+\r
+/**\r
+ * wait for sync functions\r
+ * \r
+ * These functions are already there in BlueVelvet4.h , wanted to check if you are ok with this interface.\r
+ * In BlueVelvet4.h instead of BLUE_DEVICE_HANDLE being passed as first parameter it is passing a pointer to\r
+ * CBlueVelvet4.\r
+ *\r
+ * The rational for these function is it will help us pass more information with these function \r
+ * in the future. The blue_video_sync_struct has a member called pad which can be used to add more member variables \r
+ * with out changing the signature .\r
+ */ \r
+\r
+\r
+BLUEFISH_API BErr bluefishapi_wait_video_sync_ex(BLUEFISHAPI_HANDLE device_handle,blue_video_sync_struct * sync_struct);\r
+\r
+BLUEFISH_API BErr bluefishapi_wait_video_sync_async(BLUEFISHAPI_HANDLE device_handle,\r
+                                                                                                       LPOVERLAPPED overlap_ptr,\r
+                                                                                                       blue_video_sync_struct * sync_struct);\r
+\r
+BLUEFISH_API BErr bluefishapi_wait_video_sync(         BLUEFISHAPI_HANDLE device_handle,\r
+                                                                                                       BLUE_UINT32 video_channel,\r
+                                                                                                       BLUE_UINT32 upd_type,\r
+                                                                                                       BLUE_UINT32 *field_count);\r
+\r
+BLUEFISH_API BErr bluefishapi_complete_async_req(BLUEFISHAPI_HANDLE device_handle,LPOVERLAPPED overlap_ptr);\r
+\r
+\r
+/**\r
+ * video fifo functions\r
+ *\r
+ * These are a one to one mapping of the C++ functions\r
+ *\r
+ */\r
+BLUEFISH_API BErr bluefishapi_set_video_engine(BLUEFISHAPI_HANDLE device_handle,\r
+                                                                       BLUE_UINT32 video_channel,\r
+                                                                       BLUE_UINT32 *video_engine ,\r
+                                                                       BLUE_UINT32 has_playthru,\r
+                                                                       BLUE_UINT32 playthru_video_channel);\r
+\r
+BLUEFISH_API BErr bluefishapi_get_free_playback_frame(void * device_handle,BLUE_UINT32  video_channel,BLUE_INT32 *BufferId,BLUE_UINT32 * Underrun);\r
+BLUEFISH_API BErr bluefishapi_present_playback_frame(  void * device_handle,\r
+                                                                                       BLUE_UINT32  video_channel,\r
+                                                                                       BLUE_UINT32 video_repeat_count,\r
+                                                                                       BLUE_UINT32 video_frame_flag,\r
+                                                                                       BLUE_INT32  BufferId,\r
+                                                                                       BLUE_UINT32 FrameType,\r
+                                                                                       BLUE_UINT32 * unique_id);\r
+\r
+\r
+BLUEFISH_API BErr      bluefishapi_video_playback_start(       BLUEFISHAPI_HANDLE device_handle,\r
+                                                                                                               int video_channel,              \r
+                                                                                                               int             Step,\r
+                                                                                                               int             Loop) ;\r
+\r
+BLUEFISH_API BErr      bluefishapi_video_playback_stop(        BLUEFISHAPI_HANDLE device_handle,\r
+                                                                                       int video_channel,              \r
+                                                                                       int             Wait,\r
+                                                                                       int             Flush) ;\r
+\r
+BLUEFISH_API BErr video_capture_harvest(       BLUEFISHAPI_HANDLE device_handle,\r
+                                                                                       int video_channel,\r
+                                                                                       int     * BufferId,\r
+                                                                                       unsigned int *  Count,\r
+                                                                                       unsigned int*   Frames);\r
+\r
+BLUEFISH_API BErr      video_capture_start(    BLUEFISHAPI_HANDLE device_handle,\r
+                                                                                       int video_channel);\r
+\r
+BLUEFISH_API BErr bluefishapi_get_capture_video_frame( void * device_handle,\r
+                                                                                       BLUE_UINT32  video_channel,\r
+                                                                                       blue_videoframe_info_ex * frame_info,\r
+                                                                                       BLUE_UINT32 *dropped_frame_count,\r
+                                                                                       BLUE_UINT32 *current_fifo_size,\r
+                                                                                       BLUE_UINT32 flag);\r
+\r
+BLUEFISH_API BErr      video_capture_stop(             BLUEFISHAPI_HANDLE device_handle,int video_channel);\r
+BLUEFISH_API BErr video_playback_flush(        BLUEFISHAPI_HANDLE device_handle,int video_channel);\r
+\r
+\r
+/*audio capture*/\r
+BLUEFISH_API BErr      bluefishapi_start_audio_capture(BLUEFISHAPI_HANDLE device_handle,\r
+                                                                                                       BLUE_UINT32  video_channel,\r
+                                                                                                       BLUE_UINT32 sync_start_count);\r
+\r
+BLUEFISH_API BErr      bluefishapi_stop_audio_capture(BLUEFISHAPI_HANDLE device_handle,BLUE_UINT32  video_channel);\r
+\r
+BLUEFISH_API BErr      bluefishapi_wait_audio_input_interrupt(BLUEFISHAPI_HANDLE device_handle,\r
+                                                                                                                  BLUE_UINT32 video_channel,\r
+                                                                                                                  BLUE_UINT32 * queued_sample_count,\r
+                                                                                                                  BLUE_UINT32 * free_sample_space);\r
+\r
+BLUEFISH_API BErr      bluefishapi_read_audio_sample(  BLUEFISHAPI_HANDLE device_handle,\r
+                                                                                                       BLUE_UINT32 video_channel,\r
+                                                                                                       void * pBuffer,\r
+                                                                                                       BLUE_UINT32 read_sample_count,\r
+                                                                                                       BLUE_UINT32 audio_channel_select_mask,\r
+                                                                                                       BLUE_UINT32 audio_sample_flags);\r
+\r
+/*audio playback*/\r
+BLUEFISH_API BErr      bluefishapi_wait_audio_output_interrupt(BLUEFISHAPI_HANDLE device_handle,\r
+                                                                                                                       BLUE_UINT32 video_channel,\r
+                                                                                                                       BLUE_UINT32 * queued_sample_count,\r
+                                                                                                                       BLUE_UINT32 * free_sample_space);\r
+\r
+BLUEFISH_API BErr   bluefishapi_open_playback_engine(BLUEFISHAPI_HANDLE device_handle);\r
+BLUEFISH_API BErr      bluefishapi_write_audio_sample( BLUEFISHAPI_HANDLE device_handle,\r
+                                                                                                       BLUE_UINT32 video_channel,\r
+                                                                                                       void * pBuffer,\r
+                                                                                                       BLUE_UINT32 write_sample_count,\r
+                                                                                                       BLUE_UINT32 audio_channel_select_mask,\r
+                                                                                                       BLUE_UINT32 audio_sample_flags);\r
+\r
+BLUEFISH_API BErr   bluefishapi_close_playback_engine(BLUEFISHAPI_HANDLE device_handle);\r
+BLUEFISH_API BErr bluefishapi_start_audio_playback(    BLUEFISHAPI_HANDLE device_handle,int syncCount);\r
+BLUEFISH_API BErr bluefishapi_stop_audio_playback(     BLUEFISHAPI_HANDLE device_handle);\r
+\r
+BLUEFISH_API BErr bluefishapi_get_hancoutput_buffer(void * device_handle,UINT32 video_channel);\r
+BLUEFISH_API BErr bluefishapi_put_hancoutput_buffer(void * device_handle,int hanc_buffer_id,UINT32 video_channel);\r
+BLUEFISH_API BErr bluefishapi_hancoutput_fifo_control(void * device_handle,\r
+                                                 UINT32 video_channel,\r
+                                                 UINT32 control);\r
+BLUEFISH_API BErr blue_control_pciconfig_space(\r
+                                                                                       void * device_handle,\r
+                                                                                       BLUE_UINT32 configspace_offset,\r
+                                                                                       BLUE_UINT32 * configspace_value,\r
+                                                                                       BLUE_UINT32 bReadFlag);\r
+BLUEFISH_API BErr bluefishapi_control_pcicontrol_reg(\r
+                                                                                       void * device_handle,\r
+                                                                                       BLUE_UINT32 bar_id,\r
+                                                                                       BLUE_UINT32 controlreg_offset,\r
+                                                                                       BLUE_UINT32 * controlreg_value,\r
+                                                                                       BLUE_UINT32 bReadFlag);\r
+}
\ No newline at end of file
diff --git a/BluefishSDK_V5_8_0_31/Inc/bluedriver_p.h b/BluefishSDK_V5_8_0_31/Inc/bluedriver_p.h
new file mode 100644 (file)
index 0000000..5a33aa0
--- /dev/null
@@ -0,0 +1,1062 @@
+/*\r
+ $Id: BlueDriver_p.h,v 1.24.2.4 2009/08/29 04:31:59 tim Exp $\r
+*/\r
+#pragma once \r
+#define _BLUEDRIVER_P_H__\r
+#define BLUE_UINT32    unsigned int \r
+#define BLUE_INT32     int \r
+#define BLUE_UINT8     unsigned char\r
+#define BLUE_INT8      char\r
+#define BLUE_UINT16    unsigned short\r
+#define BLUE_INT16     short\r
+#pragma once\r
+#ifdef BLUE_LINUX_CODE\r
+#define BLUE_UINT64 unsigned long long \r
+//#include <asm/types.h>\r
+#else\r
+#define BLUE_UINT64    unsigned __int64\r
+#endif \r
+\r
+\r
+/**\r
+ * This contains the enumerators that can be used to set the cards \n\r
+ * video output and also to determine the video mode of the incoming \n\r
+ * video signal.\r
+ */ \r
+typedef enum _EVideoMode\r
+{\r
+       VID_FMT_PAL=0,\r
+       VID_FMT_NTSC=1,\r
+       VID_FMT_576I_5000=0,    /**< 720  x 576  50       Interlaced */\r
+       VID_FMT_486I_5994=1,    /**< 720  x 486  60/1.001 Interlaced */\r
+       VID_FMT_720P_5994,              /**< 1280 x 720  60/1.001 Progressive */\r
+       VID_FMT_720P_6000,              /**< 1280 x 720  60       Progressive */\r
+       VID_FMT_1080PSF_2397,   /**< 1920 x 1080 24/1.001 Segment Frame */\r
+       VID_FMT_1080PSF_2400,   /**< 1920 x 1080 24       Segment Frame */\r
+       VID_FMT_1080P_2397,             /**< 1920 x 1080 24/1.001 Progressive */\r
+       VID_FMT_1080P_2400,             /**< 1920 x 1080 24       Progressive */\r
+       VID_FMT_1080I_5000,             /**< 1920 x 1080 50       Interlaced */\r
+       VID_FMT_1080I_5994,             /**< 1920 x 1080 60/1.001 Interlaced */\r
+       VID_FMT_1080I_6000,             /**< 1920 x 1080 60       Interlaced */\r
+       VID_FMT_1080P_2500,             /**< 1920 x 1080 25       Progressive */\r
+       VID_FMT_1080P_2997,             /**< 1920 x 1080 30/1.001 Progressive */\r
+       VID_FMT_1080P_3000,             /**< 1920 x 1080 30       Progressive */\r
+       VID_FMT_HSDL_1498,              /**< 2048 x 1556 15/1.0   Segment Frame */\r
+       VID_FMT_HSDL_1500,              /**< 2048 x 1556 15             Segment Frame */\r
+       VID_FMT_720P_5000,\r
+       VID_FMT_720P_2398,\r
+       VID_FMT_720P_2400,\r
+       VID_FMT_2048_1080PSF_2397=19,\r
+       VID_FMT_2048_1080PSF_2400=20,\r
+       VID_FMT_2048_1080P_2397=21,\r
+       VID_FMT_2048_1080P_2400=22,\r
+       VID_FMT_1080PSF_2500=23,\r
+       VID_FMT_1080PSF_2997=24,\r
+       VID_FMT_1080PSF_3000=25,\r
+       VID_FMT_1080P_5000=26,\r
+       VID_FMT_1080P_5994=27,\r
+       VID_FMT_1080P_6000=28,\r
+       VID_FMT_720P_2500=29,\r
+       VID_FMT_720P_2997=30,\r
+       VID_FMT_720P_3000=31,\r
+       VID_FMT_INVALID=32\r
+} EVideoMode;\r
+\r
+typedef enum _EMemoryFormat\r
+{\r
+       MEM_FMT_ARGB=0,\r
+       MEM_FMT_BV10=1,\r
+       MEM_FMT_BV8=2,\r
+       MEM_FMT_YUVS=MEM_FMT_BV8,\r
+       MEM_FMT_V210=3, // Iridium HD (BAG1)\r
+       MEM_FMT_RGBA=4,\r
+       MEM_FMT_CINEON_LITTLE_ENDIAN=5,\r
+       MEM_FMT_ARGB_PC=6,\r
+       MEM_FMT_BGRA=MEM_FMT_ARGB_PC,\r
+       MEM_FMT_CINEON=7,\r
+       MEM_FMT_2VUY=8,\r
+       MEM_FMT_BGR=9,\r
+       MEM_FMT_INVALID=10\r
+} EMemoryFormat;\r
+\r
+typedef enum _EUpdateMethod\r
+{\r
+       UPD_FMT_FIELD=0,\r
+       UPD_FMT_FRAME,\r
+       UPD_FMT_FRAME_DISPLAY_FIELD1,\r
+       UPD_FMT_FRAME_DISPLAY_FIELD2,\r
+       UPD_FMT_INVALID\r
+} EUpdateMethod;\r
+\r
+typedef enum _EResoFormat\r
+{\r
+       RES_FMT_NORMAL=0,\r
+       RES_FMT_HALF,\r
+       RES_FMT_INVALID\r
+} EResoFormat;\r
+\r
+typedef enum _ECardType\r
+{\r
+       CRD_BLUEDEEP_LT=0,              // D64 Lite\r
+       CRD_BLUEDEEP_SD,                // Iridium SD\r
+       CRD_BLUEDEEP_AV,                // Iridium AV\r
+       CRD_BLUEDEEP_IO,                // D64 Full\r
+       CRD_BLUEWILD_AV,                // D64 AV\r
+       CRD_IRIDIUM_HD,                 // * Iridium HD\r
+       CRD_BLUEWILD_RT,                // D64 RT\r
+       CRD_BLUEWILD_HD,                // * BadAss G2\r
+       CRD_REDDEVIL,                   // Iridium Full\r
+       CRD_BLUEDEEP_HD,                // * BadAss G2 variant, proposed, reserved\r
+       CRD_BLUE_EPOCH_2K = CRD_BLUEDEEP_HD,\r
+       CRD_BLUE_EPOCH_2K_HORIZON=CRD_BLUE_EPOCH_2K,\r
+       CRD_BLUEDEEP_HDS,               // * BadAss G2 variant, proposed, reserved\r
+       CRD_BLUE_ENVY,                  // Mini Din \r
+       CRD_BLUE_PRIDE,                 //Mini Din Output \r
+       CRD_BLUE_GREED,\r
+       CRD_BLUE_INGEST,\r
+       CRD_BLUE_SD_DUALLINK,\r
+       CRD_BLUE_CATALYST,\r
+       CRD_BLUE_SD_DUALLINK_PRO,\r
+       CRD_BLUE_SD_INGEST_PRO,\r
+       CRD_BLUE_SD_DEEPBLUE_LITE_PRO,\r
+       CRD_BLUE_SD_SINGLELINK_PRO,\r
+       CRD_BLUE_SD_IRIDIUM_AV_PRO,\r
+       CRD_BLUE_SD_FIDELITY,\r
+       CRD_BLUE_SD_FOCUS,\r
+       CRD_BLUE_SD_PRIME,\r
+       CRD_BLUE_EPOCH_2K_CORE,\r
+       CRD_BLUE_EPOCH_2K_ULTRA,\r
+       CRD_BLUE_EPOCH_HORIZON,\r
+       CRD_BLUE_EPOCH_CORE,\r
+       CRD_BLUE_EPOCH_ULTRA,\r
+       CRD_BLUE_CREATE_HD,\r
+       CRD_BLUE_CREATE_2K,\r
+       CRD_BLUE_CREATE_2K_ULTRA,\r
+       CRD_INVALID\r
+} ECardType;\r
+\r
+\r
+typedef enum _EHDCardSubType\r
+{      \r
+       CRD_HD_FURY=1,\r
+       CRD_HD_VENGENCE=2,\r
+       CRD_HD_IRIDIUM_XP=3,\r
+       CRD_HD_IRIDIUM = 4,\r
+       CRD_HD_LUST=5,\r
+       CRD_HD_INVALID\r
+}EHDCardSubType;\r
+\r
+/* To be used by the new audio interface only */\r
+typedef enum _BlueAudioChannelDesc\r
+{\r
+       MONO_FLAG               = 0xC0000000,\r
+       MONO_CHANNEL_1  = 0x00000001,\r
+       MONO_CHANNEL_2  = 0x00000002,\r
+       MONO_CHANNEL_3  = 0x00000004,\r
+       MONO_CHANNEL_4  = 0x00000008,\r
+       MONO_CHANNEL_5  = 0x00000010,\r
+       MONO_CHANNEL_6  = 0x00000020,\r
+       MONO_CHANNEL_7  = 0x00000040,\r
+       MONO_CHANNEL_8  = 0x00000080,\r
+       MONO_CHANNEL_9  = 0x00000100,// to be used by analog audio output channels \r
+       MONO_CHANNEL_10 = 0x00000200,// to be used by analog audio output channels \r
+       MONO_CHANNEL_11 = 0x00000400,//actual channel 9\r
+       MONO_CHANNEL_12 = 0x00000800,//actual channel 10\r
+       MONO_CHANNEL_13 = 0x00001000,//actual channel 11\r
+       MONO_CHANNEL_14 = 0x00002000,//actual channel 12\r
+       MONO_CHANNEL_15 = 0x00004000,//actual channel 13\r
+       MONO_CHANNEL_16 = 0x00008000,//actual channel 14\r
+       MONO_CHANNEL_17 = 0x00010000,//actual channel 15\r
+       MONO_CHANNEL_18 = 0x00020000 //actual channel 16\r
+}BlueAudioChannelDesc;\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+typedef enum\r
+{\r
+       AUDIO_CHANNEL_LOOPING_OFF               = 0x00000000,\r
+       AUDIO_CHANNEL_LOOPING                   = 0x00000001,\r
+       AUDIO_CHANNEL_LITTLEENDIAN              = 0x00000000,\r
+       AUDIO_CHANNEL_BIGENDIAN                 = 0x00000002,\r
+       AUDIO_CHANNEL_OFFSET_IN_BYTES   = 0x00000004,\r
+       AUDIO_CHANNEL_16BIT                             = 0x00000008,\r
+       AUDIO_CHANNEL_BLIP_PENDING              = 0x00000010,\r
+       AUDIO_CHANNEL_BLIP_COMPLETE             = 0x00000020,\r
+       AUDIO_CHANNEL_SELECT_CHANNEL    = 0x00000040,\r
+       AUDIO_CHANNEL_24BIT                             = 0x00000080\r
+} EAudioFlags;\r
+\r
+/**\r
+@desc Used to select Audio input source on new generation SD cards \r
+@remarks\r
+This enumerator works only when used with ReadAudioSample function.\r
+*/\r
+typedef enum\r
+{\r
+       BLUE_AUDIO_AES=0, /**< Used to select All 8 channels of Digital Audio using AES/AES3id  connector*/\r
+       BLUE_AUDIO_ANALOG=1,/**< Used to select Analog audio*/\r
+       BLUE_AUDIO_SDIA=2, /**< Used to select Emb audio from SDI A */\r
+       BLUE_AUDIO_EMBEDDED=BLUE_AUDIO_SDIA,\r
+       BLUE_AUDIO_SDIB=3, /**< Used to select Emb audio from SDI B */\r
+       BLUE_AUDIO_AES_PAIR0=4,\r
+       BLUE_AUDIO_AES_PAIR1=5,\r
+       BLUE_AUDIO_AES_PAIR2=6,\r
+       BLUE_AUDIO_AES_PAIR3=7,\r
+       BLUE_AUDIO_INVALID=8\r
+} Blue_Audio_Connector_Type;\r
+\r
+typedef enum _EAudioRate\r
+{\r
+       AUDIO_SAMPLE_RATE_48K=48000,\r
+       AUDIO_SAMPLE_RATE_96K=96000,\r
+       AUDIO_SAMPLE_RATE_UNKNOWN=-1\r
+} EAudioRate;\r
+\r
+typedef enum _EConnectorSignalColorSpace\r
+{\r
+       RGB_ON_CONNECTOR=0x00400000,\r
+       YUV_ON_CONNECTOR=0\r
+}EConnectorSignalColorSpace;\r
+\r
+typedef enum _EDualLinkSignalFormatType\r
+{\r
+       Signal_FormatType_4224=0,\r
+       Signal_FormatType_4444=1,\r
+       Signal_FormatType_Independent_422=10,\r
+       Signal_FormatType_Dependent_422=11,\r
+       Signal_FormatType_Key_Key=0x8000\r
+}EDualLinkSignalFormatType;\r
+\r
+typedef enum _EPreDefinedColorSpaceMatrix\r
+{\r
+       UNITY_MATRIX=0,\r
+       MATRIX_709_CGR=1,\r
+       MATRIX_RGB_TO_YUV_709_CGR=MATRIX_709_CGR,\r
+       MATRIX_709=2,\r
+       MATRIX_RGB_TO_YUV_709=MATRIX_709,\r
+       RGB_FULL_RGB_SMPTE=3,\r
+       MATRIX_601_CGR=4,\r
+       MATRIX_RGB_TO_YUV_601_CGR=MATRIX_601_CGR,\r
+       MATRIX_601=5,\r
+       MATRIX_RGB_TO_YUV_601=MATRIX_601,\r
+       MATRIX_SMPTE_274_CGR=6,\r
+       MATRIX_SMPTE_274=7,\r
+       MATRIX_VUYA=8,\r
+       UNITY_MATRIX_INPUT=9,\r
+       MATRIX_YUV_TO_RGB_709_CGR=10,\r
+       MATRIX_YUV_TO_RGB_709=11,\r
+       RGB_SMPTE_RGB_FULL=12,\r
+       MATRIX_YUV_TO_RGB_601_CGR=13,\r
+       MATRIX_YUV_TO_RGB_601=14,\r
+       MATRIX_USER_DEFINED=15,\r
+}EPreDefinedColorSpaceMatrix;\r
+\r
+#ifndef BLUE_LINUX_CODE\r
+typedef enum\r
+{\r
+       BLUE_FIFO_CLOSED=0,\r
+       BLUE_FIFO_STARTING=1,\r
+       BLUE_FIFO_RUNNING=2,\r
+       BLUE_FIFO_STOPPING=3,\r
+       BLUE_FIFO_PASSIVE=5,\r
+}BlueVideoFifoStatus;\r
+#endif\r
+typedef enum _ERGBDataRange\r
+{\r
+       CGR_RANGE=0, //0-255\r
+       SMPTE_RANGE=1 //16-235\r
+}ERGBDataRange;\r
+\r
+typedef enum _EHD_XCONNECTOR_MODE\r
+{\r
+       SD_SDI=1,\r
+       HD_SDI=2\r
+}EHD_XCONNECTOR_MODE;\r
+\r
+typedef enum _EImageOrientation\r
+{\r
+       ImageOrientation_Normal=0,      \r
+       ImageOrientation_VerticalFlip=1,\r
+       ImageOrientation_Invalid=2,\r
+}EImageOrientation;\r
+\r
+typedef enum _EBlueGenlockSource\r
+{\r
+       BlueGenlockBNC=0,\r
+       BlueSDIBNC=0x10000,\r
+       BlueSDI_B_BNC=BlueSDIBNC,\r
+       BlueSDI_A_BNC=0x20000,\r
+       BlueAnalog_BNC=0x40000,\r
+       BlueSoftware=0x80000,\r
+}EBlueGenlockSource;\r
+\r
+typedef enum _EBlueVideoChannel\r
+{\r
+       BLUE_VIDEOCHANNEL_A=0,\r
+       BLUE_VIDEO_OUTPUT_CHANNEL_A=BLUE_VIDEOCHANNEL_A,\r
+       \r
+       BLUE_VIDEOCHANNEL_B=1,\r
+       BLUE_VIDEO_OUTPUT_CHANNEL_B=BLUE_VIDEOCHANNEL_B,\r
+       \r
+       BLUE_VIDEOCHANNEL_C=2,\r
+       BLUE_VIDEO_INPUT_CHANNEL_A=BLUE_VIDEOCHANNEL_C,\r
+\r
+       BLUE_VIDEOCHANNEL_D=3,\r
+       BLUE_VIDEO_INPUT_CHANNEL_B=BLUE_VIDEOCHANNEL_D,\r
+       \r
+       BLUE_OUTPUT_MEM_MODULE_A=BLUE_VIDEO_OUTPUT_CHANNEL_A,\r
+       BLUE_OUTPUT_MEM_MODULE_B=BLUE_VIDEO_OUTPUT_CHANNEL_B,\r
+       BLUE_INPUT_MEM_MODULE_A=BLUE_VIDEO_INPUT_CHANNEL_A,\r
+       BLUE_INPUT_MEM_MODULE_B=BLUE_VIDEO_INPUT_CHANNEL_B,\r
+       BLUE_JETSTREAM_SCALER_MODULE_0=0x10,\r
+       BLUE_JETSTREAM_SCALER_MODULE_1=0x11,\r
+       BLUE_JETSTREAM_SCALER_MODULE_2=0x12,\r
+       BLUE_JETSTREAM_SCALER_MODULE_3=0x13,\r
+\r
+       BLUE_VIDEOCHANNEL_INVALID=30\r
+}EBlueVideoChannel;\r
+\r
+typedef enum _EBlueVideoRouting\r
+{\r
+       BLUE_VIDEO_LINK_INVALID=0,\r
+       BLUE_SDI_A_LINK1=4,\r
+       BLUE_SDI_A_LINK2=5,\r
+       BLUE_SDI_B_LINK1=6,\r
+       BLUE_SDI_B_LINK2=7,\r
+       BLUE_ANALOG_LINK1=8,\r
+       BLUE_ANALOG_LINK2=9,\r
+       BLUE_SDI_A_SINGLE_LINK=BLUE_SDI_A_LINK1,\r
+       BLUE_SDI_B_SINGLE_LINK=BLUE_SDI_B_LINK1,\r
+       BLUE_ANALOG_SINGLE_LINK=BLUE_ANALOG_LINK1\r
+\r
+}EBlueVideoRouting;\r
+\r
+typedef enum\r
+{\r
+       BLUE_FIFO_NULL_ATTRIBUTE=0x0,\r
+       BLUE_FIFO_ECHOPORT_ENABLED=0x1,\r
+       BLUE_FIFO_STEPMODE = 0x2,\r
+       BLUE_FIFO_LOOPMODE = 0x4\r
+}BlueVideoFifo_Attributes;\r
+\r
+typedef enum _BlueAudioOutputDest\r
+{\r
+       Blue_AnalogAudio_Output=0x0,\r
+       Blue_AES_Output=0x80000000,\r
+       Blue_Emb_Output=0x40000000,\r
+}BlueAudioOutputDest;\r
+\r
+\r
+typedef enum _BlueAudioInputSource\r
+{\r
+       Blue_AES=0x10,\r
+       Blue_AnalogAudio=0x20,\r
+       Blue_SDIA_Embed=0x40,\r
+       Blue_SDIB_Embed=0x80,\r
+}BlueAudioInputSource;\r
+\r
+typedef enum _EBlueConnectorIdentifier\r
+{\r
+       BLUE_CONNECTOR_INVALID = -1,\r
+       \r
+       // BNC connectors in order from top to bottom of shield\r
+       BLUE_CONNECTOR_BNC_A = 0,    // BNC closest to top of shield\r
+       BLUE_CONNECTOR_BNC_B,\r
+       BLUE_CONNECTOR_BNC_C,\r
+       BLUE_CONNECTOR_BNC_D,\r
+       BLUE_CONNECTOR_BNC_E,\r
+       BLUE_CONNECTOR_BNC_F,\r
+       BLUE_CONNECTOR_GENLOCK,\r
+       \r
+       BLUE_CONNECTOR_ANALOG_VIDEO_1 = 100,\r
+       BLUE_CONNECTOR_ANALOG_VIDEO_2,\r
+       BLUE_CONNECTOR_ANALOG_VIDEO_3,\r
+       BLUE_CONNECTOR_ANALOG_VIDEO_4,\r
+       BLUE_CONNECTOR_ANALOG_VIDEO_5,\r
+       BLUE_CONNECTOR_ANALOG_VIDEO_6,\r
+\r
+       BLUE_CONNECTOR_DVID_1 = 200,\r
+       BLUE_CONNECTOR_SDI_OUTPUT_A= BLUE_CONNECTOR_DVID_1,\r
+       BLUE_CONNECTOR_DVID_2,\r
+       BLUE_CONNECTOR_SDI_OUTPUT_B= BLUE_CONNECTOR_DVID_2,\r
+       BLUE_CONNECTOR_DVID_3,\r
+       BLUE_CONNECTOR_SDI_INPUT_A= BLUE_CONNECTOR_DVID_3,\r
+       BLUE_CONNECTOR_DVID_4,\r
+       BLUE_CONNECTOR_SDI_INPUT_B= BLUE_CONNECTOR_DVID_4,\r
+       BLUE_CONNECTOR_DVID_5,\r
+\r
+       BLUE_CONNECTOR_AES = 300,\r
+       BLUE_CONNECTOR_ANALOG_AUDIO_1,\r
+       BLUE_CONNECTOR_ANALOG_AUDIO_2,\r
+\r
+       BLUE_CONNECTOR_RESOURCE_BLOCK=0x400,\r
+       BLUE_CONNECTOR_JETSTREAM_SCALER_0=(BLUE_CONNECTOR_RESOURCE_BLOCK|BLUE_JETSTREAM_SCALER_MODULE_0),\r
+       BLUE_CONNECTOR_JETSTREAM_SCALER_1=(BLUE_CONNECTOR_RESOURCE_BLOCK|BLUE_JETSTREAM_SCALER_MODULE_1),\r
+       BLUE_CONNECTOR_JETSTREAM_SCALER_2=(BLUE_CONNECTOR_RESOURCE_BLOCK|BLUE_JETSTREAM_SCALER_MODULE_2),\r
+       BLUE_CONNECTOR_JETSTREAM_SCALER_3=(BLUE_CONNECTOR_RESOURCE_BLOCK|BLUE_JETSTREAM_SCALER_MODULE_3),\r
+\r
+       BLUE_CONNECTOR_OUTPUT_MEM_MODULE_A=(BLUE_CONNECTOR_RESOURCE_BLOCK|BLUE_OUTPUT_MEM_MODULE_A),\r
+       BLUE_CONNECTOR_OUTPUT_MEM_MODULE_B=(BLUE_CONNECTOR_RESOURCE_BLOCK|BLUE_OUTPUT_MEM_MODULE_B),\r
+       BLUE_CONNECTOR_INPUT_MEM_MODULE_A=(BLUE_CONNECTOR_RESOURCE_BLOCK|BLUE_INPUT_MEM_MODULE_A),\r
+       BLUE_CONNECTOR_INPUT_MEM_MODULE_B=(BLUE_CONNECTOR_RESOURCE_BLOCK|BLUE_INPUT_MEM_MODULE_B),\r
+       \r
+}EBlueConnectorIdentifier;\r
+\r
+typedef enum _EBlueConnectorSignalDirection\r
+{\r
+       BLUE_CONNECTOR_SIGNAL_INVALID=-1,\r
+       BLUE_CONNECTOR_SIGNAL_INPUT=0,\r
+       BLUE_CONNECTOR_SIGNAL_OUTPUT=1,\r
+}EBlueConnectorSignalDirection;\r
+\r
+typedef enum _EBlueConnectorProperty\r
+{\r
+       BLUE_INVALID_CONNECTOR_PROPERTY = -1,\r
+\r
+       //signal property\r
+       BLUE_CONNECTOR_PROP_INPUT_SIGNAL=0,\r
+       BLUE_CONNECTOR_PROP_OUTPUT_SIGNAL=1,\r
+\r
+       // Video output\r
+       BLUE_CONNECTOR_PROP_SDI = 0,\r
+       BLUE_CONNECTOR_PROP_YUV_Y,\r
+       BLUE_CONNECTOR_PROP_YUV_U,\r
+       BLUE_CONNECTOR_PROP_YUV_V,\r
+       BLUE_CONNECTOR_PROP_RGB_R,\r
+       BLUE_CONNECTOR_PROP_RGB_G,\r
+       BLUE_CONNECTOR_PROP_RGB_B,\r
+       BLUE_CONNECTOR_PROP_CVBS,\r
+       BLUE_CONNECTOR_PROP_SVIDEO_Y,\r
+       BLUE_CONNECTOR_PROP_SVIDEO_C,\r
+       \r
+       // Audio output\r
+       BLUE_CONNECTOR_PROP_AUDIO_AES = 0x2000,\r
+       BLUE_CONNECTOR_PROP_AUDIO_EMBEDDED,\r
+       BLUE_CONNECTOR_PROP_AUDIO_ANALOG,\r
+\r
+       \r
+       BLUE_CONNECTOR_PROP_SINGLE_LINK=0x3000,\r
+       BLUE_CONNECTOR_PROP_DUALLINK_LINK_1,\r
+       BLUE_CONNECTOR_PROP_DUALLINK_LINK_2,\r
+       BLUE_CONNECTOR_PROP_DUALLINK_LINK,\r
+}EBlueConnectorProperty;\r
+\r
+/*\r
+typedef enum _BLUE_AUDIOINPUT_SOURCE\r
+{\r
+       BLUE_AES_AUDIO_INPUT=0x10000,\r
+       BLUE_ANALOG_AUDIO_INPUT=0x20000,\r
+       BLUE_SDIA_AUDIO_INPUT=0x30000,\r
+       BLUE_SDIB_AUDIO_INPUT=0x40000\r
+}BLUE_AUDIOINPUT_SOURCE;\r
+*/\r
+\r
+typedef enum _EBlueCardProperty\r
+{\r
+       VIDEO_DUAL_LINK_OUTPUT=0,\r
+       VIDEO_DUAL_LINK_INPUT=1,\r
+       VIDEO_DUAL_LINK_OUTPUT_SIGNAL_FORMAT_TYPE=2,    //EDualLinkSignalFormatType\r
+       VIDEO_DUAL_LINK_INPUT_SIGNAL_FORMAT_TYPE=3,     //EDualLinkSignalFormatType\r
+       VIDEO_OUTPUT_SIGNAL_COLOR_SPACE=4,                      //EConnectorSignalColorSpace\r
+       VIDEO_INPUT_SIGNAL_COLOR_SPACE=5,                               //EConnectorSignalColorSpace\r
+       VIDEO_MEMORY_FORMAT=6,                                          //EMemoryFormat\r
+       VIDEO_MODE=7,                                                                   //EVideoMode\r
+       VIDEO_UPDATE_TYPE=8,                                                    //EUpdateMethod\r
+       VIDEO_ENGINE=9,\r
+       VIDEO_IMAGE_ORIENTATION=10,\r
+       VIDEO_USER_DEFINED_COLOR_MATRIX=11,\r
+       VIDEO_PREDEFINED_COLOR_MATRIX=12,                               //EPreDefinedColorSpaceMatrix\r
+       VIDEO_RGB_DATA_RANGE=13,                                                //ERGBDataRange\r
+       VIDEO_KEY_OVER_BLACK=14,\r
+       VIDEO_KEY_OVER_INPUT_SIGNAL=15,\r
+       VIDEO_SET_DOWN_CONVERTER_VIDEO_MODE=16,         //EHD_XCONNECTOR_MODE\r
+       VIDEO_LETTER_BOX=17,\r
+       VIDEO_PILLOR_BOX_LEFT=18,\r
+       VIDEO_PILLOR_BOX_RIGHT=19,\r
+       VIDEO_PILLOR_BOX_TOP=20,\r
+       VIDEO_PILLOR_BOX_BOTTOM=21,\r
+       VIDEO_SAFE_PICTURE=22,\r
+       VIDEO_SAFE_TITLE=23,\r
+       VIDEO_INPUT_SIGNAL_VIDEO_MODE=24,\r
+       VIDEO_COLOR_MATRIX_MODE=25,\r
+       VIDEO_OUTPUT_MAIN_LUT=26,\r
+       VIDEO_OUTPUT_AUX_LUT=27,\r
+       VIDEO_LTC=28,\r
+       VIDEO_GPIO=29,  \r
+       VIDEO_PLAYBACK_FIFO_STATUS=30,\r
+       RS422_RX_BUFFER_LENGTH=31,\r
+       RS422_RX_BUFFER_FLUSH=32,\r
+       VIDEO_INPUT_UPDATE_TYPE=33,\r
+       VIDEO_INPUT_MEMORY_FORMAT=34,\r
+       VIDEO_GENLOCK_SIGNAL=35,\r
+       AUDIO_OUTPUT_PROP=36,\r
+       AUDIO_CHANNEL_ROUTING=AUDIO_OUTPUT_PROP,\r
+       AUDIO_INPUT_PROP=37,\r
+       VIDEO_ENABLE_LETTERBOX=38,\r
+       VIDEO_DUALLINK_OUTPUT_INVERT_KEY_COLOR=39,\r
+       VIDEO_DUALLINK_OUTPUT_DEFAULT_KEY_COLOR=40,\r
+       VIDEO_BLACKGENERATOR=41,\r
+       VIDEO_INPUTFRAMESTORE_IMAGE_ORIENTATION=42,\r
+       VIDEO_INPUT_SOURCE_SELECTION=43,\r
+       DEFAULT_VIDEO_OUTPUT_CHANNEL=44,\r
+       DEFAULT_VIDEO_INPUT_CHANNEL=45,\r
+       VIDEO_REFERENCE_SIGNAL_TIMING=46,\r
+       EMBEDEDDED_AUDIO_OUTPUT=47,\r
+       EMBEDDED_AUDIO_OUTPUT=EMBEDEDDED_AUDIO_OUTPUT,\r
+       VIDEO_PLAYBACK_FIFO_FREE_STATUS=48,\r
+       VIDEO_IMAGE_WIDTH=49,\r
+       VIDEO_IMAGE_HEIGHT=50,\r
+       VIDEO_SCALER_MODE=51,\r
+       AVAIL_AUDIO_INPUT_SAMPLE_COUNT=52,\r
+       VIDEO_PLAYBACK_FIFO_ENGINE_STATUS=53,\r
+       VIDEO_CAPTURE_FIFO_ENGINE_STATUS=54,\r
+       VIDEO_2K_1556_PANSCAN=55,\r
+       VIDEO_OUTPUT_ENGINE=56,\r
+       VIDEO_INPUT_ENGINE=57,\r
+       BYPASS_RELAY_A_ENABLE=58,\r
+       BYPASS_RELAY_B_ENABLE=59,\r
+       VIDEO_PREMULTIPLIER=60,\r
+       VIDEO_PLAYBACK_START_TRIGGER_POINT=61,\r
+       GENLOCK_TIMING=62,\r
+       VIDEO_IMAGE_PITCH=63,\r
+       VIDEO_IMAGE_OFFSET=64,\r
+       VIDEO_INPUT_IMAGE_WIDTH=65,\r
+       VIDEO_INPUT_IMAGE_HEIGHT=66,\r
+       VIDEO_INPUT_IMAGE_PITCH=67,\r
+       VIDEO_INPUT_IMAGE_OFFSET=68,\r
+       TIMECODE_RP188=69,\r
+       BOARD_TEMPERATURE=70,\r
+       MR2_ROUTING=71,\r
+       SAVEAS_POWERUP_SETTINGS=72,\r
+       VIDEO_CARDPROPERTY_INVALID=100\r
+}EBlueCardProperty;\r
+\r
+\r
+typedef enum _EAnalogConnectorSignalType\r
+{\r
+       ANALOG_OUTPUTSIGNAL_CVBS_Y_C=1,\r
+       ANALOG_OUTPUTSIGNAL_COMPONENT=2,\r
+       ANALOG_OUTPUTSIGNAL_RGB=4\r
+}EAnalogConnectorSignalType;\r
+\r
+\r
+typedef enum _EAnalogInputConnectorType \r
+{\r
+/* Composite input */\r
+       ANALOG_VIDEO_INPUT_CVBS_AIN1=0x00, //only available on Mini COAX \r
+       ANALOG_VIDEO_INPUT_CVBS_AIN2=0x01, //available on both Mini COAX and Mini DIN\r
+       ANALOG_VIDEO_INPUT_CVBS_AIN3=0x02, //available on both Mini COAX and Mini DIN\r
+       ANALOG_VIDEO_INPUT_CVBS_AIN4=0x03, //only available on Mini COAX \r
+       ANALOG_VIDEO_INPUT_CVBS_AIN5=0x04, //only available on Mini COAX \r
+       ANALOG_VIDEO_INPUT_CVBS_AIN6=0x05, //available on both Mini COAX and Mini DIN \r
+\r
+/*svideo input*/\r
+//Y_C is a synonym for svideo\r
+       ANALOG_VIDEO_INPUT_Y_C_AIN1_AIN4=0x06, //only available on Mini COAX\r
+       ANALOG_VIDEO_INPUT_Y_C_AIN2_AIN5=0x07, //only available on Mini COAX\r
+       ANALOG_VIDEO_INPUT_Y_C_AIN3_AIN6=0x08, //available on both Mini COAX and Mini DIN\r
+\r
+/*YUV input*/\r
+       ANALOG_VIDEO_INPUT_YUV_AIN1_AIN4_AIN5=0x09, //only available on Mini COAX\r
+       ANALOG_VIDEO_INPUT_YUV_AIN2_AIN3_AIN6=0x0a, //available on both Mini COAX and Mini DIN\r
+       ANALOG_VIDEO_INPUT_USE_SDI_A=0x6F,      \r
+       ANALOG_VIDEO_INPUT_USE_SDI=0x7F,\r
+       GENERIC_ANALOG_VIDEO_SOURCE=0x8F,\r
+       ANALOG_VIDEO_INPUT_USE_SDI_B=ANALOG_VIDEO_INPUT_USE_SDI\r
+}EAnalogInputConnectorType;\r
+\r
+\r
+typedef enum {\r
+       ANALOG_VIDEO_INPUT_CONNECTOR,//EAnalogInputConnectorType\r
+       ANALOG_VIDEO_INPUT_PED,\r
+       ANALOG_VIDEO_INPUT_BRIGHTNESS,\r
+       ANALOG_VIDEO_INPUT_HUE,\r
+       ANALOG_VIDEO_INPUT_LUMA_GAIN,\r
+       ANALOG_VIDEO_INPUT_CHROMA_GAIN,\r
+       ANALOG_VIDEO_INPUT_AUTO_GAIN,\r
+       ANALOG_VIDEO_INPUT_LOAD_DEFAULT_SETTING,        \r
+       ANALOG_VIDEO_OUTPUT_PED,\r
+       ANALOG_VIDEO_OUTPUT_BRIGHTNESS,\r
+       ANALOG_VIDEO_OUTPUT_HUE,\r
+       ANALOG_VIDEO_OUTPUT_LUMA_GAIN,\r
+       ANALOG_VIDEO_OUTPUT_CHROMA_GAIN,        \r
+       ANALOG_VIDEO_OUTPUT_SHARPNESS,\r
+       ANALOG_VIDEO_OUTPUT_AUTO_GAIN,\r
+       ANALOG_VIDEO_OUTPUT_LOAD_DEFAULT_SETTING,\r
+       ANALOG_VIDEO_OUTPUT_SIGNAL_TYPE,//_EAnalogConnectorSignalType\r
+       ANALOG_LOAD_BLUEFISH_DEFAULT_SETTING,\r
+       ANALOG_SET_AS_POWERUP_SETTINGS,\r
+       ANALOG_LOAD_POWERUP_SETTINGS,\r
+       ANALOG_CONNECTOR_STATUS\r
+} AnalogCard_Property;\r
+\r
+typedef struct {\r
+       BLUE_INT32 inputConnector;                      //ANALOG_VIDEO_INPUT_CONNECTOR, EAnalogInputConnectorType\r
+       BLUE_INT32 inputPed;                            //ANALOG_VIDEO_INPUT_PED,\r
+       BLUE_INT32 inputBrightness;             //ANALOG_VIDEO_INPUT_BRIGHTNESS,\r
+       BLUE_INT32 inputHue;                            //ANALOG_VIDEO_INPUT_HUE,\r
+       BLUE_INT32 inputLumaGain;                       //ANALOG_VIDEO_INPUT_LUMA_GAIN,\r
+       BLUE_INT32 inputChromaGain;             //ANALOG_VIDEO_INPUT_CHROMA_GAIN,\r
+       BLUE_INT32 inputAutoGain;                       //ANALOG_VIDEO_INPUT_AUTO_GAIN,\r
+       BLUE_INT32 outputPed;                           //ANALOG_VIDEO_OUTPUT_PED,\r
+       BLUE_INT32 outputBrightness;            //ANALOG_VIDEO_OUTPUT_BRIGHTNESS,\r
+       BLUE_INT32 outputHue;                           //ANALOG_VIDEO_OUTPUT_HUE,\r
+       BLUE_INT32 outputYGain;                 //ANALOG_VIDEO_OUTPUT_Y_GAIN,\r
+       BLUE_INT32 outputUGain;                 //ANALOG_VIDEO_OUTPUT_U_GAIN,\r
+       BLUE_INT32 outputVGain;                 //ANALOG_VIDEO_OUTPUT_V_GAIN,\r
+       BLUE_INT32 outputSharpness;             //ANALOG_VIDEO_OUTPUT_SHARPNESS,\r
+       BLUE_INT32 outputAutoGain;                      //ANALOG_VIDEO_OUTPUT_AUTO_GAIN,\r
+       BLUE_INT32 outputSignalTypes;           //EAnalogConnectorSignalType\r
+}AnalogCardState;\r
+\r
+//----------------------------------------------------------------------------------------------------\r
+// Used to determine how video interrupts are handled, used in IOCTL_REDDEVIL_VIDEO_ENGINE\r
+typedef enum _EEngineMode\r
+{\r
+       VIDEO_ENGINE_FRAMESTORE=0,      // framestore engine\r
+       VIDEO_ENGINE_PLAYBACK=1,        // Playback engine\r
+       VIDEO_ENGINE_CAPTURE=2,         // Capture engine\r
+       VIDEO_ENGINE_PAGEFLIP=3,        // page flipper a mod of CHU viewport \r
+       VIDEO_ENGINE_DUPLEX=4,          // Full Duplex video\r
+       VIDEO_ENGINE_INVALID\r
+} EEngineMode;\r
+\r
+\r
+typedef enum _EBlueEmbAudioOutput\r
+{\r
+       blue_emb_audio_enable=0x1,      // Switches off/on  the whole HANC output from connecotrs associated with the channel\r
+       blue_auto_aes_to_emb_audio_encoder=0x2, //control whether the auto aes to emb thread should be running or not.\r
+       blue_emb_audio_group1_enable=0x4,\r
+       blue_emb_audio_group2_enable=0x8,\r
+       blue_emb_audio_group3_enable=0x10,\r
+       blue_emb_audio_group4_enable=0x20,\r
+       blue_enable_hanc_timestamp_pkt = 0x40\r
+}EBlueEmbAudioOutput;\r
+\r
+\r
+// Buffer Target enumerations\r
+typedef enum _EBufferTarget\r
+{\r
+       BUFFER_TARGET_VIDEO=0,          // Generic R/W DMA\r
+       BUFFER_TARGET_AUDIO,            // Special processing required for audio\r
+       BUFFER_TARGET_VIDEO_8BIT,       // Special R/W DMA utilising 8 bit aperture\r
+       BUFFER_TARGET_VIDEO_HALF,       // Special R/W DMA every second line (currently unused)\r
+       BUFFER_TARGET_VIDEO_OUT,        // Updates video out register on DMA completion for write \r
+       BUFFER_TARGET_INVALID\r
+} EBufferTarget;\r
+\r
+#define        BUFFER_TYPE_VIDEO               (0)\r
+#define        BUFFER_TYPE_AUDIO               (1)\r
+#define        BUFFER_TYPE_VIDEO_8BIT  (2)     // use this when assigning a buffer to indicate DMA from aperture!\r
+#define        BUFFER_TYPE_VIDEO_OUT   (3)     // On DMA start set video output address to DMA target\r
+#define        BUFFER_TYPE_VIDEO_HALF  (4)     // DMA every second line...\r
+\r
+// Buffer identifiers\r
+#define        BUFFER_ID_AUDIO_IN              (0)\r
+#define        BUFFER_ID_AUDIO_OUT             (1)\r
+#define        BUFFER_ID_VIDEO0                (2)\r
+#define        BUFFER_ID_VIDEO1                (3)\r
+#define        BUFFER_ID_VIDEO2                (4)\r
+#define        BUFFER_ID_VIDEO3                (5)\r
+\r
+//#define      BUFFER_ID_USER_BASE             (6)\r
+\r
+\r
+\r
+#define VIDEO_BORDER_TOP               (0x10000000)\r
+#define VIDEO_BORDER_BOTTOM            (0x20000000)\r
+#define VIDEO_BORDER_LEFT              (0x40000000)\r
+#define VIDEO_BORDER_RIGHT             (0x80000000)\r
+\r
+typedef struct _AnalogCardPropStruct\r
+{\r
+       BLUE_UINT32 VideoChannel;\r
+       BLUE_INT32  prop;\r
+       BLUE_INT32  value;\r
+       BLUE_INT32  minValue;\r
+       BLUE_INT32  maxValue;\r
+       BLUE_INT32  bReadFlag;\r
+}AnalogCardPropStruct;\r
+\r
+typedef enum _EConnectorSignalFormatType\r
+{\r
+       Signal_Type_4444 =1,\r
+       Signal_Type_4224 =0,\r
+       Signal_Type_422=2\r
+}EConnectorSignalFormatType;\r
+\r
+typedef enum _EDMADirection\r
+{\r
+       DMA_WRITE=0,\r
+       DMA_READ=1,\r
+       DMA_INVALID=2\r
+}EDMADirection;                        \r
+\r
+\r
+typedef enum _MatrixColType\r
+{\r
+       COL_BLUE_PB=0,\r
+       COL_RED_PR=1,\r
+       COL_GREEN_Y=2\r
+}MatrixColType;\r
+\r
+\r
+struct VideoFeature_struct \r
+{\r
+       BLUE_UINT32  Type;                   // Bluefish card type\r
+       BLUE_UINT32  CardSubType;               \r
+       BLUE_UINT32  Bus;                    // Which PIC bus (bridge) it is on\r
+       BLUE_UINT32  Slot;                   // Which slot card is plugged into\r
+       BLUE_UINT32  Feature;                //  Look at  the _EBlueFishCardFeatures  definition to know what each bit mean\r
+};\r
+\r
+// Bits defining supported features that can be used with VideoFeature_struct\r
+#define VIDEO_CAPS_INPUT_SDI                                   (0x00000001)    // Capable of input of SDI Video\r
+#define VIDEO_CAPS_OUTPUT_SDI                                  (0x00000002)    // Capable of output of SDI Video\r
+#define VIDEO_CAPS_INPUT_COMP                                  (0x00000004)    // Capable of capturing Composite Video input\r
+#define VIDEO_CAPS_OUTPUT_COMP                                 (0x00000008)    // Capable of capturing Composite Video output\r
+\r
+#define VIDEO_CAPS_INPUT_YUV                                   (0x00000010)    // Capable of capturing Component Video input\r
+#define VIDEO_CAPS_OUTPUT_YUV                                  (0x00000020)    // Capable of capturing Component Video output\r
+#define VIDEO_CAPS_INPUT_SVIDEO                                        (0x00000040)    // Capable of capturing SVideo input\r
+#define VIDEO_CAPS_OUTPUT_SVIDEO                               (0x00000080)    // Capable of capturing SVideo output\r
+\r
+#define VIDEO_CAPS_GENLOCK                                             (0x00000100)    // Able to adjust Vert & Horiz timing\r
+#define VIDEO_CAPS_VERTICAL_FLIP                               (0x00000200)    // Able to flip rasterisation\r
+#define VIDEO_CAPS_KEY_OUTPUT                                  (0x00000400)    // Video keying output capable\r
+#define VIDEO_CAPS_4444_OUTPUT                                 (0x00000800)    // Capable of outputting 4444 (dual link)\r
+\r
+#define VIDEO_CAPS_DUALLINK_INPUT                              (0x00001000)    // Dual Link input  \r
+#define VIDEO_CAPS_INTERNAL_KEYER                              (0x00002000)    // Has got an internal Keyer\r
+#define VIDEO_CAPS_RGB_COLORSPACE_SDI_CONN             (0x00004000)    // Support RGB colorspace  in on an  SDI connector \r
+#define VIDEO_CAPS_HAS_PILLOR_BOX                              (0x00008000)    // Has got support for pillor box\r
+\r
+#define VIDEO_CAPS_OUTPUT_RGB                                  (0x00010000)    // Has Analog RGB output connector \r
+#define VIDEO_CAPS_SCALED_RGB                                  (0x00020000)    // Can scale RGB colour space\r
+#define AUDIO_CAPS_PLAYBACK                                    (0x00040000)    // Has got audio output\r
+#define AUDIO_CAPS_CAPTURE                                             (0x00080000)\r
+\r
+#define VIDEO_CAPS_DOWNCONVERTER                               (0x00100000)\r
+#define VIDEO_CAPS_DUALOUTPUT_422_IND_STREAM                   (0x00200000)    // Specifies whether the card supports Dual Indepenedent 422 output streams\r
+#define VIDEO_CAPS_DUALINPUT_422_IND_STREAM                    (0x00400000)    // Specifies whether the card supports Dual Indepenedent 422 input streams\r
+\r
+#define VIDEO_CAPS_VBI_OUTPUT                                  (0x00800000)\r
+#define VIDEO_CAPS_VBI_INPUT                                   (0x01000000)\r
+\r
+#define VIDEO_CAPS_HANC_OUTPUT                                 (0x02000000)\r
+#define VIDEO_CAPS_HANC_INPUT                                  (0x04000000)\r
+/*\r
+#define VIDEO_CAPS_DUALOUTPUT_422_IND_STREAM   (0x00100000)    // Specifies whether the card supports Dual Indepenedent 422 output streams\r
+#define VIDEO_CAPS_DUALINPUT_422_IND_STREAM            (0x00200000)    // Specifies whether the card supports Dual Indepenedent 422 input streams\r
+\r
+#define VIDEO_CAPS_VBI_OUTPUT                                  (0x00400000)\r
+#define VIDEO_CAPS_VBI_INPUT                                   (0x00800000)\r
+\r
+#define VIDEO_CAPS_HANC_OUTPUT                                 (0x01000000)\r
+#define VIDEO_CAPS_HANC_INPUT                                  (0x02000000)\r
+*/\r
+\r
+#define BLUE_CARD_BUFFER_TYPE_OFFSET           (12)\r
+#define BLUE_DMA_DATA_TYPE_OFFSET                      (16)\r
+#define BLUE_DMA_FLAGS_OFFSET                          (20)\r
+#define GetDMACardBufferId(value)                      (value & 0xFFF)\r
+#define GetCardBufferType(value)                       ((value & 0xF000) >> BLUE_CARD_BUFFER_TYPE_OFFSET)\r
+#define GetDMADataType(value)                          ((value & 0xF0000) >> BLUE_DMA_DATA_TYPE_OFFSET)\r
+#define GetDMAFlags(value)                                     ((value & 0xF00000) >> (BLUE_DMA_FLAGS_OFFSET))\r
+\r
+#define BlueImage_VBI_DMABuffer(BufferId,DataType)                             ( (((ULONG)DataType&0xF)<<(ULONG)BLUE_DMA_DATA_TYPE_OFFSET)| \\r
+                                                                                                                               ( BLUE_CARDBUFFER_IMAGE_VBI<<(ULONG)BLUE_CARD_BUFFER_TYPE_OFFSET) | \\r
+                                                                                                                               ( ((ULONG)BufferId&0xFFF)) |0)\r
+\r
+#define BlueImage_DMABuffer(BufferId,DataType)                                 ( (((ULONG)DataType&0xF)<<(ULONG)BLUE_DMA_DATA_TYPE_OFFSET)| \\r
+                                                                                                                               ( BLUE_CARDBUFFER_IMAGE<<(ULONG)BLUE_CARD_BUFFER_TYPE_OFFSET) | \\r
+                                                                                                                               ( ((ULONG)BufferId&0xFFF)) |0)\r
+\r
+#define BlueImage_VBI_HANC_DMABuffer(BufferId,DataType)                        ( (((ULONG)DataType&0xF)<<(ULONG)BLUE_DMA_DATA_TYPE_OFFSET)| \\r
+                                                                                                                               ( BLUE_CARDBUFFER_IMAGE_VBI_HANC<<(ULONG)BLUE_CARD_BUFFER_TYPE_OFFSET) | \\r
+                                                                                                                               ( ((ULONG)BufferId&0xFFF)) |0)\r
+\r
+#define BlueImage_HANC_DMABuffer(BufferId,DataType)                            ( (((ULONG)DataType&0xF)<<(ULONG)BLUE_DMA_DATA_TYPE_OFFSET)| \\r
+                                                                                                                               ( BLUE_CARDBUFFER_IMAGE_HANC<<(ULONG)BLUE_CARD_BUFFER_TYPE_OFFSET) | \\r
+                                                                                                                               ( ((ULONG)BufferId&0xFFF)) |0)\r
+\r
+\r
+#define BlueBuffer_Image_VBI(BufferId)                         (((BLUE_CARDBUFFER_IMAGE_VBI)<<BLUE_CARD_BUFFER_TYPE_OFFSET)|((BufferId&0xFFF))|0)\r
+#define BlueBuffer_Image(BufferId)                                     (((BLUE_CARDBUFFER_IMAGE)<<BLUE_CARD_BUFFER_TYPE_OFFSET)|((BufferId&0xFFF))|0)\r
+#define BlueBuffer_Image_VBI_HANC(BufferId)                    (((BLUE_CARDBUFFER_IMAGE_VBI_HANC)<<BLUE_CARD_BUFFER_TYPE_OFFSET)|((BufferId&0xFFF))|0)\r
+#define BlueBuffer_Image_HANC(BufferId)                                (((BLUE_CARDBUFFER_IMAGE_HANC)<<BLUE_CARD_BUFFER_TYPE_OFFSET)|((BufferId&0xFFF))|0)\r
+#define BlueBuffer_HANC(BufferId)                                      (((BLUE_CARDBUFFER_HANC)<<BLUE_CARD_BUFFER_TYPE_OFFSET)|((BufferId&0xFFF))|0)\r
+\r
+#define BYPASS_RELAY_A                                                         (0x00000001) // enable bypass relay channel a when loading driver , only used in linux \r
+#define BYPASS_RELAY_B                                                         (0x00000002) // enable bypass relay channel a when loading driver , only used in linux \r
+typedef enum _EDMACardBufferType\r
+{\r
+       BLUE_CARDBUFFER_IMAGE=0,\r
+       BLUE_CARDBUFFER_IMAGE_VBI_HANC=1,\r
+       BLUE_CARDBUFFER_IMAGE_VBI=2,\r
+       BLUE_CARDBUFFER_AUDIO_OUT=3,\r
+       BLUE_CARDBUFFER_AUDIO_IN=4,\r
+       BLUE_CARDBUFFER_HANC=5,\r
+       BLUE_CARDBUFFER_IMAGE_HANC=6,\r
+       BLUE_CARDBUFFER_INVALID=6\r
+}EDMACardBufferType;\r
+\r
+typedef enum _EDMADataType\r
+{\r
+       BLUE_DATA_FRAME=0,\r
+       BLUE_DATA_IMAGE=0,\r
+       BLUE_DATA_FIELD1=1,\r
+       BLUE_DATA_FIELD2=2,\r
+       BLUE_DATA_VBI=3,\r
+       BLUE_DATA_HANC=4,\r
+       BLUE_DATA_AUDIO_IN=5,\r
+       BLUE_DATA_AUDIO_OUT=6,\r
+       BLUE_DATA_FRAME_RDOM=7,\r
+       BLUE_DMADATA_INVALID=8\r
+}EDMADataType;\r
+\r
+typedef struct _AUXILLARY_VIDEO_INFO\r
+{\r
+       BLUE_UINT32  video_channel_id;\r
+       BLUE_UINT32  lUniqueId;\r
+       BLUE_UINT32  lInfoType;\r
+       BLUE_UINT32  lMemFmt;\r
+       BLUE_UINT32  lGpio;\r
+       BLUE_UINT64  lLTC;\r
+}Auxillary_Video_Info;\r
+\r
+\r
+typedef enum _EBlueVideoAuxInfoType\r
+{\r
+       BLUE_VIDEO_AUX_MEMFMT_CHANGE=1,\r
+       BLUE_VIDEO_AUX_UPDATE_LTC=2,\r
+       BLUE_VIDEO_AUX_UPDATE_GPIO=4,\r
+}EBlueVideoAuxInfoType;\r
+// Max of 4 bits \r
+\r
+#define GET_ANALOG_AUDIO_LEFT_ROUTINGCHANNEL(value)                            (value&0xFF)\r
+#define GET_ANALOG_AUDIO_RIGHT_ROUTINGCHANNEL(value)                   ((value&0xFF00)>>8)\r
+#define SET_ANALOG_AUDIO_ROUTINGCHANNEL(left,right)                            (((right & 0xFF)<<8)|(left & 0xFF))\r
+#define SET_AUDIO_OUTPUT_ROUTINGCHANNEL(output_type,src_channel_id,_output_channel_id) ((1<<31)|((output_type&3)<<29)|((src_channel_id & 0x7F)<<16)|((_output_channel_id &0x3f)<<23))\r
+#define GET_AUDIO_OUTPUT_SRC_CHANNEL_ROUTING(value)                            ((value>>16) & 0x7F)\r
+#define GET_AUDIO_OUTPUT_CHANNEL_ROUTING(value)                                        ((value>>23) & 0x3F)\r
+#define GET_AUDIO_OUTPUT_TYPE_ROUTING(value)                                   ((value & 0x60000000)>>29)\r
+\r
+#define AUDIO_INPUT_SOURCE_SELECT_FLAG                                                 (1<<16) \r
+#define AUDIO_INPUT_SOURCE_SELECT(SynchCount,AudioInputSource) (AUDIO_INPUT_SOURCE_SELECT_FLAG|(SynchCount)|(AudioInputSource<<17))\r
+\r
+struct blue_video_connection_routing_struct\r
+{\r
+       BLUE_UINT32 video_channel;\r
+       BLUE_UINT32 duallink_flag;\r
+       BLUE_UINT32 link1_connector;\r
+       BLUE_UINT32 link2_connector;\r
+};\r
+\r
+#pragma pack(push, video_sync_struct, 1)\r
+typedef struct _blue_video_sync_struct\r
+{\r
+       BLUE_UINT32     sync_wait_type;// field or frame\r
+       BLUE_UINT32     video_channel; // which video channel interrupt should the interrupt wait for \r
+       BLUE_UINT32     timeout_video_msc;      //if the current video msc is equal to this one insert it into the queue.\r
+       BLUE_UINT32     video_msc;              //current video msc\r
+       BLUE_UINT8  pad[32];\r
+}blue_video_sync_struct;\r
+#pragma pack(pop,video_sync_struct)\r
+\r
+\r
+typedef enum _EBlueLUTType\r
+{\r
+       BLUE_MAIN_LUT_B_Pb=0,\r
+       BLUE_MAIN_LUT_G_Y=1,\r
+       BLUE_MAIN_LUT_R_Pr=2,\r
+       BLUE_AUX_LUT_B_Pb=3,\r
+       BLUE_AUX_LUT_G_Y=4,\r
+       BLUE_AUX_LUT_R_Pr=5,\r
+}EBlueLUTType;\r
+\r
+#pragma pack(push, video_frame, 1)\r
+struct blue_videoframe_info\r
+{\r
+       BLUE_UINT64 ltcTimeCode;\r
+       unsigned long videochannel;\r
+       unsigned long BufferId;\r
+       unsigned long Count;\r
+       unsigned long DroppedFrameCount;\r
+};\r
+\r
+struct blue_videoframe_info_ex\r
+{\r
+       BLUE_UINT64 ltcTimeCode;\r
+       unsigned long videochannel;\r
+       long BufferId;\r
+       unsigned long Count;\r
+       unsigned long DroppedFrameCount;\r
+       unsigned long nFrameTimeStamp;\r
+       unsigned long nVideoSignalType;\r
+       unsigned char pad[32];\r
+};\r
+\r
+struct blue_1d_lookup_table_struct\r
+{\r
+       BLUE_UINT32 nVideoChannel;\r
+       BLUE_UINT32  nLUTId;\r
+       BLUE_UINT16 * pLUTData;\r
+       BLUE_UINT32  nLUTElementCount;  \r
+       BLUE_UINT8      pad[256];\r
+};\r
+#pragma pack(pop, video_frame)\r
+\r
+#pragma pack(push, blue_dma_request, 1)\r
+struct blue_dma_request_struct\r
+{\r
+       unsigned char * pBuffer;\r
+       BLUE_UINT32 video_channel;\r
+       BLUE_UINT32     BufferId;\r
+       unsigned int BufferDataType;\r
+       unsigned int FrameType;\r
+       unsigned int BufferSize;\r
+       unsigned int Offset;\r
+       unsigned long   BytesTransferred;\r
+       unsigned char pad[64];\r
+};\r
+typedef struct _SerialPort_struct\r
+{\r
+       unsigned char   Buffer[64];\r
+       unsigned int    nBufLength;\r
+       unsigned int    nSerialPortId;\r
+       unsigned int    bFlag; // SerialPort_struct_flags \r
+       unsigned short  sTimeOut; \r
+}SerialPort_struct;\r
+\r
+#pragma pack(pop, blue_dma_request)\r
+\r
+typedef enum _blue_output_hanc_ioctl_enum\r
+{\r
+       blue_get_output_hanc_buffer=0,\r
+       blue_put_output_hanc_buffer=1,\r
+       blue_get_valid_silent_hanc_data_status=3,\r
+       blue_set_valid_silent_hanc_data_status=4,\r
+       blue_start_output_fifo=5,\r
+       blue_stop_output_fifo=6,\r
+       blue_init_output_fifo=7,\r
+       blue_get_queues_info=8,\r
+       blue_get_output_fifo_info=blue_get_queues_info,\r
+       blue_get_output_fifo_status=9,\r
+\r
+}blue_output_hanc_ioctl_enum;\r
+\r
+typedef enum _blue_input_hanc_ioctl_enum\r
+{\r
+       blue_get_input_hanc_buffer=0,\r
+       blue_start_input_fifo=3,\r
+       blue_stop_input_fifo=4,\r
+       blue_init_input_fifo=5,\r
+       blue_playthru_input_fifo=6,\r
+       blue_release_input_hanc_buffer=7,\r
+       blue_map_input_hanc_buffer=8,\r
+       blue_unmap_input_hanc_buffer=9,\r
+       blue_get_info_input_hanc_fifo=10,\r
+       blue_get_input_rp188=11,\r
+       blue_get_input_fifo_status=12,\r
+}blue_input_hanc_ioctl_enum;\r
+\r
+\r
+#define HANC_PLAYBACK_INIT                             (0x00000001)\r
+#define HANC_PLAYBACK_START                            (0x00000002)\r
+#define HANC_PLAYBACK_STOP                             (0x00000004)\r
+\r
+#define HANC_CAPTURE_INIT                              (0x00000010)\r
+#define HANC_CAPTURE_START                             (0x00000020)\r
+#define HANC_CAPTURE_STOP                              (0x00000040)\r
+#define HANC_CAPTURE_PLAYTHRU                  (0x00000080)\r
+\r
+\r
+typedef enum _EOracFPGAConfigCMD\r
+{\r
+       ORAC_FPGA_CONFIG_CMD_ERASE_SECTOR=0,\r
+       ORAC_FPGA_CONFIG_CMD_UNLOCK_SECTOR=1,\r
+       ORAC_FPGA_CONFIG_CMD_WRITE_DATA=2,\r
+       ORAC_FPGA_CONFIG_CMD_STATUS=3,\r
+       ORAC_FPGA_CONFIG_CMD_READMODE=4,\r
+       ORAC_FPGA_CONFIG_RAW_WRITE=5,\r
+       ORAC_FPGA_CONFIG_RAW_READ=6,\r
+       ORAC_FPGA_CONFIG_CMD_READ_DATA=7\r
+}EOracFPGAConfigCMD;\r
+\r
+\r
+#define ANALOG_CHANNEL_0 MONO_CHANNEL_9\r
+#define ANALOG_CHANNEL_1 MONO_CHANNEL_10\r
+\r
+/*Assumes that the data is in stereo pairs not individual samples*/\r
+#define STEREO_PAIR_1  (MONO_CHANNEL_1|MONO_CHANNEL_2) /* Mono Channel 1 & Mono channel 2* together*/\r
+#define STEREO_PAIR_2  (MONO_CHANNEL_3|MONO_CHANNEL_4) /* Mono Channel 3 & Mono Channel 4* together*/\r
+#define STEREO_PAIR_3  (MONO_CHANNEL_5|MONO_CHANNEL_6) /* Mono Channel 5 & Mono Channel 6* together*/\r
+#define STEREO_PAIR_4  (MONO_CHANNEL_7|MONO_CHANNEL_8) /* Mono Channel 7 & Mono Channel 8* together*/\r
+\r
+#define ANALOG_AUDIO_PAIR (ANALOG_CHANNEL_0|ANALOG_CHANNEL_1)\r
+\r
+#define BLUE_LITTLE_ENDIAN     0\r
+#define BLUE_BIG_ENDIAN                1\r
+\r
+#define GREED_SILENT_HANC_BUFFER1      250\r
+#define GREED_SILENT_HANC_BUFFER2      251\r
+\r
+\r
+\r
+typedef enum _EEpochRoutingElements\r
+{\r
+       EPOCH_SRC_DEST_SCALER_0=0x1,\r
+       EPOCH_SRC_DEST_SCALER_1,\r
+       EPOCH_SRC_DEST_SCALER_2,\r
+       EPOCH_SRC_DEST_SCALER_3,\r
+\r
+       EPOCH_SRC_SDI_INPUT_A,\r
+       EPOCH_SRC_SDI_INPUT_B,\r
+       EPOCH_SRC_SDI_INPUT_C,\r
+       EPOCH_SRC_SDI_INPUT_D,\r
+\r
+       EPOCH_DEST_SDI_OUTPUT_A,\r
+       EPOCH_DEST_SDI_OUTPUT_B,\r
+       EPOCH_DEST_SDI_OUTPUT_C,\r
+       EPOCH_DEST_SDI_OUTPUT_D,\r
+\r
+       EPOCH_SRC_OUTPUT_MEM_INTERFACE_CHA,\r
+       EPOCH_SRC_OUTPUT_MEM_INTERFACE_CHB,\r
+\r
+       EPOCH_DEST_INPUT_MEM_INTERFACE_CHA,\r
+       EPOCH_DEST_INPUT_MEM_INTERFACE_CHB,\r
+\r
+}EEpochRoutingElements;\r
+\r
+\r
+\r
+#define VPEnableFieldCountTrigger              ((BLUE_UINT64)1<<63)\r
+#define VPTriggerGetFieldCount(value)  ((BLUE_UINT64)value & 0xFFFFFFFF)\r
+\r
+typedef enum _EBlueScalerFilterType\r
+{\r
+       BlueScalerHorizontalYFilter=1,\r
+       BlueScalerHorizontalCFilter=2,\r
+       BlueScalerVerticalYFilter=3,\r
+       BlueScalerVerticalCFilter=4,\r
+}EBlueScalerFilterType;\r
+\r
+\r
+\r
+#define SET_EPOCH_SCALER_MODE(scaler_id,video_mode) ((scaler_id <<16)|video_mode)\r
+#define GET_EPOCH_SCALER_MODE(value)                           (value&0xFFFF)\r
+#define GET_EPOCH_SCALER_ID(value)                                     ((value&0xFFFF0000)>>16)\r
+\r
+// use these macros for retreiving the temp and fan speed.\r
+// on epoch range of cards.\r
+#define EPOCH_CORE_TEMP(value)                                 (value & 0xFFFF)\r
+#define EPOCH_BOARD_TEMP(value)                                        ((value>>16) & 0xFF)\r
+#define EPOCH_FAN_SPEED(value)                                 ((value>>24) & 0xFF)\r
+\r
+// use these macro for doing the MR2 routing \r
+// on epoch range of cards.\r
+#define EPOCH_SET_ROUTING(routing_src,routing_dest,data_link_type) ((routing_src & 0xFF) | ((routing_dest & 0xFF)<<8) | ((data_link_type&0xFF)<<16))\r
+#define EPOCH_ROUTING_GET_SRC_DATA(value)              (value & 0xFF)\r
+#define EPOCH_ROUTING_GET_DEST_DATA(value)             ((value>>8) & 0xFF)\r
+#define EPOCH_ROUTING_GET_LINK_TYPE_DATA(value)        ((value>>16) & 0xFF)
\ No newline at end of file
diff --git a/BluefishSDK_V5_8_0_31/Inc/bluehanc.h b/BluefishSDK_V5_8_0_31/Inc/bluehanc.h
new file mode 100644 (file)
index 0000000..22e5bd4
--- /dev/null
@@ -0,0 +1,370 @@
+#pragma once \r
+#include "BlueDriver_p.h"\r
+\r
+#ifdef _WINDOWS\r
+#pragma pack(push,1)\r
+#endif\r
+\r
+#define BLUE_HANC_INVALID_DID  (0x0)\r
+\r
+#define BLUE_HANC_AUDIOGROUP1  (0x2FF)\r
+#define BLUE_HANC_AUDIOGROUP2  (0x1FD)\r
+#define BLUE_HANC_AUDIOGROUP3  (0x1FB)\r
+#define BLUE_HANC_AUDIOGROUP4  (0x2F9)\r
+#define BLUE_HANC_RP188                        (0x260)\r
+#define BLUE_HANC_AUDIOGROUP1_CONTROL  (0x1EF)\r
+#define BLUE_HANC_AUDIOGROUP2_CONTROL  (0x2EE)\r
+#define BLUE_HANC_AUDIOGROUP3_CONTROL  (0x2ED)\r
+#define BLUE_HANC_AUDIOGROUP4_CONTROL  (0x1EC)\r
+#define BLUE_HANC_AUDIOGROUP1_EXTENDED (0x1FE)\r
+#define BLUE_HANC_AUDIOGROUP2_EXTENDED (0x2FC)\r
+#define BLUE_HANC_AUDIOGROUP3_EXTENDED (0x2FA)\r
+#define BLUE_HANC_AUDIOGROUP4_EXTENDED (0x1F8)\r
+\r
+\r
+#define HANC_PACKET_HEADER_CONST       (0xBFFFFC00)\r
+\r
+#define BLUE_HANC_START_NEWLINE(line_number) ((0xC0000000)| (line_number << 16))\r
+\r
+#define BLUE_HANC_CONTROL_WORD                          (0xC0000000)\r
+#define BLUE_HANC_3DATA_PACKET_WORD                     (0x80000000)\r
+#define BLUE_HANC_2DATA_PACKET_WORD                     (0x40000000)\r
+#define BLUE_HANC_1DATA_PACKET_WORD                     (0x00000000)\r
+#define BLUE_HANC_ENDOF_FRAME()                                 ((0xC0000000)| (1 << 15))\r
+\r
+\r
+#define AESAUDIO_DATA_BLOCKSIZE                                (192)\r
+#define MAX_HANC_BUFFER_SIZE                           (65536) //256*256\r
+#define MAX_HANC_BUFFER_SIZE_BYTES                     (256*1024)\r
+/* \r
+HANC Packet header structure\r
+Contains 2 type of structure , \r
+which makes it easier to parse the data\r
+*/\r
+\r
+struct GenericV210_structure\r
+{\r
+#if defined(__LITTLE_ENDIAN__) || defined(_WINDOWS) || defined(BLUE_LINUX_CODE)\r
+       BLUE_UINT32 first_word:10,second_word:10,third_word:10,unused:2;\r
+#else\r
+       BLUE_UINT32 unused:2,third_word:10,second_word:10,first_word:10;\r
+#endif\r
+#ifndef _WINDOWS\r
+}__attribute__((packed));\r
+#else\r
+};\r
+#endif\r
+\r
+union GenericV210_union\r
+{\r
+       struct GenericV210_structure v210_struct;\r
+       BLUE_UINT32 v210_word;\r
+};\r
+\r
+/* HANC packet header*/\r
+struct HancPacketHeaderStruct\r
+{\r
+#if defined(__LITTLE_ENDIAN__) || defined(_WINDOWS) || defined(BLUE_LINUX_CODE)\r
+       union GenericV210_union ancillary_data_flag; // 0x0,0x3FF,0x3FF, This is a constant defined by smpte\r
+       union GenericV210_union packet_info;    //  first 10 bit word --> Data ID\r
+                                               //      Commonly used  Data ID packet values are \r
+                                               //              1) 0x2FF --> Group1 Embedded Audio packet\r
+                                               //              2) 0x1FD --> Group2 Embedded Audio Packet\r
+                                               //              3) 0x1FB --> Group3 Embedded Audio Packet\r
+                                               //              4) 0x2F9 --> Group4 Embedded Audio packet\r
+                                               //  second 10 bit word --> Data Block Number\r
+                                               //      This is used for type 1 packets.\r
+                                               //  third 10 bit word --> Data Count \r
+                                               //      This 10 bit word specifies the amount of user data \r
+                                               //      that this hanc will contain.\r
+#else\r
+       union GenericV210_union packet_info;\r
+       union GenericV210_union ancillary_data_flag;\r
+#endif\r
+#ifndef _WINDOWS\r
+}__attribute__((packed));\r
+#else\r
+};\r
+#endif\r
+\r
+\r
+/* Audio SubFrame Packet */\r
+struct BlueAudioSubFrameStruct\r
+{      \r
+#if defined(__LITTLE_ENDIAN__) || defined(_WINDOWS) || defined(BLUE_LINUX_CODE)\r
+       BLUE_UINT32     ZBit:1,                                 //bit 0         set to declare start of channel status word\r
+                       Channel:2,                                      //bit 1-2\r
+                       AudioData_0_5:6,                        //bit 3-8\r
+                       NotBit8:1,                                      //bit 9\r
+                       AudioData_6_14:9,                       //bit 10-18\r
+                       NotBit18:1,                                     //bit 19        use same value as NotBit8 (bit 9)\r
+                       AudioData_15_19:5,                      //bit 20-24\r
+                       AESSampleValidityBit:1,         //bit 25\r
+                       AESUserBit:1,                           //bit 26\r
+                       AESAudioChannelStatusBit:1,     //bit 27        one bit of the channel status word\r
+                       ParityBit:1,                            //bit 28        xor of all bits except (NotBit8 (bit 9) and NotBit18 (bit 19))\r
+                       NotBit31:1,                                     //bit 29        not of ParityBit (bit 28)\r
+                       akiraControlBits:2;                     //bit 30-31\r
+#else\r
+       BLUE_UINT32     akiraControlBits:2,\r
+                       NotBit31:1,\r
+                       ParityBit:1,\r
+                       AESAudioChannelStatusBit:1,\r
+                       AESUserBit:1,\r
+                       AESSampleValidityBit:1,\r
+                       AudioData_15_19:5,\r
+                       NotBit18:1,\r
+                       AudioData_6_14:9,\r
+                       NotBit8:1,\r
+                       AudioData_0_5:6,\r
+                       Channel:2,\r
+                       ZBit:1;\r
+#endif\r
+\r
+#ifndef _WINDOWS\r
+}__attribute__((packed));\r
+#else\r
+};\r
+#endif\r
+\r
+union BlueAudioSubFrameHeader\r
+{\r
+       struct BlueAudioSubFrameStruct audioSubFrame;\r
+       BLUE_UINT32  BlueAudioSubFrameWord;\r
+       struct GenericV210_structure audioSubFrame_v210;\r
+};\r
+\r
+#define  MAX_AUDIO_SUBFRAMES_IN_A_LINE (64) // 4 samples per audio group  and 4 channesl for each  audio group per sample\r
+\r
+\r
+/*\r
+Time code structure that the function expects is the same format as LTC time code\r
+bits 0 - 3 :units of frame \r
+bits 4 - 7: binary group1 \r
+bits 8 - 9: tens of frame \r
+bits 10 -11: flags \r
+bits 12 -15: binary group2 \r
+bits 16-19 : units of seconds \r
+bits 20-23 : binary group3 \r
+\r
+bits 24 - 26: tens of seconds\r
+bit 27 : flag \r
+bits 28 - 31: group binary4  \r
+bits 32 -35: units of minutes \r
+\r
+bits 36 - 39 :binary5 \r
+bits 40 - 42: tens of minutes \r
+bit 43 : flag \r
+bits 44 - 47: binary group6 \r
+\r
+bits 48 - 51: units of hours \r
+bits 52 - 55: binary group7 \r
+bits 56 - 57: tens of hours \r
+bits 58 - 59: flag\r
+bits 60 - 63: binary8\r
+\r
+*/\r
+struct LTC_TimeCode\r
+{\r
+#if defined(__LITTLE_ENDIAN__) || defined(_WINDOWS) || defined(BLUE_LINUX_CODE)\r
+       BLUE_UINT64     unit_frame:4,binary1:4,ten_frame:2,drop_frame_flag:1,color_frame_flag:1,\r
+                                binary2:4,unit_second:4,binary3:4,ten_second:3,unsued_1:1,binary4:4,\r
+                                unit_minute:4,binary5:4,ten_minute:3,unsued_2:1,binary6:4,unit_hours:4,\r
+                                binary7:4,ten_hours:2,unsued_3:2,binary8:4;\r
+#else\r
+       BLUE_UINT64             binary8:4,unsued_3:2,ten_hours:2,binary7:4,\r
+                               unit_hours:4,binary6:4,unused_2:1,ten_minute:3,binary5:4,unit_minute:4,\r
+                               binary4:4,unused_1:1,ten_second:3,binary3:4,unit_second:4,binary2:4,\r
+                               color_frame_flag:1,drop_frame_flag:1,ten_frame:2,binary1:4,unit_frame:4;\r
+#endif\r
+\r
+#ifndef _WINDOWS\r
+}__attribute__((packed));\r
+#else\r
+};\r
+#endif\r
+\r
+struct LTC_TimeCode_union\r
+{\r
+       union \r
+       {\r
+               struct LTC_TimeCode struct_ltc;\r
+               BLUE_UINT64 lt_64_value;\r
+       };\r
+};\r
+\r
+/*\r
+       This is used to unpack the timecode word properly and quickly\r
+       in RP188 each 4 bits of the timecode is put into a 10 bit word.\r
+       So this structure helps in decoding \r
+*/\r
+struct nibble_struct\r
+{\r
+       BLUE_UINT8      first_half:4,second_half:4;\r
+\r
+#ifndef _WINDOWS\r
+}__attribute__((packed));\r
+#else\r
+};\r
+#endif\r
+\r
+struct TimeCode\r
+{\r
+       union \r
+       {\r
+       struct LTC_TimeCode struct_ltc;\r
+       BLUE_UINT64 ltc;\r
+       struct nibble_struct ltc_char[8]; \r
+       };\r
+       \r
+#ifndef _WINDOWS\r
+}__attribute__((packed));\r
+#else\r
+};\r
+#endif\r
+\r
+struct HANCTimeCodeStruct \r
+{      \r
+#if defined(__LITTLE_ENDIAN__) || defined(_WINDOWS) || defined(BLUE_LINUX_CODE)\r
+       BLUE_UINT32     zero_0:3,\r
+                               DBB_0:1,\r
+                               ANC_0:4,\r
+                               partiy_0:1,\r
+                               NotBit8_0:1,\r
+                               zero_1:3,\r
+                               DBB_1:1,\r
+                               ANC_1:4,\r
+                               partiy_1:1,\r
+                               NotBit8_1:1,\r
+                               zero_2:3,\r
+                               DBB_2:1,\r
+                               ANC_2:4,\r
+                               partiy_2:1,\r
+                               NotBit8_2:1,\r
+                               akiraControlBits:2;\r
+#else\r
+       BLUE_UINT32 akiraControlBits:2,\r
+                               Notbit8_2:1,\r
+                               partiy_2:1,\r
+                               ANC_2:4,\r
+                               DBB_2:1,\r
+                               zero_2:3,\r
+                               NotBit81_1:1,\r
+                               partiy_1:1,\r
+                               ANC_1:4,\r
+                               DBB_1:1,\r
+                               zero_1:3,\r
+                               NotBit8_0:1,\r
+                               partiy_0:1,\r
+                               ANC_0:4,\r
+                               DBB_0:1,\r
+                               zero_0:3;\r
+#endif\r
+\r
+#ifndef _WINDOWS\r
+}__attribute__((packed));\r
+#else\r
+};\r
+#endif\r
+\r
+union HANCTimeCode\r
+{\r
+       struct HANCTimeCodeStruct hanc_struct;\r
+       BLUE_UINT32 hanc_word;\r
+};\r
+\r
+struct BAG2VancTimeCodeStruct \r
+{      \r
+#if defined(__LITTLE_ENDIAN__) || defined(_WINDOWS) || defined(BLUE_LINUX_CODE)\r
+       BLUE_UINT16     zero_0:3,\r
+                               DBB_0:1,\r
+                               ANC_0:4,\r
+                               partiy_0:1,\r
+                               NotBit8_0:1;\r
+#else\r
+       BLUE_UINT16     NotBit8_0:1,\r
+                               partiy_0:1,\r
+                               ANC_0:4,\r
+                               DBB_0:1,\r
+                               zero_0:3;\r
+#endif\r
+\r
+#ifndef _WINDOWS\r
+}__attribute__((packed));\r
+#else\r
+};\r
+#endif\r
+\r
+union BAG2VancTimeCode\r
+{\r
+       struct BAG2VancTimeCodeStruct vanc_struct;\r
+       BLUE_UINT16 vanc_word;\r
+};\r
+\r
+\r
+inline BLUE_UINT64 convert_countto_timecode(BLUE_UINT32 frame_count,BLUE_UINT32 framePerSec)\r
+{\r
+       unsigned int frames ,second,minutes ,hour   ;\r
+       struct TimeCode rp188_timcode;\r
+       hour = frame_count/(60*60*framePerSec);\r
+       minutes = frame_count%(60*60*framePerSec);\r
+       second = minutes%(60*framePerSec);\r
+       frames = second %framePerSec;\r
+       second = second/(framePerSec);\r
+       minutes=minutes/(60*framePerSec);\r
+       rp188_timcode.ltc = 0;\r
+       rp188_timcode.struct_ltc.unit_frame = (frames%10);\r
+       rp188_timcode.struct_ltc.ten_frame = (frames/10);\r
+       rp188_timcode.struct_ltc.unit_second = (second%10);\r
+       rp188_timcode.struct_ltc.ten_second = (second/10);\r
+       rp188_timcode.struct_ltc.unit_minute = (minutes%10);\r
+       rp188_timcode.struct_ltc.ten_minute = (minutes/10);\r
+       rp188_timcode.struct_ltc.unit_hours = (hour%10);\r
+       rp188_timcode.struct_ltc.ten_hours = (hour/10);\r
+       \r
+       return rp188_timcode.ltc;\r
+}\r
+\r
+\r
+inline BLUE_UINT64 convert_timecode_to_count(BLUE_UINT64 timecode,\r
+                                                                                        BLUE_UINT32 framePerSec,\r
+                                                                                        unsigned int & frames ,\r
+                                                                                        unsigned int & second,\r
+                                                                                        unsigned int & minutes ,\r
+                                                                                        unsigned int & hours)\r
+{\r
+       \r
+       struct TimeCode rp188_timecode;\r
+       rp188_timecode.ltc = timecode;\r
+       hours  = (BLUE_UINT32)((unsigned int)rp188_timecode.struct_ltc.ten_hours*10)+(unsigned int)rp188_timecode.struct_ltc.unit_hours;\r
+       minutes = (BLUE_UINT32)((unsigned int)rp188_timecode.struct_ltc.ten_minute*10)+(unsigned int)rp188_timecode.struct_ltc.unit_minute;\r
+       second =  (BLUE_UINT32)((unsigned int)rp188_timecode.struct_ltc.ten_second*10)+(unsigned int)rp188_timecode.struct_ltc.unit_second;\r
+       frames =         (BLUE_UINT32)((unsigned int)rp188_timecode.struct_ltc.ten_frame*10)+(unsigned int)rp188_timecode.struct_ltc.unit_frame;                \r
+       return rp188_timecode.ltc;\r
+}\r
+\r
+// Determine endianess at run-time\r
+inline BLUE_UINT32 Int32SwapBigLittle(const BLUE_UINT32 i)\r
+{\r
+    unsigned char c1, c2, c3, c4;\r
+       const int endian = 1;\r
+       #define is_bigendian() ( (*(char*) & endian) == 0 )\r
+\r
+    if (is_bigendian())\r
+       {\r
+        c1 = i & 255;\r
+        c2 = (i >> 8) & 255;\r
+        c3 = (i >> 16) & 255;\r
+        c4 = (i >> 24) & 255;\r
+               \r
+               return ((int)c1 << 24) + ((int)c2 << 16) + ((int)c3 << 8) + c4;\r
+    }\r
+       else\r
+       {\r
+        return i;\r
+       }\r
+}\r
+\r
+#ifdef _WINDOWS\r
+#pragma pack(pop)\r
+#endif
\ No newline at end of file
diff --git a/BluefishSDK_V5_8_0_31/Lib/BlueFishFilters.lib b/BluefishSDK_V5_8_0_31/Lib/BlueFishFilters.lib
new file mode 100644 (file)
index 0000000..19fd419
Binary files /dev/null and b/BluefishSDK_V5_8_0_31/Lib/BlueFishFilters.lib differ
diff --git a/BluefishSDK_V5_8_0_31/Lib/BlueHancUtils.lib b/BluefishSDK_V5_8_0_31/Lib/BlueHancUtils.lib
new file mode 100644 (file)
index 0000000..6eb11ff
Binary files /dev/null and b/BluefishSDK_V5_8_0_31/Lib/BlueHancUtils.lib differ
diff --git a/BluefishSDK_V5_8_0_31/Lib/BlueHancUtils64.lib b/BluefishSDK_V5_8_0_31/Lib/BlueHancUtils64.lib
new file mode 100644 (file)
index 0000000..c847d4f
Binary files /dev/null and b/BluefishSDK_V5_8_0_31/Lib/BlueHancUtils64.lib differ
diff --git a/BluefishSDK_V5_8_0_31/Lib/BlueHancUtils64_d.lib b/BluefishSDK_V5_8_0_31/Lib/BlueHancUtils64_d.lib
new file mode 100644 (file)
index 0000000..a195eea
Binary files /dev/null and b/BluefishSDK_V5_8_0_31/Lib/BlueHancUtils64_d.lib differ
diff --git a/BluefishSDK_V5_8_0_31/Lib/BlueHancUtils_d.lib b/BluefishSDK_V5_8_0_31/Lib/BlueHancUtils_d.lib
new file mode 100644 (file)
index 0000000..5d79d39
Binary files /dev/null and b/BluefishSDK_V5_8_0_31/Lib/BlueHancUtils_d.lib differ
diff --git a/BluefishSDK_V5_8_0_31/Lib/BlueTimer.lib b/BluefishSDK_V5_8_0_31/Lib/BlueTimer.lib
new file mode 100644 (file)
index 0000000..23f9d7f
Binary files /dev/null and b/BluefishSDK_V5_8_0_31/Lib/BlueTimer.lib differ
diff --git a/BluefishSDK_V5_8_0_31/Lib/BlueVelvet3.lib b/BluefishSDK_V5_8_0_31/Lib/BlueVelvet3.lib
new file mode 100644 (file)
index 0000000..46d8ee2
Binary files /dev/null and b/BluefishSDK_V5_8_0_31/Lib/BlueVelvet3.lib differ
diff --git a/BluefishSDK_V5_8_0_31/Lib/BlueVelvet3_d.lib b/BluefishSDK_V5_8_0_31/Lib/BlueVelvet3_d.lib
new file mode 100644 (file)
index 0000000..05f6b90
Binary files /dev/null and b/BluefishSDK_V5_8_0_31/Lib/BlueVelvet3_d.lib differ
diff --git a/BluefishSDK_V5_8_0_31/Lib/BlueVelvet64.lib b/BluefishSDK_V5_8_0_31/Lib/BlueVelvet64.lib
new file mode 100644 (file)
index 0000000..743a4fa
Binary files /dev/null and b/BluefishSDK_V5_8_0_31/Lib/BlueVelvet64.lib differ
diff --git a/BluefishSDK_V5_8_0_31/Lib/BlueVelvet64_d.lib b/BluefishSDK_V5_8_0_31/Lib/BlueVelvet64_d.lib
new file mode 100644 (file)
index 0000000..4d3687d
Binary files /dev/null and b/BluefishSDK_V5_8_0_31/Lib/BlueVelvet64_d.lib differ
diff --git a/BluefishSDK_V5_8_0_31/Lib/BlueVelvetCom.lib b/BluefishSDK_V5_8_0_31/Lib/BlueVelvetCom.lib
new file mode 100644 (file)
index 0000000..eff96a8
Binary files /dev/null and b/BluefishSDK_V5_8_0_31/Lib/BlueVelvetCom.lib differ
diff --git a/BluefishSDK_V5_8_0_31/Lib/BlueVelvetCom.tlb b/BluefishSDK_V5_8_0_31/Lib/BlueVelvetCom.tlb
new file mode 100644 (file)
index 0000000..2ea7dce
Binary files /dev/null and b/BluefishSDK_V5_8_0_31/Lib/BlueVelvetCom.tlb differ
diff --git a/BluefishSDK_V5_8_0_31/Lib/BlueVelvetConstant.tlb b/BluefishSDK_V5_8_0_31/Lib/BlueVelvetConstant.tlb
new file mode 100644 (file)
index 0000000..91b9b0a
Binary files /dev/null and b/BluefishSDK_V5_8_0_31/Lib/BlueVelvetConstant.tlb differ
diff --git a/BluefishSDK_V5_8_0_31/Lib/BluefishApiStatic.lib b/BluefishSDK_V5_8_0_31/Lib/BluefishApiStatic.lib
new file mode 100644 (file)
index 0000000..20f2ad0
Binary files /dev/null and b/BluefishSDK_V5_8_0_31/Lib/BluefishApiStatic.lib differ
diff --git a/BluefishSDK_V5_8_0_31/Lib/BluefishApi_d.lib b/BluefishSDK_V5_8_0_31/Lib/BluefishApi_d.lib
new file mode 100644 (file)
index 0000000..7da8d4b
Binary files /dev/null and b/BluefishSDK_V5_8_0_31/Lib/BluefishApi_d.lib differ
diff --git a/BluefishSDK_V5_8_0_31/Lib/BluefishFilters.tlb b/BluefishSDK_V5_8_0_31/Lib/BluefishFilters.tlb
new file mode 100644 (file)
index 0000000..f54d822
Binary files /dev/null and b/BluefishSDK_V5_8_0_31/Lib/BluefishFilters.tlb differ
diff --git a/GLee5_4/GLee.c b/GLee5_4/GLee.c
new file mode 100644 (file)
index 0000000..b89fae6
--- /dev/null
@@ -0,0 +1,18170 @@
+/***************************************************************************\r
+*\r
+* GLee.c\r
+* GLee (OpenGL Easy Extension library)        \r
+* Version : 5.4\r
+*\r
+* Copyright (c)2009  Ben Woodhouse  All rights reserved.\r
+*\r
+* Redistribution and use in source and binary forms, with or without\r
+* modification, are permitted provided that the following conditions are \r
+* met:\r
+* 1. Redistributions of source code must retain the above copyright\r
+* notice, this list of conditions and the following disclaimer as\r
+* the first lines of this file unmodified.\r
+* 2. Redistributions in binary form must reproduce the above copyright\r
+* notice, this list of conditions and the following disclaimer in the\r
+* documentation and/or other materials provided with the distribution.\r
+*\r
+* THIS SOFTWARE IS PROVIDED BY BEN WOODHOUSE ``AS IS'' AND ANY EXPRESS OR\r
+* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\r
+* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
+* IN NO EVENT SHALL BEN WOODHOUSE BE LIABLE FOR ANY DIRECT, INDIRECT,\r
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\r
+* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\r
+* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+\r
+* Web: http://elf-stone.com/glee.php\r
+*\r
+* [This file was automatically generated by GLeeGen 7.0\r
+*\r
+***************************************************************************/\r
+\r
+#ifdef _MSC_VER\r
+       #pragma optimize( "g", off )\r
+#endif\r
+\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <string.h>\r
+#include "GLee.h"\r
+\r
+#if defined(__APPLE__) || defined(__APPLE_CC__)\r
+       #include <Carbon/Carbon.h>\r
+#endif\r
+\r
+typedef GLuint(*GLEE_LINK_FUNCTION)(void);\r
+\r
+GLboolean __GLeeInited=GL_FALSE;\r
+\r
+#ifndef _WIN32\r
+       #define __stdcall  /* nothing */\r
+#endif \r
+\r
+void * __GLeeGetProcAddress(const char *extname)\r
+{\r
+#ifdef WIN32\r
+       return (void*)wglGetProcAddress(extname);\r
+#elif defined(__APPLE__) || defined(__APPLE_CC__)\r
+    CFBundleRef bundle;\r
+    CFURLRef bundleURL = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, CFSTR("/System/Library/Frameworks/OpenGL.framework"), kCFURLPOSIXPathStyle, true);\r
+\r
+    CFStringRef functionName = CFStringCreateWithCString(kCFAllocatorDefault, extname, kCFStringEncodingASCII);\r
+\r
+    void *function;\r
+\r
+    bundle = CFBundleCreate(kCFAllocatorDefault, bundleURL);\r
+    assert(bundle != NULL);\r
+\r
+    function = CFBundleGetFunctionPointerForName(bundle, functionName);\r
+\r
+    CFRelease(bundleURL);\r
+    CFRelease(functionName);\r
+    CFRelease(bundle);\r
+\r
+    return function;\r
+#else\r
+       return (void*)glXGetProcAddressARB((const GLubyte *)extname);\r
+#endif\r
+}\r
+\r
+\r
+\r
+\r
+/* Extension querying variables */\r
+\r
+GLboolean _GLEE_VERSION_1_2 = GL_FALSE;\r
+GLboolean _GLEE_ARB_imaging = GL_FALSE;\r
+GLboolean _GLEE_VERSION_1_3 = GL_FALSE;\r
+GLboolean _GLEE_VERSION_1_4 = GL_FALSE;\r
+GLboolean _GLEE_VERSION_1_5 = GL_FALSE;\r
+GLboolean _GLEE_VERSION_2_0 = GL_FALSE;\r
+GLboolean _GLEE_VERSION_2_1 = GL_FALSE;\r
+GLboolean _GLEE_VERSION_3_0 = GL_FALSE;\r
+GLboolean _GLEE_ARB_multitexture = GL_FALSE;\r
+GLboolean _GLEE_ARB_transpose_matrix = GL_FALSE;\r
+GLboolean _GLEE_ARB_multisample = GL_FALSE;\r
+GLboolean _GLEE_ARB_texture_env_add = GL_FALSE;\r
+GLboolean _GLEE_ARB_texture_cube_map = GL_FALSE;\r
+GLboolean _GLEE_ARB_texture_compression = GL_FALSE;\r
+GLboolean _GLEE_ARB_texture_border_clamp = GL_FALSE;\r
+GLboolean _GLEE_ARB_point_parameters = GL_FALSE;\r
+GLboolean _GLEE_ARB_vertex_blend = GL_FALSE;\r
+GLboolean _GLEE_ARB_matrix_palette = GL_FALSE;\r
+GLboolean _GLEE_ARB_texture_env_combine = GL_FALSE;\r
+GLboolean _GLEE_ARB_texture_env_crossbar = GL_FALSE;\r
+GLboolean _GLEE_ARB_texture_env_dot3 = GL_FALSE;\r
+GLboolean _GLEE_ARB_texture_mirrored_repeat = GL_FALSE;\r
+GLboolean _GLEE_ARB_depth_texture = GL_FALSE;\r
+GLboolean _GLEE_ARB_shadow = GL_FALSE;\r
+GLboolean _GLEE_ARB_shadow_ambient = GL_FALSE;\r
+GLboolean _GLEE_ARB_window_pos = GL_FALSE;\r
+GLboolean _GLEE_ARB_vertex_program = GL_FALSE;\r
+GLboolean _GLEE_ARB_fragment_program = GL_FALSE;\r
+GLboolean _GLEE_ARB_vertex_buffer_object = GL_FALSE;\r
+GLboolean _GLEE_ARB_occlusion_query = GL_FALSE;\r
+GLboolean _GLEE_ARB_shader_objects = GL_FALSE;\r
+GLboolean _GLEE_ARB_vertex_shader = GL_FALSE;\r
+GLboolean _GLEE_ARB_fragment_shader = GL_FALSE;\r
+GLboolean _GLEE_ARB_shading_language_100 = GL_FALSE;\r
+GLboolean _GLEE_ARB_texture_non_power_of_two = GL_FALSE;\r
+GLboolean _GLEE_ARB_point_sprite = GL_FALSE;\r
+GLboolean _GLEE_ARB_fragment_program_shadow = GL_FALSE;\r
+GLboolean _GLEE_ARB_draw_buffers = GL_FALSE;\r
+GLboolean _GLEE_ARB_texture_rectangle = GL_FALSE;\r
+GLboolean _GLEE_ARB_color_buffer_float = GL_FALSE;\r
+GLboolean _GLEE_ARB_half_float_pixel = GL_FALSE;\r
+GLboolean _GLEE_ARB_texture_float = GL_FALSE;\r
+GLboolean _GLEE_ARB_pixel_buffer_object = GL_FALSE;\r
+GLboolean _GLEE_ARB_depth_buffer_float = GL_FALSE;\r
+GLboolean _GLEE_ARB_draw_instanced = GL_FALSE;\r
+GLboolean _GLEE_ARB_framebuffer_object = GL_FALSE;\r
+GLboolean _GLEE_ARB_framebuffer_sRGB = GL_FALSE;\r
+GLboolean _GLEE_ARB_geometry_shader4 = GL_FALSE;\r
+GLboolean _GLEE_ARB_half_float_vertex = GL_FALSE;\r
+GLboolean _GLEE_ARB_instanced_arrays = GL_FALSE;\r
+GLboolean _GLEE_ARB_map_buffer_range = GL_FALSE;\r
+GLboolean _GLEE_ARB_texture_buffer_object = GL_FALSE;\r
+GLboolean _GLEE_ARB_texture_compression_rgtc = GL_FALSE;\r
+GLboolean _GLEE_ARB_texture_rg = GL_FALSE;\r
+GLboolean _GLEE_ARB_vertex_array_object = GL_FALSE;\r
+GLboolean _GLEE_EXT_abgr = GL_FALSE;\r
+GLboolean _GLEE_EXT_blend_color = GL_FALSE;\r
+GLboolean _GLEE_EXT_polygon_offset = GL_FALSE;\r
+GLboolean _GLEE_EXT_texture = GL_FALSE;\r
+GLboolean _GLEE_EXT_texture3D = GL_FALSE;\r
+GLboolean _GLEE_SGIS_texture_filter4 = GL_FALSE;\r
+GLboolean _GLEE_EXT_subtexture = GL_FALSE;\r
+GLboolean _GLEE_EXT_copy_texture = GL_FALSE;\r
+GLboolean _GLEE_EXT_histogram = GL_FALSE;\r
+GLboolean _GLEE_EXT_convolution = GL_FALSE;\r
+GLboolean _GLEE_SGI_color_matrix = GL_FALSE;\r
+GLboolean _GLEE_SGI_color_table = GL_FALSE;\r
+GLboolean _GLEE_SGIS_pixel_texture = GL_FALSE;\r
+GLboolean _GLEE_SGIX_pixel_texture = GL_FALSE;\r
+GLboolean _GLEE_SGIS_texture4D = GL_FALSE;\r
+GLboolean _GLEE_SGI_texture_color_table = GL_FALSE;\r
+GLboolean _GLEE_EXT_cmyka = GL_FALSE;\r
+GLboolean _GLEE_EXT_texture_object = GL_FALSE;\r
+GLboolean _GLEE_SGIS_detail_texture = GL_FALSE;\r
+GLboolean _GLEE_SGIS_sharpen_texture = GL_FALSE;\r
+GLboolean _GLEE_EXT_packed_pixels = GL_FALSE;\r
+GLboolean _GLEE_SGIS_texture_lod = GL_FALSE;\r
+GLboolean _GLEE_SGIS_multisample = GL_FALSE;\r
+GLboolean _GLEE_EXT_rescale_normal = GL_FALSE;\r
+GLboolean _GLEE_EXT_vertex_array = GL_FALSE;\r
+GLboolean _GLEE_EXT_misc_attribute = GL_FALSE;\r
+GLboolean _GLEE_SGIS_generate_mipmap = GL_FALSE;\r
+GLboolean _GLEE_SGIX_clipmap = GL_FALSE;\r
+GLboolean _GLEE_SGIX_shadow = GL_FALSE;\r
+GLboolean _GLEE_SGIS_texture_edge_clamp = GL_FALSE;\r
+GLboolean _GLEE_SGIS_texture_border_clamp = GL_FALSE;\r
+GLboolean _GLEE_EXT_blend_minmax = GL_FALSE;\r
+GLboolean _GLEE_EXT_blend_subtract = GL_FALSE;\r
+GLboolean _GLEE_EXT_blend_logic_op = GL_FALSE;\r
+GLboolean _GLEE_SGIX_interlace = GL_FALSE;\r
+GLboolean _GLEE_SGIX_pixel_tiles = GL_FALSE;\r
+GLboolean _GLEE_SGIS_texture_select = GL_FALSE;\r
+GLboolean _GLEE_SGIX_sprite = GL_FALSE;\r
+GLboolean _GLEE_SGIX_texture_multi_buffer = GL_FALSE;\r
+GLboolean _GLEE_EXT_point_parameters = GL_FALSE;\r
+GLboolean _GLEE_SGIS_point_parameters = GL_FALSE;\r
+GLboolean _GLEE_SGIX_instruments = GL_FALSE;\r
+GLboolean _GLEE_SGIX_texture_scale_bias = GL_FALSE;\r
+GLboolean _GLEE_SGIX_framezoom = GL_FALSE;\r
+GLboolean _GLEE_SGIX_tag_sample_buffer = GL_FALSE;\r
+GLboolean _GLEE_FfdMaskSGIX = GL_FALSE;\r
+GLboolean _GLEE_SGIX_polynomial_ffd = GL_FALSE;\r
+GLboolean _GLEE_SGIX_reference_plane = GL_FALSE;\r
+GLboolean _GLEE_SGIX_flush_raster = GL_FALSE;\r
+GLboolean _GLEE_SGIX_depth_texture = GL_FALSE;\r
+GLboolean _GLEE_SGIS_fog_function = GL_FALSE;\r
+GLboolean _GLEE_SGIX_fog_offset = GL_FALSE;\r
+GLboolean _GLEE_HP_image_transform = GL_FALSE;\r
+GLboolean _GLEE_HP_convolution_border_modes = GL_FALSE;\r
+GLboolean _GLEE_INGR_palette_buffer = GL_FALSE;\r
+GLboolean _GLEE_SGIX_texture_add_env = GL_FALSE;\r
+GLboolean _GLEE_EXT_color_subtable = GL_FALSE;\r
+GLboolean _GLEE_PGI_vertex_hints = GL_FALSE;\r
+GLboolean _GLEE_PGI_misc_hints = GL_FALSE;\r
+GLboolean _GLEE_EXT_paletted_texture = GL_FALSE;\r
+GLboolean _GLEE_EXT_clip_volume_hint = GL_FALSE;\r
+GLboolean _GLEE_SGIX_list_priority = GL_FALSE;\r
+GLboolean _GLEE_SGIX_ir_instrument1 = GL_FALSE;\r
+GLboolean _GLEE_SGIX_calligraphic_fragment = GL_FALSE;\r
+GLboolean _GLEE_SGIX_texture_lod_bias = GL_FALSE;\r
+GLboolean _GLEE_SGIX_shadow_ambient = GL_FALSE;\r
+GLboolean _GLEE_EXT_index_texture = GL_FALSE;\r
+GLboolean _GLEE_EXT_index_material = GL_FALSE;\r
+GLboolean _GLEE_EXT_index_func = GL_FALSE;\r
+GLboolean _GLEE_EXT_index_array_formats = GL_FALSE;\r
+GLboolean _GLEE_EXT_compiled_vertex_array = GL_FALSE;\r
+GLboolean _GLEE_EXT_cull_vertex = GL_FALSE;\r
+GLboolean _GLEE_SGIX_ycrcb = GL_FALSE;\r
+GLboolean _GLEE_SGIX_fragment_lighting = GL_FALSE;\r
+GLboolean _GLEE_IBM_rasterpos_clip = GL_FALSE;\r
+GLboolean _GLEE_HP_texture_lighting = GL_FALSE;\r
+GLboolean _GLEE_EXT_draw_range_elements = GL_FALSE;\r
+GLboolean _GLEE_WIN_phong_shading = GL_FALSE;\r
+GLboolean _GLEE_WIN_specular_fog = GL_FALSE;\r
+GLboolean _GLEE_EXT_light_texture = GL_FALSE;\r
+GLboolean _GLEE_SGIX_blend_alpha_minmax = GL_FALSE;\r
+GLboolean _GLEE_SGIX_impact_pixel_texture = GL_FALSE;\r
+GLboolean _GLEE_EXT_bgra = GL_FALSE;\r
+GLboolean _GLEE_SGIX_async = GL_FALSE;\r
+GLboolean _GLEE_SGIX_async_pixel = GL_FALSE;\r
+GLboolean _GLEE_SGIX_async_histogram = GL_FALSE;\r
+GLboolean _GLEE_INTEL_texture_scissor = GL_FALSE;\r
+GLboolean _GLEE_INTEL_parallel_arrays = GL_FALSE;\r
+GLboolean _GLEE_HP_occlusion_test = GL_FALSE;\r
+GLboolean _GLEE_EXT_pixel_transform = GL_FALSE;\r
+GLboolean _GLEE_EXT_pixel_transform_color_table = GL_FALSE;\r
+GLboolean _GLEE_EXT_shared_texture_palette = GL_FALSE;\r
+GLboolean _GLEE_EXT_separate_specular_color = GL_FALSE;\r
+GLboolean _GLEE_EXT_secondary_color = GL_FALSE;\r
+GLboolean _GLEE_EXT_texture_perturb_normal = GL_FALSE;\r
+GLboolean _GLEE_EXT_multi_draw_arrays = GL_FALSE;\r
+GLboolean _GLEE_EXT_fog_coord = GL_FALSE;\r
+GLboolean _GLEE_REND_screen_coordinates = GL_FALSE;\r
+GLboolean _GLEE_EXT_coordinate_frame = GL_FALSE;\r
+GLboolean _GLEE_EXT_texture_env_combine = GL_FALSE;\r
+GLboolean _GLEE_APPLE_specular_vector = GL_FALSE;\r
+GLboolean _GLEE_APPLE_transform_hint = GL_FALSE;\r
+GLboolean _GLEE_SGIX_fog_scale = GL_FALSE;\r
+GLboolean _GLEE_SUNX_constant_data = GL_FALSE;\r
+GLboolean _GLEE_SUN_global_alpha = GL_FALSE;\r
+GLboolean _GLEE_SUN_triangle_list = GL_FALSE;\r
+GLboolean _GLEE_SUN_vertex = GL_FALSE;\r
+GLboolean _GLEE_EXT_blend_func_separate = GL_FALSE;\r
+GLboolean _GLEE_INGR_color_clamp = GL_FALSE;\r
+GLboolean _GLEE_INGR_interlace_read = GL_FALSE;\r
+GLboolean _GLEE_EXT_stencil_wrap = GL_FALSE;\r
+GLboolean _GLEE_EXT_422_pixels = GL_FALSE;\r
+GLboolean _GLEE_NV_texgen_reflection = GL_FALSE;\r
+GLboolean _GLEE_EXT_texture_cube_map = GL_FALSE;\r
+GLboolean _GLEE_SUN_convolution_border_modes = GL_FALSE;\r
+GLboolean _GLEE_EXT_texture_env_add = GL_FALSE;\r
+GLboolean _GLEE_EXT_texture_lod_bias = GL_FALSE;\r
+GLboolean _GLEE_EXT_texture_filter_anisotropic = GL_FALSE;\r
+GLboolean _GLEE_EXT_vertex_weighting = GL_FALSE;\r
+GLboolean _GLEE_NV_light_max_exponent = GL_FALSE;\r
+GLboolean _GLEE_NV_vertex_array_range = GL_FALSE;\r
+GLboolean _GLEE_NV_register_combiners = GL_FALSE;\r
+GLboolean _GLEE_NV_fog_distance = GL_FALSE;\r
+GLboolean _GLEE_NV_texgen_emboss = GL_FALSE;\r
+GLboolean _GLEE_NV_blend_square = GL_FALSE;\r
+GLboolean _GLEE_NV_texture_env_combine4 = GL_FALSE;\r
+GLboolean _GLEE_MESA_resize_buffers = GL_FALSE;\r
+GLboolean _GLEE_MESA_window_pos = GL_FALSE;\r
+GLboolean _GLEE_EXT_texture_compression_s3tc = GL_FALSE;\r
+GLboolean _GLEE_IBM_cull_vertex = GL_FALSE;\r
+GLboolean _GLEE_IBM_multimode_draw_arrays = GL_FALSE;\r
+GLboolean _GLEE_IBM_vertex_array_lists = GL_FALSE;\r
+GLboolean _GLEE_SGIX_subsample = GL_FALSE;\r
+GLboolean _GLEE_SGIX_ycrcb_subsample = GL_FALSE;\r
+GLboolean _GLEE_SGIX_ycrcba = GL_FALSE;\r
+GLboolean _GLEE_SGI_depth_pass_instrument = GL_FALSE;\r
+GLboolean _GLEE_3DFX_texture_compression_FXT1 = GL_FALSE;\r
+GLboolean _GLEE_3DFX_multisample = GL_FALSE;\r
+GLboolean _GLEE_3DFX_tbuffer = GL_FALSE;\r
+GLboolean _GLEE_EXT_multisample = GL_FALSE;\r
+GLboolean _GLEE_SGIX_vertex_preclip = GL_FALSE;\r
+GLboolean _GLEE_SGIX_convolution_accuracy = GL_FALSE;\r
+GLboolean _GLEE_SGIX_resample = GL_FALSE;\r
+GLboolean _GLEE_SGIS_point_line_texgen = GL_FALSE;\r
+GLboolean _GLEE_SGIS_texture_color_mask = GL_FALSE;\r
+GLboolean _GLEE_EXT_texture_env_dot3 = GL_FALSE;\r
+GLboolean _GLEE_ATI_texture_mirror_once = GL_FALSE;\r
+GLboolean _GLEE_NV_fence = GL_FALSE;\r
+GLboolean _GLEE_IBM_texture_mirrored_repeat = GL_FALSE;\r
+GLboolean _GLEE_NV_evaluators = GL_FALSE;\r
+GLboolean _GLEE_NV_packed_depth_stencil = GL_FALSE;\r
+GLboolean _GLEE_NV_register_combiners2 = GL_FALSE;\r
+GLboolean _GLEE_NV_texture_compression_vtc = GL_FALSE;\r
+GLboolean _GLEE_NV_texture_rectangle = GL_FALSE;\r
+GLboolean _GLEE_NV_texture_shader = GL_FALSE;\r
+GLboolean _GLEE_NV_texture_shader2 = GL_FALSE;\r
+GLboolean _GLEE_NV_vertex_array_range2 = GL_FALSE;\r
+GLboolean _GLEE_NV_vertex_program = GL_FALSE;\r
+GLboolean _GLEE_SGIX_texture_coordinate_clamp = GL_FALSE;\r
+GLboolean _GLEE_SGIX_scalebias_hint = GL_FALSE;\r
+GLboolean _GLEE_OML_interlace = GL_FALSE;\r
+GLboolean _GLEE_OML_subsample = GL_FALSE;\r
+GLboolean _GLEE_OML_resample = GL_FALSE;\r
+GLboolean _GLEE_NV_copy_depth_to_color = GL_FALSE;\r
+GLboolean _GLEE_ATI_envmap_bumpmap = GL_FALSE;\r
+GLboolean _GLEE_ATI_fragment_shader = GL_FALSE;\r
+GLboolean _GLEE_ATI_pn_triangles = GL_FALSE;\r
+GLboolean _GLEE_ATI_vertex_array_object = GL_FALSE;\r
+GLboolean _GLEE_EXT_vertex_shader = GL_FALSE;\r
+GLboolean _GLEE_ATI_vertex_streams = GL_FALSE;\r
+GLboolean _GLEE_ATI_element_array = GL_FALSE;\r
+GLboolean _GLEE_SUN_mesh_array = GL_FALSE;\r
+GLboolean _GLEE_SUN_slice_accum = GL_FALSE;\r
+GLboolean _GLEE_NV_multisample_filter_hint = GL_FALSE;\r
+GLboolean _GLEE_NV_depth_clamp = GL_FALSE;\r
+GLboolean _GLEE_NV_occlusion_query = GL_FALSE;\r
+GLboolean _GLEE_NV_point_sprite = GL_FALSE;\r
+GLboolean _GLEE_NV_texture_shader3 = GL_FALSE;\r
+GLboolean _GLEE_NV_vertex_program1_1 = GL_FALSE;\r
+GLboolean _GLEE_EXT_shadow_funcs = GL_FALSE;\r
+GLboolean _GLEE_EXT_stencil_two_side = GL_FALSE;\r
+GLboolean _GLEE_ATI_text_fragment_shader = GL_FALSE;\r
+GLboolean _GLEE_APPLE_client_storage = GL_FALSE;\r
+GLboolean _GLEE_APPLE_element_array = GL_FALSE;\r
+GLboolean _GLEE_APPLE_fence = GL_FALSE;\r
+GLboolean _GLEE_APPLE_vertex_array_object = GL_FALSE;\r
+GLboolean _GLEE_APPLE_vertex_array_range = GL_FALSE;\r
+GLboolean _GLEE_APPLE_ycbcr_422 = GL_FALSE;\r
+GLboolean _GLEE_S3_s3tc = GL_FALSE;\r
+GLboolean _GLEE_ATI_draw_buffers = GL_FALSE;\r
+GLboolean _GLEE_ATI_pixel_format_float = GL_FALSE;\r
+GLboolean _GLEE_ATI_texture_env_combine3 = GL_FALSE;\r
+GLboolean _GLEE_ATI_texture_float = GL_FALSE;\r
+GLboolean _GLEE_NV_float_buffer = GL_FALSE;\r
+GLboolean _GLEE_NV_fragment_program = GL_FALSE;\r
+GLboolean _GLEE_NV_half_float = GL_FALSE;\r
+GLboolean _GLEE_NV_pixel_data_range = GL_FALSE;\r
+GLboolean _GLEE_NV_primitive_restart = GL_FALSE;\r
+GLboolean _GLEE_NV_texture_expand_normal = GL_FALSE;\r
+GLboolean _GLEE_NV_vertex_program2 = GL_FALSE;\r
+GLboolean _GLEE_ATI_map_object_buffer = GL_FALSE;\r
+GLboolean _GLEE_ATI_separate_stencil = GL_FALSE;\r
+GLboolean _GLEE_ATI_vertex_attrib_array_object = GL_FALSE;\r
+GLboolean _GLEE_OES_read_format = GL_FALSE;\r
+GLboolean _GLEE_EXT_depth_bounds_test = GL_FALSE;\r
+GLboolean _GLEE_EXT_texture_mirror_clamp = GL_FALSE;\r
+GLboolean _GLEE_EXT_blend_equation_separate = GL_FALSE;\r
+GLboolean _GLEE_MESA_pack_invert = GL_FALSE;\r
+GLboolean _GLEE_MESA_ycbcr_texture = GL_FALSE;\r
+GLboolean _GLEE_EXT_pixel_buffer_object = GL_FALSE;\r
+GLboolean _GLEE_NV_fragment_program_option = GL_FALSE;\r
+GLboolean _GLEE_NV_fragment_program2 = GL_FALSE;\r
+GLboolean _GLEE_NV_vertex_program2_option = GL_FALSE;\r
+GLboolean _GLEE_NV_vertex_program3 = GL_FALSE;\r
+GLboolean _GLEE_EXT_framebuffer_object = GL_FALSE;\r
+GLboolean _GLEE_GREMEDY_string_marker = GL_FALSE;\r
+GLboolean _GLEE_EXT_packed_depth_stencil = GL_FALSE;\r
+GLboolean _GLEE_EXT_stencil_clear_tag = GL_FALSE;\r
+GLboolean _GLEE_EXT_texture_sRGB = GL_FALSE;\r
+GLboolean _GLEE_EXT_framebuffer_blit = GL_FALSE;\r
+GLboolean _GLEE_EXT_framebuffer_multisample = GL_FALSE;\r
+GLboolean _GLEE_MESAX_texture_stack = GL_FALSE;\r
+GLboolean _GLEE_EXT_timer_query = GL_FALSE;\r
+GLboolean _GLEE_EXT_gpu_program_parameters = GL_FALSE;\r
+GLboolean _GLEE_APPLE_flush_buffer_range = GL_FALSE;\r
+GLboolean _GLEE_EXT_gpu_shader4 = GL_FALSE;\r
+GLboolean _GLEE_EXT_draw_instanced = GL_FALSE;\r
+GLboolean _GLEE_EXT_packed_float = GL_FALSE;\r
+GLboolean _GLEE_EXT_texture_array = GL_FALSE;\r
+GLboolean _GLEE_EXT_texture_buffer_object = GL_FALSE;\r
+GLboolean _GLEE_EXT_texture_compression_latc = GL_FALSE;\r
+GLboolean _GLEE_EXT_texture_compression_rgtc = GL_FALSE;\r
+GLboolean _GLEE_EXT_texture_shared_exponent = GL_FALSE;\r
+GLboolean _GLEE_NV_depth_buffer_float = GL_FALSE;\r
+GLboolean _GLEE_NV_framebuffer_multisample_coverage = GL_FALSE;\r
+GLboolean _GLEE_EXT_framebuffer_sRGB = GL_FALSE;\r
+GLboolean _GLEE_NV_geometry_shader4 = GL_FALSE;\r
+GLboolean _GLEE_NV_parameter_buffer_object = GL_FALSE;\r
+GLboolean _GLEE_EXT_draw_buffers2 = GL_FALSE;\r
+GLboolean _GLEE_NV_transform_feedback = GL_FALSE;\r
+GLboolean _GLEE_EXT_bindable_uniform = GL_FALSE;\r
+GLboolean _GLEE_EXT_texture_integer = GL_FALSE;\r
+GLboolean _GLEE_GREMEDY_frame_terminator = GL_FALSE;\r
+GLboolean _GLEE_NV_conditional_render = GL_FALSE;\r
+GLboolean _GLEE_NV_present_video = GL_FALSE;\r
+GLboolean _GLEE_EXT_transform_feedback = GL_FALSE;\r
+GLboolean _GLEE_EXT_direct_state_access = GL_FALSE;\r
+GLboolean _GLEE_EXT_vertex_array_bgra = GL_FALSE;\r
+GLboolean _GLEE_EXT_texture_swizzle = GL_FALSE;\r
+GLboolean _GLEE_NV_explicit_multisample = GL_FALSE;\r
+GLboolean _GLEE_NV_transform_feedback2 = GL_FALSE;\r
+GLboolean _GLEE_SGIX_texture_select = GL_FALSE;\r
+GLboolean _GLEE_INGR_blend_func_separate = GL_FALSE;\r
+GLboolean _GLEE_SGIX_depth_pass_instrument = GL_FALSE;\r
+GLboolean _GLEE_SGIX_igloo_interface = GL_FALSE;\r
+GLboolean _GLEE_EXT_fragment_lighting = GL_FALSE;\r
+GLboolean _GLEE_EXT_geometry_shader4 = GL_FALSE;\r
+GLboolean _GLEE_EXT_scene_marker = GL_FALSE;\r
+GLboolean _GLEE_EXT_texture_compression_dxt1 = GL_FALSE;\r
+GLboolean _GLEE_EXT_texture_env = GL_FALSE;\r
+GLboolean _GLEE_IBM_static_data = GL_FALSE;\r
+GLboolean _GLEE_NV_gpu_program4 = GL_FALSE;\r
+GLboolean _GLEE_OES_byte_coordinates = GL_FALSE;\r
+GLboolean _GLEE_OES_compressed_paletted_texture = GL_FALSE;\r
+GLboolean _GLEE_OES_single_precision = GL_FALSE;\r
+GLboolean _GLEE_SGIX_pixel_texture_bits = GL_FALSE;\r
+GLboolean _GLEE_SGIX_texture_range = GL_FALSE;\r
+\r
+/*  GL Extension names */\r
+\r
+char __GLeeGLExtensionNames[322][39]={\r
+    "GL_VERSION_1_2",\r
+    "GL_ARB_imaging",\r
+    "GL_VERSION_1_3",\r
+    "GL_VERSION_1_4",\r
+    "GL_VERSION_1_5",\r
+    "GL_VERSION_2_0",\r
+    "GL_VERSION_2_1",\r
+    "GL_VERSION_3_0",\r
+    "GL_ARB_multitexture",\r
+    "GL_ARB_transpose_matrix",\r
+    "GL_ARB_multisample",\r
+    "GL_ARB_texture_env_add",\r
+    "GL_ARB_texture_cube_map",\r
+    "GL_ARB_texture_compression",\r
+    "GL_ARB_texture_border_clamp",\r
+    "GL_ARB_point_parameters",\r
+    "GL_ARB_vertex_blend",\r
+    "GL_ARB_matrix_palette",\r
+    "GL_ARB_texture_env_combine",\r
+    "GL_ARB_texture_env_crossbar",\r
+    "GL_ARB_texture_env_dot3",\r
+    "GL_ARB_texture_mirrored_repeat",\r
+    "GL_ARB_depth_texture",\r
+    "GL_ARB_shadow",\r
+    "GL_ARB_shadow_ambient",\r
+    "GL_ARB_window_pos",\r
+    "GL_ARB_vertex_program",\r
+    "GL_ARB_fragment_program",\r
+    "GL_ARB_vertex_buffer_object",\r
+    "GL_ARB_occlusion_query",\r
+    "GL_ARB_shader_objects",\r
+    "GL_ARB_vertex_shader",\r
+    "GL_ARB_fragment_shader",\r
+    "GL_ARB_shading_language_100",\r
+    "GL_ARB_texture_non_power_of_two",\r
+    "GL_ARB_point_sprite",\r
+    "GL_ARB_fragment_program_shadow",\r
+    "GL_ARB_draw_buffers",\r
+    "GL_ARB_texture_rectangle",\r
+    "GL_ARB_color_buffer_float",\r
+    "GL_ARB_half_float_pixel",\r
+    "GL_ARB_texture_float",\r
+    "GL_ARB_pixel_buffer_object",\r
+    "GL_ARB_depth_buffer_float",\r
+    "GL_ARB_draw_instanced",\r
+    "GL_ARB_framebuffer_object",\r
+    "GL_ARB_framebuffer_sRGB",\r
+    "GL_ARB_geometry_shader4",\r
+    "GL_ARB_half_float_vertex",\r
+    "GL_ARB_instanced_arrays",\r
+    "GL_ARB_map_buffer_range",\r
+    "GL_ARB_texture_buffer_object",\r
+    "GL_ARB_texture_compression_rgtc",\r
+    "GL_ARB_texture_rg",\r
+    "GL_ARB_vertex_array_object",\r
+    "GL_EXT_abgr",\r
+    "GL_EXT_blend_color",\r
+    "GL_EXT_polygon_offset",\r
+    "GL_EXT_texture",\r
+    "GL_EXT_texture3D",\r
+    "GL_SGIS_texture_filter4",\r
+    "GL_EXT_subtexture",\r
+    "GL_EXT_copy_texture",\r
+    "GL_EXT_histogram",\r
+    "GL_EXT_convolution",\r
+    "GL_SGI_color_matrix",\r
+    "GL_SGI_color_table",\r
+    "GL_SGIS_pixel_texture",\r
+    "GL_SGIX_pixel_texture",\r
+    "GL_SGIS_texture4D",\r
+    "GL_SGI_texture_color_table",\r
+    "GL_EXT_cmyka",\r
+    "GL_EXT_texture_object",\r
+    "GL_SGIS_detail_texture",\r
+    "GL_SGIS_sharpen_texture",\r
+    "GL_EXT_packed_pixels",\r
+    "GL_SGIS_texture_lod",\r
+    "GL_SGIS_multisample",\r
+    "GL_EXT_rescale_normal",\r
+    "GL_EXT_vertex_array",\r
+    "GL_EXT_misc_attribute",\r
+    "GL_SGIS_generate_mipmap",\r
+    "GL_SGIX_clipmap",\r
+    "GL_SGIX_shadow",\r
+    "GL_SGIS_texture_edge_clamp",\r
+    "GL_SGIS_texture_border_clamp",\r
+    "GL_EXT_blend_minmax",\r
+    "GL_EXT_blend_subtract",\r
+    "GL_EXT_blend_logic_op",\r
+    "GL_SGIX_interlace",\r
+    "GL_SGIX_pixel_tiles",\r
+    "GL_SGIS_texture_select",\r
+    "GL_SGIX_sprite",\r
+    "GL_SGIX_texture_multi_buffer",\r
+    "GL_EXT_point_parameters",\r
+    "GL_SGIS_point_parameters",\r
+    "GL_SGIX_instruments",\r
+    "GL_SGIX_texture_scale_bias",\r
+    "GL_SGIX_framezoom",\r
+    "GL_SGIX_tag_sample_buffer",\r
+    "GL_FfdMaskSGIX",\r
+    "GL_SGIX_polynomial_ffd",\r
+    "GL_SGIX_reference_plane",\r
+    "GL_SGIX_flush_raster",\r
+    "GL_SGIX_depth_texture",\r
+    "GL_SGIS_fog_function",\r
+    "GL_SGIX_fog_offset",\r
+    "GL_HP_image_transform",\r
+    "GL_HP_convolution_border_modes",\r
+    "GL_INGR_palette_buffer",\r
+    "GL_SGIX_texture_add_env",\r
+    "GL_EXT_color_subtable",\r
+    "GL_PGI_vertex_hints",\r
+    "GL_PGI_misc_hints",\r
+    "GL_EXT_paletted_texture",\r
+    "GL_EXT_clip_volume_hint",\r
+    "GL_SGIX_list_priority",\r
+    "GL_SGIX_ir_instrument1",\r
+    "GL_SGIX_calligraphic_fragment",\r
+    "GL_SGIX_texture_lod_bias",\r
+    "GL_SGIX_shadow_ambient",\r
+    "GL_EXT_index_texture",\r
+    "GL_EXT_index_material",\r
+    "GL_EXT_index_func",\r
+    "GL_EXT_index_array_formats",\r
+    "GL_EXT_compiled_vertex_array",\r
+    "GL_EXT_cull_vertex",\r
+    "GL_SGIX_ycrcb",\r
+    "GL_SGIX_fragment_lighting",\r
+    "GL_IBM_rasterpos_clip",\r
+    "GL_HP_texture_lighting",\r
+    "GL_EXT_draw_range_elements",\r
+    "GL_WIN_phong_shading",\r
+    "GL_WIN_specular_fog",\r
+    "GL_EXT_light_texture",\r
+    "GL_SGIX_blend_alpha_minmax",\r
+    "GL_SGIX_impact_pixel_texture",\r
+    "GL_EXT_bgra",\r
+    "GL_SGIX_async",\r
+    "GL_SGIX_async_pixel",\r
+    "GL_SGIX_async_histogram",\r
+    "GL_INTEL_texture_scissor",\r
+    "GL_INTEL_parallel_arrays",\r
+    "GL_HP_occlusion_test",\r
+    "GL_EXT_pixel_transform",\r
+    "GL_EXT_pixel_transform_color_table",\r
+    "GL_EXT_shared_texture_palette",\r
+    "GL_EXT_separate_specular_color",\r
+    "GL_EXT_secondary_color",\r
+    "GL_EXT_texture_perturb_normal",\r
+    "GL_EXT_multi_draw_arrays",\r
+    "GL_EXT_fog_coord",\r
+    "GL_REND_screen_coordinates",\r
+    "GL_EXT_coordinate_frame",\r
+    "GL_EXT_texture_env_combine",\r
+    "GL_APPLE_specular_vector",\r
+    "GL_APPLE_transform_hint",\r
+    "GL_SGIX_fog_scale",\r
+    "GL_SUNX_constant_data",\r
+    "GL_SUN_global_alpha",\r
+    "GL_SUN_triangle_list",\r
+    "GL_SUN_vertex",\r
+    "GL_EXT_blend_func_separate",\r
+    "GL_INGR_color_clamp",\r
+    "GL_INGR_interlace_read",\r
+    "GL_EXT_stencil_wrap",\r
+    "GL_EXT_422_pixels",\r
+    "GL_NV_texgen_reflection",\r
+    "GL_EXT_texture_cube_map",\r
+    "GL_SUN_convolution_border_modes",\r
+    "GL_EXT_texture_env_add",\r
+    "GL_EXT_texture_lod_bias",\r
+    "GL_EXT_texture_filter_anisotropic",\r
+    "GL_EXT_vertex_weighting",\r
+    "GL_NV_light_max_exponent",\r
+    "GL_NV_vertex_array_range",\r
+    "GL_NV_register_combiners",\r
+    "GL_NV_fog_distance",\r
+    "GL_NV_texgen_emboss",\r
+    "GL_NV_blend_square",\r
+    "GL_NV_texture_env_combine4",\r
+    "GL_MESA_resize_buffers",\r
+    "GL_MESA_window_pos",\r
+    "GL_EXT_texture_compression_s3tc",\r
+    "GL_IBM_cull_vertex",\r
+    "GL_IBM_multimode_draw_arrays",\r
+    "GL_IBM_vertex_array_lists",\r
+    "GL_SGIX_subsample",\r
+    "GL_SGIX_ycrcb_subsample",\r
+    "GL_SGIX_ycrcba",\r
+    "GL_SGI_depth_pass_instrument",\r
+    "GL_3DFX_texture_compression_FXT1",\r
+    "GL_3DFX_multisample",\r
+    "GL_3DFX_tbuffer",\r
+    "GL_EXT_multisample",\r
+    "GL_SGIX_vertex_preclip",\r
+    "GL_SGIX_convolution_accuracy",\r
+    "GL_SGIX_resample",\r
+    "GL_SGIS_point_line_texgen",\r
+    "GL_SGIS_texture_color_mask",\r
+    "GL_EXT_texture_env_dot3",\r
+    "GL_ATI_texture_mirror_once",\r
+    "GL_NV_fence",\r
+    "GL_IBM_texture_mirrored_repeat",\r
+    "GL_NV_evaluators",\r
+    "GL_NV_packed_depth_stencil",\r
+    "GL_NV_register_combiners2",\r
+    "GL_NV_texture_compression_vtc",\r
+    "GL_NV_texture_rectangle",\r
+    "GL_NV_texture_shader",\r
+    "GL_NV_texture_shader2",\r
+    "GL_NV_vertex_array_range2",\r
+    "GL_NV_vertex_program",\r
+    "GL_SGIX_texture_coordinate_clamp",\r
+    "GL_SGIX_scalebias_hint",\r
+    "GL_OML_interlace",\r
+    "GL_OML_subsample",\r
+    "GL_OML_resample",\r
+    "GL_NV_copy_depth_to_color",\r
+    "GL_ATI_envmap_bumpmap",\r
+    "GL_ATI_fragment_shader",\r
+    "GL_ATI_pn_triangles",\r
+    "GL_ATI_vertex_array_object",\r
+    "GL_EXT_vertex_shader",\r
+    "GL_ATI_vertex_streams",\r
+    "GL_ATI_element_array",\r
+    "GL_SUN_mesh_array",\r
+    "GL_SUN_slice_accum",\r
+    "GL_NV_multisample_filter_hint",\r
+    "GL_NV_depth_clamp",\r
+    "GL_NV_occlusion_query",\r
+    "GL_NV_point_sprite",\r
+    "GL_NV_texture_shader3",\r
+    "GL_NV_vertex_program1_1",\r
+    "GL_EXT_shadow_funcs",\r
+    "GL_EXT_stencil_two_side",\r
+    "GL_ATI_text_fragment_shader",\r
+    "GL_APPLE_client_storage",\r
+    "GL_APPLE_element_array",\r
+    "GL_APPLE_fence",\r
+    "GL_APPLE_vertex_array_object",\r
+    "GL_APPLE_vertex_array_range",\r
+    "GL_APPLE_ycbcr_422",\r
+    "GL_S3_s3tc",\r
+    "GL_ATI_draw_buffers",\r
+    "GL_ATI_pixel_format_float",\r
+    "GL_ATI_texture_env_combine3",\r
+    "GL_ATI_texture_float",\r
+    "GL_NV_float_buffer",\r
+    "GL_NV_fragment_program",\r
+    "GL_NV_half_float",\r
+    "GL_NV_pixel_data_range",\r
+    "GL_NV_primitive_restart",\r
+    "GL_NV_texture_expand_normal",\r
+    "GL_NV_vertex_program2",\r
+    "GL_ATI_map_object_buffer",\r
+    "GL_ATI_separate_stencil",\r
+    "GL_ATI_vertex_attrib_array_object",\r
+    "GL_OES_read_format",\r
+    "GL_EXT_depth_bounds_test",\r
+    "GL_EXT_texture_mirror_clamp",\r
+    "GL_EXT_blend_equation_separate",\r
+    "GL_MESA_pack_invert",\r
+    "GL_MESA_ycbcr_texture",\r
+    "GL_EXT_pixel_buffer_object",\r
+    "GL_NV_fragment_program_option",\r
+    "GL_NV_fragment_program2",\r
+    "GL_NV_vertex_program2_option",\r
+    "GL_NV_vertex_program3",\r
+    "GL_EXT_framebuffer_object",\r
+    "GL_GREMEDY_string_marker",\r
+    "GL_EXT_packed_depth_stencil",\r
+    "GL_EXT_stencil_clear_tag",\r
+    "GL_EXT_texture_sRGB",\r
+    "GL_EXT_framebuffer_blit",\r
+    "GL_EXT_framebuffer_multisample",\r
+    "GL_MESAX_texture_stack",\r
+    "GL_EXT_timer_query",\r
+    "GL_EXT_gpu_program_parameters",\r
+    "GL_APPLE_flush_buffer_range",\r
+    "GL_EXT_gpu_shader4",\r
+    "GL_EXT_draw_instanced",\r
+    "GL_EXT_packed_float",\r
+    "GL_EXT_texture_array",\r
+    "GL_EXT_texture_buffer_object",\r
+    "GL_EXT_texture_compression_latc",\r
+    "GL_EXT_texture_compression_rgtc",\r
+    "GL_EXT_texture_shared_exponent",\r
+    "GL_NV_depth_buffer_float",\r
+    "GL_NV_framebuffer_multisample_coverage",\r
+    "GL_EXT_framebuffer_sRGB",\r
+    "GL_NV_geometry_shader4",\r
+    "GL_NV_parameter_buffer_object",\r
+    "GL_EXT_draw_buffers2",\r
+    "GL_NV_transform_feedback",\r
+    "GL_EXT_bindable_uniform",\r
+    "GL_EXT_texture_integer",\r
+    "GL_GREMEDY_frame_terminator",\r
+    "GL_NV_conditional_render",\r
+    "GL_NV_present_video",\r
+    "GL_EXT_transform_feedback",\r
+    "GL_EXT_direct_state_access",\r
+    "GL_EXT_vertex_array_bgra",\r
+    "GL_EXT_texture_swizzle",\r
+    "GL_NV_explicit_multisample",\r
+    "GL_NV_transform_feedback2",\r
+    "GL_SGIX_texture_select",\r
+    "GL_INGR_blend_func_separate",\r
+    "GL_SGIX_depth_pass_instrument",\r
+    "GL_SGIX_igloo_interface",\r
+    "GL_EXT_fragment_lighting",\r
+    "GL_EXT_geometry_shader4",\r
+    "GL_EXT_scene_marker",\r
+    "GL_EXT_texture_compression_dxt1",\r
+    "GL_EXT_texture_env",\r
+    "GL_IBM_static_data",\r
+    "GL_NV_gpu_program4",\r
+    "GL_OES_byte_coordinates",\r
+    "GL_OES_compressed_paletted_texture",\r
+    "GL_OES_single_precision",\r
+    "GL_SGIX_pixel_texture_bits",\r
+    "GL_SGIX_texture_range"\r
+};\r
+int __GLeeGLNumExtensions=322;\r
+\r
+/* GL_VERSION_1_2 */\r
+\r
+#ifdef __GLEE_GL_VERSION_1_2\r
+#ifndef GLEE_C_DEFINED_glBlendColor\r
+#define GLEE_C_DEFINED_glBlendColor\r
+  void __stdcall GLee_Lazy_glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)  {if (GLeeInit()) glBlendColor(red, green, blue, alpha);}\r
+  GLEEPFNGLBLENDCOLORPROC GLeeFuncPtr_glBlendColor=GLee_Lazy_glBlendColor;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glBlendEquation\r
+#define GLEE_C_DEFINED_glBlendEquation\r
+  void __stdcall GLee_Lazy_glBlendEquation(GLenum mode)  {if (GLeeInit()) glBlendEquation(mode);}\r
+  GLEEPFNGLBLENDEQUATIONPROC GLeeFuncPtr_glBlendEquation=GLee_Lazy_glBlendEquation;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glDrawRangeElements\r
+#define GLEE_C_DEFINED_glDrawRangeElements\r
+  void __stdcall GLee_Lazy_glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid * indices)  {if (GLeeInit()) glDrawRangeElements(mode, start, end, count, type, indices);}\r
+  GLEEPFNGLDRAWRANGEELEMENTSPROC GLeeFuncPtr_glDrawRangeElements=GLee_Lazy_glDrawRangeElements;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glColorTable\r
+#define GLEE_C_DEFINED_glColorTable\r
+  void __stdcall GLee_Lazy_glColorTable(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid * table)  {if (GLeeInit()) glColorTable(target, internalformat, width, format, type, table);}\r
+  GLEEPFNGLCOLORTABLEPROC GLeeFuncPtr_glColorTable=GLee_Lazy_glColorTable;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glColorTableParameterfv\r
+#define GLEE_C_DEFINED_glColorTableParameterfv\r
+  void __stdcall GLee_Lazy_glColorTableParameterfv(GLenum target, GLenum pname, const GLfloat * params)  {if (GLeeInit()) glColorTableParameterfv(target, pname, params);}\r
+  GLEEPFNGLCOLORTABLEPARAMETERFVPROC GLeeFuncPtr_glColorTableParameterfv=GLee_Lazy_glColorTableParameterfv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glColorTableParameteriv\r
+#define GLEE_C_DEFINED_glColorTableParameteriv\r
+  void __stdcall GLee_Lazy_glColorTableParameteriv(GLenum target, GLenum pname, const GLint * params)  {if (GLeeInit()) glColorTableParameteriv(target, pname, params);}\r
+  GLEEPFNGLCOLORTABLEPARAMETERIVPROC GLeeFuncPtr_glColorTableParameteriv=GLee_Lazy_glColorTableParameteriv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glCopyColorTable\r
+#define GLEE_C_DEFINED_glCopyColorTable\r
+  void __stdcall GLee_Lazy_glCopyColorTable(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)  {if (GLeeInit()) glCopyColorTable(target, internalformat, x, y, width);}\r
+  GLEEPFNGLCOPYCOLORTABLEPROC GLeeFuncPtr_glCopyColorTable=GLee_Lazy_glCopyColorTable;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetColorTable\r
+#define GLEE_C_DEFINED_glGetColorTable\r
+  void __stdcall GLee_Lazy_glGetColorTable(GLenum target, GLenum format, GLenum type, GLvoid * table)  {if (GLeeInit()) glGetColorTable(target, format, type, table);}\r
+  GLEEPFNGLGETCOLORTABLEPROC GLeeFuncPtr_glGetColorTable=GLee_Lazy_glGetColorTable;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetColorTableParameterfv\r
+#define GLEE_C_DEFINED_glGetColorTableParameterfv\r
+  void __stdcall GLee_Lazy_glGetColorTableParameterfv(GLenum target, GLenum pname, GLfloat * params)  {if (GLeeInit()) glGetColorTableParameterfv(target, pname, params);}\r
+  GLEEPFNGLGETCOLORTABLEPARAMETERFVPROC GLeeFuncPtr_glGetColorTableParameterfv=GLee_Lazy_glGetColorTableParameterfv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetColorTableParameteriv\r
+#define GLEE_C_DEFINED_glGetColorTableParameteriv\r
+  void __stdcall GLee_Lazy_glGetColorTableParameteriv(GLenum target, GLenum pname, GLint * params)  {if (GLeeInit()) glGetColorTableParameteriv(target, pname, params);}\r
+  GLEEPFNGLGETCOLORTABLEPARAMETERIVPROC GLeeFuncPtr_glGetColorTableParameteriv=GLee_Lazy_glGetColorTableParameteriv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glColorSubTable\r
+#define GLEE_C_DEFINED_glColorSubTable\r
+  void __stdcall GLee_Lazy_glColorSubTable(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid * data)  {if (GLeeInit()) glColorSubTable(target, start, count, format, type, data);}\r
+  GLEEPFNGLCOLORSUBTABLEPROC GLeeFuncPtr_glColorSubTable=GLee_Lazy_glColorSubTable;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glCopyColorSubTable\r
+#define GLEE_C_DEFINED_glCopyColorSubTable\r
+  void __stdcall GLee_Lazy_glCopyColorSubTable(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width)  {if (GLeeInit()) glCopyColorSubTable(target, start, x, y, width);}\r
+  GLEEPFNGLCOPYCOLORSUBTABLEPROC GLeeFuncPtr_glCopyColorSubTable=GLee_Lazy_glCopyColorSubTable;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glConvolutionFilter1D\r
+#define GLEE_C_DEFINED_glConvolutionFilter1D\r
+  void __stdcall GLee_Lazy_glConvolutionFilter1D(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid * image)  {if (GLeeInit()) glConvolutionFilter1D(target, internalformat, width, format, type, image);}\r
+  GLEEPFNGLCONVOLUTIONFILTER1DPROC GLeeFuncPtr_glConvolutionFilter1D=GLee_Lazy_glConvolutionFilter1D;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glConvolutionFilter2D\r
+#define GLEE_C_DEFINED_glConvolutionFilter2D\r
+  void __stdcall GLee_Lazy_glConvolutionFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * image)  {if (GLeeInit()) glConvolutionFilter2D(target, internalformat, width, height, format, type, image);}\r
+  GLEEPFNGLCONVOLUTIONFILTER2DPROC GLeeFuncPtr_glConvolutionFilter2D=GLee_Lazy_glConvolutionFilter2D;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glConvolutionParameterf\r
+#define GLEE_C_DEFINED_glConvolutionParameterf\r
+  void __stdcall GLee_Lazy_glConvolutionParameterf(GLenum target, GLenum pname, GLfloat params)  {if (GLeeInit()) glConvolutionParameterf(target, pname, params);}\r
+  GLEEPFNGLCONVOLUTIONPARAMETERFPROC GLeeFuncPtr_glConvolutionParameterf=GLee_Lazy_glConvolutionParameterf;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glConvolutionParameterfv\r
+#define GLEE_C_DEFINED_glConvolutionParameterfv\r
+  void __stdcall GLee_Lazy_glConvolutionParameterfv(GLenum target, GLenum pname, const GLfloat * params)  {if (GLeeInit()) glConvolutionParameterfv(target, pname, params);}\r
+  GLEEPFNGLCONVOLUTIONPARAMETERFVPROC GLeeFuncPtr_glConvolutionParameterfv=GLee_Lazy_glConvolutionParameterfv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glConvolutionParameteri\r
+#define GLEE_C_DEFINED_glConvolutionParameteri\r
+  void __stdcall GLee_Lazy_glConvolutionParameteri(GLenum target, GLenum pname, GLint params)  {if (GLeeInit()) glConvolutionParameteri(target, pname, params);}\r
+  GLEEPFNGLCONVOLUTIONPARAMETERIPROC GLeeFuncPtr_glConvolutionParameteri=GLee_Lazy_glConvolutionParameteri;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glConvolutionParameteriv\r
+#define GLEE_C_DEFINED_glConvolutionParameteriv\r
+  void __stdcall GLee_Lazy_glConvolutionParameteriv(GLenum target, GLenum pname, const GLint * params)  {if (GLeeInit()) glConvolutionParameteriv(target, pname, params);}\r
+  GLEEPFNGLCONVOLUTIONPARAMETERIVPROC GLeeFuncPtr_glConvolutionParameteriv=GLee_Lazy_glConvolutionParameteriv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glCopyConvolutionFilter1D\r
+#define GLEE_C_DEFINED_glCopyConvolutionFilter1D\r
+  void __stdcall GLee_Lazy_glCopyConvolutionFilter1D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)  {if (GLeeInit()) glCopyConvolutionFilter1D(target, internalformat, x, y, width);}\r
+  GLEEPFNGLCOPYCONVOLUTIONFILTER1DPROC GLeeFuncPtr_glCopyConvolutionFilter1D=GLee_Lazy_glCopyConvolutionFilter1D;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glCopyConvolutionFilter2D\r
+#define GLEE_C_DEFINED_glCopyConvolutionFilter2D\r
+  void __stdcall GLee_Lazy_glCopyConvolutionFilter2D(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height)  {if (GLeeInit()) glCopyConvolutionFilter2D(target, internalformat, x, y, width, height);}\r
+  GLEEPFNGLCOPYCONVOLUTIONFILTER2DPROC GLeeFuncPtr_glCopyConvolutionFilter2D=GLee_Lazy_glCopyConvolutionFilter2D;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetConvolutionFilter\r
+#define GLEE_C_DEFINED_glGetConvolutionFilter\r
+  void __stdcall GLee_Lazy_glGetConvolutionFilter(GLenum target, GLenum format, GLenum type, GLvoid * image)  {if (GLeeInit()) glGetConvolutionFilter(target, format, type, image);}\r
+  GLEEPFNGLGETCONVOLUTIONFILTERPROC GLeeFuncPtr_glGetConvolutionFilter=GLee_Lazy_glGetConvolutionFilter;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetConvolutionParameterfv\r
+#define GLEE_C_DEFINED_glGetConvolutionParameterfv\r
+  void __stdcall GLee_Lazy_glGetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat * params)  {if (GLeeInit()) glGetConvolutionParameterfv(target, pname, params);}\r
+  GLEEPFNGLGETCONVOLUTIONPARAMETERFVPROC GLeeFuncPtr_glGetConvolutionParameterfv=GLee_Lazy_glGetConvolutionParameterfv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetConvolutionParameteriv\r
+#define GLEE_C_DEFINED_glGetConvolutionParameteriv\r
+  void __stdcall GLee_Lazy_glGetConvolutionParameteriv(GLenum target, GLenum pname, GLint * params)  {if (GLeeInit()) glGetConvolutionParameteriv(target, pname, params);}\r
+  GLEEPFNGLGETCONVOLUTIONPARAMETERIVPROC GLeeFuncPtr_glGetConvolutionParameteriv=GLee_Lazy_glGetConvolutionParameteriv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetSeparableFilter\r
+#define GLEE_C_DEFINED_glGetSeparableFilter\r
+  void __stdcall GLee_Lazy_glGetSeparableFilter(GLenum target, GLenum format, GLenum type, GLvoid * row, GLvoid * column, GLvoid * span)  {if (GLeeInit()) glGetSeparableFilter(target, format, type, row, column, span);}\r
+  GLEEPFNGLGETSEPARABLEFILTERPROC GLeeFuncPtr_glGetSeparableFilter=GLee_Lazy_glGetSeparableFilter;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glSeparableFilter2D\r
+#define GLEE_C_DEFINED_glSeparableFilter2D\r
+  void __stdcall GLee_Lazy_glSeparableFilter2D(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * row, const GLvoid * column)  {if (GLeeInit()) glSeparableFilter2D(target, internalformat, width, height, format, type, row, column);}\r
+  GLEEPFNGLSEPARABLEFILTER2DPROC GLeeFuncPtr_glSeparableFilter2D=GLee_Lazy_glSeparableFilter2D;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetHistogram\r
+#define GLEE_C_DEFINED_glGetHistogram\r
+  void __stdcall GLee_Lazy_glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid * values)  {if (GLeeInit()) glGetHistogram(target, reset, format, type, values);}\r
+  GLEEPFNGLGETHISTOGRAMPROC GLeeFuncPtr_glGetHistogram=GLee_Lazy_glGetHistogram;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetHistogramParameterfv\r
+#define GLEE_C_DEFINED_glGetHistogramParameterfv\r
+  void __stdcall GLee_Lazy_glGetHistogramParameterfv(GLenum target, GLenum pname, GLfloat * params)  {if (GLeeInit()) glGetHistogramParameterfv(target, pname, params);}\r
+  GLEEPFNGLGETHISTOGRAMPARAMETERFVPROC GLeeFuncPtr_glGetHistogramParameterfv=GLee_Lazy_glGetHistogramParameterfv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetHistogramParameteriv\r
+#define GLEE_C_DEFINED_glGetHistogramParameteriv\r
+  void __stdcall GLee_Lazy_glGetHistogramParameteriv(GLenum target, GLenum pname, GLint * params)  {if (GLeeInit()) glGetHistogramParameteriv(target, pname, params);}\r
+  GLEEPFNGLGETHISTOGRAMPARAMETERIVPROC GLeeFuncPtr_glGetHistogramParameteriv=GLee_Lazy_glGetHistogramParameteriv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetMinmax\r
+#define GLEE_C_DEFINED_glGetMinmax\r
+  void __stdcall GLee_Lazy_glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid * values)  {if (GLeeInit()) glGetMinmax(target, reset, format, type, values);}\r
+  GLEEPFNGLGETMINMAXPROC GLeeFuncPtr_glGetMinmax=GLee_Lazy_glGetMinmax;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetMinmaxParameterfv\r
+#define GLEE_C_DEFINED_glGetMinmaxParameterfv\r
+  void __stdcall GLee_Lazy_glGetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat * params)  {if (GLeeInit()) glGetMinmaxParameterfv(target, pname, params);}\r
+  GLEEPFNGLGETMINMAXPARAMETERFVPROC GLeeFuncPtr_glGetMinmaxParameterfv=GLee_Lazy_glGetMinmaxParameterfv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetMinmaxParameteriv\r
+#define GLEE_C_DEFINED_glGetMinmaxParameteriv\r
+  void __stdcall GLee_Lazy_glGetMinmaxParameteriv(GLenum target, GLenum pname, GLint * params)  {if (GLeeInit()) glGetMinmaxParameteriv(target, pname, params);}\r
+  GLEEPFNGLGETMINMAXPARAMETERIVPROC GLeeFuncPtr_glGetMinmaxParameteriv=GLee_Lazy_glGetMinmaxParameteriv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glHistogram\r
+#define GLEE_C_DEFINED_glHistogram\r
+  void __stdcall GLee_Lazy_glHistogram(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink)  {if (GLeeInit()) glHistogram(target, width, internalformat, sink);}\r
+  GLEEPFNGLHISTOGRAMPROC GLeeFuncPtr_glHistogram=GLee_Lazy_glHistogram;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMinmax\r
+#define GLEE_C_DEFINED_glMinmax\r
+  void __stdcall GLee_Lazy_glMinmax(GLenum target, GLenum internalformat, GLboolean sink)  {if (GLeeInit()) glMinmax(target, internalformat, sink);}\r
+  GLEEPFNGLMINMAXPROC GLeeFuncPtr_glMinmax=GLee_Lazy_glMinmax;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glResetHistogram\r
+#define GLEE_C_DEFINED_glResetHistogram\r
+  void __stdcall GLee_Lazy_glResetHistogram(GLenum target)  {if (GLeeInit()) glResetHistogram(target);}\r
+  GLEEPFNGLRESETHISTOGRAMPROC GLeeFuncPtr_glResetHistogram=GLee_Lazy_glResetHistogram;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glResetMinmax\r
+#define GLEE_C_DEFINED_glResetMinmax\r
+  void __stdcall GLee_Lazy_glResetMinmax(GLenum target)  {if (GLeeInit()) glResetMinmax(target);}\r
+  GLEEPFNGLRESETMINMAXPROC GLeeFuncPtr_glResetMinmax=GLee_Lazy_glResetMinmax;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTexImage3D\r
+#define GLEE_C_DEFINED_glTexImage3D\r
+  void __stdcall GLee_Lazy_glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid * pixels)  {if (GLeeInit()) glTexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);}\r
+  GLEEPFNGLTEXIMAGE3DPROC GLeeFuncPtr_glTexImage3D=GLee_Lazy_glTexImage3D;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTexSubImage3D\r
+#define GLEE_C_DEFINED_glTexSubImage3D\r
+  void __stdcall GLee_Lazy_glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid * pixels)  {if (GLeeInit()) glTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);}\r
+  GLEEPFNGLTEXSUBIMAGE3DPROC GLeeFuncPtr_glTexSubImage3D=GLee_Lazy_glTexSubImage3D;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glCopyTexSubImage3D\r
+#define GLEE_C_DEFINED_glCopyTexSubImage3D\r
+  void __stdcall GLee_Lazy_glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)  {if (GLeeInit()) glCopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);}\r
+  GLEEPFNGLCOPYTEXSUBIMAGE3DPROC GLeeFuncPtr_glCopyTexSubImage3D=GLee_Lazy_glCopyTexSubImage3D;\r
+#endif\r
+#endif \r
+\r
+/* GL_ARB_imaging */\r
+\r
+#ifdef __GLEE_GL_ARB_imaging\r
+#endif \r
+\r
+/* GL_VERSION_1_3 */\r
+\r
+#ifdef __GLEE_GL_VERSION_1_3\r
+#ifndef GLEE_C_DEFINED_glActiveTexture\r
+#define GLEE_C_DEFINED_glActiveTexture\r
+  void __stdcall GLee_Lazy_glActiveTexture(GLenum texture)  {if (GLeeInit()) glActiveTexture(texture);}\r
+  GLEEPFNGLACTIVETEXTUREPROC GLeeFuncPtr_glActiveTexture=GLee_Lazy_glActiveTexture;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glClientActiveTexture\r
+#define GLEE_C_DEFINED_glClientActiveTexture\r
+  void __stdcall GLee_Lazy_glClientActiveTexture(GLenum texture)  {if (GLeeInit()) glClientActiveTexture(texture);}\r
+  GLEEPFNGLCLIENTACTIVETEXTUREPROC GLeeFuncPtr_glClientActiveTexture=GLee_Lazy_glClientActiveTexture;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord1d\r
+#define GLEE_C_DEFINED_glMultiTexCoord1d\r
+  void __stdcall GLee_Lazy_glMultiTexCoord1d(GLenum target, GLdouble s)  {if (GLeeInit()) glMultiTexCoord1d(target, s);}\r
+  GLEEPFNGLMULTITEXCOORD1DPROC GLeeFuncPtr_glMultiTexCoord1d=GLee_Lazy_glMultiTexCoord1d;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord1dv\r
+#define GLEE_C_DEFINED_glMultiTexCoord1dv\r
+  void __stdcall GLee_Lazy_glMultiTexCoord1dv(GLenum target, const GLdouble * v)  {if (GLeeInit()) glMultiTexCoord1dv(target, v);}\r
+  GLEEPFNGLMULTITEXCOORD1DVPROC GLeeFuncPtr_glMultiTexCoord1dv=GLee_Lazy_glMultiTexCoord1dv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord1f\r
+#define GLEE_C_DEFINED_glMultiTexCoord1f\r
+  void __stdcall GLee_Lazy_glMultiTexCoord1f(GLenum target, GLfloat s)  {if (GLeeInit()) glMultiTexCoord1f(target, s);}\r
+  GLEEPFNGLMULTITEXCOORD1FPROC GLeeFuncPtr_glMultiTexCoord1f=GLee_Lazy_glMultiTexCoord1f;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord1fv\r
+#define GLEE_C_DEFINED_glMultiTexCoord1fv\r
+  void __stdcall GLee_Lazy_glMultiTexCoord1fv(GLenum target, const GLfloat * v)  {if (GLeeInit()) glMultiTexCoord1fv(target, v);}\r
+  GLEEPFNGLMULTITEXCOORD1FVPROC GLeeFuncPtr_glMultiTexCoord1fv=GLee_Lazy_glMultiTexCoord1fv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord1i\r
+#define GLEE_C_DEFINED_glMultiTexCoord1i\r
+  void __stdcall GLee_Lazy_glMultiTexCoord1i(GLenum target, GLint s)  {if (GLeeInit()) glMultiTexCoord1i(target, s);}\r
+  GLEEPFNGLMULTITEXCOORD1IPROC GLeeFuncPtr_glMultiTexCoord1i=GLee_Lazy_glMultiTexCoord1i;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord1iv\r
+#define GLEE_C_DEFINED_glMultiTexCoord1iv\r
+  void __stdcall GLee_Lazy_glMultiTexCoord1iv(GLenum target, const GLint * v)  {if (GLeeInit()) glMultiTexCoord1iv(target, v);}\r
+  GLEEPFNGLMULTITEXCOORD1IVPROC GLeeFuncPtr_glMultiTexCoord1iv=GLee_Lazy_glMultiTexCoord1iv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord1s\r
+#define GLEE_C_DEFINED_glMultiTexCoord1s\r
+  void __stdcall GLee_Lazy_glMultiTexCoord1s(GLenum target, GLshort s)  {if (GLeeInit()) glMultiTexCoord1s(target, s);}\r
+  GLEEPFNGLMULTITEXCOORD1SPROC GLeeFuncPtr_glMultiTexCoord1s=GLee_Lazy_glMultiTexCoord1s;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord1sv\r
+#define GLEE_C_DEFINED_glMultiTexCoord1sv\r
+  void __stdcall GLee_Lazy_glMultiTexCoord1sv(GLenum target, const GLshort * v)  {if (GLeeInit()) glMultiTexCoord1sv(target, v);}\r
+  GLEEPFNGLMULTITEXCOORD1SVPROC GLeeFuncPtr_glMultiTexCoord1sv=GLee_Lazy_glMultiTexCoord1sv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord2d\r
+#define GLEE_C_DEFINED_glMultiTexCoord2d\r
+  void __stdcall GLee_Lazy_glMultiTexCoord2d(GLenum target, GLdouble s, GLdouble t)  {if (GLeeInit()) glMultiTexCoord2d(target, s, t);}\r
+  GLEEPFNGLMULTITEXCOORD2DPROC GLeeFuncPtr_glMultiTexCoord2d=GLee_Lazy_glMultiTexCoord2d;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord2dv\r
+#define GLEE_C_DEFINED_glMultiTexCoord2dv\r
+  void __stdcall GLee_Lazy_glMultiTexCoord2dv(GLenum target, const GLdouble * v)  {if (GLeeInit()) glMultiTexCoord2dv(target, v);}\r
+  GLEEPFNGLMULTITEXCOORD2DVPROC GLeeFuncPtr_glMultiTexCoord2dv=GLee_Lazy_glMultiTexCoord2dv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord2f\r
+#define GLEE_C_DEFINED_glMultiTexCoord2f\r
+  void __stdcall GLee_Lazy_glMultiTexCoord2f(GLenum target, GLfloat s, GLfloat t)  {if (GLeeInit()) glMultiTexCoord2f(target, s, t);}\r
+  GLEEPFNGLMULTITEXCOORD2FPROC GLeeFuncPtr_glMultiTexCoord2f=GLee_Lazy_glMultiTexCoord2f;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord2fv\r
+#define GLEE_C_DEFINED_glMultiTexCoord2fv\r
+  void __stdcall GLee_Lazy_glMultiTexCoord2fv(GLenum target, const GLfloat * v)  {if (GLeeInit()) glMultiTexCoord2fv(target, v);}\r
+  GLEEPFNGLMULTITEXCOORD2FVPROC GLeeFuncPtr_glMultiTexCoord2fv=GLee_Lazy_glMultiTexCoord2fv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord2i\r
+#define GLEE_C_DEFINED_glMultiTexCoord2i\r
+  void __stdcall GLee_Lazy_glMultiTexCoord2i(GLenum target, GLint s, GLint t)  {if (GLeeInit()) glMultiTexCoord2i(target, s, t);}\r
+  GLEEPFNGLMULTITEXCOORD2IPROC GLeeFuncPtr_glMultiTexCoord2i=GLee_Lazy_glMultiTexCoord2i;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord2iv\r
+#define GLEE_C_DEFINED_glMultiTexCoord2iv\r
+  void __stdcall GLee_Lazy_glMultiTexCoord2iv(GLenum target, const GLint * v)  {if (GLeeInit()) glMultiTexCoord2iv(target, v);}\r
+  GLEEPFNGLMULTITEXCOORD2IVPROC GLeeFuncPtr_glMultiTexCoord2iv=GLee_Lazy_glMultiTexCoord2iv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord2s\r
+#define GLEE_C_DEFINED_glMultiTexCoord2s\r
+  void __stdcall GLee_Lazy_glMultiTexCoord2s(GLenum target, GLshort s, GLshort t)  {if (GLeeInit()) glMultiTexCoord2s(target, s, t);}\r
+  GLEEPFNGLMULTITEXCOORD2SPROC GLeeFuncPtr_glMultiTexCoord2s=GLee_Lazy_glMultiTexCoord2s;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord2sv\r
+#define GLEE_C_DEFINED_glMultiTexCoord2sv\r
+  void __stdcall GLee_Lazy_glMultiTexCoord2sv(GLenum target, const GLshort * v)  {if (GLeeInit()) glMultiTexCoord2sv(target, v);}\r
+  GLEEPFNGLMULTITEXCOORD2SVPROC GLeeFuncPtr_glMultiTexCoord2sv=GLee_Lazy_glMultiTexCoord2sv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord3d\r
+#define GLEE_C_DEFINED_glMultiTexCoord3d\r
+  void __stdcall GLee_Lazy_glMultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r)  {if (GLeeInit()) glMultiTexCoord3d(target, s, t, r);}\r
+  GLEEPFNGLMULTITEXCOORD3DPROC GLeeFuncPtr_glMultiTexCoord3d=GLee_Lazy_glMultiTexCoord3d;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord3dv\r
+#define GLEE_C_DEFINED_glMultiTexCoord3dv\r
+  void __stdcall GLee_Lazy_glMultiTexCoord3dv(GLenum target, const GLdouble * v)  {if (GLeeInit()) glMultiTexCoord3dv(target, v);}\r
+  GLEEPFNGLMULTITEXCOORD3DVPROC GLeeFuncPtr_glMultiTexCoord3dv=GLee_Lazy_glMultiTexCoord3dv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord3f\r
+#define GLEE_C_DEFINED_glMultiTexCoord3f\r
+  void __stdcall GLee_Lazy_glMultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r)  {if (GLeeInit()) glMultiTexCoord3f(target, s, t, r);}\r
+  GLEEPFNGLMULTITEXCOORD3FPROC GLeeFuncPtr_glMultiTexCoord3f=GLee_Lazy_glMultiTexCoord3f;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord3fv\r
+#define GLEE_C_DEFINED_glMultiTexCoord3fv\r
+  void __stdcall GLee_Lazy_glMultiTexCoord3fv(GLenum target, const GLfloat * v)  {if (GLeeInit()) glMultiTexCoord3fv(target, v);}\r
+  GLEEPFNGLMULTITEXCOORD3FVPROC GLeeFuncPtr_glMultiTexCoord3fv=GLee_Lazy_glMultiTexCoord3fv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord3i\r
+#define GLEE_C_DEFINED_glMultiTexCoord3i\r
+  void __stdcall GLee_Lazy_glMultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r)  {if (GLeeInit()) glMultiTexCoord3i(target, s, t, r);}\r
+  GLEEPFNGLMULTITEXCOORD3IPROC GLeeFuncPtr_glMultiTexCoord3i=GLee_Lazy_glMultiTexCoord3i;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord3iv\r
+#define GLEE_C_DEFINED_glMultiTexCoord3iv\r
+  void __stdcall GLee_Lazy_glMultiTexCoord3iv(GLenum target, const GLint * v)  {if (GLeeInit()) glMultiTexCoord3iv(target, v);}\r
+  GLEEPFNGLMULTITEXCOORD3IVPROC GLeeFuncPtr_glMultiTexCoord3iv=GLee_Lazy_glMultiTexCoord3iv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord3s\r
+#define GLEE_C_DEFINED_glMultiTexCoord3s\r
+  void __stdcall GLee_Lazy_glMultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r)  {if (GLeeInit()) glMultiTexCoord3s(target, s, t, r);}\r
+  GLEEPFNGLMULTITEXCOORD3SPROC GLeeFuncPtr_glMultiTexCoord3s=GLee_Lazy_glMultiTexCoord3s;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord3sv\r
+#define GLEE_C_DEFINED_glMultiTexCoord3sv\r
+  void __stdcall GLee_Lazy_glMultiTexCoord3sv(GLenum target, const GLshort * v)  {if (GLeeInit()) glMultiTexCoord3sv(target, v);}\r
+  GLEEPFNGLMULTITEXCOORD3SVPROC GLeeFuncPtr_glMultiTexCoord3sv=GLee_Lazy_glMultiTexCoord3sv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord4d\r
+#define GLEE_C_DEFINED_glMultiTexCoord4d\r
+  void __stdcall GLee_Lazy_glMultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q)  {if (GLeeInit()) glMultiTexCoord4d(target, s, t, r, q);}\r
+  GLEEPFNGLMULTITEXCOORD4DPROC GLeeFuncPtr_glMultiTexCoord4d=GLee_Lazy_glMultiTexCoord4d;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord4dv\r
+#define GLEE_C_DEFINED_glMultiTexCoord4dv\r
+  void __stdcall GLee_Lazy_glMultiTexCoord4dv(GLenum target, const GLdouble * v)  {if (GLeeInit()) glMultiTexCoord4dv(target, v);}\r
+  GLEEPFNGLMULTITEXCOORD4DVPROC GLeeFuncPtr_glMultiTexCoord4dv=GLee_Lazy_glMultiTexCoord4dv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord4f\r
+#define GLEE_C_DEFINED_glMultiTexCoord4f\r
+  void __stdcall GLee_Lazy_glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q)  {if (GLeeInit()) glMultiTexCoord4f(target, s, t, r, q);}\r
+  GLEEPFNGLMULTITEXCOORD4FPROC GLeeFuncPtr_glMultiTexCoord4f=GLee_Lazy_glMultiTexCoord4f;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord4fv\r
+#define GLEE_C_DEFINED_glMultiTexCoord4fv\r
+  void __stdcall GLee_Lazy_glMultiTexCoord4fv(GLenum target, const GLfloat * v)  {if (GLeeInit()) glMultiTexCoord4fv(target, v);}\r
+  GLEEPFNGLMULTITEXCOORD4FVPROC GLeeFuncPtr_glMultiTexCoord4fv=GLee_Lazy_glMultiTexCoord4fv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord4i\r
+#define GLEE_C_DEFINED_glMultiTexCoord4i\r
+  void __stdcall GLee_Lazy_glMultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q)  {if (GLeeInit()) glMultiTexCoord4i(target, s, t, r, q);}\r
+  GLEEPFNGLMULTITEXCOORD4IPROC GLeeFuncPtr_glMultiTexCoord4i=GLee_Lazy_glMultiTexCoord4i;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord4iv\r
+#define GLEE_C_DEFINED_glMultiTexCoord4iv\r
+  void __stdcall GLee_Lazy_glMultiTexCoord4iv(GLenum target, const GLint * v)  {if (GLeeInit()) glMultiTexCoord4iv(target, v);}\r
+  GLEEPFNGLMULTITEXCOORD4IVPROC GLeeFuncPtr_glMultiTexCoord4iv=GLee_Lazy_glMultiTexCoord4iv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord4s\r
+#define GLEE_C_DEFINED_glMultiTexCoord4s\r
+  void __stdcall GLee_Lazy_glMultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q)  {if (GLeeInit()) glMultiTexCoord4s(target, s, t, r, q);}\r
+  GLEEPFNGLMULTITEXCOORD4SPROC GLeeFuncPtr_glMultiTexCoord4s=GLee_Lazy_glMultiTexCoord4s;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord4sv\r
+#define GLEE_C_DEFINED_glMultiTexCoord4sv\r
+  void __stdcall GLee_Lazy_glMultiTexCoord4sv(GLenum target, const GLshort * v)  {if (GLeeInit()) glMultiTexCoord4sv(target, v);}\r
+  GLEEPFNGLMULTITEXCOORD4SVPROC GLeeFuncPtr_glMultiTexCoord4sv=GLee_Lazy_glMultiTexCoord4sv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glLoadTransposeMatrixf\r
+#define GLEE_C_DEFINED_glLoadTransposeMatrixf\r
+  void __stdcall GLee_Lazy_glLoadTransposeMatrixf(const GLfloat * m)  {if (GLeeInit()) glLoadTransposeMatrixf(m);}\r
+  GLEEPFNGLLOADTRANSPOSEMATRIXFPROC GLeeFuncPtr_glLoadTransposeMatrixf=GLee_Lazy_glLoadTransposeMatrixf;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glLoadTransposeMatrixd\r
+#define GLEE_C_DEFINED_glLoadTransposeMatrixd\r
+  void __stdcall GLee_Lazy_glLoadTransposeMatrixd(const GLdouble * m)  {if (GLeeInit()) glLoadTransposeMatrixd(m);}\r
+  GLEEPFNGLLOADTRANSPOSEMATRIXDPROC GLeeFuncPtr_glLoadTransposeMatrixd=GLee_Lazy_glLoadTransposeMatrixd;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultTransposeMatrixf\r
+#define GLEE_C_DEFINED_glMultTransposeMatrixf\r
+  void __stdcall GLee_Lazy_glMultTransposeMatrixf(const GLfloat * m)  {if (GLeeInit()) glMultTransposeMatrixf(m);}\r
+  GLEEPFNGLMULTTRANSPOSEMATRIXFPROC GLeeFuncPtr_glMultTransposeMatrixf=GLee_Lazy_glMultTransposeMatrixf;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultTransposeMatrixd\r
+#define GLEE_C_DEFINED_glMultTransposeMatrixd\r
+  void __stdcall GLee_Lazy_glMultTransposeMatrixd(const GLdouble * m)  {if (GLeeInit()) glMultTransposeMatrixd(m);}\r
+  GLEEPFNGLMULTTRANSPOSEMATRIXDPROC GLeeFuncPtr_glMultTransposeMatrixd=GLee_Lazy_glMultTransposeMatrixd;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glSampleCoverage\r
+#define GLEE_C_DEFINED_glSampleCoverage\r
+  void __stdcall GLee_Lazy_glSampleCoverage(GLclampf value, GLboolean invert)  {if (GLeeInit()) glSampleCoverage(value, invert);}\r
+  GLEEPFNGLSAMPLECOVERAGEPROC GLeeFuncPtr_glSampleCoverage=GLee_Lazy_glSampleCoverage;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glCompressedTexImage3D\r
+#define GLEE_C_DEFINED_glCompressedTexImage3D\r
+  void __stdcall GLee_Lazy_glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid * data)  {if (GLeeInit()) glCompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data);}\r
+  GLEEPFNGLCOMPRESSEDTEXIMAGE3DPROC GLeeFuncPtr_glCompressedTexImage3D=GLee_Lazy_glCompressedTexImage3D;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glCompressedTexImage2D\r
+#define GLEE_C_DEFINED_glCompressedTexImage2D\r
+  void __stdcall GLee_Lazy_glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid * data)  {if (GLeeInit()) glCompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);}\r
+  GLEEPFNGLCOMPRESSEDTEXIMAGE2DPROC GLeeFuncPtr_glCompressedTexImage2D=GLee_Lazy_glCompressedTexImage2D;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glCompressedTexImage1D\r
+#define GLEE_C_DEFINED_glCompressedTexImage1D\r
+  void __stdcall GLee_Lazy_glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid * data)  {if (GLeeInit()) glCompressedTexImage1D(target, level, internalformat, width, border, imageSize, data);}\r
+  GLEEPFNGLCOMPRESSEDTEXIMAGE1DPROC GLeeFuncPtr_glCompressedTexImage1D=GLee_Lazy_glCompressedTexImage1D;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glCompressedTexSubImage3D\r
+#define GLEE_C_DEFINED_glCompressedTexSubImage3D\r
+  void __stdcall GLee_Lazy_glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid * data)  {if (GLeeInit()) glCompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);}\r
+  GLEEPFNGLCOMPRESSEDTEXSUBIMAGE3DPROC GLeeFuncPtr_glCompressedTexSubImage3D=GLee_Lazy_glCompressedTexSubImage3D;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glCompressedTexSubImage2D\r
+#define GLEE_C_DEFINED_glCompressedTexSubImage2D\r
+  void __stdcall GLee_Lazy_glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid * data)  {if (GLeeInit()) glCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);}\r
+  GLEEPFNGLCOMPRESSEDTEXSUBIMAGE2DPROC GLeeFuncPtr_glCompressedTexSubImage2D=GLee_Lazy_glCompressedTexSubImage2D;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glCompressedTexSubImage1D\r
+#define GLEE_C_DEFINED_glCompressedTexSubImage1D\r
+  void __stdcall GLee_Lazy_glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid * data)  {if (GLeeInit()) glCompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data);}\r
+  GLEEPFNGLCOMPRESSEDTEXSUBIMAGE1DPROC GLeeFuncPtr_glCompressedTexSubImage1D=GLee_Lazy_glCompressedTexSubImage1D;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetCompressedTexImage\r
+#define GLEE_C_DEFINED_glGetCompressedTexImage\r
+  void __stdcall GLee_Lazy_glGetCompressedTexImage(GLenum target, GLint level, GLvoid * img)  {if (GLeeInit()) glGetCompressedTexImage(target, level, img);}\r
+  GLEEPFNGLGETCOMPRESSEDTEXIMAGEPROC GLeeFuncPtr_glGetCompressedTexImage=GLee_Lazy_glGetCompressedTexImage;\r
+#endif\r
+#endif \r
+\r
+/* GL_VERSION_1_4 */\r
+\r
+#ifdef __GLEE_GL_VERSION_1_4\r
+#ifndef GLEE_C_DEFINED_glBlendFuncSeparate\r
+#define GLEE_C_DEFINED_glBlendFuncSeparate\r
+  void __stdcall GLee_Lazy_glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha)  {if (GLeeInit()) glBlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);}\r
+  GLEEPFNGLBLENDFUNCSEPARATEPROC GLeeFuncPtr_glBlendFuncSeparate=GLee_Lazy_glBlendFuncSeparate;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFogCoordf\r
+#define GLEE_C_DEFINED_glFogCoordf\r
+  void __stdcall GLee_Lazy_glFogCoordf(GLfloat coord)  {if (GLeeInit()) glFogCoordf(coord);}\r
+  GLEEPFNGLFOGCOORDFPROC GLeeFuncPtr_glFogCoordf=GLee_Lazy_glFogCoordf;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFogCoordfv\r
+#define GLEE_C_DEFINED_glFogCoordfv\r
+  void __stdcall GLee_Lazy_glFogCoordfv(const GLfloat * coord)  {if (GLeeInit()) glFogCoordfv(coord);}\r
+  GLEEPFNGLFOGCOORDFVPROC GLeeFuncPtr_glFogCoordfv=GLee_Lazy_glFogCoordfv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFogCoordd\r
+#define GLEE_C_DEFINED_glFogCoordd\r
+  void __stdcall GLee_Lazy_glFogCoordd(GLdouble coord)  {if (GLeeInit()) glFogCoordd(coord);}\r
+  GLEEPFNGLFOGCOORDDPROC GLeeFuncPtr_glFogCoordd=GLee_Lazy_glFogCoordd;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFogCoorddv\r
+#define GLEE_C_DEFINED_glFogCoorddv\r
+  void __stdcall GLee_Lazy_glFogCoorddv(const GLdouble * coord)  {if (GLeeInit()) glFogCoorddv(coord);}\r
+  GLEEPFNGLFOGCOORDDVPROC GLeeFuncPtr_glFogCoorddv=GLee_Lazy_glFogCoorddv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFogCoordPointer\r
+#define GLEE_C_DEFINED_glFogCoordPointer\r
+  void __stdcall GLee_Lazy_glFogCoordPointer(GLenum type, GLsizei stride, const GLvoid * pointer)  {if (GLeeInit()) glFogCoordPointer(type, stride, pointer);}\r
+  GLEEPFNGLFOGCOORDPOINTERPROC GLeeFuncPtr_glFogCoordPointer=GLee_Lazy_glFogCoordPointer;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiDrawArrays\r
+#define GLEE_C_DEFINED_glMultiDrawArrays\r
+  void __stdcall GLee_Lazy_glMultiDrawArrays(GLenum mode, GLint * first, GLsizei * count, GLsizei primcount)  {if (GLeeInit()) glMultiDrawArrays(mode, first, count, primcount);}\r
+  GLEEPFNGLMULTIDRAWARRAYSPROC GLeeFuncPtr_glMultiDrawArrays=GLee_Lazy_glMultiDrawArrays;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiDrawElements\r
+#define GLEE_C_DEFINED_glMultiDrawElements\r
+  void __stdcall GLee_Lazy_glMultiDrawElements(GLenum mode, const GLsizei * count, GLenum type, const GLvoid* * indices, GLsizei primcount)  {if (GLeeInit()) glMultiDrawElements(mode, count, type, indices, primcount);}\r
+  GLEEPFNGLMULTIDRAWELEMENTSPROC GLeeFuncPtr_glMultiDrawElements=GLee_Lazy_glMultiDrawElements;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glPointParameterf\r
+#define GLEE_C_DEFINED_glPointParameterf\r
+  void __stdcall GLee_Lazy_glPointParameterf(GLenum pname, GLfloat param)  {if (GLeeInit()) glPointParameterf(pname, param);}\r
+  GLEEPFNGLPOINTPARAMETERFPROC GLeeFuncPtr_glPointParameterf=GLee_Lazy_glPointParameterf;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glPointParameterfv\r
+#define GLEE_C_DEFINED_glPointParameterfv\r
+  void __stdcall GLee_Lazy_glPointParameterfv(GLenum pname, const GLfloat * params)  {if (GLeeInit()) glPointParameterfv(pname, params);}\r
+  GLEEPFNGLPOINTPARAMETERFVPROC GLeeFuncPtr_glPointParameterfv=GLee_Lazy_glPointParameterfv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glPointParameteri\r
+#define GLEE_C_DEFINED_glPointParameteri\r
+  void __stdcall GLee_Lazy_glPointParameteri(GLenum pname, GLint param)  {if (GLeeInit()) glPointParameteri(pname, param);}\r
+  GLEEPFNGLPOINTPARAMETERIPROC GLeeFuncPtr_glPointParameteri=GLee_Lazy_glPointParameteri;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glPointParameteriv\r
+#define GLEE_C_DEFINED_glPointParameteriv\r
+  void __stdcall GLee_Lazy_glPointParameteriv(GLenum pname, const GLint * params)  {if (GLeeInit()) glPointParameteriv(pname, params);}\r
+  GLEEPFNGLPOINTPARAMETERIVPROC GLeeFuncPtr_glPointParameteriv=GLee_Lazy_glPointParameteriv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glSecondaryColor3b\r
+#define GLEE_C_DEFINED_glSecondaryColor3b\r
+  void __stdcall GLee_Lazy_glSecondaryColor3b(GLbyte red, GLbyte green, GLbyte blue)  {if (GLeeInit()) glSecondaryColor3b(red, green, blue);}\r
+  GLEEPFNGLSECONDARYCOLOR3BPROC GLeeFuncPtr_glSecondaryColor3b=GLee_Lazy_glSecondaryColor3b;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glSecondaryColor3bv\r
+#define GLEE_C_DEFINED_glSecondaryColor3bv\r
+  void __stdcall GLee_Lazy_glSecondaryColor3bv(const GLbyte * v)  {if (GLeeInit()) glSecondaryColor3bv(v);}\r
+  GLEEPFNGLSECONDARYCOLOR3BVPROC GLeeFuncPtr_glSecondaryColor3bv=GLee_Lazy_glSecondaryColor3bv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glSecondaryColor3d\r
+#define GLEE_C_DEFINED_glSecondaryColor3d\r
+  void __stdcall GLee_Lazy_glSecondaryColor3d(GLdouble red, GLdouble green, GLdouble blue)  {if (GLeeInit()) glSecondaryColor3d(red, green, blue);}\r
+  GLEEPFNGLSECONDARYCOLOR3DPROC GLeeFuncPtr_glSecondaryColor3d=GLee_Lazy_glSecondaryColor3d;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glSecondaryColor3dv\r
+#define GLEE_C_DEFINED_glSecondaryColor3dv\r
+  void __stdcall GLee_Lazy_glSecondaryColor3dv(const GLdouble * v)  {if (GLeeInit()) glSecondaryColor3dv(v);}\r
+  GLEEPFNGLSECONDARYCOLOR3DVPROC GLeeFuncPtr_glSecondaryColor3dv=GLee_Lazy_glSecondaryColor3dv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glSecondaryColor3f\r
+#define GLEE_C_DEFINED_glSecondaryColor3f\r
+  void __stdcall GLee_Lazy_glSecondaryColor3f(GLfloat red, GLfloat green, GLfloat blue)  {if (GLeeInit()) glSecondaryColor3f(red, green, blue);}\r
+  GLEEPFNGLSECONDARYCOLOR3FPROC GLeeFuncPtr_glSecondaryColor3f=GLee_Lazy_glSecondaryColor3f;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glSecondaryColor3fv\r
+#define GLEE_C_DEFINED_glSecondaryColor3fv\r
+  void __stdcall GLee_Lazy_glSecondaryColor3fv(const GLfloat * v)  {if (GLeeInit()) glSecondaryColor3fv(v);}\r
+  GLEEPFNGLSECONDARYCOLOR3FVPROC GLeeFuncPtr_glSecondaryColor3fv=GLee_Lazy_glSecondaryColor3fv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glSecondaryColor3i\r
+#define GLEE_C_DEFINED_glSecondaryColor3i\r
+  void __stdcall GLee_Lazy_glSecondaryColor3i(GLint red, GLint green, GLint blue)  {if (GLeeInit()) glSecondaryColor3i(red, green, blue);}\r
+  GLEEPFNGLSECONDARYCOLOR3IPROC GLeeFuncPtr_glSecondaryColor3i=GLee_Lazy_glSecondaryColor3i;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glSecondaryColor3iv\r
+#define GLEE_C_DEFINED_glSecondaryColor3iv\r
+  void __stdcall GLee_Lazy_glSecondaryColor3iv(const GLint * v)  {if (GLeeInit()) glSecondaryColor3iv(v);}\r
+  GLEEPFNGLSECONDARYCOLOR3IVPROC GLeeFuncPtr_glSecondaryColor3iv=GLee_Lazy_glSecondaryColor3iv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glSecondaryColor3s\r
+#define GLEE_C_DEFINED_glSecondaryColor3s\r
+  void __stdcall GLee_Lazy_glSecondaryColor3s(GLshort red, GLshort green, GLshort blue)  {if (GLeeInit()) glSecondaryColor3s(red, green, blue);}\r
+  GLEEPFNGLSECONDARYCOLOR3SPROC GLeeFuncPtr_glSecondaryColor3s=GLee_Lazy_glSecondaryColor3s;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glSecondaryColor3sv\r
+#define GLEE_C_DEFINED_glSecondaryColor3sv\r
+  void __stdcall GLee_Lazy_glSecondaryColor3sv(const GLshort * v)  {if (GLeeInit()) glSecondaryColor3sv(v);}\r
+  GLEEPFNGLSECONDARYCOLOR3SVPROC GLeeFuncPtr_glSecondaryColor3sv=GLee_Lazy_glSecondaryColor3sv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glSecondaryColor3ub\r
+#define GLEE_C_DEFINED_glSecondaryColor3ub\r
+  void __stdcall GLee_Lazy_glSecondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue)  {if (GLeeInit()) glSecondaryColor3ub(red, green, blue);}\r
+  GLEEPFNGLSECONDARYCOLOR3UBPROC GLeeFuncPtr_glSecondaryColor3ub=GLee_Lazy_glSecondaryColor3ub;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glSecondaryColor3ubv\r
+#define GLEE_C_DEFINED_glSecondaryColor3ubv\r
+  void __stdcall GLee_Lazy_glSecondaryColor3ubv(const GLubyte * v)  {if (GLeeInit()) glSecondaryColor3ubv(v);}\r
+  GLEEPFNGLSECONDARYCOLOR3UBVPROC GLeeFuncPtr_glSecondaryColor3ubv=GLee_Lazy_glSecondaryColor3ubv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glSecondaryColor3ui\r
+#define GLEE_C_DEFINED_glSecondaryColor3ui\r
+  void __stdcall GLee_Lazy_glSecondaryColor3ui(GLuint red, GLuint green, GLuint blue)  {if (GLeeInit()) glSecondaryColor3ui(red, green, blue);}\r
+  GLEEPFNGLSECONDARYCOLOR3UIPROC GLeeFuncPtr_glSecondaryColor3ui=GLee_Lazy_glSecondaryColor3ui;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glSecondaryColor3uiv\r
+#define GLEE_C_DEFINED_glSecondaryColor3uiv\r
+  void __stdcall GLee_Lazy_glSecondaryColor3uiv(const GLuint * v)  {if (GLeeInit()) glSecondaryColor3uiv(v);}\r
+  GLEEPFNGLSECONDARYCOLOR3UIVPROC GLeeFuncPtr_glSecondaryColor3uiv=GLee_Lazy_glSecondaryColor3uiv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glSecondaryColor3us\r
+#define GLEE_C_DEFINED_glSecondaryColor3us\r
+  void __stdcall GLee_Lazy_glSecondaryColor3us(GLushort red, GLushort green, GLushort blue)  {if (GLeeInit()) glSecondaryColor3us(red, green, blue);}\r
+  GLEEPFNGLSECONDARYCOLOR3USPROC GLeeFuncPtr_glSecondaryColor3us=GLee_Lazy_glSecondaryColor3us;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glSecondaryColor3usv\r
+#define GLEE_C_DEFINED_glSecondaryColor3usv\r
+  void __stdcall GLee_Lazy_glSecondaryColor3usv(const GLushort * v)  {if (GLeeInit()) glSecondaryColor3usv(v);}\r
+  GLEEPFNGLSECONDARYCOLOR3USVPROC GLeeFuncPtr_glSecondaryColor3usv=GLee_Lazy_glSecondaryColor3usv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glSecondaryColorPointer\r
+#define GLEE_C_DEFINED_glSecondaryColorPointer\r
+  void __stdcall GLee_Lazy_glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid * pointer)  {if (GLeeInit()) glSecondaryColorPointer(size, type, stride, pointer);}\r
+  GLEEPFNGLSECONDARYCOLORPOINTERPROC GLeeFuncPtr_glSecondaryColorPointer=GLee_Lazy_glSecondaryColorPointer;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glWindowPos2d\r
+#define GLEE_C_DEFINED_glWindowPos2d\r
+  void __stdcall GLee_Lazy_glWindowPos2d(GLdouble x, GLdouble y)  {if (GLeeInit()) glWindowPos2d(x, y);}\r
+  GLEEPFNGLWINDOWPOS2DPROC GLeeFuncPtr_glWindowPos2d=GLee_Lazy_glWindowPos2d;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glWindowPos2dv\r
+#define GLEE_C_DEFINED_glWindowPos2dv\r
+  void __stdcall GLee_Lazy_glWindowPos2dv(const GLdouble * v)  {if (GLeeInit()) glWindowPos2dv(v);}\r
+  GLEEPFNGLWINDOWPOS2DVPROC GLeeFuncPtr_glWindowPos2dv=GLee_Lazy_glWindowPos2dv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glWindowPos2f\r
+#define GLEE_C_DEFINED_glWindowPos2f\r
+  void __stdcall GLee_Lazy_glWindowPos2f(GLfloat x, GLfloat y)  {if (GLeeInit()) glWindowPos2f(x, y);}\r
+  GLEEPFNGLWINDOWPOS2FPROC GLeeFuncPtr_glWindowPos2f=GLee_Lazy_glWindowPos2f;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glWindowPos2fv\r
+#define GLEE_C_DEFINED_glWindowPos2fv\r
+  void __stdcall GLee_Lazy_glWindowPos2fv(const GLfloat * v)  {if (GLeeInit()) glWindowPos2fv(v);}\r
+  GLEEPFNGLWINDOWPOS2FVPROC GLeeFuncPtr_glWindowPos2fv=GLee_Lazy_glWindowPos2fv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glWindowPos2i\r
+#define GLEE_C_DEFINED_glWindowPos2i\r
+  void __stdcall GLee_Lazy_glWindowPos2i(GLint x, GLint y)  {if (GLeeInit()) glWindowPos2i(x, y);}\r
+  GLEEPFNGLWINDOWPOS2IPROC GLeeFuncPtr_glWindowPos2i=GLee_Lazy_glWindowPos2i;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glWindowPos2iv\r
+#define GLEE_C_DEFINED_glWindowPos2iv\r
+  void __stdcall GLee_Lazy_glWindowPos2iv(const GLint * v)  {if (GLeeInit()) glWindowPos2iv(v);}\r
+  GLEEPFNGLWINDOWPOS2IVPROC GLeeFuncPtr_glWindowPos2iv=GLee_Lazy_glWindowPos2iv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glWindowPos2s\r
+#define GLEE_C_DEFINED_glWindowPos2s\r
+  void __stdcall GLee_Lazy_glWindowPos2s(GLshort x, GLshort y)  {if (GLeeInit()) glWindowPos2s(x, y);}\r
+  GLEEPFNGLWINDOWPOS2SPROC GLeeFuncPtr_glWindowPos2s=GLee_Lazy_glWindowPos2s;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glWindowPos2sv\r
+#define GLEE_C_DEFINED_glWindowPos2sv\r
+  void __stdcall GLee_Lazy_glWindowPos2sv(const GLshort * v)  {if (GLeeInit()) glWindowPos2sv(v);}\r
+  GLEEPFNGLWINDOWPOS2SVPROC GLeeFuncPtr_glWindowPos2sv=GLee_Lazy_glWindowPos2sv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glWindowPos3d\r
+#define GLEE_C_DEFINED_glWindowPos3d\r
+  void __stdcall GLee_Lazy_glWindowPos3d(GLdouble x, GLdouble y, GLdouble z)  {if (GLeeInit()) glWindowPos3d(x, y, z);}\r
+  GLEEPFNGLWINDOWPOS3DPROC GLeeFuncPtr_glWindowPos3d=GLee_Lazy_glWindowPos3d;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glWindowPos3dv\r
+#define GLEE_C_DEFINED_glWindowPos3dv\r
+  void __stdcall GLee_Lazy_glWindowPos3dv(const GLdouble * v)  {if (GLeeInit()) glWindowPos3dv(v);}\r
+  GLEEPFNGLWINDOWPOS3DVPROC GLeeFuncPtr_glWindowPos3dv=GLee_Lazy_glWindowPos3dv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glWindowPos3f\r
+#define GLEE_C_DEFINED_glWindowPos3f\r
+  void __stdcall GLee_Lazy_glWindowPos3f(GLfloat x, GLfloat y, GLfloat z)  {if (GLeeInit()) glWindowPos3f(x, y, z);}\r
+  GLEEPFNGLWINDOWPOS3FPROC GLeeFuncPtr_glWindowPos3f=GLee_Lazy_glWindowPos3f;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glWindowPos3fv\r
+#define GLEE_C_DEFINED_glWindowPos3fv\r
+  void __stdcall GLee_Lazy_glWindowPos3fv(const GLfloat * v)  {if (GLeeInit()) glWindowPos3fv(v);}\r
+  GLEEPFNGLWINDOWPOS3FVPROC GLeeFuncPtr_glWindowPos3fv=GLee_Lazy_glWindowPos3fv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glWindowPos3i\r
+#define GLEE_C_DEFINED_glWindowPos3i\r
+  void __stdcall GLee_Lazy_glWindowPos3i(GLint x, GLint y, GLint z)  {if (GLeeInit()) glWindowPos3i(x, y, z);}\r
+  GLEEPFNGLWINDOWPOS3IPROC GLeeFuncPtr_glWindowPos3i=GLee_Lazy_glWindowPos3i;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glWindowPos3iv\r
+#define GLEE_C_DEFINED_glWindowPos3iv\r
+  void __stdcall GLee_Lazy_glWindowPos3iv(const GLint * v)  {if (GLeeInit()) glWindowPos3iv(v);}\r
+  GLEEPFNGLWINDOWPOS3IVPROC GLeeFuncPtr_glWindowPos3iv=GLee_Lazy_glWindowPos3iv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glWindowPos3s\r
+#define GLEE_C_DEFINED_glWindowPos3s\r
+  void __stdcall GLee_Lazy_glWindowPos3s(GLshort x, GLshort y, GLshort z)  {if (GLeeInit()) glWindowPos3s(x, y, z);}\r
+  GLEEPFNGLWINDOWPOS3SPROC GLeeFuncPtr_glWindowPos3s=GLee_Lazy_glWindowPos3s;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glWindowPos3sv\r
+#define GLEE_C_DEFINED_glWindowPos3sv\r
+  void __stdcall GLee_Lazy_glWindowPos3sv(const GLshort * v)  {if (GLeeInit()) glWindowPos3sv(v);}\r
+  GLEEPFNGLWINDOWPOS3SVPROC GLeeFuncPtr_glWindowPos3sv=GLee_Lazy_glWindowPos3sv;\r
+#endif\r
+#endif \r
+\r
+/* GL_VERSION_1_5 */\r
+\r
+#ifdef __GLEE_GL_VERSION_1_5\r
+#ifndef GLEE_C_DEFINED_glGenQueries\r
+#define GLEE_C_DEFINED_glGenQueries\r
+  void __stdcall GLee_Lazy_glGenQueries(GLsizei n, GLuint * ids)  {if (GLeeInit()) glGenQueries(n, ids);}\r
+  GLEEPFNGLGENQUERIESPROC GLeeFuncPtr_glGenQueries=GLee_Lazy_glGenQueries;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glDeleteQueries\r
+#define GLEE_C_DEFINED_glDeleteQueries\r
+  void __stdcall GLee_Lazy_glDeleteQueries(GLsizei n, const GLuint * ids)  {if (GLeeInit()) glDeleteQueries(n, ids);}\r
+  GLEEPFNGLDELETEQUERIESPROC GLeeFuncPtr_glDeleteQueries=GLee_Lazy_glDeleteQueries;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glIsQuery\r
+#define GLEE_C_DEFINED_glIsQuery\r
+  GLboolean __stdcall GLee_Lazy_glIsQuery(GLuint id)  {if (GLeeInit()) return glIsQuery(id); return (GLboolean)0;}\r
+  GLEEPFNGLISQUERYPROC GLeeFuncPtr_glIsQuery=GLee_Lazy_glIsQuery;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glBeginQuery\r
+#define GLEE_C_DEFINED_glBeginQuery\r
+  void __stdcall GLee_Lazy_glBeginQuery(GLenum target, GLuint id)  {if (GLeeInit()) glBeginQuery(target, id);}\r
+  GLEEPFNGLBEGINQUERYPROC GLeeFuncPtr_glBeginQuery=GLee_Lazy_glBeginQuery;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glEndQuery\r
+#define GLEE_C_DEFINED_glEndQuery\r
+  void __stdcall GLee_Lazy_glEndQuery(GLenum target)  {if (GLeeInit()) glEndQuery(target);}\r
+  GLEEPFNGLENDQUERYPROC GLeeFuncPtr_glEndQuery=GLee_Lazy_glEndQuery;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetQueryiv\r
+#define GLEE_C_DEFINED_glGetQueryiv\r
+  void __stdcall GLee_Lazy_glGetQueryiv(GLenum target, GLenum pname, GLint * params)  {if (GLeeInit()) glGetQueryiv(target, pname, params);}\r
+  GLEEPFNGLGETQUERYIVPROC GLeeFuncPtr_glGetQueryiv=GLee_Lazy_glGetQueryiv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetQueryObjectiv\r
+#define GLEE_C_DEFINED_glGetQueryObjectiv\r
+  void __stdcall GLee_Lazy_glGetQueryObjectiv(GLuint id, GLenum pname, GLint * params)  {if (GLeeInit()) glGetQueryObjectiv(id, pname, params);}\r
+  GLEEPFNGLGETQUERYOBJECTIVPROC GLeeFuncPtr_glGetQueryObjectiv=GLee_Lazy_glGetQueryObjectiv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetQueryObjectuiv\r
+#define GLEE_C_DEFINED_glGetQueryObjectuiv\r
+  void __stdcall GLee_Lazy_glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint * params)  {if (GLeeInit()) glGetQueryObjectuiv(id, pname, params);}\r
+  GLEEPFNGLGETQUERYOBJECTUIVPROC GLeeFuncPtr_glGetQueryObjectuiv=GLee_Lazy_glGetQueryObjectuiv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glBindBuffer\r
+#define GLEE_C_DEFINED_glBindBuffer\r
+  void __stdcall GLee_Lazy_glBindBuffer(GLenum target, GLuint buffer)  {if (GLeeInit()) glBindBuffer(target, buffer);}\r
+  GLEEPFNGLBINDBUFFERPROC GLeeFuncPtr_glBindBuffer=GLee_Lazy_glBindBuffer;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glDeleteBuffers\r
+#define GLEE_C_DEFINED_glDeleteBuffers\r
+  void __stdcall GLee_Lazy_glDeleteBuffers(GLsizei n, const GLuint * buffers)  {if (GLeeInit()) glDeleteBuffers(n, buffers);}\r
+  GLEEPFNGLDELETEBUFFERSPROC GLeeFuncPtr_glDeleteBuffers=GLee_Lazy_glDeleteBuffers;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGenBuffers\r
+#define GLEE_C_DEFINED_glGenBuffers\r
+  void __stdcall GLee_Lazy_glGenBuffers(GLsizei n, GLuint * buffers)  {if (GLeeInit()) glGenBuffers(n, buffers);}\r
+  GLEEPFNGLGENBUFFERSPROC GLeeFuncPtr_glGenBuffers=GLee_Lazy_glGenBuffers;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glIsBuffer\r
+#define GLEE_C_DEFINED_glIsBuffer\r
+  GLboolean __stdcall GLee_Lazy_glIsBuffer(GLuint buffer)  {if (GLeeInit()) return glIsBuffer(buffer); return (GLboolean)0;}\r
+  GLEEPFNGLISBUFFERPROC GLeeFuncPtr_glIsBuffer=GLee_Lazy_glIsBuffer;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glBufferData\r
+#define GLEE_C_DEFINED_glBufferData\r
+  void __stdcall GLee_Lazy_glBufferData(GLenum target, GLsizeiptr size, const GLvoid * data, GLenum usage)  {if (GLeeInit()) glBufferData(target, size, data, usage);}\r
+  GLEEPFNGLBUFFERDATAPROC GLeeFuncPtr_glBufferData=GLee_Lazy_glBufferData;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glBufferSubData\r
+#define GLEE_C_DEFINED_glBufferSubData\r
+  void __stdcall GLee_Lazy_glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid * data)  {if (GLeeInit()) glBufferSubData(target, offset, size, data);}\r
+  GLEEPFNGLBUFFERSUBDATAPROC GLeeFuncPtr_glBufferSubData=GLee_Lazy_glBufferSubData;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetBufferSubData\r
+#define GLEE_C_DEFINED_glGetBufferSubData\r
+  void __stdcall GLee_Lazy_glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid * data)  {if (GLeeInit()) glGetBufferSubData(target, offset, size, data);}\r
+  GLEEPFNGLGETBUFFERSUBDATAPROC GLeeFuncPtr_glGetBufferSubData=GLee_Lazy_glGetBufferSubData;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMapBuffer\r
+#define GLEE_C_DEFINED_glMapBuffer\r
+  GLvoid* __stdcall GLee_Lazy_glMapBuffer(GLenum target, GLenum access)  {if (GLeeInit()) return glMapBuffer(target, access); return (GLvoid*)0;}\r
+  GLEEPFNGLMAPBUFFERPROC GLeeFuncPtr_glMapBuffer=GLee_Lazy_glMapBuffer;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUnmapBuffer\r
+#define GLEE_C_DEFINED_glUnmapBuffer\r
+  GLboolean __stdcall GLee_Lazy_glUnmapBuffer(GLenum target)  {if (GLeeInit()) return glUnmapBuffer(target); return (GLboolean)0;}\r
+  GLEEPFNGLUNMAPBUFFERPROC GLeeFuncPtr_glUnmapBuffer=GLee_Lazy_glUnmapBuffer;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetBufferParameteriv\r
+#define GLEE_C_DEFINED_glGetBufferParameteriv\r
+  void __stdcall GLee_Lazy_glGetBufferParameteriv(GLenum target, GLenum pname, GLint * params)  {if (GLeeInit()) glGetBufferParameteriv(target, pname, params);}\r
+  GLEEPFNGLGETBUFFERPARAMETERIVPROC GLeeFuncPtr_glGetBufferParameteriv=GLee_Lazy_glGetBufferParameteriv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetBufferPointerv\r
+#define GLEE_C_DEFINED_glGetBufferPointerv\r
+  void __stdcall GLee_Lazy_glGetBufferPointerv(GLenum target, GLenum pname, GLvoid* * params)  {if (GLeeInit()) glGetBufferPointerv(target, pname, params);}\r
+  GLEEPFNGLGETBUFFERPOINTERVPROC GLeeFuncPtr_glGetBufferPointerv=GLee_Lazy_glGetBufferPointerv;\r
+#endif\r
+#endif \r
+\r
+/* GL_VERSION_2_0 */\r
+\r
+#ifdef __GLEE_GL_VERSION_2_0\r
+#ifndef GLEE_C_DEFINED_glBlendEquationSeparate\r
+#define GLEE_C_DEFINED_glBlendEquationSeparate\r
+  void __stdcall GLee_Lazy_glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)  {if (GLeeInit()) glBlendEquationSeparate(modeRGB, modeAlpha);}\r
+  GLEEPFNGLBLENDEQUATIONSEPARATEPROC GLeeFuncPtr_glBlendEquationSeparate=GLee_Lazy_glBlendEquationSeparate;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glDrawBuffers\r
+#define GLEE_C_DEFINED_glDrawBuffers\r
+  void __stdcall GLee_Lazy_glDrawBuffers(GLsizei n, const GLenum * bufs)  {if (GLeeInit()) glDrawBuffers(n, bufs);}\r
+  GLEEPFNGLDRAWBUFFERSPROC GLeeFuncPtr_glDrawBuffers=GLee_Lazy_glDrawBuffers;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glStencilOpSeparate\r
+#define GLEE_C_DEFINED_glStencilOpSeparate\r
+  void __stdcall GLee_Lazy_glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass)  {if (GLeeInit()) glStencilOpSeparate(face, sfail, dpfail, dppass);}\r
+  GLEEPFNGLSTENCILOPSEPARATEPROC GLeeFuncPtr_glStencilOpSeparate=GLee_Lazy_glStencilOpSeparate;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glStencilFuncSeparate\r
+#define GLEE_C_DEFINED_glStencilFuncSeparate\r
+  void __stdcall GLee_Lazy_glStencilFuncSeparate(GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask)  {if (GLeeInit()) glStencilFuncSeparate(frontfunc, backfunc, ref, mask);}\r
+  GLEEPFNGLSTENCILFUNCSEPARATEPROC GLeeFuncPtr_glStencilFuncSeparate=GLee_Lazy_glStencilFuncSeparate;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glStencilMaskSeparate\r
+#define GLEE_C_DEFINED_glStencilMaskSeparate\r
+  void __stdcall GLee_Lazy_glStencilMaskSeparate(GLenum face, GLuint mask)  {if (GLeeInit()) glStencilMaskSeparate(face, mask);}\r
+  GLEEPFNGLSTENCILMASKSEPARATEPROC GLeeFuncPtr_glStencilMaskSeparate=GLee_Lazy_glStencilMaskSeparate;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glAttachShader\r
+#define GLEE_C_DEFINED_glAttachShader\r
+  void __stdcall GLee_Lazy_glAttachShader(GLuint program, GLuint shader)  {if (GLeeInit()) glAttachShader(program, shader);}\r
+  GLEEPFNGLATTACHSHADERPROC GLeeFuncPtr_glAttachShader=GLee_Lazy_glAttachShader;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glBindAttribLocation\r
+#define GLEE_C_DEFINED_glBindAttribLocation\r
+  void __stdcall GLee_Lazy_glBindAttribLocation(GLuint program, GLuint index, const GLchar * name)  {if (GLeeInit()) glBindAttribLocation(program, index, name);}\r
+  GLEEPFNGLBINDATTRIBLOCATIONPROC GLeeFuncPtr_glBindAttribLocation=GLee_Lazy_glBindAttribLocation;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glCompileShader\r
+#define GLEE_C_DEFINED_glCompileShader\r
+  void __stdcall GLee_Lazy_glCompileShader(GLuint shader)  {if (GLeeInit()) glCompileShader(shader);}\r
+  GLEEPFNGLCOMPILESHADERPROC GLeeFuncPtr_glCompileShader=GLee_Lazy_glCompileShader;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glCreateProgram\r
+#define GLEE_C_DEFINED_glCreateProgram\r
+  GLuint __stdcall GLee_Lazy_glCreateProgram(void)  {if (GLeeInit()) return glCreateProgram(); return (GLuint)0;}\r
+  GLEEPFNGLCREATEPROGRAMPROC GLeeFuncPtr_glCreateProgram=GLee_Lazy_glCreateProgram;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glCreateShader\r
+#define GLEE_C_DEFINED_glCreateShader\r
+  GLuint __stdcall GLee_Lazy_glCreateShader(GLenum type)  {if (GLeeInit()) return glCreateShader(type); return (GLuint)0;}\r
+  GLEEPFNGLCREATESHADERPROC GLeeFuncPtr_glCreateShader=GLee_Lazy_glCreateShader;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glDeleteProgram\r
+#define GLEE_C_DEFINED_glDeleteProgram\r
+  void __stdcall GLee_Lazy_glDeleteProgram(GLuint program)  {if (GLeeInit()) glDeleteProgram(program);}\r
+  GLEEPFNGLDELETEPROGRAMPROC GLeeFuncPtr_glDeleteProgram=GLee_Lazy_glDeleteProgram;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glDeleteShader\r
+#define GLEE_C_DEFINED_glDeleteShader\r
+  void __stdcall GLee_Lazy_glDeleteShader(GLuint shader)  {if (GLeeInit()) glDeleteShader(shader);}\r
+  GLEEPFNGLDELETESHADERPROC GLeeFuncPtr_glDeleteShader=GLee_Lazy_glDeleteShader;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glDetachShader\r
+#define GLEE_C_DEFINED_glDetachShader\r
+  void __stdcall GLee_Lazy_glDetachShader(GLuint program, GLuint shader)  {if (GLeeInit()) glDetachShader(program, shader);}\r
+  GLEEPFNGLDETACHSHADERPROC GLeeFuncPtr_glDetachShader=GLee_Lazy_glDetachShader;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glDisableVertexAttribArray\r
+#define GLEE_C_DEFINED_glDisableVertexAttribArray\r
+  void __stdcall GLee_Lazy_glDisableVertexAttribArray(GLuint index)  {if (GLeeInit()) glDisableVertexAttribArray(index);}\r
+  GLEEPFNGLDISABLEVERTEXATTRIBARRAYPROC GLeeFuncPtr_glDisableVertexAttribArray=GLee_Lazy_glDisableVertexAttribArray;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glEnableVertexAttribArray\r
+#define GLEE_C_DEFINED_glEnableVertexAttribArray\r
+  void __stdcall GLee_Lazy_glEnableVertexAttribArray(GLuint index)  {if (GLeeInit()) glEnableVertexAttribArray(index);}\r
+  GLEEPFNGLENABLEVERTEXATTRIBARRAYPROC GLeeFuncPtr_glEnableVertexAttribArray=GLee_Lazy_glEnableVertexAttribArray;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetActiveAttrib\r
+#define GLEE_C_DEFINED_glGetActiveAttrib\r
+  void __stdcall GLee_Lazy_glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLint * size, GLenum * type, GLchar * name)  {if (GLeeInit()) glGetActiveAttrib(program, index, bufSize, length, size, type, name);}\r
+  GLEEPFNGLGETACTIVEATTRIBPROC GLeeFuncPtr_glGetActiveAttrib=GLee_Lazy_glGetActiveAttrib;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetActiveUniform\r
+#define GLEE_C_DEFINED_glGetActiveUniform\r
+  void __stdcall GLee_Lazy_glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLint * size, GLenum * type, GLchar * name)  {if (GLeeInit()) glGetActiveUniform(program, index, bufSize, length, size, type, name);}\r
+  GLEEPFNGLGETACTIVEUNIFORMPROC GLeeFuncPtr_glGetActiveUniform=GLee_Lazy_glGetActiveUniform;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetAttachedShaders\r
+#define GLEE_C_DEFINED_glGetAttachedShaders\r
+  void __stdcall GLee_Lazy_glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei * count, GLuint * obj)  {if (GLeeInit()) glGetAttachedShaders(program, maxCount, count, obj);}\r
+  GLEEPFNGLGETATTACHEDSHADERSPROC GLeeFuncPtr_glGetAttachedShaders=GLee_Lazy_glGetAttachedShaders;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetAttribLocation\r
+#define GLEE_C_DEFINED_glGetAttribLocation\r
+  GLint __stdcall GLee_Lazy_glGetAttribLocation(GLuint program, const GLchar * name)  {if (GLeeInit()) return glGetAttribLocation(program, name); return (GLint)0;}\r
+  GLEEPFNGLGETATTRIBLOCATIONPROC GLeeFuncPtr_glGetAttribLocation=GLee_Lazy_glGetAttribLocation;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetProgramiv\r
+#define GLEE_C_DEFINED_glGetProgramiv\r
+  void __stdcall GLee_Lazy_glGetProgramiv(GLuint program, GLenum pname, GLint * params)  {if (GLeeInit()) glGetProgramiv(program, pname, params);}\r
+  GLEEPFNGLGETPROGRAMIVPROC GLeeFuncPtr_glGetProgramiv=GLee_Lazy_glGetProgramiv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetProgramInfoLog\r
+#define GLEE_C_DEFINED_glGetProgramInfoLog\r
+  void __stdcall GLee_Lazy_glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei * length, GLchar * infoLog)  {if (GLeeInit()) glGetProgramInfoLog(program, bufSize, length, infoLog);}\r
+  GLEEPFNGLGETPROGRAMINFOLOGPROC GLeeFuncPtr_glGetProgramInfoLog=GLee_Lazy_glGetProgramInfoLog;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetShaderiv\r
+#define GLEE_C_DEFINED_glGetShaderiv\r
+  void __stdcall GLee_Lazy_glGetShaderiv(GLuint shader, GLenum pname, GLint * params)  {if (GLeeInit()) glGetShaderiv(shader, pname, params);}\r
+  GLEEPFNGLGETSHADERIVPROC GLeeFuncPtr_glGetShaderiv=GLee_Lazy_glGetShaderiv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetShaderInfoLog\r
+#define GLEE_C_DEFINED_glGetShaderInfoLog\r
+  void __stdcall GLee_Lazy_glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei * length, GLchar * infoLog)  {if (GLeeInit()) glGetShaderInfoLog(shader, bufSize, length, infoLog);}\r
+  GLEEPFNGLGETSHADERINFOLOGPROC GLeeFuncPtr_glGetShaderInfoLog=GLee_Lazy_glGetShaderInfoLog;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetShaderSource\r
+#define GLEE_C_DEFINED_glGetShaderSource\r
+  void __stdcall GLee_Lazy_glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei * length, GLchar * source)  {if (GLeeInit()) glGetShaderSource(shader, bufSize, length, source);}\r
+  GLEEPFNGLGETSHADERSOURCEPROC GLeeFuncPtr_glGetShaderSource=GLee_Lazy_glGetShaderSource;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetUniformLocation\r
+#define GLEE_C_DEFINED_glGetUniformLocation\r
+  GLint __stdcall GLee_Lazy_glGetUniformLocation(GLuint program, const GLchar * name)  {if (GLeeInit()) return glGetUniformLocation(program, name); return (GLint)0;}\r
+  GLEEPFNGLGETUNIFORMLOCATIONPROC GLeeFuncPtr_glGetUniformLocation=GLee_Lazy_glGetUniformLocation;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetUniformfv\r
+#define GLEE_C_DEFINED_glGetUniformfv\r
+  void __stdcall GLee_Lazy_glGetUniformfv(GLuint program, GLint location, GLfloat * params)  {if (GLeeInit()) glGetUniformfv(program, location, params);}\r
+  GLEEPFNGLGETUNIFORMFVPROC GLeeFuncPtr_glGetUniformfv=GLee_Lazy_glGetUniformfv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetUniformiv\r
+#define GLEE_C_DEFINED_glGetUniformiv\r
+  void __stdcall GLee_Lazy_glGetUniformiv(GLuint program, GLint location, GLint * params)  {if (GLeeInit()) glGetUniformiv(program, location, params);}\r
+  GLEEPFNGLGETUNIFORMIVPROC GLeeFuncPtr_glGetUniformiv=GLee_Lazy_glGetUniformiv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetVertexAttribdv\r
+#define GLEE_C_DEFINED_glGetVertexAttribdv\r
+  void __stdcall GLee_Lazy_glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble * params)  {if (GLeeInit()) glGetVertexAttribdv(index, pname, params);}\r
+  GLEEPFNGLGETVERTEXATTRIBDVPROC GLeeFuncPtr_glGetVertexAttribdv=GLee_Lazy_glGetVertexAttribdv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetVertexAttribfv\r
+#define GLEE_C_DEFINED_glGetVertexAttribfv\r
+  void __stdcall GLee_Lazy_glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat * params)  {if (GLeeInit()) glGetVertexAttribfv(index, pname, params);}\r
+  GLEEPFNGLGETVERTEXATTRIBFVPROC GLeeFuncPtr_glGetVertexAttribfv=GLee_Lazy_glGetVertexAttribfv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetVertexAttribiv\r
+#define GLEE_C_DEFINED_glGetVertexAttribiv\r
+  void __stdcall GLee_Lazy_glGetVertexAttribiv(GLuint index, GLenum pname, GLint * params)  {if (GLeeInit()) glGetVertexAttribiv(index, pname, params);}\r
+  GLEEPFNGLGETVERTEXATTRIBIVPROC GLeeFuncPtr_glGetVertexAttribiv=GLee_Lazy_glGetVertexAttribiv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetVertexAttribPointerv\r
+#define GLEE_C_DEFINED_glGetVertexAttribPointerv\r
+  void __stdcall GLee_Lazy_glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid* * pointer)  {if (GLeeInit()) glGetVertexAttribPointerv(index, pname, pointer);}\r
+  GLEEPFNGLGETVERTEXATTRIBPOINTERVPROC GLeeFuncPtr_glGetVertexAttribPointerv=GLee_Lazy_glGetVertexAttribPointerv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glIsProgram\r
+#define GLEE_C_DEFINED_glIsProgram\r
+  GLboolean __stdcall GLee_Lazy_glIsProgram(GLuint program)  {if (GLeeInit()) return glIsProgram(program); return (GLboolean)0;}\r
+  GLEEPFNGLISPROGRAMPROC GLeeFuncPtr_glIsProgram=GLee_Lazy_glIsProgram;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glIsShader\r
+#define GLEE_C_DEFINED_glIsShader\r
+  GLboolean __stdcall GLee_Lazy_glIsShader(GLuint shader)  {if (GLeeInit()) return glIsShader(shader); return (GLboolean)0;}\r
+  GLEEPFNGLISSHADERPROC GLeeFuncPtr_glIsShader=GLee_Lazy_glIsShader;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glLinkProgram\r
+#define GLEE_C_DEFINED_glLinkProgram\r
+  void __stdcall GLee_Lazy_glLinkProgram(GLuint program)  {if (GLeeInit()) glLinkProgram(program);}\r
+  GLEEPFNGLLINKPROGRAMPROC GLeeFuncPtr_glLinkProgram=GLee_Lazy_glLinkProgram;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glShaderSource\r
+#define GLEE_C_DEFINED_glShaderSource\r
+  void __stdcall GLee_Lazy_glShaderSource(GLuint shader, GLsizei count, const GLchar* * string, const GLint * length)  {if (GLeeInit()) glShaderSource(shader, count, string, length);}\r
+  GLEEPFNGLSHADERSOURCEPROC GLeeFuncPtr_glShaderSource=GLee_Lazy_glShaderSource;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUseProgram\r
+#define GLEE_C_DEFINED_glUseProgram\r
+  void __stdcall GLee_Lazy_glUseProgram(GLuint program)  {if (GLeeInit()) glUseProgram(program);}\r
+  GLEEPFNGLUSEPROGRAMPROC GLeeFuncPtr_glUseProgram=GLee_Lazy_glUseProgram;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUniform1f\r
+#define GLEE_C_DEFINED_glUniform1f\r
+  void __stdcall GLee_Lazy_glUniform1f(GLint location, GLfloat v0)  {if (GLeeInit()) glUniform1f(location, v0);}\r
+  GLEEPFNGLUNIFORM1FPROC GLeeFuncPtr_glUniform1f=GLee_Lazy_glUniform1f;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUniform2f\r
+#define GLEE_C_DEFINED_glUniform2f\r
+  void __stdcall GLee_Lazy_glUniform2f(GLint location, GLfloat v0, GLfloat v1)  {if (GLeeInit()) glUniform2f(location, v0, v1);}\r
+  GLEEPFNGLUNIFORM2FPROC GLeeFuncPtr_glUniform2f=GLee_Lazy_glUniform2f;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUniform3f\r
+#define GLEE_C_DEFINED_glUniform3f\r
+  void __stdcall GLee_Lazy_glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2)  {if (GLeeInit()) glUniform3f(location, v0, v1, v2);}\r
+  GLEEPFNGLUNIFORM3FPROC GLeeFuncPtr_glUniform3f=GLee_Lazy_glUniform3f;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUniform4f\r
+#define GLEE_C_DEFINED_glUniform4f\r
+  void __stdcall GLee_Lazy_glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)  {if (GLeeInit()) glUniform4f(location, v0, v1, v2, v3);}\r
+  GLEEPFNGLUNIFORM4FPROC GLeeFuncPtr_glUniform4f=GLee_Lazy_glUniform4f;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUniform1i\r
+#define GLEE_C_DEFINED_glUniform1i\r
+  void __stdcall GLee_Lazy_glUniform1i(GLint location, GLint v0)  {if (GLeeInit()) glUniform1i(location, v0);}\r
+  GLEEPFNGLUNIFORM1IPROC GLeeFuncPtr_glUniform1i=GLee_Lazy_glUniform1i;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUniform2i\r
+#define GLEE_C_DEFINED_glUniform2i\r
+  void __stdcall GLee_Lazy_glUniform2i(GLint location, GLint v0, GLint v1)  {if (GLeeInit()) glUniform2i(location, v0, v1);}\r
+  GLEEPFNGLUNIFORM2IPROC GLeeFuncPtr_glUniform2i=GLee_Lazy_glUniform2i;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUniform3i\r
+#define GLEE_C_DEFINED_glUniform3i\r
+  void __stdcall GLee_Lazy_glUniform3i(GLint location, GLint v0, GLint v1, GLint v2)  {if (GLeeInit()) glUniform3i(location, v0, v1, v2);}\r
+  GLEEPFNGLUNIFORM3IPROC GLeeFuncPtr_glUniform3i=GLee_Lazy_glUniform3i;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUniform4i\r
+#define GLEE_C_DEFINED_glUniform4i\r
+  void __stdcall GLee_Lazy_glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3)  {if (GLeeInit()) glUniform4i(location, v0, v1, v2, v3);}\r
+  GLEEPFNGLUNIFORM4IPROC GLeeFuncPtr_glUniform4i=GLee_Lazy_glUniform4i;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUniform1fv\r
+#define GLEE_C_DEFINED_glUniform1fv\r
+  void __stdcall GLee_Lazy_glUniform1fv(GLint location, GLsizei count, const GLfloat * value)  {if (GLeeInit()) glUniform1fv(location, count, value);}\r
+  GLEEPFNGLUNIFORM1FVPROC GLeeFuncPtr_glUniform1fv=GLee_Lazy_glUniform1fv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUniform2fv\r
+#define GLEE_C_DEFINED_glUniform2fv\r
+  void __stdcall GLee_Lazy_glUniform2fv(GLint location, GLsizei count, const GLfloat * value)  {if (GLeeInit()) glUniform2fv(location, count, value);}\r
+  GLEEPFNGLUNIFORM2FVPROC GLeeFuncPtr_glUniform2fv=GLee_Lazy_glUniform2fv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUniform3fv\r
+#define GLEE_C_DEFINED_glUniform3fv\r
+  void __stdcall GLee_Lazy_glUniform3fv(GLint location, GLsizei count, const GLfloat * value)  {if (GLeeInit()) glUniform3fv(location, count, value);}\r
+  GLEEPFNGLUNIFORM3FVPROC GLeeFuncPtr_glUniform3fv=GLee_Lazy_glUniform3fv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUniform4fv\r
+#define GLEE_C_DEFINED_glUniform4fv\r
+  void __stdcall GLee_Lazy_glUniform4fv(GLint location, GLsizei count, const GLfloat * value)  {if (GLeeInit()) glUniform4fv(location, count, value);}\r
+  GLEEPFNGLUNIFORM4FVPROC GLeeFuncPtr_glUniform4fv=GLee_Lazy_glUniform4fv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUniform1iv\r
+#define GLEE_C_DEFINED_glUniform1iv\r
+  void __stdcall GLee_Lazy_glUniform1iv(GLint location, GLsizei count, const GLint * value)  {if (GLeeInit()) glUniform1iv(location, count, value);}\r
+  GLEEPFNGLUNIFORM1IVPROC GLeeFuncPtr_glUniform1iv=GLee_Lazy_glUniform1iv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUniform2iv\r
+#define GLEE_C_DEFINED_glUniform2iv\r
+  void __stdcall GLee_Lazy_glUniform2iv(GLint location, GLsizei count, const GLint * value)  {if (GLeeInit()) glUniform2iv(location, count, value);}\r
+  GLEEPFNGLUNIFORM2IVPROC GLeeFuncPtr_glUniform2iv=GLee_Lazy_glUniform2iv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUniform3iv\r
+#define GLEE_C_DEFINED_glUniform3iv\r
+  void __stdcall GLee_Lazy_glUniform3iv(GLint location, GLsizei count, const GLint * value)  {if (GLeeInit()) glUniform3iv(location, count, value);}\r
+  GLEEPFNGLUNIFORM3IVPROC GLeeFuncPtr_glUniform3iv=GLee_Lazy_glUniform3iv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUniform4iv\r
+#define GLEE_C_DEFINED_glUniform4iv\r
+  void __stdcall GLee_Lazy_glUniform4iv(GLint location, GLsizei count, const GLint * value)  {if (GLeeInit()) glUniform4iv(location, count, value);}\r
+  GLEEPFNGLUNIFORM4IVPROC GLeeFuncPtr_glUniform4iv=GLee_Lazy_glUniform4iv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUniformMatrix2fv\r
+#define GLEE_C_DEFINED_glUniformMatrix2fv\r
+  void __stdcall GLee_Lazy_glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value)  {if (GLeeInit()) glUniformMatrix2fv(location, count, transpose, value);}\r
+  GLEEPFNGLUNIFORMMATRIX2FVPROC GLeeFuncPtr_glUniformMatrix2fv=GLee_Lazy_glUniformMatrix2fv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUniformMatrix3fv\r
+#define GLEE_C_DEFINED_glUniformMatrix3fv\r
+  void __stdcall GLee_Lazy_glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value)  {if (GLeeInit()) glUniformMatrix3fv(location, count, transpose, value);}\r
+  GLEEPFNGLUNIFORMMATRIX3FVPROC GLeeFuncPtr_glUniformMatrix3fv=GLee_Lazy_glUniformMatrix3fv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUniformMatrix4fv\r
+#define GLEE_C_DEFINED_glUniformMatrix4fv\r
+  void __stdcall GLee_Lazy_glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value)  {if (GLeeInit()) glUniformMatrix4fv(location, count, transpose, value);}\r
+  GLEEPFNGLUNIFORMMATRIX4FVPROC GLeeFuncPtr_glUniformMatrix4fv=GLee_Lazy_glUniformMatrix4fv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glValidateProgram\r
+#define GLEE_C_DEFINED_glValidateProgram\r
+  void __stdcall GLee_Lazy_glValidateProgram(GLuint program)  {if (GLeeInit()) glValidateProgram(program);}\r
+  GLEEPFNGLVALIDATEPROGRAMPROC GLeeFuncPtr_glValidateProgram=GLee_Lazy_glValidateProgram;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib1d\r
+#define GLEE_C_DEFINED_glVertexAttrib1d\r
+  void __stdcall GLee_Lazy_glVertexAttrib1d(GLuint index, GLdouble x)  {if (GLeeInit()) glVertexAttrib1d(index, x);}\r
+  GLEEPFNGLVERTEXATTRIB1DPROC GLeeFuncPtr_glVertexAttrib1d=GLee_Lazy_glVertexAttrib1d;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib1dv\r
+#define GLEE_C_DEFINED_glVertexAttrib1dv\r
+  void __stdcall GLee_Lazy_glVertexAttrib1dv(GLuint index, const GLdouble * v)  {if (GLeeInit()) glVertexAttrib1dv(index, v);}\r
+  GLEEPFNGLVERTEXATTRIB1DVPROC GLeeFuncPtr_glVertexAttrib1dv=GLee_Lazy_glVertexAttrib1dv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib1f\r
+#define GLEE_C_DEFINED_glVertexAttrib1f\r
+  void __stdcall GLee_Lazy_glVertexAttrib1f(GLuint index, GLfloat x)  {if (GLeeInit()) glVertexAttrib1f(index, x);}\r
+  GLEEPFNGLVERTEXATTRIB1FPROC GLeeFuncPtr_glVertexAttrib1f=GLee_Lazy_glVertexAttrib1f;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib1fv\r
+#define GLEE_C_DEFINED_glVertexAttrib1fv\r
+  void __stdcall GLee_Lazy_glVertexAttrib1fv(GLuint index, const GLfloat * v)  {if (GLeeInit()) glVertexAttrib1fv(index, v);}\r
+  GLEEPFNGLVERTEXATTRIB1FVPROC GLeeFuncPtr_glVertexAttrib1fv=GLee_Lazy_glVertexAttrib1fv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib1s\r
+#define GLEE_C_DEFINED_glVertexAttrib1s\r
+  void __stdcall GLee_Lazy_glVertexAttrib1s(GLuint index, GLshort x)  {if (GLeeInit()) glVertexAttrib1s(index, x);}\r
+  GLEEPFNGLVERTEXATTRIB1SPROC GLeeFuncPtr_glVertexAttrib1s=GLee_Lazy_glVertexAttrib1s;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib1sv\r
+#define GLEE_C_DEFINED_glVertexAttrib1sv\r
+  void __stdcall GLee_Lazy_glVertexAttrib1sv(GLuint index, const GLshort * v)  {if (GLeeInit()) glVertexAttrib1sv(index, v);}\r
+  GLEEPFNGLVERTEXATTRIB1SVPROC GLeeFuncPtr_glVertexAttrib1sv=GLee_Lazy_glVertexAttrib1sv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib2d\r
+#define GLEE_C_DEFINED_glVertexAttrib2d\r
+  void __stdcall GLee_Lazy_glVertexAttrib2d(GLuint index, GLdouble x, GLdouble y)  {if (GLeeInit()) glVertexAttrib2d(index, x, y);}\r
+  GLEEPFNGLVERTEXATTRIB2DPROC GLeeFuncPtr_glVertexAttrib2d=GLee_Lazy_glVertexAttrib2d;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib2dv\r
+#define GLEE_C_DEFINED_glVertexAttrib2dv\r
+  void __stdcall GLee_Lazy_glVertexAttrib2dv(GLuint index, const GLdouble * v)  {if (GLeeInit()) glVertexAttrib2dv(index, v);}\r
+  GLEEPFNGLVERTEXATTRIB2DVPROC GLeeFuncPtr_glVertexAttrib2dv=GLee_Lazy_glVertexAttrib2dv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib2f\r
+#define GLEE_C_DEFINED_glVertexAttrib2f\r
+  void __stdcall GLee_Lazy_glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)  {if (GLeeInit()) glVertexAttrib2f(index, x, y);}\r
+  GLEEPFNGLVERTEXATTRIB2FPROC GLeeFuncPtr_glVertexAttrib2f=GLee_Lazy_glVertexAttrib2f;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib2fv\r
+#define GLEE_C_DEFINED_glVertexAttrib2fv\r
+  void __stdcall GLee_Lazy_glVertexAttrib2fv(GLuint index, const GLfloat * v)  {if (GLeeInit()) glVertexAttrib2fv(index, v);}\r
+  GLEEPFNGLVERTEXATTRIB2FVPROC GLeeFuncPtr_glVertexAttrib2fv=GLee_Lazy_glVertexAttrib2fv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib2s\r
+#define GLEE_C_DEFINED_glVertexAttrib2s\r
+  void __stdcall GLee_Lazy_glVertexAttrib2s(GLuint index, GLshort x, GLshort y)  {if (GLeeInit()) glVertexAttrib2s(index, x, y);}\r
+  GLEEPFNGLVERTEXATTRIB2SPROC GLeeFuncPtr_glVertexAttrib2s=GLee_Lazy_glVertexAttrib2s;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib2sv\r
+#define GLEE_C_DEFINED_glVertexAttrib2sv\r
+  void __stdcall GLee_Lazy_glVertexAttrib2sv(GLuint index, const GLshort * v)  {if (GLeeInit()) glVertexAttrib2sv(index, v);}\r
+  GLEEPFNGLVERTEXATTRIB2SVPROC GLeeFuncPtr_glVertexAttrib2sv=GLee_Lazy_glVertexAttrib2sv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib3d\r
+#define GLEE_C_DEFINED_glVertexAttrib3d\r
+  void __stdcall GLee_Lazy_glVertexAttrib3d(GLuint index, GLdouble x, GLdouble y, GLdouble z)  {if (GLeeInit()) glVertexAttrib3d(index, x, y, z);}\r
+  GLEEPFNGLVERTEXATTRIB3DPROC GLeeFuncPtr_glVertexAttrib3d=GLee_Lazy_glVertexAttrib3d;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib3dv\r
+#define GLEE_C_DEFINED_glVertexAttrib3dv\r
+  void __stdcall GLee_Lazy_glVertexAttrib3dv(GLuint index, const GLdouble * v)  {if (GLeeInit()) glVertexAttrib3dv(index, v);}\r
+  GLEEPFNGLVERTEXATTRIB3DVPROC GLeeFuncPtr_glVertexAttrib3dv=GLee_Lazy_glVertexAttrib3dv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib3f\r
+#define GLEE_C_DEFINED_glVertexAttrib3f\r
+  void __stdcall GLee_Lazy_glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)  {if (GLeeInit()) glVertexAttrib3f(index, x, y, z);}\r
+  GLEEPFNGLVERTEXATTRIB3FPROC GLeeFuncPtr_glVertexAttrib3f=GLee_Lazy_glVertexAttrib3f;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib3fv\r
+#define GLEE_C_DEFINED_glVertexAttrib3fv\r
+  void __stdcall GLee_Lazy_glVertexAttrib3fv(GLuint index, const GLfloat * v)  {if (GLeeInit()) glVertexAttrib3fv(index, v);}\r
+  GLEEPFNGLVERTEXATTRIB3FVPROC GLeeFuncPtr_glVertexAttrib3fv=GLee_Lazy_glVertexAttrib3fv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib3s\r
+#define GLEE_C_DEFINED_glVertexAttrib3s\r
+  void __stdcall GLee_Lazy_glVertexAttrib3s(GLuint index, GLshort x, GLshort y, GLshort z)  {if (GLeeInit()) glVertexAttrib3s(index, x, y, z);}\r
+  GLEEPFNGLVERTEXATTRIB3SPROC GLeeFuncPtr_glVertexAttrib3s=GLee_Lazy_glVertexAttrib3s;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib3sv\r
+#define GLEE_C_DEFINED_glVertexAttrib3sv\r
+  void __stdcall GLee_Lazy_glVertexAttrib3sv(GLuint index, const GLshort * v)  {if (GLeeInit()) glVertexAttrib3sv(index, v);}\r
+  GLEEPFNGLVERTEXATTRIB3SVPROC GLeeFuncPtr_glVertexAttrib3sv=GLee_Lazy_glVertexAttrib3sv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib4Nbv\r
+#define GLEE_C_DEFINED_glVertexAttrib4Nbv\r
+  void __stdcall GLee_Lazy_glVertexAttrib4Nbv(GLuint index, const GLbyte * v)  {if (GLeeInit()) glVertexAttrib4Nbv(index, v);}\r
+  GLEEPFNGLVERTEXATTRIB4NBVPROC GLeeFuncPtr_glVertexAttrib4Nbv=GLee_Lazy_glVertexAttrib4Nbv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib4Niv\r
+#define GLEE_C_DEFINED_glVertexAttrib4Niv\r
+  void __stdcall GLee_Lazy_glVertexAttrib4Niv(GLuint index, const GLint * v)  {if (GLeeInit()) glVertexAttrib4Niv(index, v);}\r
+  GLEEPFNGLVERTEXATTRIB4NIVPROC GLeeFuncPtr_glVertexAttrib4Niv=GLee_Lazy_glVertexAttrib4Niv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib4Nsv\r
+#define GLEE_C_DEFINED_glVertexAttrib4Nsv\r
+  void __stdcall GLee_Lazy_glVertexAttrib4Nsv(GLuint index, const GLshort * v)  {if (GLeeInit()) glVertexAttrib4Nsv(index, v);}\r
+  GLEEPFNGLVERTEXATTRIB4NSVPROC GLeeFuncPtr_glVertexAttrib4Nsv=GLee_Lazy_glVertexAttrib4Nsv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib4Nub\r
+#define GLEE_C_DEFINED_glVertexAttrib4Nub\r
+  void __stdcall GLee_Lazy_glVertexAttrib4Nub(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w)  {if (GLeeInit()) glVertexAttrib4Nub(index, x, y, z, w);}\r
+  GLEEPFNGLVERTEXATTRIB4NUBPROC GLeeFuncPtr_glVertexAttrib4Nub=GLee_Lazy_glVertexAttrib4Nub;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib4Nubv\r
+#define GLEE_C_DEFINED_glVertexAttrib4Nubv\r
+  void __stdcall GLee_Lazy_glVertexAttrib4Nubv(GLuint index, const GLubyte * v)  {if (GLeeInit()) glVertexAttrib4Nubv(index, v);}\r
+  GLEEPFNGLVERTEXATTRIB4NUBVPROC GLeeFuncPtr_glVertexAttrib4Nubv=GLee_Lazy_glVertexAttrib4Nubv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib4Nuiv\r
+#define GLEE_C_DEFINED_glVertexAttrib4Nuiv\r
+  void __stdcall GLee_Lazy_glVertexAttrib4Nuiv(GLuint index, const GLuint * v)  {if (GLeeInit()) glVertexAttrib4Nuiv(index, v);}\r
+  GLEEPFNGLVERTEXATTRIB4NUIVPROC GLeeFuncPtr_glVertexAttrib4Nuiv=GLee_Lazy_glVertexAttrib4Nuiv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib4Nusv\r
+#define GLEE_C_DEFINED_glVertexAttrib4Nusv\r
+  void __stdcall GLee_Lazy_glVertexAttrib4Nusv(GLuint index, const GLushort * v)  {if (GLeeInit()) glVertexAttrib4Nusv(index, v);}\r
+  GLEEPFNGLVERTEXATTRIB4NUSVPROC GLeeFuncPtr_glVertexAttrib4Nusv=GLee_Lazy_glVertexAttrib4Nusv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib4bv\r
+#define GLEE_C_DEFINED_glVertexAttrib4bv\r
+  void __stdcall GLee_Lazy_glVertexAttrib4bv(GLuint index, const GLbyte * v)  {if (GLeeInit()) glVertexAttrib4bv(index, v);}\r
+  GLEEPFNGLVERTEXATTRIB4BVPROC GLeeFuncPtr_glVertexAttrib4bv=GLee_Lazy_glVertexAttrib4bv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib4d\r
+#define GLEE_C_DEFINED_glVertexAttrib4d\r
+  void __stdcall GLee_Lazy_glVertexAttrib4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)  {if (GLeeInit()) glVertexAttrib4d(index, x, y, z, w);}\r
+  GLEEPFNGLVERTEXATTRIB4DPROC GLeeFuncPtr_glVertexAttrib4d=GLee_Lazy_glVertexAttrib4d;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib4dv\r
+#define GLEE_C_DEFINED_glVertexAttrib4dv\r
+  void __stdcall GLee_Lazy_glVertexAttrib4dv(GLuint index, const GLdouble * v)  {if (GLeeInit()) glVertexAttrib4dv(index, v);}\r
+  GLEEPFNGLVERTEXATTRIB4DVPROC GLeeFuncPtr_glVertexAttrib4dv=GLee_Lazy_glVertexAttrib4dv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib4f\r
+#define GLEE_C_DEFINED_glVertexAttrib4f\r
+  void __stdcall GLee_Lazy_glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)  {if (GLeeInit()) glVertexAttrib4f(index, x, y, z, w);}\r
+  GLEEPFNGLVERTEXATTRIB4FPROC GLeeFuncPtr_glVertexAttrib4f=GLee_Lazy_glVertexAttrib4f;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib4fv\r
+#define GLEE_C_DEFINED_glVertexAttrib4fv\r
+  void __stdcall GLee_Lazy_glVertexAttrib4fv(GLuint index, const GLfloat * v)  {if (GLeeInit()) glVertexAttrib4fv(index, v);}\r
+  GLEEPFNGLVERTEXATTRIB4FVPROC GLeeFuncPtr_glVertexAttrib4fv=GLee_Lazy_glVertexAttrib4fv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib4iv\r
+#define GLEE_C_DEFINED_glVertexAttrib4iv\r
+  void __stdcall GLee_Lazy_glVertexAttrib4iv(GLuint index, const GLint * v)  {if (GLeeInit()) glVertexAttrib4iv(index, v);}\r
+  GLEEPFNGLVERTEXATTRIB4IVPROC GLeeFuncPtr_glVertexAttrib4iv=GLee_Lazy_glVertexAttrib4iv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib4s\r
+#define GLEE_C_DEFINED_glVertexAttrib4s\r
+  void __stdcall GLee_Lazy_glVertexAttrib4s(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w)  {if (GLeeInit()) glVertexAttrib4s(index, x, y, z, w);}\r
+  GLEEPFNGLVERTEXATTRIB4SPROC GLeeFuncPtr_glVertexAttrib4s=GLee_Lazy_glVertexAttrib4s;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib4sv\r
+#define GLEE_C_DEFINED_glVertexAttrib4sv\r
+  void __stdcall GLee_Lazy_glVertexAttrib4sv(GLuint index, const GLshort * v)  {if (GLeeInit()) glVertexAttrib4sv(index, v);}\r
+  GLEEPFNGLVERTEXATTRIB4SVPROC GLeeFuncPtr_glVertexAttrib4sv=GLee_Lazy_glVertexAttrib4sv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib4ubv\r
+#define GLEE_C_DEFINED_glVertexAttrib4ubv\r
+  void __stdcall GLee_Lazy_glVertexAttrib4ubv(GLuint index, const GLubyte * v)  {if (GLeeInit()) glVertexAttrib4ubv(index, v);}\r
+  GLEEPFNGLVERTEXATTRIB4UBVPROC GLeeFuncPtr_glVertexAttrib4ubv=GLee_Lazy_glVertexAttrib4ubv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib4uiv\r
+#define GLEE_C_DEFINED_glVertexAttrib4uiv\r
+  void __stdcall GLee_Lazy_glVertexAttrib4uiv(GLuint index, const GLuint * v)  {if (GLeeInit()) glVertexAttrib4uiv(index, v);}\r
+  GLEEPFNGLVERTEXATTRIB4UIVPROC GLeeFuncPtr_glVertexAttrib4uiv=GLee_Lazy_glVertexAttrib4uiv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib4usv\r
+#define GLEE_C_DEFINED_glVertexAttrib4usv\r
+  void __stdcall GLee_Lazy_glVertexAttrib4usv(GLuint index, const GLushort * v)  {if (GLeeInit()) glVertexAttrib4usv(index, v);}\r
+  GLEEPFNGLVERTEXATTRIB4USVPROC GLeeFuncPtr_glVertexAttrib4usv=GLee_Lazy_glVertexAttrib4usv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttribPointer\r
+#define GLEE_C_DEFINED_glVertexAttribPointer\r
+  void __stdcall GLee_Lazy_glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid * pointer)  {if (GLeeInit()) glVertexAttribPointer(index, size, type, normalized, stride, pointer);}\r
+  GLEEPFNGLVERTEXATTRIBPOINTERPROC GLeeFuncPtr_glVertexAttribPointer=GLee_Lazy_glVertexAttribPointer;\r
+#endif\r
+#endif \r
+\r
+/* GL_VERSION_2_1 */\r
+\r
+#ifdef __GLEE_GL_VERSION_2_1\r
+#ifndef GLEE_C_DEFINED_glUniformMatrix2x3fv\r
+#define GLEE_C_DEFINED_glUniformMatrix2x3fv\r
+  void __stdcall GLee_Lazy_glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value)  {if (GLeeInit()) glUniformMatrix2x3fv(location, count, transpose, value);}\r
+  GLEEPFNGLUNIFORMMATRIX2X3FVPROC GLeeFuncPtr_glUniformMatrix2x3fv=GLee_Lazy_glUniformMatrix2x3fv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUniformMatrix3x2fv\r
+#define GLEE_C_DEFINED_glUniformMatrix3x2fv\r
+  void __stdcall GLee_Lazy_glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value)  {if (GLeeInit()) glUniformMatrix3x2fv(location, count, transpose, value);}\r
+  GLEEPFNGLUNIFORMMATRIX3X2FVPROC GLeeFuncPtr_glUniformMatrix3x2fv=GLee_Lazy_glUniformMatrix3x2fv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUniformMatrix2x4fv\r
+#define GLEE_C_DEFINED_glUniformMatrix2x4fv\r
+  void __stdcall GLee_Lazy_glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value)  {if (GLeeInit()) glUniformMatrix2x4fv(location, count, transpose, value);}\r
+  GLEEPFNGLUNIFORMMATRIX2X4FVPROC GLeeFuncPtr_glUniformMatrix2x4fv=GLee_Lazy_glUniformMatrix2x4fv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUniformMatrix4x2fv\r
+#define GLEE_C_DEFINED_glUniformMatrix4x2fv\r
+  void __stdcall GLee_Lazy_glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value)  {if (GLeeInit()) glUniformMatrix4x2fv(location, count, transpose, value);}\r
+  GLEEPFNGLUNIFORMMATRIX4X2FVPROC GLeeFuncPtr_glUniformMatrix4x2fv=GLee_Lazy_glUniformMatrix4x2fv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUniformMatrix3x4fv\r
+#define GLEE_C_DEFINED_glUniformMatrix3x4fv\r
+  void __stdcall GLee_Lazy_glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value)  {if (GLeeInit()) glUniformMatrix3x4fv(location, count, transpose, value);}\r
+  GLEEPFNGLUNIFORMMATRIX3X4FVPROC GLeeFuncPtr_glUniformMatrix3x4fv=GLee_Lazy_glUniformMatrix3x4fv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUniformMatrix4x3fv\r
+#define GLEE_C_DEFINED_glUniformMatrix4x3fv\r
+  void __stdcall GLee_Lazy_glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value)  {if (GLeeInit()) glUniformMatrix4x3fv(location, count, transpose, value);}\r
+  GLEEPFNGLUNIFORMMATRIX4X3FVPROC GLeeFuncPtr_glUniformMatrix4x3fv=GLee_Lazy_glUniformMatrix4x3fv;\r
+#endif\r
+#endif \r
+\r
+/* GL_VERSION_3_0 */\r
+\r
+#ifdef __GLEE_GL_VERSION_3_0\r
+#ifndef GLEE_C_DEFINED_glColorMaski\r
+#define GLEE_C_DEFINED_glColorMaski\r
+  void __stdcall GLee_Lazy_glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a)  {if (GLeeInit()) glColorMaski(index, r, g, b, a);}\r
+  GLEEPFNGLCOLORMASKIPROC GLeeFuncPtr_glColorMaski=GLee_Lazy_glColorMaski;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetBooleani_v\r
+#define GLEE_C_DEFINED_glGetBooleani_v\r
+  void __stdcall GLee_Lazy_glGetBooleani_v(GLenum target, GLuint index, GLboolean * data)  {if (GLeeInit()) glGetBooleani_v(target, index, data);}\r
+  GLEEPFNGLGETBOOLEANI_VPROC GLeeFuncPtr_glGetBooleani_v=GLee_Lazy_glGetBooleani_v;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetIntegeri_v\r
+#define GLEE_C_DEFINED_glGetIntegeri_v\r
+  void __stdcall GLee_Lazy_glGetIntegeri_v(GLenum target, GLuint index, GLint * data)  {if (GLeeInit()) glGetIntegeri_v(target, index, data);}\r
+  GLEEPFNGLGETINTEGERI_VPROC GLeeFuncPtr_glGetIntegeri_v=GLee_Lazy_glGetIntegeri_v;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glEnablei\r
+#define GLEE_C_DEFINED_glEnablei\r
+  void __stdcall GLee_Lazy_glEnablei(GLenum target, GLuint index)  {if (GLeeInit()) glEnablei(target, index);}\r
+  GLEEPFNGLENABLEIPROC GLeeFuncPtr_glEnablei=GLee_Lazy_glEnablei;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glDisablei\r
+#define GLEE_C_DEFINED_glDisablei\r
+  void __stdcall GLee_Lazy_glDisablei(GLenum target, GLuint index)  {if (GLeeInit()) glDisablei(target, index);}\r
+  GLEEPFNGLDISABLEIPROC GLeeFuncPtr_glDisablei=GLee_Lazy_glDisablei;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glIsEnabledi\r
+#define GLEE_C_DEFINED_glIsEnabledi\r
+  GLboolean __stdcall GLee_Lazy_glIsEnabledi(GLenum target, GLuint index)  {if (GLeeInit()) return glIsEnabledi(target, index); return (GLboolean)0;}\r
+  GLEEPFNGLISENABLEDIPROC GLeeFuncPtr_glIsEnabledi=GLee_Lazy_glIsEnabledi;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glBeginTransformFeedback\r
+#define GLEE_C_DEFINED_glBeginTransformFeedback\r
+  void __stdcall GLee_Lazy_glBeginTransformFeedback(GLenum primitiveMode)  {if (GLeeInit()) glBeginTransformFeedback(primitiveMode);}\r
+  GLEEPFNGLBEGINTRANSFORMFEEDBACKPROC GLeeFuncPtr_glBeginTransformFeedback=GLee_Lazy_glBeginTransformFeedback;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glEndTransformFeedback\r
+#define GLEE_C_DEFINED_glEndTransformFeedback\r
+  void __stdcall GLee_Lazy_glEndTransformFeedback(void)  {if (GLeeInit()) glEndTransformFeedback();}\r
+  GLEEPFNGLENDTRANSFORMFEEDBACKPROC GLeeFuncPtr_glEndTransformFeedback=GLee_Lazy_glEndTransformFeedback;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glBindBufferRange\r
+#define GLEE_C_DEFINED_glBindBufferRange\r
+  void __stdcall GLee_Lazy_glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)  {if (GLeeInit()) glBindBufferRange(target, index, buffer, offset, size);}\r
+  GLEEPFNGLBINDBUFFERRANGEPROC GLeeFuncPtr_glBindBufferRange=GLee_Lazy_glBindBufferRange;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glBindBufferBase\r
+#define GLEE_C_DEFINED_glBindBufferBase\r
+  void __stdcall GLee_Lazy_glBindBufferBase(GLenum target, GLuint index, GLuint buffer)  {if (GLeeInit()) glBindBufferBase(target, index, buffer);}\r
+  GLEEPFNGLBINDBUFFERBASEPROC GLeeFuncPtr_glBindBufferBase=GLee_Lazy_glBindBufferBase;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTransformFeedbackVaryings\r
+#define GLEE_C_DEFINED_glTransformFeedbackVaryings\r
+  void __stdcall GLee_Lazy_glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLint * locations, GLenum bufferMode)  {if (GLeeInit()) glTransformFeedbackVaryings(program, count, locations, bufferMode);}\r
+  GLEEPFNGLTRANSFORMFEEDBACKVARYINGSPROC GLeeFuncPtr_glTransformFeedbackVaryings=GLee_Lazy_glTransformFeedbackVaryings;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetTransformFeedbackVarying\r
+#define GLEE_C_DEFINED_glGetTransformFeedbackVarying\r
+  void __stdcall GLee_Lazy_glGetTransformFeedbackVarying(GLuint program, GLuint index, GLint * location)  {if (GLeeInit()) glGetTransformFeedbackVarying(program, index, location);}\r
+  GLEEPFNGLGETTRANSFORMFEEDBACKVARYINGPROC GLeeFuncPtr_glGetTransformFeedbackVarying=GLee_Lazy_glGetTransformFeedbackVarying;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glClampColor\r
+#define GLEE_C_DEFINED_glClampColor\r
+  void __stdcall GLee_Lazy_glClampColor(GLenum target, GLenum clamp)  {if (GLeeInit()) glClampColor(target, clamp);}\r
+  GLEEPFNGLCLAMPCOLORPROC GLeeFuncPtr_glClampColor=GLee_Lazy_glClampColor;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glBeginConditionalRender\r
+#define GLEE_C_DEFINED_glBeginConditionalRender\r
+  void __stdcall GLee_Lazy_glBeginConditionalRender(GLuint id, GLenum mode)  {if (GLeeInit()) glBeginConditionalRender(id, mode);}\r
+  GLEEPFNGLBEGINCONDITIONALRENDERPROC GLeeFuncPtr_glBeginConditionalRender=GLee_Lazy_glBeginConditionalRender;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glEndConditionalRender\r
+#define GLEE_C_DEFINED_glEndConditionalRender\r
+  void __stdcall GLee_Lazy_glEndConditionalRender(void)  {if (GLeeInit()) glEndConditionalRender();}\r
+  GLEEPFNGLENDCONDITIONALRENDERPROC GLeeFuncPtr_glEndConditionalRender=GLee_Lazy_glEndConditionalRender;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttribI1i\r
+#define GLEE_C_DEFINED_glVertexAttribI1i\r
+  void __stdcall GLee_Lazy_glVertexAttribI1i(GLuint index, GLint x)  {if (GLeeInit()) glVertexAttribI1i(index, x);}\r
+  GLEEPFNGLVERTEXATTRIBI1IPROC GLeeFuncPtr_glVertexAttribI1i=GLee_Lazy_glVertexAttribI1i;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttribI2i\r
+#define GLEE_C_DEFINED_glVertexAttribI2i\r
+  void __stdcall GLee_Lazy_glVertexAttribI2i(GLuint index, GLint x, GLint y)  {if (GLeeInit()) glVertexAttribI2i(index, x, y);}\r
+  GLEEPFNGLVERTEXATTRIBI2IPROC GLeeFuncPtr_glVertexAttribI2i=GLee_Lazy_glVertexAttribI2i;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttribI3i\r
+#define GLEE_C_DEFINED_glVertexAttribI3i\r
+  void __stdcall GLee_Lazy_glVertexAttribI3i(GLuint index, GLint x, GLint y, GLint z)  {if (GLeeInit()) glVertexAttribI3i(index, x, y, z);}\r
+  GLEEPFNGLVERTEXATTRIBI3IPROC GLeeFuncPtr_glVertexAttribI3i=GLee_Lazy_glVertexAttribI3i;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttribI4i\r
+#define GLEE_C_DEFINED_glVertexAttribI4i\r
+  void __stdcall GLee_Lazy_glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)  {if (GLeeInit()) glVertexAttribI4i(index, x, y, z, w);}\r
+  GLEEPFNGLVERTEXATTRIBI4IPROC GLeeFuncPtr_glVertexAttribI4i=GLee_Lazy_glVertexAttribI4i;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttribI1ui\r
+#define GLEE_C_DEFINED_glVertexAttribI1ui\r
+  void __stdcall GLee_Lazy_glVertexAttribI1ui(GLuint index, GLuint x)  {if (GLeeInit()) glVertexAttribI1ui(index, x);}\r
+  GLEEPFNGLVERTEXATTRIBI1UIPROC GLeeFuncPtr_glVertexAttribI1ui=GLee_Lazy_glVertexAttribI1ui;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttribI2ui\r
+#define GLEE_C_DEFINED_glVertexAttribI2ui\r
+  void __stdcall GLee_Lazy_glVertexAttribI2ui(GLuint index, GLuint x, GLuint y)  {if (GLeeInit()) glVertexAttribI2ui(index, x, y);}\r
+  GLEEPFNGLVERTEXATTRIBI2UIPROC GLeeFuncPtr_glVertexAttribI2ui=GLee_Lazy_glVertexAttribI2ui;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttribI3ui\r
+#define GLEE_C_DEFINED_glVertexAttribI3ui\r
+  void __stdcall GLee_Lazy_glVertexAttribI3ui(GLuint index, GLuint x, GLuint y, GLuint z)  {if (GLeeInit()) glVertexAttribI3ui(index, x, y, z);}\r
+  GLEEPFNGLVERTEXATTRIBI3UIPROC GLeeFuncPtr_glVertexAttribI3ui=GLee_Lazy_glVertexAttribI3ui;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttribI4ui\r
+#define GLEE_C_DEFINED_glVertexAttribI4ui\r
+  void __stdcall GLee_Lazy_glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)  {if (GLeeInit()) glVertexAttribI4ui(index, x, y, z, w);}\r
+  GLEEPFNGLVERTEXATTRIBI4UIPROC GLeeFuncPtr_glVertexAttribI4ui=GLee_Lazy_glVertexAttribI4ui;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttribI1iv\r
+#define GLEE_C_DEFINED_glVertexAttribI1iv\r
+  void __stdcall GLee_Lazy_glVertexAttribI1iv(GLuint index, const GLint * v)  {if (GLeeInit()) glVertexAttribI1iv(index, v);}\r
+  GLEEPFNGLVERTEXATTRIBI1IVPROC GLeeFuncPtr_glVertexAttribI1iv=GLee_Lazy_glVertexAttribI1iv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttribI2iv\r
+#define GLEE_C_DEFINED_glVertexAttribI2iv\r
+  void __stdcall GLee_Lazy_glVertexAttribI2iv(GLuint index, const GLint * v)  {if (GLeeInit()) glVertexAttribI2iv(index, v);}\r
+  GLEEPFNGLVERTEXATTRIBI2IVPROC GLeeFuncPtr_glVertexAttribI2iv=GLee_Lazy_glVertexAttribI2iv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttribI3iv\r
+#define GLEE_C_DEFINED_glVertexAttribI3iv\r
+  void __stdcall GLee_Lazy_glVertexAttribI3iv(GLuint index, const GLint * v)  {if (GLeeInit()) glVertexAttribI3iv(index, v);}\r
+  GLEEPFNGLVERTEXATTRIBI3IVPROC GLeeFuncPtr_glVertexAttribI3iv=GLee_Lazy_glVertexAttribI3iv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttribI4iv\r
+#define GLEE_C_DEFINED_glVertexAttribI4iv\r
+  void __stdcall GLee_Lazy_glVertexAttribI4iv(GLuint index, const GLint * v)  {if (GLeeInit()) glVertexAttribI4iv(index, v);}\r
+  GLEEPFNGLVERTEXATTRIBI4IVPROC GLeeFuncPtr_glVertexAttribI4iv=GLee_Lazy_glVertexAttribI4iv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttribI1uiv\r
+#define GLEE_C_DEFINED_glVertexAttribI1uiv\r
+  void __stdcall GLee_Lazy_glVertexAttribI1uiv(GLuint index, const GLuint * v)  {if (GLeeInit()) glVertexAttribI1uiv(index, v);}\r
+  GLEEPFNGLVERTEXATTRIBI1UIVPROC GLeeFuncPtr_glVertexAttribI1uiv=GLee_Lazy_glVertexAttribI1uiv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttribI2uiv\r
+#define GLEE_C_DEFINED_glVertexAttribI2uiv\r
+  void __stdcall GLee_Lazy_glVertexAttribI2uiv(GLuint index, const GLuint * v)  {if (GLeeInit()) glVertexAttribI2uiv(index, v);}\r
+  GLEEPFNGLVERTEXATTRIBI2UIVPROC GLeeFuncPtr_glVertexAttribI2uiv=GLee_Lazy_glVertexAttribI2uiv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttribI3uiv\r
+#define GLEE_C_DEFINED_glVertexAttribI3uiv\r
+  void __stdcall GLee_Lazy_glVertexAttribI3uiv(GLuint index, const GLuint * v)  {if (GLeeInit()) glVertexAttribI3uiv(index, v);}\r
+  GLEEPFNGLVERTEXATTRIBI3UIVPROC GLeeFuncPtr_glVertexAttribI3uiv=GLee_Lazy_glVertexAttribI3uiv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttribI4uiv\r
+#define GLEE_C_DEFINED_glVertexAttribI4uiv\r
+  void __stdcall GLee_Lazy_glVertexAttribI4uiv(GLuint index, const GLuint * v)  {if (GLeeInit()) glVertexAttribI4uiv(index, v);}\r
+  GLEEPFNGLVERTEXATTRIBI4UIVPROC GLeeFuncPtr_glVertexAttribI4uiv=GLee_Lazy_glVertexAttribI4uiv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttribI4bv\r
+#define GLEE_C_DEFINED_glVertexAttribI4bv\r
+  void __stdcall GLee_Lazy_glVertexAttribI4bv(GLuint index, const GLbyte * v)  {if (GLeeInit()) glVertexAttribI4bv(index, v);}\r
+  GLEEPFNGLVERTEXATTRIBI4BVPROC GLeeFuncPtr_glVertexAttribI4bv=GLee_Lazy_glVertexAttribI4bv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttribI4sv\r
+#define GLEE_C_DEFINED_glVertexAttribI4sv\r
+  void __stdcall GLee_Lazy_glVertexAttribI4sv(GLuint index, const GLshort * v)  {if (GLeeInit()) glVertexAttribI4sv(index, v);}\r
+  GLEEPFNGLVERTEXATTRIBI4SVPROC GLeeFuncPtr_glVertexAttribI4sv=GLee_Lazy_glVertexAttribI4sv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttribI4ubv\r
+#define GLEE_C_DEFINED_glVertexAttribI4ubv\r
+  void __stdcall GLee_Lazy_glVertexAttribI4ubv(GLuint index, const GLubyte * v)  {if (GLeeInit()) glVertexAttribI4ubv(index, v);}\r
+  GLEEPFNGLVERTEXATTRIBI4UBVPROC GLeeFuncPtr_glVertexAttribI4ubv=GLee_Lazy_glVertexAttribI4ubv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttribI4usv\r
+#define GLEE_C_DEFINED_glVertexAttribI4usv\r
+  void __stdcall GLee_Lazy_glVertexAttribI4usv(GLuint index, const GLushort * v)  {if (GLeeInit()) glVertexAttribI4usv(index, v);}\r
+  GLEEPFNGLVERTEXATTRIBI4USVPROC GLeeFuncPtr_glVertexAttribI4usv=GLee_Lazy_glVertexAttribI4usv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttribIPointer\r
+#define GLEE_C_DEFINED_glVertexAttribIPointer\r
+  void __stdcall GLee_Lazy_glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid * pointer)  {if (GLeeInit()) glVertexAttribIPointer(index, size, type, stride, pointer);}\r
+  GLEEPFNGLVERTEXATTRIBIPOINTERPROC GLeeFuncPtr_glVertexAttribIPointer=GLee_Lazy_glVertexAttribIPointer;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetVertexAttribIiv\r
+#define GLEE_C_DEFINED_glGetVertexAttribIiv\r
+  void __stdcall GLee_Lazy_glGetVertexAttribIiv(GLuint index, GLenum pname, GLint * params)  {if (GLeeInit()) glGetVertexAttribIiv(index, pname, params);}\r
+  GLEEPFNGLGETVERTEXATTRIBIIVPROC GLeeFuncPtr_glGetVertexAttribIiv=GLee_Lazy_glGetVertexAttribIiv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetVertexAttribIuiv\r
+#define GLEE_C_DEFINED_glGetVertexAttribIuiv\r
+  void __stdcall GLee_Lazy_glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint * params)  {if (GLeeInit()) glGetVertexAttribIuiv(index, pname, params);}\r
+  GLEEPFNGLGETVERTEXATTRIBIUIVPROC GLeeFuncPtr_glGetVertexAttribIuiv=GLee_Lazy_glGetVertexAttribIuiv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetUniformuiv\r
+#define GLEE_C_DEFINED_glGetUniformuiv\r
+  void __stdcall GLee_Lazy_glGetUniformuiv(GLuint program, GLint location, GLuint * params)  {if (GLeeInit()) glGetUniformuiv(program, location, params);}\r
+  GLEEPFNGLGETUNIFORMUIVPROC GLeeFuncPtr_glGetUniformuiv=GLee_Lazy_glGetUniformuiv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glBindFragDataLocation\r
+#define GLEE_C_DEFINED_glBindFragDataLocation\r
+  void __stdcall GLee_Lazy_glBindFragDataLocation(GLuint program, GLuint color, const GLchar * name)  {if (GLeeInit()) glBindFragDataLocation(program, color, name);}\r
+  GLEEPFNGLBINDFRAGDATALOCATIONPROC GLeeFuncPtr_glBindFragDataLocation=GLee_Lazy_glBindFragDataLocation;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetFragDataLocation\r
+#define GLEE_C_DEFINED_glGetFragDataLocation\r
+  GLint __stdcall GLee_Lazy_glGetFragDataLocation(GLuint program, const GLchar * name)  {if (GLeeInit()) return glGetFragDataLocation(program, name); return (GLint)0;}\r
+  GLEEPFNGLGETFRAGDATALOCATIONPROC GLeeFuncPtr_glGetFragDataLocation=GLee_Lazy_glGetFragDataLocation;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUniform1ui\r
+#define GLEE_C_DEFINED_glUniform1ui\r
+  void __stdcall GLee_Lazy_glUniform1ui(GLint location, GLuint v0)  {if (GLeeInit()) glUniform1ui(location, v0);}\r
+  GLEEPFNGLUNIFORM1UIPROC GLeeFuncPtr_glUniform1ui=GLee_Lazy_glUniform1ui;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUniform2ui\r
+#define GLEE_C_DEFINED_glUniform2ui\r
+  void __stdcall GLee_Lazy_glUniform2ui(GLint location, GLuint v0, GLuint v1)  {if (GLeeInit()) glUniform2ui(location, v0, v1);}\r
+  GLEEPFNGLUNIFORM2UIPROC GLeeFuncPtr_glUniform2ui=GLee_Lazy_glUniform2ui;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUniform3ui\r
+#define GLEE_C_DEFINED_glUniform3ui\r
+  void __stdcall GLee_Lazy_glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)  {if (GLeeInit()) glUniform3ui(location, v0, v1, v2);}\r
+  GLEEPFNGLUNIFORM3UIPROC GLeeFuncPtr_glUniform3ui=GLee_Lazy_glUniform3ui;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUniform4ui\r
+#define GLEE_C_DEFINED_glUniform4ui\r
+  void __stdcall GLee_Lazy_glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)  {if (GLeeInit()) glUniform4ui(location, v0, v1, v2, v3);}\r
+  GLEEPFNGLUNIFORM4UIPROC GLeeFuncPtr_glUniform4ui=GLee_Lazy_glUniform4ui;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUniform1uiv\r
+#define GLEE_C_DEFINED_glUniform1uiv\r
+  void __stdcall GLee_Lazy_glUniform1uiv(GLint location, GLsizei count, const GLuint * value)  {if (GLeeInit()) glUniform1uiv(location, count, value);}\r
+  GLEEPFNGLUNIFORM1UIVPROC GLeeFuncPtr_glUniform1uiv=GLee_Lazy_glUniform1uiv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUniform2uiv\r
+#define GLEE_C_DEFINED_glUniform2uiv\r
+  void __stdcall GLee_Lazy_glUniform2uiv(GLint location, GLsizei count, const GLuint * value)  {if (GLeeInit()) glUniform2uiv(location, count, value);}\r
+  GLEEPFNGLUNIFORM2UIVPROC GLeeFuncPtr_glUniform2uiv=GLee_Lazy_glUniform2uiv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUniform3uiv\r
+#define GLEE_C_DEFINED_glUniform3uiv\r
+  void __stdcall GLee_Lazy_glUniform3uiv(GLint location, GLsizei count, const GLuint * value)  {if (GLeeInit()) glUniform3uiv(location, count, value);}\r
+  GLEEPFNGLUNIFORM3UIVPROC GLeeFuncPtr_glUniform3uiv=GLee_Lazy_glUniform3uiv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUniform4uiv\r
+#define GLEE_C_DEFINED_glUniform4uiv\r
+  void __stdcall GLee_Lazy_glUniform4uiv(GLint location, GLsizei count, const GLuint * value)  {if (GLeeInit()) glUniform4uiv(location, count, value);}\r
+  GLEEPFNGLUNIFORM4UIVPROC GLeeFuncPtr_glUniform4uiv=GLee_Lazy_glUniform4uiv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTexParameterIiv\r
+#define GLEE_C_DEFINED_glTexParameterIiv\r
+  void __stdcall GLee_Lazy_glTexParameterIiv(GLenum target, GLenum pname, const GLint * params)  {if (GLeeInit()) glTexParameterIiv(target, pname, params);}\r
+  GLEEPFNGLTEXPARAMETERIIVPROC GLeeFuncPtr_glTexParameterIiv=GLee_Lazy_glTexParameterIiv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTexParameterIuiv\r
+#define GLEE_C_DEFINED_glTexParameterIuiv\r
+  void __stdcall GLee_Lazy_glTexParameterIuiv(GLenum target, GLenum pname, const GLuint * params)  {if (GLeeInit()) glTexParameterIuiv(target, pname, params);}\r
+  GLEEPFNGLTEXPARAMETERIUIVPROC GLeeFuncPtr_glTexParameterIuiv=GLee_Lazy_glTexParameterIuiv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetTexParameterIiv\r
+#define GLEE_C_DEFINED_glGetTexParameterIiv\r
+  void __stdcall GLee_Lazy_glGetTexParameterIiv(GLenum target, GLenum pname, GLint * params)  {if (GLeeInit()) glGetTexParameterIiv(target, pname, params);}\r
+  GLEEPFNGLGETTEXPARAMETERIIVPROC GLeeFuncPtr_glGetTexParameterIiv=GLee_Lazy_glGetTexParameterIiv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetTexParameterIuiv\r
+#define GLEE_C_DEFINED_glGetTexParameterIuiv\r
+  void __stdcall GLee_Lazy_glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint * params)  {if (GLeeInit()) glGetTexParameterIuiv(target, pname, params);}\r
+  GLEEPFNGLGETTEXPARAMETERIUIVPROC GLeeFuncPtr_glGetTexParameterIuiv=GLee_Lazy_glGetTexParameterIuiv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glClearBufferiv\r
+#define GLEE_C_DEFINED_glClearBufferiv\r
+  void __stdcall GLee_Lazy_glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint * value)  {if (GLeeInit()) glClearBufferiv(buffer, drawbuffer, value);}\r
+  GLEEPFNGLCLEARBUFFERIVPROC GLeeFuncPtr_glClearBufferiv=GLee_Lazy_glClearBufferiv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glClearBufferuiv\r
+#define GLEE_C_DEFINED_glClearBufferuiv\r
+  void __stdcall GLee_Lazy_glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint * value)  {if (GLeeInit()) glClearBufferuiv(buffer, drawbuffer, value);}\r
+  GLEEPFNGLCLEARBUFFERUIVPROC GLeeFuncPtr_glClearBufferuiv=GLee_Lazy_glClearBufferuiv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glClearBufferfv\r
+#define GLEE_C_DEFINED_glClearBufferfv\r
+  void __stdcall GLee_Lazy_glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat * value)  {if (GLeeInit()) glClearBufferfv(buffer, drawbuffer, value);}\r
+  GLEEPFNGLCLEARBUFFERFVPROC GLeeFuncPtr_glClearBufferfv=GLee_Lazy_glClearBufferfv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glClearBufferfi\r
+#define GLEE_C_DEFINED_glClearBufferfi\r
+  void __stdcall GLee_Lazy_glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)  {if (GLeeInit()) glClearBufferfi(buffer, drawbuffer, depth, stencil);}\r
+  GLEEPFNGLCLEARBUFFERFIPROC GLeeFuncPtr_glClearBufferfi=GLee_Lazy_glClearBufferfi;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetStringi\r
+#define GLEE_C_DEFINED_glGetStringi\r
+  const GLubyte * __stdcall GLee_Lazy_glGetStringi(GLenum name, GLuint index)  {if (GLeeInit()) return glGetStringi(name, index); return (const GLubyte *)0;}\r
+  GLEEPFNGLGETSTRINGIPROC GLeeFuncPtr_glGetStringi=GLee_Lazy_glGetStringi;\r
+#endif\r
+#endif \r
+\r
+/* GL_ARB_multitexture */\r
+\r
+#ifdef __GLEE_GL_ARB_multitexture\r
+#ifndef GLEE_C_DEFINED_glActiveTextureARB\r
+#define GLEE_C_DEFINED_glActiveTextureARB\r
+  void __stdcall GLee_Lazy_glActiveTextureARB(GLenum texture)  {if (GLeeInit()) glActiveTextureARB(texture);}\r
+  GLEEPFNGLACTIVETEXTUREARBPROC GLeeFuncPtr_glActiveTextureARB=GLee_Lazy_glActiveTextureARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glClientActiveTextureARB\r
+#define GLEE_C_DEFINED_glClientActiveTextureARB\r
+  void __stdcall GLee_Lazy_glClientActiveTextureARB(GLenum texture)  {if (GLeeInit()) glClientActiveTextureARB(texture);}\r
+  GLEEPFNGLCLIENTACTIVETEXTUREARBPROC GLeeFuncPtr_glClientActiveTextureARB=GLee_Lazy_glClientActiveTextureARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord1dARB\r
+#define GLEE_C_DEFINED_glMultiTexCoord1dARB\r
+  void __stdcall GLee_Lazy_glMultiTexCoord1dARB(GLenum target, GLdouble s)  {if (GLeeInit()) glMultiTexCoord1dARB(target, s);}\r
+  GLEEPFNGLMULTITEXCOORD1DARBPROC GLeeFuncPtr_glMultiTexCoord1dARB=GLee_Lazy_glMultiTexCoord1dARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord1dvARB\r
+#define GLEE_C_DEFINED_glMultiTexCoord1dvARB\r
+  void __stdcall GLee_Lazy_glMultiTexCoord1dvARB(GLenum target, const GLdouble * v)  {if (GLeeInit()) glMultiTexCoord1dvARB(target, v);}\r
+  GLEEPFNGLMULTITEXCOORD1DVARBPROC GLeeFuncPtr_glMultiTexCoord1dvARB=GLee_Lazy_glMultiTexCoord1dvARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord1fARB\r
+#define GLEE_C_DEFINED_glMultiTexCoord1fARB\r
+  void __stdcall GLee_Lazy_glMultiTexCoord1fARB(GLenum target, GLfloat s)  {if (GLeeInit()) glMultiTexCoord1fARB(target, s);}\r
+  GLEEPFNGLMULTITEXCOORD1FARBPROC GLeeFuncPtr_glMultiTexCoord1fARB=GLee_Lazy_glMultiTexCoord1fARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord1fvARB\r
+#define GLEE_C_DEFINED_glMultiTexCoord1fvARB\r
+  void __stdcall GLee_Lazy_glMultiTexCoord1fvARB(GLenum target, const GLfloat * v)  {if (GLeeInit()) glMultiTexCoord1fvARB(target, v);}\r
+  GLEEPFNGLMULTITEXCOORD1FVARBPROC GLeeFuncPtr_glMultiTexCoord1fvARB=GLee_Lazy_glMultiTexCoord1fvARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord1iARB\r
+#define GLEE_C_DEFINED_glMultiTexCoord1iARB\r
+  void __stdcall GLee_Lazy_glMultiTexCoord1iARB(GLenum target, GLint s)  {if (GLeeInit()) glMultiTexCoord1iARB(target, s);}\r
+  GLEEPFNGLMULTITEXCOORD1IARBPROC GLeeFuncPtr_glMultiTexCoord1iARB=GLee_Lazy_glMultiTexCoord1iARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord1ivARB\r
+#define GLEE_C_DEFINED_glMultiTexCoord1ivARB\r
+  void __stdcall GLee_Lazy_glMultiTexCoord1ivARB(GLenum target, const GLint * v)  {if (GLeeInit()) glMultiTexCoord1ivARB(target, v);}\r
+  GLEEPFNGLMULTITEXCOORD1IVARBPROC GLeeFuncPtr_glMultiTexCoord1ivARB=GLee_Lazy_glMultiTexCoord1ivARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord1sARB\r
+#define GLEE_C_DEFINED_glMultiTexCoord1sARB\r
+  void __stdcall GLee_Lazy_glMultiTexCoord1sARB(GLenum target, GLshort s)  {if (GLeeInit()) glMultiTexCoord1sARB(target, s);}\r
+  GLEEPFNGLMULTITEXCOORD1SARBPROC GLeeFuncPtr_glMultiTexCoord1sARB=GLee_Lazy_glMultiTexCoord1sARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord1svARB\r
+#define GLEE_C_DEFINED_glMultiTexCoord1svARB\r
+  void __stdcall GLee_Lazy_glMultiTexCoord1svARB(GLenum target, const GLshort * v)  {if (GLeeInit()) glMultiTexCoord1svARB(target, v);}\r
+  GLEEPFNGLMULTITEXCOORD1SVARBPROC GLeeFuncPtr_glMultiTexCoord1svARB=GLee_Lazy_glMultiTexCoord1svARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord2dARB\r
+#define GLEE_C_DEFINED_glMultiTexCoord2dARB\r
+  void __stdcall GLee_Lazy_glMultiTexCoord2dARB(GLenum target, GLdouble s, GLdouble t)  {if (GLeeInit()) glMultiTexCoord2dARB(target, s, t);}\r
+  GLEEPFNGLMULTITEXCOORD2DARBPROC GLeeFuncPtr_glMultiTexCoord2dARB=GLee_Lazy_glMultiTexCoord2dARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord2dvARB\r
+#define GLEE_C_DEFINED_glMultiTexCoord2dvARB\r
+  void __stdcall GLee_Lazy_glMultiTexCoord2dvARB(GLenum target, const GLdouble * v)  {if (GLeeInit()) glMultiTexCoord2dvARB(target, v);}\r
+  GLEEPFNGLMULTITEXCOORD2DVARBPROC GLeeFuncPtr_glMultiTexCoord2dvARB=GLee_Lazy_glMultiTexCoord2dvARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord2fARB\r
+#define GLEE_C_DEFINED_glMultiTexCoord2fARB\r
+  void __stdcall GLee_Lazy_glMultiTexCoord2fARB(GLenum target, GLfloat s, GLfloat t)  {if (GLeeInit()) glMultiTexCoord2fARB(target, s, t);}\r
+  GLEEPFNGLMULTITEXCOORD2FARBPROC GLeeFuncPtr_glMultiTexCoord2fARB=GLee_Lazy_glMultiTexCoord2fARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord2fvARB\r
+#define GLEE_C_DEFINED_glMultiTexCoord2fvARB\r
+  void __stdcall GLee_Lazy_glMultiTexCoord2fvARB(GLenum target, const GLfloat * v)  {if (GLeeInit()) glMultiTexCoord2fvARB(target, v);}\r
+  GLEEPFNGLMULTITEXCOORD2FVARBPROC GLeeFuncPtr_glMultiTexCoord2fvARB=GLee_Lazy_glMultiTexCoord2fvARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord2iARB\r
+#define GLEE_C_DEFINED_glMultiTexCoord2iARB\r
+  void __stdcall GLee_Lazy_glMultiTexCoord2iARB(GLenum target, GLint s, GLint t)  {if (GLeeInit()) glMultiTexCoord2iARB(target, s, t);}\r
+  GLEEPFNGLMULTITEXCOORD2IARBPROC GLeeFuncPtr_glMultiTexCoord2iARB=GLee_Lazy_glMultiTexCoord2iARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord2ivARB\r
+#define GLEE_C_DEFINED_glMultiTexCoord2ivARB\r
+  void __stdcall GLee_Lazy_glMultiTexCoord2ivARB(GLenum target, const GLint * v)  {if (GLeeInit()) glMultiTexCoord2ivARB(target, v);}\r
+  GLEEPFNGLMULTITEXCOORD2IVARBPROC GLeeFuncPtr_glMultiTexCoord2ivARB=GLee_Lazy_glMultiTexCoord2ivARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord2sARB\r
+#define GLEE_C_DEFINED_glMultiTexCoord2sARB\r
+  void __stdcall GLee_Lazy_glMultiTexCoord2sARB(GLenum target, GLshort s, GLshort t)  {if (GLeeInit()) glMultiTexCoord2sARB(target, s, t);}\r
+  GLEEPFNGLMULTITEXCOORD2SARBPROC GLeeFuncPtr_glMultiTexCoord2sARB=GLee_Lazy_glMultiTexCoord2sARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord2svARB\r
+#define GLEE_C_DEFINED_glMultiTexCoord2svARB\r
+  void __stdcall GLee_Lazy_glMultiTexCoord2svARB(GLenum target, const GLshort * v)  {if (GLeeInit()) glMultiTexCoord2svARB(target, v);}\r
+  GLEEPFNGLMULTITEXCOORD2SVARBPROC GLeeFuncPtr_glMultiTexCoord2svARB=GLee_Lazy_glMultiTexCoord2svARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord3dARB\r
+#define GLEE_C_DEFINED_glMultiTexCoord3dARB\r
+  void __stdcall GLee_Lazy_glMultiTexCoord3dARB(GLenum target, GLdouble s, GLdouble t, GLdouble r)  {if (GLeeInit()) glMultiTexCoord3dARB(target, s, t, r);}\r
+  GLEEPFNGLMULTITEXCOORD3DARBPROC GLeeFuncPtr_glMultiTexCoord3dARB=GLee_Lazy_glMultiTexCoord3dARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord3dvARB\r
+#define GLEE_C_DEFINED_glMultiTexCoord3dvARB\r
+  void __stdcall GLee_Lazy_glMultiTexCoord3dvARB(GLenum target, const GLdouble * v)  {if (GLeeInit()) glMultiTexCoord3dvARB(target, v);}\r
+  GLEEPFNGLMULTITEXCOORD3DVARBPROC GLeeFuncPtr_glMultiTexCoord3dvARB=GLee_Lazy_glMultiTexCoord3dvARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord3fARB\r
+#define GLEE_C_DEFINED_glMultiTexCoord3fARB\r
+  void __stdcall GLee_Lazy_glMultiTexCoord3fARB(GLenum target, GLfloat s, GLfloat t, GLfloat r)  {if (GLeeInit()) glMultiTexCoord3fARB(target, s, t, r);}\r
+  GLEEPFNGLMULTITEXCOORD3FARBPROC GLeeFuncPtr_glMultiTexCoord3fARB=GLee_Lazy_glMultiTexCoord3fARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord3fvARB\r
+#define GLEE_C_DEFINED_glMultiTexCoord3fvARB\r
+  void __stdcall GLee_Lazy_glMultiTexCoord3fvARB(GLenum target, const GLfloat * v)  {if (GLeeInit()) glMultiTexCoord3fvARB(target, v);}\r
+  GLEEPFNGLMULTITEXCOORD3FVARBPROC GLeeFuncPtr_glMultiTexCoord3fvARB=GLee_Lazy_glMultiTexCoord3fvARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord3iARB\r
+#define GLEE_C_DEFINED_glMultiTexCoord3iARB\r
+  void __stdcall GLee_Lazy_glMultiTexCoord3iARB(GLenum target, GLint s, GLint t, GLint r)  {if (GLeeInit()) glMultiTexCoord3iARB(target, s, t, r);}\r
+  GLEEPFNGLMULTITEXCOORD3IARBPROC GLeeFuncPtr_glMultiTexCoord3iARB=GLee_Lazy_glMultiTexCoord3iARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord3ivARB\r
+#define GLEE_C_DEFINED_glMultiTexCoord3ivARB\r
+  void __stdcall GLee_Lazy_glMultiTexCoord3ivARB(GLenum target, const GLint * v)  {if (GLeeInit()) glMultiTexCoord3ivARB(target, v);}\r
+  GLEEPFNGLMULTITEXCOORD3IVARBPROC GLeeFuncPtr_glMultiTexCoord3ivARB=GLee_Lazy_glMultiTexCoord3ivARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord3sARB\r
+#define GLEE_C_DEFINED_glMultiTexCoord3sARB\r
+  void __stdcall GLee_Lazy_glMultiTexCoord3sARB(GLenum target, GLshort s, GLshort t, GLshort r)  {if (GLeeInit()) glMultiTexCoord3sARB(target, s, t, r);}\r
+  GLEEPFNGLMULTITEXCOORD3SARBPROC GLeeFuncPtr_glMultiTexCoord3sARB=GLee_Lazy_glMultiTexCoord3sARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord3svARB\r
+#define GLEE_C_DEFINED_glMultiTexCoord3svARB\r
+  void __stdcall GLee_Lazy_glMultiTexCoord3svARB(GLenum target, const GLshort * v)  {if (GLeeInit()) glMultiTexCoord3svARB(target, v);}\r
+  GLEEPFNGLMULTITEXCOORD3SVARBPROC GLeeFuncPtr_glMultiTexCoord3svARB=GLee_Lazy_glMultiTexCoord3svARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord4dARB\r
+#define GLEE_C_DEFINED_glMultiTexCoord4dARB\r
+  void __stdcall GLee_Lazy_glMultiTexCoord4dARB(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q)  {if (GLeeInit()) glMultiTexCoord4dARB(target, s, t, r, q);}\r
+  GLEEPFNGLMULTITEXCOORD4DARBPROC GLeeFuncPtr_glMultiTexCoord4dARB=GLee_Lazy_glMultiTexCoord4dARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord4dvARB\r
+#define GLEE_C_DEFINED_glMultiTexCoord4dvARB\r
+  void __stdcall GLee_Lazy_glMultiTexCoord4dvARB(GLenum target, const GLdouble * v)  {if (GLeeInit()) glMultiTexCoord4dvARB(target, v);}\r
+  GLEEPFNGLMULTITEXCOORD4DVARBPROC GLeeFuncPtr_glMultiTexCoord4dvARB=GLee_Lazy_glMultiTexCoord4dvARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord4fARB\r
+#define GLEE_C_DEFINED_glMultiTexCoord4fARB\r
+  void __stdcall GLee_Lazy_glMultiTexCoord4fARB(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q)  {if (GLeeInit()) glMultiTexCoord4fARB(target, s, t, r, q);}\r
+  GLEEPFNGLMULTITEXCOORD4FARBPROC GLeeFuncPtr_glMultiTexCoord4fARB=GLee_Lazy_glMultiTexCoord4fARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord4fvARB\r
+#define GLEE_C_DEFINED_glMultiTexCoord4fvARB\r
+  void __stdcall GLee_Lazy_glMultiTexCoord4fvARB(GLenum target, const GLfloat * v)  {if (GLeeInit()) glMultiTexCoord4fvARB(target, v);}\r
+  GLEEPFNGLMULTITEXCOORD4FVARBPROC GLeeFuncPtr_glMultiTexCoord4fvARB=GLee_Lazy_glMultiTexCoord4fvARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord4iARB\r
+#define GLEE_C_DEFINED_glMultiTexCoord4iARB\r
+  void __stdcall GLee_Lazy_glMultiTexCoord4iARB(GLenum target, GLint s, GLint t, GLint r, GLint q)  {if (GLeeInit()) glMultiTexCoord4iARB(target, s, t, r, q);}\r
+  GLEEPFNGLMULTITEXCOORD4IARBPROC GLeeFuncPtr_glMultiTexCoord4iARB=GLee_Lazy_glMultiTexCoord4iARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord4ivARB\r
+#define GLEE_C_DEFINED_glMultiTexCoord4ivARB\r
+  void __stdcall GLee_Lazy_glMultiTexCoord4ivARB(GLenum target, const GLint * v)  {if (GLeeInit()) glMultiTexCoord4ivARB(target, v);}\r
+  GLEEPFNGLMULTITEXCOORD4IVARBPROC GLeeFuncPtr_glMultiTexCoord4ivARB=GLee_Lazy_glMultiTexCoord4ivARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord4sARB\r
+#define GLEE_C_DEFINED_glMultiTexCoord4sARB\r
+  void __stdcall GLee_Lazy_glMultiTexCoord4sARB(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q)  {if (GLeeInit()) glMultiTexCoord4sARB(target, s, t, r, q);}\r
+  GLEEPFNGLMULTITEXCOORD4SARBPROC GLeeFuncPtr_glMultiTexCoord4sARB=GLee_Lazy_glMultiTexCoord4sARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord4svARB\r
+#define GLEE_C_DEFINED_glMultiTexCoord4svARB\r
+  void __stdcall GLee_Lazy_glMultiTexCoord4svARB(GLenum target, const GLshort * v)  {if (GLeeInit()) glMultiTexCoord4svARB(target, v);}\r
+  GLEEPFNGLMULTITEXCOORD4SVARBPROC GLeeFuncPtr_glMultiTexCoord4svARB=GLee_Lazy_glMultiTexCoord4svARB;\r
+#endif\r
+#endif \r
+\r
+/* GL_ARB_transpose_matrix */\r
+\r
+#ifdef __GLEE_GL_ARB_transpose_matrix\r
+#ifndef GLEE_C_DEFINED_glLoadTransposeMatrixfARB\r
+#define GLEE_C_DEFINED_glLoadTransposeMatrixfARB\r
+  void __stdcall GLee_Lazy_glLoadTransposeMatrixfARB(const GLfloat * m)  {if (GLeeInit()) glLoadTransposeMatrixfARB(m);}\r
+  GLEEPFNGLLOADTRANSPOSEMATRIXFARBPROC GLeeFuncPtr_glLoadTransposeMatrixfARB=GLee_Lazy_glLoadTransposeMatrixfARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glLoadTransposeMatrixdARB\r
+#define GLEE_C_DEFINED_glLoadTransposeMatrixdARB\r
+  void __stdcall GLee_Lazy_glLoadTransposeMatrixdARB(const GLdouble * m)  {if (GLeeInit()) glLoadTransposeMatrixdARB(m);}\r
+  GLEEPFNGLLOADTRANSPOSEMATRIXDARBPROC GLeeFuncPtr_glLoadTransposeMatrixdARB=GLee_Lazy_glLoadTransposeMatrixdARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultTransposeMatrixfARB\r
+#define GLEE_C_DEFINED_glMultTransposeMatrixfARB\r
+  void __stdcall GLee_Lazy_glMultTransposeMatrixfARB(const GLfloat * m)  {if (GLeeInit()) glMultTransposeMatrixfARB(m);}\r
+  GLEEPFNGLMULTTRANSPOSEMATRIXFARBPROC GLeeFuncPtr_glMultTransposeMatrixfARB=GLee_Lazy_glMultTransposeMatrixfARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultTransposeMatrixdARB\r
+#define GLEE_C_DEFINED_glMultTransposeMatrixdARB\r
+  void __stdcall GLee_Lazy_glMultTransposeMatrixdARB(const GLdouble * m)  {if (GLeeInit()) glMultTransposeMatrixdARB(m);}\r
+  GLEEPFNGLMULTTRANSPOSEMATRIXDARBPROC GLeeFuncPtr_glMultTransposeMatrixdARB=GLee_Lazy_glMultTransposeMatrixdARB;\r
+#endif\r
+#endif \r
+\r
+/* GL_ARB_multisample */\r
+\r
+#ifdef __GLEE_GL_ARB_multisample\r
+#ifndef GLEE_C_DEFINED_glSampleCoverageARB\r
+#define GLEE_C_DEFINED_glSampleCoverageARB\r
+  void __stdcall GLee_Lazy_glSampleCoverageARB(GLclampf value, GLboolean invert)  {if (GLeeInit()) glSampleCoverageARB(value, invert);}\r
+  GLEEPFNGLSAMPLECOVERAGEARBPROC GLeeFuncPtr_glSampleCoverageARB=GLee_Lazy_glSampleCoverageARB;\r
+#endif\r
+#endif \r
+\r
+/* GL_ARB_texture_env_add */\r
+\r
+#ifdef __GLEE_GL_ARB_texture_env_add\r
+#endif \r
+\r
+/* GL_ARB_texture_cube_map */\r
+\r
+#ifdef __GLEE_GL_ARB_texture_cube_map\r
+#endif \r
+\r
+/* GL_ARB_texture_compression */\r
+\r
+#ifdef __GLEE_GL_ARB_texture_compression\r
+#ifndef GLEE_C_DEFINED_glCompressedTexImage3DARB\r
+#define GLEE_C_DEFINED_glCompressedTexImage3DARB\r
+  void __stdcall GLee_Lazy_glCompressedTexImage3DARB(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid * data)  {if (GLeeInit()) glCompressedTexImage3DARB(target, level, internalformat, width, height, depth, border, imageSize, data);}\r
+  GLEEPFNGLCOMPRESSEDTEXIMAGE3DARBPROC GLeeFuncPtr_glCompressedTexImage3DARB=GLee_Lazy_glCompressedTexImage3DARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glCompressedTexImage2DARB\r
+#define GLEE_C_DEFINED_glCompressedTexImage2DARB\r
+  void __stdcall GLee_Lazy_glCompressedTexImage2DARB(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid * data)  {if (GLeeInit()) glCompressedTexImage2DARB(target, level, internalformat, width, height, border, imageSize, data);}\r
+  GLEEPFNGLCOMPRESSEDTEXIMAGE2DARBPROC GLeeFuncPtr_glCompressedTexImage2DARB=GLee_Lazy_glCompressedTexImage2DARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glCompressedTexImage1DARB\r
+#define GLEE_C_DEFINED_glCompressedTexImage1DARB\r
+  void __stdcall GLee_Lazy_glCompressedTexImage1DARB(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid * data)  {if (GLeeInit()) glCompressedTexImage1DARB(target, level, internalformat, width, border, imageSize, data);}\r
+  GLEEPFNGLCOMPRESSEDTEXIMAGE1DARBPROC GLeeFuncPtr_glCompressedTexImage1DARB=GLee_Lazy_glCompressedTexImage1DARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glCompressedTexSubImage3DARB\r
+#define GLEE_C_DEFINED_glCompressedTexSubImage3DARB\r
+  void __stdcall GLee_Lazy_glCompressedTexSubImage3DARB(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid * data)  {if (GLeeInit()) glCompressedTexSubImage3DARB(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);}\r
+  GLEEPFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC GLeeFuncPtr_glCompressedTexSubImage3DARB=GLee_Lazy_glCompressedTexSubImage3DARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glCompressedTexSubImage2DARB\r
+#define GLEE_C_DEFINED_glCompressedTexSubImage2DARB\r
+  void __stdcall GLee_Lazy_glCompressedTexSubImage2DARB(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid * data)  {if (GLeeInit()) glCompressedTexSubImage2DARB(target, level, xoffset, yoffset, width, height, format, imageSize, data);}\r
+  GLEEPFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC GLeeFuncPtr_glCompressedTexSubImage2DARB=GLee_Lazy_glCompressedTexSubImage2DARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glCompressedTexSubImage1DARB\r
+#define GLEE_C_DEFINED_glCompressedTexSubImage1DARB\r
+  void __stdcall GLee_Lazy_glCompressedTexSubImage1DARB(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid * data)  {if (GLeeInit()) glCompressedTexSubImage1DARB(target, level, xoffset, width, format, imageSize, data);}\r
+  GLEEPFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC GLeeFuncPtr_glCompressedTexSubImage1DARB=GLee_Lazy_glCompressedTexSubImage1DARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetCompressedTexImageARB\r
+#define GLEE_C_DEFINED_glGetCompressedTexImageARB\r
+  void __stdcall GLee_Lazy_glGetCompressedTexImageARB(GLenum target, GLint level, GLvoid * img)  {if (GLeeInit()) glGetCompressedTexImageARB(target, level, img);}\r
+  GLEEPFNGLGETCOMPRESSEDTEXIMAGEARBPROC GLeeFuncPtr_glGetCompressedTexImageARB=GLee_Lazy_glGetCompressedTexImageARB;\r
+#endif\r
+#endif \r
+\r
+/* GL_ARB_texture_border_clamp */\r
+\r
+#ifdef __GLEE_GL_ARB_texture_border_clamp\r
+#endif \r
+\r
+/* GL_ARB_point_parameters */\r
+\r
+#ifdef __GLEE_GL_ARB_point_parameters\r
+#ifndef GLEE_C_DEFINED_glPointParameterfARB\r
+#define GLEE_C_DEFINED_glPointParameterfARB\r
+  void __stdcall GLee_Lazy_glPointParameterfARB(GLenum pname, GLfloat param)  {if (GLeeInit()) glPointParameterfARB(pname, param);}\r
+  GLEEPFNGLPOINTPARAMETERFARBPROC GLeeFuncPtr_glPointParameterfARB=GLee_Lazy_glPointParameterfARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glPointParameterfvARB\r
+#define GLEE_C_DEFINED_glPointParameterfvARB\r
+  void __stdcall GLee_Lazy_glPointParameterfvARB(GLenum pname, const GLfloat * params)  {if (GLeeInit()) glPointParameterfvARB(pname, params);}\r
+  GLEEPFNGLPOINTPARAMETERFVARBPROC GLeeFuncPtr_glPointParameterfvARB=GLee_Lazy_glPointParameterfvARB;\r
+#endif\r
+#endif \r
+\r
+/* GL_ARB_vertex_blend */\r
+\r
+#ifdef __GLEE_GL_ARB_vertex_blend\r
+#ifndef GLEE_C_DEFINED_glWeightbvARB\r
+#define GLEE_C_DEFINED_glWeightbvARB\r
+  void __stdcall GLee_Lazy_glWeightbvARB(GLint size, const GLbyte * weights)  {if (GLeeInit()) glWeightbvARB(size, weights);}\r
+  GLEEPFNGLWEIGHTBVARBPROC GLeeFuncPtr_glWeightbvARB=GLee_Lazy_glWeightbvARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glWeightsvARB\r
+#define GLEE_C_DEFINED_glWeightsvARB\r
+  void __stdcall GLee_Lazy_glWeightsvARB(GLint size, const GLshort * weights)  {if (GLeeInit()) glWeightsvARB(size, weights);}\r
+  GLEEPFNGLWEIGHTSVARBPROC GLeeFuncPtr_glWeightsvARB=GLee_Lazy_glWeightsvARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glWeightivARB\r
+#define GLEE_C_DEFINED_glWeightivARB\r
+  void __stdcall GLee_Lazy_glWeightivARB(GLint size, const GLint * weights)  {if (GLeeInit()) glWeightivARB(size, weights);}\r
+  GLEEPFNGLWEIGHTIVARBPROC GLeeFuncPtr_glWeightivARB=GLee_Lazy_glWeightivARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glWeightfvARB\r
+#define GLEE_C_DEFINED_glWeightfvARB\r
+  void __stdcall GLee_Lazy_glWeightfvARB(GLint size, const GLfloat * weights)  {if (GLeeInit()) glWeightfvARB(size, weights);}\r
+  GLEEPFNGLWEIGHTFVARBPROC GLeeFuncPtr_glWeightfvARB=GLee_Lazy_glWeightfvARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glWeightdvARB\r
+#define GLEE_C_DEFINED_glWeightdvARB\r
+  void __stdcall GLee_Lazy_glWeightdvARB(GLint size, const GLdouble * weights)  {if (GLeeInit()) glWeightdvARB(size, weights);}\r
+  GLEEPFNGLWEIGHTDVARBPROC GLeeFuncPtr_glWeightdvARB=GLee_Lazy_glWeightdvARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glWeightubvARB\r
+#define GLEE_C_DEFINED_glWeightubvARB\r
+  void __stdcall GLee_Lazy_glWeightubvARB(GLint size, const GLubyte * weights)  {if (GLeeInit()) glWeightubvARB(size, weights);}\r
+  GLEEPFNGLWEIGHTUBVARBPROC GLeeFuncPtr_glWeightubvARB=GLee_Lazy_glWeightubvARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glWeightusvARB\r
+#define GLEE_C_DEFINED_glWeightusvARB\r
+  void __stdcall GLee_Lazy_glWeightusvARB(GLint size, const GLushort * weights)  {if (GLeeInit()) glWeightusvARB(size, weights);}\r
+  GLEEPFNGLWEIGHTUSVARBPROC GLeeFuncPtr_glWeightusvARB=GLee_Lazy_glWeightusvARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glWeightuivARB\r
+#define GLEE_C_DEFINED_glWeightuivARB\r
+  void __stdcall GLee_Lazy_glWeightuivARB(GLint size, const GLuint * weights)  {if (GLeeInit()) glWeightuivARB(size, weights);}\r
+  GLEEPFNGLWEIGHTUIVARBPROC GLeeFuncPtr_glWeightuivARB=GLee_Lazy_glWeightuivARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glWeightPointerARB\r
+#define GLEE_C_DEFINED_glWeightPointerARB\r
+  void __stdcall GLee_Lazy_glWeightPointerARB(GLint size, GLenum type, GLsizei stride, const GLvoid * pointer)  {if (GLeeInit()) glWeightPointerARB(size, type, stride, pointer);}\r
+  GLEEPFNGLWEIGHTPOINTERARBPROC GLeeFuncPtr_glWeightPointerARB=GLee_Lazy_glWeightPointerARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexBlendARB\r
+#define GLEE_C_DEFINED_glVertexBlendARB\r
+  void __stdcall GLee_Lazy_glVertexBlendARB(GLint count)  {if (GLeeInit()) glVertexBlendARB(count);}\r
+  GLEEPFNGLVERTEXBLENDARBPROC GLeeFuncPtr_glVertexBlendARB=GLee_Lazy_glVertexBlendARB;\r
+#endif\r
+#endif \r
+\r
+/* GL_ARB_matrix_palette */\r
+\r
+#ifdef __GLEE_GL_ARB_matrix_palette\r
+#ifndef GLEE_C_DEFINED_glCurrentPaletteMatrixARB\r
+#define GLEE_C_DEFINED_glCurrentPaletteMatrixARB\r
+  void __stdcall GLee_Lazy_glCurrentPaletteMatrixARB(GLint index)  {if (GLeeInit()) glCurrentPaletteMatrixARB(index);}\r
+  GLEEPFNGLCURRENTPALETTEMATRIXARBPROC GLeeFuncPtr_glCurrentPaletteMatrixARB=GLee_Lazy_glCurrentPaletteMatrixARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMatrixIndexubvARB\r
+#define GLEE_C_DEFINED_glMatrixIndexubvARB\r
+  void __stdcall GLee_Lazy_glMatrixIndexubvARB(GLint size, const GLubyte * indices)  {if (GLeeInit()) glMatrixIndexubvARB(size, indices);}\r
+  GLEEPFNGLMATRIXINDEXUBVARBPROC GLeeFuncPtr_glMatrixIndexubvARB=GLee_Lazy_glMatrixIndexubvARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMatrixIndexusvARB\r
+#define GLEE_C_DEFINED_glMatrixIndexusvARB\r
+  void __stdcall GLee_Lazy_glMatrixIndexusvARB(GLint size, const GLushort * indices)  {if (GLeeInit()) glMatrixIndexusvARB(size, indices);}\r
+  GLEEPFNGLMATRIXINDEXUSVARBPROC GLeeFuncPtr_glMatrixIndexusvARB=GLee_Lazy_glMatrixIndexusvARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMatrixIndexuivARB\r
+#define GLEE_C_DEFINED_glMatrixIndexuivARB\r
+  void __stdcall GLee_Lazy_glMatrixIndexuivARB(GLint size, const GLuint * indices)  {if (GLeeInit()) glMatrixIndexuivARB(size, indices);}\r
+  GLEEPFNGLMATRIXINDEXUIVARBPROC GLeeFuncPtr_glMatrixIndexuivARB=GLee_Lazy_glMatrixIndexuivARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMatrixIndexPointerARB\r
+#define GLEE_C_DEFINED_glMatrixIndexPointerARB\r
+  void __stdcall GLee_Lazy_glMatrixIndexPointerARB(GLint size, GLenum type, GLsizei stride, const GLvoid * pointer)  {if (GLeeInit()) glMatrixIndexPointerARB(size, type, stride, pointer);}\r
+  GLEEPFNGLMATRIXINDEXPOINTERARBPROC GLeeFuncPtr_glMatrixIndexPointerARB=GLee_Lazy_glMatrixIndexPointerARB;\r
+#endif\r
+#endif \r
+\r
+/* GL_ARB_texture_env_combine */\r
+\r
+#ifdef __GLEE_GL_ARB_texture_env_combine\r
+#endif \r
+\r
+/* GL_ARB_texture_env_crossbar */\r
+\r
+#ifdef __GLEE_GL_ARB_texture_env_crossbar\r
+#endif \r
+\r
+/* GL_ARB_texture_env_dot3 */\r
+\r
+#ifdef __GLEE_GL_ARB_texture_env_dot3\r
+#endif \r
+\r
+/* GL_ARB_texture_mirrored_repeat */\r
+\r
+#ifdef __GLEE_GL_ARB_texture_mirrored_repeat\r
+#endif \r
+\r
+/* GL_ARB_depth_texture */\r
+\r
+#ifdef __GLEE_GL_ARB_depth_texture\r
+#endif \r
+\r
+/* GL_ARB_shadow */\r
+\r
+#ifdef __GLEE_GL_ARB_shadow\r
+#endif \r
+\r
+/* GL_ARB_shadow_ambient */\r
+\r
+#ifdef __GLEE_GL_ARB_shadow_ambient\r
+#endif \r
+\r
+/* GL_ARB_window_pos */\r
+\r
+#ifdef __GLEE_GL_ARB_window_pos\r
+#ifndef GLEE_C_DEFINED_glWindowPos2dARB\r
+#define GLEE_C_DEFINED_glWindowPos2dARB\r
+  void __stdcall GLee_Lazy_glWindowPos2dARB(GLdouble x, GLdouble y)  {if (GLeeInit()) glWindowPos2dARB(x, y);}\r
+  GLEEPFNGLWINDOWPOS2DARBPROC GLeeFuncPtr_glWindowPos2dARB=GLee_Lazy_glWindowPos2dARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glWindowPos2dvARB\r
+#define GLEE_C_DEFINED_glWindowPos2dvARB\r
+  void __stdcall GLee_Lazy_glWindowPos2dvARB(const GLdouble * v)  {if (GLeeInit()) glWindowPos2dvARB(v);}\r
+  GLEEPFNGLWINDOWPOS2DVARBPROC GLeeFuncPtr_glWindowPos2dvARB=GLee_Lazy_glWindowPos2dvARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glWindowPos2fARB\r
+#define GLEE_C_DEFINED_glWindowPos2fARB\r
+  void __stdcall GLee_Lazy_glWindowPos2fARB(GLfloat x, GLfloat y)  {if (GLeeInit()) glWindowPos2fARB(x, y);}\r
+  GLEEPFNGLWINDOWPOS2FARBPROC GLeeFuncPtr_glWindowPos2fARB=GLee_Lazy_glWindowPos2fARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glWindowPos2fvARB\r
+#define GLEE_C_DEFINED_glWindowPos2fvARB\r
+  void __stdcall GLee_Lazy_glWindowPos2fvARB(const GLfloat * v)  {if (GLeeInit()) glWindowPos2fvARB(v);}\r
+  GLEEPFNGLWINDOWPOS2FVARBPROC GLeeFuncPtr_glWindowPos2fvARB=GLee_Lazy_glWindowPos2fvARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glWindowPos2iARB\r
+#define GLEE_C_DEFINED_glWindowPos2iARB\r
+  void __stdcall GLee_Lazy_glWindowPos2iARB(GLint x, GLint y)  {if (GLeeInit()) glWindowPos2iARB(x, y);}\r
+  GLEEPFNGLWINDOWPOS2IARBPROC GLeeFuncPtr_glWindowPos2iARB=GLee_Lazy_glWindowPos2iARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glWindowPos2ivARB\r
+#define GLEE_C_DEFINED_glWindowPos2ivARB\r
+  void __stdcall GLee_Lazy_glWindowPos2ivARB(const GLint * v)  {if (GLeeInit()) glWindowPos2ivARB(v);}\r
+  GLEEPFNGLWINDOWPOS2IVARBPROC GLeeFuncPtr_glWindowPos2ivARB=GLee_Lazy_glWindowPos2ivARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glWindowPos2sARB\r
+#define GLEE_C_DEFINED_glWindowPos2sARB\r
+  void __stdcall GLee_Lazy_glWindowPos2sARB(GLshort x, GLshort y)  {if (GLeeInit()) glWindowPos2sARB(x, y);}\r
+  GLEEPFNGLWINDOWPOS2SARBPROC GLeeFuncPtr_glWindowPos2sARB=GLee_Lazy_glWindowPos2sARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glWindowPos2svARB\r
+#define GLEE_C_DEFINED_glWindowPos2svARB\r
+  void __stdcall GLee_Lazy_glWindowPos2svARB(const GLshort * v)  {if (GLeeInit()) glWindowPos2svARB(v);}\r
+  GLEEPFNGLWINDOWPOS2SVARBPROC GLeeFuncPtr_glWindowPos2svARB=GLee_Lazy_glWindowPos2svARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glWindowPos3dARB\r
+#define GLEE_C_DEFINED_glWindowPos3dARB\r
+  void __stdcall GLee_Lazy_glWindowPos3dARB(GLdouble x, GLdouble y, GLdouble z)  {if (GLeeInit()) glWindowPos3dARB(x, y, z);}\r
+  GLEEPFNGLWINDOWPOS3DARBPROC GLeeFuncPtr_glWindowPos3dARB=GLee_Lazy_glWindowPos3dARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glWindowPos3dvARB\r
+#define GLEE_C_DEFINED_glWindowPos3dvARB\r
+  void __stdcall GLee_Lazy_glWindowPos3dvARB(const GLdouble * v)  {if (GLeeInit()) glWindowPos3dvARB(v);}\r
+  GLEEPFNGLWINDOWPOS3DVARBPROC GLeeFuncPtr_glWindowPos3dvARB=GLee_Lazy_glWindowPos3dvARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glWindowPos3fARB\r
+#define GLEE_C_DEFINED_glWindowPos3fARB\r
+  void __stdcall GLee_Lazy_glWindowPos3fARB(GLfloat x, GLfloat y, GLfloat z)  {if (GLeeInit()) glWindowPos3fARB(x, y, z);}\r
+  GLEEPFNGLWINDOWPOS3FARBPROC GLeeFuncPtr_glWindowPos3fARB=GLee_Lazy_glWindowPos3fARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glWindowPos3fvARB\r
+#define GLEE_C_DEFINED_glWindowPos3fvARB\r
+  void __stdcall GLee_Lazy_glWindowPos3fvARB(const GLfloat * v)  {if (GLeeInit()) glWindowPos3fvARB(v);}\r
+  GLEEPFNGLWINDOWPOS3FVARBPROC GLeeFuncPtr_glWindowPos3fvARB=GLee_Lazy_glWindowPos3fvARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glWindowPos3iARB\r
+#define GLEE_C_DEFINED_glWindowPos3iARB\r
+  void __stdcall GLee_Lazy_glWindowPos3iARB(GLint x, GLint y, GLint z)  {if (GLeeInit()) glWindowPos3iARB(x, y, z);}\r
+  GLEEPFNGLWINDOWPOS3IARBPROC GLeeFuncPtr_glWindowPos3iARB=GLee_Lazy_glWindowPos3iARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glWindowPos3ivARB\r
+#define GLEE_C_DEFINED_glWindowPos3ivARB\r
+  void __stdcall GLee_Lazy_glWindowPos3ivARB(const GLint * v)  {if (GLeeInit()) glWindowPos3ivARB(v);}\r
+  GLEEPFNGLWINDOWPOS3IVARBPROC GLeeFuncPtr_glWindowPos3ivARB=GLee_Lazy_glWindowPos3ivARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glWindowPos3sARB\r
+#define GLEE_C_DEFINED_glWindowPos3sARB\r
+  void __stdcall GLee_Lazy_glWindowPos3sARB(GLshort x, GLshort y, GLshort z)  {if (GLeeInit()) glWindowPos3sARB(x, y, z);}\r
+  GLEEPFNGLWINDOWPOS3SARBPROC GLeeFuncPtr_glWindowPos3sARB=GLee_Lazy_glWindowPos3sARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glWindowPos3svARB\r
+#define GLEE_C_DEFINED_glWindowPos3svARB\r
+  void __stdcall GLee_Lazy_glWindowPos3svARB(const GLshort * v)  {if (GLeeInit()) glWindowPos3svARB(v);}\r
+  GLEEPFNGLWINDOWPOS3SVARBPROC GLeeFuncPtr_glWindowPos3svARB=GLee_Lazy_glWindowPos3svARB;\r
+#endif\r
+#endif \r
+\r
+/* GL_ARB_vertex_program */\r
+\r
+#ifdef __GLEE_GL_ARB_vertex_program\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib1dARB\r
+#define GLEE_C_DEFINED_glVertexAttrib1dARB\r
+  void __stdcall GLee_Lazy_glVertexAttrib1dARB(GLuint index, GLdouble x)  {if (GLeeInit()) glVertexAttrib1dARB(index, x);}\r
+  GLEEPFNGLVERTEXATTRIB1DARBPROC GLeeFuncPtr_glVertexAttrib1dARB=GLee_Lazy_glVertexAttrib1dARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib1dvARB\r
+#define GLEE_C_DEFINED_glVertexAttrib1dvARB\r
+  void __stdcall GLee_Lazy_glVertexAttrib1dvARB(GLuint index, const GLdouble * v)  {if (GLeeInit()) glVertexAttrib1dvARB(index, v);}\r
+  GLEEPFNGLVERTEXATTRIB1DVARBPROC GLeeFuncPtr_glVertexAttrib1dvARB=GLee_Lazy_glVertexAttrib1dvARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib1fARB\r
+#define GLEE_C_DEFINED_glVertexAttrib1fARB\r
+  void __stdcall GLee_Lazy_glVertexAttrib1fARB(GLuint index, GLfloat x)  {if (GLeeInit()) glVertexAttrib1fARB(index, x);}\r
+  GLEEPFNGLVERTEXATTRIB1FARBPROC GLeeFuncPtr_glVertexAttrib1fARB=GLee_Lazy_glVertexAttrib1fARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib1fvARB\r
+#define GLEE_C_DEFINED_glVertexAttrib1fvARB\r
+  void __stdcall GLee_Lazy_glVertexAttrib1fvARB(GLuint index, const GLfloat * v)  {if (GLeeInit()) glVertexAttrib1fvARB(index, v);}\r
+  GLEEPFNGLVERTEXATTRIB1FVARBPROC GLeeFuncPtr_glVertexAttrib1fvARB=GLee_Lazy_glVertexAttrib1fvARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib1sARB\r
+#define GLEE_C_DEFINED_glVertexAttrib1sARB\r
+  void __stdcall GLee_Lazy_glVertexAttrib1sARB(GLuint index, GLshort x)  {if (GLeeInit()) glVertexAttrib1sARB(index, x);}\r
+  GLEEPFNGLVERTEXATTRIB1SARBPROC GLeeFuncPtr_glVertexAttrib1sARB=GLee_Lazy_glVertexAttrib1sARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib1svARB\r
+#define GLEE_C_DEFINED_glVertexAttrib1svARB\r
+  void __stdcall GLee_Lazy_glVertexAttrib1svARB(GLuint index, const GLshort * v)  {if (GLeeInit()) glVertexAttrib1svARB(index, v);}\r
+  GLEEPFNGLVERTEXATTRIB1SVARBPROC GLeeFuncPtr_glVertexAttrib1svARB=GLee_Lazy_glVertexAttrib1svARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib2dARB\r
+#define GLEE_C_DEFINED_glVertexAttrib2dARB\r
+  void __stdcall GLee_Lazy_glVertexAttrib2dARB(GLuint index, GLdouble x, GLdouble y)  {if (GLeeInit()) glVertexAttrib2dARB(index, x, y);}\r
+  GLEEPFNGLVERTEXATTRIB2DARBPROC GLeeFuncPtr_glVertexAttrib2dARB=GLee_Lazy_glVertexAttrib2dARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib2dvARB\r
+#define GLEE_C_DEFINED_glVertexAttrib2dvARB\r
+  void __stdcall GLee_Lazy_glVertexAttrib2dvARB(GLuint index, const GLdouble * v)  {if (GLeeInit()) glVertexAttrib2dvARB(index, v);}\r
+  GLEEPFNGLVERTEXATTRIB2DVARBPROC GLeeFuncPtr_glVertexAttrib2dvARB=GLee_Lazy_glVertexAttrib2dvARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib2fARB\r
+#define GLEE_C_DEFINED_glVertexAttrib2fARB\r
+  void __stdcall GLee_Lazy_glVertexAttrib2fARB(GLuint index, GLfloat x, GLfloat y)  {if (GLeeInit()) glVertexAttrib2fARB(index, x, y);}\r
+  GLEEPFNGLVERTEXATTRIB2FARBPROC GLeeFuncPtr_glVertexAttrib2fARB=GLee_Lazy_glVertexAttrib2fARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib2fvARB\r
+#define GLEE_C_DEFINED_glVertexAttrib2fvARB\r
+  void __stdcall GLee_Lazy_glVertexAttrib2fvARB(GLuint index, const GLfloat * v)  {if (GLeeInit()) glVertexAttrib2fvARB(index, v);}\r
+  GLEEPFNGLVERTEXATTRIB2FVARBPROC GLeeFuncPtr_glVertexAttrib2fvARB=GLee_Lazy_glVertexAttrib2fvARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib2sARB\r
+#define GLEE_C_DEFINED_glVertexAttrib2sARB\r
+  void __stdcall GLee_Lazy_glVertexAttrib2sARB(GLuint index, GLshort x, GLshort y)  {if (GLeeInit()) glVertexAttrib2sARB(index, x, y);}\r
+  GLEEPFNGLVERTEXATTRIB2SARBPROC GLeeFuncPtr_glVertexAttrib2sARB=GLee_Lazy_glVertexAttrib2sARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib2svARB\r
+#define GLEE_C_DEFINED_glVertexAttrib2svARB\r
+  void __stdcall GLee_Lazy_glVertexAttrib2svARB(GLuint index, const GLshort * v)  {if (GLeeInit()) glVertexAttrib2svARB(index, v);}\r
+  GLEEPFNGLVERTEXATTRIB2SVARBPROC GLeeFuncPtr_glVertexAttrib2svARB=GLee_Lazy_glVertexAttrib2svARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib3dARB\r
+#define GLEE_C_DEFINED_glVertexAttrib3dARB\r
+  void __stdcall GLee_Lazy_glVertexAttrib3dARB(GLuint index, GLdouble x, GLdouble y, GLdouble z)  {if (GLeeInit()) glVertexAttrib3dARB(index, x, y, z);}\r
+  GLEEPFNGLVERTEXATTRIB3DARBPROC GLeeFuncPtr_glVertexAttrib3dARB=GLee_Lazy_glVertexAttrib3dARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib3dvARB\r
+#define GLEE_C_DEFINED_glVertexAttrib3dvARB\r
+  void __stdcall GLee_Lazy_glVertexAttrib3dvARB(GLuint index, const GLdouble * v)  {if (GLeeInit()) glVertexAttrib3dvARB(index, v);}\r
+  GLEEPFNGLVERTEXATTRIB3DVARBPROC GLeeFuncPtr_glVertexAttrib3dvARB=GLee_Lazy_glVertexAttrib3dvARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib3fARB\r
+#define GLEE_C_DEFINED_glVertexAttrib3fARB\r
+  void __stdcall GLee_Lazy_glVertexAttrib3fARB(GLuint index, GLfloat x, GLfloat y, GLfloat z)  {if (GLeeInit()) glVertexAttrib3fARB(index, x, y, z);}\r
+  GLEEPFNGLVERTEXATTRIB3FARBPROC GLeeFuncPtr_glVertexAttrib3fARB=GLee_Lazy_glVertexAttrib3fARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib3fvARB\r
+#define GLEE_C_DEFINED_glVertexAttrib3fvARB\r
+  void __stdcall GLee_Lazy_glVertexAttrib3fvARB(GLuint index, const GLfloat * v)  {if (GLeeInit()) glVertexAttrib3fvARB(index, v);}\r
+  GLEEPFNGLVERTEXATTRIB3FVARBPROC GLeeFuncPtr_glVertexAttrib3fvARB=GLee_Lazy_glVertexAttrib3fvARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib3sARB\r
+#define GLEE_C_DEFINED_glVertexAttrib3sARB\r
+  void __stdcall GLee_Lazy_glVertexAttrib3sARB(GLuint index, GLshort x, GLshort y, GLshort z)  {if (GLeeInit()) glVertexAttrib3sARB(index, x, y, z);}\r
+  GLEEPFNGLVERTEXATTRIB3SARBPROC GLeeFuncPtr_glVertexAttrib3sARB=GLee_Lazy_glVertexAttrib3sARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib3svARB\r
+#define GLEE_C_DEFINED_glVertexAttrib3svARB\r
+  void __stdcall GLee_Lazy_glVertexAttrib3svARB(GLuint index, const GLshort * v)  {if (GLeeInit()) glVertexAttrib3svARB(index, v);}\r
+  GLEEPFNGLVERTEXATTRIB3SVARBPROC GLeeFuncPtr_glVertexAttrib3svARB=GLee_Lazy_glVertexAttrib3svARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib4NbvARB\r
+#define GLEE_C_DEFINED_glVertexAttrib4NbvARB\r
+  void __stdcall GLee_Lazy_glVertexAttrib4NbvARB(GLuint index, const GLbyte * v)  {if (GLeeInit()) glVertexAttrib4NbvARB(index, v);}\r
+  GLEEPFNGLVERTEXATTRIB4NBVARBPROC GLeeFuncPtr_glVertexAttrib4NbvARB=GLee_Lazy_glVertexAttrib4NbvARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib4NivARB\r
+#define GLEE_C_DEFINED_glVertexAttrib4NivARB\r
+  void __stdcall GLee_Lazy_glVertexAttrib4NivARB(GLuint index, const GLint * v)  {if (GLeeInit()) glVertexAttrib4NivARB(index, v);}\r
+  GLEEPFNGLVERTEXATTRIB4NIVARBPROC GLeeFuncPtr_glVertexAttrib4NivARB=GLee_Lazy_glVertexAttrib4NivARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib4NsvARB\r
+#define GLEE_C_DEFINED_glVertexAttrib4NsvARB\r
+  void __stdcall GLee_Lazy_glVertexAttrib4NsvARB(GLuint index, const GLshort * v)  {if (GLeeInit()) glVertexAttrib4NsvARB(index, v);}\r
+  GLEEPFNGLVERTEXATTRIB4NSVARBPROC GLeeFuncPtr_glVertexAttrib4NsvARB=GLee_Lazy_glVertexAttrib4NsvARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib4NubARB\r
+#define GLEE_C_DEFINED_glVertexAttrib4NubARB\r
+  void __stdcall GLee_Lazy_glVertexAttrib4NubARB(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w)  {if (GLeeInit()) glVertexAttrib4NubARB(index, x, y, z, w);}\r
+  GLEEPFNGLVERTEXATTRIB4NUBARBPROC GLeeFuncPtr_glVertexAttrib4NubARB=GLee_Lazy_glVertexAttrib4NubARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib4NubvARB\r
+#define GLEE_C_DEFINED_glVertexAttrib4NubvARB\r
+  void __stdcall GLee_Lazy_glVertexAttrib4NubvARB(GLuint index, const GLubyte * v)  {if (GLeeInit()) glVertexAttrib4NubvARB(index, v);}\r
+  GLEEPFNGLVERTEXATTRIB4NUBVARBPROC GLeeFuncPtr_glVertexAttrib4NubvARB=GLee_Lazy_glVertexAttrib4NubvARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib4NuivARB\r
+#define GLEE_C_DEFINED_glVertexAttrib4NuivARB\r
+  void __stdcall GLee_Lazy_glVertexAttrib4NuivARB(GLuint index, const GLuint * v)  {if (GLeeInit()) glVertexAttrib4NuivARB(index, v);}\r
+  GLEEPFNGLVERTEXATTRIB4NUIVARBPROC GLeeFuncPtr_glVertexAttrib4NuivARB=GLee_Lazy_glVertexAttrib4NuivARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib4NusvARB\r
+#define GLEE_C_DEFINED_glVertexAttrib4NusvARB\r
+  void __stdcall GLee_Lazy_glVertexAttrib4NusvARB(GLuint index, const GLushort * v)  {if (GLeeInit()) glVertexAttrib4NusvARB(index, v);}\r
+  GLEEPFNGLVERTEXATTRIB4NUSVARBPROC GLeeFuncPtr_glVertexAttrib4NusvARB=GLee_Lazy_glVertexAttrib4NusvARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib4bvARB\r
+#define GLEE_C_DEFINED_glVertexAttrib4bvARB\r
+  void __stdcall GLee_Lazy_glVertexAttrib4bvARB(GLuint index, const GLbyte * v)  {if (GLeeInit()) glVertexAttrib4bvARB(index, v);}\r
+  GLEEPFNGLVERTEXATTRIB4BVARBPROC GLeeFuncPtr_glVertexAttrib4bvARB=GLee_Lazy_glVertexAttrib4bvARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib4dARB\r
+#define GLEE_C_DEFINED_glVertexAttrib4dARB\r
+  void __stdcall GLee_Lazy_glVertexAttrib4dARB(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)  {if (GLeeInit()) glVertexAttrib4dARB(index, x, y, z, w);}\r
+  GLEEPFNGLVERTEXATTRIB4DARBPROC GLeeFuncPtr_glVertexAttrib4dARB=GLee_Lazy_glVertexAttrib4dARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib4dvARB\r
+#define GLEE_C_DEFINED_glVertexAttrib4dvARB\r
+  void __stdcall GLee_Lazy_glVertexAttrib4dvARB(GLuint index, const GLdouble * v)  {if (GLeeInit()) glVertexAttrib4dvARB(index, v);}\r
+  GLEEPFNGLVERTEXATTRIB4DVARBPROC GLeeFuncPtr_glVertexAttrib4dvARB=GLee_Lazy_glVertexAttrib4dvARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib4fARB\r
+#define GLEE_C_DEFINED_glVertexAttrib4fARB\r
+  void __stdcall GLee_Lazy_glVertexAttrib4fARB(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)  {if (GLeeInit()) glVertexAttrib4fARB(index, x, y, z, w);}\r
+  GLEEPFNGLVERTEXATTRIB4FARBPROC GLeeFuncPtr_glVertexAttrib4fARB=GLee_Lazy_glVertexAttrib4fARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib4fvARB\r
+#define GLEE_C_DEFINED_glVertexAttrib4fvARB\r
+  void __stdcall GLee_Lazy_glVertexAttrib4fvARB(GLuint index, const GLfloat * v)  {if (GLeeInit()) glVertexAttrib4fvARB(index, v);}\r
+  GLEEPFNGLVERTEXATTRIB4FVARBPROC GLeeFuncPtr_glVertexAttrib4fvARB=GLee_Lazy_glVertexAttrib4fvARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib4ivARB\r
+#define GLEE_C_DEFINED_glVertexAttrib4ivARB\r
+  void __stdcall GLee_Lazy_glVertexAttrib4ivARB(GLuint index, const GLint * v)  {if (GLeeInit()) glVertexAttrib4ivARB(index, v);}\r
+  GLEEPFNGLVERTEXATTRIB4IVARBPROC GLeeFuncPtr_glVertexAttrib4ivARB=GLee_Lazy_glVertexAttrib4ivARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib4sARB\r
+#define GLEE_C_DEFINED_glVertexAttrib4sARB\r
+  void __stdcall GLee_Lazy_glVertexAttrib4sARB(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w)  {if (GLeeInit()) glVertexAttrib4sARB(index, x, y, z, w);}\r
+  GLEEPFNGLVERTEXATTRIB4SARBPROC GLeeFuncPtr_glVertexAttrib4sARB=GLee_Lazy_glVertexAttrib4sARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib4svARB\r
+#define GLEE_C_DEFINED_glVertexAttrib4svARB\r
+  void __stdcall GLee_Lazy_glVertexAttrib4svARB(GLuint index, const GLshort * v)  {if (GLeeInit()) glVertexAttrib4svARB(index, v);}\r
+  GLEEPFNGLVERTEXATTRIB4SVARBPROC GLeeFuncPtr_glVertexAttrib4svARB=GLee_Lazy_glVertexAttrib4svARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib4ubvARB\r
+#define GLEE_C_DEFINED_glVertexAttrib4ubvARB\r
+  void __stdcall GLee_Lazy_glVertexAttrib4ubvARB(GLuint index, const GLubyte * v)  {if (GLeeInit()) glVertexAttrib4ubvARB(index, v);}\r
+  GLEEPFNGLVERTEXATTRIB4UBVARBPROC GLeeFuncPtr_glVertexAttrib4ubvARB=GLee_Lazy_glVertexAttrib4ubvARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib4uivARB\r
+#define GLEE_C_DEFINED_glVertexAttrib4uivARB\r
+  void __stdcall GLee_Lazy_glVertexAttrib4uivARB(GLuint index, const GLuint * v)  {if (GLeeInit()) glVertexAttrib4uivARB(index, v);}\r
+  GLEEPFNGLVERTEXATTRIB4UIVARBPROC GLeeFuncPtr_glVertexAttrib4uivARB=GLee_Lazy_glVertexAttrib4uivARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib4usvARB\r
+#define GLEE_C_DEFINED_glVertexAttrib4usvARB\r
+  void __stdcall GLee_Lazy_glVertexAttrib4usvARB(GLuint index, const GLushort * v)  {if (GLeeInit()) glVertexAttrib4usvARB(index, v);}\r
+  GLEEPFNGLVERTEXATTRIB4USVARBPROC GLeeFuncPtr_glVertexAttrib4usvARB=GLee_Lazy_glVertexAttrib4usvARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttribPointerARB\r
+#define GLEE_C_DEFINED_glVertexAttribPointerARB\r
+  void __stdcall GLee_Lazy_glVertexAttribPointerARB(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid * pointer)  {if (GLeeInit()) glVertexAttribPointerARB(index, size, type, normalized, stride, pointer);}\r
+  GLEEPFNGLVERTEXATTRIBPOINTERARBPROC GLeeFuncPtr_glVertexAttribPointerARB=GLee_Lazy_glVertexAttribPointerARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glEnableVertexAttribArrayARB\r
+#define GLEE_C_DEFINED_glEnableVertexAttribArrayARB\r
+  void __stdcall GLee_Lazy_glEnableVertexAttribArrayARB(GLuint index)  {if (GLeeInit()) glEnableVertexAttribArrayARB(index);}\r
+  GLEEPFNGLENABLEVERTEXATTRIBARRAYARBPROC GLeeFuncPtr_glEnableVertexAttribArrayARB=GLee_Lazy_glEnableVertexAttribArrayARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glDisableVertexAttribArrayARB\r
+#define GLEE_C_DEFINED_glDisableVertexAttribArrayARB\r
+  void __stdcall GLee_Lazy_glDisableVertexAttribArrayARB(GLuint index)  {if (GLeeInit()) glDisableVertexAttribArrayARB(index);}\r
+  GLEEPFNGLDISABLEVERTEXATTRIBARRAYARBPROC GLeeFuncPtr_glDisableVertexAttribArrayARB=GLee_Lazy_glDisableVertexAttribArrayARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramStringARB\r
+#define GLEE_C_DEFINED_glProgramStringARB\r
+  void __stdcall GLee_Lazy_glProgramStringARB(GLenum target, GLenum format, GLsizei len, const GLvoid * string)  {if (GLeeInit()) glProgramStringARB(target, format, len, string);}\r
+  GLEEPFNGLPROGRAMSTRINGARBPROC GLeeFuncPtr_glProgramStringARB=GLee_Lazy_glProgramStringARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glBindProgramARB\r
+#define GLEE_C_DEFINED_glBindProgramARB\r
+  void __stdcall GLee_Lazy_glBindProgramARB(GLenum target, GLuint program)  {if (GLeeInit()) glBindProgramARB(target, program);}\r
+  GLEEPFNGLBINDPROGRAMARBPROC GLeeFuncPtr_glBindProgramARB=GLee_Lazy_glBindProgramARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glDeleteProgramsARB\r
+#define GLEE_C_DEFINED_glDeleteProgramsARB\r
+  void __stdcall GLee_Lazy_glDeleteProgramsARB(GLsizei n, const GLuint * programs)  {if (GLeeInit()) glDeleteProgramsARB(n, programs);}\r
+  GLEEPFNGLDELETEPROGRAMSARBPROC GLeeFuncPtr_glDeleteProgramsARB=GLee_Lazy_glDeleteProgramsARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGenProgramsARB\r
+#define GLEE_C_DEFINED_glGenProgramsARB\r
+  void __stdcall GLee_Lazy_glGenProgramsARB(GLsizei n, GLuint * programs)  {if (GLeeInit()) glGenProgramsARB(n, programs);}\r
+  GLEEPFNGLGENPROGRAMSARBPROC GLeeFuncPtr_glGenProgramsARB=GLee_Lazy_glGenProgramsARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramEnvParameter4dARB\r
+#define GLEE_C_DEFINED_glProgramEnvParameter4dARB\r
+  void __stdcall GLee_Lazy_glProgramEnvParameter4dARB(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)  {if (GLeeInit()) glProgramEnvParameter4dARB(target, index, x, y, z, w);}\r
+  GLEEPFNGLPROGRAMENVPARAMETER4DARBPROC GLeeFuncPtr_glProgramEnvParameter4dARB=GLee_Lazy_glProgramEnvParameter4dARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramEnvParameter4dvARB\r
+#define GLEE_C_DEFINED_glProgramEnvParameter4dvARB\r
+  void __stdcall GLee_Lazy_glProgramEnvParameter4dvARB(GLenum target, GLuint index, const GLdouble * params)  {if (GLeeInit()) glProgramEnvParameter4dvARB(target, index, params);}\r
+  GLEEPFNGLPROGRAMENVPARAMETER4DVARBPROC GLeeFuncPtr_glProgramEnvParameter4dvARB=GLee_Lazy_glProgramEnvParameter4dvARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramEnvParameter4fARB\r
+#define GLEE_C_DEFINED_glProgramEnvParameter4fARB\r
+  void __stdcall GLee_Lazy_glProgramEnvParameter4fARB(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)  {if (GLeeInit()) glProgramEnvParameter4fARB(target, index, x, y, z, w);}\r
+  GLEEPFNGLPROGRAMENVPARAMETER4FARBPROC GLeeFuncPtr_glProgramEnvParameter4fARB=GLee_Lazy_glProgramEnvParameter4fARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramEnvParameter4fvARB\r
+#define GLEE_C_DEFINED_glProgramEnvParameter4fvARB\r
+  void __stdcall GLee_Lazy_glProgramEnvParameter4fvARB(GLenum target, GLuint index, const GLfloat * params)  {if (GLeeInit()) glProgramEnvParameter4fvARB(target, index, params);}\r
+  GLEEPFNGLPROGRAMENVPARAMETER4FVARBPROC GLeeFuncPtr_glProgramEnvParameter4fvARB=GLee_Lazy_glProgramEnvParameter4fvARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramLocalParameter4dARB\r
+#define GLEE_C_DEFINED_glProgramLocalParameter4dARB\r
+  void __stdcall GLee_Lazy_glProgramLocalParameter4dARB(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)  {if (GLeeInit()) glProgramLocalParameter4dARB(target, index, x, y, z, w);}\r
+  GLEEPFNGLPROGRAMLOCALPARAMETER4DARBPROC GLeeFuncPtr_glProgramLocalParameter4dARB=GLee_Lazy_glProgramLocalParameter4dARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramLocalParameter4dvARB\r
+#define GLEE_C_DEFINED_glProgramLocalParameter4dvARB\r
+  void __stdcall GLee_Lazy_glProgramLocalParameter4dvARB(GLenum target, GLuint index, const GLdouble * params)  {if (GLeeInit()) glProgramLocalParameter4dvARB(target, index, params);}\r
+  GLEEPFNGLPROGRAMLOCALPARAMETER4DVARBPROC GLeeFuncPtr_glProgramLocalParameter4dvARB=GLee_Lazy_glProgramLocalParameter4dvARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramLocalParameter4fARB\r
+#define GLEE_C_DEFINED_glProgramLocalParameter4fARB\r
+  void __stdcall GLee_Lazy_glProgramLocalParameter4fARB(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)  {if (GLeeInit()) glProgramLocalParameter4fARB(target, index, x, y, z, w);}\r
+  GLEEPFNGLPROGRAMLOCALPARAMETER4FARBPROC GLeeFuncPtr_glProgramLocalParameter4fARB=GLee_Lazy_glProgramLocalParameter4fARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramLocalParameter4fvARB\r
+#define GLEE_C_DEFINED_glProgramLocalParameter4fvARB\r
+  void __stdcall GLee_Lazy_glProgramLocalParameter4fvARB(GLenum target, GLuint index, const GLfloat * params)  {if (GLeeInit()) glProgramLocalParameter4fvARB(target, index, params);}\r
+  GLEEPFNGLPROGRAMLOCALPARAMETER4FVARBPROC GLeeFuncPtr_glProgramLocalParameter4fvARB=GLee_Lazy_glProgramLocalParameter4fvARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetProgramEnvParameterdvARB\r
+#define GLEE_C_DEFINED_glGetProgramEnvParameterdvARB\r
+  void __stdcall GLee_Lazy_glGetProgramEnvParameterdvARB(GLenum target, GLuint index, GLdouble * params)  {if (GLeeInit()) glGetProgramEnvParameterdvARB(target, index, params);}\r
+  GLEEPFNGLGETPROGRAMENVPARAMETERDVARBPROC GLeeFuncPtr_glGetProgramEnvParameterdvARB=GLee_Lazy_glGetProgramEnvParameterdvARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetProgramEnvParameterfvARB\r
+#define GLEE_C_DEFINED_glGetProgramEnvParameterfvARB\r
+  void __stdcall GLee_Lazy_glGetProgramEnvParameterfvARB(GLenum target, GLuint index, GLfloat * params)  {if (GLeeInit()) glGetProgramEnvParameterfvARB(target, index, params);}\r
+  GLEEPFNGLGETPROGRAMENVPARAMETERFVARBPROC GLeeFuncPtr_glGetProgramEnvParameterfvARB=GLee_Lazy_glGetProgramEnvParameterfvARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetProgramLocalParameterdvARB\r
+#define GLEE_C_DEFINED_glGetProgramLocalParameterdvARB\r
+  void __stdcall GLee_Lazy_glGetProgramLocalParameterdvARB(GLenum target, GLuint index, GLdouble * params)  {if (GLeeInit()) glGetProgramLocalParameterdvARB(target, index, params);}\r
+  GLEEPFNGLGETPROGRAMLOCALPARAMETERDVARBPROC GLeeFuncPtr_glGetProgramLocalParameterdvARB=GLee_Lazy_glGetProgramLocalParameterdvARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetProgramLocalParameterfvARB\r
+#define GLEE_C_DEFINED_glGetProgramLocalParameterfvARB\r
+  void __stdcall GLee_Lazy_glGetProgramLocalParameterfvARB(GLenum target, GLuint index, GLfloat * params)  {if (GLeeInit()) glGetProgramLocalParameterfvARB(target, index, params);}\r
+  GLEEPFNGLGETPROGRAMLOCALPARAMETERFVARBPROC GLeeFuncPtr_glGetProgramLocalParameterfvARB=GLee_Lazy_glGetProgramLocalParameterfvARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetProgramivARB\r
+#define GLEE_C_DEFINED_glGetProgramivARB\r
+  void __stdcall GLee_Lazy_glGetProgramivARB(GLenum target, GLenum pname, GLint * params)  {if (GLeeInit()) glGetProgramivARB(target, pname, params);}\r
+  GLEEPFNGLGETPROGRAMIVARBPROC GLeeFuncPtr_glGetProgramivARB=GLee_Lazy_glGetProgramivARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetProgramStringARB\r
+#define GLEE_C_DEFINED_glGetProgramStringARB\r
+  void __stdcall GLee_Lazy_glGetProgramStringARB(GLenum target, GLenum pname, GLvoid * string)  {if (GLeeInit()) glGetProgramStringARB(target, pname, string);}\r
+  GLEEPFNGLGETPROGRAMSTRINGARBPROC GLeeFuncPtr_glGetProgramStringARB=GLee_Lazy_glGetProgramStringARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetVertexAttribdvARB\r
+#define GLEE_C_DEFINED_glGetVertexAttribdvARB\r
+  void __stdcall GLee_Lazy_glGetVertexAttribdvARB(GLuint index, GLenum pname, GLdouble * params)  {if (GLeeInit()) glGetVertexAttribdvARB(index, pname, params);}\r
+  GLEEPFNGLGETVERTEXATTRIBDVARBPROC GLeeFuncPtr_glGetVertexAttribdvARB=GLee_Lazy_glGetVertexAttribdvARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetVertexAttribfvARB\r
+#define GLEE_C_DEFINED_glGetVertexAttribfvARB\r
+  void __stdcall GLee_Lazy_glGetVertexAttribfvARB(GLuint index, GLenum pname, GLfloat * params)  {if (GLeeInit()) glGetVertexAttribfvARB(index, pname, params);}\r
+  GLEEPFNGLGETVERTEXATTRIBFVARBPROC GLeeFuncPtr_glGetVertexAttribfvARB=GLee_Lazy_glGetVertexAttribfvARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetVertexAttribivARB\r
+#define GLEE_C_DEFINED_glGetVertexAttribivARB\r
+  void __stdcall GLee_Lazy_glGetVertexAttribivARB(GLuint index, GLenum pname, GLint * params)  {if (GLeeInit()) glGetVertexAttribivARB(index, pname, params);}\r
+  GLEEPFNGLGETVERTEXATTRIBIVARBPROC GLeeFuncPtr_glGetVertexAttribivARB=GLee_Lazy_glGetVertexAttribivARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetVertexAttribPointervARB\r
+#define GLEE_C_DEFINED_glGetVertexAttribPointervARB\r
+  void __stdcall GLee_Lazy_glGetVertexAttribPointervARB(GLuint index, GLenum pname, GLvoid* * pointer)  {if (GLeeInit()) glGetVertexAttribPointervARB(index, pname, pointer);}\r
+  GLEEPFNGLGETVERTEXATTRIBPOINTERVARBPROC GLeeFuncPtr_glGetVertexAttribPointervARB=GLee_Lazy_glGetVertexAttribPointervARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glIsProgramARB\r
+#define GLEE_C_DEFINED_glIsProgramARB\r
+  GLboolean __stdcall GLee_Lazy_glIsProgramARB(GLuint program)  {if (GLeeInit()) return glIsProgramARB(program); return (GLboolean)0;}\r
+  GLEEPFNGLISPROGRAMARBPROC GLeeFuncPtr_glIsProgramARB=GLee_Lazy_glIsProgramARB;\r
+#endif\r
+#endif \r
+\r
+/* GL_ARB_fragment_program */\r
+\r
+#ifdef __GLEE_GL_ARB_fragment_program\r
+#endif \r
+\r
+/* GL_ARB_vertex_buffer_object */\r
+\r
+#ifdef __GLEE_GL_ARB_vertex_buffer_object\r
+#ifndef GLEE_C_DEFINED_glBindBufferARB\r
+#define GLEE_C_DEFINED_glBindBufferARB\r
+  void __stdcall GLee_Lazy_glBindBufferARB(GLenum target, GLuint buffer)  {if (GLeeInit()) glBindBufferARB(target, buffer);}\r
+  GLEEPFNGLBINDBUFFERARBPROC GLeeFuncPtr_glBindBufferARB=GLee_Lazy_glBindBufferARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glDeleteBuffersARB\r
+#define GLEE_C_DEFINED_glDeleteBuffersARB\r
+  void __stdcall GLee_Lazy_glDeleteBuffersARB(GLsizei n, const GLuint * buffers)  {if (GLeeInit()) glDeleteBuffersARB(n, buffers);}\r
+  GLEEPFNGLDELETEBUFFERSARBPROC GLeeFuncPtr_glDeleteBuffersARB=GLee_Lazy_glDeleteBuffersARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGenBuffersARB\r
+#define GLEE_C_DEFINED_glGenBuffersARB\r
+  void __stdcall GLee_Lazy_glGenBuffersARB(GLsizei n, GLuint * buffers)  {if (GLeeInit()) glGenBuffersARB(n, buffers);}\r
+  GLEEPFNGLGENBUFFERSARBPROC GLeeFuncPtr_glGenBuffersARB=GLee_Lazy_glGenBuffersARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glIsBufferARB\r
+#define GLEE_C_DEFINED_glIsBufferARB\r
+  GLboolean __stdcall GLee_Lazy_glIsBufferARB(GLuint buffer)  {if (GLeeInit()) return glIsBufferARB(buffer); return (GLboolean)0;}\r
+  GLEEPFNGLISBUFFERARBPROC GLeeFuncPtr_glIsBufferARB=GLee_Lazy_glIsBufferARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glBufferDataARB\r
+#define GLEE_C_DEFINED_glBufferDataARB\r
+  void __stdcall GLee_Lazy_glBufferDataARB(GLenum target, GLsizeiptrARB size, const GLvoid * data, GLenum usage)  {if (GLeeInit()) glBufferDataARB(target, size, data, usage);}\r
+  GLEEPFNGLBUFFERDATAARBPROC GLeeFuncPtr_glBufferDataARB=GLee_Lazy_glBufferDataARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glBufferSubDataARB\r
+#define GLEE_C_DEFINED_glBufferSubDataARB\r
+  void __stdcall GLee_Lazy_glBufferSubDataARB(GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid * data)  {if (GLeeInit()) glBufferSubDataARB(target, offset, size, data);}\r
+  GLEEPFNGLBUFFERSUBDATAARBPROC GLeeFuncPtr_glBufferSubDataARB=GLee_Lazy_glBufferSubDataARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetBufferSubDataARB\r
+#define GLEE_C_DEFINED_glGetBufferSubDataARB\r
+  void __stdcall GLee_Lazy_glGetBufferSubDataARB(GLenum target, GLintptrARB offset, GLsizeiptrARB size, GLvoid * data)  {if (GLeeInit()) glGetBufferSubDataARB(target, offset, size, data);}\r
+  GLEEPFNGLGETBUFFERSUBDATAARBPROC GLeeFuncPtr_glGetBufferSubDataARB=GLee_Lazy_glGetBufferSubDataARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMapBufferARB\r
+#define GLEE_C_DEFINED_glMapBufferARB\r
+  GLvoid* __stdcall GLee_Lazy_glMapBufferARB(GLenum target, GLenum access)  {if (GLeeInit()) return glMapBufferARB(target, access); return (GLvoid*)0;}\r
+  GLEEPFNGLMAPBUFFERARBPROC GLeeFuncPtr_glMapBufferARB=GLee_Lazy_glMapBufferARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUnmapBufferARB\r
+#define GLEE_C_DEFINED_glUnmapBufferARB\r
+  GLboolean __stdcall GLee_Lazy_glUnmapBufferARB(GLenum target)  {if (GLeeInit()) return glUnmapBufferARB(target); return (GLboolean)0;}\r
+  GLEEPFNGLUNMAPBUFFERARBPROC GLeeFuncPtr_glUnmapBufferARB=GLee_Lazy_glUnmapBufferARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetBufferParameterivARB\r
+#define GLEE_C_DEFINED_glGetBufferParameterivARB\r
+  void __stdcall GLee_Lazy_glGetBufferParameterivARB(GLenum target, GLenum pname, GLint * params)  {if (GLeeInit()) glGetBufferParameterivARB(target, pname, params);}\r
+  GLEEPFNGLGETBUFFERPARAMETERIVARBPROC GLeeFuncPtr_glGetBufferParameterivARB=GLee_Lazy_glGetBufferParameterivARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetBufferPointervARB\r
+#define GLEE_C_DEFINED_glGetBufferPointervARB\r
+  void __stdcall GLee_Lazy_glGetBufferPointervARB(GLenum target, GLenum pname, GLvoid* * params)  {if (GLeeInit()) glGetBufferPointervARB(target, pname, params);}\r
+  GLEEPFNGLGETBUFFERPOINTERVARBPROC GLeeFuncPtr_glGetBufferPointervARB=GLee_Lazy_glGetBufferPointervARB;\r
+#endif\r
+#endif \r
+\r
+/* GL_ARB_occlusion_query */\r
+\r
+#ifdef __GLEE_GL_ARB_occlusion_query\r
+#ifndef GLEE_C_DEFINED_glGenQueriesARB\r
+#define GLEE_C_DEFINED_glGenQueriesARB\r
+  void __stdcall GLee_Lazy_glGenQueriesARB(GLsizei n, GLuint * ids)  {if (GLeeInit()) glGenQueriesARB(n, ids);}\r
+  GLEEPFNGLGENQUERIESARBPROC GLeeFuncPtr_glGenQueriesARB=GLee_Lazy_glGenQueriesARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glDeleteQueriesARB\r
+#define GLEE_C_DEFINED_glDeleteQueriesARB\r
+  void __stdcall GLee_Lazy_glDeleteQueriesARB(GLsizei n, const GLuint * ids)  {if (GLeeInit()) glDeleteQueriesARB(n, ids);}\r
+  GLEEPFNGLDELETEQUERIESARBPROC GLeeFuncPtr_glDeleteQueriesARB=GLee_Lazy_glDeleteQueriesARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glIsQueryARB\r
+#define GLEE_C_DEFINED_glIsQueryARB\r
+  GLboolean __stdcall GLee_Lazy_glIsQueryARB(GLuint id)  {if (GLeeInit()) return glIsQueryARB(id); return (GLboolean)0;}\r
+  GLEEPFNGLISQUERYARBPROC GLeeFuncPtr_glIsQueryARB=GLee_Lazy_glIsQueryARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glBeginQueryARB\r
+#define GLEE_C_DEFINED_glBeginQueryARB\r
+  void __stdcall GLee_Lazy_glBeginQueryARB(GLenum target, GLuint id)  {if (GLeeInit()) glBeginQueryARB(target, id);}\r
+  GLEEPFNGLBEGINQUERYARBPROC GLeeFuncPtr_glBeginQueryARB=GLee_Lazy_glBeginQueryARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glEndQueryARB\r
+#define GLEE_C_DEFINED_glEndQueryARB\r
+  void __stdcall GLee_Lazy_glEndQueryARB(GLenum target)  {if (GLeeInit()) glEndQueryARB(target);}\r
+  GLEEPFNGLENDQUERYARBPROC GLeeFuncPtr_glEndQueryARB=GLee_Lazy_glEndQueryARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetQueryivARB\r
+#define GLEE_C_DEFINED_glGetQueryivARB\r
+  void __stdcall GLee_Lazy_glGetQueryivARB(GLenum target, GLenum pname, GLint * params)  {if (GLeeInit()) glGetQueryivARB(target, pname, params);}\r
+  GLEEPFNGLGETQUERYIVARBPROC GLeeFuncPtr_glGetQueryivARB=GLee_Lazy_glGetQueryivARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetQueryObjectivARB\r
+#define GLEE_C_DEFINED_glGetQueryObjectivARB\r
+  void __stdcall GLee_Lazy_glGetQueryObjectivARB(GLuint id, GLenum pname, GLint * params)  {if (GLeeInit()) glGetQueryObjectivARB(id, pname, params);}\r
+  GLEEPFNGLGETQUERYOBJECTIVARBPROC GLeeFuncPtr_glGetQueryObjectivARB=GLee_Lazy_glGetQueryObjectivARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetQueryObjectuivARB\r
+#define GLEE_C_DEFINED_glGetQueryObjectuivARB\r
+  void __stdcall GLee_Lazy_glGetQueryObjectuivARB(GLuint id, GLenum pname, GLuint * params)  {if (GLeeInit()) glGetQueryObjectuivARB(id, pname, params);}\r
+  GLEEPFNGLGETQUERYOBJECTUIVARBPROC GLeeFuncPtr_glGetQueryObjectuivARB=GLee_Lazy_glGetQueryObjectuivARB;\r
+#endif\r
+#endif \r
+\r
+/* GL_ARB_shader_objects */\r
+\r
+#ifdef __GLEE_GL_ARB_shader_objects\r
+#ifndef GLEE_C_DEFINED_glDeleteObjectARB\r
+#define GLEE_C_DEFINED_glDeleteObjectARB\r
+  void __stdcall GLee_Lazy_glDeleteObjectARB(GLhandleARB obj)  {if (GLeeInit()) glDeleteObjectARB(obj);}\r
+  GLEEPFNGLDELETEOBJECTARBPROC GLeeFuncPtr_glDeleteObjectARB=GLee_Lazy_glDeleteObjectARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetHandleARB\r
+#define GLEE_C_DEFINED_glGetHandleARB\r
+  GLhandleARB __stdcall GLee_Lazy_glGetHandleARB(GLenum pname)  {if (GLeeInit()) return glGetHandleARB(pname); return (GLhandleARB)0;}\r
+  GLEEPFNGLGETHANDLEARBPROC GLeeFuncPtr_glGetHandleARB=GLee_Lazy_glGetHandleARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glDetachObjectARB\r
+#define GLEE_C_DEFINED_glDetachObjectARB\r
+  void __stdcall GLee_Lazy_glDetachObjectARB(GLhandleARB containerObj, GLhandleARB attachedObj)  {if (GLeeInit()) glDetachObjectARB(containerObj, attachedObj);}\r
+  GLEEPFNGLDETACHOBJECTARBPROC GLeeFuncPtr_glDetachObjectARB=GLee_Lazy_glDetachObjectARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glCreateShaderObjectARB\r
+#define GLEE_C_DEFINED_glCreateShaderObjectARB\r
+  GLhandleARB __stdcall GLee_Lazy_glCreateShaderObjectARB(GLenum shaderType)  {if (GLeeInit()) return glCreateShaderObjectARB(shaderType); return (GLhandleARB)0;}\r
+  GLEEPFNGLCREATESHADEROBJECTARBPROC GLeeFuncPtr_glCreateShaderObjectARB=GLee_Lazy_glCreateShaderObjectARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glShaderSourceARB\r
+#define GLEE_C_DEFINED_glShaderSourceARB\r
+  void __stdcall GLee_Lazy_glShaderSourceARB(GLhandleARB shaderObj, GLsizei count, const GLcharARB* * string, const GLint * length)  {if (GLeeInit()) glShaderSourceARB(shaderObj, count, string, length);}\r
+  GLEEPFNGLSHADERSOURCEARBPROC GLeeFuncPtr_glShaderSourceARB=GLee_Lazy_glShaderSourceARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glCompileShaderARB\r
+#define GLEE_C_DEFINED_glCompileShaderARB\r
+  void __stdcall GLee_Lazy_glCompileShaderARB(GLhandleARB shaderObj)  {if (GLeeInit()) glCompileShaderARB(shaderObj);}\r
+  GLEEPFNGLCOMPILESHADERARBPROC GLeeFuncPtr_glCompileShaderARB=GLee_Lazy_glCompileShaderARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glCreateProgramObjectARB\r
+#define GLEE_C_DEFINED_glCreateProgramObjectARB\r
+  GLhandleARB __stdcall GLee_Lazy_glCreateProgramObjectARB(void)  {if (GLeeInit()) return glCreateProgramObjectARB(); return (GLhandleARB)0;}\r
+  GLEEPFNGLCREATEPROGRAMOBJECTARBPROC GLeeFuncPtr_glCreateProgramObjectARB=GLee_Lazy_glCreateProgramObjectARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glAttachObjectARB\r
+#define GLEE_C_DEFINED_glAttachObjectARB\r
+  void __stdcall GLee_Lazy_glAttachObjectARB(GLhandleARB containerObj, GLhandleARB obj)  {if (GLeeInit()) glAttachObjectARB(containerObj, obj);}\r
+  GLEEPFNGLATTACHOBJECTARBPROC GLeeFuncPtr_glAttachObjectARB=GLee_Lazy_glAttachObjectARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glLinkProgramARB\r
+#define GLEE_C_DEFINED_glLinkProgramARB\r
+  void __stdcall GLee_Lazy_glLinkProgramARB(GLhandleARB programObj)  {if (GLeeInit()) glLinkProgramARB(programObj);}\r
+  GLEEPFNGLLINKPROGRAMARBPROC GLeeFuncPtr_glLinkProgramARB=GLee_Lazy_glLinkProgramARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUseProgramObjectARB\r
+#define GLEE_C_DEFINED_glUseProgramObjectARB\r
+  void __stdcall GLee_Lazy_glUseProgramObjectARB(GLhandleARB programObj)  {if (GLeeInit()) glUseProgramObjectARB(programObj);}\r
+  GLEEPFNGLUSEPROGRAMOBJECTARBPROC GLeeFuncPtr_glUseProgramObjectARB=GLee_Lazy_glUseProgramObjectARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glValidateProgramARB\r
+#define GLEE_C_DEFINED_glValidateProgramARB\r
+  void __stdcall GLee_Lazy_glValidateProgramARB(GLhandleARB programObj)  {if (GLeeInit()) glValidateProgramARB(programObj);}\r
+  GLEEPFNGLVALIDATEPROGRAMARBPROC GLeeFuncPtr_glValidateProgramARB=GLee_Lazy_glValidateProgramARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUniform1fARB\r
+#define GLEE_C_DEFINED_glUniform1fARB\r
+  void __stdcall GLee_Lazy_glUniform1fARB(GLint location, GLfloat v0)  {if (GLeeInit()) glUniform1fARB(location, v0);}\r
+  GLEEPFNGLUNIFORM1FARBPROC GLeeFuncPtr_glUniform1fARB=GLee_Lazy_glUniform1fARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUniform2fARB\r
+#define GLEE_C_DEFINED_glUniform2fARB\r
+  void __stdcall GLee_Lazy_glUniform2fARB(GLint location, GLfloat v0, GLfloat v1)  {if (GLeeInit()) glUniform2fARB(location, v0, v1);}\r
+  GLEEPFNGLUNIFORM2FARBPROC GLeeFuncPtr_glUniform2fARB=GLee_Lazy_glUniform2fARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUniform3fARB\r
+#define GLEE_C_DEFINED_glUniform3fARB\r
+  void __stdcall GLee_Lazy_glUniform3fARB(GLint location, GLfloat v0, GLfloat v1, GLfloat v2)  {if (GLeeInit()) glUniform3fARB(location, v0, v1, v2);}\r
+  GLEEPFNGLUNIFORM3FARBPROC GLeeFuncPtr_glUniform3fARB=GLee_Lazy_glUniform3fARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUniform4fARB\r
+#define GLEE_C_DEFINED_glUniform4fARB\r
+  void __stdcall GLee_Lazy_glUniform4fARB(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)  {if (GLeeInit()) glUniform4fARB(location, v0, v1, v2, v3);}\r
+  GLEEPFNGLUNIFORM4FARBPROC GLeeFuncPtr_glUniform4fARB=GLee_Lazy_glUniform4fARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUniform1iARB\r
+#define GLEE_C_DEFINED_glUniform1iARB\r
+  void __stdcall GLee_Lazy_glUniform1iARB(GLint location, GLint v0)  {if (GLeeInit()) glUniform1iARB(location, v0);}\r
+  GLEEPFNGLUNIFORM1IARBPROC GLeeFuncPtr_glUniform1iARB=GLee_Lazy_glUniform1iARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUniform2iARB\r
+#define GLEE_C_DEFINED_glUniform2iARB\r
+  void __stdcall GLee_Lazy_glUniform2iARB(GLint location, GLint v0, GLint v1)  {if (GLeeInit()) glUniform2iARB(location, v0, v1);}\r
+  GLEEPFNGLUNIFORM2IARBPROC GLeeFuncPtr_glUniform2iARB=GLee_Lazy_glUniform2iARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUniform3iARB\r
+#define GLEE_C_DEFINED_glUniform3iARB\r
+  void __stdcall GLee_Lazy_glUniform3iARB(GLint location, GLint v0, GLint v1, GLint v2)  {if (GLeeInit()) glUniform3iARB(location, v0, v1, v2);}\r
+  GLEEPFNGLUNIFORM3IARBPROC GLeeFuncPtr_glUniform3iARB=GLee_Lazy_glUniform3iARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUniform4iARB\r
+#define GLEE_C_DEFINED_glUniform4iARB\r
+  void __stdcall GLee_Lazy_glUniform4iARB(GLint location, GLint v0, GLint v1, GLint v2, GLint v3)  {if (GLeeInit()) glUniform4iARB(location, v0, v1, v2, v3);}\r
+  GLEEPFNGLUNIFORM4IARBPROC GLeeFuncPtr_glUniform4iARB=GLee_Lazy_glUniform4iARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUniform1fvARB\r
+#define GLEE_C_DEFINED_glUniform1fvARB\r
+  void __stdcall GLee_Lazy_glUniform1fvARB(GLint location, GLsizei count, const GLfloat * value)  {if (GLeeInit()) glUniform1fvARB(location, count, value);}\r
+  GLEEPFNGLUNIFORM1FVARBPROC GLeeFuncPtr_glUniform1fvARB=GLee_Lazy_glUniform1fvARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUniform2fvARB\r
+#define GLEE_C_DEFINED_glUniform2fvARB\r
+  void __stdcall GLee_Lazy_glUniform2fvARB(GLint location, GLsizei count, const GLfloat * value)  {if (GLeeInit()) glUniform2fvARB(location, count, value);}\r
+  GLEEPFNGLUNIFORM2FVARBPROC GLeeFuncPtr_glUniform2fvARB=GLee_Lazy_glUniform2fvARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUniform3fvARB\r
+#define GLEE_C_DEFINED_glUniform3fvARB\r
+  void __stdcall GLee_Lazy_glUniform3fvARB(GLint location, GLsizei count, const GLfloat * value)  {if (GLeeInit()) glUniform3fvARB(location, count, value);}\r
+  GLEEPFNGLUNIFORM3FVARBPROC GLeeFuncPtr_glUniform3fvARB=GLee_Lazy_glUniform3fvARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUniform4fvARB\r
+#define GLEE_C_DEFINED_glUniform4fvARB\r
+  void __stdcall GLee_Lazy_glUniform4fvARB(GLint location, GLsizei count, const GLfloat * value)  {if (GLeeInit()) glUniform4fvARB(location, count, value);}\r
+  GLEEPFNGLUNIFORM4FVARBPROC GLeeFuncPtr_glUniform4fvARB=GLee_Lazy_glUniform4fvARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUniform1ivARB\r
+#define GLEE_C_DEFINED_glUniform1ivARB\r
+  void __stdcall GLee_Lazy_glUniform1ivARB(GLint location, GLsizei count, const GLint * value)  {if (GLeeInit()) glUniform1ivARB(location, count, value);}\r
+  GLEEPFNGLUNIFORM1IVARBPROC GLeeFuncPtr_glUniform1ivARB=GLee_Lazy_glUniform1ivARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUniform2ivARB\r
+#define GLEE_C_DEFINED_glUniform2ivARB\r
+  void __stdcall GLee_Lazy_glUniform2ivARB(GLint location, GLsizei count, const GLint * value)  {if (GLeeInit()) glUniform2ivARB(location, count, value);}\r
+  GLEEPFNGLUNIFORM2IVARBPROC GLeeFuncPtr_glUniform2ivARB=GLee_Lazy_glUniform2ivARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUniform3ivARB\r
+#define GLEE_C_DEFINED_glUniform3ivARB\r
+  void __stdcall GLee_Lazy_glUniform3ivARB(GLint location, GLsizei count, const GLint * value)  {if (GLeeInit()) glUniform3ivARB(location, count, value);}\r
+  GLEEPFNGLUNIFORM3IVARBPROC GLeeFuncPtr_glUniform3ivARB=GLee_Lazy_glUniform3ivARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUniform4ivARB\r
+#define GLEE_C_DEFINED_glUniform4ivARB\r
+  void __stdcall GLee_Lazy_glUniform4ivARB(GLint location, GLsizei count, const GLint * value)  {if (GLeeInit()) glUniform4ivARB(location, count, value);}\r
+  GLEEPFNGLUNIFORM4IVARBPROC GLeeFuncPtr_glUniform4ivARB=GLee_Lazy_glUniform4ivARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUniformMatrix2fvARB\r
+#define GLEE_C_DEFINED_glUniformMatrix2fvARB\r
+  void __stdcall GLee_Lazy_glUniformMatrix2fvARB(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value)  {if (GLeeInit()) glUniformMatrix2fvARB(location, count, transpose, value);}\r
+  GLEEPFNGLUNIFORMMATRIX2FVARBPROC GLeeFuncPtr_glUniformMatrix2fvARB=GLee_Lazy_glUniformMatrix2fvARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUniformMatrix3fvARB\r
+#define GLEE_C_DEFINED_glUniformMatrix3fvARB\r
+  void __stdcall GLee_Lazy_glUniformMatrix3fvARB(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value)  {if (GLeeInit()) glUniformMatrix3fvARB(location, count, transpose, value);}\r
+  GLEEPFNGLUNIFORMMATRIX3FVARBPROC GLeeFuncPtr_glUniformMatrix3fvARB=GLee_Lazy_glUniformMatrix3fvARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUniformMatrix4fvARB\r
+#define GLEE_C_DEFINED_glUniformMatrix4fvARB\r
+  void __stdcall GLee_Lazy_glUniformMatrix4fvARB(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value)  {if (GLeeInit()) glUniformMatrix4fvARB(location, count, transpose, value);}\r
+  GLEEPFNGLUNIFORMMATRIX4FVARBPROC GLeeFuncPtr_glUniformMatrix4fvARB=GLee_Lazy_glUniformMatrix4fvARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetObjectParameterfvARB\r
+#define GLEE_C_DEFINED_glGetObjectParameterfvARB\r
+  void __stdcall GLee_Lazy_glGetObjectParameterfvARB(GLhandleARB obj, GLenum pname, GLfloat * params)  {if (GLeeInit()) glGetObjectParameterfvARB(obj, pname, params);}\r
+  GLEEPFNGLGETOBJECTPARAMETERFVARBPROC GLeeFuncPtr_glGetObjectParameterfvARB=GLee_Lazy_glGetObjectParameterfvARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetObjectParameterivARB\r
+#define GLEE_C_DEFINED_glGetObjectParameterivARB\r
+  void __stdcall GLee_Lazy_glGetObjectParameterivARB(GLhandleARB obj, GLenum pname, GLint * params)  {if (GLeeInit()) glGetObjectParameterivARB(obj, pname, params);}\r
+  GLEEPFNGLGETOBJECTPARAMETERIVARBPROC GLeeFuncPtr_glGetObjectParameterivARB=GLee_Lazy_glGetObjectParameterivARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetInfoLogARB\r
+#define GLEE_C_DEFINED_glGetInfoLogARB\r
+  void __stdcall GLee_Lazy_glGetInfoLogARB(GLhandleARB obj, GLsizei maxLength, GLsizei * length, GLcharARB * infoLog)  {if (GLeeInit()) glGetInfoLogARB(obj, maxLength, length, infoLog);}\r
+  GLEEPFNGLGETINFOLOGARBPROC GLeeFuncPtr_glGetInfoLogARB=GLee_Lazy_glGetInfoLogARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetAttachedObjectsARB\r
+#define GLEE_C_DEFINED_glGetAttachedObjectsARB\r
+  void __stdcall GLee_Lazy_glGetAttachedObjectsARB(GLhandleARB containerObj, GLsizei maxCount, GLsizei * count, GLhandleARB * obj)  {if (GLeeInit()) glGetAttachedObjectsARB(containerObj, maxCount, count, obj);}\r
+  GLEEPFNGLGETATTACHEDOBJECTSARBPROC GLeeFuncPtr_glGetAttachedObjectsARB=GLee_Lazy_glGetAttachedObjectsARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetUniformLocationARB\r
+#define GLEE_C_DEFINED_glGetUniformLocationARB\r
+  GLint __stdcall GLee_Lazy_glGetUniformLocationARB(GLhandleARB programObj, const GLcharARB * name)  {if (GLeeInit()) return glGetUniformLocationARB(programObj, name); return (GLint)0;}\r
+  GLEEPFNGLGETUNIFORMLOCATIONARBPROC GLeeFuncPtr_glGetUniformLocationARB=GLee_Lazy_glGetUniformLocationARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetActiveUniformARB\r
+#define GLEE_C_DEFINED_glGetActiveUniformARB\r
+  void __stdcall GLee_Lazy_glGetActiveUniformARB(GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei * length, GLint * size, GLenum * type, GLcharARB * name)  {if (GLeeInit()) glGetActiveUniformARB(programObj, index, maxLength, length, size, type, name);}\r
+  GLEEPFNGLGETACTIVEUNIFORMARBPROC GLeeFuncPtr_glGetActiveUniformARB=GLee_Lazy_glGetActiveUniformARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetUniformfvARB\r
+#define GLEE_C_DEFINED_glGetUniformfvARB\r
+  void __stdcall GLee_Lazy_glGetUniformfvARB(GLhandleARB programObj, GLint location, GLfloat * params)  {if (GLeeInit()) glGetUniformfvARB(programObj, location, params);}\r
+  GLEEPFNGLGETUNIFORMFVARBPROC GLeeFuncPtr_glGetUniformfvARB=GLee_Lazy_glGetUniformfvARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetUniformivARB\r
+#define GLEE_C_DEFINED_glGetUniformivARB\r
+  void __stdcall GLee_Lazy_glGetUniformivARB(GLhandleARB programObj, GLint location, GLint * params)  {if (GLeeInit()) glGetUniformivARB(programObj, location, params);}\r
+  GLEEPFNGLGETUNIFORMIVARBPROC GLeeFuncPtr_glGetUniformivARB=GLee_Lazy_glGetUniformivARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetShaderSourceARB\r
+#define GLEE_C_DEFINED_glGetShaderSourceARB\r
+  void __stdcall GLee_Lazy_glGetShaderSourceARB(GLhandleARB obj, GLsizei maxLength, GLsizei * length, GLcharARB * source)  {if (GLeeInit()) glGetShaderSourceARB(obj, maxLength, length, source);}\r
+  GLEEPFNGLGETSHADERSOURCEARBPROC GLeeFuncPtr_glGetShaderSourceARB=GLee_Lazy_glGetShaderSourceARB;\r
+#endif\r
+#endif \r
+\r
+/* GL_ARB_vertex_shader */\r
+\r
+#ifdef __GLEE_GL_ARB_vertex_shader\r
+#ifndef GLEE_C_DEFINED_glBindAttribLocationARB\r
+#define GLEE_C_DEFINED_glBindAttribLocationARB\r
+  void __stdcall GLee_Lazy_glBindAttribLocationARB(GLhandleARB programObj, GLuint index, const GLcharARB * name)  {if (GLeeInit()) glBindAttribLocationARB(programObj, index, name);}\r
+  GLEEPFNGLBINDATTRIBLOCATIONARBPROC GLeeFuncPtr_glBindAttribLocationARB=GLee_Lazy_glBindAttribLocationARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetActiveAttribARB\r
+#define GLEE_C_DEFINED_glGetActiveAttribARB\r
+  void __stdcall GLee_Lazy_glGetActiveAttribARB(GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei * length, GLint * size, GLenum * type, GLcharARB * name)  {if (GLeeInit()) glGetActiveAttribARB(programObj, index, maxLength, length, size, type, name);}\r
+  GLEEPFNGLGETACTIVEATTRIBARBPROC GLeeFuncPtr_glGetActiveAttribARB=GLee_Lazy_glGetActiveAttribARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetAttribLocationARB\r
+#define GLEE_C_DEFINED_glGetAttribLocationARB\r
+  GLint __stdcall GLee_Lazy_glGetAttribLocationARB(GLhandleARB programObj, const GLcharARB * name)  {if (GLeeInit()) return glGetAttribLocationARB(programObj, name); return (GLint)0;}\r
+  GLEEPFNGLGETATTRIBLOCATIONARBPROC GLeeFuncPtr_glGetAttribLocationARB=GLee_Lazy_glGetAttribLocationARB;\r
+#endif\r
+#endif \r
+\r
+/* GL_ARB_fragment_shader */\r
+\r
+#ifdef __GLEE_GL_ARB_fragment_shader\r
+#endif \r
+\r
+/* GL_ARB_shading_language_100 */\r
+\r
+#ifdef __GLEE_GL_ARB_shading_language_100\r
+#endif \r
+\r
+/* GL_ARB_texture_non_power_of_two */\r
+\r
+#ifdef __GLEE_GL_ARB_texture_non_power_of_two\r
+#endif \r
+\r
+/* GL_ARB_point_sprite */\r
+\r
+#ifdef __GLEE_GL_ARB_point_sprite\r
+#endif \r
+\r
+/* GL_ARB_fragment_program_shadow */\r
+\r
+#ifdef __GLEE_GL_ARB_fragment_program_shadow\r
+#endif \r
+\r
+/* GL_ARB_draw_buffers */\r
+\r
+#ifdef __GLEE_GL_ARB_draw_buffers\r
+#ifndef GLEE_C_DEFINED_glDrawBuffersARB\r
+#define GLEE_C_DEFINED_glDrawBuffersARB\r
+  void __stdcall GLee_Lazy_glDrawBuffersARB(GLsizei n, const GLenum * bufs)  {if (GLeeInit()) glDrawBuffersARB(n, bufs);}\r
+  GLEEPFNGLDRAWBUFFERSARBPROC GLeeFuncPtr_glDrawBuffersARB=GLee_Lazy_glDrawBuffersARB;\r
+#endif\r
+#endif \r
+\r
+/* GL_ARB_texture_rectangle */\r
+\r
+#ifdef __GLEE_GL_ARB_texture_rectangle\r
+#endif \r
+\r
+/* GL_ARB_color_buffer_float */\r
+\r
+#ifdef __GLEE_GL_ARB_color_buffer_float\r
+#ifndef GLEE_C_DEFINED_glClampColorARB\r
+#define GLEE_C_DEFINED_glClampColorARB\r
+  void __stdcall GLee_Lazy_glClampColorARB(GLenum target, GLenum clamp)  {if (GLeeInit()) glClampColorARB(target, clamp);}\r
+  GLEEPFNGLCLAMPCOLORARBPROC GLeeFuncPtr_glClampColorARB=GLee_Lazy_glClampColorARB;\r
+#endif\r
+#endif \r
+\r
+/* GL_ARB_half_float_pixel */\r
+\r
+#ifdef __GLEE_GL_ARB_half_float_pixel\r
+#endif \r
+\r
+/* GL_ARB_texture_float */\r
+\r
+#ifdef __GLEE_GL_ARB_texture_float\r
+#endif \r
+\r
+/* GL_ARB_pixel_buffer_object */\r
+\r
+#ifdef __GLEE_GL_ARB_pixel_buffer_object\r
+#endif \r
+\r
+/* GL_ARB_depth_buffer_float */\r
+\r
+#ifdef __GLEE_GL_ARB_depth_buffer_float\r
+#endif \r
+\r
+/* GL_ARB_draw_instanced */\r
+\r
+#ifdef __GLEE_GL_ARB_draw_instanced\r
+#ifndef GLEE_C_DEFINED_glDrawArraysInstancedARB\r
+#define GLEE_C_DEFINED_glDrawArraysInstancedARB\r
+  void __stdcall GLee_Lazy_glDrawArraysInstancedARB(GLenum mode, GLint first, GLsizei count, GLsizei primcount)  {if (GLeeInit()) glDrawArraysInstancedARB(mode, first, count, primcount);}\r
+  GLEEPFNGLDRAWARRAYSINSTANCEDARBPROC GLeeFuncPtr_glDrawArraysInstancedARB=GLee_Lazy_glDrawArraysInstancedARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glDrawElementsInstancedARB\r
+#define GLEE_C_DEFINED_glDrawElementsInstancedARB\r
+  void __stdcall GLee_Lazy_glDrawElementsInstancedARB(GLenum mode, GLsizei count, GLenum type, const GLvoid * indices, GLsizei primcount)  {if (GLeeInit()) glDrawElementsInstancedARB(mode, count, type, indices, primcount);}\r
+  GLEEPFNGLDRAWELEMENTSINSTANCEDARBPROC GLeeFuncPtr_glDrawElementsInstancedARB=GLee_Lazy_glDrawElementsInstancedARB;\r
+#endif\r
+#endif \r
+\r
+/* GL_ARB_framebuffer_object */\r
+\r
+#ifdef __GLEE_GL_ARB_framebuffer_object\r
+#ifndef GLEE_C_DEFINED_glIsRenderbuffer\r
+#define GLEE_C_DEFINED_glIsRenderbuffer\r
+  GLboolean __stdcall GLee_Lazy_glIsRenderbuffer(GLuint renderbuffer)  {if (GLeeInit()) return glIsRenderbuffer(renderbuffer); return (GLboolean)0;}\r
+  GLEEPFNGLISRENDERBUFFERPROC GLeeFuncPtr_glIsRenderbuffer=GLee_Lazy_glIsRenderbuffer;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glBindRenderbuffer\r
+#define GLEE_C_DEFINED_glBindRenderbuffer\r
+  void __stdcall GLee_Lazy_glBindRenderbuffer(GLenum target, GLuint renderbuffer)  {if (GLeeInit()) glBindRenderbuffer(target, renderbuffer);}\r
+  GLEEPFNGLBINDRENDERBUFFERPROC GLeeFuncPtr_glBindRenderbuffer=GLee_Lazy_glBindRenderbuffer;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glDeleteRenderbuffers\r
+#define GLEE_C_DEFINED_glDeleteRenderbuffers\r
+  void __stdcall GLee_Lazy_glDeleteRenderbuffers(GLsizei n, const GLuint * renderbuffers)  {if (GLeeInit()) glDeleteRenderbuffers(n, renderbuffers);}\r
+  GLEEPFNGLDELETERENDERBUFFERSPROC GLeeFuncPtr_glDeleteRenderbuffers=GLee_Lazy_glDeleteRenderbuffers;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGenRenderbuffers\r
+#define GLEE_C_DEFINED_glGenRenderbuffers\r
+  void __stdcall GLee_Lazy_glGenRenderbuffers(GLsizei n, GLuint * renderbuffers)  {if (GLeeInit()) glGenRenderbuffers(n, renderbuffers);}\r
+  GLEEPFNGLGENRENDERBUFFERSPROC GLeeFuncPtr_glGenRenderbuffers=GLee_Lazy_glGenRenderbuffers;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glRenderbufferStorage\r
+#define GLEE_C_DEFINED_glRenderbufferStorage\r
+  void __stdcall GLee_Lazy_glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)  {if (GLeeInit()) glRenderbufferStorage(target, internalformat, width, height);}\r
+  GLEEPFNGLRENDERBUFFERSTORAGEPROC GLeeFuncPtr_glRenderbufferStorage=GLee_Lazy_glRenderbufferStorage;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetRenderbufferParameteriv\r
+#define GLEE_C_DEFINED_glGetRenderbufferParameteriv\r
+  void __stdcall GLee_Lazy_glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint * params)  {if (GLeeInit()) glGetRenderbufferParameteriv(target, pname, params);}\r
+  GLEEPFNGLGETRENDERBUFFERPARAMETERIVPROC GLeeFuncPtr_glGetRenderbufferParameteriv=GLee_Lazy_glGetRenderbufferParameteriv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glIsFramebuffer\r
+#define GLEE_C_DEFINED_glIsFramebuffer\r
+  GLboolean __stdcall GLee_Lazy_glIsFramebuffer(GLuint framebuffer)  {if (GLeeInit()) return glIsFramebuffer(framebuffer); return (GLboolean)0;}\r
+  GLEEPFNGLISFRAMEBUFFERPROC GLeeFuncPtr_glIsFramebuffer=GLee_Lazy_glIsFramebuffer;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glBindFramebuffer\r
+#define GLEE_C_DEFINED_glBindFramebuffer\r
+  void __stdcall GLee_Lazy_glBindFramebuffer(GLenum target, GLuint framebuffer)  {if (GLeeInit()) glBindFramebuffer(target, framebuffer);}\r
+  GLEEPFNGLBINDFRAMEBUFFERPROC GLeeFuncPtr_glBindFramebuffer=GLee_Lazy_glBindFramebuffer;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glDeleteFramebuffers\r
+#define GLEE_C_DEFINED_glDeleteFramebuffers\r
+  void __stdcall GLee_Lazy_glDeleteFramebuffers(GLsizei n, const GLuint * framebuffers)  {if (GLeeInit()) glDeleteFramebuffers(n, framebuffers);}\r
+  GLEEPFNGLDELETEFRAMEBUFFERSPROC GLeeFuncPtr_glDeleteFramebuffers=GLee_Lazy_glDeleteFramebuffers;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGenFramebuffers\r
+#define GLEE_C_DEFINED_glGenFramebuffers\r
+  void __stdcall GLee_Lazy_glGenFramebuffers(GLsizei n, GLuint * framebuffers)  {if (GLeeInit()) glGenFramebuffers(n, framebuffers);}\r
+  GLEEPFNGLGENFRAMEBUFFERSPROC GLeeFuncPtr_glGenFramebuffers=GLee_Lazy_glGenFramebuffers;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glCheckFramebufferStatus\r
+#define GLEE_C_DEFINED_glCheckFramebufferStatus\r
+  GLenum __stdcall GLee_Lazy_glCheckFramebufferStatus(GLenum target)  {if (GLeeInit()) return glCheckFramebufferStatus(target); return (GLenum)0;}\r
+  GLEEPFNGLCHECKFRAMEBUFFERSTATUSPROC GLeeFuncPtr_glCheckFramebufferStatus=GLee_Lazy_glCheckFramebufferStatus;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFramebufferTexture1D\r
+#define GLEE_C_DEFINED_glFramebufferTexture1D\r
+  void __stdcall GLee_Lazy_glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)  {if (GLeeInit()) glFramebufferTexture1D(target, attachment, textarget, texture, level);}\r
+  GLEEPFNGLFRAMEBUFFERTEXTURE1DPROC GLeeFuncPtr_glFramebufferTexture1D=GLee_Lazy_glFramebufferTexture1D;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFramebufferTexture2D\r
+#define GLEE_C_DEFINED_glFramebufferTexture2D\r
+  void __stdcall GLee_Lazy_glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)  {if (GLeeInit()) glFramebufferTexture2D(target, attachment, textarget, texture, level);}\r
+  GLEEPFNGLFRAMEBUFFERTEXTURE2DPROC GLeeFuncPtr_glFramebufferTexture2D=GLee_Lazy_glFramebufferTexture2D;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFramebufferTexture3D\r
+#define GLEE_C_DEFINED_glFramebufferTexture3D\r
+  void __stdcall GLee_Lazy_glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)  {if (GLeeInit()) glFramebufferTexture3D(target, attachment, textarget, texture, level, zoffset);}\r
+  GLEEPFNGLFRAMEBUFFERTEXTURE3DPROC GLeeFuncPtr_glFramebufferTexture3D=GLee_Lazy_glFramebufferTexture3D;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFramebufferRenderbuffer\r
+#define GLEE_C_DEFINED_glFramebufferRenderbuffer\r
+  void __stdcall GLee_Lazy_glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)  {if (GLeeInit()) glFramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);}\r
+  GLEEPFNGLFRAMEBUFFERRENDERBUFFERPROC GLeeFuncPtr_glFramebufferRenderbuffer=GLee_Lazy_glFramebufferRenderbuffer;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetFramebufferAttachmentParameteriv\r
+#define GLEE_C_DEFINED_glGetFramebufferAttachmentParameteriv\r
+  void __stdcall GLee_Lazy_glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint * params)  {if (GLeeInit()) glGetFramebufferAttachmentParameteriv(target, attachment, pname, params);}\r
+  GLEEPFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC GLeeFuncPtr_glGetFramebufferAttachmentParameteriv=GLee_Lazy_glGetFramebufferAttachmentParameteriv;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGenerateMipmap\r
+#define GLEE_C_DEFINED_glGenerateMipmap\r
+  void __stdcall GLee_Lazy_glGenerateMipmap(GLenum target)  {if (GLeeInit()) glGenerateMipmap(target);}\r
+  GLEEPFNGLGENERATEMIPMAPPROC GLeeFuncPtr_glGenerateMipmap=GLee_Lazy_glGenerateMipmap;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glBlitFramebuffer\r
+#define GLEE_C_DEFINED_glBlitFramebuffer\r
+  void __stdcall GLee_Lazy_glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)  {if (GLeeInit()) glBlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);}\r
+  GLEEPFNGLBLITFRAMEBUFFERPROC GLeeFuncPtr_glBlitFramebuffer=GLee_Lazy_glBlitFramebuffer;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glRenderbufferStorageMultisample\r
+#define GLEE_C_DEFINED_glRenderbufferStorageMultisample\r
+  void __stdcall GLee_Lazy_glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)  {if (GLeeInit()) glRenderbufferStorageMultisample(target, samples, internalformat, width, height);}\r
+  GLEEPFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC GLeeFuncPtr_glRenderbufferStorageMultisample=GLee_Lazy_glRenderbufferStorageMultisample;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFramebufferTextureLayer\r
+#define GLEE_C_DEFINED_glFramebufferTextureLayer\r
+  void __stdcall GLee_Lazy_glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)  {if (GLeeInit()) glFramebufferTextureLayer(target, attachment, texture, level, layer);}\r
+  GLEEPFNGLFRAMEBUFFERTEXTURELAYERPROC GLeeFuncPtr_glFramebufferTextureLayer=GLee_Lazy_glFramebufferTextureLayer;\r
+#endif\r
+#endif \r
+\r
+/* GL_ARB_framebuffer_sRGB */\r
+\r
+#ifdef __GLEE_GL_ARB_framebuffer_sRGB\r
+#endif \r
+\r
+/* GL_ARB_geometry_shader4 */\r
+\r
+#ifdef __GLEE_GL_ARB_geometry_shader4\r
+#ifndef GLEE_C_DEFINED_glProgramParameteriARB\r
+#define GLEE_C_DEFINED_glProgramParameteriARB\r
+  void __stdcall GLee_Lazy_glProgramParameteriARB(GLuint program, GLenum pname, GLint value)  {if (GLeeInit()) glProgramParameteriARB(program, pname, value);}\r
+  GLEEPFNGLPROGRAMPARAMETERIARBPROC GLeeFuncPtr_glProgramParameteriARB=GLee_Lazy_glProgramParameteriARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFramebufferTextureARB\r
+#define GLEE_C_DEFINED_glFramebufferTextureARB\r
+  void __stdcall GLee_Lazy_glFramebufferTextureARB(GLenum target, GLenum attachment, GLuint texture, GLint level)  {if (GLeeInit()) glFramebufferTextureARB(target, attachment, texture, level);}\r
+  GLEEPFNGLFRAMEBUFFERTEXTUREARBPROC GLeeFuncPtr_glFramebufferTextureARB=GLee_Lazy_glFramebufferTextureARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFramebufferTextureLayerARB\r
+#define GLEE_C_DEFINED_glFramebufferTextureLayerARB\r
+  void __stdcall GLee_Lazy_glFramebufferTextureLayerARB(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)  {if (GLeeInit()) glFramebufferTextureLayerARB(target, attachment, texture, level, layer);}\r
+  GLEEPFNGLFRAMEBUFFERTEXTURELAYERARBPROC GLeeFuncPtr_glFramebufferTextureLayerARB=GLee_Lazy_glFramebufferTextureLayerARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFramebufferTextureFaceARB\r
+#define GLEE_C_DEFINED_glFramebufferTextureFaceARB\r
+  void __stdcall GLee_Lazy_glFramebufferTextureFaceARB(GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face)  {if (GLeeInit()) glFramebufferTextureFaceARB(target, attachment, texture, level, face);}\r
+  GLEEPFNGLFRAMEBUFFERTEXTUREFACEARBPROC GLeeFuncPtr_glFramebufferTextureFaceARB=GLee_Lazy_glFramebufferTextureFaceARB;\r
+#endif\r
+#endif \r
+\r
+/* GL_ARB_half_float_vertex */\r
+\r
+#ifdef __GLEE_GL_ARB_half_float_vertex\r
+#endif \r
+\r
+/* GL_ARB_instanced_arrays */\r
+\r
+#ifdef __GLEE_GL_ARB_instanced_arrays\r
+#ifndef GLEE_C_DEFINED_glVertexAttribDivisor\r
+#define GLEE_C_DEFINED_glVertexAttribDivisor\r
+  void __stdcall GLee_Lazy_glVertexAttribDivisor(GLuint index, GLuint divisor)  {if (GLeeInit()) glVertexAttribDivisor(index, divisor);}\r
+  GLEEPFNGLVERTEXATTRIBDIVISORPROC GLeeFuncPtr_glVertexAttribDivisor=GLee_Lazy_glVertexAttribDivisor;\r
+#endif\r
+#endif \r
+\r
+/* GL_ARB_map_buffer_range */\r
+\r
+#ifdef __GLEE_GL_ARB_map_buffer_range\r
+#ifndef GLEE_C_DEFINED_glMapBufferRange\r
+#define GLEE_C_DEFINED_glMapBufferRange\r
+  void __stdcall GLee_Lazy_glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)  {if (GLeeInit()) glMapBufferRange(target, offset, length, access);}\r
+  GLEEPFNGLMAPBUFFERRANGEPROC GLeeFuncPtr_glMapBufferRange=GLee_Lazy_glMapBufferRange;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFlushMappedBufferRange\r
+#define GLEE_C_DEFINED_glFlushMappedBufferRange\r
+  void __stdcall GLee_Lazy_glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)  {if (GLeeInit()) glFlushMappedBufferRange(target, offset, length);}\r
+  GLEEPFNGLFLUSHMAPPEDBUFFERRANGEPROC GLeeFuncPtr_glFlushMappedBufferRange=GLee_Lazy_glFlushMappedBufferRange;\r
+#endif\r
+#endif \r
+\r
+/* GL_ARB_texture_buffer_object */\r
+\r
+#ifdef __GLEE_GL_ARB_texture_buffer_object\r
+#ifndef GLEE_C_DEFINED_glTexBufferARB\r
+#define GLEE_C_DEFINED_glTexBufferARB\r
+  void __stdcall GLee_Lazy_glTexBufferARB(GLenum target, GLenum internalformat, GLuint buffer)  {if (GLeeInit()) glTexBufferARB(target, internalformat, buffer);}\r
+  GLEEPFNGLTEXBUFFERARBPROC GLeeFuncPtr_glTexBufferARB=GLee_Lazy_glTexBufferARB;\r
+#endif\r
+#endif \r
+\r
+/* GL_ARB_texture_compression_rgtc */\r
+\r
+#ifdef __GLEE_GL_ARB_texture_compression_rgtc\r
+#endif \r
+\r
+/* GL_ARB_texture_rg */\r
+\r
+#ifdef __GLEE_GL_ARB_texture_rg\r
+#endif \r
+\r
+/* GL_ARB_vertex_array_object */\r
+\r
+#ifdef __GLEE_GL_ARB_vertex_array_object\r
+#ifndef GLEE_C_DEFINED_glBindVertexArray\r
+#define GLEE_C_DEFINED_glBindVertexArray\r
+  void __stdcall GLee_Lazy_glBindVertexArray(GLuint array)  {if (GLeeInit()) glBindVertexArray(array);}\r
+  GLEEPFNGLBINDVERTEXARRAYPROC GLeeFuncPtr_glBindVertexArray=GLee_Lazy_glBindVertexArray;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glDeleteVertexArrays\r
+#define GLEE_C_DEFINED_glDeleteVertexArrays\r
+  void __stdcall GLee_Lazy_glDeleteVertexArrays(GLsizei n, const GLuint * arrays)  {if (GLeeInit()) glDeleteVertexArrays(n, arrays);}\r
+  GLEEPFNGLDELETEVERTEXARRAYSPROC GLeeFuncPtr_glDeleteVertexArrays=GLee_Lazy_glDeleteVertexArrays;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGenVertexArrays\r
+#define GLEE_C_DEFINED_glGenVertexArrays\r
+  void __stdcall GLee_Lazy_glGenVertexArrays(GLsizei n, GLuint * arrays)  {if (GLeeInit()) glGenVertexArrays(n, arrays);}\r
+  GLEEPFNGLGENVERTEXARRAYSPROC GLeeFuncPtr_glGenVertexArrays=GLee_Lazy_glGenVertexArrays;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glIsVertexArray\r
+#define GLEE_C_DEFINED_glIsVertexArray\r
+  GLboolean __stdcall GLee_Lazy_glIsVertexArray(GLuint array)  {if (GLeeInit()) return glIsVertexArray(array); return (GLboolean)0;}\r
+  GLEEPFNGLISVERTEXARRAYPROC GLeeFuncPtr_glIsVertexArray=GLee_Lazy_glIsVertexArray;\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_abgr */\r
+\r
+#ifdef __GLEE_GL_EXT_abgr\r
+#endif \r
+\r
+/* GL_EXT_blend_color */\r
+\r
+#ifdef __GLEE_GL_EXT_blend_color\r
+#ifndef GLEE_C_DEFINED_glBlendColorEXT\r
+#define GLEE_C_DEFINED_glBlendColorEXT\r
+  void __stdcall GLee_Lazy_glBlendColorEXT(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)  {if (GLeeInit()) glBlendColorEXT(red, green, blue, alpha);}\r
+  GLEEPFNGLBLENDCOLOREXTPROC GLeeFuncPtr_glBlendColorEXT=GLee_Lazy_glBlendColorEXT;\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_polygon_offset */\r
+\r
+#ifdef __GLEE_GL_EXT_polygon_offset\r
+#ifndef GLEE_C_DEFINED_glPolygonOffsetEXT\r
+#define GLEE_C_DEFINED_glPolygonOffsetEXT\r
+  void __stdcall GLee_Lazy_glPolygonOffsetEXT(GLfloat factor, GLfloat bias)  {if (GLeeInit()) glPolygonOffsetEXT(factor, bias);}\r
+  GLEEPFNGLPOLYGONOFFSETEXTPROC GLeeFuncPtr_glPolygonOffsetEXT=GLee_Lazy_glPolygonOffsetEXT;\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_texture */\r
+\r
+#ifdef __GLEE_GL_EXT_texture\r
+#endif \r
+\r
+/* GL_EXT_texture3D */\r
+\r
+#ifdef __GLEE_GL_EXT_texture3D\r
+#ifndef GLEE_C_DEFINED_glTexImage3DEXT\r
+#define GLEE_C_DEFINED_glTexImage3DEXT\r
+  void __stdcall GLee_Lazy_glTexImage3DEXT(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid * pixels)  {if (GLeeInit()) glTexImage3DEXT(target, level, internalformat, width, height, depth, border, format, type, pixels);}\r
+  GLEEPFNGLTEXIMAGE3DEXTPROC GLeeFuncPtr_glTexImage3DEXT=GLee_Lazy_glTexImage3DEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTexSubImage3DEXT\r
+#define GLEE_C_DEFINED_glTexSubImage3DEXT\r
+  void __stdcall GLee_Lazy_glTexSubImage3DEXT(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid * pixels)  {if (GLeeInit()) glTexSubImage3DEXT(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);}\r
+  GLEEPFNGLTEXSUBIMAGE3DEXTPROC GLeeFuncPtr_glTexSubImage3DEXT=GLee_Lazy_glTexSubImage3DEXT;\r
+#endif\r
+#endif \r
+\r
+/* GL_SGIS_texture_filter4 */\r
+\r
+#ifdef __GLEE_GL_SGIS_texture_filter4\r
+#ifndef GLEE_C_DEFINED_glGetTexFilterFuncSGIS\r
+#define GLEE_C_DEFINED_glGetTexFilterFuncSGIS\r
+  void __stdcall GLee_Lazy_glGetTexFilterFuncSGIS(GLenum target, GLenum filter, GLfloat * weights)  {if (GLeeInit()) glGetTexFilterFuncSGIS(target, filter, weights);}\r
+  GLEEPFNGLGETTEXFILTERFUNCSGISPROC GLeeFuncPtr_glGetTexFilterFuncSGIS=GLee_Lazy_glGetTexFilterFuncSGIS;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTexFilterFuncSGIS\r
+#define GLEE_C_DEFINED_glTexFilterFuncSGIS\r
+  void __stdcall GLee_Lazy_glTexFilterFuncSGIS(GLenum target, GLenum filter, GLsizei n, const GLfloat * weights)  {if (GLeeInit()) glTexFilterFuncSGIS(target, filter, n, weights);}\r
+  GLEEPFNGLTEXFILTERFUNCSGISPROC GLeeFuncPtr_glTexFilterFuncSGIS=GLee_Lazy_glTexFilterFuncSGIS;\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_subtexture */\r
+\r
+#ifdef __GLEE_GL_EXT_subtexture\r
+#ifndef GLEE_C_DEFINED_glTexSubImage1DEXT\r
+#define GLEE_C_DEFINED_glTexSubImage1DEXT\r
+  void __stdcall GLee_Lazy_glTexSubImage1DEXT(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid * pixels)  {if (GLeeInit()) glTexSubImage1DEXT(target, level, xoffset, width, format, type, pixels);}\r
+  GLEEPFNGLTEXSUBIMAGE1DEXTPROC GLeeFuncPtr_glTexSubImage1DEXT=GLee_Lazy_glTexSubImage1DEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTexSubImage2DEXT\r
+#define GLEE_C_DEFINED_glTexSubImage2DEXT\r
+  void __stdcall GLee_Lazy_glTexSubImage2DEXT(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * pixels)  {if (GLeeInit()) glTexSubImage2DEXT(target, level, xoffset, yoffset, width, height, format, type, pixels);}\r
+  GLEEPFNGLTEXSUBIMAGE2DEXTPROC GLeeFuncPtr_glTexSubImage2DEXT=GLee_Lazy_glTexSubImage2DEXT;\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_copy_texture */\r
+\r
+#ifdef __GLEE_GL_EXT_copy_texture\r
+#ifndef GLEE_C_DEFINED_glCopyTexImage1DEXT\r
+#define GLEE_C_DEFINED_glCopyTexImage1DEXT\r
+  void __stdcall GLee_Lazy_glCopyTexImage1DEXT(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)  {if (GLeeInit()) glCopyTexImage1DEXT(target, level, internalformat, x, y, width, border);}\r
+  GLEEPFNGLCOPYTEXIMAGE1DEXTPROC GLeeFuncPtr_glCopyTexImage1DEXT=GLee_Lazy_glCopyTexImage1DEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glCopyTexImage2DEXT\r
+#define GLEE_C_DEFINED_glCopyTexImage2DEXT\r
+  void __stdcall GLee_Lazy_glCopyTexImage2DEXT(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)  {if (GLeeInit()) glCopyTexImage2DEXT(target, level, internalformat, x, y, width, height, border);}\r
+  GLEEPFNGLCOPYTEXIMAGE2DEXTPROC GLeeFuncPtr_glCopyTexImage2DEXT=GLee_Lazy_glCopyTexImage2DEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glCopyTexSubImage1DEXT\r
+#define GLEE_C_DEFINED_glCopyTexSubImage1DEXT\r
+  void __stdcall GLee_Lazy_glCopyTexSubImage1DEXT(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)  {if (GLeeInit()) glCopyTexSubImage1DEXT(target, level, xoffset, x, y, width);}\r
+  GLEEPFNGLCOPYTEXSUBIMAGE1DEXTPROC GLeeFuncPtr_glCopyTexSubImage1DEXT=GLee_Lazy_glCopyTexSubImage1DEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glCopyTexSubImage2DEXT\r
+#define GLEE_C_DEFINED_glCopyTexSubImage2DEXT\r
+  void __stdcall GLee_Lazy_glCopyTexSubImage2DEXT(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)  {if (GLeeInit()) glCopyTexSubImage2DEXT(target, level, xoffset, yoffset, x, y, width, height);}\r
+  GLEEPFNGLCOPYTEXSUBIMAGE2DEXTPROC GLeeFuncPtr_glCopyTexSubImage2DEXT=GLee_Lazy_glCopyTexSubImage2DEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glCopyTexSubImage3DEXT\r
+#define GLEE_C_DEFINED_glCopyTexSubImage3DEXT\r
+  void __stdcall GLee_Lazy_glCopyTexSubImage3DEXT(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)  {if (GLeeInit()) glCopyTexSubImage3DEXT(target, level, xoffset, yoffset, zoffset, x, y, width, height);}\r
+  GLEEPFNGLCOPYTEXSUBIMAGE3DEXTPROC GLeeFuncPtr_glCopyTexSubImage3DEXT=GLee_Lazy_glCopyTexSubImage3DEXT;\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_histogram */\r
+\r
+#ifdef __GLEE_GL_EXT_histogram\r
+#ifndef GLEE_C_DEFINED_glGetHistogramEXT\r
+#define GLEE_C_DEFINED_glGetHistogramEXT\r
+  void __stdcall GLee_Lazy_glGetHistogramEXT(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid * values)  {if (GLeeInit()) glGetHistogramEXT(target, reset, format, type, values);}\r
+  GLEEPFNGLGETHISTOGRAMEXTPROC GLeeFuncPtr_glGetHistogramEXT=GLee_Lazy_glGetHistogramEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetHistogramParameterfvEXT\r
+#define GLEE_C_DEFINED_glGetHistogramParameterfvEXT\r
+  void __stdcall GLee_Lazy_glGetHistogramParameterfvEXT(GLenum target, GLenum pname, GLfloat * params)  {if (GLeeInit()) glGetHistogramParameterfvEXT(target, pname, params);}\r
+  GLEEPFNGLGETHISTOGRAMPARAMETERFVEXTPROC GLeeFuncPtr_glGetHistogramParameterfvEXT=GLee_Lazy_glGetHistogramParameterfvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetHistogramParameterivEXT\r
+#define GLEE_C_DEFINED_glGetHistogramParameterivEXT\r
+  void __stdcall GLee_Lazy_glGetHistogramParameterivEXT(GLenum target, GLenum pname, GLint * params)  {if (GLeeInit()) glGetHistogramParameterivEXT(target, pname, params);}\r
+  GLEEPFNGLGETHISTOGRAMPARAMETERIVEXTPROC GLeeFuncPtr_glGetHistogramParameterivEXT=GLee_Lazy_glGetHistogramParameterivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetMinmaxEXT\r
+#define GLEE_C_DEFINED_glGetMinmaxEXT\r
+  void __stdcall GLee_Lazy_glGetMinmaxEXT(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid * values)  {if (GLeeInit()) glGetMinmaxEXT(target, reset, format, type, values);}\r
+  GLEEPFNGLGETMINMAXEXTPROC GLeeFuncPtr_glGetMinmaxEXT=GLee_Lazy_glGetMinmaxEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetMinmaxParameterfvEXT\r
+#define GLEE_C_DEFINED_glGetMinmaxParameterfvEXT\r
+  void __stdcall GLee_Lazy_glGetMinmaxParameterfvEXT(GLenum target, GLenum pname, GLfloat * params)  {if (GLeeInit()) glGetMinmaxParameterfvEXT(target, pname, params);}\r
+  GLEEPFNGLGETMINMAXPARAMETERFVEXTPROC GLeeFuncPtr_glGetMinmaxParameterfvEXT=GLee_Lazy_glGetMinmaxParameterfvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetMinmaxParameterivEXT\r
+#define GLEE_C_DEFINED_glGetMinmaxParameterivEXT\r
+  void __stdcall GLee_Lazy_glGetMinmaxParameterivEXT(GLenum target, GLenum pname, GLint * params)  {if (GLeeInit()) glGetMinmaxParameterivEXT(target, pname, params);}\r
+  GLEEPFNGLGETMINMAXPARAMETERIVEXTPROC GLeeFuncPtr_glGetMinmaxParameterivEXT=GLee_Lazy_glGetMinmaxParameterivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glHistogramEXT\r
+#define GLEE_C_DEFINED_glHistogramEXT\r
+  void __stdcall GLee_Lazy_glHistogramEXT(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink)  {if (GLeeInit()) glHistogramEXT(target, width, internalformat, sink);}\r
+  GLEEPFNGLHISTOGRAMEXTPROC GLeeFuncPtr_glHistogramEXT=GLee_Lazy_glHistogramEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMinmaxEXT\r
+#define GLEE_C_DEFINED_glMinmaxEXT\r
+  void __stdcall GLee_Lazy_glMinmaxEXT(GLenum target, GLenum internalformat, GLboolean sink)  {if (GLeeInit()) glMinmaxEXT(target, internalformat, sink);}\r
+  GLEEPFNGLMINMAXEXTPROC GLeeFuncPtr_glMinmaxEXT=GLee_Lazy_glMinmaxEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glResetHistogramEXT\r
+#define GLEE_C_DEFINED_glResetHistogramEXT\r
+  void __stdcall GLee_Lazy_glResetHistogramEXT(GLenum target)  {if (GLeeInit()) glResetHistogramEXT(target);}\r
+  GLEEPFNGLRESETHISTOGRAMEXTPROC GLeeFuncPtr_glResetHistogramEXT=GLee_Lazy_glResetHistogramEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glResetMinmaxEXT\r
+#define GLEE_C_DEFINED_glResetMinmaxEXT\r
+  void __stdcall GLee_Lazy_glResetMinmaxEXT(GLenum target)  {if (GLeeInit()) glResetMinmaxEXT(target);}\r
+  GLEEPFNGLRESETMINMAXEXTPROC GLeeFuncPtr_glResetMinmaxEXT=GLee_Lazy_glResetMinmaxEXT;\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_convolution */\r
+\r
+#ifdef __GLEE_GL_EXT_convolution\r
+#ifndef GLEE_C_DEFINED_glConvolutionFilter1DEXT\r
+#define GLEE_C_DEFINED_glConvolutionFilter1DEXT\r
+  void __stdcall GLee_Lazy_glConvolutionFilter1DEXT(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid * image)  {if (GLeeInit()) glConvolutionFilter1DEXT(target, internalformat, width, format, type, image);}\r
+  GLEEPFNGLCONVOLUTIONFILTER1DEXTPROC GLeeFuncPtr_glConvolutionFilter1DEXT=GLee_Lazy_glConvolutionFilter1DEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glConvolutionFilter2DEXT\r
+#define GLEE_C_DEFINED_glConvolutionFilter2DEXT\r
+  void __stdcall GLee_Lazy_glConvolutionFilter2DEXT(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * image)  {if (GLeeInit()) glConvolutionFilter2DEXT(target, internalformat, width, height, format, type, image);}\r
+  GLEEPFNGLCONVOLUTIONFILTER2DEXTPROC GLeeFuncPtr_glConvolutionFilter2DEXT=GLee_Lazy_glConvolutionFilter2DEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glConvolutionParameterfEXT\r
+#define GLEE_C_DEFINED_glConvolutionParameterfEXT\r
+  void __stdcall GLee_Lazy_glConvolutionParameterfEXT(GLenum target, GLenum pname, GLfloat params)  {if (GLeeInit()) glConvolutionParameterfEXT(target, pname, params);}\r
+  GLEEPFNGLCONVOLUTIONPARAMETERFEXTPROC GLeeFuncPtr_glConvolutionParameterfEXT=GLee_Lazy_glConvolutionParameterfEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glConvolutionParameterfvEXT\r
+#define GLEE_C_DEFINED_glConvolutionParameterfvEXT\r
+  void __stdcall GLee_Lazy_glConvolutionParameterfvEXT(GLenum target, GLenum pname, const GLfloat * params)  {if (GLeeInit()) glConvolutionParameterfvEXT(target, pname, params);}\r
+  GLEEPFNGLCONVOLUTIONPARAMETERFVEXTPROC GLeeFuncPtr_glConvolutionParameterfvEXT=GLee_Lazy_glConvolutionParameterfvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glConvolutionParameteriEXT\r
+#define GLEE_C_DEFINED_glConvolutionParameteriEXT\r
+  void __stdcall GLee_Lazy_glConvolutionParameteriEXT(GLenum target, GLenum pname, GLint params)  {if (GLeeInit()) glConvolutionParameteriEXT(target, pname, params);}\r
+  GLEEPFNGLCONVOLUTIONPARAMETERIEXTPROC GLeeFuncPtr_glConvolutionParameteriEXT=GLee_Lazy_glConvolutionParameteriEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glConvolutionParameterivEXT\r
+#define GLEE_C_DEFINED_glConvolutionParameterivEXT\r
+  void __stdcall GLee_Lazy_glConvolutionParameterivEXT(GLenum target, GLenum pname, const GLint * params)  {if (GLeeInit()) glConvolutionParameterivEXT(target, pname, params);}\r
+  GLEEPFNGLCONVOLUTIONPARAMETERIVEXTPROC GLeeFuncPtr_glConvolutionParameterivEXT=GLee_Lazy_glConvolutionParameterivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glCopyConvolutionFilter1DEXT\r
+#define GLEE_C_DEFINED_glCopyConvolutionFilter1DEXT\r
+  void __stdcall GLee_Lazy_glCopyConvolutionFilter1DEXT(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)  {if (GLeeInit()) glCopyConvolutionFilter1DEXT(target, internalformat, x, y, width);}\r
+  GLEEPFNGLCOPYCONVOLUTIONFILTER1DEXTPROC GLeeFuncPtr_glCopyConvolutionFilter1DEXT=GLee_Lazy_glCopyConvolutionFilter1DEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glCopyConvolutionFilter2DEXT\r
+#define GLEE_C_DEFINED_glCopyConvolutionFilter2DEXT\r
+  void __stdcall GLee_Lazy_glCopyConvolutionFilter2DEXT(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height)  {if (GLeeInit()) glCopyConvolutionFilter2DEXT(target, internalformat, x, y, width, height);}\r
+  GLEEPFNGLCOPYCONVOLUTIONFILTER2DEXTPROC GLeeFuncPtr_glCopyConvolutionFilter2DEXT=GLee_Lazy_glCopyConvolutionFilter2DEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetConvolutionFilterEXT\r
+#define GLEE_C_DEFINED_glGetConvolutionFilterEXT\r
+  void __stdcall GLee_Lazy_glGetConvolutionFilterEXT(GLenum target, GLenum format, GLenum type, GLvoid * image)  {if (GLeeInit()) glGetConvolutionFilterEXT(target, format, type, image);}\r
+  GLEEPFNGLGETCONVOLUTIONFILTEREXTPROC GLeeFuncPtr_glGetConvolutionFilterEXT=GLee_Lazy_glGetConvolutionFilterEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetConvolutionParameterfvEXT\r
+#define GLEE_C_DEFINED_glGetConvolutionParameterfvEXT\r
+  void __stdcall GLee_Lazy_glGetConvolutionParameterfvEXT(GLenum target, GLenum pname, GLfloat * params)  {if (GLeeInit()) glGetConvolutionParameterfvEXT(target, pname, params);}\r
+  GLEEPFNGLGETCONVOLUTIONPARAMETERFVEXTPROC GLeeFuncPtr_glGetConvolutionParameterfvEXT=GLee_Lazy_glGetConvolutionParameterfvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetConvolutionParameterivEXT\r
+#define GLEE_C_DEFINED_glGetConvolutionParameterivEXT\r
+  void __stdcall GLee_Lazy_glGetConvolutionParameterivEXT(GLenum target, GLenum pname, GLint * params)  {if (GLeeInit()) glGetConvolutionParameterivEXT(target, pname, params);}\r
+  GLEEPFNGLGETCONVOLUTIONPARAMETERIVEXTPROC GLeeFuncPtr_glGetConvolutionParameterivEXT=GLee_Lazy_glGetConvolutionParameterivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetSeparableFilterEXT\r
+#define GLEE_C_DEFINED_glGetSeparableFilterEXT\r
+  void __stdcall GLee_Lazy_glGetSeparableFilterEXT(GLenum target, GLenum format, GLenum type, GLvoid * row, GLvoid * column, GLvoid * span)  {if (GLeeInit()) glGetSeparableFilterEXT(target, format, type, row, column, span);}\r
+  GLEEPFNGLGETSEPARABLEFILTEREXTPROC GLeeFuncPtr_glGetSeparableFilterEXT=GLee_Lazy_glGetSeparableFilterEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glSeparableFilter2DEXT\r
+#define GLEE_C_DEFINED_glSeparableFilter2DEXT\r
+  void __stdcall GLee_Lazy_glSeparableFilter2DEXT(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * row, const GLvoid * column)  {if (GLeeInit()) glSeparableFilter2DEXT(target, internalformat, width, height, format, type, row, column);}\r
+  GLEEPFNGLSEPARABLEFILTER2DEXTPROC GLeeFuncPtr_glSeparableFilter2DEXT=GLee_Lazy_glSeparableFilter2DEXT;\r
+#endif\r
+#endif \r
+\r
+/* GL_SGI_color_matrix */\r
+\r
+#ifdef __GLEE_GL_SGI_color_matrix\r
+#endif \r
+\r
+/* GL_SGI_color_table */\r
+\r
+#ifdef __GLEE_GL_SGI_color_table\r
+#ifndef GLEE_C_DEFINED_glColorTableSGI\r
+#define GLEE_C_DEFINED_glColorTableSGI\r
+  void __stdcall GLee_Lazy_glColorTableSGI(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid * table)  {if (GLeeInit()) glColorTableSGI(target, internalformat, width, format, type, table);}\r
+  GLEEPFNGLCOLORTABLESGIPROC GLeeFuncPtr_glColorTableSGI=GLee_Lazy_glColorTableSGI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glColorTableParameterfvSGI\r
+#define GLEE_C_DEFINED_glColorTableParameterfvSGI\r
+  void __stdcall GLee_Lazy_glColorTableParameterfvSGI(GLenum target, GLenum pname, const GLfloat * params)  {if (GLeeInit()) glColorTableParameterfvSGI(target, pname, params);}\r
+  GLEEPFNGLCOLORTABLEPARAMETERFVSGIPROC GLeeFuncPtr_glColorTableParameterfvSGI=GLee_Lazy_glColorTableParameterfvSGI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glColorTableParameterivSGI\r
+#define GLEE_C_DEFINED_glColorTableParameterivSGI\r
+  void __stdcall GLee_Lazy_glColorTableParameterivSGI(GLenum target, GLenum pname, const GLint * params)  {if (GLeeInit()) glColorTableParameterivSGI(target, pname, params);}\r
+  GLEEPFNGLCOLORTABLEPARAMETERIVSGIPROC GLeeFuncPtr_glColorTableParameterivSGI=GLee_Lazy_glColorTableParameterivSGI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glCopyColorTableSGI\r
+#define GLEE_C_DEFINED_glCopyColorTableSGI\r
+  void __stdcall GLee_Lazy_glCopyColorTableSGI(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)  {if (GLeeInit()) glCopyColorTableSGI(target, internalformat, x, y, width);}\r
+  GLEEPFNGLCOPYCOLORTABLESGIPROC GLeeFuncPtr_glCopyColorTableSGI=GLee_Lazy_glCopyColorTableSGI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetColorTableSGI\r
+#define GLEE_C_DEFINED_glGetColorTableSGI\r
+  void __stdcall GLee_Lazy_glGetColorTableSGI(GLenum target, GLenum format, GLenum type, GLvoid * table)  {if (GLeeInit()) glGetColorTableSGI(target, format, type, table);}\r
+  GLEEPFNGLGETCOLORTABLESGIPROC GLeeFuncPtr_glGetColorTableSGI=GLee_Lazy_glGetColorTableSGI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetColorTableParameterfvSGI\r
+#define GLEE_C_DEFINED_glGetColorTableParameterfvSGI\r
+  void __stdcall GLee_Lazy_glGetColorTableParameterfvSGI(GLenum target, GLenum pname, GLfloat * params)  {if (GLeeInit()) glGetColorTableParameterfvSGI(target, pname, params);}\r
+  GLEEPFNGLGETCOLORTABLEPARAMETERFVSGIPROC GLeeFuncPtr_glGetColorTableParameterfvSGI=GLee_Lazy_glGetColorTableParameterfvSGI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetColorTableParameterivSGI\r
+#define GLEE_C_DEFINED_glGetColorTableParameterivSGI\r
+  void __stdcall GLee_Lazy_glGetColorTableParameterivSGI(GLenum target, GLenum pname, GLint * params)  {if (GLeeInit()) glGetColorTableParameterivSGI(target, pname, params);}\r
+  GLEEPFNGLGETCOLORTABLEPARAMETERIVSGIPROC GLeeFuncPtr_glGetColorTableParameterivSGI=GLee_Lazy_glGetColorTableParameterivSGI;\r
+#endif\r
+#endif \r
+\r
+/* GL_SGIS_pixel_texture */\r
+\r
+#ifdef __GLEE_GL_SGIS_pixel_texture\r
+#ifndef GLEE_C_DEFINED_glPixelTexGenParameteriSGIS\r
+#define GLEE_C_DEFINED_glPixelTexGenParameteriSGIS\r
+  void __stdcall GLee_Lazy_glPixelTexGenParameteriSGIS(GLenum pname, GLint param)  {if (GLeeInit()) glPixelTexGenParameteriSGIS(pname, param);}\r
+  GLEEPFNGLPIXELTEXGENPARAMETERISGISPROC GLeeFuncPtr_glPixelTexGenParameteriSGIS=GLee_Lazy_glPixelTexGenParameteriSGIS;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glPixelTexGenParameterivSGIS\r
+#define GLEE_C_DEFINED_glPixelTexGenParameterivSGIS\r
+  void __stdcall GLee_Lazy_glPixelTexGenParameterivSGIS(GLenum pname, const GLint * params)  {if (GLeeInit()) glPixelTexGenParameterivSGIS(pname, params);}\r
+  GLEEPFNGLPIXELTEXGENPARAMETERIVSGISPROC GLeeFuncPtr_glPixelTexGenParameterivSGIS=GLee_Lazy_glPixelTexGenParameterivSGIS;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glPixelTexGenParameterfSGIS\r
+#define GLEE_C_DEFINED_glPixelTexGenParameterfSGIS\r
+  void __stdcall GLee_Lazy_glPixelTexGenParameterfSGIS(GLenum pname, GLfloat param)  {if (GLeeInit()) glPixelTexGenParameterfSGIS(pname, param);}\r
+  GLEEPFNGLPIXELTEXGENPARAMETERFSGISPROC GLeeFuncPtr_glPixelTexGenParameterfSGIS=GLee_Lazy_glPixelTexGenParameterfSGIS;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glPixelTexGenParameterfvSGIS\r
+#define GLEE_C_DEFINED_glPixelTexGenParameterfvSGIS\r
+  void __stdcall GLee_Lazy_glPixelTexGenParameterfvSGIS(GLenum pname, const GLfloat * params)  {if (GLeeInit()) glPixelTexGenParameterfvSGIS(pname, params);}\r
+  GLEEPFNGLPIXELTEXGENPARAMETERFVSGISPROC GLeeFuncPtr_glPixelTexGenParameterfvSGIS=GLee_Lazy_glPixelTexGenParameterfvSGIS;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetPixelTexGenParameterivSGIS\r
+#define GLEE_C_DEFINED_glGetPixelTexGenParameterivSGIS\r
+  void __stdcall GLee_Lazy_glGetPixelTexGenParameterivSGIS(GLenum pname, GLint * params)  {if (GLeeInit()) glGetPixelTexGenParameterivSGIS(pname, params);}\r
+  GLEEPFNGLGETPIXELTEXGENPARAMETERIVSGISPROC GLeeFuncPtr_glGetPixelTexGenParameterivSGIS=GLee_Lazy_glGetPixelTexGenParameterivSGIS;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetPixelTexGenParameterfvSGIS\r
+#define GLEE_C_DEFINED_glGetPixelTexGenParameterfvSGIS\r
+  void __stdcall GLee_Lazy_glGetPixelTexGenParameterfvSGIS(GLenum pname, GLfloat * params)  {if (GLeeInit()) glGetPixelTexGenParameterfvSGIS(pname, params);}\r
+  GLEEPFNGLGETPIXELTEXGENPARAMETERFVSGISPROC GLeeFuncPtr_glGetPixelTexGenParameterfvSGIS=GLee_Lazy_glGetPixelTexGenParameterfvSGIS;\r
+#endif\r
+#endif \r
+\r
+/* GL_SGIX_pixel_texture */\r
+\r
+#ifdef __GLEE_GL_SGIX_pixel_texture\r
+#ifndef GLEE_C_DEFINED_glPixelTexGenSGIX\r
+#define GLEE_C_DEFINED_glPixelTexGenSGIX\r
+  void __stdcall GLee_Lazy_glPixelTexGenSGIX(GLenum mode)  {if (GLeeInit()) glPixelTexGenSGIX(mode);}\r
+  GLEEPFNGLPIXELTEXGENSGIXPROC GLeeFuncPtr_glPixelTexGenSGIX=GLee_Lazy_glPixelTexGenSGIX;\r
+#endif\r
+#endif \r
+\r
+/* GL_SGIS_texture4D */\r
+\r
+#ifdef __GLEE_GL_SGIS_texture4D\r
+#ifndef GLEE_C_DEFINED_glTexImage4DSGIS\r
+#define GLEE_C_DEFINED_glTexImage4DSGIS\r
+  void __stdcall GLee_Lazy_glTexImage4DSGIS(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLint border, GLenum format, GLenum type, const GLvoid * pixels)  {if (GLeeInit()) glTexImage4DSGIS(target, level, internalformat, width, height, depth, size4d, border, format, type, pixels);}\r
+  GLEEPFNGLTEXIMAGE4DSGISPROC GLeeFuncPtr_glTexImage4DSGIS=GLee_Lazy_glTexImage4DSGIS;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTexSubImage4DSGIS\r
+#define GLEE_C_DEFINED_glTexSubImage4DSGIS\r
+  void __stdcall GLee_Lazy_glTexSubImage4DSGIS(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLenum format, GLenum type, const GLvoid * pixels)  {if (GLeeInit()) glTexSubImage4DSGIS(target, level, xoffset, yoffset, zoffset, woffset, width, height, depth, size4d, format, type, pixels);}\r
+  GLEEPFNGLTEXSUBIMAGE4DSGISPROC GLeeFuncPtr_glTexSubImage4DSGIS=GLee_Lazy_glTexSubImage4DSGIS;\r
+#endif\r
+#endif \r
+\r
+/* GL_SGI_texture_color_table */\r
+\r
+#ifdef __GLEE_GL_SGI_texture_color_table\r
+#endif \r
+\r
+/* GL_EXT_cmyka */\r
+\r
+#ifdef __GLEE_GL_EXT_cmyka\r
+#endif \r
+\r
+/* GL_EXT_texture_object */\r
+\r
+#ifdef __GLEE_GL_EXT_texture_object\r
+#ifndef GLEE_C_DEFINED_glAreTexturesResidentEXT\r
+#define GLEE_C_DEFINED_glAreTexturesResidentEXT\r
+  GLboolean __stdcall GLee_Lazy_glAreTexturesResidentEXT(GLsizei n, const GLuint * textures, GLboolean * residences)  {if (GLeeInit()) return glAreTexturesResidentEXT(n, textures, residences); return (GLboolean)0;}\r
+  GLEEPFNGLARETEXTURESRESIDENTEXTPROC GLeeFuncPtr_glAreTexturesResidentEXT=GLee_Lazy_glAreTexturesResidentEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glBindTextureEXT\r
+#define GLEE_C_DEFINED_glBindTextureEXT\r
+  void __stdcall GLee_Lazy_glBindTextureEXT(GLenum target, GLuint texture)  {if (GLeeInit()) glBindTextureEXT(target, texture);}\r
+  GLEEPFNGLBINDTEXTUREEXTPROC GLeeFuncPtr_glBindTextureEXT=GLee_Lazy_glBindTextureEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glDeleteTexturesEXT\r
+#define GLEE_C_DEFINED_glDeleteTexturesEXT\r
+  void __stdcall GLee_Lazy_glDeleteTexturesEXT(GLsizei n, const GLuint * textures)  {if (GLeeInit()) glDeleteTexturesEXT(n, textures);}\r
+  GLEEPFNGLDELETETEXTURESEXTPROC GLeeFuncPtr_glDeleteTexturesEXT=GLee_Lazy_glDeleteTexturesEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGenTexturesEXT\r
+#define GLEE_C_DEFINED_glGenTexturesEXT\r
+  void __stdcall GLee_Lazy_glGenTexturesEXT(GLsizei n, GLuint * textures)  {if (GLeeInit()) glGenTexturesEXT(n, textures);}\r
+  GLEEPFNGLGENTEXTURESEXTPROC GLeeFuncPtr_glGenTexturesEXT=GLee_Lazy_glGenTexturesEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glIsTextureEXT\r
+#define GLEE_C_DEFINED_glIsTextureEXT\r
+  GLboolean __stdcall GLee_Lazy_glIsTextureEXT(GLuint texture)  {if (GLeeInit()) return glIsTextureEXT(texture); return (GLboolean)0;}\r
+  GLEEPFNGLISTEXTUREEXTPROC GLeeFuncPtr_glIsTextureEXT=GLee_Lazy_glIsTextureEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glPrioritizeTexturesEXT\r
+#define GLEE_C_DEFINED_glPrioritizeTexturesEXT\r
+  void __stdcall GLee_Lazy_glPrioritizeTexturesEXT(GLsizei n, const GLuint * textures, const GLclampf * priorities)  {if (GLeeInit()) glPrioritizeTexturesEXT(n, textures, priorities);}\r
+  GLEEPFNGLPRIORITIZETEXTURESEXTPROC GLeeFuncPtr_glPrioritizeTexturesEXT=GLee_Lazy_glPrioritizeTexturesEXT;\r
+#endif\r
+#endif \r
+\r
+/* GL_SGIS_detail_texture */\r
+\r
+#ifdef __GLEE_GL_SGIS_detail_texture\r
+#ifndef GLEE_C_DEFINED_glDetailTexFuncSGIS\r
+#define GLEE_C_DEFINED_glDetailTexFuncSGIS\r
+  void __stdcall GLee_Lazy_glDetailTexFuncSGIS(GLenum target, GLsizei n, const GLfloat * points)  {if (GLeeInit()) glDetailTexFuncSGIS(target, n, points);}\r
+  GLEEPFNGLDETAILTEXFUNCSGISPROC GLeeFuncPtr_glDetailTexFuncSGIS=GLee_Lazy_glDetailTexFuncSGIS;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetDetailTexFuncSGIS\r
+#define GLEE_C_DEFINED_glGetDetailTexFuncSGIS\r
+  void __stdcall GLee_Lazy_glGetDetailTexFuncSGIS(GLenum target, GLfloat * points)  {if (GLeeInit()) glGetDetailTexFuncSGIS(target, points);}\r
+  GLEEPFNGLGETDETAILTEXFUNCSGISPROC GLeeFuncPtr_glGetDetailTexFuncSGIS=GLee_Lazy_glGetDetailTexFuncSGIS;\r
+#endif\r
+#endif \r
+\r
+/* GL_SGIS_sharpen_texture */\r
+\r
+#ifdef __GLEE_GL_SGIS_sharpen_texture\r
+#ifndef GLEE_C_DEFINED_glSharpenTexFuncSGIS\r
+#define GLEE_C_DEFINED_glSharpenTexFuncSGIS\r
+  void __stdcall GLee_Lazy_glSharpenTexFuncSGIS(GLenum target, GLsizei n, const GLfloat * points)  {if (GLeeInit()) glSharpenTexFuncSGIS(target, n, points);}\r
+  GLEEPFNGLSHARPENTEXFUNCSGISPROC GLeeFuncPtr_glSharpenTexFuncSGIS=GLee_Lazy_glSharpenTexFuncSGIS;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetSharpenTexFuncSGIS\r
+#define GLEE_C_DEFINED_glGetSharpenTexFuncSGIS\r
+  void __stdcall GLee_Lazy_glGetSharpenTexFuncSGIS(GLenum target, GLfloat * points)  {if (GLeeInit()) glGetSharpenTexFuncSGIS(target, points);}\r
+  GLEEPFNGLGETSHARPENTEXFUNCSGISPROC GLeeFuncPtr_glGetSharpenTexFuncSGIS=GLee_Lazy_glGetSharpenTexFuncSGIS;\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_packed_pixels */\r
+\r
+#ifdef __GLEE_GL_EXT_packed_pixels\r
+#endif \r
+\r
+/* GL_SGIS_texture_lod */\r
+\r
+#ifdef __GLEE_GL_SGIS_texture_lod\r
+#endif \r
+\r
+/* GL_SGIS_multisample */\r
+\r
+#ifdef __GLEE_GL_SGIS_multisample\r
+#ifndef GLEE_C_DEFINED_glSampleMaskSGIS\r
+#define GLEE_C_DEFINED_glSampleMaskSGIS\r
+  void __stdcall GLee_Lazy_glSampleMaskSGIS(GLclampf value, GLboolean invert)  {if (GLeeInit()) glSampleMaskSGIS(value, invert);}\r
+  GLEEPFNGLSAMPLEMASKSGISPROC GLeeFuncPtr_glSampleMaskSGIS=GLee_Lazy_glSampleMaskSGIS;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glSamplePatternSGIS\r
+#define GLEE_C_DEFINED_glSamplePatternSGIS\r
+  void __stdcall GLee_Lazy_glSamplePatternSGIS(GLenum pattern)  {if (GLeeInit()) glSamplePatternSGIS(pattern);}\r
+  GLEEPFNGLSAMPLEPATTERNSGISPROC GLeeFuncPtr_glSamplePatternSGIS=GLee_Lazy_glSamplePatternSGIS;\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_rescale_normal */\r
+\r
+#ifdef __GLEE_GL_EXT_rescale_normal\r
+#endif \r
+\r
+/* GL_EXT_vertex_array */\r
+\r
+#ifdef __GLEE_GL_EXT_vertex_array\r
+#ifndef GLEE_C_DEFINED_glArrayElementEXT\r
+#define GLEE_C_DEFINED_glArrayElementEXT\r
+  void __stdcall GLee_Lazy_glArrayElementEXT(GLint i)  {if (GLeeInit()) glArrayElementEXT(i);}\r
+  GLEEPFNGLARRAYELEMENTEXTPROC GLeeFuncPtr_glArrayElementEXT=GLee_Lazy_glArrayElementEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glColorPointerEXT\r
+#define GLEE_C_DEFINED_glColorPointerEXT\r
+  void __stdcall GLee_Lazy_glColorPointerEXT(GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid * pointer)  {if (GLeeInit()) glColorPointerEXT(size, type, stride, count, pointer);}\r
+  GLEEPFNGLCOLORPOINTEREXTPROC GLeeFuncPtr_glColorPointerEXT=GLee_Lazy_glColorPointerEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glDrawArraysEXT\r
+#define GLEE_C_DEFINED_glDrawArraysEXT\r
+  void __stdcall GLee_Lazy_glDrawArraysEXT(GLenum mode, GLint first, GLsizei count)  {if (GLeeInit()) glDrawArraysEXT(mode, first, count);}\r
+  GLEEPFNGLDRAWARRAYSEXTPROC GLeeFuncPtr_glDrawArraysEXT=GLee_Lazy_glDrawArraysEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glEdgeFlagPointerEXT\r
+#define GLEE_C_DEFINED_glEdgeFlagPointerEXT\r
+  void __stdcall GLee_Lazy_glEdgeFlagPointerEXT(GLsizei stride, GLsizei count, const GLboolean * pointer)  {if (GLeeInit()) glEdgeFlagPointerEXT(stride, count, pointer);}\r
+  GLEEPFNGLEDGEFLAGPOINTEREXTPROC GLeeFuncPtr_glEdgeFlagPointerEXT=GLee_Lazy_glEdgeFlagPointerEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetPointervEXT\r
+#define GLEE_C_DEFINED_glGetPointervEXT\r
+  void __stdcall GLee_Lazy_glGetPointervEXT(GLenum pname, GLvoid* * params)  {if (GLeeInit()) glGetPointervEXT(pname, params);}\r
+  GLEEPFNGLGETPOINTERVEXTPROC GLeeFuncPtr_glGetPointervEXT=GLee_Lazy_glGetPointervEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glIndexPointerEXT\r
+#define GLEE_C_DEFINED_glIndexPointerEXT\r
+  void __stdcall GLee_Lazy_glIndexPointerEXT(GLenum type, GLsizei stride, GLsizei count, const GLvoid * pointer)  {if (GLeeInit()) glIndexPointerEXT(type, stride, count, pointer);}\r
+  GLEEPFNGLINDEXPOINTEREXTPROC GLeeFuncPtr_glIndexPointerEXT=GLee_Lazy_glIndexPointerEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glNormalPointerEXT\r
+#define GLEE_C_DEFINED_glNormalPointerEXT\r
+  void __stdcall GLee_Lazy_glNormalPointerEXT(GLenum type, GLsizei stride, GLsizei count, const GLvoid * pointer)  {if (GLeeInit()) glNormalPointerEXT(type, stride, count, pointer);}\r
+  GLEEPFNGLNORMALPOINTEREXTPROC GLeeFuncPtr_glNormalPointerEXT=GLee_Lazy_glNormalPointerEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTexCoordPointerEXT\r
+#define GLEE_C_DEFINED_glTexCoordPointerEXT\r
+  void __stdcall GLee_Lazy_glTexCoordPointerEXT(GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid * pointer)  {if (GLeeInit()) glTexCoordPointerEXT(size, type, stride, count, pointer);}\r
+  GLEEPFNGLTEXCOORDPOINTEREXTPROC GLeeFuncPtr_glTexCoordPointerEXT=GLee_Lazy_glTexCoordPointerEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexPointerEXT\r
+#define GLEE_C_DEFINED_glVertexPointerEXT\r
+  void __stdcall GLee_Lazy_glVertexPointerEXT(GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid * pointer)  {if (GLeeInit()) glVertexPointerEXT(size, type, stride, count, pointer);}\r
+  GLEEPFNGLVERTEXPOINTEREXTPROC GLeeFuncPtr_glVertexPointerEXT=GLee_Lazy_glVertexPointerEXT;\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_misc_attribute */\r
+\r
+#ifdef __GLEE_GL_EXT_misc_attribute\r
+#endif \r
+\r
+/* GL_SGIS_generate_mipmap */\r
+\r
+#ifdef __GLEE_GL_SGIS_generate_mipmap\r
+#endif \r
+\r
+/* GL_SGIX_clipmap */\r
+\r
+#ifdef __GLEE_GL_SGIX_clipmap\r
+#endif \r
+\r
+/* GL_SGIX_shadow */\r
+\r
+#ifdef __GLEE_GL_SGIX_shadow\r
+#endif \r
+\r
+/* GL_SGIS_texture_edge_clamp */\r
+\r
+#ifdef __GLEE_GL_SGIS_texture_edge_clamp\r
+#endif \r
+\r
+/* GL_SGIS_texture_border_clamp */\r
+\r
+#ifdef __GLEE_GL_SGIS_texture_border_clamp\r
+#endif \r
+\r
+/* GL_EXT_blend_minmax */\r
+\r
+#ifdef __GLEE_GL_EXT_blend_minmax\r
+#ifndef GLEE_C_DEFINED_glBlendEquationEXT\r
+#define GLEE_C_DEFINED_glBlendEquationEXT\r
+  void __stdcall GLee_Lazy_glBlendEquationEXT(GLenum mode)  {if (GLeeInit()) glBlendEquationEXT(mode);}\r
+  GLEEPFNGLBLENDEQUATIONEXTPROC GLeeFuncPtr_glBlendEquationEXT=GLee_Lazy_glBlendEquationEXT;\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_blend_subtract */\r
+\r
+#ifdef __GLEE_GL_EXT_blend_subtract\r
+#endif \r
+\r
+/* GL_EXT_blend_logic_op */\r
+\r
+#ifdef __GLEE_GL_EXT_blend_logic_op\r
+#endif \r
+\r
+/* GL_SGIX_interlace */\r
+\r
+#ifdef __GLEE_GL_SGIX_interlace\r
+#endif \r
+\r
+/* GL_SGIX_pixel_tiles */\r
+\r
+#ifdef __GLEE_GL_SGIX_pixel_tiles\r
+#endif \r
+\r
+/* GL_SGIS_texture_select */\r
+\r
+#ifdef __GLEE_GL_SGIS_texture_select\r
+#endif \r
+\r
+/* GL_SGIX_sprite */\r
+\r
+#ifdef __GLEE_GL_SGIX_sprite\r
+#ifndef GLEE_C_DEFINED_glSpriteParameterfSGIX\r
+#define GLEE_C_DEFINED_glSpriteParameterfSGIX\r
+  void __stdcall GLee_Lazy_glSpriteParameterfSGIX(GLenum pname, GLfloat param)  {if (GLeeInit()) glSpriteParameterfSGIX(pname, param);}\r
+  GLEEPFNGLSPRITEPARAMETERFSGIXPROC GLeeFuncPtr_glSpriteParameterfSGIX=GLee_Lazy_glSpriteParameterfSGIX;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glSpriteParameterfvSGIX\r
+#define GLEE_C_DEFINED_glSpriteParameterfvSGIX\r
+  void __stdcall GLee_Lazy_glSpriteParameterfvSGIX(GLenum pname, const GLfloat * params)  {if (GLeeInit()) glSpriteParameterfvSGIX(pname, params);}\r
+  GLEEPFNGLSPRITEPARAMETERFVSGIXPROC GLeeFuncPtr_glSpriteParameterfvSGIX=GLee_Lazy_glSpriteParameterfvSGIX;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glSpriteParameteriSGIX\r
+#define GLEE_C_DEFINED_glSpriteParameteriSGIX\r
+  void __stdcall GLee_Lazy_glSpriteParameteriSGIX(GLenum pname, GLint param)  {if (GLeeInit()) glSpriteParameteriSGIX(pname, param);}\r
+  GLEEPFNGLSPRITEPARAMETERISGIXPROC GLeeFuncPtr_glSpriteParameteriSGIX=GLee_Lazy_glSpriteParameteriSGIX;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glSpriteParameterivSGIX\r
+#define GLEE_C_DEFINED_glSpriteParameterivSGIX\r
+  void __stdcall GLee_Lazy_glSpriteParameterivSGIX(GLenum pname, const GLint * params)  {if (GLeeInit()) glSpriteParameterivSGIX(pname, params);}\r
+  GLEEPFNGLSPRITEPARAMETERIVSGIXPROC GLeeFuncPtr_glSpriteParameterivSGIX=GLee_Lazy_glSpriteParameterivSGIX;\r
+#endif\r
+#endif \r
+\r
+/* GL_SGIX_texture_multi_buffer */\r
+\r
+#ifdef __GLEE_GL_SGIX_texture_multi_buffer\r
+#endif \r
+\r
+/* GL_EXT_point_parameters */\r
+\r
+#ifdef __GLEE_GL_EXT_point_parameters\r
+#ifndef GLEE_C_DEFINED_glPointParameterfEXT\r
+#define GLEE_C_DEFINED_glPointParameterfEXT\r
+  void __stdcall GLee_Lazy_glPointParameterfEXT(GLenum pname, GLfloat param)  {if (GLeeInit()) glPointParameterfEXT(pname, param);}\r
+  GLEEPFNGLPOINTPARAMETERFEXTPROC GLeeFuncPtr_glPointParameterfEXT=GLee_Lazy_glPointParameterfEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glPointParameterfvEXT\r
+#define GLEE_C_DEFINED_glPointParameterfvEXT\r
+  void __stdcall GLee_Lazy_glPointParameterfvEXT(GLenum pname, const GLfloat * params)  {if (GLeeInit()) glPointParameterfvEXT(pname, params);}\r
+  GLEEPFNGLPOINTPARAMETERFVEXTPROC GLeeFuncPtr_glPointParameterfvEXT=GLee_Lazy_glPointParameterfvEXT;\r
+#endif\r
+#endif \r
+\r
+/* GL_SGIS_point_parameters */\r
+\r
+#ifdef __GLEE_GL_SGIS_point_parameters\r
+#ifndef GLEE_C_DEFINED_glPointParameterfSGIS\r
+#define GLEE_C_DEFINED_glPointParameterfSGIS\r
+  void __stdcall GLee_Lazy_glPointParameterfSGIS(GLenum pname, GLfloat param)  {if (GLeeInit()) glPointParameterfSGIS(pname, param);}\r
+  GLEEPFNGLPOINTPARAMETERFSGISPROC GLeeFuncPtr_glPointParameterfSGIS=GLee_Lazy_glPointParameterfSGIS;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glPointParameterfvSGIS\r
+#define GLEE_C_DEFINED_glPointParameterfvSGIS\r
+  void __stdcall GLee_Lazy_glPointParameterfvSGIS(GLenum pname, const GLfloat * params)  {if (GLeeInit()) glPointParameterfvSGIS(pname, params);}\r
+  GLEEPFNGLPOINTPARAMETERFVSGISPROC GLeeFuncPtr_glPointParameterfvSGIS=GLee_Lazy_glPointParameterfvSGIS;\r
+#endif\r
+#endif \r
+\r
+/* GL_SGIX_instruments */\r
+\r
+#ifdef __GLEE_GL_SGIX_instruments\r
+#ifndef GLEE_C_DEFINED_glGetInstrumentsSGIX\r
+#define GLEE_C_DEFINED_glGetInstrumentsSGIX\r
+  GLint __stdcall GLee_Lazy_glGetInstrumentsSGIX(void)  {if (GLeeInit()) return glGetInstrumentsSGIX(); return (GLint)0;}\r
+  GLEEPFNGLGETINSTRUMENTSSGIXPROC GLeeFuncPtr_glGetInstrumentsSGIX=GLee_Lazy_glGetInstrumentsSGIX;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glInstrumentsBufferSGIX\r
+#define GLEE_C_DEFINED_glInstrumentsBufferSGIX\r
+  void __stdcall GLee_Lazy_glInstrumentsBufferSGIX(GLsizei size, GLint * buffer)  {if (GLeeInit()) glInstrumentsBufferSGIX(size, buffer);}\r
+  GLEEPFNGLINSTRUMENTSBUFFERSGIXPROC GLeeFuncPtr_glInstrumentsBufferSGIX=GLee_Lazy_glInstrumentsBufferSGIX;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glPollInstrumentsSGIX\r
+#define GLEE_C_DEFINED_glPollInstrumentsSGIX\r
+  GLint __stdcall GLee_Lazy_glPollInstrumentsSGIX(GLint * marker_p)  {if (GLeeInit()) return glPollInstrumentsSGIX(marker_p); return (GLint)0;}\r
+  GLEEPFNGLPOLLINSTRUMENTSSGIXPROC GLeeFuncPtr_glPollInstrumentsSGIX=GLee_Lazy_glPollInstrumentsSGIX;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glReadInstrumentsSGIX\r
+#define GLEE_C_DEFINED_glReadInstrumentsSGIX\r
+  void __stdcall GLee_Lazy_glReadInstrumentsSGIX(GLint marker)  {if (GLeeInit()) glReadInstrumentsSGIX(marker);}\r
+  GLEEPFNGLREADINSTRUMENTSSGIXPROC GLeeFuncPtr_glReadInstrumentsSGIX=GLee_Lazy_glReadInstrumentsSGIX;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glStartInstrumentsSGIX\r
+#define GLEE_C_DEFINED_glStartInstrumentsSGIX\r
+  void __stdcall GLee_Lazy_glStartInstrumentsSGIX(void)  {if (GLeeInit()) glStartInstrumentsSGIX();}\r
+  GLEEPFNGLSTARTINSTRUMENTSSGIXPROC GLeeFuncPtr_glStartInstrumentsSGIX=GLee_Lazy_glStartInstrumentsSGIX;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glStopInstrumentsSGIX\r
+#define GLEE_C_DEFINED_glStopInstrumentsSGIX\r
+  void __stdcall GLee_Lazy_glStopInstrumentsSGIX(GLint marker)  {if (GLeeInit()) glStopInstrumentsSGIX(marker);}\r
+  GLEEPFNGLSTOPINSTRUMENTSSGIXPROC GLeeFuncPtr_glStopInstrumentsSGIX=GLee_Lazy_glStopInstrumentsSGIX;\r
+#endif\r
+#endif \r
+\r
+/* GL_SGIX_texture_scale_bias */\r
+\r
+#ifdef __GLEE_GL_SGIX_texture_scale_bias\r
+#endif \r
+\r
+/* GL_SGIX_framezoom */\r
+\r
+#ifdef __GLEE_GL_SGIX_framezoom\r
+#ifndef GLEE_C_DEFINED_glFrameZoomSGIX\r
+#define GLEE_C_DEFINED_glFrameZoomSGIX\r
+  void __stdcall GLee_Lazy_glFrameZoomSGIX(GLint factor)  {if (GLeeInit()) glFrameZoomSGIX(factor);}\r
+  GLEEPFNGLFRAMEZOOMSGIXPROC GLeeFuncPtr_glFrameZoomSGIX=GLee_Lazy_glFrameZoomSGIX;\r
+#endif\r
+#endif \r
+\r
+/* GL_SGIX_tag_sample_buffer */\r
+\r
+#ifdef __GLEE_GL_SGIX_tag_sample_buffer\r
+#ifndef GLEE_C_DEFINED_glTagSampleBufferSGIX\r
+#define GLEE_C_DEFINED_glTagSampleBufferSGIX\r
+  void __stdcall GLee_Lazy_glTagSampleBufferSGIX(void)  {if (GLeeInit()) glTagSampleBufferSGIX();}\r
+  GLEEPFNGLTAGSAMPLEBUFFERSGIXPROC GLeeFuncPtr_glTagSampleBufferSGIX=GLee_Lazy_glTagSampleBufferSGIX;\r
+#endif\r
+#endif \r
+\r
+/* GL_FfdMaskSGIX */\r
+\r
+#ifdef __GLEE_GL_FfdMaskSGIX\r
+#endif \r
+\r
+/* GL_SGIX_polynomial_ffd */\r
+\r
+#ifdef __GLEE_GL_SGIX_polynomial_ffd\r
+#ifndef GLEE_C_DEFINED_glDeformationMap3dSGIX\r
+#define GLEE_C_DEFINED_glDeformationMap3dSGIX\r
+  void __stdcall GLee_Lazy_glDeformationMap3dSGIX(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, GLdouble w1, GLdouble w2, GLint wstride, GLint worder, const GLdouble * points)  {if (GLeeInit()) glDeformationMap3dSGIX(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, w1, w2, wstride, worder, points);}\r
+  GLEEPFNGLDEFORMATIONMAP3DSGIXPROC GLeeFuncPtr_glDeformationMap3dSGIX=GLee_Lazy_glDeformationMap3dSGIX;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glDeformationMap3fSGIX\r
+#define GLEE_C_DEFINED_glDeformationMap3fSGIX\r
+  void __stdcall GLee_Lazy_glDeformationMap3fSGIX(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, GLfloat w1, GLfloat w2, GLint wstride, GLint worder, const GLfloat * points)  {if (GLeeInit()) glDeformationMap3fSGIX(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, w1, w2, wstride, worder, points);}\r
+  GLEEPFNGLDEFORMATIONMAP3FSGIXPROC GLeeFuncPtr_glDeformationMap3fSGIX=GLee_Lazy_glDeformationMap3fSGIX;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glDeformSGIX\r
+#define GLEE_C_DEFINED_glDeformSGIX\r
+  void __stdcall GLee_Lazy_glDeformSGIX(GLbitfield mask)  {if (GLeeInit()) glDeformSGIX(mask);}\r
+  GLEEPFNGLDEFORMSGIXPROC GLeeFuncPtr_glDeformSGIX=GLee_Lazy_glDeformSGIX;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glLoadIdentityDeformationMapSGIX\r
+#define GLEE_C_DEFINED_glLoadIdentityDeformationMapSGIX\r
+  void __stdcall GLee_Lazy_glLoadIdentityDeformationMapSGIX(GLbitfield mask)  {if (GLeeInit()) glLoadIdentityDeformationMapSGIX(mask);}\r
+  GLEEPFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC GLeeFuncPtr_glLoadIdentityDeformationMapSGIX=GLee_Lazy_glLoadIdentityDeformationMapSGIX;\r
+#endif\r
+#endif \r
+\r
+/* GL_SGIX_reference_plane */\r
+\r
+#ifdef __GLEE_GL_SGIX_reference_plane\r
+#ifndef GLEE_C_DEFINED_glReferencePlaneSGIX\r
+#define GLEE_C_DEFINED_glReferencePlaneSGIX\r
+  void __stdcall GLee_Lazy_glReferencePlaneSGIX(const GLdouble * equation)  {if (GLeeInit()) glReferencePlaneSGIX(equation);}\r
+  GLEEPFNGLREFERENCEPLANESGIXPROC GLeeFuncPtr_glReferencePlaneSGIX=GLee_Lazy_glReferencePlaneSGIX;\r
+#endif\r
+#endif \r
+\r
+/* GL_SGIX_flush_raster */\r
+\r
+#ifdef __GLEE_GL_SGIX_flush_raster\r
+#ifndef GLEE_C_DEFINED_glFlushRasterSGIX\r
+#define GLEE_C_DEFINED_glFlushRasterSGIX\r
+  void __stdcall GLee_Lazy_glFlushRasterSGIX(void)  {if (GLeeInit()) glFlushRasterSGIX();}\r
+  GLEEPFNGLFLUSHRASTERSGIXPROC GLeeFuncPtr_glFlushRasterSGIX=GLee_Lazy_glFlushRasterSGIX;\r
+#endif\r
+#endif \r
+\r
+/* GL_SGIX_depth_texture */\r
+\r
+#ifdef __GLEE_GL_SGIX_depth_texture\r
+#endif \r
+\r
+/* GL_SGIS_fog_function */\r
+\r
+#ifdef __GLEE_GL_SGIS_fog_function\r
+#ifndef GLEE_C_DEFINED_glFogFuncSGIS\r
+#define GLEE_C_DEFINED_glFogFuncSGIS\r
+  void __stdcall GLee_Lazy_glFogFuncSGIS(GLsizei n, const GLfloat * points)  {if (GLeeInit()) glFogFuncSGIS(n, points);}\r
+  GLEEPFNGLFOGFUNCSGISPROC GLeeFuncPtr_glFogFuncSGIS=GLee_Lazy_glFogFuncSGIS;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetFogFuncSGIS\r
+#define GLEE_C_DEFINED_glGetFogFuncSGIS\r
+  void __stdcall GLee_Lazy_glGetFogFuncSGIS(GLfloat * points)  {if (GLeeInit()) glGetFogFuncSGIS(points);}\r
+  GLEEPFNGLGETFOGFUNCSGISPROC GLeeFuncPtr_glGetFogFuncSGIS=GLee_Lazy_glGetFogFuncSGIS;\r
+#endif\r
+#endif \r
+\r
+/* GL_SGIX_fog_offset */\r
+\r
+#ifdef __GLEE_GL_SGIX_fog_offset\r
+#endif \r
+\r
+/* GL_HP_image_transform */\r
+\r
+#ifdef __GLEE_GL_HP_image_transform\r
+#ifndef GLEE_C_DEFINED_glImageTransformParameteriHP\r
+#define GLEE_C_DEFINED_glImageTransformParameteriHP\r
+  void __stdcall GLee_Lazy_glImageTransformParameteriHP(GLenum target, GLenum pname, GLint param)  {if (GLeeInit()) glImageTransformParameteriHP(target, pname, param);}\r
+  GLEEPFNGLIMAGETRANSFORMPARAMETERIHPPROC GLeeFuncPtr_glImageTransformParameteriHP=GLee_Lazy_glImageTransformParameteriHP;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glImageTransformParameterfHP\r
+#define GLEE_C_DEFINED_glImageTransformParameterfHP\r
+  void __stdcall GLee_Lazy_glImageTransformParameterfHP(GLenum target, GLenum pname, GLfloat param)  {if (GLeeInit()) glImageTransformParameterfHP(target, pname, param);}\r
+  GLEEPFNGLIMAGETRANSFORMPARAMETERFHPPROC GLeeFuncPtr_glImageTransformParameterfHP=GLee_Lazy_glImageTransformParameterfHP;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glImageTransformParameterivHP\r
+#define GLEE_C_DEFINED_glImageTransformParameterivHP\r
+  void __stdcall GLee_Lazy_glImageTransformParameterivHP(GLenum target, GLenum pname, const GLint * params)  {if (GLeeInit()) glImageTransformParameterivHP(target, pname, params);}\r
+  GLEEPFNGLIMAGETRANSFORMPARAMETERIVHPPROC GLeeFuncPtr_glImageTransformParameterivHP=GLee_Lazy_glImageTransformParameterivHP;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glImageTransformParameterfvHP\r
+#define GLEE_C_DEFINED_glImageTransformParameterfvHP\r
+  void __stdcall GLee_Lazy_glImageTransformParameterfvHP(GLenum target, GLenum pname, const GLfloat * params)  {if (GLeeInit()) glImageTransformParameterfvHP(target, pname, params);}\r
+  GLEEPFNGLIMAGETRANSFORMPARAMETERFVHPPROC GLeeFuncPtr_glImageTransformParameterfvHP=GLee_Lazy_glImageTransformParameterfvHP;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetImageTransformParameterivHP\r
+#define GLEE_C_DEFINED_glGetImageTransformParameterivHP\r
+  void __stdcall GLee_Lazy_glGetImageTransformParameterivHP(GLenum target, GLenum pname, GLint * params)  {if (GLeeInit()) glGetImageTransformParameterivHP(target, pname, params);}\r
+  GLEEPFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC GLeeFuncPtr_glGetImageTransformParameterivHP=GLee_Lazy_glGetImageTransformParameterivHP;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetImageTransformParameterfvHP\r
+#define GLEE_C_DEFINED_glGetImageTransformParameterfvHP\r
+  void __stdcall GLee_Lazy_glGetImageTransformParameterfvHP(GLenum target, GLenum pname, GLfloat * params)  {if (GLeeInit()) glGetImageTransformParameterfvHP(target, pname, params);}\r
+  GLEEPFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC GLeeFuncPtr_glGetImageTransformParameterfvHP=GLee_Lazy_glGetImageTransformParameterfvHP;\r
+#endif\r
+#endif \r
+\r
+/* GL_HP_convolution_border_modes */\r
+\r
+#ifdef __GLEE_GL_HP_convolution_border_modes\r
+#endif \r
+\r
+/* GL_INGR_palette_buffer */\r
+\r
+#ifdef __GLEE_GL_INGR_palette_buffer\r
+#endif \r
+\r
+/* GL_SGIX_texture_add_env */\r
+\r
+#ifdef __GLEE_GL_SGIX_texture_add_env\r
+#endif \r
+\r
+/* GL_EXT_color_subtable */\r
+\r
+#ifdef __GLEE_GL_EXT_color_subtable\r
+#ifndef GLEE_C_DEFINED_glColorSubTableEXT\r
+#define GLEE_C_DEFINED_glColorSubTableEXT\r
+  void __stdcall GLee_Lazy_glColorSubTableEXT(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid * data)  {if (GLeeInit()) glColorSubTableEXT(target, start, count, format, type, data);}\r
+  GLEEPFNGLCOLORSUBTABLEEXTPROC GLeeFuncPtr_glColorSubTableEXT=GLee_Lazy_glColorSubTableEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glCopyColorSubTableEXT\r
+#define GLEE_C_DEFINED_glCopyColorSubTableEXT\r
+  void __stdcall GLee_Lazy_glCopyColorSubTableEXT(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width)  {if (GLeeInit()) glCopyColorSubTableEXT(target, start, x, y, width);}\r
+  GLEEPFNGLCOPYCOLORSUBTABLEEXTPROC GLeeFuncPtr_glCopyColorSubTableEXT=GLee_Lazy_glCopyColorSubTableEXT;\r
+#endif\r
+#endif \r
+\r
+/* GL_PGI_vertex_hints */\r
+\r
+#ifdef __GLEE_GL_PGI_vertex_hints\r
+#endif \r
+\r
+/* GL_PGI_misc_hints */\r
+\r
+#ifdef __GLEE_GL_PGI_misc_hints\r
+#ifndef GLEE_C_DEFINED_glHintPGI\r
+#define GLEE_C_DEFINED_glHintPGI\r
+  void __stdcall GLee_Lazy_glHintPGI(GLenum target, GLint mode)  {if (GLeeInit()) glHintPGI(target, mode);}\r
+  GLEEPFNGLHINTPGIPROC GLeeFuncPtr_glHintPGI=GLee_Lazy_glHintPGI;\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_paletted_texture */\r
+\r
+#ifdef __GLEE_GL_EXT_paletted_texture\r
+#ifndef GLEE_C_DEFINED_glColorTableEXT\r
+#define GLEE_C_DEFINED_glColorTableEXT\r
+  void __stdcall GLee_Lazy_glColorTableEXT(GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const GLvoid * table)  {if (GLeeInit()) glColorTableEXT(target, internalFormat, width, format, type, table);}\r
+  GLEEPFNGLCOLORTABLEEXTPROC GLeeFuncPtr_glColorTableEXT=GLee_Lazy_glColorTableEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetColorTableEXT\r
+#define GLEE_C_DEFINED_glGetColorTableEXT\r
+  void __stdcall GLee_Lazy_glGetColorTableEXT(GLenum target, GLenum format, GLenum type, GLvoid * data)  {if (GLeeInit()) glGetColorTableEXT(target, format, type, data);}\r
+  GLEEPFNGLGETCOLORTABLEEXTPROC GLeeFuncPtr_glGetColorTableEXT=GLee_Lazy_glGetColorTableEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetColorTableParameterivEXT\r
+#define GLEE_C_DEFINED_glGetColorTableParameterivEXT\r
+  void __stdcall GLee_Lazy_glGetColorTableParameterivEXT(GLenum target, GLenum pname, GLint * params)  {if (GLeeInit()) glGetColorTableParameterivEXT(target, pname, params);}\r
+  GLEEPFNGLGETCOLORTABLEPARAMETERIVEXTPROC GLeeFuncPtr_glGetColorTableParameterivEXT=GLee_Lazy_glGetColorTableParameterivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetColorTableParameterfvEXT\r
+#define GLEE_C_DEFINED_glGetColorTableParameterfvEXT\r
+  void __stdcall GLee_Lazy_glGetColorTableParameterfvEXT(GLenum target, GLenum pname, GLfloat * params)  {if (GLeeInit()) glGetColorTableParameterfvEXT(target, pname, params);}\r
+  GLEEPFNGLGETCOLORTABLEPARAMETERFVEXTPROC GLeeFuncPtr_glGetColorTableParameterfvEXT=GLee_Lazy_glGetColorTableParameterfvEXT;\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_clip_volume_hint */\r
+\r
+#ifdef __GLEE_GL_EXT_clip_volume_hint\r
+#endif \r
+\r
+/* GL_SGIX_list_priority */\r
+\r
+#ifdef __GLEE_GL_SGIX_list_priority\r
+#ifndef GLEE_C_DEFINED_glGetListParameterfvSGIX\r
+#define GLEE_C_DEFINED_glGetListParameterfvSGIX\r
+  void __stdcall GLee_Lazy_glGetListParameterfvSGIX(GLuint list, GLenum pname, GLfloat * params)  {if (GLeeInit()) glGetListParameterfvSGIX(list, pname, params);}\r
+  GLEEPFNGLGETLISTPARAMETERFVSGIXPROC GLeeFuncPtr_glGetListParameterfvSGIX=GLee_Lazy_glGetListParameterfvSGIX;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetListParameterivSGIX\r
+#define GLEE_C_DEFINED_glGetListParameterivSGIX\r
+  void __stdcall GLee_Lazy_glGetListParameterivSGIX(GLuint list, GLenum pname, GLint * params)  {if (GLeeInit()) glGetListParameterivSGIX(list, pname, params);}\r
+  GLEEPFNGLGETLISTPARAMETERIVSGIXPROC GLeeFuncPtr_glGetListParameterivSGIX=GLee_Lazy_glGetListParameterivSGIX;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glListParameterfSGIX\r
+#define GLEE_C_DEFINED_glListParameterfSGIX\r
+  void __stdcall GLee_Lazy_glListParameterfSGIX(GLuint list, GLenum pname, GLfloat param)  {if (GLeeInit()) glListParameterfSGIX(list, pname, param);}\r
+  GLEEPFNGLLISTPARAMETERFSGIXPROC GLeeFuncPtr_glListParameterfSGIX=GLee_Lazy_glListParameterfSGIX;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glListParameterfvSGIX\r
+#define GLEE_C_DEFINED_glListParameterfvSGIX\r
+  void __stdcall GLee_Lazy_glListParameterfvSGIX(GLuint list, GLenum pname, const GLfloat * params)  {if (GLeeInit()) glListParameterfvSGIX(list, pname, params);}\r
+  GLEEPFNGLLISTPARAMETERFVSGIXPROC GLeeFuncPtr_glListParameterfvSGIX=GLee_Lazy_glListParameterfvSGIX;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glListParameteriSGIX\r
+#define GLEE_C_DEFINED_glListParameteriSGIX\r
+  void __stdcall GLee_Lazy_glListParameteriSGIX(GLuint list, GLenum pname, GLint param)  {if (GLeeInit()) glListParameteriSGIX(list, pname, param);}\r
+  GLEEPFNGLLISTPARAMETERISGIXPROC GLeeFuncPtr_glListParameteriSGIX=GLee_Lazy_glListParameteriSGIX;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glListParameterivSGIX\r
+#define GLEE_C_DEFINED_glListParameterivSGIX\r
+  void __stdcall GLee_Lazy_glListParameterivSGIX(GLuint list, GLenum pname, const GLint * params)  {if (GLeeInit()) glListParameterivSGIX(list, pname, params);}\r
+  GLEEPFNGLLISTPARAMETERIVSGIXPROC GLeeFuncPtr_glListParameterivSGIX=GLee_Lazy_glListParameterivSGIX;\r
+#endif\r
+#endif \r
+\r
+/* GL_SGIX_ir_instrument1 */\r
+\r
+#ifdef __GLEE_GL_SGIX_ir_instrument1\r
+#endif \r
+\r
+/* GL_SGIX_calligraphic_fragment */\r
+\r
+#ifdef __GLEE_GL_SGIX_calligraphic_fragment\r
+#endif \r
+\r
+/* GL_SGIX_texture_lod_bias */\r
+\r
+#ifdef __GLEE_GL_SGIX_texture_lod_bias\r
+#endif \r
+\r
+/* GL_SGIX_shadow_ambient */\r
+\r
+#ifdef __GLEE_GL_SGIX_shadow_ambient\r
+#endif \r
+\r
+/* GL_EXT_index_texture */\r
+\r
+#ifdef __GLEE_GL_EXT_index_texture\r
+#endif \r
+\r
+/* GL_EXT_index_material */\r
+\r
+#ifdef __GLEE_GL_EXT_index_material\r
+#ifndef GLEE_C_DEFINED_glIndexMaterialEXT\r
+#define GLEE_C_DEFINED_glIndexMaterialEXT\r
+  void __stdcall GLee_Lazy_glIndexMaterialEXT(GLenum face, GLenum mode)  {if (GLeeInit()) glIndexMaterialEXT(face, mode);}\r
+  GLEEPFNGLINDEXMATERIALEXTPROC GLeeFuncPtr_glIndexMaterialEXT=GLee_Lazy_glIndexMaterialEXT;\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_index_func */\r
+\r
+#ifdef __GLEE_GL_EXT_index_func\r
+#ifndef GLEE_C_DEFINED_glIndexFuncEXT\r
+#define GLEE_C_DEFINED_glIndexFuncEXT\r
+  void __stdcall GLee_Lazy_glIndexFuncEXT(GLenum func, GLclampf ref)  {if (GLeeInit()) glIndexFuncEXT(func, ref);}\r
+  GLEEPFNGLINDEXFUNCEXTPROC GLeeFuncPtr_glIndexFuncEXT=GLee_Lazy_glIndexFuncEXT;\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_index_array_formats */\r
+\r
+#ifdef __GLEE_GL_EXT_index_array_formats\r
+#endif \r
+\r
+/* GL_EXT_compiled_vertex_array */\r
+\r
+#ifdef __GLEE_GL_EXT_compiled_vertex_array\r
+#ifndef GLEE_C_DEFINED_glLockArraysEXT\r
+#define GLEE_C_DEFINED_glLockArraysEXT\r
+  void __stdcall GLee_Lazy_glLockArraysEXT(GLint first, GLsizei count)  {if (GLeeInit()) glLockArraysEXT(first, count);}\r
+  GLEEPFNGLLOCKARRAYSEXTPROC GLeeFuncPtr_glLockArraysEXT=GLee_Lazy_glLockArraysEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUnlockArraysEXT\r
+#define GLEE_C_DEFINED_glUnlockArraysEXT\r
+  void __stdcall GLee_Lazy_glUnlockArraysEXT(void)  {if (GLeeInit()) glUnlockArraysEXT();}\r
+  GLEEPFNGLUNLOCKARRAYSEXTPROC GLeeFuncPtr_glUnlockArraysEXT=GLee_Lazy_glUnlockArraysEXT;\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_cull_vertex */\r
+\r
+#ifdef __GLEE_GL_EXT_cull_vertex\r
+#ifndef GLEE_C_DEFINED_glCullParameterdvEXT\r
+#define GLEE_C_DEFINED_glCullParameterdvEXT\r
+  void __stdcall GLee_Lazy_glCullParameterdvEXT(GLenum pname, GLdouble * params)  {if (GLeeInit()) glCullParameterdvEXT(pname, params);}\r
+  GLEEPFNGLCULLPARAMETERDVEXTPROC GLeeFuncPtr_glCullParameterdvEXT=GLee_Lazy_glCullParameterdvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glCullParameterfvEXT\r
+#define GLEE_C_DEFINED_glCullParameterfvEXT\r
+  void __stdcall GLee_Lazy_glCullParameterfvEXT(GLenum pname, GLfloat * params)  {if (GLeeInit()) glCullParameterfvEXT(pname, params);}\r
+  GLEEPFNGLCULLPARAMETERFVEXTPROC GLeeFuncPtr_glCullParameterfvEXT=GLee_Lazy_glCullParameterfvEXT;\r
+#endif\r
+#endif \r
+\r
+/* GL_SGIX_ycrcb */\r
+\r
+#ifdef __GLEE_GL_SGIX_ycrcb\r
+#endif \r
+\r
+/* GL_SGIX_fragment_lighting */\r
+\r
+#ifdef __GLEE_GL_SGIX_fragment_lighting\r
+#ifndef GLEE_C_DEFINED_glFragmentColorMaterialSGIX\r
+#define GLEE_C_DEFINED_glFragmentColorMaterialSGIX\r
+  void __stdcall GLee_Lazy_glFragmentColorMaterialSGIX(GLenum face, GLenum mode)  {if (GLeeInit()) glFragmentColorMaterialSGIX(face, mode);}\r
+  GLEEPFNGLFRAGMENTCOLORMATERIALSGIXPROC GLeeFuncPtr_glFragmentColorMaterialSGIX=GLee_Lazy_glFragmentColorMaterialSGIX;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFragmentLightfSGIX\r
+#define GLEE_C_DEFINED_glFragmentLightfSGIX\r
+  void __stdcall GLee_Lazy_glFragmentLightfSGIX(GLenum light, GLenum pname, GLfloat param)  {if (GLeeInit()) glFragmentLightfSGIX(light, pname, param);}\r
+  GLEEPFNGLFRAGMENTLIGHTFSGIXPROC GLeeFuncPtr_glFragmentLightfSGIX=GLee_Lazy_glFragmentLightfSGIX;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFragmentLightfvSGIX\r
+#define GLEE_C_DEFINED_glFragmentLightfvSGIX\r
+  void __stdcall GLee_Lazy_glFragmentLightfvSGIX(GLenum light, GLenum pname, const GLfloat * params)  {if (GLeeInit()) glFragmentLightfvSGIX(light, pname, params);}\r
+  GLEEPFNGLFRAGMENTLIGHTFVSGIXPROC GLeeFuncPtr_glFragmentLightfvSGIX=GLee_Lazy_glFragmentLightfvSGIX;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFragmentLightiSGIX\r
+#define GLEE_C_DEFINED_glFragmentLightiSGIX\r
+  void __stdcall GLee_Lazy_glFragmentLightiSGIX(GLenum light, GLenum pname, GLint param)  {if (GLeeInit()) glFragmentLightiSGIX(light, pname, param);}\r
+  GLEEPFNGLFRAGMENTLIGHTISGIXPROC GLeeFuncPtr_glFragmentLightiSGIX=GLee_Lazy_glFragmentLightiSGIX;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFragmentLightivSGIX\r
+#define GLEE_C_DEFINED_glFragmentLightivSGIX\r
+  void __stdcall GLee_Lazy_glFragmentLightivSGIX(GLenum light, GLenum pname, const GLint * params)  {if (GLeeInit()) glFragmentLightivSGIX(light, pname, params);}\r
+  GLEEPFNGLFRAGMENTLIGHTIVSGIXPROC GLeeFuncPtr_glFragmentLightivSGIX=GLee_Lazy_glFragmentLightivSGIX;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFragmentLightModelfSGIX\r
+#define GLEE_C_DEFINED_glFragmentLightModelfSGIX\r
+  void __stdcall GLee_Lazy_glFragmentLightModelfSGIX(GLenum pname, GLfloat param)  {if (GLeeInit()) glFragmentLightModelfSGIX(pname, param);}\r
+  GLEEPFNGLFRAGMENTLIGHTMODELFSGIXPROC GLeeFuncPtr_glFragmentLightModelfSGIX=GLee_Lazy_glFragmentLightModelfSGIX;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFragmentLightModelfvSGIX\r
+#define GLEE_C_DEFINED_glFragmentLightModelfvSGIX\r
+  void __stdcall GLee_Lazy_glFragmentLightModelfvSGIX(GLenum pname, const GLfloat * params)  {if (GLeeInit()) glFragmentLightModelfvSGIX(pname, params);}\r
+  GLEEPFNGLFRAGMENTLIGHTMODELFVSGIXPROC GLeeFuncPtr_glFragmentLightModelfvSGIX=GLee_Lazy_glFragmentLightModelfvSGIX;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFragmentLightModeliSGIX\r
+#define GLEE_C_DEFINED_glFragmentLightModeliSGIX\r
+  void __stdcall GLee_Lazy_glFragmentLightModeliSGIX(GLenum pname, GLint param)  {if (GLeeInit()) glFragmentLightModeliSGIX(pname, param);}\r
+  GLEEPFNGLFRAGMENTLIGHTMODELISGIXPROC GLeeFuncPtr_glFragmentLightModeliSGIX=GLee_Lazy_glFragmentLightModeliSGIX;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFragmentLightModelivSGIX\r
+#define GLEE_C_DEFINED_glFragmentLightModelivSGIX\r
+  void __stdcall GLee_Lazy_glFragmentLightModelivSGIX(GLenum pname, const GLint * params)  {if (GLeeInit()) glFragmentLightModelivSGIX(pname, params);}\r
+  GLEEPFNGLFRAGMENTLIGHTMODELIVSGIXPROC GLeeFuncPtr_glFragmentLightModelivSGIX=GLee_Lazy_glFragmentLightModelivSGIX;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFragmentMaterialfSGIX\r
+#define GLEE_C_DEFINED_glFragmentMaterialfSGIX\r
+  void __stdcall GLee_Lazy_glFragmentMaterialfSGIX(GLenum face, GLenum pname, GLfloat param)  {if (GLeeInit()) glFragmentMaterialfSGIX(face, pname, param);}\r
+  GLEEPFNGLFRAGMENTMATERIALFSGIXPROC GLeeFuncPtr_glFragmentMaterialfSGIX=GLee_Lazy_glFragmentMaterialfSGIX;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFragmentMaterialfvSGIX\r
+#define GLEE_C_DEFINED_glFragmentMaterialfvSGIX\r
+  void __stdcall GLee_Lazy_glFragmentMaterialfvSGIX(GLenum face, GLenum pname, const GLfloat * params)  {if (GLeeInit()) glFragmentMaterialfvSGIX(face, pname, params);}\r
+  GLEEPFNGLFRAGMENTMATERIALFVSGIXPROC GLeeFuncPtr_glFragmentMaterialfvSGIX=GLee_Lazy_glFragmentMaterialfvSGIX;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFragmentMaterialiSGIX\r
+#define GLEE_C_DEFINED_glFragmentMaterialiSGIX\r
+  void __stdcall GLee_Lazy_glFragmentMaterialiSGIX(GLenum face, GLenum pname, GLint param)  {if (GLeeInit()) glFragmentMaterialiSGIX(face, pname, param);}\r
+  GLEEPFNGLFRAGMENTMATERIALISGIXPROC GLeeFuncPtr_glFragmentMaterialiSGIX=GLee_Lazy_glFragmentMaterialiSGIX;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFragmentMaterialivSGIX\r
+#define GLEE_C_DEFINED_glFragmentMaterialivSGIX\r
+  void __stdcall GLee_Lazy_glFragmentMaterialivSGIX(GLenum face, GLenum pname, const GLint * params)  {if (GLeeInit()) glFragmentMaterialivSGIX(face, pname, params);}\r
+  GLEEPFNGLFRAGMENTMATERIALIVSGIXPROC GLeeFuncPtr_glFragmentMaterialivSGIX=GLee_Lazy_glFragmentMaterialivSGIX;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetFragmentLightfvSGIX\r
+#define GLEE_C_DEFINED_glGetFragmentLightfvSGIX\r
+  void __stdcall GLee_Lazy_glGetFragmentLightfvSGIX(GLenum light, GLenum pname, GLfloat * params)  {if (GLeeInit()) glGetFragmentLightfvSGIX(light, pname, params);}\r
+  GLEEPFNGLGETFRAGMENTLIGHTFVSGIXPROC GLeeFuncPtr_glGetFragmentLightfvSGIX=GLee_Lazy_glGetFragmentLightfvSGIX;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetFragmentLightivSGIX\r
+#define GLEE_C_DEFINED_glGetFragmentLightivSGIX\r
+  void __stdcall GLee_Lazy_glGetFragmentLightivSGIX(GLenum light, GLenum pname, GLint * params)  {if (GLeeInit()) glGetFragmentLightivSGIX(light, pname, params);}\r
+  GLEEPFNGLGETFRAGMENTLIGHTIVSGIXPROC GLeeFuncPtr_glGetFragmentLightivSGIX=GLee_Lazy_glGetFragmentLightivSGIX;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetFragmentMaterialfvSGIX\r
+#define GLEE_C_DEFINED_glGetFragmentMaterialfvSGIX\r
+  void __stdcall GLee_Lazy_glGetFragmentMaterialfvSGIX(GLenum face, GLenum pname, GLfloat * params)  {if (GLeeInit()) glGetFragmentMaterialfvSGIX(face, pname, params);}\r
+  GLEEPFNGLGETFRAGMENTMATERIALFVSGIXPROC GLeeFuncPtr_glGetFragmentMaterialfvSGIX=GLee_Lazy_glGetFragmentMaterialfvSGIX;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetFragmentMaterialivSGIX\r
+#define GLEE_C_DEFINED_glGetFragmentMaterialivSGIX\r
+  void __stdcall GLee_Lazy_glGetFragmentMaterialivSGIX(GLenum face, GLenum pname, GLint * params)  {if (GLeeInit()) glGetFragmentMaterialivSGIX(face, pname, params);}\r
+  GLEEPFNGLGETFRAGMENTMATERIALIVSGIXPROC GLeeFuncPtr_glGetFragmentMaterialivSGIX=GLee_Lazy_glGetFragmentMaterialivSGIX;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glLightEnviSGIX\r
+#define GLEE_C_DEFINED_glLightEnviSGIX\r
+  void __stdcall GLee_Lazy_glLightEnviSGIX(GLenum pname, GLint param)  {if (GLeeInit()) glLightEnviSGIX(pname, param);}\r
+  GLEEPFNGLLIGHTENVISGIXPROC GLeeFuncPtr_glLightEnviSGIX=GLee_Lazy_glLightEnviSGIX;\r
+#endif\r
+#endif \r
+\r
+/* GL_IBM_rasterpos_clip */\r
+\r
+#ifdef __GLEE_GL_IBM_rasterpos_clip\r
+#endif \r
+\r
+/* GL_HP_texture_lighting */\r
+\r
+#ifdef __GLEE_GL_HP_texture_lighting\r
+#endif \r
+\r
+/* GL_EXT_draw_range_elements */\r
+\r
+#ifdef __GLEE_GL_EXT_draw_range_elements\r
+#ifndef GLEE_C_DEFINED_glDrawRangeElementsEXT\r
+#define GLEE_C_DEFINED_glDrawRangeElementsEXT\r
+  void __stdcall GLee_Lazy_glDrawRangeElementsEXT(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid * indices)  {if (GLeeInit()) glDrawRangeElementsEXT(mode, start, end, count, type, indices);}\r
+  GLEEPFNGLDRAWRANGEELEMENTSEXTPROC GLeeFuncPtr_glDrawRangeElementsEXT=GLee_Lazy_glDrawRangeElementsEXT;\r
+#endif\r
+#endif \r
+\r
+/* GL_WIN_phong_shading */\r
+\r
+#ifdef __GLEE_GL_WIN_phong_shading\r
+#endif \r
+\r
+/* GL_WIN_specular_fog */\r
+\r
+#ifdef __GLEE_GL_WIN_specular_fog\r
+#endif \r
+\r
+/* GL_EXT_light_texture */\r
+\r
+#ifdef __GLEE_GL_EXT_light_texture\r
+#ifndef GLEE_C_DEFINED_glApplyTextureEXT\r
+#define GLEE_C_DEFINED_glApplyTextureEXT\r
+  void __stdcall GLee_Lazy_glApplyTextureEXT(GLenum mode)  {if (GLeeInit()) glApplyTextureEXT(mode);}\r
+  GLEEPFNGLAPPLYTEXTUREEXTPROC GLeeFuncPtr_glApplyTextureEXT=GLee_Lazy_glApplyTextureEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTextureLightEXT\r
+#define GLEE_C_DEFINED_glTextureLightEXT\r
+  void __stdcall GLee_Lazy_glTextureLightEXT(GLenum pname)  {if (GLeeInit()) glTextureLightEXT(pname);}\r
+  GLEEPFNGLTEXTURELIGHTEXTPROC GLeeFuncPtr_glTextureLightEXT=GLee_Lazy_glTextureLightEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTextureMaterialEXT\r
+#define GLEE_C_DEFINED_glTextureMaterialEXT\r
+  void __stdcall GLee_Lazy_glTextureMaterialEXT(GLenum face, GLenum mode)  {if (GLeeInit()) glTextureMaterialEXT(face, mode);}\r
+  GLEEPFNGLTEXTUREMATERIALEXTPROC GLeeFuncPtr_glTextureMaterialEXT=GLee_Lazy_glTextureMaterialEXT;\r
+#endif\r
+#endif \r
+\r
+/* GL_SGIX_blend_alpha_minmax */\r
+\r
+#ifdef __GLEE_GL_SGIX_blend_alpha_minmax\r
+#endif \r
+\r
+/* GL_SGIX_impact_pixel_texture */\r
+\r
+#ifdef __GLEE_GL_SGIX_impact_pixel_texture\r
+#endif \r
+\r
+/* GL_EXT_bgra */\r
+\r
+#ifdef __GLEE_GL_EXT_bgra\r
+#endif \r
+\r
+/* GL_SGIX_async */\r
+\r
+#ifdef __GLEE_GL_SGIX_async\r
+#ifndef GLEE_C_DEFINED_glAsyncMarkerSGIX\r
+#define GLEE_C_DEFINED_glAsyncMarkerSGIX\r
+  void __stdcall GLee_Lazy_glAsyncMarkerSGIX(GLuint marker)  {if (GLeeInit()) glAsyncMarkerSGIX(marker);}\r
+  GLEEPFNGLASYNCMARKERSGIXPROC GLeeFuncPtr_glAsyncMarkerSGIX=GLee_Lazy_glAsyncMarkerSGIX;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFinishAsyncSGIX\r
+#define GLEE_C_DEFINED_glFinishAsyncSGIX\r
+  GLint __stdcall GLee_Lazy_glFinishAsyncSGIX(GLuint * markerp)  {if (GLeeInit()) return glFinishAsyncSGIX(markerp); return (GLint)0;}\r
+  GLEEPFNGLFINISHASYNCSGIXPROC GLeeFuncPtr_glFinishAsyncSGIX=GLee_Lazy_glFinishAsyncSGIX;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glPollAsyncSGIX\r
+#define GLEE_C_DEFINED_glPollAsyncSGIX\r
+  GLint __stdcall GLee_Lazy_glPollAsyncSGIX(GLuint * markerp)  {if (GLeeInit()) return glPollAsyncSGIX(markerp); return (GLint)0;}\r
+  GLEEPFNGLPOLLASYNCSGIXPROC GLeeFuncPtr_glPollAsyncSGIX=GLee_Lazy_glPollAsyncSGIX;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGenAsyncMarkersSGIX\r
+#define GLEE_C_DEFINED_glGenAsyncMarkersSGIX\r
+  GLuint __stdcall GLee_Lazy_glGenAsyncMarkersSGIX(GLsizei range)  {if (GLeeInit()) return glGenAsyncMarkersSGIX(range); return (GLuint)0;}\r
+  GLEEPFNGLGENASYNCMARKERSSGIXPROC GLeeFuncPtr_glGenAsyncMarkersSGIX=GLee_Lazy_glGenAsyncMarkersSGIX;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glDeleteAsyncMarkersSGIX\r
+#define GLEE_C_DEFINED_glDeleteAsyncMarkersSGIX\r
+  void __stdcall GLee_Lazy_glDeleteAsyncMarkersSGIX(GLuint marker, GLsizei range)  {if (GLeeInit()) glDeleteAsyncMarkersSGIX(marker, range);}\r
+  GLEEPFNGLDELETEASYNCMARKERSSGIXPROC GLeeFuncPtr_glDeleteAsyncMarkersSGIX=GLee_Lazy_glDeleteAsyncMarkersSGIX;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glIsAsyncMarkerSGIX\r
+#define GLEE_C_DEFINED_glIsAsyncMarkerSGIX\r
+  GLboolean __stdcall GLee_Lazy_glIsAsyncMarkerSGIX(GLuint marker)  {if (GLeeInit()) return glIsAsyncMarkerSGIX(marker); return (GLboolean)0;}\r
+  GLEEPFNGLISASYNCMARKERSGIXPROC GLeeFuncPtr_glIsAsyncMarkerSGIX=GLee_Lazy_glIsAsyncMarkerSGIX;\r
+#endif\r
+#endif \r
+\r
+/* GL_SGIX_async_pixel */\r
+\r
+#ifdef __GLEE_GL_SGIX_async_pixel\r
+#endif \r
+\r
+/* GL_SGIX_async_histogram */\r
+\r
+#ifdef __GLEE_GL_SGIX_async_histogram\r
+#endif \r
+\r
+/* GL_INTEL_texture_scissor */\r
+\r
+#ifdef __GLEE_GL_INTEL_texture_scissor\r
+#endif \r
+\r
+/* GL_INTEL_parallel_arrays */\r
+\r
+#ifdef __GLEE_GL_INTEL_parallel_arrays\r
+#ifndef GLEE_C_DEFINED_glVertexPointervINTEL\r
+#define GLEE_C_DEFINED_glVertexPointervINTEL\r
+  void __stdcall GLee_Lazy_glVertexPointervINTEL(GLint size, GLenum type, const GLvoid* * pointer)  {if (GLeeInit()) glVertexPointervINTEL(size, type, pointer);}\r
+  GLEEPFNGLVERTEXPOINTERVINTELPROC GLeeFuncPtr_glVertexPointervINTEL=GLee_Lazy_glVertexPointervINTEL;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glNormalPointervINTEL\r
+#define GLEE_C_DEFINED_glNormalPointervINTEL\r
+  void __stdcall GLee_Lazy_glNormalPointervINTEL(GLenum type, const GLvoid* * pointer)  {if (GLeeInit()) glNormalPointervINTEL(type, pointer);}\r
+  GLEEPFNGLNORMALPOINTERVINTELPROC GLeeFuncPtr_glNormalPointervINTEL=GLee_Lazy_glNormalPointervINTEL;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glColorPointervINTEL\r
+#define GLEE_C_DEFINED_glColorPointervINTEL\r
+  void __stdcall GLee_Lazy_glColorPointervINTEL(GLint size, GLenum type, const GLvoid* * pointer)  {if (GLeeInit()) glColorPointervINTEL(size, type, pointer);}\r
+  GLEEPFNGLCOLORPOINTERVINTELPROC GLeeFuncPtr_glColorPointervINTEL=GLee_Lazy_glColorPointervINTEL;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTexCoordPointervINTEL\r
+#define GLEE_C_DEFINED_glTexCoordPointervINTEL\r
+  void __stdcall GLee_Lazy_glTexCoordPointervINTEL(GLint size, GLenum type, const GLvoid* * pointer)  {if (GLeeInit()) glTexCoordPointervINTEL(size, type, pointer);}\r
+  GLEEPFNGLTEXCOORDPOINTERVINTELPROC GLeeFuncPtr_glTexCoordPointervINTEL=GLee_Lazy_glTexCoordPointervINTEL;\r
+#endif\r
+#endif \r
+\r
+/* GL_HP_occlusion_test */\r
+\r
+#ifdef __GLEE_GL_HP_occlusion_test\r
+#endif \r
+\r
+/* GL_EXT_pixel_transform */\r
+\r
+#ifdef __GLEE_GL_EXT_pixel_transform\r
+#ifndef GLEE_C_DEFINED_glPixelTransformParameteriEXT\r
+#define GLEE_C_DEFINED_glPixelTransformParameteriEXT\r
+  void __stdcall GLee_Lazy_glPixelTransformParameteriEXT(GLenum target, GLenum pname, GLint param)  {if (GLeeInit()) glPixelTransformParameteriEXT(target, pname, param);}\r
+  GLEEPFNGLPIXELTRANSFORMPARAMETERIEXTPROC GLeeFuncPtr_glPixelTransformParameteriEXT=GLee_Lazy_glPixelTransformParameteriEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glPixelTransformParameterfEXT\r
+#define GLEE_C_DEFINED_glPixelTransformParameterfEXT\r
+  void __stdcall GLee_Lazy_glPixelTransformParameterfEXT(GLenum target, GLenum pname, GLfloat param)  {if (GLeeInit()) glPixelTransformParameterfEXT(target, pname, param);}\r
+  GLEEPFNGLPIXELTRANSFORMPARAMETERFEXTPROC GLeeFuncPtr_glPixelTransformParameterfEXT=GLee_Lazy_glPixelTransformParameterfEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glPixelTransformParameterivEXT\r
+#define GLEE_C_DEFINED_glPixelTransformParameterivEXT\r
+  void __stdcall GLee_Lazy_glPixelTransformParameterivEXT(GLenum target, GLenum pname, const GLint * params)  {if (GLeeInit()) glPixelTransformParameterivEXT(target, pname, params);}\r
+  GLEEPFNGLPIXELTRANSFORMPARAMETERIVEXTPROC GLeeFuncPtr_glPixelTransformParameterivEXT=GLee_Lazy_glPixelTransformParameterivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glPixelTransformParameterfvEXT\r
+#define GLEE_C_DEFINED_glPixelTransformParameterfvEXT\r
+  void __stdcall GLee_Lazy_glPixelTransformParameterfvEXT(GLenum target, GLenum pname, const GLfloat * params)  {if (GLeeInit()) glPixelTransformParameterfvEXT(target, pname, params);}\r
+  GLEEPFNGLPIXELTRANSFORMPARAMETERFVEXTPROC GLeeFuncPtr_glPixelTransformParameterfvEXT=GLee_Lazy_glPixelTransformParameterfvEXT;\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_pixel_transform_color_table */\r
+\r
+#ifdef __GLEE_GL_EXT_pixel_transform_color_table\r
+#endif \r
+\r
+/* GL_EXT_shared_texture_palette */\r
+\r
+#ifdef __GLEE_GL_EXT_shared_texture_palette\r
+#endif \r
+\r
+/* GL_EXT_separate_specular_color */\r
+\r
+#ifdef __GLEE_GL_EXT_separate_specular_color\r
+#endif \r
+\r
+/* GL_EXT_secondary_color */\r
+\r
+#ifdef __GLEE_GL_EXT_secondary_color\r
+#ifndef GLEE_C_DEFINED_glSecondaryColor3bEXT\r
+#define GLEE_C_DEFINED_glSecondaryColor3bEXT\r
+  void __stdcall GLee_Lazy_glSecondaryColor3bEXT(GLbyte red, GLbyte green, GLbyte blue)  {if (GLeeInit()) glSecondaryColor3bEXT(red, green, blue);}\r
+  GLEEPFNGLSECONDARYCOLOR3BEXTPROC GLeeFuncPtr_glSecondaryColor3bEXT=GLee_Lazy_glSecondaryColor3bEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glSecondaryColor3bvEXT\r
+#define GLEE_C_DEFINED_glSecondaryColor3bvEXT\r
+  void __stdcall GLee_Lazy_glSecondaryColor3bvEXT(const GLbyte * v)  {if (GLeeInit()) glSecondaryColor3bvEXT(v);}\r
+  GLEEPFNGLSECONDARYCOLOR3BVEXTPROC GLeeFuncPtr_glSecondaryColor3bvEXT=GLee_Lazy_glSecondaryColor3bvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glSecondaryColor3dEXT\r
+#define GLEE_C_DEFINED_glSecondaryColor3dEXT\r
+  void __stdcall GLee_Lazy_glSecondaryColor3dEXT(GLdouble red, GLdouble green, GLdouble blue)  {if (GLeeInit()) glSecondaryColor3dEXT(red, green, blue);}\r
+  GLEEPFNGLSECONDARYCOLOR3DEXTPROC GLeeFuncPtr_glSecondaryColor3dEXT=GLee_Lazy_glSecondaryColor3dEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glSecondaryColor3dvEXT\r
+#define GLEE_C_DEFINED_glSecondaryColor3dvEXT\r
+  void __stdcall GLee_Lazy_glSecondaryColor3dvEXT(const GLdouble * v)  {if (GLeeInit()) glSecondaryColor3dvEXT(v);}\r
+  GLEEPFNGLSECONDARYCOLOR3DVEXTPROC GLeeFuncPtr_glSecondaryColor3dvEXT=GLee_Lazy_glSecondaryColor3dvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glSecondaryColor3fEXT\r
+#define GLEE_C_DEFINED_glSecondaryColor3fEXT\r
+  void __stdcall GLee_Lazy_glSecondaryColor3fEXT(GLfloat red, GLfloat green, GLfloat blue)  {if (GLeeInit()) glSecondaryColor3fEXT(red, green, blue);}\r
+  GLEEPFNGLSECONDARYCOLOR3FEXTPROC GLeeFuncPtr_glSecondaryColor3fEXT=GLee_Lazy_glSecondaryColor3fEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glSecondaryColor3fvEXT\r
+#define GLEE_C_DEFINED_glSecondaryColor3fvEXT\r
+  void __stdcall GLee_Lazy_glSecondaryColor3fvEXT(const GLfloat * v)  {if (GLeeInit()) glSecondaryColor3fvEXT(v);}\r
+  GLEEPFNGLSECONDARYCOLOR3FVEXTPROC GLeeFuncPtr_glSecondaryColor3fvEXT=GLee_Lazy_glSecondaryColor3fvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glSecondaryColor3iEXT\r
+#define GLEE_C_DEFINED_glSecondaryColor3iEXT\r
+  void __stdcall GLee_Lazy_glSecondaryColor3iEXT(GLint red, GLint green, GLint blue)  {if (GLeeInit()) glSecondaryColor3iEXT(red, green, blue);}\r
+  GLEEPFNGLSECONDARYCOLOR3IEXTPROC GLeeFuncPtr_glSecondaryColor3iEXT=GLee_Lazy_glSecondaryColor3iEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glSecondaryColor3ivEXT\r
+#define GLEE_C_DEFINED_glSecondaryColor3ivEXT\r
+  void __stdcall GLee_Lazy_glSecondaryColor3ivEXT(const GLint * v)  {if (GLeeInit()) glSecondaryColor3ivEXT(v);}\r
+  GLEEPFNGLSECONDARYCOLOR3IVEXTPROC GLeeFuncPtr_glSecondaryColor3ivEXT=GLee_Lazy_glSecondaryColor3ivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glSecondaryColor3sEXT\r
+#define GLEE_C_DEFINED_glSecondaryColor3sEXT\r
+  void __stdcall GLee_Lazy_glSecondaryColor3sEXT(GLshort red, GLshort green, GLshort blue)  {if (GLeeInit()) glSecondaryColor3sEXT(red, green, blue);}\r
+  GLEEPFNGLSECONDARYCOLOR3SEXTPROC GLeeFuncPtr_glSecondaryColor3sEXT=GLee_Lazy_glSecondaryColor3sEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glSecondaryColor3svEXT\r
+#define GLEE_C_DEFINED_glSecondaryColor3svEXT\r
+  void __stdcall GLee_Lazy_glSecondaryColor3svEXT(const GLshort * v)  {if (GLeeInit()) glSecondaryColor3svEXT(v);}\r
+  GLEEPFNGLSECONDARYCOLOR3SVEXTPROC GLeeFuncPtr_glSecondaryColor3svEXT=GLee_Lazy_glSecondaryColor3svEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glSecondaryColor3ubEXT\r
+#define GLEE_C_DEFINED_glSecondaryColor3ubEXT\r
+  void __stdcall GLee_Lazy_glSecondaryColor3ubEXT(GLubyte red, GLubyte green, GLubyte blue)  {if (GLeeInit()) glSecondaryColor3ubEXT(red, green, blue);}\r
+  GLEEPFNGLSECONDARYCOLOR3UBEXTPROC GLeeFuncPtr_glSecondaryColor3ubEXT=GLee_Lazy_glSecondaryColor3ubEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glSecondaryColor3ubvEXT\r
+#define GLEE_C_DEFINED_glSecondaryColor3ubvEXT\r
+  void __stdcall GLee_Lazy_glSecondaryColor3ubvEXT(const GLubyte * v)  {if (GLeeInit()) glSecondaryColor3ubvEXT(v);}\r
+  GLEEPFNGLSECONDARYCOLOR3UBVEXTPROC GLeeFuncPtr_glSecondaryColor3ubvEXT=GLee_Lazy_glSecondaryColor3ubvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glSecondaryColor3uiEXT\r
+#define GLEE_C_DEFINED_glSecondaryColor3uiEXT\r
+  void __stdcall GLee_Lazy_glSecondaryColor3uiEXT(GLuint red, GLuint green, GLuint blue)  {if (GLeeInit()) glSecondaryColor3uiEXT(red, green, blue);}\r
+  GLEEPFNGLSECONDARYCOLOR3UIEXTPROC GLeeFuncPtr_glSecondaryColor3uiEXT=GLee_Lazy_glSecondaryColor3uiEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glSecondaryColor3uivEXT\r
+#define GLEE_C_DEFINED_glSecondaryColor3uivEXT\r
+  void __stdcall GLee_Lazy_glSecondaryColor3uivEXT(const GLuint * v)  {if (GLeeInit()) glSecondaryColor3uivEXT(v);}\r
+  GLEEPFNGLSECONDARYCOLOR3UIVEXTPROC GLeeFuncPtr_glSecondaryColor3uivEXT=GLee_Lazy_glSecondaryColor3uivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glSecondaryColor3usEXT\r
+#define GLEE_C_DEFINED_glSecondaryColor3usEXT\r
+  void __stdcall GLee_Lazy_glSecondaryColor3usEXT(GLushort red, GLushort green, GLushort blue)  {if (GLeeInit()) glSecondaryColor3usEXT(red, green, blue);}\r
+  GLEEPFNGLSECONDARYCOLOR3USEXTPROC GLeeFuncPtr_glSecondaryColor3usEXT=GLee_Lazy_glSecondaryColor3usEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glSecondaryColor3usvEXT\r
+#define GLEE_C_DEFINED_glSecondaryColor3usvEXT\r
+  void __stdcall GLee_Lazy_glSecondaryColor3usvEXT(const GLushort * v)  {if (GLeeInit()) glSecondaryColor3usvEXT(v);}\r
+  GLEEPFNGLSECONDARYCOLOR3USVEXTPROC GLeeFuncPtr_glSecondaryColor3usvEXT=GLee_Lazy_glSecondaryColor3usvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glSecondaryColorPointerEXT\r
+#define GLEE_C_DEFINED_glSecondaryColorPointerEXT\r
+  void __stdcall GLee_Lazy_glSecondaryColorPointerEXT(GLint size, GLenum type, GLsizei stride, const GLvoid * pointer)  {if (GLeeInit()) glSecondaryColorPointerEXT(size, type, stride, pointer);}\r
+  GLEEPFNGLSECONDARYCOLORPOINTEREXTPROC GLeeFuncPtr_glSecondaryColorPointerEXT=GLee_Lazy_glSecondaryColorPointerEXT;\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_texture_perturb_normal */\r
+\r
+#ifdef __GLEE_GL_EXT_texture_perturb_normal\r
+#ifndef GLEE_C_DEFINED_glTextureNormalEXT\r
+#define GLEE_C_DEFINED_glTextureNormalEXT\r
+  void __stdcall GLee_Lazy_glTextureNormalEXT(GLenum mode)  {if (GLeeInit()) glTextureNormalEXT(mode);}\r
+  GLEEPFNGLTEXTURENORMALEXTPROC GLeeFuncPtr_glTextureNormalEXT=GLee_Lazy_glTextureNormalEXT;\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_multi_draw_arrays */\r
+\r
+#ifdef __GLEE_GL_EXT_multi_draw_arrays\r
+#ifndef GLEE_C_DEFINED_glMultiDrawArraysEXT\r
+#define GLEE_C_DEFINED_glMultiDrawArraysEXT\r
+  void __stdcall GLee_Lazy_glMultiDrawArraysEXT(GLenum mode, GLint * first, GLsizei * count, GLsizei primcount)  {if (GLeeInit()) glMultiDrawArraysEXT(mode, first, count, primcount);}\r
+  GLEEPFNGLMULTIDRAWARRAYSEXTPROC GLeeFuncPtr_glMultiDrawArraysEXT=GLee_Lazy_glMultiDrawArraysEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiDrawElementsEXT\r
+#define GLEE_C_DEFINED_glMultiDrawElementsEXT\r
+  void __stdcall GLee_Lazy_glMultiDrawElementsEXT(GLenum mode, const GLsizei * count, GLenum type, const GLvoid* * indices, GLsizei primcount)  {if (GLeeInit()) glMultiDrawElementsEXT(mode, count, type, indices, primcount);}\r
+  GLEEPFNGLMULTIDRAWELEMENTSEXTPROC GLeeFuncPtr_glMultiDrawElementsEXT=GLee_Lazy_glMultiDrawElementsEXT;\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_fog_coord */\r
+\r
+#ifdef __GLEE_GL_EXT_fog_coord\r
+#ifndef GLEE_C_DEFINED_glFogCoordfEXT\r
+#define GLEE_C_DEFINED_glFogCoordfEXT\r
+  void __stdcall GLee_Lazy_glFogCoordfEXT(GLfloat coord)  {if (GLeeInit()) glFogCoordfEXT(coord);}\r
+  GLEEPFNGLFOGCOORDFEXTPROC GLeeFuncPtr_glFogCoordfEXT=GLee_Lazy_glFogCoordfEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFogCoordfvEXT\r
+#define GLEE_C_DEFINED_glFogCoordfvEXT\r
+  void __stdcall GLee_Lazy_glFogCoordfvEXT(const GLfloat * coord)  {if (GLeeInit()) glFogCoordfvEXT(coord);}\r
+  GLEEPFNGLFOGCOORDFVEXTPROC GLeeFuncPtr_glFogCoordfvEXT=GLee_Lazy_glFogCoordfvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFogCoorddEXT\r
+#define GLEE_C_DEFINED_glFogCoorddEXT\r
+  void __stdcall GLee_Lazy_glFogCoorddEXT(GLdouble coord)  {if (GLeeInit()) glFogCoorddEXT(coord);}\r
+  GLEEPFNGLFOGCOORDDEXTPROC GLeeFuncPtr_glFogCoorddEXT=GLee_Lazy_glFogCoorddEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFogCoorddvEXT\r
+#define GLEE_C_DEFINED_glFogCoorddvEXT\r
+  void __stdcall GLee_Lazy_glFogCoorddvEXT(const GLdouble * coord)  {if (GLeeInit()) glFogCoorddvEXT(coord);}\r
+  GLEEPFNGLFOGCOORDDVEXTPROC GLeeFuncPtr_glFogCoorddvEXT=GLee_Lazy_glFogCoorddvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFogCoordPointerEXT\r
+#define GLEE_C_DEFINED_glFogCoordPointerEXT\r
+  void __stdcall GLee_Lazy_glFogCoordPointerEXT(GLenum type, GLsizei stride, const GLvoid * pointer)  {if (GLeeInit()) glFogCoordPointerEXT(type, stride, pointer);}\r
+  GLEEPFNGLFOGCOORDPOINTEREXTPROC GLeeFuncPtr_glFogCoordPointerEXT=GLee_Lazy_glFogCoordPointerEXT;\r
+#endif\r
+#endif \r
+\r
+/* GL_REND_screen_coordinates */\r
+\r
+#ifdef __GLEE_GL_REND_screen_coordinates\r
+#endif \r
+\r
+/* GL_EXT_coordinate_frame */\r
+\r
+#ifdef __GLEE_GL_EXT_coordinate_frame\r
+#ifndef GLEE_C_DEFINED_glTangent3bEXT\r
+#define GLEE_C_DEFINED_glTangent3bEXT\r
+  void __stdcall GLee_Lazy_glTangent3bEXT(GLbyte tx, GLbyte ty, GLbyte tz)  {if (GLeeInit()) glTangent3bEXT(tx, ty, tz);}\r
+  GLEEPFNGLTANGENT3BEXTPROC GLeeFuncPtr_glTangent3bEXT=GLee_Lazy_glTangent3bEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTangent3bvEXT\r
+#define GLEE_C_DEFINED_glTangent3bvEXT\r
+  void __stdcall GLee_Lazy_glTangent3bvEXT(const GLbyte * v)  {if (GLeeInit()) glTangent3bvEXT(v);}\r
+  GLEEPFNGLTANGENT3BVEXTPROC GLeeFuncPtr_glTangent3bvEXT=GLee_Lazy_glTangent3bvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTangent3dEXT\r
+#define GLEE_C_DEFINED_glTangent3dEXT\r
+  void __stdcall GLee_Lazy_glTangent3dEXT(GLdouble tx, GLdouble ty, GLdouble tz)  {if (GLeeInit()) glTangent3dEXT(tx, ty, tz);}\r
+  GLEEPFNGLTANGENT3DEXTPROC GLeeFuncPtr_glTangent3dEXT=GLee_Lazy_glTangent3dEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTangent3dvEXT\r
+#define GLEE_C_DEFINED_glTangent3dvEXT\r
+  void __stdcall GLee_Lazy_glTangent3dvEXT(const GLdouble * v)  {if (GLeeInit()) glTangent3dvEXT(v);}\r
+  GLEEPFNGLTANGENT3DVEXTPROC GLeeFuncPtr_glTangent3dvEXT=GLee_Lazy_glTangent3dvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTangent3fEXT\r
+#define GLEE_C_DEFINED_glTangent3fEXT\r
+  void __stdcall GLee_Lazy_glTangent3fEXT(GLfloat tx, GLfloat ty, GLfloat tz)  {if (GLeeInit()) glTangent3fEXT(tx, ty, tz);}\r
+  GLEEPFNGLTANGENT3FEXTPROC GLeeFuncPtr_glTangent3fEXT=GLee_Lazy_glTangent3fEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTangent3fvEXT\r
+#define GLEE_C_DEFINED_glTangent3fvEXT\r
+  void __stdcall GLee_Lazy_glTangent3fvEXT(const GLfloat * v)  {if (GLeeInit()) glTangent3fvEXT(v);}\r
+  GLEEPFNGLTANGENT3FVEXTPROC GLeeFuncPtr_glTangent3fvEXT=GLee_Lazy_glTangent3fvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTangent3iEXT\r
+#define GLEE_C_DEFINED_glTangent3iEXT\r
+  void __stdcall GLee_Lazy_glTangent3iEXT(GLint tx, GLint ty, GLint tz)  {if (GLeeInit()) glTangent3iEXT(tx, ty, tz);}\r
+  GLEEPFNGLTANGENT3IEXTPROC GLeeFuncPtr_glTangent3iEXT=GLee_Lazy_glTangent3iEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTangent3ivEXT\r
+#define GLEE_C_DEFINED_glTangent3ivEXT\r
+  void __stdcall GLee_Lazy_glTangent3ivEXT(const GLint * v)  {if (GLeeInit()) glTangent3ivEXT(v);}\r
+  GLEEPFNGLTANGENT3IVEXTPROC GLeeFuncPtr_glTangent3ivEXT=GLee_Lazy_glTangent3ivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTangent3sEXT\r
+#define GLEE_C_DEFINED_glTangent3sEXT\r
+  void __stdcall GLee_Lazy_glTangent3sEXT(GLshort tx, GLshort ty, GLshort tz)  {if (GLeeInit()) glTangent3sEXT(tx, ty, tz);}\r
+  GLEEPFNGLTANGENT3SEXTPROC GLeeFuncPtr_glTangent3sEXT=GLee_Lazy_glTangent3sEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTangent3svEXT\r
+#define GLEE_C_DEFINED_glTangent3svEXT\r
+  void __stdcall GLee_Lazy_glTangent3svEXT(const GLshort * v)  {if (GLeeInit()) glTangent3svEXT(v);}\r
+  GLEEPFNGLTANGENT3SVEXTPROC GLeeFuncPtr_glTangent3svEXT=GLee_Lazy_glTangent3svEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glBinormal3bEXT\r
+#define GLEE_C_DEFINED_glBinormal3bEXT\r
+  void __stdcall GLee_Lazy_glBinormal3bEXT(GLbyte bx, GLbyte by, GLbyte bz)  {if (GLeeInit()) glBinormal3bEXT(bx, by, bz);}\r
+  GLEEPFNGLBINORMAL3BEXTPROC GLeeFuncPtr_glBinormal3bEXT=GLee_Lazy_glBinormal3bEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glBinormal3bvEXT\r
+#define GLEE_C_DEFINED_glBinormal3bvEXT\r
+  void __stdcall GLee_Lazy_glBinormal3bvEXT(const GLbyte * v)  {if (GLeeInit()) glBinormal3bvEXT(v);}\r
+  GLEEPFNGLBINORMAL3BVEXTPROC GLeeFuncPtr_glBinormal3bvEXT=GLee_Lazy_glBinormal3bvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glBinormal3dEXT\r
+#define GLEE_C_DEFINED_glBinormal3dEXT\r
+  void __stdcall GLee_Lazy_glBinormal3dEXT(GLdouble bx, GLdouble by, GLdouble bz)  {if (GLeeInit()) glBinormal3dEXT(bx, by, bz);}\r
+  GLEEPFNGLBINORMAL3DEXTPROC GLeeFuncPtr_glBinormal3dEXT=GLee_Lazy_glBinormal3dEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glBinormal3dvEXT\r
+#define GLEE_C_DEFINED_glBinormal3dvEXT\r
+  void __stdcall GLee_Lazy_glBinormal3dvEXT(const GLdouble * v)  {if (GLeeInit()) glBinormal3dvEXT(v);}\r
+  GLEEPFNGLBINORMAL3DVEXTPROC GLeeFuncPtr_glBinormal3dvEXT=GLee_Lazy_glBinormal3dvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glBinormal3fEXT\r
+#define GLEE_C_DEFINED_glBinormal3fEXT\r
+  void __stdcall GLee_Lazy_glBinormal3fEXT(GLfloat bx, GLfloat by, GLfloat bz)  {if (GLeeInit()) glBinormal3fEXT(bx, by, bz);}\r
+  GLEEPFNGLBINORMAL3FEXTPROC GLeeFuncPtr_glBinormal3fEXT=GLee_Lazy_glBinormal3fEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glBinormal3fvEXT\r
+#define GLEE_C_DEFINED_glBinormal3fvEXT\r
+  void __stdcall GLee_Lazy_glBinormal3fvEXT(const GLfloat * v)  {if (GLeeInit()) glBinormal3fvEXT(v);}\r
+  GLEEPFNGLBINORMAL3FVEXTPROC GLeeFuncPtr_glBinormal3fvEXT=GLee_Lazy_glBinormal3fvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glBinormal3iEXT\r
+#define GLEE_C_DEFINED_glBinormal3iEXT\r
+  void __stdcall GLee_Lazy_glBinormal3iEXT(GLint bx, GLint by, GLint bz)  {if (GLeeInit()) glBinormal3iEXT(bx, by, bz);}\r
+  GLEEPFNGLBINORMAL3IEXTPROC GLeeFuncPtr_glBinormal3iEXT=GLee_Lazy_glBinormal3iEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glBinormal3ivEXT\r
+#define GLEE_C_DEFINED_glBinormal3ivEXT\r
+  void __stdcall GLee_Lazy_glBinormal3ivEXT(const GLint * v)  {if (GLeeInit()) glBinormal3ivEXT(v);}\r
+  GLEEPFNGLBINORMAL3IVEXTPROC GLeeFuncPtr_glBinormal3ivEXT=GLee_Lazy_glBinormal3ivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glBinormal3sEXT\r
+#define GLEE_C_DEFINED_glBinormal3sEXT\r
+  void __stdcall GLee_Lazy_glBinormal3sEXT(GLshort bx, GLshort by, GLshort bz)  {if (GLeeInit()) glBinormal3sEXT(bx, by, bz);}\r
+  GLEEPFNGLBINORMAL3SEXTPROC GLeeFuncPtr_glBinormal3sEXT=GLee_Lazy_glBinormal3sEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glBinormal3svEXT\r
+#define GLEE_C_DEFINED_glBinormal3svEXT\r
+  void __stdcall GLee_Lazy_glBinormal3svEXT(const GLshort * v)  {if (GLeeInit()) glBinormal3svEXT(v);}\r
+  GLEEPFNGLBINORMAL3SVEXTPROC GLeeFuncPtr_glBinormal3svEXT=GLee_Lazy_glBinormal3svEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTangentPointerEXT\r
+#define GLEE_C_DEFINED_glTangentPointerEXT\r
+  void __stdcall GLee_Lazy_glTangentPointerEXT(GLenum type, GLsizei stride, const GLvoid * pointer)  {if (GLeeInit()) glTangentPointerEXT(type, stride, pointer);}\r
+  GLEEPFNGLTANGENTPOINTEREXTPROC GLeeFuncPtr_glTangentPointerEXT=GLee_Lazy_glTangentPointerEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glBinormalPointerEXT\r
+#define GLEE_C_DEFINED_glBinormalPointerEXT\r
+  void __stdcall GLee_Lazy_glBinormalPointerEXT(GLenum type, GLsizei stride, const GLvoid * pointer)  {if (GLeeInit()) glBinormalPointerEXT(type, stride, pointer);}\r
+  GLEEPFNGLBINORMALPOINTEREXTPROC GLeeFuncPtr_glBinormalPointerEXT=GLee_Lazy_glBinormalPointerEXT;\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_texture_env_combine */\r
+\r
+#ifdef __GLEE_GL_EXT_texture_env_combine\r
+#endif \r
+\r
+/* GL_APPLE_specular_vector */\r
+\r
+#ifdef __GLEE_GL_APPLE_specular_vector\r
+#endif \r
+\r
+/* GL_APPLE_transform_hint */\r
+\r
+#ifdef __GLEE_GL_APPLE_transform_hint\r
+#endif \r
+\r
+/* GL_SGIX_fog_scale */\r
+\r
+#ifdef __GLEE_GL_SGIX_fog_scale\r
+#endif \r
+\r
+/* GL_SUNX_constant_data */\r
+\r
+#ifdef __GLEE_GL_SUNX_constant_data\r
+#ifndef GLEE_C_DEFINED_glFinishTextureSUNX\r
+#define GLEE_C_DEFINED_glFinishTextureSUNX\r
+  void __stdcall GLee_Lazy_glFinishTextureSUNX(void)  {if (GLeeInit()) glFinishTextureSUNX();}\r
+  GLEEPFNGLFINISHTEXTURESUNXPROC GLeeFuncPtr_glFinishTextureSUNX=GLee_Lazy_glFinishTextureSUNX;\r
+#endif\r
+#endif \r
+\r
+/* GL_SUN_global_alpha */\r
+\r
+#ifdef __GLEE_GL_SUN_global_alpha\r
+#ifndef GLEE_C_DEFINED_glGlobalAlphaFactorbSUN\r
+#define GLEE_C_DEFINED_glGlobalAlphaFactorbSUN\r
+  void __stdcall GLee_Lazy_glGlobalAlphaFactorbSUN(GLbyte factor)  {if (GLeeInit()) glGlobalAlphaFactorbSUN(factor);}\r
+  GLEEPFNGLGLOBALALPHAFACTORBSUNPROC GLeeFuncPtr_glGlobalAlphaFactorbSUN=GLee_Lazy_glGlobalAlphaFactorbSUN;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGlobalAlphaFactorsSUN\r
+#define GLEE_C_DEFINED_glGlobalAlphaFactorsSUN\r
+  void __stdcall GLee_Lazy_glGlobalAlphaFactorsSUN(GLshort factor)  {if (GLeeInit()) glGlobalAlphaFactorsSUN(factor);}\r
+  GLEEPFNGLGLOBALALPHAFACTORSSUNPROC GLeeFuncPtr_glGlobalAlphaFactorsSUN=GLee_Lazy_glGlobalAlphaFactorsSUN;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGlobalAlphaFactoriSUN\r
+#define GLEE_C_DEFINED_glGlobalAlphaFactoriSUN\r
+  void __stdcall GLee_Lazy_glGlobalAlphaFactoriSUN(GLint factor)  {if (GLeeInit()) glGlobalAlphaFactoriSUN(factor);}\r
+  GLEEPFNGLGLOBALALPHAFACTORISUNPROC GLeeFuncPtr_glGlobalAlphaFactoriSUN=GLee_Lazy_glGlobalAlphaFactoriSUN;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGlobalAlphaFactorfSUN\r
+#define GLEE_C_DEFINED_glGlobalAlphaFactorfSUN\r
+  void __stdcall GLee_Lazy_glGlobalAlphaFactorfSUN(GLfloat factor)  {if (GLeeInit()) glGlobalAlphaFactorfSUN(factor);}\r
+  GLEEPFNGLGLOBALALPHAFACTORFSUNPROC GLeeFuncPtr_glGlobalAlphaFactorfSUN=GLee_Lazy_glGlobalAlphaFactorfSUN;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGlobalAlphaFactordSUN\r
+#define GLEE_C_DEFINED_glGlobalAlphaFactordSUN\r
+  void __stdcall GLee_Lazy_glGlobalAlphaFactordSUN(GLdouble factor)  {if (GLeeInit()) glGlobalAlphaFactordSUN(factor);}\r
+  GLEEPFNGLGLOBALALPHAFACTORDSUNPROC GLeeFuncPtr_glGlobalAlphaFactordSUN=GLee_Lazy_glGlobalAlphaFactordSUN;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGlobalAlphaFactorubSUN\r
+#define GLEE_C_DEFINED_glGlobalAlphaFactorubSUN\r
+  void __stdcall GLee_Lazy_glGlobalAlphaFactorubSUN(GLubyte factor)  {if (GLeeInit()) glGlobalAlphaFactorubSUN(factor);}\r
+  GLEEPFNGLGLOBALALPHAFACTORUBSUNPROC GLeeFuncPtr_glGlobalAlphaFactorubSUN=GLee_Lazy_glGlobalAlphaFactorubSUN;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGlobalAlphaFactorusSUN\r
+#define GLEE_C_DEFINED_glGlobalAlphaFactorusSUN\r
+  void __stdcall GLee_Lazy_glGlobalAlphaFactorusSUN(GLushort factor)  {if (GLeeInit()) glGlobalAlphaFactorusSUN(factor);}\r
+  GLEEPFNGLGLOBALALPHAFACTORUSSUNPROC GLeeFuncPtr_glGlobalAlphaFactorusSUN=GLee_Lazy_glGlobalAlphaFactorusSUN;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGlobalAlphaFactoruiSUN\r
+#define GLEE_C_DEFINED_glGlobalAlphaFactoruiSUN\r
+  void __stdcall GLee_Lazy_glGlobalAlphaFactoruiSUN(GLuint factor)  {if (GLeeInit()) glGlobalAlphaFactoruiSUN(factor);}\r
+  GLEEPFNGLGLOBALALPHAFACTORUISUNPROC GLeeFuncPtr_glGlobalAlphaFactoruiSUN=GLee_Lazy_glGlobalAlphaFactoruiSUN;\r
+#endif\r
+#endif \r
+\r
+/* GL_SUN_triangle_list */\r
+\r
+#ifdef __GLEE_GL_SUN_triangle_list\r
+#ifndef GLEE_C_DEFINED_glReplacementCodeuiSUN\r
+#define GLEE_C_DEFINED_glReplacementCodeuiSUN\r
+  void __stdcall GLee_Lazy_glReplacementCodeuiSUN(GLuint code)  {if (GLeeInit()) glReplacementCodeuiSUN(code);}\r
+  GLEEPFNGLREPLACEMENTCODEUISUNPROC GLeeFuncPtr_glReplacementCodeuiSUN=GLee_Lazy_glReplacementCodeuiSUN;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glReplacementCodeusSUN\r
+#define GLEE_C_DEFINED_glReplacementCodeusSUN\r
+  void __stdcall GLee_Lazy_glReplacementCodeusSUN(GLushort code)  {if (GLeeInit()) glReplacementCodeusSUN(code);}\r
+  GLEEPFNGLREPLACEMENTCODEUSSUNPROC GLeeFuncPtr_glReplacementCodeusSUN=GLee_Lazy_glReplacementCodeusSUN;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glReplacementCodeubSUN\r
+#define GLEE_C_DEFINED_glReplacementCodeubSUN\r
+  void __stdcall GLee_Lazy_glReplacementCodeubSUN(GLubyte code)  {if (GLeeInit()) glReplacementCodeubSUN(code);}\r
+  GLEEPFNGLREPLACEMENTCODEUBSUNPROC GLeeFuncPtr_glReplacementCodeubSUN=GLee_Lazy_glReplacementCodeubSUN;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glReplacementCodeuivSUN\r
+#define GLEE_C_DEFINED_glReplacementCodeuivSUN\r
+  void __stdcall GLee_Lazy_glReplacementCodeuivSUN(const GLuint * code)  {if (GLeeInit()) glReplacementCodeuivSUN(code);}\r
+  GLEEPFNGLREPLACEMENTCODEUIVSUNPROC GLeeFuncPtr_glReplacementCodeuivSUN=GLee_Lazy_glReplacementCodeuivSUN;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glReplacementCodeusvSUN\r
+#define GLEE_C_DEFINED_glReplacementCodeusvSUN\r
+  void __stdcall GLee_Lazy_glReplacementCodeusvSUN(const GLushort * code)  {if (GLeeInit()) glReplacementCodeusvSUN(code);}\r
+  GLEEPFNGLREPLACEMENTCODEUSVSUNPROC GLeeFuncPtr_glReplacementCodeusvSUN=GLee_Lazy_glReplacementCodeusvSUN;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glReplacementCodeubvSUN\r
+#define GLEE_C_DEFINED_glReplacementCodeubvSUN\r
+  void __stdcall GLee_Lazy_glReplacementCodeubvSUN(const GLubyte * code)  {if (GLeeInit()) glReplacementCodeubvSUN(code);}\r
+  GLEEPFNGLREPLACEMENTCODEUBVSUNPROC GLeeFuncPtr_glReplacementCodeubvSUN=GLee_Lazy_glReplacementCodeubvSUN;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glReplacementCodePointerSUN\r
+#define GLEE_C_DEFINED_glReplacementCodePointerSUN\r
+  void __stdcall GLee_Lazy_glReplacementCodePointerSUN(GLenum type, GLsizei stride, const GLvoid* * pointer)  {if (GLeeInit()) glReplacementCodePointerSUN(type, stride, pointer);}\r
+  GLEEPFNGLREPLACEMENTCODEPOINTERSUNPROC GLeeFuncPtr_glReplacementCodePointerSUN=GLee_Lazy_glReplacementCodePointerSUN;\r
+#endif\r
+#endif \r
+\r
+/* GL_SUN_vertex */\r
+\r
+#ifdef __GLEE_GL_SUN_vertex\r
+#ifndef GLEE_C_DEFINED_glColor4ubVertex2fSUN\r
+#define GLEE_C_DEFINED_glColor4ubVertex2fSUN\r
+  void __stdcall GLee_Lazy_glColor4ubVertex2fSUN(GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y)  {if (GLeeInit()) glColor4ubVertex2fSUN(r, g, b, a, x, y);}\r
+  GLEEPFNGLCOLOR4UBVERTEX2FSUNPROC GLeeFuncPtr_glColor4ubVertex2fSUN=GLee_Lazy_glColor4ubVertex2fSUN;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glColor4ubVertex2fvSUN\r
+#define GLEE_C_DEFINED_glColor4ubVertex2fvSUN\r
+  void __stdcall GLee_Lazy_glColor4ubVertex2fvSUN(const GLubyte * c, const GLfloat * v)  {if (GLeeInit()) glColor4ubVertex2fvSUN(c, v);}\r
+  GLEEPFNGLCOLOR4UBVERTEX2FVSUNPROC GLeeFuncPtr_glColor4ubVertex2fvSUN=GLee_Lazy_glColor4ubVertex2fvSUN;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glColor4ubVertex3fSUN\r
+#define GLEE_C_DEFINED_glColor4ubVertex3fSUN\r
+  void __stdcall GLee_Lazy_glColor4ubVertex3fSUN(GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z)  {if (GLeeInit()) glColor4ubVertex3fSUN(r, g, b, a, x, y, z);}\r
+  GLEEPFNGLCOLOR4UBVERTEX3FSUNPROC GLeeFuncPtr_glColor4ubVertex3fSUN=GLee_Lazy_glColor4ubVertex3fSUN;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glColor4ubVertex3fvSUN\r
+#define GLEE_C_DEFINED_glColor4ubVertex3fvSUN\r
+  void __stdcall GLee_Lazy_glColor4ubVertex3fvSUN(const GLubyte * c, const GLfloat * v)  {if (GLeeInit()) glColor4ubVertex3fvSUN(c, v);}\r
+  GLEEPFNGLCOLOR4UBVERTEX3FVSUNPROC GLeeFuncPtr_glColor4ubVertex3fvSUN=GLee_Lazy_glColor4ubVertex3fvSUN;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glColor3fVertex3fSUN\r
+#define GLEE_C_DEFINED_glColor3fVertex3fSUN\r
+  void __stdcall GLee_Lazy_glColor3fVertex3fSUN(GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z)  {if (GLeeInit()) glColor3fVertex3fSUN(r, g, b, x, y, z);}\r
+  GLEEPFNGLCOLOR3FVERTEX3FSUNPROC GLeeFuncPtr_glColor3fVertex3fSUN=GLee_Lazy_glColor3fVertex3fSUN;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glColor3fVertex3fvSUN\r
+#define GLEE_C_DEFINED_glColor3fVertex3fvSUN\r
+  void __stdcall GLee_Lazy_glColor3fVertex3fvSUN(const GLfloat * c, const GLfloat * v)  {if (GLeeInit()) glColor3fVertex3fvSUN(c, v);}\r
+  GLEEPFNGLCOLOR3FVERTEX3FVSUNPROC GLeeFuncPtr_glColor3fVertex3fvSUN=GLee_Lazy_glColor3fVertex3fvSUN;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glNormal3fVertex3fSUN\r
+#define GLEE_C_DEFINED_glNormal3fVertex3fSUN\r
+  void __stdcall GLee_Lazy_glNormal3fVertex3fSUN(GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z)  {if (GLeeInit()) glNormal3fVertex3fSUN(nx, ny, nz, x, y, z);}\r
+  GLEEPFNGLNORMAL3FVERTEX3FSUNPROC GLeeFuncPtr_glNormal3fVertex3fSUN=GLee_Lazy_glNormal3fVertex3fSUN;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glNormal3fVertex3fvSUN\r
+#define GLEE_C_DEFINED_glNormal3fVertex3fvSUN\r
+  void __stdcall GLee_Lazy_glNormal3fVertex3fvSUN(const GLfloat * n, const GLfloat * v)  {if (GLeeInit()) glNormal3fVertex3fvSUN(n, v);}\r
+  GLEEPFNGLNORMAL3FVERTEX3FVSUNPROC GLeeFuncPtr_glNormal3fVertex3fvSUN=GLee_Lazy_glNormal3fVertex3fvSUN;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glColor4fNormal3fVertex3fSUN\r
+#define GLEE_C_DEFINED_glColor4fNormal3fVertex3fSUN\r
+  void __stdcall GLee_Lazy_glColor4fNormal3fVertex3fSUN(GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z)  {if (GLeeInit()) glColor4fNormal3fVertex3fSUN(r, g, b, a, nx, ny, nz, x, y, z);}\r
+  GLEEPFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC GLeeFuncPtr_glColor4fNormal3fVertex3fSUN=GLee_Lazy_glColor4fNormal3fVertex3fSUN;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glColor4fNormal3fVertex3fvSUN\r
+#define GLEE_C_DEFINED_glColor4fNormal3fVertex3fvSUN\r
+  void __stdcall GLee_Lazy_glColor4fNormal3fVertex3fvSUN(const GLfloat * c, const GLfloat * n, const GLfloat * v)  {if (GLeeInit()) glColor4fNormal3fVertex3fvSUN(c, n, v);}\r
+  GLEEPFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC GLeeFuncPtr_glColor4fNormal3fVertex3fvSUN=GLee_Lazy_glColor4fNormal3fVertex3fvSUN;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTexCoord2fVertex3fSUN\r
+#define GLEE_C_DEFINED_glTexCoord2fVertex3fSUN\r
+  void __stdcall GLee_Lazy_glTexCoord2fVertex3fSUN(GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z)  {if (GLeeInit()) glTexCoord2fVertex3fSUN(s, t, x, y, z);}\r
+  GLEEPFNGLTEXCOORD2FVERTEX3FSUNPROC GLeeFuncPtr_glTexCoord2fVertex3fSUN=GLee_Lazy_glTexCoord2fVertex3fSUN;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTexCoord2fVertex3fvSUN\r
+#define GLEE_C_DEFINED_glTexCoord2fVertex3fvSUN\r
+  void __stdcall GLee_Lazy_glTexCoord2fVertex3fvSUN(const GLfloat * tc, const GLfloat * v)  {if (GLeeInit()) glTexCoord2fVertex3fvSUN(tc, v);}\r
+  GLEEPFNGLTEXCOORD2FVERTEX3FVSUNPROC GLeeFuncPtr_glTexCoord2fVertex3fvSUN=GLee_Lazy_glTexCoord2fVertex3fvSUN;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTexCoord4fVertex4fSUN\r
+#define GLEE_C_DEFINED_glTexCoord4fVertex4fSUN\r
+  void __stdcall GLee_Lazy_glTexCoord4fVertex4fSUN(GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w)  {if (GLeeInit()) glTexCoord4fVertex4fSUN(s, t, p, q, x, y, z, w);}\r
+  GLEEPFNGLTEXCOORD4FVERTEX4FSUNPROC GLeeFuncPtr_glTexCoord4fVertex4fSUN=GLee_Lazy_glTexCoord4fVertex4fSUN;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTexCoord4fVertex4fvSUN\r
+#define GLEE_C_DEFINED_glTexCoord4fVertex4fvSUN\r
+  void __stdcall GLee_Lazy_glTexCoord4fVertex4fvSUN(const GLfloat * tc, const GLfloat * v)  {if (GLeeInit()) glTexCoord4fVertex4fvSUN(tc, v);}\r
+  GLEEPFNGLTEXCOORD4FVERTEX4FVSUNPROC GLeeFuncPtr_glTexCoord4fVertex4fvSUN=GLee_Lazy_glTexCoord4fVertex4fvSUN;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTexCoord2fColor4ubVertex3fSUN\r
+#define GLEE_C_DEFINED_glTexCoord2fColor4ubVertex3fSUN\r
+  void __stdcall GLee_Lazy_glTexCoord2fColor4ubVertex3fSUN(GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z)  {if (GLeeInit()) glTexCoord2fColor4ubVertex3fSUN(s, t, r, g, b, a, x, y, z);}\r
+  GLEEPFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC GLeeFuncPtr_glTexCoord2fColor4ubVertex3fSUN=GLee_Lazy_glTexCoord2fColor4ubVertex3fSUN;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTexCoord2fColor4ubVertex3fvSUN\r
+#define GLEE_C_DEFINED_glTexCoord2fColor4ubVertex3fvSUN\r
+  void __stdcall GLee_Lazy_glTexCoord2fColor4ubVertex3fvSUN(const GLfloat * tc, const GLubyte * c, const GLfloat * v)  {if (GLeeInit()) glTexCoord2fColor4ubVertex3fvSUN(tc, c, v);}\r
+  GLEEPFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC GLeeFuncPtr_glTexCoord2fColor4ubVertex3fvSUN=GLee_Lazy_glTexCoord2fColor4ubVertex3fvSUN;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTexCoord2fColor3fVertex3fSUN\r
+#define GLEE_C_DEFINED_glTexCoord2fColor3fVertex3fSUN\r
+  void __stdcall GLee_Lazy_glTexCoord2fColor3fVertex3fSUN(GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z)  {if (GLeeInit()) glTexCoord2fColor3fVertex3fSUN(s, t, r, g, b, x, y, z);}\r
+  GLEEPFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC GLeeFuncPtr_glTexCoord2fColor3fVertex3fSUN=GLee_Lazy_glTexCoord2fColor3fVertex3fSUN;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTexCoord2fColor3fVertex3fvSUN\r
+#define GLEE_C_DEFINED_glTexCoord2fColor3fVertex3fvSUN\r
+  void __stdcall GLee_Lazy_glTexCoord2fColor3fVertex3fvSUN(const GLfloat * tc, const GLfloat * c, const GLfloat * v)  {if (GLeeInit()) glTexCoord2fColor3fVertex3fvSUN(tc, c, v);}\r
+  GLEEPFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC GLeeFuncPtr_glTexCoord2fColor3fVertex3fvSUN=GLee_Lazy_glTexCoord2fColor3fVertex3fvSUN;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTexCoord2fNormal3fVertex3fSUN\r
+#define GLEE_C_DEFINED_glTexCoord2fNormal3fVertex3fSUN\r
+  void __stdcall GLee_Lazy_glTexCoord2fNormal3fVertex3fSUN(GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z)  {if (GLeeInit()) glTexCoord2fNormal3fVertex3fSUN(s, t, nx, ny, nz, x, y, z);}\r
+  GLEEPFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC GLeeFuncPtr_glTexCoord2fNormal3fVertex3fSUN=GLee_Lazy_glTexCoord2fNormal3fVertex3fSUN;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTexCoord2fNormal3fVertex3fvSUN\r
+#define GLEE_C_DEFINED_glTexCoord2fNormal3fVertex3fvSUN\r
+  void __stdcall GLee_Lazy_glTexCoord2fNormal3fVertex3fvSUN(const GLfloat * tc, const GLfloat * n, const GLfloat * v)  {if (GLeeInit()) glTexCoord2fNormal3fVertex3fvSUN(tc, n, v);}\r
+  GLEEPFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC GLeeFuncPtr_glTexCoord2fNormal3fVertex3fvSUN=GLee_Lazy_glTexCoord2fNormal3fVertex3fvSUN;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTexCoord2fColor4fNormal3fVertex3fSUN\r
+#define GLEE_C_DEFINED_glTexCoord2fColor4fNormal3fVertex3fSUN\r
+  void __stdcall GLee_Lazy_glTexCoord2fColor4fNormal3fVertex3fSUN(GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z)  {if (GLeeInit()) glTexCoord2fColor4fNormal3fVertex3fSUN(s, t, r, g, b, a, nx, ny, nz, x, y, z);}\r
+  GLEEPFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC GLeeFuncPtr_glTexCoord2fColor4fNormal3fVertex3fSUN=GLee_Lazy_glTexCoord2fColor4fNormal3fVertex3fSUN;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTexCoord2fColor4fNormal3fVertex3fvSUN\r
+#define GLEE_C_DEFINED_glTexCoord2fColor4fNormal3fVertex3fvSUN\r
+  void __stdcall GLee_Lazy_glTexCoord2fColor4fNormal3fVertex3fvSUN(const GLfloat * tc, const GLfloat * c, const GLfloat * n, const GLfloat * v)  {if (GLeeInit()) glTexCoord2fColor4fNormal3fVertex3fvSUN(tc, c, n, v);}\r
+  GLEEPFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC GLeeFuncPtr_glTexCoord2fColor4fNormal3fVertex3fvSUN=GLee_Lazy_glTexCoord2fColor4fNormal3fVertex3fvSUN;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTexCoord4fColor4fNormal3fVertex4fSUN\r
+#define GLEE_C_DEFINED_glTexCoord4fColor4fNormal3fVertex4fSUN\r
+  void __stdcall GLee_Lazy_glTexCoord4fColor4fNormal3fVertex4fSUN(GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w)  {if (GLeeInit()) glTexCoord4fColor4fNormal3fVertex4fSUN(s, t, p, q, r, g, b, a, nx, ny, nz, x, y, z, w);}\r
+  GLEEPFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC GLeeFuncPtr_glTexCoord4fColor4fNormal3fVertex4fSUN=GLee_Lazy_glTexCoord4fColor4fNormal3fVertex4fSUN;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTexCoord4fColor4fNormal3fVertex4fvSUN\r
+#define GLEE_C_DEFINED_glTexCoord4fColor4fNormal3fVertex4fvSUN\r
+  void __stdcall GLee_Lazy_glTexCoord4fColor4fNormal3fVertex4fvSUN(const GLfloat * tc, const GLfloat * c, const GLfloat * n, const GLfloat * v)  {if (GLeeInit()) glTexCoord4fColor4fNormal3fVertex4fvSUN(tc, c, n, v);}\r
+  GLEEPFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC GLeeFuncPtr_glTexCoord4fColor4fNormal3fVertex4fvSUN=GLee_Lazy_glTexCoord4fColor4fNormal3fVertex4fvSUN;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glReplacementCodeuiVertex3fSUN\r
+#define GLEE_C_DEFINED_glReplacementCodeuiVertex3fSUN\r
+  void __stdcall GLee_Lazy_glReplacementCodeuiVertex3fSUN(GLuint rc, GLfloat x, GLfloat y, GLfloat z)  {if (GLeeInit()) glReplacementCodeuiVertex3fSUN(rc, x, y, z);}\r
+  GLEEPFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC GLeeFuncPtr_glReplacementCodeuiVertex3fSUN=GLee_Lazy_glReplacementCodeuiVertex3fSUN;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glReplacementCodeuiVertex3fvSUN\r
+#define GLEE_C_DEFINED_glReplacementCodeuiVertex3fvSUN\r
+  void __stdcall GLee_Lazy_glReplacementCodeuiVertex3fvSUN(const GLuint * rc, const GLfloat * v)  {if (GLeeInit()) glReplacementCodeuiVertex3fvSUN(rc, v);}\r
+  GLEEPFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC GLeeFuncPtr_glReplacementCodeuiVertex3fvSUN=GLee_Lazy_glReplacementCodeuiVertex3fvSUN;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glReplacementCodeuiColor4ubVertex3fSUN\r
+#define GLEE_C_DEFINED_glReplacementCodeuiColor4ubVertex3fSUN\r
+  void __stdcall GLee_Lazy_glReplacementCodeuiColor4ubVertex3fSUN(GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z)  {if (GLeeInit()) glReplacementCodeuiColor4ubVertex3fSUN(rc, r, g, b, a, x, y, z);}\r
+  GLEEPFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC GLeeFuncPtr_glReplacementCodeuiColor4ubVertex3fSUN=GLee_Lazy_glReplacementCodeuiColor4ubVertex3fSUN;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glReplacementCodeuiColor4ubVertex3fvSUN\r
+#define GLEE_C_DEFINED_glReplacementCodeuiColor4ubVertex3fvSUN\r
+  void __stdcall GLee_Lazy_glReplacementCodeuiColor4ubVertex3fvSUN(const GLuint * rc, const GLubyte * c, const GLfloat * v)  {if (GLeeInit()) glReplacementCodeuiColor4ubVertex3fvSUN(rc, c, v);}\r
+  GLEEPFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC GLeeFuncPtr_glReplacementCodeuiColor4ubVertex3fvSUN=GLee_Lazy_glReplacementCodeuiColor4ubVertex3fvSUN;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glReplacementCodeuiColor3fVertex3fSUN\r
+#define GLEE_C_DEFINED_glReplacementCodeuiColor3fVertex3fSUN\r
+  void __stdcall GLee_Lazy_glReplacementCodeuiColor3fVertex3fSUN(GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z)  {if (GLeeInit()) glReplacementCodeuiColor3fVertex3fSUN(rc, r, g, b, x, y, z);}\r
+  GLEEPFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC GLeeFuncPtr_glReplacementCodeuiColor3fVertex3fSUN=GLee_Lazy_glReplacementCodeuiColor3fVertex3fSUN;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glReplacementCodeuiColor3fVertex3fvSUN\r
+#define GLEE_C_DEFINED_glReplacementCodeuiColor3fVertex3fvSUN\r
+  void __stdcall GLee_Lazy_glReplacementCodeuiColor3fVertex3fvSUN(const GLuint * rc, const GLfloat * c, const GLfloat * v)  {if (GLeeInit()) glReplacementCodeuiColor3fVertex3fvSUN(rc, c, v);}\r
+  GLEEPFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC GLeeFuncPtr_glReplacementCodeuiColor3fVertex3fvSUN=GLee_Lazy_glReplacementCodeuiColor3fVertex3fvSUN;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glReplacementCodeuiNormal3fVertex3fSUN\r
+#define GLEE_C_DEFINED_glReplacementCodeuiNormal3fVertex3fSUN\r
+  void __stdcall GLee_Lazy_glReplacementCodeuiNormal3fVertex3fSUN(GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z)  {if (GLeeInit()) glReplacementCodeuiNormal3fVertex3fSUN(rc, nx, ny, nz, x, y, z);}\r
+  GLEEPFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC GLeeFuncPtr_glReplacementCodeuiNormal3fVertex3fSUN=GLee_Lazy_glReplacementCodeuiNormal3fVertex3fSUN;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glReplacementCodeuiNormal3fVertex3fvSUN\r
+#define GLEE_C_DEFINED_glReplacementCodeuiNormal3fVertex3fvSUN\r
+  void __stdcall GLee_Lazy_glReplacementCodeuiNormal3fVertex3fvSUN(const GLuint * rc, const GLfloat * n, const GLfloat * v)  {if (GLeeInit()) glReplacementCodeuiNormal3fVertex3fvSUN(rc, n, v);}\r
+  GLEEPFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC GLeeFuncPtr_glReplacementCodeuiNormal3fVertex3fvSUN=GLee_Lazy_glReplacementCodeuiNormal3fVertex3fvSUN;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glReplacementCodeuiColor4fNormal3fVertex3fSUN\r
+#define GLEE_C_DEFINED_glReplacementCodeuiColor4fNormal3fVertex3fSUN\r
+  void __stdcall GLee_Lazy_glReplacementCodeuiColor4fNormal3fVertex3fSUN(GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z)  {if (GLeeInit()) glReplacementCodeuiColor4fNormal3fVertex3fSUN(rc, r, g, b, a, nx, ny, nz, x, y, z);}\r
+  GLEEPFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC GLeeFuncPtr_glReplacementCodeuiColor4fNormal3fVertex3fSUN=GLee_Lazy_glReplacementCodeuiColor4fNormal3fVertex3fSUN;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glReplacementCodeuiColor4fNormal3fVertex3fvSUN\r
+#define GLEE_C_DEFINED_glReplacementCodeuiColor4fNormal3fVertex3fvSUN\r
+  void __stdcall GLee_Lazy_glReplacementCodeuiColor4fNormal3fVertex3fvSUN(const GLuint * rc, const GLfloat * c, const GLfloat * n, const GLfloat * v)  {if (GLeeInit()) glReplacementCodeuiColor4fNormal3fVertex3fvSUN(rc, c, n, v);}\r
+  GLEEPFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC GLeeFuncPtr_glReplacementCodeuiColor4fNormal3fVertex3fvSUN=GLee_Lazy_glReplacementCodeuiColor4fNormal3fVertex3fvSUN;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glReplacementCodeuiTexCoord2fVertex3fSUN\r
+#define GLEE_C_DEFINED_glReplacementCodeuiTexCoord2fVertex3fSUN\r
+  void __stdcall GLee_Lazy_glReplacementCodeuiTexCoord2fVertex3fSUN(GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z)  {if (GLeeInit()) glReplacementCodeuiTexCoord2fVertex3fSUN(rc, s, t, x, y, z);}\r
+  GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC GLeeFuncPtr_glReplacementCodeuiTexCoord2fVertex3fSUN=GLee_Lazy_glReplacementCodeuiTexCoord2fVertex3fSUN;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glReplacementCodeuiTexCoord2fVertex3fvSUN\r
+#define GLEE_C_DEFINED_glReplacementCodeuiTexCoord2fVertex3fvSUN\r
+  void __stdcall GLee_Lazy_glReplacementCodeuiTexCoord2fVertex3fvSUN(const GLuint * rc, const GLfloat * tc, const GLfloat * v)  {if (GLeeInit()) glReplacementCodeuiTexCoord2fVertex3fvSUN(rc, tc, v);}\r
+  GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC GLeeFuncPtr_glReplacementCodeuiTexCoord2fVertex3fvSUN=GLee_Lazy_glReplacementCodeuiTexCoord2fVertex3fvSUN;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN\r
+#define GLEE_C_DEFINED_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN\r
+  void __stdcall GLee_Lazy_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN(GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z)  {if (GLeeInit()) glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN(rc, s, t, nx, ny, nz, x, y, z);}\r
+  GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC GLeeFuncPtr_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN=GLee_Lazy_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN\r
+#define GLEE_C_DEFINED_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN\r
+  void __stdcall GLee_Lazy_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN(const GLuint * rc, const GLfloat * tc, const GLfloat * n, const GLfloat * v)  {if (GLeeInit()) glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN(rc, tc, n, v);}\r
+  GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC GLeeFuncPtr_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN=GLee_Lazy_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN\r
+#define GLEE_C_DEFINED_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN\r
+  void __stdcall GLee_Lazy_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN(GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z)  {if (GLeeInit()) glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN(rc, s, t, r, g, b, a, nx, ny, nz, x, y, z);}\r
+  GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC GLeeFuncPtr_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN=GLee_Lazy_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN\r
+#define GLEE_C_DEFINED_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN\r
+  void __stdcall GLee_Lazy_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN(const GLuint * rc, const GLfloat * tc, const GLfloat * c, const GLfloat * n, const GLfloat * v)  {if (GLeeInit()) glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN(rc, tc, c, n, v);}\r
+  GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC GLeeFuncPtr_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN=GLee_Lazy_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN;\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_blend_func_separate */\r
+\r
+#ifdef __GLEE_GL_EXT_blend_func_separate\r
+#ifndef GLEE_C_DEFINED_glBlendFuncSeparateEXT\r
+#define GLEE_C_DEFINED_glBlendFuncSeparateEXT\r
+  void __stdcall GLee_Lazy_glBlendFuncSeparateEXT(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha)  {if (GLeeInit()) glBlendFuncSeparateEXT(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);}\r
+  GLEEPFNGLBLENDFUNCSEPARATEEXTPROC GLeeFuncPtr_glBlendFuncSeparateEXT=GLee_Lazy_glBlendFuncSeparateEXT;\r
+#endif\r
+#endif \r
+\r
+/* GL_INGR_color_clamp */\r
+\r
+#ifdef __GLEE_GL_INGR_color_clamp\r
+#endif \r
+\r
+/* GL_INGR_interlace_read */\r
+\r
+#ifdef __GLEE_GL_INGR_interlace_read\r
+#endif \r
+\r
+/* GL_EXT_stencil_wrap */\r
+\r
+#ifdef __GLEE_GL_EXT_stencil_wrap\r
+#endif \r
+\r
+/* GL_EXT_422_pixels */\r
+\r
+#ifdef __GLEE_GL_EXT_422_pixels\r
+#endif \r
+\r
+/* GL_NV_texgen_reflection */\r
+\r
+#ifdef __GLEE_GL_NV_texgen_reflection\r
+#endif \r
+\r
+/* GL_EXT_texture_cube_map */\r
+\r
+#ifdef __GLEE_GL_EXT_texture_cube_map\r
+#endif \r
+\r
+/* GL_SUN_convolution_border_modes */\r
+\r
+#ifdef __GLEE_GL_SUN_convolution_border_modes\r
+#endif \r
+\r
+/* GL_EXT_texture_env_add */\r
+\r
+#ifdef __GLEE_GL_EXT_texture_env_add\r
+#endif \r
+\r
+/* GL_EXT_texture_lod_bias */\r
+\r
+#ifdef __GLEE_GL_EXT_texture_lod_bias\r
+#endif \r
+\r
+/* GL_EXT_texture_filter_anisotropic */\r
+\r
+#ifdef __GLEE_GL_EXT_texture_filter_anisotropic\r
+#endif \r
+\r
+/* GL_EXT_vertex_weighting */\r
+\r
+#ifdef __GLEE_GL_EXT_vertex_weighting\r
+#ifndef GLEE_C_DEFINED_glVertexWeightfEXT\r
+#define GLEE_C_DEFINED_glVertexWeightfEXT\r
+  void __stdcall GLee_Lazy_glVertexWeightfEXT(GLfloat weight)  {if (GLeeInit()) glVertexWeightfEXT(weight);}\r
+  GLEEPFNGLVERTEXWEIGHTFEXTPROC GLeeFuncPtr_glVertexWeightfEXT=GLee_Lazy_glVertexWeightfEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexWeightfvEXT\r
+#define GLEE_C_DEFINED_glVertexWeightfvEXT\r
+  void __stdcall GLee_Lazy_glVertexWeightfvEXT(const GLfloat * weight)  {if (GLeeInit()) glVertexWeightfvEXT(weight);}\r
+  GLEEPFNGLVERTEXWEIGHTFVEXTPROC GLeeFuncPtr_glVertexWeightfvEXT=GLee_Lazy_glVertexWeightfvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexWeightPointerEXT\r
+#define GLEE_C_DEFINED_glVertexWeightPointerEXT\r
+  void __stdcall GLee_Lazy_glVertexWeightPointerEXT(GLsizei size, GLenum type, GLsizei stride, const GLvoid * pointer)  {if (GLeeInit()) glVertexWeightPointerEXT(size, type, stride, pointer);}\r
+  GLEEPFNGLVERTEXWEIGHTPOINTEREXTPROC GLeeFuncPtr_glVertexWeightPointerEXT=GLee_Lazy_glVertexWeightPointerEXT;\r
+#endif\r
+#endif \r
+\r
+/* GL_NV_light_max_exponent */\r
+\r
+#ifdef __GLEE_GL_NV_light_max_exponent\r
+#endif \r
+\r
+/* GL_NV_vertex_array_range */\r
+\r
+#ifdef __GLEE_GL_NV_vertex_array_range\r
+#ifndef GLEE_C_DEFINED_glFlushVertexArrayRangeNV\r
+#define GLEE_C_DEFINED_glFlushVertexArrayRangeNV\r
+  void __stdcall GLee_Lazy_glFlushVertexArrayRangeNV(void)  {if (GLeeInit()) glFlushVertexArrayRangeNV();}\r
+  GLEEPFNGLFLUSHVERTEXARRAYRANGENVPROC GLeeFuncPtr_glFlushVertexArrayRangeNV=GLee_Lazy_glFlushVertexArrayRangeNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexArrayRangeNV\r
+#define GLEE_C_DEFINED_glVertexArrayRangeNV\r
+  void __stdcall GLee_Lazy_glVertexArrayRangeNV(GLsizei length, const GLvoid * pointer)  {if (GLeeInit()) glVertexArrayRangeNV(length, pointer);}\r
+  GLEEPFNGLVERTEXARRAYRANGENVPROC GLeeFuncPtr_glVertexArrayRangeNV=GLee_Lazy_glVertexArrayRangeNV;\r
+#endif\r
+#endif \r
+\r
+/* GL_NV_register_combiners */\r
+\r
+#ifdef __GLEE_GL_NV_register_combiners\r
+#ifndef GLEE_C_DEFINED_glCombinerParameterfvNV\r
+#define GLEE_C_DEFINED_glCombinerParameterfvNV\r
+  void __stdcall GLee_Lazy_glCombinerParameterfvNV(GLenum pname, const GLfloat * params)  {if (GLeeInit()) glCombinerParameterfvNV(pname, params);}\r
+  GLEEPFNGLCOMBINERPARAMETERFVNVPROC GLeeFuncPtr_glCombinerParameterfvNV=GLee_Lazy_glCombinerParameterfvNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glCombinerParameterfNV\r
+#define GLEE_C_DEFINED_glCombinerParameterfNV\r
+  void __stdcall GLee_Lazy_glCombinerParameterfNV(GLenum pname, GLfloat param)  {if (GLeeInit()) glCombinerParameterfNV(pname, param);}\r
+  GLEEPFNGLCOMBINERPARAMETERFNVPROC GLeeFuncPtr_glCombinerParameterfNV=GLee_Lazy_glCombinerParameterfNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glCombinerParameterivNV\r
+#define GLEE_C_DEFINED_glCombinerParameterivNV\r
+  void __stdcall GLee_Lazy_glCombinerParameterivNV(GLenum pname, const GLint * params)  {if (GLeeInit()) glCombinerParameterivNV(pname, params);}\r
+  GLEEPFNGLCOMBINERPARAMETERIVNVPROC GLeeFuncPtr_glCombinerParameterivNV=GLee_Lazy_glCombinerParameterivNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glCombinerParameteriNV\r
+#define GLEE_C_DEFINED_glCombinerParameteriNV\r
+  void __stdcall GLee_Lazy_glCombinerParameteriNV(GLenum pname, GLint param)  {if (GLeeInit()) glCombinerParameteriNV(pname, param);}\r
+  GLEEPFNGLCOMBINERPARAMETERINVPROC GLeeFuncPtr_glCombinerParameteriNV=GLee_Lazy_glCombinerParameteriNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glCombinerInputNV\r
+#define GLEE_C_DEFINED_glCombinerInputNV\r
+  void __stdcall GLee_Lazy_glCombinerInputNV(GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage)  {if (GLeeInit()) glCombinerInputNV(stage, portion, variable, input, mapping, componentUsage);}\r
+  GLEEPFNGLCOMBINERINPUTNVPROC GLeeFuncPtr_glCombinerInputNV=GLee_Lazy_glCombinerInputNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glCombinerOutputNV\r
+#define GLEE_C_DEFINED_glCombinerOutputNV\r
+  void __stdcall GLee_Lazy_glCombinerOutputNV(GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum)  {if (GLeeInit()) glCombinerOutputNV(stage, portion, abOutput, cdOutput, sumOutput, scale, bias, abDotProduct, cdDotProduct, muxSum);}\r
+  GLEEPFNGLCOMBINEROUTPUTNVPROC GLeeFuncPtr_glCombinerOutputNV=GLee_Lazy_glCombinerOutputNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFinalCombinerInputNV\r
+#define GLEE_C_DEFINED_glFinalCombinerInputNV\r
+  void __stdcall GLee_Lazy_glFinalCombinerInputNV(GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage)  {if (GLeeInit()) glFinalCombinerInputNV(variable, input, mapping, componentUsage);}\r
+  GLEEPFNGLFINALCOMBINERINPUTNVPROC GLeeFuncPtr_glFinalCombinerInputNV=GLee_Lazy_glFinalCombinerInputNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetCombinerInputParameterfvNV\r
+#define GLEE_C_DEFINED_glGetCombinerInputParameterfvNV\r
+  void __stdcall GLee_Lazy_glGetCombinerInputParameterfvNV(GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat * params)  {if (GLeeInit()) glGetCombinerInputParameterfvNV(stage, portion, variable, pname, params);}\r
+  GLEEPFNGLGETCOMBINERINPUTPARAMETERFVNVPROC GLeeFuncPtr_glGetCombinerInputParameterfvNV=GLee_Lazy_glGetCombinerInputParameterfvNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetCombinerInputParameterivNV\r
+#define GLEE_C_DEFINED_glGetCombinerInputParameterivNV\r
+  void __stdcall GLee_Lazy_glGetCombinerInputParameterivNV(GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint * params)  {if (GLeeInit()) glGetCombinerInputParameterivNV(stage, portion, variable, pname, params);}\r
+  GLEEPFNGLGETCOMBINERINPUTPARAMETERIVNVPROC GLeeFuncPtr_glGetCombinerInputParameterivNV=GLee_Lazy_glGetCombinerInputParameterivNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetCombinerOutputParameterfvNV\r
+#define GLEE_C_DEFINED_glGetCombinerOutputParameterfvNV\r
+  void __stdcall GLee_Lazy_glGetCombinerOutputParameterfvNV(GLenum stage, GLenum portion, GLenum pname, GLfloat * params)  {if (GLeeInit()) glGetCombinerOutputParameterfvNV(stage, portion, pname, params);}\r
+  GLEEPFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC GLeeFuncPtr_glGetCombinerOutputParameterfvNV=GLee_Lazy_glGetCombinerOutputParameterfvNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetCombinerOutputParameterivNV\r
+#define GLEE_C_DEFINED_glGetCombinerOutputParameterivNV\r
+  void __stdcall GLee_Lazy_glGetCombinerOutputParameterivNV(GLenum stage, GLenum portion, GLenum pname, GLint * params)  {if (GLeeInit()) glGetCombinerOutputParameterivNV(stage, portion, pname, params);}\r
+  GLEEPFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC GLeeFuncPtr_glGetCombinerOutputParameterivNV=GLee_Lazy_glGetCombinerOutputParameterivNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetFinalCombinerInputParameterfvNV\r
+#define GLEE_C_DEFINED_glGetFinalCombinerInputParameterfvNV\r
+  void __stdcall GLee_Lazy_glGetFinalCombinerInputParameterfvNV(GLenum variable, GLenum pname, GLfloat * params)  {if (GLeeInit()) glGetFinalCombinerInputParameterfvNV(variable, pname, params);}\r
+  GLEEPFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC GLeeFuncPtr_glGetFinalCombinerInputParameterfvNV=GLee_Lazy_glGetFinalCombinerInputParameterfvNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetFinalCombinerInputParameterivNV\r
+#define GLEE_C_DEFINED_glGetFinalCombinerInputParameterivNV\r
+  void __stdcall GLee_Lazy_glGetFinalCombinerInputParameterivNV(GLenum variable, GLenum pname, GLint * params)  {if (GLeeInit()) glGetFinalCombinerInputParameterivNV(variable, pname, params);}\r
+  GLEEPFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC GLeeFuncPtr_glGetFinalCombinerInputParameterivNV=GLee_Lazy_glGetFinalCombinerInputParameterivNV;\r
+#endif\r
+#endif \r
+\r
+/* GL_NV_fog_distance */\r
+\r
+#ifdef __GLEE_GL_NV_fog_distance\r
+#endif \r
+\r
+/* GL_NV_texgen_emboss */\r
+\r
+#ifdef __GLEE_GL_NV_texgen_emboss\r
+#endif \r
+\r
+/* GL_NV_blend_square */\r
+\r
+#ifdef __GLEE_GL_NV_blend_square\r
+#endif \r
+\r
+/* GL_NV_texture_env_combine4 */\r
+\r
+#ifdef __GLEE_GL_NV_texture_env_combine4\r
+#endif \r
+\r
+/* GL_MESA_resize_buffers */\r
+\r
+#ifdef __GLEE_GL_MESA_resize_buffers\r
+#ifndef GLEE_C_DEFINED_glResizeBuffersMESA\r
+#define GLEE_C_DEFINED_glResizeBuffersMESA\r
+  void __stdcall GLee_Lazy_glResizeBuffersMESA(void)  {if (GLeeInit()) glResizeBuffersMESA();}\r
+  GLEEPFNGLRESIZEBUFFERSMESAPROC GLeeFuncPtr_glResizeBuffersMESA=GLee_Lazy_glResizeBuffersMESA;\r
+#endif\r
+#endif \r
+\r
+/* GL_MESA_window_pos */\r
+\r
+#ifdef __GLEE_GL_MESA_window_pos\r
+#ifndef GLEE_C_DEFINED_glWindowPos2dMESA\r
+#define GLEE_C_DEFINED_glWindowPos2dMESA\r
+  void __stdcall GLee_Lazy_glWindowPos2dMESA(GLdouble x, GLdouble y)  {if (GLeeInit()) glWindowPos2dMESA(x, y);}\r
+  GLEEPFNGLWINDOWPOS2DMESAPROC GLeeFuncPtr_glWindowPos2dMESA=GLee_Lazy_glWindowPos2dMESA;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glWindowPos2dvMESA\r
+#define GLEE_C_DEFINED_glWindowPos2dvMESA\r
+  void __stdcall GLee_Lazy_glWindowPos2dvMESA(const GLdouble * v)  {if (GLeeInit()) glWindowPos2dvMESA(v);}\r
+  GLEEPFNGLWINDOWPOS2DVMESAPROC GLeeFuncPtr_glWindowPos2dvMESA=GLee_Lazy_glWindowPos2dvMESA;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glWindowPos2fMESA\r
+#define GLEE_C_DEFINED_glWindowPos2fMESA\r
+  void __stdcall GLee_Lazy_glWindowPos2fMESA(GLfloat x, GLfloat y)  {if (GLeeInit()) glWindowPos2fMESA(x, y);}\r
+  GLEEPFNGLWINDOWPOS2FMESAPROC GLeeFuncPtr_glWindowPos2fMESA=GLee_Lazy_glWindowPos2fMESA;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glWindowPos2fvMESA\r
+#define GLEE_C_DEFINED_glWindowPos2fvMESA\r
+  void __stdcall GLee_Lazy_glWindowPos2fvMESA(const GLfloat * v)  {if (GLeeInit()) glWindowPos2fvMESA(v);}\r
+  GLEEPFNGLWINDOWPOS2FVMESAPROC GLeeFuncPtr_glWindowPos2fvMESA=GLee_Lazy_glWindowPos2fvMESA;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glWindowPos2iMESA\r
+#define GLEE_C_DEFINED_glWindowPos2iMESA\r
+  void __stdcall GLee_Lazy_glWindowPos2iMESA(GLint x, GLint y)  {if (GLeeInit()) glWindowPos2iMESA(x, y);}\r
+  GLEEPFNGLWINDOWPOS2IMESAPROC GLeeFuncPtr_glWindowPos2iMESA=GLee_Lazy_glWindowPos2iMESA;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glWindowPos2ivMESA\r
+#define GLEE_C_DEFINED_glWindowPos2ivMESA\r
+  void __stdcall GLee_Lazy_glWindowPos2ivMESA(const GLint * v)  {if (GLeeInit()) glWindowPos2ivMESA(v);}\r
+  GLEEPFNGLWINDOWPOS2IVMESAPROC GLeeFuncPtr_glWindowPos2ivMESA=GLee_Lazy_glWindowPos2ivMESA;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glWindowPos2sMESA\r
+#define GLEE_C_DEFINED_glWindowPos2sMESA\r
+  void __stdcall GLee_Lazy_glWindowPos2sMESA(GLshort x, GLshort y)  {if (GLeeInit()) glWindowPos2sMESA(x, y);}\r
+  GLEEPFNGLWINDOWPOS2SMESAPROC GLeeFuncPtr_glWindowPos2sMESA=GLee_Lazy_glWindowPos2sMESA;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glWindowPos2svMESA\r
+#define GLEE_C_DEFINED_glWindowPos2svMESA\r
+  void __stdcall GLee_Lazy_glWindowPos2svMESA(const GLshort * v)  {if (GLeeInit()) glWindowPos2svMESA(v);}\r
+  GLEEPFNGLWINDOWPOS2SVMESAPROC GLeeFuncPtr_glWindowPos2svMESA=GLee_Lazy_glWindowPos2svMESA;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glWindowPos3dMESA\r
+#define GLEE_C_DEFINED_glWindowPos3dMESA\r
+  void __stdcall GLee_Lazy_glWindowPos3dMESA(GLdouble x, GLdouble y, GLdouble z)  {if (GLeeInit()) glWindowPos3dMESA(x, y, z);}\r
+  GLEEPFNGLWINDOWPOS3DMESAPROC GLeeFuncPtr_glWindowPos3dMESA=GLee_Lazy_glWindowPos3dMESA;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glWindowPos3dvMESA\r
+#define GLEE_C_DEFINED_glWindowPos3dvMESA\r
+  void __stdcall GLee_Lazy_glWindowPos3dvMESA(const GLdouble * v)  {if (GLeeInit()) glWindowPos3dvMESA(v);}\r
+  GLEEPFNGLWINDOWPOS3DVMESAPROC GLeeFuncPtr_glWindowPos3dvMESA=GLee_Lazy_glWindowPos3dvMESA;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glWindowPos3fMESA\r
+#define GLEE_C_DEFINED_glWindowPos3fMESA\r
+  void __stdcall GLee_Lazy_glWindowPos3fMESA(GLfloat x, GLfloat y, GLfloat z)  {if (GLeeInit()) glWindowPos3fMESA(x, y, z);}\r
+  GLEEPFNGLWINDOWPOS3FMESAPROC GLeeFuncPtr_glWindowPos3fMESA=GLee_Lazy_glWindowPos3fMESA;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glWindowPos3fvMESA\r
+#define GLEE_C_DEFINED_glWindowPos3fvMESA\r
+  void __stdcall GLee_Lazy_glWindowPos3fvMESA(const GLfloat * v)  {if (GLeeInit()) glWindowPos3fvMESA(v);}\r
+  GLEEPFNGLWINDOWPOS3FVMESAPROC GLeeFuncPtr_glWindowPos3fvMESA=GLee_Lazy_glWindowPos3fvMESA;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glWindowPos3iMESA\r
+#define GLEE_C_DEFINED_glWindowPos3iMESA\r
+  void __stdcall GLee_Lazy_glWindowPos3iMESA(GLint x, GLint y, GLint z)  {if (GLeeInit()) glWindowPos3iMESA(x, y, z);}\r
+  GLEEPFNGLWINDOWPOS3IMESAPROC GLeeFuncPtr_glWindowPos3iMESA=GLee_Lazy_glWindowPos3iMESA;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glWindowPos3ivMESA\r
+#define GLEE_C_DEFINED_glWindowPos3ivMESA\r
+  void __stdcall GLee_Lazy_glWindowPos3ivMESA(const GLint * v)  {if (GLeeInit()) glWindowPos3ivMESA(v);}\r
+  GLEEPFNGLWINDOWPOS3IVMESAPROC GLeeFuncPtr_glWindowPos3ivMESA=GLee_Lazy_glWindowPos3ivMESA;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glWindowPos3sMESA\r
+#define GLEE_C_DEFINED_glWindowPos3sMESA\r
+  void __stdcall GLee_Lazy_glWindowPos3sMESA(GLshort x, GLshort y, GLshort z)  {if (GLeeInit()) glWindowPos3sMESA(x, y, z);}\r
+  GLEEPFNGLWINDOWPOS3SMESAPROC GLeeFuncPtr_glWindowPos3sMESA=GLee_Lazy_glWindowPos3sMESA;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glWindowPos3svMESA\r
+#define GLEE_C_DEFINED_glWindowPos3svMESA\r
+  void __stdcall GLee_Lazy_glWindowPos3svMESA(const GLshort * v)  {if (GLeeInit()) glWindowPos3svMESA(v);}\r
+  GLEEPFNGLWINDOWPOS3SVMESAPROC GLeeFuncPtr_glWindowPos3svMESA=GLee_Lazy_glWindowPos3svMESA;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glWindowPos4dMESA\r
+#define GLEE_C_DEFINED_glWindowPos4dMESA\r
+  void __stdcall GLee_Lazy_glWindowPos4dMESA(GLdouble x, GLdouble y, GLdouble z, GLdouble w)  {if (GLeeInit()) glWindowPos4dMESA(x, y, z, w);}\r
+  GLEEPFNGLWINDOWPOS4DMESAPROC GLeeFuncPtr_glWindowPos4dMESA=GLee_Lazy_glWindowPos4dMESA;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glWindowPos4dvMESA\r
+#define GLEE_C_DEFINED_glWindowPos4dvMESA\r
+  void __stdcall GLee_Lazy_glWindowPos4dvMESA(const GLdouble * v)  {if (GLeeInit()) glWindowPos4dvMESA(v);}\r
+  GLEEPFNGLWINDOWPOS4DVMESAPROC GLeeFuncPtr_glWindowPos4dvMESA=GLee_Lazy_glWindowPos4dvMESA;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glWindowPos4fMESA\r
+#define GLEE_C_DEFINED_glWindowPos4fMESA\r
+  void __stdcall GLee_Lazy_glWindowPos4fMESA(GLfloat x, GLfloat y, GLfloat z, GLfloat w)  {if (GLeeInit()) glWindowPos4fMESA(x, y, z, w);}\r
+  GLEEPFNGLWINDOWPOS4FMESAPROC GLeeFuncPtr_glWindowPos4fMESA=GLee_Lazy_glWindowPos4fMESA;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glWindowPos4fvMESA\r
+#define GLEE_C_DEFINED_glWindowPos4fvMESA\r
+  void __stdcall GLee_Lazy_glWindowPos4fvMESA(const GLfloat * v)  {if (GLeeInit()) glWindowPos4fvMESA(v);}\r
+  GLEEPFNGLWINDOWPOS4FVMESAPROC GLeeFuncPtr_glWindowPos4fvMESA=GLee_Lazy_glWindowPos4fvMESA;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glWindowPos4iMESA\r
+#define GLEE_C_DEFINED_glWindowPos4iMESA\r
+  void __stdcall GLee_Lazy_glWindowPos4iMESA(GLint x, GLint y, GLint z, GLint w)  {if (GLeeInit()) glWindowPos4iMESA(x, y, z, w);}\r
+  GLEEPFNGLWINDOWPOS4IMESAPROC GLeeFuncPtr_glWindowPos4iMESA=GLee_Lazy_glWindowPos4iMESA;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glWindowPos4ivMESA\r
+#define GLEE_C_DEFINED_glWindowPos4ivMESA\r
+  void __stdcall GLee_Lazy_glWindowPos4ivMESA(const GLint * v)  {if (GLeeInit()) glWindowPos4ivMESA(v);}\r
+  GLEEPFNGLWINDOWPOS4IVMESAPROC GLeeFuncPtr_glWindowPos4ivMESA=GLee_Lazy_glWindowPos4ivMESA;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glWindowPos4sMESA\r
+#define GLEE_C_DEFINED_glWindowPos4sMESA\r
+  void __stdcall GLee_Lazy_glWindowPos4sMESA(GLshort x, GLshort y, GLshort z, GLshort w)  {if (GLeeInit()) glWindowPos4sMESA(x, y, z, w);}\r
+  GLEEPFNGLWINDOWPOS4SMESAPROC GLeeFuncPtr_glWindowPos4sMESA=GLee_Lazy_glWindowPos4sMESA;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glWindowPos4svMESA\r
+#define GLEE_C_DEFINED_glWindowPos4svMESA\r
+  void __stdcall GLee_Lazy_glWindowPos4svMESA(const GLshort * v)  {if (GLeeInit()) glWindowPos4svMESA(v);}\r
+  GLEEPFNGLWINDOWPOS4SVMESAPROC GLeeFuncPtr_glWindowPos4svMESA=GLee_Lazy_glWindowPos4svMESA;\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_texture_compression_s3tc */\r
+\r
+#ifdef __GLEE_GL_EXT_texture_compression_s3tc\r
+#endif \r
+\r
+/* GL_IBM_cull_vertex */\r
+\r
+#ifdef __GLEE_GL_IBM_cull_vertex\r
+#endif \r
+\r
+/* GL_IBM_multimode_draw_arrays */\r
+\r
+#ifdef __GLEE_GL_IBM_multimode_draw_arrays\r
+#ifndef GLEE_C_DEFINED_glMultiModeDrawArraysIBM\r
+#define GLEE_C_DEFINED_glMultiModeDrawArraysIBM\r
+  void __stdcall GLee_Lazy_glMultiModeDrawArraysIBM(const GLenum * mode, const GLint * first, const GLsizei * count, GLsizei primcount, GLint modestride)  {if (GLeeInit()) glMultiModeDrawArraysIBM(mode, first, count, primcount, modestride);}\r
+  GLEEPFNGLMULTIMODEDRAWARRAYSIBMPROC GLeeFuncPtr_glMultiModeDrawArraysIBM=GLee_Lazy_glMultiModeDrawArraysIBM;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiModeDrawElementsIBM\r
+#define GLEE_C_DEFINED_glMultiModeDrawElementsIBM\r
+  void __stdcall GLee_Lazy_glMultiModeDrawElementsIBM(const GLenum * mode, const GLsizei * count, GLenum type, const GLvoid* const * indices, GLsizei primcount, GLint modestride)  {if (GLeeInit()) glMultiModeDrawElementsIBM(mode, count, type, indices, primcount, modestride);}\r
+  GLEEPFNGLMULTIMODEDRAWELEMENTSIBMPROC GLeeFuncPtr_glMultiModeDrawElementsIBM=GLee_Lazy_glMultiModeDrawElementsIBM;\r
+#endif\r
+#endif \r
+\r
+/* GL_IBM_vertex_array_lists */\r
+\r
+#ifdef __GLEE_GL_IBM_vertex_array_lists\r
+#ifndef GLEE_C_DEFINED_glColorPointerListIBM\r
+#define GLEE_C_DEFINED_glColorPointerListIBM\r
+  void __stdcall GLee_Lazy_glColorPointerListIBM(GLint size, GLenum type, GLint stride, const GLvoid* * pointer, GLint ptrstride)  {if (GLeeInit()) glColorPointerListIBM(size, type, stride, pointer, ptrstride);}\r
+  GLEEPFNGLCOLORPOINTERLISTIBMPROC GLeeFuncPtr_glColorPointerListIBM=GLee_Lazy_glColorPointerListIBM;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glSecondaryColorPointerListIBM\r
+#define GLEE_C_DEFINED_glSecondaryColorPointerListIBM\r
+  void __stdcall GLee_Lazy_glSecondaryColorPointerListIBM(GLint size, GLenum type, GLint stride, const GLvoid* * pointer, GLint ptrstride)  {if (GLeeInit()) glSecondaryColorPointerListIBM(size, type, stride, pointer, ptrstride);}\r
+  GLEEPFNGLSECONDARYCOLORPOINTERLISTIBMPROC GLeeFuncPtr_glSecondaryColorPointerListIBM=GLee_Lazy_glSecondaryColorPointerListIBM;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glEdgeFlagPointerListIBM\r
+#define GLEE_C_DEFINED_glEdgeFlagPointerListIBM\r
+  void __stdcall GLee_Lazy_glEdgeFlagPointerListIBM(GLint stride, const GLboolean* * pointer, GLint ptrstride)  {if (GLeeInit()) glEdgeFlagPointerListIBM(stride, pointer, ptrstride);}\r
+  GLEEPFNGLEDGEFLAGPOINTERLISTIBMPROC GLeeFuncPtr_glEdgeFlagPointerListIBM=GLee_Lazy_glEdgeFlagPointerListIBM;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFogCoordPointerListIBM\r
+#define GLEE_C_DEFINED_glFogCoordPointerListIBM\r
+  void __stdcall GLee_Lazy_glFogCoordPointerListIBM(GLenum type, GLint stride, const GLvoid* * pointer, GLint ptrstride)  {if (GLeeInit()) glFogCoordPointerListIBM(type, stride, pointer, ptrstride);}\r
+  GLEEPFNGLFOGCOORDPOINTERLISTIBMPROC GLeeFuncPtr_glFogCoordPointerListIBM=GLee_Lazy_glFogCoordPointerListIBM;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glIndexPointerListIBM\r
+#define GLEE_C_DEFINED_glIndexPointerListIBM\r
+  void __stdcall GLee_Lazy_glIndexPointerListIBM(GLenum type, GLint stride, const GLvoid* * pointer, GLint ptrstride)  {if (GLeeInit()) glIndexPointerListIBM(type, stride, pointer, ptrstride);}\r
+  GLEEPFNGLINDEXPOINTERLISTIBMPROC GLeeFuncPtr_glIndexPointerListIBM=GLee_Lazy_glIndexPointerListIBM;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glNormalPointerListIBM\r
+#define GLEE_C_DEFINED_glNormalPointerListIBM\r
+  void __stdcall GLee_Lazy_glNormalPointerListIBM(GLenum type, GLint stride, const GLvoid* * pointer, GLint ptrstride)  {if (GLeeInit()) glNormalPointerListIBM(type, stride, pointer, ptrstride);}\r
+  GLEEPFNGLNORMALPOINTERLISTIBMPROC GLeeFuncPtr_glNormalPointerListIBM=GLee_Lazy_glNormalPointerListIBM;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTexCoordPointerListIBM\r
+#define GLEE_C_DEFINED_glTexCoordPointerListIBM\r
+  void __stdcall GLee_Lazy_glTexCoordPointerListIBM(GLint size, GLenum type, GLint stride, const GLvoid* * pointer, GLint ptrstride)  {if (GLeeInit()) glTexCoordPointerListIBM(size, type, stride, pointer, ptrstride);}\r
+  GLEEPFNGLTEXCOORDPOINTERLISTIBMPROC GLeeFuncPtr_glTexCoordPointerListIBM=GLee_Lazy_glTexCoordPointerListIBM;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexPointerListIBM\r
+#define GLEE_C_DEFINED_glVertexPointerListIBM\r
+  void __stdcall GLee_Lazy_glVertexPointerListIBM(GLint size, GLenum type, GLint stride, const GLvoid* * pointer, GLint ptrstride)  {if (GLeeInit()) glVertexPointerListIBM(size, type, stride, pointer, ptrstride);}\r
+  GLEEPFNGLVERTEXPOINTERLISTIBMPROC GLeeFuncPtr_glVertexPointerListIBM=GLee_Lazy_glVertexPointerListIBM;\r
+#endif\r
+#endif \r
+\r
+/* GL_SGIX_subsample */\r
+\r
+#ifdef __GLEE_GL_SGIX_subsample\r
+#endif \r
+\r
+/* GL_SGIX_ycrcb_subsample */\r
+\r
+#ifdef __GLEE_GL_SGIX_ycrcb_subsample\r
+#endif \r
+\r
+/* GL_SGIX_ycrcba */\r
+\r
+#ifdef __GLEE_GL_SGIX_ycrcba\r
+#endif \r
+\r
+/* GL_SGI_depth_pass_instrument */\r
+\r
+#ifdef __GLEE_GL_SGI_depth_pass_instrument\r
+#endif \r
+\r
+/* GL_3DFX_texture_compression_FXT1 */\r
+\r
+#ifdef __GLEE_GL_3DFX_texture_compression_FXT1\r
+#endif \r
+\r
+/* GL_3DFX_multisample */\r
+\r
+#ifdef __GLEE_GL_3DFX_multisample\r
+#endif \r
+\r
+/* GL_3DFX_tbuffer */\r
+\r
+#ifdef __GLEE_GL_3DFX_tbuffer\r
+#ifndef GLEE_C_DEFINED_glTbufferMask3DFX\r
+#define GLEE_C_DEFINED_glTbufferMask3DFX\r
+  void __stdcall GLee_Lazy_glTbufferMask3DFX(GLuint mask)  {if (GLeeInit()) glTbufferMask3DFX(mask);}\r
+  GLEEPFNGLTBUFFERMASK3DFXPROC GLeeFuncPtr_glTbufferMask3DFX=GLee_Lazy_glTbufferMask3DFX;\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_multisample */\r
+\r
+#ifdef __GLEE_GL_EXT_multisample\r
+#ifndef GLEE_C_DEFINED_glSampleMaskEXT\r
+#define GLEE_C_DEFINED_glSampleMaskEXT\r
+  void __stdcall GLee_Lazy_glSampleMaskEXT(GLclampf value, GLboolean invert)  {if (GLeeInit()) glSampleMaskEXT(value, invert);}\r
+  GLEEPFNGLSAMPLEMASKEXTPROC GLeeFuncPtr_glSampleMaskEXT=GLee_Lazy_glSampleMaskEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glSamplePatternEXT\r
+#define GLEE_C_DEFINED_glSamplePatternEXT\r
+  void __stdcall GLee_Lazy_glSamplePatternEXT(GLenum pattern)  {if (GLeeInit()) glSamplePatternEXT(pattern);}\r
+  GLEEPFNGLSAMPLEPATTERNEXTPROC GLeeFuncPtr_glSamplePatternEXT=GLee_Lazy_glSamplePatternEXT;\r
+#endif\r
+#endif \r
+\r
+/* GL_SGIX_vertex_preclip */\r
+\r
+#ifdef __GLEE_GL_SGIX_vertex_preclip\r
+#endif \r
+\r
+/* GL_SGIX_convolution_accuracy */\r
+\r
+#ifdef __GLEE_GL_SGIX_convolution_accuracy\r
+#endif \r
+\r
+/* GL_SGIX_resample */\r
+\r
+#ifdef __GLEE_GL_SGIX_resample\r
+#endif \r
+\r
+/* GL_SGIS_point_line_texgen */\r
+\r
+#ifdef __GLEE_GL_SGIS_point_line_texgen\r
+#endif \r
+\r
+/* GL_SGIS_texture_color_mask */\r
+\r
+#ifdef __GLEE_GL_SGIS_texture_color_mask\r
+#ifndef GLEE_C_DEFINED_glTextureColorMaskSGIS\r
+#define GLEE_C_DEFINED_glTextureColorMaskSGIS\r
+  void __stdcall GLee_Lazy_glTextureColorMaskSGIS(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)  {if (GLeeInit()) glTextureColorMaskSGIS(red, green, blue, alpha);}\r
+  GLEEPFNGLTEXTURECOLORMASKSGISPROC GLeeFuncPtr_glTextureColorMaskSGIS=GLee_Lazy_glTextureColorMaskSGIS;\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_texture_env_dot3 */\r
+\r
+#ifdef __GLEE_GL_EXT_texture_env_dot3\r
+#endif \r
+\r
+/* GL_ATI_texture_mirror_once */\r
+\r
+#ifdef __GLEE_GL_ATI_texture_mirror_once\r
+#endif \r
+\r
+/* GL_NV_fence */\r
+\r
+#ifdef __GLEE_GL_NV_fence\r
+#ifndef GLEE_C_DEFINED_glDeleteFencesNV\r
+#define GLEE_C_DEFINED_glDeleteFencesNV\r
+  void __stdcall GLee_Lazy_glDeleteFencesNV(GLsizei n, const GLuint * fences)  {if (GLeeInit()) glDeleteFencesNV(n, fences);}\r
+  GLEEPFNGLDELETEFENCESNVPROC GLeeFuncPtr_glDeleteFencesNV=GLee_Lazy_glDeleteFencesNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGenFencesNV\r
+#define GLEE_C_DEFINED_glGenFencesNV\r
+  void __stdcall GLee_Lazy_glGenFencesNV(GLsizei n, GLuint * fences)  {if (GLeeInit()) glGenFencesNV(n, fences);}\r
+  GLEEPFNGLGENFENCESNVPROC GLeeFuncPtr_glGenFencesNV=GLee_Lazy_glGenFencesNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glIsFenceNV\r
+#define GLEE_C_DEFINED_glIsFenceNV\r
+  GLboolean __stdcall GLee_Lazy_glIsFenceNV(GLuint fence)  {if (GLeeInit()) return glIsFenceNV(fence); return (GLboolean)0;}\r
+  GLEEPFNGLISFENCENVPROC GLeeFuncPtr_glIsFenceNV=GLee_Lazy_glIsFenceNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTestFenceNV\r
+#define GLEE_C_DEFINED_glTestFenceNV\r
+  GLboolean __stdcall GLee_Lazy_glTestFenceNV(GLuint fence)  {if (GLeeInit()) return glTestFenceNV(fence); return (GLboolean)0;}\r
+  GLEEPFNGLTESTFENCENVPROC GLeeFuncPtr_glTestFenceNV=GLee_Lazy_glTestFenceNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetFenceivNV\r
+#define GLEE_C_DEFINED_glGetFenceivNV\r
+  void __stdcall GLee_Lazy_glGetFenceivNV(GLuint fence, GLenum pname, GLint * params)  {if (GLeeInit()) glGetFenceivNV(fence, pname, params);}\r
+  GLEEPFNGLGETFENCEIVNVPROC GLeeFuncPtr_glGetFenceivNV=GLee_Lazy_glGetFenceivNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFinishFenceNV\r
+#define GLEE_C_DEFINED_glFinishFenceNV\r
+  void __stdcall GLee_Lazy_glFinishFenceNV(GLuint fence)  {if (GLeeInit()) glFinishFenceNV(fence);}\r
+  GLEEPFNGLFINISHFENCENVPROC GLeeFuncPtr_glFinishFenceNV=GLee_Lazy_glFinishFenceNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glSetFenceNV\r
+#define GLEE_C_DEFINED_glSetFenceNV\r
+  void __stdcall GLee_Lazy_glSetFenceNV(GLuint fence, GLenum condition)  {if (GLeeInit()) glSetFenceNV(fence, condition);}\r
+  GLEEPFNGLSETFENCENVPROC GLeeFuncPtr_glSetFenceNV=GLee_Lazy_glSetFenceNV;\r
+#endif\r
+#endif \r
+\r
+/* GL_IBM_texture_mirrored_repeat */\r
+\r
+#ifdef __GLEE_GL_IBM_texture_mirrored_repeat\r
+#endif \r
+\r
+/* GL_NV_evaluators */\r
+\r
+#ifdef __GLEE_GL_NV_evaluators\r
+#ifndef GLEE_C_DEFINED_glMapControlPointsNV\r
+#define GLEE_C_DEFINED_glMapControlPointsNV\r
+  void __stdcall GLee_Lazy_glMapControlPointsNV(GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const GLvoid * points)  {if (GLeeInit()) glMapControlPointsNV(target, index, type, ustride, vstride, uorder, vorder, packed, points);}\r
+  GLEEPFNGLMAPCONTROLPOINTSNVPROC GLeeFuncPtr_glMapControlPointsNV=GLee_Lazy_glMapControlPointsNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMapParameterivNV\r
+#define GLEE_C_DEFINED_glMapParameterivNV\r
+  void __stdcall GLee_Lazy_glMapParameterivNV(GLenum target, GLenum pname, const GLint * params)  {if (GLeeInit()) glMapParameterivNV(target, pname, params);}\r
+  GLEEPFNGLMAPPARAMETERIVNVPROC GLeeFuncPtr_glMapParameterivNV=GLee_Lazy_glMapParameterivNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMapParameterfvNV\r
+#define GLEE_C_DEFINED_glMapParameterfvNV\r
+  void __stdcall GLee_Lazy_glMapParameterfvNV(GLenum target, GLenum pname, const GLfloat * params)  {if (GLeeInit()) glMapParameterfvNV(target, pname, params);}\r
+  GLEEPFNGLMAPPARAMETERFVNVPROC GLeeFuncPtr_glMapParameterfvNV=GLee_Lazy_glMapParameterfvNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetMapControlPointsNV\r
+#define GLEE_C_DEFINED_glGetMapControlPointsNV\r
+  void __stdcall GLee_Lazy_glGetMapControlPointsNV(GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, GLvoid * points)  {if (GLeeInit()) glGetMapControlPointsNV(target, index, type, ustride, vstride, packed, points);}\r
+  GLEEPFNGLGETMAPCONTROLPOINTSNVPROC GLeeFuncPtr_glGetMapControlPointsNV=GLee_Lazy_glGetMapControlPointsNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetMapParameterivNV\r
+#define GLEE_C_DEFINED_glGetMapParameterivNV\r
+  void __stdcall GLee_Lazy_glGetMapParameterivNV(GLenum target, GLenum pname, GLint * params)  {if (GLeeInit()) glGetMapParameterivNV(target, pname, params);}\r
+  GLEEPFNGLGETMAPPARAMETERIVNVPROC GLeeFuncPtr_glGetMapParameterivNV=GLee_Lazy_glGetMapParameterivNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetMapParameterfvNV\r
+#define GLEE_C_DEFINED_glGetMapParameterfvNV\r
+  void __stdcall GLee_Lazy_glGetMapParameterfvNV(GLenum target, GLenum pname, GLfloat * params)  {if (GLeeInit()) glGetMapParameterfvNV(target, pname, params);}\r
+  GLEEPFNGLGETMAPPARAMETERFVNVPROC GLeeFuncPtr_glGetMapParameterfvNV=GLee_Lazy_glGetMapParameterfvNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetMapAttribParameterivNV\r
+#define GLEE_C_DEFINED_glGetMapAttribParameterivNV\r
+  void __stdcall GLee_Lazy_glGetMapAttribParameterivNV(GLenum target, GLuint index, GLenum pname, GLint * params)  {if (GLeeInit()) glGetMapAttribParameterivNV(target, index, pname, params);}\r
+  GLEEPFNGLGETMAPATTRIBPARAMETERIVNVPROC GLeeFuncPtr_glGetMapAttribParameterivNV=GLee_Lazy_glGetMapAttribParameterivNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetMapAttribParameterfvNV\r
+#define GLEE_C_DEFINED_glGetMapAttribParameterfvNV\r
+  void __stdcall GLee_Lazy_glGetMapAttribParameterfvNV(GLenum target, GLuint index, GLenum pname, GLfloat * params)  {if (GLeeInit()) glGetMapAttribParameterfvNV(target, index, pname, params);}\r
+  GLEEPFNGLGETMAPATTRIBPARAMETERFVNVPROC GLeeFuncPtr_glGetMapAttribParameterfvNV=GLee_Lazy_glGetMapAttribParameterfvNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glEvalMapsNV\r
+#define GLEE_C_DEFINED_glEvalMapsNV\r
+  void __stdcall GLee_Lazy_glEvalMapsNV(GLenum target, GLenum mode)  {if (GLeeInit()) glEvalMapsNV(target, mode);}\r
+  GLEEPFNGLEVALMAPSNVPROC GLeeFuncPtr_glEvalMapsNV=GLee_Lazy_glEvalMapsNV;\r
+#endif\r
+#endif \r
+\r
+/* GL_NV_packed_depth_stencil */\r
+\r
+#ifdef __GLEE_GL_NV_packed_depth_stencil\r
+#endif \r
+\r
+/* GL_NV_register_combiners2 */\r
+\r
+#ifdef __GLEE_GL_NV_register_combiners2\r
+#ifndef GLEE_C_DEFINED_glCombinerStageParameterfvNV\r
+#define GLEE_C_DEFINED_glCombinerStageParameterfvNV\r
+  void __stdcall GLee_Lazy_glCombinerStageParameterfvNV(GLenum stage, GLenum pname, const GLfloat * params)  {if (GLeeInit()) glCombinerStageParameterfvNV(stage, pname, params);}\r
+  GLEEPFNGLCOMBINERSTAGEPARAMETERFVNVPROC GLeeFuncPtr_glCombinerStageParameterfvNV=GLee_Lazy_glCombinerStageParameterfvNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetCombinerStageParameterfvNV\r
+#define GLEE_C_DEFINED_glGetCombinerStageParameterfvNV\r
+  void __stdcall GLee_Lazy_glGetCombinerStageParameterfvNV(GLenum stage, GLenum pname, GLfloat * params)  {if (GLeeInit()) glGetCombinerStageParameterfvNV(stage, pname, params);}\r
+  GLEEPFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC GLeeFuncPtr_glGetCombinerStageParameterfvNV=GLee_Lazy_glGetCombinerStageParameterfvNV;\r
+#endif\r
+#endif \r
+\r
+/* GL_NV_texture_compression_vtc */\r
+\r
+#ifdef __GLEE_GL_NV_texture_compression_vtc\r
+#endif \r
+\r
+/* GL_NV_texture_rectangle */\r
+\r
+#ifdef __GLEE_GL_NV_texture_rectangle\r
+#endif \r
+\r
+/* GL_NV_texture_shader */\r
+\r
+#ifdef __GLEE_GL_NV_texture_shader\r
+#endif \r
+\r
+/* GL_NV_texture_shader2 */\r
+\r
+#ifdef __GLEE_GL_NV_texture_shader2\r
+#endif \r
+\r
+/* GL_NV_vertex_array_range2 */\r
+\r
+#ifdef __GLEE_GL_NV_vertex_array_range2\r
+#endif \r
+\r
+/* GL_NV_vertex_program */\r
+\r
+#ifdef __GLEE_GL_NV_vertex_program\r
+#ifndef GLEE_C_DEFINED_glAreProgramsResidentNV\r
+#define GLEE_C_DEFINED_glAreProgramsResidentNV\r
+  GLboolean __stdcall GLee_Lazy_glAreProgramsResidentNV(GLsizei n, const GLuint * programs, GLboolean * residences)  {if (GLeeInit()) return glAreProgramsResidentNV(n, programs, residences); return (GLboolean)0;}\r
+  GLEEPFNGLAREPROGRAMSRESIDENTNVPROC GLeeFuncPtr_glAreProgramsResidentNV=GLee_Lazy_glAreProgramsResidentNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glBindProgramNV\r
+#define GLEE_C_DEFINED_glBindProgramNV\r
+  void __stdcall GLee_Lazy_glBindProgramNV(GLenum target, GLuint id)  {if (GLeeInit()) glBindProgramNV(target, id);}\r
+  GLEEPFNGLBINDPROGRAMNVPROC GLeeFuncPtr_glBindProgramNV=GLee_Lazy_glBindProgramNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glDeleteProgramsNV\r
+#define GLEE_C_DEFINED_glDeleteProgramsNV\r
+  void __stdcall GLee_Lazy_glDeleteProgramsNV(GLsizei n, const GLuint * programs)  {if (GLeeInit()) glDeleteProgramsNV(n, programs);}\r
+  GLEEPFNGLDELETEPROGRAMSNVPROC GLeeFuncPtr_glDeleteProgramsNV=GLee_Lazy_glDeleteProgramsNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glExecuteProgramNV\r
+#define GLEE_C_DEFINED_glExecuteProgramNV\r
+  void __stdcall GLee_Lazy_glExecuteProgramNV(GLenum target, GLuint id, const GLfloat * params)  {if (GLeeInit()) glExecuteProgramNV(target, id, params);}\r
+  GLEEPFNGLEXECUTEPROGRAMNVPROC GLeeFuncPtr_glExecuteProgramNV=GLee_Lazy_glExecuteProgramNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGenProgramsNV\r
+#define GLEE_C_DEFINED_glGenProgramsNV\r
+  void __stdcall GLee_Lazy_glGenProgramsNV(GLsizei n, GLuint * programs)  {if (GLeeInit()) glGenProgramsNV(n, programs);}\r
+  GLEEPFNGLGENPROGRAMSNVPROC GLeeFuncPtr_glGenProgramsNV=GLee_Lazy_glGenProgramsNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetProgramParameterdvNV\r
+#define GLEE_C_DEFINED_glGetProgramParameterdvNV\r
+  void __stdcall GLee_Lazy_glGetProgramParameterdvNV(GLenum target, GLuint index, GLenum pname, GLdouble * params)  {if (GLeeInit()) glGetProgramParameterdvNV(target, index, pname, params);}\r
+  GLEEPFNGLGETPROGRAMPARAMETERDVNVPROC GLeeFuncPtr_glGetProgramParameterdvNV=GLee_Lazy_glGetProgramParameterdvNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetProgramParameterfvNV\r
+#define GLEE_C_DEFINED_glGetProgramParameterfvNV\r
+  void __stdcall GLee_Lazy_glGetProgramParameterfvNV(GLenum target, GLuint index, GLenum pname, GLfloat * params)  {if (GLeeInit()) glGetProgramParameterfvNV(target, index, pname, params);}\r
+  GLEEPFNGLGETPROGRAMPARAMETERFVNVPROC GLeeFuncPtr_glGetProgramParameterfvNV=GLee_Lazy_glGetProgramParameterfvNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetProgramivNV\r
+#define GLEE_C_DEFINED_glGetProgramivNV\r
+  void __stdcall GLee_Lazy_glGetProgramivNV(GLuint id, GLenum pname, GLint * params)  {if (GLeeInit()) glGetProgramivNV(id, pname, params);}\r
+  GLEEPFNGLGETPROGRAMIVNVPROC GLeeFuncPtr_glGetProgramivNV=GLee_Lazy_glGetProgramivNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetProgramStringNV\r
+#define GLEE_C_DEFINED_glGetProgramStringNV\r
+  void __stdcall GLee_Lazy_glGetProgramStringNV(GLuint id, GLenum pname, GLubyte * program)  {if (GLeeInit()) glGetProgramStringNV(id, pname, program);}\r
+  GLEEPFNGLGETPROGRAMSTRINGNVPROC GLeeFuncPtr_glGetProgramStringNV=GLee_Lazy_glGetProgramStringNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetTrackMatrixivNV\r
+#define GLEE_C_DEFINED_glGetTrackMatrixivNV\r
+  void __stdcall GLee_Lazy_glGetTrackMatrixivNV(GLenum target, GLuint address, GLenum pname, GLint * params)  {if (GLeeInit()) glGetTrackMatrixivNV(target, address, pname, params);}\r
+  GLEEPFNGLGETTRACKMATRIXIVNVPROC GLeeFuncPtr_glGetTrackMatrixivNV=GLee_Lazy_glGetTrackMatrixivNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetVertexAttribdvNV\r
+#define GLEE_C_DEFINED_glGetVertexAttribdvNV\r
+  void __stdcall GLee_Lazy_glGetVertexAttribdvNV(GLuint index, GLenum pname, GLdouble * params)  {if (GLeeInit()) glGetVertexAttribdvNV(index, pname, params);}\r
+  GLEEPFNGLGETVERTEXATTRIBDVNVPROC GLeeFuncPtr_glGetVertexAttribdvNV=GLee_Lazy_glGetVertexAttribdvNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetVertexAttribfvNV\r
+#define GLEE_C_DEFINED_glGetVertexAttribfvNV\r
+  void __stdcall GLee_Lazy_glGetVertexAttribfvNV(GLuint index, GLenum pname, GLfloat * params)  {if (GLeeInit()) glGetVertexAttribfvNV(index, pname, params);}\r
+  GLEEPFNGLGETVERTEXATTRIBFVNVPROC GLeeFuncPtr_glGetVertexAttribfvNV=GLee_Lazy_glGetVertexAttribfvNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetVertexAttribivNV\r
+#define GLEE_C_DEFINED_glGetVertexAttribivNV\r
+  void __stdcall GLee_Lazy_glGetVertexAttribivNV(GLuint index, GLenum pname, GLint * params)  {if (GLeeInit()) glGetVertexAttribivNV(index, pname, params);}\r
+  GLEEPFNGLGETVERTEXATTRIBIVNVPROC GLeeFuncPtr_glGetVertexAttribivNV=GLee_Lazy_glGetVertexAttribivNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetVertexAttribPointervNV\r
+#define GLEE_C_DEFINED_glGetVertexAttribPointervNV\r
+  void __stdcall GLee_Lazy_glGetVertexAttribPointervNV(GLuint index, GLenum pname, GLvoid* * pointer)  {if (GLeeInit()) glGetVertexAttribPointervNV(index, pname, pointer);}\r
+  GLEEPFNGLGETVERTEXATTRIBPOINTERVNVPROC GLeeFuncPtr_glGetVertexAttribPointervNV=GLee_Lazy_glGetVertexAttribPointervNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glIsProgramNV\r
+#define GLEE_C_DEFINED_glIsProgramNV\r
+  GLboolean __stdcall GLee_Lazy_glIsProgramNV(GLuint id)  {if (GLeeInit()) return glIsProgramNV(id); return (GLboolean)0;}\r
+  GLEEPFNGLISPROGRAMNVPROC GLeeFuncPtr_glIsProgramNV=GLee_Lazy_glIsProgramNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glLoadProgramNV\r
+#define GLEE_C_DEFINED_glLoadProgramNV\r
+  void __stdcall GLee_Lazy_glLoadProgramNV(GLenum target, GLuint id, GLsizei len, const GLubyte * program)  {if (GLeeInit()) glLoadProgramNV(target, id, len, program);}\r
+  GLEEPFNGLLOADPROGRAMNVPROC GLeeFuncPtr_glLoadProgramNV=GLee_Lazy_glLoadProgramNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramParameter4dNV\r
+#define GLEE_C_DEFINED_glProgramParameter4dNV\r
+  void __stdcall GLee_Lazy_glProgramParameter4dNV(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)  {if (GLeeInit()) glProgramParameter4dNV(target, index, x, y, z, w);}\r
+  GLEEPFNGLPROGRAMPARAMETER4DNVPROC GLeeFuncPtr_glProgramParameter4dNV=GLee_Lazy_glProgramParameter4dNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramParameter4dvNV\r
+#define GLEE_C_DEFINED_glProgramParameter4dvNV\r
+  void __stdcall GLee_Lazy_glProgramParameter4dvNV(GLenum target, GLuint index, const GLdouble * v)  {if (GLeeInit()) glProgramParameter4dvNV(target, index, v);}\r
+  GLEEPFNGLPROGRAMPARAMETER4DVNVPROC GLeeFuncPtr_glProgramParameter4dvNV=GLee_Lazy_glProgramParameter4dvNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramParameter4fNV\r
+#define GLEE_C_DEFINED_glProgramParameter4fNV\r
+  void __stdcall GLee_Lazy_glProgramParameter4fNV(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)  {if (GLeeInit()) glProgramParameter4fNV(target, index, x, y, z, w);}\r
+  GLEEPFNGLPROGRAMPARAMETER4FNVPROC GLeeFuncPtr_glProgramParameter4fNV=GLee_Lazy_glProgramParameter4fNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramParameter4fvNV\r
+#define GLEE_C_DEFINED_glProgramParameter4fvNV\r
+  void __stdcall GLee_Lazy_glProgramParameter4fvNV(GLenum target, GLuint index, const GLfloat * v)  {if (GLeeInit()) glProgramParameter4fvNV(target, index, v);}\r
+  GLEEPFNGLPROGRAMPARAMETER4FVNVPROC GLeeFuncPtr_glProgramParameter4fvNV=GLee_Lazy_glProgramParameter4fvNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramParameters4dvNV\r
+#define GLEE_C_DEFINED_glProgramParameters4dvNV\r
+  void __stdcall GLee_Lazy_glProgramParameters4dvNV(GLenum target, GLuint index, GLuint count, const GLdouble * v)  {if (GLeeInit()) glProgramParameters4dvNV(target, index, count, v);}\r
+  GLEEPFNGLPROGRAMPARAMETERS4DVNVPROC GLeeFuncPtr_glProgramParameters4dvNV=GLee_Lazy_glProgramParameters4dvNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramParameters4fvNV\r
+#define GLEE_C_DEFINED_glProgramParameters4fvNV\r
+  void __stdcall GLee_Lazy_glProgramParameters4fvNV(GLenum target, GLuint index, GLuint count, const GLfloat * v)  {if (GLeeInit()) glProgramParameters4fvNV(target, index, count, v);}\r
+  GLEEPFNGLPROGRAMPARAMETERS4FVNVPROC GLeeFuncPtr_glProgramParameters4fvNV=GLee_Lazy_glProgramParameters4fvNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glRequestResidentProgramsNV\r
+#define GLEE_C_DEFINED_glRequestResidentProgramsNV\r
+  void __stdcall GLee_Lazy_glRequestResidentProgramsNV(GLsizei n, const GLuint * programs)  {if (GLeeInit()) glRequestResidentProgramsNV(n, programs);}\r
+  GLEEPFNGLREQUESTRESIDENTPROGRAMSNVPROC GLeeFuncPtr_glRequestResidentProgramsNV=GLee_Lazy_glRequestResidentProgramsNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTrackMatrixNV\r
+#define GLEE_C_DEFINED_glTrackMatrixNV\r
+  void __stdcall GLee_Lazy_glTrackMatrixNV(GLenum target, GLuint address, GLenum matrix, GLenum transform)  {if (GLeeInit()) glTrackMatrixNV(target, address, matrix, transform);}\r
+  GLEEPFNGLTRACKMATRIXNVPROC GLeeFuncPtr_glTrackMatrixNV=GLee_Lazy_glTrackMatrixNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttribPointerNV\r
+#define GLEE_C_DEFINED_glVertexAttribPointerNV\r
+  void __stdcall GLee_Lazy_glVertexAttribPointerNV(GLuint index, GLint fsize, GLenum type, GLsizei stride, const GLvoid * pointer)  {if (GLeeInit()) glVertexAttribPointerNV(index, fsize, type, stride, pointer);}\r
+  GLEEPFNGLVERTEXATTRIBPOINTERNVPROC GLeeFuncPtr_glVertexAttribPointerNV=GLee_Lazy_glVertexAttribPointerNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib1dNV\r
+#define GLEE_C_DEFINED_glVertexAttrib1dNV\r
+  void __stdcall GLee_Lazy_glVertexAttrib1dNV(GLuint index, GLdouble x)  {if (GLeeInit()) glVertexAttrib1dNV(index, x);}\r
+  GLEEPFNGLVERTEXATTRIB1DNVPROC GLeeFuncPtr_glVertexAttrib1dNV=GLee_Lazy_glVertexAttrib1dNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib1dvNV\r
+#define GLEE_C_DEFINED_glVertexAttrib1dvNV\r
+  void __stdcall GLee_Lazy_glVertexAttrib1dvNV(GLuint index, const GLdouble * v)  {if (GLeeInit()) glVertexAttrib1dvNV(index, v);}\r
+  GLEEPFNGLVERTEXATTRIB1DVNVPROC GLeeFuncPtr_glVertexAttrib1dvNV=GLee_Lazy_glVertexAttrib1dvNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib1fNV\r
+#define GLEE_C_DEFINED_glVertexAttrib1fNV\r
+  void __stdcall GLee_Lazy_glVertexAttrib1fNV(GLuint index, GLfloat x)  {if (GLeeInit()) glVertexAttrib1fNV(index, x);}\r
+  GLEEPFNGLVERTEXATTRIB1FNVPROC GLeeFuncPtr_glVertexAttrib1fNV=GLee_Lazy_glVertexAttrib1fNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib1fvNV\r
+#define GLEE_C_DEFINED_glVertexAttrib1fvNV\r
+  void __stdcall GLee_Lazy_glVertexAttrib1fvNV(GLuint index, const GLfloat * v)  {if (GLeeInit()) glVertexAttrib1fvNV(index, v);}\r
+  GLEEPFNGLVERTEXATTRIB1FVNVPROC GLeeFuncPtr_glVertexAttrib1fvNV=GLee_Lazy_glVertexAttrib1fvNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib1sNV\r
+#define GLEE_C_DEFINED_glVertexAttrib1sNV\r
+  void __stdcall GLee_Lazy_glVertexAttrib1sNV(GLuint index, GLshort x)  {if (GLeeInit()) glVertexAttrib1sNV(index, x);}\r
+  GLEEPFNGLVERTEXATTRIB1SNVPROC GLeeFuncPtr_glVertexAttrib1sNV=GLee_Lazy_glVertexAttrib1sNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib1svNV\r
+#define GLEE_C_DEFINED_glVertexAttrib1svNV\r
+  void __stdcall GLee_Lazy_glVertexAttrib1svNV(GLuint index, const GLshort * v)  {if (GLeeInit()) glVertexAttrib1svNV(index, v);}\r
+  GLEEPFNGLVERTEXATTRIB1SVNVPROC GLeeFuncPtr_glVertexAttrib1svNV=GLee_Lazy_glVertexAttrib1svNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib2dNV\r
+#define GLEE_C_DEFINED_glVertexAttrib2dNV\r
+  void __stdcall GLee_Lazy_glVertexAttrib2dNV(GLuint index, GLdouble x, GLdouble y)  {if (GLeeInit()) glVertexAttrib2dNV(index, x, y);}\r
+  GLEEPFNGLVERTEXATTRIB2DNVPROC GLeeFuncPtr_glVertexAttrib2dNV=GLee_Lazy_glVertexAttrib2dNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib2dvNV\r
+#define GLEE_C_DEFINED_glVertexAttrib2dvNV\r
+  void __stdcall GLee_Lazy_glVertexAttrib2dvNV(GLuint index, const GLdouble * v)  {if (GLeeInit()) glVertexAttrib2dvNV(index, v);}\r
+  GLEEPFNGLVERTEXATTRIB2DVNVPROC GLeeFuncPtr_glVertexAttrib2dvNV=GLee_Lazy_glVertexAttrib2dvNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib2fNV\r
+#define GLEE_C_DEFINED_glVertexAttrib2fNV\r
+  void __stdcall GLee_Lazy_glVertexAttrib2fNV(GLuint index, GLfloat x, GLfloat y)  {if (GLeeInit()) glVertexAttrib2fNV(index, x, y);}\r
+  GLEEPFNGLVERTEXATTRIB2FNVPROC GLeeFuncPtr_glVertexAttrib2fNV=GLee_Lazy_glVertexAttrib2fNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib2fvNV\r
+#define GLEE_C_DEFINED_glVertexAttrib2fvNV\r
+  void __stdcall GLee_Lazy_glVertexAttrib2fvNV(GLuint index, const GLfloat * v)  {if (GLeeInit()) glVertexAttrib2fvNV(index, v);}\r
+  GLEEPFNGLVERTEXATTRIB2FVNVPROC GLeeFuncPtr_glVertexAttrib2fvNV=GLee_Lazy_glVertexAttrib2fvNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib2sNV\r
+#define GLEE_C_DEFINED_glVertexAttrib2sNV\r
+  void __stdcall GLee_Lazy_glVertexAttrib2sNV(GLuint index, GLshort x, GLshort y)  {if (GLeeInit()) glVertexAttrib2sNV(index, x, y);}\r
+  GLEEPFNGLVERTEXATTRIB2SNVPROC GLeeFuncPtr_glVertexAttrib2sNV=GLee_Lazy_glVertexAttrib2sNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib2svNV\r
+#define GLEE_C_DEFINED_glVertexAttrib2svNV\r
+  void __stdcall GLee_Lazy_glVertexAttrib2svNV(GLuint index, const GLshort * v)  {if (GLeeInit()) glVertexAttrib2svNV(index, v);}\r
+  GLEEPFNGLVERTEXATTRIB2SVNVPROC GLeeFuncPtr_glVertexAttrib2svNV=GLee_Lazy_glVertexAttrib2svNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib3dNV\r
+#define GLEE_C_DEFINED_glVertexAttrib3dNV\r
+  void __stdcall GLee_Lazy_glVertexAttrib3dNV(GLuint index, GLdouble x, GLdouble y, GLdouble z)  {if (GLeeInit()) glVertexAttrib3dNV(index, x, y, z);}\r
+  GLEEPFNGLVERTEXATTRIB3DNVPROC GLeeFuncPtr_glVertexAttrib3dNV=GLee_Lazy_glVertexAttrib3dNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib3dvNV\r
+#define GLEE_C_DEFINED_glVertexAttrib3dvNV\r
+  void __stdcall GLee_Lazy_glVertexAttrib3dvNV(GLuint index, const GLdouble * v)  {if (GLeeInit()) glVertexAttrib3dvNV(index, v);}\r
+  GLEEPFNGLVERTEXATTRIB3DVNVPROC GLeeFuncPtr_glVertexAttrib3dvNV=GLee_Lazy_glVertexAttrib3dvNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib3fNV\r
+#define GLEE_C_DEFINED_glVertexAttrib3fNV\r
+  void __stdcall GLee_Lazy_glVertexAttrib3fNV(GLuint index, GLfloat x, GLfloat y, GLfloat z)  {if (GLeeInit()) glVertexAttrib3fNV(index, x, y, z);}\r
+  GLEEPFNGLVERTEXATTRIB3FNVPROC GLeeFuncPtr_glVertexAttrib3fNV=GLee_Lazy_glVertexAttrib3fNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib3fvNV\r
+#define GLEE_C_DEFINED_glVertexAttrib3fvNV\r
+  void __stdcall GLee_Lazy_glVertexAttrib3fvNV(GLuint index, const GLfloat * v)  {if (GLeeInit()) glVertexAttrib3fvNV(index, v);}\r
+  GLEEPFNGLVERTEXATTRIB3FVNVPROC GLeeFuncPtr_glVertexAttrib3fvNV=GLee_Lazy_glVertexAttrib3fvNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib3sNV\r
+#define GLEE_C_DEFINED_glVertexAttrib3sNV\r
+  void __stdcall GLee_Lazy_glVertexAttrib3sNV(GLuint index, GLshort x, GLshort y, GLshort z)  {if (GLeeInit()) glVertexAttrib3sNV(index, x, y, z);}\r
+  GLEEPFNGLVERTEXATTRIB3SNVPROC GLeeFuncPtr_glVertexAttrib3sNV=GLee_Lazy_glVertexAttrib3sNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib3svNV\r
+#define GLEE_C_DEFINED_glVertexAttrib3svNV\r
+  void __stdcall GLee_Lazy_glVertexAttrib3svNV(GLuint index, const GLshort * v)  {if (GLeeInit()) glVertexAttrib3svNV(index, v);}\r
+  GLEEPFNGLVERTEXATTRIB3SVNVPROC GLeeFuncPtr_glVertexAttrib3svNV=GLee_Lazy_glVertexAttrib3svNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib4dNV\r
+#define GLEE_C_DEFINED_glVertexAttrib4dNV\r
+  void __stdcall GLee_Lazy_glVertexAttrib4dNV(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)  {if (GLeeInit()) glVertexAttrib4dNV(index, x, y, z, w);}\r
+  GLEEPFNGLVERTEXATTRIB4DNVPROC GLeeFuncPtr_glVertexAttrib4dNV=GLee_Lazy_glVertexAttrib4dNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib4dvNV\r
+#define GLEE_C_DEFINED_glVertexAttrib4dvNV\r
+  void __stdcall GLee_Lazy_glVertexAttrib4dvNV(GLuint index, const GLdouble * v)  {if (GLeeInit()) glVertexAttrib4dvNV(index, v);}\r
+  GLEEPFNGLVERTEXATTRIB4DVNVPROC GLeeFuncPtr_glVertexAttrib4dvNV=GLee_Lazy_glVertexAttrib4dvNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib4fNV\r
+#define GLEE_C_DEFINED_glVertexAttrib4fNV\r
+  void __stdcall GLee_Lazy_glVertexAttrib4fNV(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)  {if (GLeeInit()) glVertexAttrib4fNV(index, x, y, z, w);}\r
+  GLEEPFNGLVERTEXATTRIB4FNVPROC GLeeFuncPtr_glVertexAttrib4fNV=GLee_Lazy_glVertexAttrib4fNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib4fvNV\r
+#define GLEE_C_DEFINED_glVertexAttrib4fvNV\r
+  void __stdcall GLee_Lazy_glVertexAttrib4fvNV(GLuint index, const GLfloat * v)  {if (GLeeInit()) glVertexAttrib4fvNV(index, v);}\r
+  GLEEPFNGLVERTEXATTRIB4FVNVPROC GLeeFuncPtr_glVertexAttrib4fvNV=GLee_Lazy_glVertexAttrib4fvNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib4sNV\r
+#define GLEE_C_DEFINED_glVertexAttrib4sNV\r
+  void __stdcall GLee_Lazy_glVertexAttrib4sNV(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w)  {if (GLeeInit()) glVertexAttrib4sNV(index, x, y, z, w);}\r
+  GLEEPFNGLVERTEXATTRIB4SNVPROC GLeeFuncPtr_glVertexAttrib4sNV=GLee_Lazy_glVertexAttrib4sNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib4svNV\r
+#define GLEE_C_DEFINED_glVertexAttrib4svNV\r
+  void __stdcall GLee_Lazy_glVertexAttrib4svNV(GLuint index, const GLshort * v)  {if (GLeeInit()) glVertexAttrib4svNV(index, v);}\r
+  GLEEPFNGLVERTEXATTRIB4SVNVPROC GLeeFuncPtr_glVertexAttrib4svNV=GLee_Lazy_glVertexAttrib4svNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib4ubNV\r
+#define GLEE_C_DEFINED_glVertexAttrib4ubNV\r
+  void __stdcall GLee_Lazy_glVertexAttrib4ubNV(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w)  {if (GLeeInit()) glVertexAttrib4ubNV(index, x, y, z, w);}\r
+  GLEEPFNGLVERTEXATTRIB4UBNVPROC GLeeFuncPtr_glVertexAttrib4ubNV=GLee_Lazy_glVertexAttrib4ubNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib4ubvNV\r
+#define GLEE_C_DEFINED_glVertexAttrib4ubvNV\r
+  void __stdcall GLee_Lazy_glVertexAttrib4ubvNV(GLuint index, const GLubyte * v)  {if (GLeeInit()) glVertexAttrib4ubvNV(index, v);}\r
+  GLEEPFNGLVERTEXATTRIB4UBVNVPROC GLeeFuncPtr_glVertexAttrib4ubvNV=GLee_Lazy_glVertexAttrib4ubvNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttribs1dvNV\r
+#define GLEE_C_DEFINED_glVertexAttribs1dvNV\r
+  void __stdcall GLee_Lazy_glVertexAttribs1dvNV(GLuint index, GLsizei count, const GLdouble * v)  {if (GLeeInit()) glVertexAttribs1dvNV(index, count, v);}\r
+  GLEEPFNGLVERTEXATTRIBS1DVNVPROC GLeeFuncPtr_glVertexAttribs1dvNV=GLee_Lazy_glVertexAttribs1dvNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttribs1fvNV\r
+#define GLEE_C_DEFINED_glVertexAttribs1fvNV\r
+  void __stdcall GLee_Lazy_glVertexAttribs1fvNV(GLuint index, GLsizei count, const GLfloat * v)  {if (GLeeInit()) glVertexAttribs1fvNV(index, count, v);}\r
+  GLEEPFNGLVERTEXATTRIBS1FVNVPROC GLeeFuncPtr_glVertexAttribs1fvNV=GLee_Lazy_glVertexAttribs1fvNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttribs1svNV\r
+#define GLEE_C_DEFINED_glVertexAttribs1svNV\r
+  void __stdcall GLee_Lazy_glVertexAttribs1svNV(GLuint index, GLsizei count, const GLshort * v)  {if (GLeeInit()) glVertexAttribs1svNV(index, count, v);}\r
+  GLEEPFNGLVERTEXATTRIBS1SVNVPROC GLeeFuncPtr_glVertexAttribs1svNV=GLee_Lazy_glVertexAttribs1svNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttribs2dvNV\r
+#define GLEE_C_DEFINED_glVertexAttribs2dvNV\r
+  void __stdcall GLee_Lazy_glVertexAttribs2dvNV(GLuint index, GLsizei count, const GLdouble * v)  {if (GLeeInit()) glVertexAttribs2dvNV(index, count, v);}\r
+  GLEEPFNGLVERTEXATTRIBS2DVNVPROC GLeeFuncPtr_glVertexAttribs2dvNV=GLee_Lazy_glVertexAttribs2dvNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttribs2fvNV\r
+#define GLEE_C_DEFINED_glVertexAttribs2fvNV\r
+  void __stdcall GLee_Lazy_glVertexAttribs2fvNV(GLuint index, GLsizei count, const GLfloat * v)  {if (GLeeInit()) glVertexAttribs2fvNV(index, count, v);}\r
+  GLEEPFNGLVERTEXATTRIBS2FVNVPROC GLeeFuncPtr_glVertexAttribs2fvNV=GLee_Lazy_glVertexAttribs2fvNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttribs2svNV\r
+#define GLEE_C_DEFINED_glVertexAttribs2svNV\r
+  void __stdcall GLee_Lazy_glVertexAttribs2svNV(GLuint index, GLsizei count, const GLshort * v)  {if (GLeeInit()) glVertexAttribs2svNV(index, count, v);}\r
+  GLEEPFNGLVERTEXATTRIBS2SVNVPROC GLeeFuncPtr_glVertexAttribs2svNV=GLee_Lazy_glVertexAttribs2svNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttribs3dvNV\r
+#define GLEE_C_DEFINED_glVertexAttribs3dvNV\r
+  void __stdcall GLee_Lazy_glVertexAttribs3dvNV(GLuint index, GLsizei count, const GLdouble * v)  {if (GLeeInit()) glVertexAttribs3dvNV(index, count, v);}\r
+  GLEEPFNGLVERTEXATTRIBS3DVNVPROC GLeeFuncPtr_glVertexAttribs3dvNV=GLee_Lazy_glVertexAttribs3dvNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttribs3fvNV\r
+#define GLEE_C_DEFINED_glVertexAttribs3fvNV\r
+  void __stdcall GLee_Lazy_glVertexAttribs3fvNV(GLuint index, GLsizei count, const GLfloat * v)  {if (GLeeInit()) glVertexAttribs3fvNV(index, count, v);}\r
+  GLEEPFNGLVERTEXATTRIBS3FVNVPROC GLeeFuncPtr_glVertexAttribs3fvNV=GLee_Lazy_glVertexAttribs3fvNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttribs3svNV\r
+#define GLEE_C_DEFINED_glVertexAttribs3svNV\r
+  void __stdcall GLee_Lazy_glVertexAttribs3svNV(GLuint index, GLsizei count, const GLshort * v)  {if (GLeeInit()) glVertexAttribs3svNV(index, count, v);}\r
+  GLEEPFNGLVERTEXATTRIBS3SVNVPROC GLeeFuncPtr_glVertexAttribs3svNV=GLee_Lazy_glVertexAttribs3svNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttribs4dvNV\r
+#define GLEE_C_DEFINED_glVertexAttribs4dvNV\r
+  void __stdcall GLee_Lazy_glVertexAttribs4dvNV(GLuint index, GLsizei count, const GLdouble * v)  {if (GLeeInit()) glVertexAttribs4dvNV(index, count, v);}\r
+  GLEEPFNGLVERTEXATTRIBS4DVNVPROC GLeeFuncPtr_glVertexAttribs4dvNV=GLee_Lazy_glVertexAttribs4dvNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttribs4fvNV\r
+#define GLEE_C_DEFINED_glVertexAttribs4fvNV\r
+  void __stdcall GLee_Lazy_glVertexAttribs4fvNV(GLuint index, GLsizei count, const GLfloat * v)  {if (GLeeInit()) glVertexAttribs4fvNV(index, count, v);}\r
+  GLEEPFNGLVERTEXATTRIBS4FVNVPROC GLeeFuncPtr_glVertexAttribs4fvNV=GLee_Lazy_glVertexAttribs4fvNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttribs4svNV\r
+#define GLEE_C_DEFINED_glVertexAttribs4svNV\r
+  void __stdcall GLee_Lazy_glVertexAttribs4svNV(GLuint index, GLsizei count, const GLshort * v)  {if (GLeeInit()) glVertexAttribs4svNV(index, count, v);}\r
+  GLEEPFNGLVERTEXATTRIBS4SVNVPROC GLeeFuncPtr_glVertexAttribs4svNV=GLee_Lazy_glVertexAttribs4svNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttribs4ubvNV\r
+#define GLEE_C_DEFINED_glVertexAttribs4ubvNV\r
+  void __stdcall GLee_Lazy_glVertexAttribs4ubvNV(GLuint index, GLsizei count, const GLubyte * v)  {if (GLeeInit()) glVertexAttribs4ubvNV(index, count, v);}\r
+  GLEEPFNGLVERTEXATTRIBS4UBVNVPROC GLeeFuncPtr_glVertexAttribs4ubvNV=GLee_Lazy_glVertexAttribs4ubvNV;\r
+#endif\r
+#endif \r
+\r
+/* GL_SGIX_texture_coordinate_clamp */\r
+\r
+#ifdef __GLEE_GL_SGIX_texture_coordinate_clamp\r
+#endif \r
+\r
+/* GL_SGIX_scalebias_hint */\r
+\r
+#ifdef __GLEE_GL_SGIX_scalebias_hint\r
+#endif \r
+\r
+/* GL_OML_interlace */\r
+\r
+#ifdef __GLEE_GL_OML_interlace\r
+#endif \r
+\r
+/* GL_OML_subsample */\r
+\r
+#ifdef __GLEE_GL_OML_subsample\r
+#endif \r
+\r
+/* GL_OML_resample */\r
+\r
+#ifdef __GLEE_GL_OML_resample\r
+#endif \r
+\r
+/* GL_NV_copy_depth_to_color */\r
+\r
+#ifdef __GLEE_GL_NV_copy_depth_to_color\r
+#endif \r
+\r
+/* GL_ATI_envmap_bumpmap */\r
+\r
+#ifdef __GLEE_GL_ATI_envmap_bumpmap\r
+#ifndef GLEE_C_DEFINED_glTexBumpParameterivATI\r
+#define GLEE_C_DEFINED_glTexBumpParameterivATI\r
+  void __stdcall GLee_Lazy_glTexBumpParameterivATI(GLenum pname, const GLint * param)  {if (GLeeInit()) glTexBumpParameterivATI(pname, param);}\r
+  GLEEPFNGLTEXBUMPPARAMETERIVATIPROC GLeeFuncPtr_glTexBumpParameterivATI=GLee_Lazy_glTexBumpParameterivATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTexBumpParameterfvATI\r
+#define GLEE_C_DEFINED_glTexBumpParameterfvATI\r
+  void __stdcall GLee_Lazy_glTexBumpParameterfvATI(GLenum pname, const GLfloat * param)  {if (GLeeInit()) glTexBumpParameterfvATI(pname, param);}\r
+  GLEEPFNGLTEXBUMPPARAMETERFVATIPROC GLeeFuncPtr_glTexBumpParameterfvATI=GLee_Lazy_glTexBumpParameterfvATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetTexBumpParameterivATI\r
+#define GLEE_C_DEFINED_glGetTexBumpParameterivATI\r
+  void __stdcall GLee_Lazy_glGetTexBumpParameterivATI(GLenum pname, GLint * param)  {if (GLeeInit()) glGetTexBumpParameterivATI(pname, param);}\r
+  GLEEPFNGLGETTEXBUMPPARAMETERIVATIPROC GLeeFuncPtr_glGetTexBumpParameterivATI=GLee_Lazy_glGetTexBumpParameterivATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetTexBumpParameterfvATI\r
+#define GLEE_C_DEFINED_glGetTexBumpParameterfvATI\r
+  void __stdcall GLee_Lazy_glGetTexBumpParameterfvATI(GLenum pname, GLfloat * param)  {if (GLeeInit()) glGetTexBumpParameterfvATI(pname, param);}\r
+  GLEEPFNGLGETTEXBUMPPARAMETERFVATIPROC GLeeFuncPtr_glGetTexBumpParameterfvATI=GLee_Lazy_glGetTexBumpParameterfvATI;\r
+#endif\r
+#endif \r
+\r
+/* GL_ATI_fragment_shader */\r
+\r
+#ifdef __GLEE_GL_ATI_fragment_shader\r
+#ifndef GLEE_C_DEFINED_glGenFragmentShadersATI\r
+#define GLEE_C_DEFINED_glGenFragmentShadersATI\r
+  GLuint __stdcall GLee_Lazy_glGenFragmentShadersATI(GLuint range)  {if (GLeeInit()) return glGenFragmentShadersATI(range); return (GLuint)0;}\r
+  GLEEPFNGLGENFRAGMENTSHADERSATIPROC GLeeFuncPtr_glGenFragmentShadersATI=GLee_Lazy_glGenFragmentShadersATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glBindFragmentShaderATI\r
+#define GLEE_C_DEFINED_glBindFragmentShaderATI\r
+  void __stdcall GLee_Lazy_glBindFragmentShaderATI(GLuint id)  {if (GLeeInit()) glBindFragmentShaderATI(id);}\r
+  GLEEPFNGLBINDFRAGMENTSHADERATIPROC GLeeFuncPtr_glBindFragmentShaderATI=GLee_Lazy_glBindFragmentShaderATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glDeleteFragmentShaderATI\r
+#define GLEE_C_DEFINED_glDeleteFragmentShaderATI\r
+  void __stdcall GLee_Lazy_glDeleteFragmentShaderATI(GLuint id)  {if (GLeeInit()) glDeleteFragmentShaderATI(id);}\r
+  GLEEPFNGLDELETEFRAGMENTSHADERATIPROC GLeeFuncPtr_glDeleteFragmentShaderATI=GLee_Lazy_glDeleteFragmentShaderATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glBeginFragmentShaderATI\r
+#define GLEE_C_DEFINED_glBeginFragmentShaderATI\r
+  void __stdcall GLee_Lazy_glBeginFragmentShaderATI(void)  {if (GLeeInit()) glBeginFragmentShaderATI();}\r
+  GLEEPFNGLBEGINFRAGMENTSHADERATIPROC GLeeFuncPtr_glBeginFragmentShaderATI=GLee_Lazy_glBeginFragmentShaderATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glEndFragmentShaderATI\r
+#define GLEE_C_DEFINED_glEndFragmentShaderATI\r
+  void __stdcall GLee_Lazy_glEndFragmentShaderATI(void)  {if (GLeeInit()) glEndFragmentShaderATI();}\r
+  GLEEPFNGLENDFRAGMENTSHADERATIPROC GLeeFuncPtr_glEndFragmentShaderATI=GLee_Lazy_glEndFragmentShaderATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glPassTexCoordATI\r
+#define GLEE_C_DEFINED_glPassTexCoordATI\r
+  void __stdcall GLee_Lazy_glPassTexCoordATI(GLuint dst, GLuint coord, GLenum swizzle)  {if (GLeeInit()) glPassTexCoordATI(dst, coord, swizzle);}\r
+  GLEEPFNGLPASSTEXCOORDATIPROC GLeeFuncPtr_glPassTexCoordATI=GLee_Lazy_glPassTexCoordATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glSampleMapATI\r
+#define GLEE_C_DEFINED_glSampleMapATI\r
+  void __stdcall GLee_Lazy_glSampleMapATI(GLuint dst, GLuint interp, GLenum swizzle)  {if (GLeeInit()) glSampleMapATI(dst, interp, swizzle);}\r
+  GLEEPFNGLSAMPLEMAPATIPROC GLeeFuncPtr_glSampleMapATI=GLee_Lazy_glSampleMapATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glColorFragmentOp1ATI\r
+#define GLEE_C_DEFINED_glColorFragmentOp1ATI\r
+  void __stdcall GLee_Lazy_glColorFragmentOp1ATI(GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod)  {if (GLeeInit()) glColorFragmentOp1ATI(op, dst, dstMask, dstMod, arg1, arg1Rep, arg1Mod);}\r
+  GLEEPFNGLCOLORFRAGMENTOP1ATIPROC GLeeFuncPtr_glColorFragmentOp1ATI=GLee_Lazy_glColorFragmentOp1ATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glColorFragmentOp2ATI\r
+#define GLEE_C_DEFINED_glColorFragmentOp2ATI\r
+  void __stdcall GLee_Lazy_glColorFragmentOp2ATI(GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod)  {if (GLeeInit()) glColorFragmentOp2ATI(op, dst, dstMask, dstMod, arg1, arg1Rep, arg1Mod, arg2, arg2Rep, arg2Mod);}\r
+  GLEEPFNGLCOLORFRAGMENTOP2ATIPROC GLeeFuncPtr_glColorFragmentOp2ATI=GLee_Lazy_glColorFragmentOp2ATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glColorFragmentOp3ATI\r
+#define GLEE_C_DEFINED_glColorFragmentOp3ATI\r
+  void __stdcall GLee_Lazy_glColorFragmentOp3ATI(GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod)  {if (GLeeInit()) glColorFragmentOp3ATI(op, dst, dstMask, dstMod, arg1, arg1Rep, arg1Mod, arg2, arg2Rep, arg2Mod, arg3, arg3Rep, arg3Mod);}\r
+  GLEEPFNGLCOLORFRAGMENTOP3ATIPROC GLeeFuncPtr_glColorFragmentOp3ATI=GLee_Lazy_glColorFragmentOp3ATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glAlphaFragmentOp1ATI\r
+#define GLEE_C_DEFINED_glAlphaFragmentOp1ATI\r
+  void __stdcall GLee_Lazy_glAlphaFragmentOp1ATI(GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod)  {if (GLeeInit()) glAlphaFragmentOp1ATI(op, dst, dstMod, arg1, arg1Rep, arg1Mod);}\r
+  GLEEPFNGLALPHAFRAGMENTOP1ATIPROC GLeeFuncPtr_glAlphaFragmentOp1ATI=GLee_Lazy_glAlphaFragmentOp1ATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glAlphaFragmentOp2ATI\r
+#define GLEE_C_DEFINED_glAlphaFragmentOp2ATI\r
+  void __stdcall GLee_Lazy_glAlphaFragmentOp2ATI(GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod)  {if (GLeeInit()) glAlphaFragmentOp2ATI(op, dst, dstMod, arg1, arg1Rep, arg1Mod, arg2, arg2Rep, arg2Mod);}\r
+  GLEEPFNGLALPHAFRAGMENTOP2ATIPROC GLeeFuncPtr_glAlphaFragmentOp2ATI=GLee_Lazy_glAlphaFragmentOp2ATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glAlphaFragmentOp3ATI\r
+#define GLEE_C_DEFINED_glAlphaFragmentOp3ATI\r
+  void __stdcall GLee_Lazy_glAlphaFragmentOp3ATI(GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod)  {if (GLeeInit()) glAlphaFragmentOp3ATI(op, dst, dstMod, arg1, arg1Rep, arg1Mod, arg2, arg2Rep, arg2Mod, arg3, arg3Rep, arg3Mod);}\r
+  GLEEPFNGLALPHAFRAGMENTOP3ATIPROC GLeeFuncPtr_glAlphaFragmentOp3ATI=GLee_Lazy_glAlphaFragmentOp3ATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glSetFragmentShaderConstantATI\r
+#define GLEE_C_DEFINED_glSetFragmentShaderConstantATI\r
+  void __stdcall GLee_Lazy_glSetFragmentShaderConstantATI(GLuint dst, const GLfloat * value)  {if (GLeeInit()) glSetFragmentShaderConstantATI(dst, value);}\r
+  GLEEPFNGLSETFRAGMENTSHADERCONSTANTATIPROC GLeeFuncPtr_glSetFragmentShaderConstantATI=GLee_Lazy_glSetFragmentShaderConstantATI;\r
+#endif\r
+#endif \r
+\r
+/* GL_ATI_pn_triangles */\r
+\r
+#ifdef __GLEE_GL_ATI_pn_triangles\r
+#ifndef GLEE_C_DEFINED_glPNTrianglesiATI\r
+#define GLEE_C_DEFINED_glPNTrianglesiATI\r
+  void __stdcall GLee_Lazy_glPNTrianglesiATI(GLenum pname, GLint param)  {if (GLeeInit()) glPNTrianglesiATI(pname, param);}\r
+  GLEEPFNGLPNTRIANGLESIATIPROC GLeeFuncPtr_glPNTrianglesiATI=GLee_Lazy_glPNTrianglesiATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glPNTrianglesfATI\r
+#define GLEE_C_DEFINED_glPNTrianglesfATI\r
+  void __stdcall GLee_Lazy_glPNTrianglesfATI(GLenum pname, GLfloat param)  {if (GLeeInit()) glPNTrianglesfATI(pname, param);}\r
+  GLEEPFNGLPNTRIANGLESFATIPROC GLeeFuncPtr_glPNTrianglesfATI=GLee_Lazy_glPNTrianglesfATI;\r
+#endif\r
+#endif \r
+\r
+/* GL_ATI_vertex_array_object */\r
+\r
+#ifdef __GLEE_GL_ATI_vertex_array_object\r
+#ifndef GLEE_C_DEFINED_glNewObjectBufferATI\r
+#define GLEE_C_DEFINED_glNewObjectBufferATI\r
+  GLuint __stdcall GLee_Lazy_glNewObjectBufferATI(GLsizei size, const GLvoid * pointer, GLenum usage)  {if (GLeeInit()) return glNewObjectBufferATI(size, pointer, usage); return (GLuint)0;}\r
+  GLEEPFNGLNEWOBJECTBUFFERATIPROC GLeeFuncPtr_glNewObjectBufferATI=GLee_Lazy_glNewObjectBufferATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glIsObjectBufferATI\r
+#define GLEE_C_DEFINED_glIsObjectBufferATI\r
+  GLboolean __stdcall GLee_Lazy_glIsObjectBufferATI(GLuint buffer)  {if (GLeeInit()) return glIsObjectBufferATI(buffer); return (GLboolean)0;}\r
+  GLEEPFNGLISOBJECTBUFFERATIPROC GLeeFuncPtr_glIsObjectBufferATI=GLee_Lazy_glIsObjectBufferATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUpdateObjectBufferATI\r
+#define GLEE_C_DEFINED_glUpdateObjectBufferATI\r
+  void __stdcall GLee_Lazy_glUpdateObjectBufferATI(GLuint buffer, GLuint offset, GLsizei size, const GLvoid * pointer, GLenum preserve)  {if (GLeeInit()) glUpdateObjectBufferATI(buffer, offset, size, pointer, preserve);}\r
+  GLEEPFNGLUPDATEOBJECTBUFFERATIPROC GLeeFuncPtr_glUpdateObjectBufferATI=GLee_Lazy_glUpdateObjectBufferATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetObjectBufferfvATI\r
+#define GLEE_C_DEFINED_glGetObjectBufferfvATI\r
+  void __stdcall GLee_Lazy_glGetObjectBufferfvATI(GLuint buffer, GLenum pname, GLfloat * params)  {if (GLeeInit()) glGetObjectBufferfvATI(buffer, pname, params);}\r
+  GLEEPFNGLGETOBJECTBUFFERFVATIPROC GLeeFuncPtr_glGetObjectBufferfvATI=GLee_Lazy_glGetObjectBufferfvATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetObjectBufferivATI\r
+#define GLEE_C_DEFINED_glGetObjectBufferivATI\r
+  void __stdcall GLee_Lazy_glGetObjectBufferivATI(GLuint buffer, GLenum pname, GLint * params)  {if (GLeeInit()) glGetObjectBufferivATI(buffer, pname, params);}\r
+  GLEEPFNGLGETOBJECTBUFFERIVATIPROC GLeeFuncPtr_glGetObjectBufferivATI=GLee_Lazy_glGetObjectBufferivATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFreeObjectBufferATI\r
+#define GLEE_C_DEFINED_glFreeObjectBufferATI\r
+  void __stdcall GLee_Lazy_glFreeObjectBufferATI(GLuint buffer)  {if (GLeeInit()) glFreeObjectBufferATI(buffer);}\r
+  GLEEPFNGLFREEOBJECTBUFFERATIPROC GLeeFuncPtr_glFreeObjectBufferATI=GLee_Lazy_glFreeObjectBufferATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glArrayObjectATI\r
+#define GLEE_C_DEFINED_glArrayObjectATI\r
+  void __stdcall GLee_Lazy_glArrayObjectATI(GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset)  {if (GLeeInit()) glArrayObjectATI(array, size, type, stride, buffer, offset);}\r
+  GLEEPFNGLARRAYOBJECTATIPROC GLeeFuncPtr_glArrayObjectATI=GLee_Lazy_glArrayObjectATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetArrayObjectfvATI\r
+#define GLEE_C_DEFINED_glGetArrayObjectfvATI\r
+  void __stdcall GLee_Lazy_glGetArrayObjectfvATI(GLenum array, GLenum pname, GLfloat * params)  {if (GLeeInit()) glGetArrayObjectfvATI(array, pname, params);}\r
+  GLEEPFNGLGETARRAYOBJECTFVATIPROC GLeeFuncPtr_glGetArrayObjectfvATI=GLee_Lazy_glGetArrayObjectfvATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetArrayObjectivATI\r
+#define GLEE_C_DEFINED_glGetArrayObjectivATI\r
+  void __stdcall GLee_Lazy_glGetArrayObjectivATI(GLenum array, GLenum pname, GLint * params)  {if (GLeeInit()) glGetArrayObjectivATI(array, pname, params);}\r
+  GLEEPFNGLGETARRAYOBJECTIVATIPROC GLeeFuncPtr_glGetArrayObjectivATI=GLee_Lazy_glGetArrayObjectivATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVariantArrayObjectATI\r
+#define GLEE_C_DEFINED_glVariantArrayObjectATI\r
+  void __stdcall GLee_Lazy_glVariantArrayObjectATI(GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset)  {if (GLeeInit()) glVariantArrayObjectATI(id, type, stride, buffer, offset);}\r
+  GLEEPFNGLVARIANTARRAYOBJECTATIPROC GLeeFuncPtr_glVariantArrayObjectATI=GLee_Lazy_glVariantArrayObjectATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetVariantArrayObjectfvATI\r
+#define GLEE_C_DEFINED_glGetVariantArrayObjectfvATI\r
+  void __stdcall GLee_Lazy_glGetVariantArrayObjectfvATI(GLuint id, GLenum pname, GLfloat * params)  {if (GLeeInit()) glGetVariantArrayObjectfvATI(id, pname, params);}\r
+  GLEEPFNGLGETVARIANTARRAYOBJECTFVATIPROC GLeeFuncPtr_glGetVariantArrayObjectfvATI=GLee_Lazy_glGetVariantArrayObjectfvATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetVariantArrayObjectivATI\r
+#define GLEE_C_DEFINED_glGetVariantArrayObjectivATI\r
+  void __stdcall GLee_Lazy_glGetVariantArrayObjectivATI(GLuint id, GLenum pname, GLint * params)  {if (GLeeInit()) glGetVariantArrayObjectivATI(id, pname, params);}\r
+  GLEEPFNGLGETVARIANTARRAYOBJECTIVATIPROC GLeeFuncPtr_glGetVariantArrayObjectivATI=GLee_Lazy_glGetVariantArrayObjectivATI;\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_vertex_shader */\r
+\r
+#ifdef __GLEE_GL_EXT_vertex_shader\r
+#ifndef GLEE_C_DEFINED_glBeginVertexShaderEXT\r
+#define GLEE_C_DEFINED_glBeginVertexShaderEXT\r
+  void __stdcall GLee_Lazy_glBeginVertexShaderEXT(void)  {if (GLeeInit()) glBeginVertexShaderEXT();}\r
+  GLEEPFNGLBEGINVERTEXSHADEREXTPROC GLeeFuncPtr_glBeginVertexShaderEXT=GLee_Lazy_glBeginVertexShaderEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glEndVertexShaderEXT\r
+#define GLEE_C_DEFINED_glEndVertexShaderEXT\r
+  void __stdcall GLee_Lazy_glEndVertexShaderEXT(void)  {if (GLeeInit()) glEndVertexShaderEXT();}\r
+  GLEEPFNGLENDVERTEXSHADEREXTPROC GLeeFuncPtr_glEndVertexShaderEXT=GLee_Lazy_glEndVertexShaderEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glBindVertexShaderEXT\r
+#define GLEE_C_DEFINED_glBindVertexShaderEXT\r
+  void __stdcall GLee_Lazy_glBindVertexShaderEXT(GLuint id)  {if (GLeeInit()) glBindVertexShaderEXT(id);}\r
+  GLEEPFNGLBINDVERTEXSHADEREXTPROC GLeeFuncPtr_glBindVertexShaderEXT=GLee_Lazy_glBindVertexShaderEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGenVertexShadersEXT\r
+#define GLEE_C_DEFINED_glGenVertexShadersEXT\r
+  GLuint __stdcall GLee_Lazy_glGenVertexShadersEXT(GLuint range)  {if (GLeeInit()) return glGenVertexShadersEXT(range); return (GLuint)0;}\r
+  GLEEPFNGLGENVERTEXSHADERSEXTPROC GLeeFuncPtr_glGenVertexShadersEXT=GLee_Lazy_glGenVertexShadersEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glDeleteVertexShaderEXT\r
+#define GLEE_C_DEFINED_glDeleteVertexShaderEXT\r
+  void __stdcall GLee_Lazy_glDeleteVertexShaderEXT(GLuint id)  {if (GLeeInit()) glDeleteVertexShaderEXT(id);}\r
+  GLEEPFNGLDELETEVERTEXSHADEREXTPROC GLeeFuncPtr_glDeleteVertexShaderEXT=GLee_Lazy_glDeleteVertexShaderEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glShaderOp1EXT\r
+#define GLEE_C_DEFINED_glShaderOp1EXT\r
+  void __stdcall GLee_Lazy_glShaderOp1EXT(GLenum op, GLuint res, GLuint arg1)  {if (GLeeInit()) glShaderOp1EXT(op, res, arg1);}\r
+  GLEEPFNGLSHADEROP1EXTPROC GLeeFuncPtr_glShaderOp1EXT=GLee_Lazy_glShaderOp1EXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glShaderOp2EXT\r
+#define GLEE_C_DEFINED_glShaderOp2EXT\r
+  void __stdcall GLee_Lazy_glShaderOp2EXT(GLenum op, GLuint res, GLuint arg1, GLuint arg2)  {if (GLeeInit()) glShaderOp2EXT(op, res, arg1, arg2);}\r
+  GLEEPFNGLSHADEROP2EXTPROC GLeeFuncPtr_glShaderOp2EXT=GLee_Lazy_glShaderOp2EXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glShaderOp3EXT\r
+#define GLEE_C_DEFINED_glShaderOp3EXT\r
+  void __stdcall GLee_Lazy_glShaderOp3EXT(GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3)  {if (GLeeInit()) glShaderOp3EXT(op, res, arg1, arg2, arg3);}\r
+  GLEEPFNGLSHADEROP3EXTPROC GLeeFuncPtr_glShaderOp3EXT=GLee_Lazy_glShaderOp3EXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glSwizzleEXT\r
+#define GLEE_C_DEFINED_glSwizzleEXT\r
+  void __stdcall GLee_Lazy_glSwizzleEXT(GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW)  {if (GLeeInit()) glSwizzleEXT(res, in, outX, outY, outZ, outW);}\r
+  GLEEPFNGLSWIZZLEEXTPROC GLeeFuncPtr_glSwizzleEXT=GLee_Lazy_glSwizzleEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glWriteMaskEXT\r
+#define GLEE_C_DEFINED_glWriteMaskEXT\r
+  void __stdcall GLee_Lazy_glWriteMaskEXT(GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW)  {if (GLeeInit()) glWriteMaskEXT(res, in, outX, outY, outZ, outW);}\r
+  GLEEPFNGLWRITEMASKEXTPROC GLeeFuncPtr_glWriteMaskEXT=GLee_Lazy_glWriteMaskEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glInsertComponentEXT\r
+#define GLEE_C_DEFINED_glInsertComponentEXT\r
+  void __stdcall GLee_Lazy_glInsertComponentEXT(GLuint res, GLuint src, GLuint num)  {if (GLeeInit()) glInsertComponentEXT(res, src, num);}\r
+  GLEEPFNGLINSERTCOMPONENTEXTPROC GLeeFuncPtr_glInsertComponentEXT=GLee_Lazy_glInsertComponentEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glExtractComponentEXT\r
+#define GLEE_C_DEFINED_glExtractComponentEXT\r
+  void __stdcall GLee_Lazy_glExtractComponentEXT(GLuint res, GLuint src, GLuint num)  {if (GLeeInit()) glExtractComponentEXT(res, src, num);}\r
+  GLEEPFNGLEXTRACTCOMPONENTEXTPROC GLeeFuncPtr_glExtractComponentEXT=GLee_Lazy_glExtractComponentEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGenSymbolsEXT\r
+#define GLEE_C_DEFINED_glGenSymbolsEXT\r
+  GLuint __stdcall GLee_Lazy_glGenSymbolsEXT(GLenum datatype, GLenum storagetype, GLenum range, GLuint components)  {if (GLeeInit()) return glGenSymbolsEXT(datatype, storagetype, range, components); return (GLuint)0;}\r
+  GLEEPFNGLGENSYMBOLSEXTPROC GLeeFuncPtr_glGenSymbolsEXT=GLee_Lazy_glGenSymbolsEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glSetInvariantEXT\r
+#define GLEE_C_DEFINED_glSetInvariantEXT\r
+  void __stdcall GLee_Lazy_glSetInvariantEXT(GLuint id, GLenum type, const GLvoid * addr)  {if (GLeeInit()) glSetInvariantEXT(id, type, addr);}\r
+  GLEEPFNGLSETINVARIANTEXTPROC GLeeFuncPtr_glSetInvariantEXT=GLee_Lazy_glSetInvariantEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glSetLocalConstantEXT\r
+#define GLEE_C_DEFINED_glSetLocalConstantEXT\r
+  void __stdcall GLee_Lazy_glSetLocalConstantEXT(GLuint id, GLenum type, const GLvoid * addr)  {if (GLeeInit()) glSetLocalConstantEXT(id, type, addr);}\r
+  GLEEPFNGLSETLOCALCONSTANTEXTPROC GLeeFuncPtr_glSetLocalConstantEXT=GLee_Lazy_glSetLocalConstantEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVariantbvEXT\r
+#define GLEE_C_DEFINED_glVariantbvEXT\r
+  void __stdcall GLee_Lazy_glVariantbvEXT(GLuint id, const GLbyte * addr)  {if (GLeeInit()) glVariantbvEXT(id, addr);}\r
+  GLEEPFNGLVARIANTBVEXTPROC GLeeFuncPtr_glVariantbvEXT=GLee_Lazy_glVariantbvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVariantsvEXT\r
+#define GLEE_C_DEFINED_glVariantsvEXT\r
+  void __stdcall GLee_Lazy_glVariantsvEXT(GLuint id, const GLshort * addr)  {if (GLeeInit()) glVariantsvEXT(id, addr);}\r
+  GLEEPFNGLVARIANTSVEXTPROC GLeeFuncPtr_glVariantsvEXT=GLee_Lazy_glVariantsvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVariantivEXT\r
+#define GLEE_C_DEFINED_glVariantivEXT\r
+  void __stdcall GLee_Lazy_glVariantivEXT(GLuint id, const GLint * addr)  {if (GLeeInit()) glVariantivEXT(id, addr);}\r
+  GLEEPFNGLVARIANTIVEXTPROC GLeeFuncPtr_glVariantivEXT=GLee_Lazy_glVariantivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVariantfvEXT\r
+#define GLEE_C_DEFINED_glVariantfvEXT\r
+  void __stdcall GLee_Lazy_glVariantfvEXT(GLuint id, const GLfloat * addr)  {if (GLeeInit()) glVariantfvEXT(id, addr);}\r
+  GLEEPFNGLVARIANTFVEXTPROC GLeeFuncPtr_glVariantfvEXT=GLee_Lazy_glVariantfvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVariantdvEXT\r
+#define GLEE_C_DEFINED_glVariantdvEXT\r
+  void __stdcall GLee_Lazy_glVariantdvEXT(GLuint id, const GLdouble * addr)  {if (GLeeInit()) glVariantdvEXT(id, addr);}\r
+  GLEEPFNGLVARIANTDVEXTPROC GLeeFuncPtr_glVariantdvEXT=GLee_Lazy_glVariantdvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVariantubvEXT\r
+#define GLEE_C_DEFINED_glVariantubvEXT\r
+  void __stdcall GLee_Lazy_glVariantubvEXT(GLuint id, const GLubyte * addr)  {if (GLeeInit()) glVariantubvEXT(id, addr);}\r
+  GLEEPFNGLVARIANTUBVEXTPROC GLeeFuncPtr_glVariantubvEXT=GLee_Lazy_glVariantubvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVariantusvEXT\r
+#define GLEE_C_DEFINED_glVariantusvEXT\r
+  void __stdcall GLee_Lazy_glVariantusvEXT(GLuint id, const GLushort * addr)  {if (GLeeInit()) glVariantusvEXT(id, addr);}\r
+  GLEEPFNGLVARIANTUSVEXTPROC GLeeFuncPtr_glVariantusvEXT=GLee_Lazy_glVariantusvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVariantuivEXT\r
+#define GLEE_C_DEFINED_glVariantuivEXT\r
+  void __stdcall GLee_Lazy_glVariantuivEXT(GLuint id, const GLuint * addr)  {if (GLeeInit()) glVariantuivEXT(id, addr);}\r
+  GLEEPFNGLVARIANTUIVEXTPROC GLeeFuncPtr_glVariantuivEXT=GLee_Lazy_glVariantuivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVariantPointerEXT\r
+#define GLEE_C_DEFINED_glVariantPointerEXT\r
+  void __stdcall GLee_Lazy_glVariantPointerEXT(GLuint id, GLenum type, GLuint stride, const GLvoid * addr)  {if (GLeeInit()) glVariantPointerEXT(id, type, stride, addr);}\r
+  GLEEPFNGLVARIANTPOINTEREXTPROC GLeeFuncPtr_glVariantPointerEXT=GLee_Lazy_glVariantPointerEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glEnableVariantClientStateEXT\r
+#define GLEE_C_DEFINED_glEnableVariantClientStateEXT\r
+  void __stdcall GLee_Lazy_glEnableVariantClientStateEXT(GLuint id)  {if (GLeeInit()) glEnableVariantClientStateEXT(id);}\r
+  GLEEPFNGLENABLEVARIANTCLIENTSTATEEXTPROC GLeeFuncPtr_glEnableVariantClientStateEXT=GLee_Lazy_glEnableVariantClientStateEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glDisableVariantClientStateEXT\r
+#define GLEE_C_DEFINED_glDisableVariantClientStateEXT\r
+  void __stdcall GLee_Lazy_glDisableVariantClientStateEXT(GLuint id)  {if (GLeeInit()) glDisableVariantClientStateEXT(id);}\r
+  GLEEPFNGLDISABLEVARIANTCLIENTSTATEEXTPROC GLeeFuncPtr_glDisableVariantClientStateEXT=GLee_Lazy_glDisableVariantClientStateEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glBindLightParameterEXT\r
+#define GLEE_C_DEFINED_glBindLightParameterEXT\r
+  GLuint __stdcall GLee_Lazy_glBindLightParameterEXT(GLenum light, GLenum value)  {if (GLeeInit()) return glBindLightParameterEXT(light, value); return (GLuint)0;}\r
+  GLEEPFNGLBINDLIGHTPARAMETEREXTPROC GLeeFuncPtr_glBindLightParameterEXT=GLee_Lazy_glBindLightParameterEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glBindMaterialParameterEXT\r
+#define GLEE_C_DEFINED_glBindMaterialParameterEXT\r
+  GLuint __stdcall GLee_Lazy_glBindMaterialParameterEXT(GLenum face, GLenum value)  {if (GLeeInit()) return glBindMaterialParameterEXT(face, value); return (GLuint)0;}\r
+  GLEEPFNGLBINDMATERIALPARAMETEREXTPROC GLeeFuncPtr_glBindMaterialParameterEXT=GLee_Lazy_glBindMaterialParameterEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glBindTexGenParameterEXT\r
+#define GLEE_C_DEFINED_glBindTexGenParameterEXT\r
+  GLuint __stdcall GLee_Lazy_glBindTexGenParameterEXT(GLenum unit, GLenum coord, GLenum value)  {if (GLeeInit()) return glBindTexGenParameterEXT(unit, coord, value); return (GLuint)0;}\r
+  GLEEPFNGLBINDTEXGENPARAMETEREXTPROC GLeeFuncPtr_glBindTexGenParameterEXT=GLee_Lazy_glBindTexGenParameterEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glBindTextureUnitParameterEXT\r
+#define GLEE_C_DEFINED_glBindTextureUnitParameterEXT\r
+  GLuint __stdcall GLee_Lazy_glBindTextureUnitParameterEXT(GLenum unit, GLenum value)  {if (GLeeInit()) return glBindTextureUnitParameterEXT(unit, value); return (GLuint)0;}\r
+  GLEEPFNGLBINDTEXTUREUNITPARAMETEREXTPROC GLeeFuncPtr_glBindTextureUnitParameterEXT=GLee_Lazy_glBindTextureUnitParameterEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glBindParameterEXT\r
+#define GLEE_C_DEFINED_glBindParameterEXT\r
+  GLuint __stdcall GLee_Lazy_glBindParameterEXT(GLenum value)  {if (GLeeInit()) return glBindParameterEXT(value); return (GLuint)0;}\r
+  GLEEPFNGLBINDPARAMETEREXTPROC GLeeFuncPtr_glBindParameterEXT=GLee_Lazy_glBindParameterEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glIsVariantEnabledEXT\r
+#define GLEE_C_DEFINED_glIsVariantEnabledEXT\r
+  GLboolean __stdcall GLee_Lazy_glIsVariantEnabledEXT(GLuint id, GLenum cap)  {if (GLeeInit()) return glIsVariantEnabledEXT(id, cap); return (GLboolean)0;}\r
+  GLEEPFNGLISVARIANTENABLEDEXTPROC GLeeFuncPtr_glIsVariantEnabledEXT=GLee_Lazy_glIsVariantEnabledEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetVariantBooleanvEXT\r
+#define GLEE_C_DEFINED_glGetVariantBooleanvEXT\r
+  void __stdcall GLee_Lazy_glGetVariantBooleanvEXT(GLuint id, GLenum value, GLboolean * data)  {if (GLeeInit()) glGetVariantBooleanvEXT(id, value, data);}\r
+  GLEEPFNGLGETVARIANTBOOLEANVEXTPROC GLeeFuncPtr_glGetVariantBooleanvEXT=GLee_Lazy_glGetVariantBooleanvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetVariantIntegervEXT\r
+#define GLEE_C_DEFINED_glGetVariantIntegervEXT\r
+  void __stdcall GLee_Lazy_glGetVariantIntegervEXT(GLuint id, GLenum value, GLint * data)  {if (GLeeInit()) glGetVariantIntegervEXT(id, value, data);}\r
+  GLEEPFNGLGETVARIANTINTEGERVEXTPROC GLeeFuncPtr_glGetVariantIntegervEXT=GLee_Lazy_glGetVariantIntegervEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetVariantFloatvEXT\r
+#define GLEE_C_DEFINED_glGetVariantFloatvEXT\r
+  void __stdcall GLee_Lazy_glGetVariantFloatvEXT(GLuint id, GLenum value, GLfloat * data)  {if (GLeeInit()) glGetVariantFloatvEXT(id, value, data);}\r
+  GLEEPFNGLGETVARIANTFLOATVEXTPROC GLeeFuncPtr_glGetVariantFloatvEXT=GLee_Lazy_glGetVariantFloatvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetVariantPointervEXT\r
+#define GLEE_C_DEFINED_glGetVariantPointervEXT\r
+  void __stdcall GLee_Lazy_glGetVariantPointervEXT(GLuint id, GLenum value, GLvoid* * data)  {if (GLeeInit()) glGetVariantPointervEXT(id, value, data);}\r
+  GLEEPFNGLGETVARIANTPOINTERVEXTPROC GLeeFuncPtr_glGetVariantPointervEXT=GLee_Lazy_glGetVariantPointervEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetInvariantBooleanvEXT\r
+#define GLEE_C_DEFINED_glGetInvariantBooleanvEXT\r
+  void __stdcall GLee_Lazy_glGetInvariantBooleanvEXT(GLuint id, GLenum value, GLboolean * data)  {if (GLeeInit()) glGetInvariantBooleanvEXT(id, value, data);}\r
+  GLEEPFNGLGETINVARIANTBOOLEANVEXTPROC GLeeFuncPtr_glGetInvariantBooleanvEXT=GLee_Lazy_glGetInvariantBooleanvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetInvariantIntegervEXT\r
+#define GLEE_C_DEFINED_glGetInvariantIntegervEXT\r
+  void __stdcall GLee_Lazy_glGetInvariantIntegervEXT(GLuint id, GLenum value, GLint * data)  {if (GLeeInit()) glGetInvariantIntegervEXT(id, value, data);}\r
+  GLEEPFNGLGETINVARIANTINTEGERVEXTPROC GLeeFuncPtr_glGetInvariantIntegervEXT=GLee_Lazy_glGetInvariantIntegervEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetInvariantFloatvEXT\r
+#define GLEE_C_DEFINED_glGetInvariantFloatvEXT\r
+  void __stdcall GLee_Lazy_glGetInvariantFloatvEXT(GLuint id, GLenum value, GLfloat * data)  {if (GLeeInit()) glGetInvariantFloatvEXT(id, value, data);}\r
+  GLEEPFNGLGETINVARIANTFLOATVEXTPROC GLeeFuncPtr_glGetInvariantFloatvEXT=GLee_Lazy_glGetInvariantFloatvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetLocalConstantBooleanvEXT\r
+#define GLEE_C_DEFINED_glGetLocalConstantBooleanvEXT\r
+  void __stdcall GLee_Lazy_glGetLocalConstantBooleanvEXT(GLuint id, GLenum value, GLboolean * data)  {if (GLeeInit()) glGetLocalConstantBooleanvEXT(id, value, data);}\r
+  GLEEPFNGLGETLOCALCONSTANTBOOLEANVEXTPROC GLeeFuncPtr_glGetLocalConstantBooleanvEXT=GLee_Lazy_glGetLocalConstantBooleanvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetLocalConstantIntegervEXT\r
+#define GLEE_C_DEFINED_glGetLocalConstantIntegervEXT\r
+  void __stdcall GLee_Lazy_glGetLocalConstantIntegervEXT(GLuint id, GLenum value, GLint * data)  {if (GLeeInit()) glGetLocalConstantIntegervEXT(id, value, data);}\r
+  GLEEPFNGLGETLOCALCONSTANTINTEGERVEXTPROC GLeeFuncPtr_glGetLocalConstantIntegervEXT=GLee_Lazy_glGetLocalConstantIntegervEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetLocalConstantFloatvEXT\r
+#define GLEE_C_DEFINED_glGetLocalConstantFloatvEXT\r
+  void __stdcall GLee_Lazy_glGetLocalConstantFloatvEXT(GLuint id, GLenum value, GLfloat * data)  {if (GLeeInit()) glGetLocalConstantFloatvEXT(id, value, data);}\r
+  GLEEPFNGLGETLOCALCONSTANTFLOATVEXTPROC GLeeFuncPtr_glGetLocalConstantFloatvEXT=GLee_Lazy_glGetLocalConstantFloatvEXT;\r
+#endif\r
+#endif \r
+\r
+/* GL_ATI_vertex_streams */\r
+\r
+#ifdef __GLEE_GL_ATI_vertex_streams\r
+#ifndef GLEE_C_DEFINED_glVertexStream1sATI\r
+#define GLEE_C_DEFINED_glVertexStream1sATI\r
+  void __stdcall GLee_Lazy_glVertexStream1sATI(GLenum stream, GLshort x)  {if (GLeeInit()) glVertexStream1sATI(stream, x);}\r
+  GLEEPFNGLVERTEXSTREAM1SATIPROC GLeeFuncPtr_glVertexStream1sATI=GLee_Lazy_glVertexStream1sATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexStream1svATI\r
+#define GLEE_C_DEFINED_glVertexStream1svATI\r
+  void __stdcall GLee_Lazy_glVertexStream1svATI(GLenum stream, const GLshort * coords)  {if (GLeeInit()) glVertexStream1svATI(stream, coords);}\r
+  GLEEPFNGLVERTEXSTREAM1SVATIPROC GLeeFuncPtr_glVertexStream1svATI=GLee_Lazy_glVertexStream1svATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexStream1iATI\r
+#define GLEE_C_DEFINED_glVertexStream1iATI\r
+  void __stdcall GLee_Lazy_glVertexStream1iATI(GLenum stream, GLint x)  {if (GLeeInit()) glVertexStream1iATI(stream, x);}\r
+  GLEEPFNGLVERTEXSTREAM1IATIPROC GLeeFuncPtr_glVertexStream1iATI=GLee_Lazy_glVertexStream1iATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexStream1ivATI\r
+#define GLEE_C_DEFINED_glVertexStream1ivATI\r
+  void __stdcall GLee_Lazy_glVertexStream1ivATI(GLenum stream, const GLint * coords)  {if (GLeeInit()) glVertexStream1ivATI(stream, coords);}\r
+  GLEEPFNGLVERTEXSTREAM1IVATIPROC GLeeFuncPtr_glVertexStream1ivATI=GLee_Lazy_glVertexStream1ivATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexStream1fATI\r
+#define GLEE_C_DEFINED_glVertexStream1fATI\r
+  void __stdcall GLee_Lazy_glVertexStream1fATI(GLenum stream, GLfloat x)  {if (GLeeInit()) glVertexStream1fATI(stream, x);}\r
+  GLEEPFNGLVERTEXSTREAM1FATIPROC GLeeFuncPtr_glVertexStream1fATI=GLee_Lazy_glVertexStream1fATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexStream1fvATI\r
+#define GLEE_C_DEFINED_glVertexStream1fvATI\r
+  void __stdcall GLee_Lazy_glVertexStream1fvATI(GLenum stream, const GLfloat * coords)  {if (GLeeInit()) glVertexStream1fvATI(stream, coords);}\r
+  GLEEPFNGLVERTEXSTREAM1FVATIPROC GLeeFuncPtr_glVertexStream1fvATI=GLee_Lazy_glVertexStream1fvATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexStream1dATI\r
+#define GLEE_C_DEFINED_glVertexStream1dATI\r
+  void __stdcall GLee_Lazy_glVertexStream1dATI(GLenum stream, GLdouble x)  {if (GLeeInit()) glVertexStream1dATI(stream, x);}\r
+  GLEEPFNGLVERTEXSTREAM1DATIPROC GLeeFuncPtr_glVertexStream1dATI=GLee_Lazy_glVertexStream1dATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexStream1dvATI\r
+#define GLEE_C_DEFINED_glVertexStream1dvATI\r
+  void __stdcall GLee_Lazy_glVertexStream1dvATI(GLenum stream, const GLdouble * coords)  {if (GLeeInit()) glVertexStream1dvATI(stream, coords);}\r
+  GLEEPFNGLVERTEXSTREAM1DVATIPROC GLeeFuncPtr_glVertexStream1dvATI=GLee_Lazy_glVertexStream1dvATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexStream2sATI\r
+#define GLEE_C_DEFINED_glVertexStream2sATI\r
+  void __stdcall GLee_Lazy_glVertexStream2sATI(GLenum stream, GLshort x, GLshort y)  {if (GLeeInit()) glVertexStream2sATI(stream, x, y);}\r
+  GLEEPFNGLVERTEXSTREAM2SATIPROC GLeeFuncPtr_glVertexStream2sATI=GLee_Lazy_glVertexStream2sATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexStream2svATI\r
+#define GLEE_C_DEFINED_glVertexStream2svATI\r
+  void __stdcall GLee_Lazy_glVertexStream2svATI(GLenum stream, const GLshort * coords)  {if (GLeeInit()) glVertexStream2svATI(stream, coords);}\r
+  GLEEPFNGLVERTEXSTREAM2SVATIPROC GLeeFuncPtr_glVertexStream2svATI=GLee_Lazy_glVertexStream2svATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexStream2iATI\r
+#define GLEE_C_DEFINED_glVertexStream2iATI\r
+  void __stdcall GLee_Lazy_glVertexStream2iATI(GLenum stream, GLint x, GLint y)  {if (GLeeInit()) glVertexStream2iATI(stream, x, y);}\r
+  GLEEPFNGLVERTEXSTREAM2IATIPROC GLeeFuncPtr_glVertexStream2iATI=GLee_Lazy_glVertexStream2iATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexStream2ivATI\r
+#define GLEE_C_DEFINED_glVertexStream2ivATI\r
+  void __stdcall GLee_Lazy_glVertexStream2ivATI(GLenum stream, const GLint * coords)  {if (GLeeInit()) glVertexStream2ivATI(stream, coords);}\r
+  GLEEPFNGLVERTEXSTREAM2IVATIPROC GLeeFuncPtr_glVertexStream2ivATI=GLee_Lazy_glVertexStream2ivATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexStream2fATI\r
+#define GLEE_C_DEFINED_glVertexStream2fATI\r
+  void __stdcall GLee_Lazy_glVertexStream2fATI(GLenum stream, GLfloat x, GLfloat y)  {if (GLeeInit()) glVertexStream2fATI(stream, x, y);}\r
+  GLEEPFNGLVERTEXSTREAM2FATIPROC GLeeFuncPtr_glVertexStream2fATI=GLee_Lazy_glVertexStream2fATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexStream2fvATI\r
+#define GLEE_C_DEFINED_glVertexStream2fvATI\r
+  void __stdcall GLee_Lazy_glVertexStream2fvATI(GLenum stream, const GLfloat * coords)  {if (GLeeInit()) glVertexStream2fvATI(stream, coords);}\r
+  GLEEPFNGLVERTEXSTREAM2FVATIPROC GLeeFuncPtr_glVertexStream2fvATI=GLee_Lazy_glVertexStream2fvATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexStream2dATI\r
+#define GLEE_C_DEFINED_glVertexStream2dATI\r
+  void __stdcall GLee_Lazy_glVertexStream2dATI(GLenum stream, GLdouble x, GLdouble y)  {if (GLeeInit()) glVertexStream2dATI(stream, x, y);}\r
+  GLEEPFNGLVERTEXSTREAM2DATIPROC GLeeFuncPtr_glVertexStream2dATI=GLee_Lazy_glVertexStream2dATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexStream2dvATI\r
+#define GLEE_C_DEFINED_glVertexStream2dvATI\r
+  void __stdcall GLee_Lazy_glVertexStream2dvATI(GLenum stream, const GLdouble * coords)  {if (GLeeInit()) glVertexStream2dvATI(stream, coords);}\r
+  GLEEPFNGLVERTEXSTREAM2DVATIPROC GLeeFuncPtr_glVertexStream2dvATI=GLee_Lazy_glVertexStream2dvATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexStream3sATI\r
+#define GLEE_C_DEFINED_glVertexStream3sATI\r
+  void __stdcall GLee_Lazy_glVertexStream3sATI(GLenum stream, GLshort x, GLshort y, GLshort z)  {if (GLeeInit()) glVertexStream3sATI(stream, x, y, z);}\r
+  GLEEPFNGLVERTEXSTREAM3SATIPROC GLeeFuncPtr_glVertexStream3sATI=GLee_Lazy_glVertexStream3sATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexStream3svATI\r
+#define GLEE_C_DEFINED_glVertexStream3svATI\r
+  void __stdcall GLee_Lazy_glVertexStream3svATI(GLenum stream, const GLshort * coords)  {if (GLeeInit()) glVertexStream3svATI(stream, coords);}\r
+  GLEEPFNGLVERTEXSTREAM3SVATIPROC GLeeFuncPtr_glVertexStream3svATI=GLee_Lazy_glVertexStream3svATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexStream3iATI\r
+#define GLEE_C_DEFINED_glVertexStream3iATI\r
+  void __stdcall GLee_Lazy_glVertexStream3iATI(GLenum stream, GLint x, GLint y, GLint z)  {if (GLeeInit()) glVertexStream3iATI(stream, x, y, z);}\r
+  GLEEPFNGLVERTEXSTREAM3IATIPROC GLeeFuncPtr_glVertexStream3iATI=GLee_Lazy_glVertexStream3iATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexStream3ivATI\r
+#define GLEE_C_DEFINED_glVertexStream3ivATI\r
+  void __stdcall GLee_Lazy_glVertexStream3ivATI(GLenum stream, const GLint * coords)  {if (GLeeInit()) glVertexStream3ivATI(stream, coords);}\r
+  GLEEPFNGLVERTEXSTREAM3IVATIPROC GLeeFuncPtr_glVertexStream3ivATI=GLee_Lazy_glVertexStream3ivATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexStream3fATI\r
+#define GLEE_C_DEFINED_glVertexStream3fATI\r
+  void __stdcall GLee_Lazy_glVertexStream3fATI(GLenum stream, GLfloat x, GLfloat y, GLfloat z)  {if (GLeeInit()) glVertexStream3fATI(stream, x, y, z);}\r
+  GLEEPFNGLVERTEXSTREAM3FATIPROC GLeeFuncPtr_glVertexStream3fATI=GLee_Lazy_glVertexStream3fATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexStream3fvATI\r
+#define GLEE_C_DEFINED_glVertexStream3fvATI\r
+  void __stdcall GLee_Lazy_glVertexStream3fvATI(GLenum stream, const GLfloat * coords)  {if (GLeeInit()) glVertexStream3fvATI(stream, coords);}\r
+  GLEEPFNGLVERTEXSTREAM3FVATIPROC GLeeFuncPtr_glVertexStream3fvATI=GLee_Lazy_glVertexStream3fvATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexStream3dATI\r
+#define GLEE_C_DEFINED_glVertexStream3dATI\r
+  void __stdcall GLee_Lazy_glVertexStream3dATI(GLenum stream, GLdouble x, GLdouble y, GLdouble z)  {if (GLeeInit()) glVertexStream3dATI(stream, x, y, z);}\r
+  GLEEPFNGLVERTEXSTREAM3DATIPROC GLeeFuncPtr_glVertexStream3dATI=GLee_Lazy_glVertexStream3dATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexStream3dvATI\r
+#define GLEE_C_DEFINED_glVertexStream3dvATI\r
+  void __stdcall GLee_Lazy_glVertexStream3dvATI(GLenum stream, const GLdouble * coords)  {if (GLeeInit()) glVertexStream3dvATI(stream, coords);}\r
+  GLEEPFNGLVERTEXSTREAM3DVATIPROC GLeeFuncPtr_glVertexStream3dvATI=GLee_Lazy_glVertexStream3dvATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexStream4sATI\r
+#define GLEE_C_DEFINED_glVertexStream4sATI\r
+  void __stdcall GLee_Lazy_glVertexStream4sATI(GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w)  {if (GLeeInit()) glVertexStream4sATI(stream, x, y, z, w);}\r
+  GLEEPFNGLVERTEXSTREAM4SATIPROC GLeeFuncPtr_glVertexStream4sATI=GLee_Lazy_glVertexStream4sATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexStream4svATI\r
+#define GLEE_C_DEFINED_glVertexStream4svATI\r
+  void __stdcall GLee_Lazy_glVertexStream4svATI(GLenum stream, const GLshort * coords)  {if (GLeeInit()) glVertexStream4svATI(stream, coords);}\r
+  GLEEPFNGLVERTEXSTREAM4SVATIPROC GLeeFuncPtr_glVertexStream4svATI=GLee_Lazy_glVertexStream4svATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexStream4iATI\r
+#define GLEE_C_DEFINED_glVertexStream4iATI\r
+  void __stdcall GLee_Lazy_glVertexStream4iATI(GLenum stream, GLint x, GLint y, GLint z, GLint w)  {if (GLeeInit()) glVertexStream4iATI(stream, x, y, z, w);}\r
+  GLEEPFNGLVERTEXSTREAM4IATIPROC GLeeFuncPtr_glVertexStream4iATI=GLee_Lazy_glVertexStream4iATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexStream4ivATI\r
+#define GLEE_C_DEFINED_glVertexStream4ivATI\r
+  void __stdcall GLee_Lazy_glVertexStream4ivATI(GLenum stream, const GLint * coords)  {if (GLeeInit()) glVertexStream4ivATI(stream, coords);}\r
+  GLEEPFNGLVERTEXSTREAM4IVATIPROC GLeeFuncPtr_glVertexStream4ivATI=GLee_Lazy_glVertexStream4ivATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexStream4fATI\r
+#define GLEE_C_DEFINED_glVertexStream4fATI\r
+  void __stdcall GLee_Lazy_glVertexStream4fATI(GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w)  {if (GLeeInit()) glVertexStream4fATI(stream, x, y, z, w);}\r
+  GLEEPFNGLVERTEXSTREAM4FATIPROC GLeeFuncPtr_glVertexStream4fATI=GLee_Lazy_glVertexStream4fATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexStream4fvATI\r
+#define GLEE_C_DEFINED_glVertexStream4fvATI\r
+  void __stdcall GLee_Lazy_glVertexStream4fvATI(GLenum stream, const GLfloat * coords)  {if (GLeeInit()) glVertexStream4fvATI(stream, coords);}\r
+  GLEEPFNGLVERTEXSTREAM4FVATIPROC GLeeFuncPtr_glVertexStream4fvATI=GLee_Lazy_glVertexStream4fvATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexStream4dATI\r
+#define GLEE_C_DEFINED_glVertexStream4dATI\r
+  void __stdcall GLee_Lazy_glVertexStream4dATI(GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w)  {if (GLeeInit()) glVertexStream4dATI(stream, x, y, z, w);}\r
+  GLEEPFNGLVERTEXSTREAM4DATIPROC GLeeFuncPtr_glVertexStream4dATI=GLee_Lazy_glVertexStream4dATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexStream4dvATI\r
+#define GLEE_C_DEFINED_glVertexStream4dvATI\r
+  void __stdcall GLee_Lazy_glVertexStream4dvATI(GLenum stream, const GLdouble * coords)  {if (GLeeInit()) glVertexStream4dvATI(stream, coords);}\r
+  GLEEPFNGLVERTEXSTREAM4DVATIPROC GLeeFuncPtr_glVertexStream4dvATI=GLee_Lazy_glVertexStream4dvATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glNormalStream3bATI\r
+#define GLEE_C_DEFINED_glNormalStream3bATI\r
+  void __stdcall GLee_Lazy_glNormalStream3bATI(GLenum stream, GLbyte nx, GLbyte ny, GLbyte nz)  {if (GLeeInit()) glNormalStream3bATI(stream, nx, ny, nz);}\r
+  GLEEPFNGLNORMALSTREAM3BATIPROC GLeeFuncPtr_glNormalStream3bATI=GLee_Lazy_glNormalStream3bATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glNormalStream3bvATI\r
+#define GLEE_C_DEFINED_glNormalStream3bvATI\r
+  void __stdcall GLee_Lazy_glNormalStream3bvATI(GLenum stream, const GLbyte * coords)  {if (GLeeInit()) glNormalStream3bvATI(stream, coords);}\r
+  GLEEPFNGLNORMALSTREAM3BVATIPROC GLeeFuncPtr_glNormalStream3bvATI=GLee_Lazy_glNormalStream3bvATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glNormalStream3sATI\r
+#define GLEE_C_DEFINED_glNormalStream3sATI\r
+  void __stdcall GLee_Lazy_glNormalStream3sATI(GLenum stream, GLshort nx, GLshort ny, GLshort nz)  {if (GLeeInit()) glNormalStream3sATI(stream, nx, ny, nz);}\r
+  GLEEPFNGLNORMALSTREAM3SATIPROC GLeeFuncPtr_glNormalStream3sATI=GLee_Lazy_glNormalStream3sATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glNormalStream3svATI\r
+#define GLEE_C_DEFINED_glNormalStream3svATI\r
+  void __stdcall GLee_Lazy_glNormalStream3svATI(GLenum stream, const GLshort * coords)  {if (GLeeInit()) glNormalStream3svATI(stream, coords);}\r
+  GLEEPFNGLNORMALSTREAM3SVATIPROC GLeeFuncPtr_glNormalStream3svATI=GLee_Lazy_glNormalStream3svATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glNormalStream3iATI\r
+#define GLEE_C_DEFINED_glNormalStream3iATI\r
+  void __stdcall GLee_Lazy_glNormalStream3iATI(GLenum stream, GLint nx, GLint ny, GLint nz)  {if (GLeeInit()) glNormalStream3iATI(stream, nx, ny, nz);}\r
+  GLEEPFNGLNORMALSTREAM3IATIPROC GLeeFuncPtr_glNormalStream3iATI=GLee_Lazy_glNormalStream3iATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glNormalStream3ivATI\r
+#define GLEE_C_DEFINED_glNormalStream3ivATI\r
+  void __stdcall GLee_Lazy_glNormalStream3ivATI(GLenum stream, const GLint * coords)  {if (GLeeInit()) glNormalStream3ivATI(stream, coords);}\r
+  GLEEPFNGLNORMALSTREAM3IVATIPROC GLeeFuncPtr_glNormalStream3ivATI=GLee_Lazy_glNormalStream3ivATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glNormalStream3fATI\r
+#define GLEE_C_DEFINED_glNormalStream3fATI\r
+  void __stdcall GLee_Lazy_glNormalStream3fATI(GLenum stream, GLfloat nx, GLfloat ny, GLfloat nz)  {if (GLeeInit()) glNormalStream3fATI(stream, nx, ny, nz);}\r
+  GLEEPFNGLNORMALSTREAM3FATIPROC GLeeFuncPtr_glNormalStream3fATI=GLee_Lazy_glNormalStream3fATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glNormalStream3fvATI\r
+#define GLEE_C_DEFINED_glNormalStream3fvATI\r
+  void __stdcall GLee_Lazy_glNormalStream3fvATI(GLenum stream, const GLfloat * coords)  {if (GLeeInit()) glNormalStream3fvATI(stream, coords);}\r
+  GLEEPFNGLNORMALSTREAM3FVATIPROC GLeeFuncPtr_glNormalStream3fvATI=GLee_Lazy_glNormalStream3fvATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glNormalStream3dATI\r
+#define GLEE_C_DEFINED_glNormalStream3dATI\r
+  void __stdcall GLee_Lazy_glNormalStream3dATI(GLenum stream, GLdouble nx, GLdouble ny, GLdouble nz)  {if (GLeeInit()) glNormalStream3dATI(stream, nx, ny, nz);}\r
+  GLEEPFNGLNORMALSTREAM3DATIPROC GLeeFuncPtr_glNormalStream3dATI=GLee_Lazy_glNormalStream3dATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glNormalStream3dvATI\r
+#define GLEE_C_DEFINED_glNormalStream3dvATI\r
+  void __stdcall GLee_Lazy_glNormalStream3dvATI(GLenum stream, const GLdouble * coords)  {if (GLeeInit()) glNormalStream3dvATI(stream, coords);}\r
+  GLEEPFNGLNORMALSTREAM3DVATIPROC GLeeFuncPtr_glNormalStream3dvATI=GLee_Lazy_glNormalStream3dvATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glClientActiveVertexStreamATI\r
+#define GLEE_C_DEFINED_glClientActiveVertexStreamATI\r
+  void __stdcall GLee_Lazy_glClientActiveVertexStreamATI(GLenum stream)  {if (GLeeInit()) glClientActiveVertexStreamATI(stream);}\r
+  GLEEPFNGLCLIENTACTIVEVERTEXSTREAMATIPROC GLeeFuncPtr_glClientActiveVertexStreamATI=GLee_Lazy_glClientActiveVertexStreamATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexBlendEnviATI\r
+#define GLEE_C_DEFINED_glVertexBlendEnviATI\r
+  void __stdcall GLee_Lazy_glVertexBlendEnviATI(GLenum pname, GLint param)  {if (GLeeInit()) glVertexBlendEnviATI(pname, param);}\r
+  GLEEPFNGLVERTEXBLENDENVIATIPROC GLeeFuncPtr_glVertexBlendEnviATI=GLee_Lazy_glVertexBlendEnviATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexBlendEnvfATI\r
+#define GLEE_C_DEFINED_glVertexBlendEnvfATI\r
+  void __stdcall GLee_Lazy_glVertexBlendEnvfATI(GLenum pname, GLfloat param)  {if (GLeeInit()) glVertexBlendEnvfATI(pname, param);}\r
+  GLEEPFNGLVERTEXBLENDENVFATIPROC GLeeFuncPtr_glVertexBlendEnvfATI=GLee_Lazy_glVertexBlendEnvfATI;\r
+#endif\r
+#endif \r
+\r
+/* GL_ATI_element_array */\r
+\r
+#ifdef __GLEE_GL_ATI_element_array\r
+#ifndef GLEE_C_DEFINED_glElementPointerATI\r
+#define GLEE_C_DEFINED_glElementPointerATI\r
+  void __stdcall GLee_Lazy_glElementPointerATI(GLenum type, const GLvoid * pointer)  {if (GLeeInit()) glElementPointerATI(type, pointer);}\r
+  GLEEPFNGLELEMENTPOINTERATIPROC GLeeFuncPtr_glElementPointerATI=GLee_Lazy_glElementPointerATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glDrawElementArrayATI\r
+#define GLEE_C_DEFINED_glDrawElementArrayATI\r
+  void __stdcall GLee_Lazy_glDrawElementArrayATI(GLenum mode, GLsizei count)  {if (GLeeInit()) glDrawElementArrayATI(mode, count);}\r
+  GLEEPFNGLDRAWELEMENTARRAYATIPROC GLeeFuncPtr_glDrawElementArrayATI=GLee_Lazy_glDrawElementArrayATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glDrawRangeElementArrayATI\r
+#define GLEE_C_DEFINED_glDrawRangeElementArrayATI\r
+  void __stdcall GLee_Lazy_glDrawRangeElementArrayATI(GLenum mode, GLuint start, GLuint end, GLsizei count)  {if (GLeeInit()) glDrawRangeElementArrayATI(mode, start, end, count);}\r
+  GLEEPFNGLDRAWRANGEELEMENTARRAYATIPROC GLeeFuncPtr_glDrawRangeElementArrayATI=GLee_Lazy_glDrawRangeElementArrayATI;\r
+#endif\r
+#endif \r
+\r
+/* GL_SUN_mesh_array */\r
+\r
+#ifdef __GLEE_GL_SUN_mesh_array\r
+#ifndef GLEE_C_DEFINED_glDrawMeshArraysSUN\r
+#define GLEE_C_DEFINED_glDrawMeshArraysSUN\r
+  void __stdcall GLee_Lazy_glDrawMeshArraysSUN(GLenum mode, GLint first, GLsizei count, GLsizei width)  {if (GLeeInit()) glDrawMeshArraysSUN(mode, first, count, width);}\r
+  GLEEPFNGLDRAWMESHARRAYSSUNPROC GLeeFuncPtr_glDrawMeshArraysSUN=GLee_Lazy_glDrawMeshArraysSUN;\r
+#endif\r
+#endif \r
+\r
+/* GL_SUN_slice_accum */\r
+\r
+#ifdef __GLEE_GL_SUN_slice_accum\r
+#endif \r
+\r
+/* GL_NV_multisample_filter_hint */\r
+\r
+#ifdef __GLEE_GL_NV_multisample_filter_hint\r
+#endif \r
+\r
+/* GL_NV_depth_clamp */\r
+\r
+#ifdef __GLEE_GL_NV_depth_clamp\r
+#endif \r
+\r
+/* GL_NV_occlusion_query */\r
+\r
+#ifdef __GLEE_GL_NV_occlusion_query\r
+#ifndef GLEE_C_DEFINED_glGenOcclusionQueriesNV\r
+#define GLEE_C_DEFINED_glGenOcclusionQueriesNV\r
+  void __stdcall GLee_Lazy_glGenOcclusionQueriesNV(GLsizei n, GLuint * ids)  {if (GLeeInit()) glGenOcclusionQueriesNV(n, ids);}\r
+  GLEEPFNGLGENOCCLUSIONQUERIESNVPROC GLeeFuncPtr_glGenOcclusionQueriesNV=GLee_Lazy_glGenOcclusionQueriesNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glDeleteOcclusionQueriesNV\r
+#define GLEE_C_DEFINED_glDeleteOcclusionQueriesNV\r
+  void __stdcall GLee_Lazy_glDeleteOcclusionQueriesNV(GLsizei n, const GLuint * ids)  {if (GLeeInit()) glDeleteOcclusionQueriesNV(n, ids);}\r
+  GLEEPFNGLDELETEOCCLUSIONQUERIESNVPROC GLeeFuncPtr_glDeleteOcclusionQueriesNV=GLee_Lazy_glDeleteOcclusionQueriesNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glIsOcclusionQueryNV\r
+#define GLEE_C_DEFINED_glIsOcclusionQueryNV\r
+  GLboolean __stdcall GLee_Lazy_glIsOcclusionQueryNV(GLuint id)  {if (GLeeInit()) return glIsOcclusionQueryNV(id); return (GLboolean)0;}\r
+  GLEEPFNGLISOCCLUSIONQUERYNVPROC GLeeFuncPtr_glIsOcclusionQueryNV=GLee_Lazy_glIsOcclusionQueryNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glBeginOcclusionQueryNV\r
+#define GLEE_C_DEFINED_glBeginOcclusionQueryNV\r
+  void __stdcall GLee_Lazy_glBeginOcclusionQueryNV(GLuint id)  {if (GLeeInit()) glBeginOcclusionQueryNV(id);}\r
+  GLEEPFNGLBEGINOCCLUSIONQUERYNVPROC GLeeFuncPtr_glBeginOcclusionQueryNV=GLee_Lazy_glBeginOcclusionQueryNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glEndOcclusionQueryNV\r
+#define GLEE_C_DEFINED_glEndOcclusionQueryNV\r
+  void __stdcall GLee_Lazy_glEndOcclusionQueryNV(void)  {if (GLeeInit()) glEndOcclusionQueryNV();}\r
+  GLEEPFNGLENDOCCLUSIONQUERYNVPROC GLeeFuncPtr_glEndOcclusionQueryNV=GLee_Lazy_glEndOcclusionQueryNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetOcclusionQueryivNV\r
+#define GLEE_C_DEFINED_glGetOcclusionQueryivNV\r
+  void __stdcall GLee_Lazy_glGetOcclusionQueryivNV(GLuint id, GLenum pname, GLint * params)  {if (GLeeInit()) glGetOcclusionQueryivNV(id, pname, params);}\r
+  GLEEPFNGLGETOCCLUSIONQUERYIVNVPROC GLeeFuncPtr_glGetOcclusionQueryivNV=GLee_Lazy_glGetOcclusionQueryivNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetOcclusionQueryuivNV\r
+#define GLEE_C_DEFINED_glGetOcclusionQueryuivNV\r
+  void __stdcall GLee_Lazy_glGetOcclusionQueryuivNV(GLuint id, GLenum pname, GLuint * params)  {if (GLeeInit()) glGetOcclusionQueryuivNV(id, pname, params);}\r
+  GLEEPFNGLGETOCCLUSIONQUERYUIVNVPROC GLeeFuncPtr_glGetOcclusionQueryuivNV=GLee_Lazy_glGetOcclusionQueryuivNV;\r
+#endif\r
+#endif \r
+\r
+/* GL_NV_point_sprite */\r
+\r
+#ifdef __GLEE_GL_NV_point_sprite\r
+#ifndef GLEE_C_DEFINED_glPointParameteriNV\r
+#define GLEE_C_DEFINED_glPointParameteriNV\r
+  void __stdcall GLee_Lazy_glPointParameteriNV(GLenum pname, GLint param)  {if (GLeeInit()) glPointParameteriNV(pname, param);}\r
+  GLEEPFNGLPOINTPARAMETERINVPROC GLeeFuncPtr_glPointParameteriNV=GLee_Lazy_glPointParameteriNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glPointParameterivNV\r
+#define GLEE_C_DEFINED_glPointParameterivNV\r
+  void __stdcall GLee_Lazy_glPointParameterivNV(GLenum pname, const GLint * params)  {if (GLeeInit()) glPointParameterivNV(pname, params);}\r
+  GLEEPFNGLPOINTPARAMETERIVNVPROC GLeeFuncPtr_glPointParameterivNV=GLee_Lazy_glPointParameterivNV;\r
+#endif\r
+#endif \r
+\r
+/* GL_NV_texture_shader3 */\r
+\r
+#ifdef __GLEE_GL_NV_texture_shader3\r
+#endif \r
+\r
+/* GL_NV_vertex_program1_1 */\r
+\r
+#ifdef __GLEE_GL_NV_vertex_program1_1\r
+#endif \r
+\r
+/* GL_EXT_shadow_funcs */\r
+\r
+#ifdef __GLEE_GL_EXT_shadow_funcs\r
+#endif \r
+\r
+/* GL_EXT_stencil_two_side */\r
+\r
+#ifdef __GLEE_GL_EXT_stencil_two_side\r
+#ifndef GLEE_C_DEFINED_glActiveStencilFaceEXT\r
+#define GLEE_C_DEFINED_glActiveStencilFaceEXT\r
+  void __stdcall GLee_Lazy_glActiveStencilFaceEXT(GLenum face)  {if (GLeeInit()) glActiveStencilFaceEXT(face);}\r
+  GLEEPFNGLACTIVESTENCILFACEEXTPROC GLeeFuncPtr_glActiveStencilFaceEXT=GLee_Lazy_glActiveStencilFaceEXT;\r
+#endif\r
+#endif \r
+\r
+/* GL_ATI_text_fragment_shader */\r
+\r
+#ifdef __GLEE_GL_ATI_text_fragment_shader\r
+#endif \r
+\r
+/* GL_APPLE_client_storage */\r
+\r
+#ifdef __GLEE_GL_APPLE_client_storage\r
+#endif \r
+\r
+/* GL_APPLE_element_array */\r
+\r
+#ifdef __GLEE_GL_APPLE_element_array\r
+#ifndef GLEE_C_DEFINED_glElementPointerAPPLE\r
+#define GLEE_C_DEFINED_glElementPointerAPPLE\r
+  void __stdcall GLee_Lazy_glElementPointerAPPLE(GLenum type, const GLvoid * pointer)  {if (GLeeInit()) glElementPointerAPPLE(type, pointer);}\r
+  GLEEPFNGLELEMENTPOINTERAPPLEPROC GLeeFuncPtr_glElementPointerAPPLE=GLee_Lazy_glElementPointerAPPLE;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glDrawElementArrayAPPLE\r
+#define GLEE_C_DEFINED_glDrawElementArrayAPPLE\r
+  void __stdcall GLee_Lazy_glDrawElementArrayAPPLE(GLenum mode, GLint first, GLsizei count)  {if (GLeeInit()) glDrawElementArrayAPPLE(mode, first, count);}\r
+  GLEEPFNGLDRAWELEMENTARRAYAPPLEPROC GLeeFuncPtr_glDrawElementArrayAPPLE=GLee_Lazy_glDrawElementArrayAPPLE;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glDrawRangeElementArrayAPPLE\r
+#define GLEE_C_DEFINED_glDrawRangeElementArrayAPPLE\r
+  void __stdcall GLee_Lazy_glDrawRangeElementArrayAPPLE(GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count)  {if (GLeeInit()) glDrawRangeElementArrayAPPLE(mode, start, end, first, count);}\r
+  GLEEPFNGLDRAWRANGEELEMENTARRAYAPPLEPROC GLeeFuncPtr_glDrawRangeElementArrayAPPLE=GLee_Lazy_glDrawRangeElementArrayAPPLE;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiDrawElementArrayAPPLE\r
+#define GLEE_C_DEFINED_glMultiDrawElementArrayAPPLE\r
+  void __stdcall GLee_Lazy_glMultiDrawElementArrayAPPLE(GLenum mode, const GLint * first, const GLsizei * count, GLsizei primcount)  {if (GLeeInit()) glMultiDrawElementArrayAPPLE(mode, first, count, primcount);}\r
+  GLEEPFNGLMULTIDRAWELEMENTARRAYAPPLEPROC GLeeFuncPtr_glMultiDrawElementArrayAPPLE=GLee_Lazy_glMultiDrawElementArrayAPPLE;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiDrawRangeElementArrayAPPLE\r
+#define GLEE_C_DEFINED_glMultiDrawRangeElementArrayAPPLE\r
+  void __stdcall GLee_Lazy_glMultiDrawRangeElementArrayAPPLE(GLenum mode, GLuint start, GLuint end, const GLint * first, const GLsizei * count, GLsizei primcount)  {if (GLeeInit()) glMultiDrawRangeElementArrayAPPLE(mode, start, end, first, count, primcount);}\r
+  GLEEPFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC GLeeFuncPtr_glMultiDrawRangeElementArrayAPPLE=GLee_Lazy_glMultiDrawRangeElementArrayAPPLE;\r
+#endif\r
+#endif \r
+\r
+/* GL_APPLE_fence */\r
+\r
+#ifdef __GLEE_GL_APPLE_fence\r
+#ifndef GLEE_C_DEFINED_glGenFencesAPPLE\r
+#define GLEE_C_DEFINED_glGenFencesAPPLE\r
+  void __stdcall GLee_Lazy_glGenFencesAPPLE(GLsizei n, GLuint * fences)  {if (GLeeInit()) glGenFencesAPPLE(n, fences);}\r
+  GLEEPFNGLGENFENCESAPPLEPROC GLeeFuncPtr_glGenFencesAPPLE=GLee_Lazy_glGenFencesAPPLE;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glDeleteFencesAPPLE\r
+#define GLEE_C_DEFINED_glDeleteFencesAPPLE\r
+  void __stdcall GLee_Lazy_glDeleteFencesAPPLE(GLsizei n, const GLuint * fences)  {if (GLeeInit()) glDeleteFencesAPPLE(n, fences);}\r
+  GLEEPFNGLDELETEFENCESAPPLEPROC GLeeFuncPtr_glDeleteFencesAPPLE=GLee_Lazy_glDeleteFencesAPPLE;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glSetFenceAPPLE\r
+#define GLEE_C_DEFINED_glSetFenceAPPLE\r
+  void __stdcall GLee_Lazy_glSetFenceAPPLE(GLuint fence)  {if (GLeeInit()) glSetFenceAPPLE(fence);}\r
+  GLEEPFNGLSETFENCEAPPLEPROC GLeeFuncPtr_glSetFenceAPPLE=GLee_Lazy_glSetFenceAPPLE;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glIsFenceAPPLE\r
+#define GLEE_C_DEFINED_glIsFenceAPPLE\r
+  GLboolean __stdcall GLee_Lazy_glIsFenceAPPLE(GLuint fence)  {if (GLeeInit()) return glIsFenceAPPLE(fence); return (GLboolean)0;}\r
+  GLEEPFNGLISFENCEAPPLEPROC GLeeFuncPtr_glIsFenceAPPLE=GLee_Lazy_glIsFenceAPPLE;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTestFenceAPPLE\r
+#define GLEE_C_DEFINED_glTestFenceAPPLE\r
+  GLboolean __stdcall GLee_Lazy_glTestFenceAPPLE(GLuint fence)  {if (GLeeInit()) return glTestFenceAPPLE(fence); return (GLboolean)0;}\r
+  GLEEPFNGLTESTFENCEAPPLEPROC GLeeFuncPtr_glTestFenceAPPLE=GLee_Lazy_glTestFenceAPPLE;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFinishFenceAPPLE\r
+#define GLEE_C_DEFINED_glFinishFenceAPPLE\r
+  void __stdcall GLee_Lazy_glFinishFenceAPPLE(GLuint fence)  {if (GLeeInit()) glFinishFenceAPPLE(fence);}\r
+  GLEEPFNGLFINISHFENCEAPPLEPROC GLeeFuncPtr_glFinishFenceAPPLE=GLee_Lazy_glFinishFenceAPPLE;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTestObjectAPPLE\r
+#define GLEE_C_DEFINED_glTestObjectAPPLE\r
+  GLboolean __stdcall GLee_Lazy_glTestObjectAPPLE(GLenum object, GLuint name)  {if (GLeeInit()) return glTestObjectAPPLE(object, name); return (GLboolean)0;}\r
+  GLEEPFNGLTESTOBJECTAPPLEPROC GLeeFuncPtr_glTestObjectAPPLE=GLee_Lazy_glTestObjectAPPLE;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFinishObjectAPPLE\r
+#define GLEE_C_DEFINED_glFinishObjectAPPLE\r
+  void __stdcall GLee_Lazy_glFinishObjectAPPLE(GLenum object, GLint name)  {if (GLeeInit()) glFinishObjectAPPLE(object, name);}\r
+  GLEEPFNGLFINISHOBJECTAPPLEPROC GLeeFuncPtr_glFinishObjectAPPLE=GLee_Lazy_glFinishObjectAPPLE;\r
+#endif\r
+#endif \r
+\r
+/* GL_APPLE_vertex_array_object */\r
+\r
+#ifdef __GLEE_GL_APPLE_vertex_array_object\r
+#ifndef GLEE_C_DEFINED_glBindVertexArrayAPPLE\r
+#define GLEE_C_DEFINED_glBindVertexArrayAPPLE\r
+  void __stdcall GLee_Lazy_glBindVertexArrayAPPLE(GLuint array)  {if (GLeeInit()) glBindVertexArrayAPPLE(array);}\r
+  GLEEPFNGLBINDVERTEXARRAYAPPLEPROC GLeeFuncPtr_glBindVertexArrayAPPLE=GLee_Lazy_glBindVertexArrayAPPLE;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glDeleteVertexArraysAPPLE\r
+#define GLEE_C_DEFINED_glDeleteVertexArraysAPPLE\r
+  void __stdcall GLee_Lazy_glDeleteVertexArraysAPPLE(GLsizei n, const GLuint * arrays)  {if (GLeeInit()) glDeleteVertexArraysAPPLE(n, arrays);}\r
+  GLEEPFNGLDELETEVERTEXARRAYSAPPLEPROC GLeeFuncPtr_glDeleteVertexArraysAPPLE=GLee_Lazy_glDeleteVertexArraysAPPLE;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGenVertexArraysAPPLE\r
+#define GLEE_C_DEFINED_glGenVertexArraysAPPLE\r
+  void __stdcall GLee_Lazy_glGenVertexArraysAPPLE(GLsizei n, GLuint * arrays)  {if (GLeeInit()) glGenVertexArraysAPPLE(n, arrays);}\r
+  GLEEPFNGLGENVERTEXARRAYSAPPLEPROC GLeeFuncPtr_glGenVertexArraysAPPLE=GLee_Lazy_glGenVertexArraysAPPLE;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glIsVertexArrayAPPLE\r
+#define GLEE_C_DEFINED_glIsVertexArrayAPPLE\r
+  GLboolean __stdcall GLee_Lazy_glIsVertexArrayAPPLE(GLuint array)  {if (GLeeInit()) return glIsVertexArrayAPPLE(array); return (GLboolean)0;}\r
+  GLEEPFNGLISVERTEXARRAYAPPLEPROC GLeeFuncPtr_glIsVertexArrayAPPLE=GLee_Lazy_glIsVertexArrayAPPLE;\r
+#endif\r
+#endif \r
+\r
+/* GL_APPLE_vertex_array_range */\r
+\r
+#ifdef __GLEE_GL_APPLE_vertex_array_range\r
+#ifndef GLEE_C_DEFINED_glVertexArrayRangeAPPLE\r
+#define GLEE_C_DEFINED_glVertexArrayRangeAPPLE\r
+  void __stdcall GLee_Lazy_glVertexArrayRangeAPPLE(GLsizei length, GLvoid * pointer)  {if (GLeeInit()) glVertexArrayRangeAPPLE(length, pointer);}\r
+  GLEEPFNGLVERTEXARRAYRANGEAPPLEPROC GLeeFuncPtr_glVertexArrayRangeAPPLE=GLee_Lazy_glVertexArrayRangeAPPLE;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFlushVertexArrayRangeAPPLE\r
+#define GLEE_C_DEFINED_glFlushVertexArrayRangeAPPLE\r
+  void __stdcall GLee_Lazy_glFlushVertexArrayRangeAPPLE(GLsizei length, GLvoid * pointer)  {if (GLeeInit()) glFlushVertexArrayRangeAPPLE(length, pointer);}\r
+  GLEEPFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC GLeeFuncPtr_glFlushVertexArrayRangeAPPLE=GLee_Lazy_glFlushVertexArrayRangeAPPLE;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexArrayParameteriAPPLE\r
+#define GLEE_C_DEFINED_glVertexArrayParameteriAPPLE\r
+  void __stdcall GLee_Lazy_glVertexArrayParameteriAPPLE(GLenum pname, GLint param)  {if (GLeeInit()) glVertexArrayParameteriAPPLE(pname, param);}\r
+  GLEEPFNGLVERTEXARRAYPARAMETERIAPPLEPROC GLeeFuncPtr_glVertexArrayParameteriAPPLE=GLee_Lazy_glVertexArrayParameteriAPPLE;\r
+#endif\r
+#endif \r
+\r
+/* GL_APPLE_ycbcr_422 */\r
+\r
+#ifdef __GLEE_GL_APPLE_ycbcr_422\r
+#endif \r
+\r
+/* GL_S3_s3tc */\r
+\r
+#ifdef __GLEE_GL_S3_s3tc\r
+#endif \r
+\r
+/* GL_ATI_draw_buffers */\r
+\r
+#ifdef __GLEE_GL_ATI_draw_buffers\r
+#ifndef GLEE_C_DEFINED_glDrawBuffersATI\r
+#define GLEE_C_DEFINED_glDrawBuffersATI\r
+  void __stdcall GLee_Lazy_glDrawBuffersATI(GLsizei n, const GLenum * bufs)  {if (GLeeInit()) glDrawBuffersATI(n, bufs);}\r
+  GLEEPFNGLDRAWBUFFERSATIPROC GLeeFuncPtr_glDrawBuffersATI=GLee_Lazy_glDrawBuffersATI;\r
+#endif\r
+#endif \r
+\r
+/* GL_ATI_pixel_format_float */\r
+\r
+#ifdef __GLEE_GL_ATI_pixel_format_float\r
+#endif \r
+\r
+/* GL_ATI_texture_env_combine3 */\r
+\r
+#ifdef __GLEE_GL_ATI_texture_env_combine3\r
+#endif \r
+\r
+/* GL_ATI_texture_float */\r
+\r
+#ifdef __GLEE_GL_ATI_texture_float\r
+#endif \r
+\r
+/* GL_NV_float_buffer */\r
+\r
+#ifdef __GLEE_GL_NV_float_buffer\r
+#endif \r
+\r
+/* GL_NV_fragment_program */\r
+\r
+#ifdef __GLEE_GL_NV_fragment_program\r
+#ifndef GLEE_C_DEFINED_glProgramNamedParameter4fNV\r
+#define GLEE_C_DEFINED_glProgramNamedParameter4fNV\r
+  void __stdcall GLee_Lazy_glProgramNamedParameter4fNV(GLuint id, GLsizei len, const GLubyte * name, GLfloat x, GLfloat y, GLfloat z, GLfloat w)  {if (GLeeInit()) glProgramNamedParameter4fNV(id, len, name, x, y, z, w);}\r
+  GLEEPFNGLPROGRAMNAMEDPARAMETER4FNVPROC GLeeFuncPtr_glProgramNamedParameter4fNV=GLee_Lazy_glProgramNamedParameter4fNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramNamedParameter4dNV\r
+#define GLEE_C_DEFINED_glProgramNamedParameter4dNV\r
+  void __stdcall GLee_Lazy_glProgramNamedParameter4dNV(GLuint id, GLsizei len, const GLubyte * name, GLdouble x, GLdouble y, GLdouble z, GLdouble w)  {if (GLeeInit()) glProgramNamedParameter4dNV(id, len, name, x, y, z, w);}\r
+  GLEEPFNGLPROGRAMNAMEDPARAMETER4DNVPROC GLeeFuncPtr_glProgramNamedParameter4dNV=GLee_Lazy_glProgramNamedParameter4dNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramNamedParameter4fvNV\r
+#define GLEE_C_DEFINED_glProgramNamedParameter4fvNV\r
+  void __stdcall GLee_Lazy_glProgramNamedParameter4fvNV(GLuint id, GLsizei len, const GLubyte * name, const GLfloat * v)  {if (GLeeInit()) glProgramNamedParameter4fvNV(id, len, name, v);}\r
+  GLEEPFNGLPROGRAMNAMEDPARAMETER4FVNVPROC GLeeFuncPtr_glProgramNamedParameter4fvNV=GLee_Lazy_glProgramNamedParameter4fvNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramNamedParameter4dvNV\r
+#define GLEE_C_DEFINED_glProgramNamedParameter4dvNV\r
+  void __stdcall GLee_Lazy_glProgramNamedParameter4dvNV(GLuint id, GLsizei len, const GLubyte * name, const GLdouble * v)  {if (GLeeInit()) glProgramNamedParameter4dvNV(id, len, name, v);}\r
+  GLEEPFNGLPROGRAMNAMEDPARAMETER4DVNVPROC GLeeFuncPtr_glProgramNamedParameter4dvNV=GLee_Lazy_glProgramNamedParameter4dvNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetProgramNamedParameterfvNV\r
+#define GLEE_C_DEFINED_glGetProgramNamedParameterfvNV\r
+  void __stdcall GLee_Lazy_glGetProgramNamedParameterfvNV(GLuint id, GLsizei len, const GLubyte * name, GLfloat * params)  {if (GLeeInit()) glGetProgramNamedParameterfvNV(id, len, name, params);}\r
+  GLEEPFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC GLeeFuncPtr_glGetProgramNamedParameterfvNV=GLee_Lazy_glGetProgramNamedParameterfvNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetProgramNamedParameterdvNV\r
+#define GLEE_C_DEFINED_glGetProgramNamedParameterdvNV\r
+  void __stdcall GLee_Lazy_glGetProgramNamedParameterdvNV(GLuint id, GLsizei len, const GLubyte * name, GLdouble * params)  {if (GLeeInit()) glGetProgramNamedParameterdvNV(id, len, name, params);}\r
+  GLEEPFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC GLeeFuncPtr_glGetProgramNamedParameterdvNV=GLee_Lazy_glGetProgramNamedParameterdvNV;\r
+#endif\r
+#endif \r
+\r
+/* GL_NV_half_float */\r
+\r
+#ifdef __GLEE_GL_NV_half_float\r
+#ifndef GLEE_C_DEFINED_glVertex2hNV\r
+#define GLEE_C_DEFINED_glVertex2hNV\r
+  void __stdcall GLee_Lazy_glVertex2hNV(GLhalfNV x, GLhalfNV y)  {if (GLeeInit()) glVertex2hNV(x, y);}\r
+  GLEEPFNGLVERTEX2HNVPROC GLeeFuncPtr_glVertex2hNV=GLee_Lazy_glVertex2hNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertex2hvNV\r
+#define GLEE_C_DEFINED_glVertex2hvNV\r
+  void __stdcall GLee_Lazy_glVertex2hvNV(const GLhalfNV * v)  {if (GLeeInit()) glVertex2hvNV(v);}\r
+  GLEEPFNGLVERTEX2HVNVPROC GLeeFuncPtr_glVertex2hvNV=GLee_Lazy_glVertex2hvNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertex3hNV\r
+#define GLEE_C_DEFINED_glVertex3hNV\r
+  void __stdcall GLee_Lazy_glVertex3hNV(GLhalfNV x, GLhalfNV y, GLhalfNV z)  {if (GLeeInit()) glVertex3hNV(x, y, z);}\r
+  GLEEPFNGLVERTEX3HNVPROC GLeeFuncPtr_glVertex3hNV=GLee_Lazy_glVertex3hNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertex3hvNV\r
+#define GLEE_C_DEFINED_glVertex3hvNV\r
+  void __stdcall GLee_Lazy_glVertex3hvNV(const GLhalfNV * v)  {if (GLeeInit()) glVertex3hvNV(v);}\r
+  GLEEPFNGLVERTEX3HVNVPROC GLeeFuncPtr_glVertex3hvNV=GLee_Lazy_glVertex3hvNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertex4hNV\r
+#define GLEE_C_DEFINED_glVertex4hNV\r
+  void __stdcall GLee_Lazy_glVertex4hNV(GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w)  {if (GLeeInit()) glVertex4hNV(x, y, z, w);}\r
+  GLEEPFNGLVERTEX4HNVPROC GLeeFuncPtr_glVertex4hNV=GLee_Lazy_glVertex4hNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertex4hvNV\r
+#define GLEE_C_DEFINED_glVertex4hvNV\r
+  void __stdcall GLee_Lazy_glVertex4hvNV(const GLhalfNV * v)  {if (GLeeInit()) glVertex4hvNV(v);}\r
+  GLEEPFNGLVERTEX4HVNVPROC GLeeFuncPtr_glVertex4hvNV=GLee_Lazy_glVertex4hvNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glNormal3hNV\r
+#define GLEE_C_DEFINED_glNormal3hNV\r
+  void __stdcall GLee_Lazy_glNormal3hNV(GLhalfNV nx, GLhalfNV ny, GLhalfNV nz)  {if (GLeeInit()) glNormal3hNV(nx, ny, nz);}\r
+  GLEEPFNGLNORMAL3HNVPROC GLeeFuncPtr_glNormal3hNV=GLee_Lazy_glNormal3hNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glNormal3hvNV\r
+#define GLEE_C_DEFINED_glNormal3hvNV\r
+  void __stdcall GLee_Lazy_glNormal3hvNV(const GLhalfNV * v)  {if (GLeeInit()) glNormal3hvNV(v);}\r
+  GLEEPFNGLNORMAL3HVNVPROC GLeeFuncPtr_glNormal3hvNV=GLee_Lazy_glNormal3hvNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glColor3hNV\r
+#define GLEE_C_DEFINED_glColor3hNV\r
+  void __stdcall GLee_Lazy_glColor3hNV(GLhalfNV red, GLhalfNV green, GLhalfNV blue)  {if (GLeeInit()) glColor3hNV(red, green, blue);}\r
+  GLEEPFNGLCOLOR3HNVPROC GLeeFuncPtr_glColor3hNV=GLee_Lazy_glColor3hNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glColor3hvNV\r
+#define GLEE_C_DEFINED_glColor3hvNV\r
+  void __stdcall GLee_Lazy_glColor3hvNV(const GLhalfNV * v)  {if (GLeeInit()) glColor3hvNV(v);}\r
+  GLEEPFNGLCOLOR3HVNVPROC GLeeFuncPtr_glColor3hvNV=GLee_Lazy_glColor3hvNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glColor4hNV\r
+#define GLEE_C_DEFINED_glColor4hNV\r
+  void __stdcall GLee_Lazy_glColor4hNV(GLhalfNV red, GLhalfNV green, GLhalfNV blue, GLhalfNV alpha)  {if (GLeeInit()) glColor4hNV(red, green, blue, alpha);}\r
+  GLEEPFNGLCOLOR4HNVPROC GLeeFuncPtr_glColor4hNV=GLee_Lazy_glColor4hNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glColor4hvNV\r
+#define GLEE_C_DEFINED_glColor4hvNV\r
+  void __stdcall GLee_Lazy_glColor4hvNV(const GLhalfNV * v)  {if (GLeeInit()) glColor4hvNV(v);}\r
+  GLEEPFNGLCOLOR4HVNVPROC GLeeFuncPtr_glColor4hvNV=GLee_Lazy_glColor4hvNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTexCoord1hNV\r
+#define GLEE_C_DEFINED_glTexCoord1hNV\r
+  void __stdcall GLee_Lazy_glTexCoord1hNV(GLhalfNV s)  {if (GLeeInit()) glTexCoord1hNV(s);}\r
+  GLEEPFNGLTEXCOORD1HNVPROC GLeeFuncPtr_glTexCoord1hNV=GLee_Lazy_glTexCoord1hNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTexCoord1hvNV\r
+#define GLEE_C_DEFINED_glTexCoord1hvNV\r
+  void __stdcall GLee_Lazy_glTexCoord1hvNV(const GLhalfNV * v)  {if (GLeeInit()) glTexCoord1hvNV(v);}\r
+  GLEEPFNGLTEXCOORD1HVNVPROC GLeeFuncPtr_glTexCoord1hvNV=GLee_Lazy_glTexCoord1hvNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTexCoord2hNV\r
+#define GLEE_C_DEFINED_glTexCoord2hNV\r
+  void __stdcall GLee_Lazy_glTexCoord2hNV(GLhalfNV s, GLhalfNV t)  {if (GLeeInit()) glTexCoord2hNV(s, t);}\r
+  GLEEPFNGLTEXCOORD2HNVPROC GLeeFuncPtr_glTexCoord2hNV=GLee_Lazy_glTexCoord2hNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTexCoord2hvNV\r
+#define GLEE_C_DEFINED_glTexCoord2hvNV\r
+  void __stdcall GLee_Lazy_glTexCoord2hvNV(const GLhalfNV * v)  {if (GLeeInit()) glTexCoord2hvNV(v);}\r
+  GLEEPFNGLTEXCOORD2HVNVPROC GLeeFuncPtr_glTexCoord2hvNV=GLee_Lazy_glTexCoord2hvNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTexCoord3hNV\r
+#define GLEE_C_DEFINED_glTexCoord3hNV\r
+  void __stdcall GLee_Lazy_glTexCoord3hNV(GLhalfNV s, GLhalfNV t, GLhalfNV r)  {if (GLeeInit()) glTexCoord3hNV(s, t, r);}\r
+  GLEEPFNGLTEXCOORD3HNVPROC GLeeFuncPtr_glTexCoord3hNV=GLee_Lazy_glTexCoord3hNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTexCoord3hvNV\r
+#define GLEE_C_DEFINED_glTexCoord3hvNV\r
+  void __stdcall GLee_Lazy_glTexCoord3hvNV(const GLhalfNV * v)  {if (GLeeInit()) glTexCoord3hvNV(v);}\r
+  GLEEPFNGLTEXCOORD3HVNVPROC GLeeFuncPtr_glTexCoord3hvNV=GLee_Lazy_glTexCoord3hvNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTexCoord4hNV\r
+#define GLEE_C_DEFINED_glTexCoord4hNV\r
+  void __stdcall GLee_Lazy_glTexCoord4hNV(GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q)  {if (GLeeInit()) glTexCoord4hNV(s, t, r, q);}\r
+  GLEEPFNGLTEXCOORD4HNVPROC GLeeFuncPtr_glTexCoord4hNV=GLee_Lazy_glTexCoord4hNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTexCoord4hvNV\r
+#define GLEE_C_DEFINED_glTexCoord4hvNV\r
+  void __stdcall GLee_Lazy_glTexCoord4hvNV(const GLhalfNV * v)  {if (GLeeInit()) glTexCoord4hvNV(v);}\r
+  GLEEPFNGLTEXCOORD4HVNVPROC GLeeFuncPtr_glTexCoord4hvNV=GLee_Lazy_glTexCoord4hvNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord1hNV\r
+#define GLEE_C_DEFINED_glMultiTexCoord1hNV\r
+  void __stdcall GLee_Lazy_glMultiTexCoord1hNV(GLenum target, GLhalfNV s)  {if (GLeeInit()) glMultiTexCoord1hNV(target, s);}\r
+  GLEEPFNGLMULTITEXCOORD1HNVPROC GLeeFuncPtr_glMultiTexCoord1hNV=GLee_Lazy_glMultiTexCoord1hNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord1hvNV\r
+#define GLEE_C_DEFINED_glMultiTexCoord1hvNV\r
+  void __stdcall GLee_Lazy_glMultiTexCoord1hvNV(GLenum target, const GLhalfNV * v)  {if (GLeeInit()) glMultiTexCoord1hvNV(target, v);}\r
+  GLEEPFNGLMULTITEXCOORD1HVNVPROC GLeeFuncPtr_glMultiTexCoord1hvNV=GLee_Lazy_glMultiTexCoord1hvNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord2hNV\r
+#define GLEE_C_DEFINED_glMultiTexCoord2hNV\r
+  void __stdcall GLee_Lazy_glMultiTexCoord2hNV(GLenum target, GLhalfNV s, GLhalfNV t)  {if (GLeeInit()) glMultiTexCoord2hNV(target, s, t);}\r
+  GLEEPFNGLMULTITEXCOORD2HNVPROC GLeeFuncPtr_glMultiTexCoord2hNV=GLee_Lazy_glMultiTexCoord2hNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord2hvNV\r
+#define GLEE_C_DEFINED_glMultiTexCoord2hvNV\r
+  void __stdcall GLee_Lazy_glMultiTexCoord2hvNV(GLenum target, const GLhalfNV * v)  {if (GLeeInit()) glMultiTexCoord2hvNV(target, v);}\r
+  GLEEPFNGLMULTITEXCOORD2HVNVPROC GLeeFuncPtr_glMultiTexCoord2hvNV=GLee_Lazy_glMultiTexCoord2hvNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord3hNV\r
+#define GLEE_C_DEFINED_glMultiTexCoord3hNV\r
+  void __stdcall GLee_Lazy_glMultiTexCoord3hNV(GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r)  {if (GLeeInit()) glMultiTexCoord3hNV(target, s, t, r);}\r
+  GLEEPFNGLMULTITEXCOORD3HNVPROC GLeeFuncPtr_glMultiTexCoord3hNV=GLee_Lazy_glMultiTexCoord3hNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord3hvNV\r
+#define GLEE_C_DEFINED_glMultiTexCoord3hvNV\r
+  void __stdcall GLee_Lazy_glMultiTexCoord3hvNV(GLenum target, const GLhalfNV * v)  {if (GLeeInit()) glMultiTexCoord3hvNV(target, v);}\r
+  GLEEPFNGLMULTITEXCOORD3HVNVPROC GLeeFuncPtr_glMultiTexCoord3hvNV=GLee_Lazy_glMultiTexCoord3hvNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord4hNV\r
+#define GLEE_C_DEFINED_glMultiTexCoord4hNV\r
+  void __stdcall GLee_Lazy_glMultiTexCoord4hNV(GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q)  {if (GLeeInit()) glMultiTexCoord4hNV(target, s, t, r, q);}\r
+  GLEEPFNGLMULTITEXCOORD4HNVPROC GLeeFuncPtr_glMultiTexCoord4hNV=GLee_Lazy_glMultiTexCoord4hNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoord4hvNV\r
+#define GLEE_C_DEFINED_glMultiTexCoord4hvNV\r
+  void __stdcall GLee_Lazy_glMultiTexCoord4hvNV(GLenum target, const GLhalfNV * v)  {if (GLeeInit()) glMultiTexCoord4hvNV(target, v);}\r
+  GLEEPFNGLMULTITEXCOORD4HVNVPROC GLeeFuncPtr_glMultiTexCoord4hvNV=GLee_Lazy_glMultiTexCoord4hvNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFogCoordhNV\r
+#define GLEE_C_DEFINED_glFogCoordhNV\r
+  void __stdcall GLee_Lazy_glFogCoordhNV(GLhalfNV fog)  {if (GLeeInit()) glFogCoordhNV(fog);}\r
+  GLEEPFNGLFOGCOORDHNVPROC GLeeFuncPtr_glFogCoordhNV=GLee_Lazy_glFogCoordhNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFogCoordhvNV\r
+#define GLEE_C_DEFINED_glFogCoordhvNV\r
+  void __stdcall GLee_Lazy_glFogCoordhvNV(const GLhalfNV * fog)  {if (GLeeInit()) glFogCoordhvNV(fog);}\r
+  GLEEPFNGLFOGCOORDHVNVPROC GLeeFuncPtr_glFogCoordhvNV=GLee_Lazy_glFogCoordhvNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glSecondaryColor3hNV\r
+#define GLEE_C_DEFINED_glSecondaryColor3hNV\r
+  void __stdcall GLee_Lazy_glSecondaryColor3hNV(GLhalfNV red, GLhalfNV green, GLhalfNV blue)  {if (GLeeInit()) glSecondaryColor3hNV(red, green, blue);}\r
+  GLEEPFNGLSECONDARYCOLOR3HNVPROC GLeeFuncPtr_glSecondaryColor3hNV=GLee_Lazy_glSecondaryColor3hNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glSecondaryColor3hvNV\r
+#define GLEE_C_DEFINED_glSecondaryColor3hvNV\r
+  void __stdcall GLee_Lazy_glSecondaryColor3hvNV(const GLhalfNV * v)  {if (GLeeInit()) glSecondaryColor3hvNV(v);}\r
+  GLEEPFNGLSECONDARYCOLOR3HVNVPROC GLeeFuncPtr_glSecondaryColor3hvNV=GLee_Lazy_glSecondaryColor3hvNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexWeighthNV\r
+#define GLEE_C_DEFINED_glVertexWeighthNV\r
+  void __stdcall GLee_Lazy_glVertexWeighthNV(GLhalfNV weight)  {if (GLeeInit()) glVertexWeighthNV(weight);}\r
+  GLEEPFNGLVERTEXWEIGHTHNVPROC GLeeFuncPtr_glVertexWeighthNV=GLee_Lazy_glVertexWeighthNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexWeighthvNV\r
+#define GLEE_C_DEFINED_glVertexWeighthvNV\r
+  void __stdcall GLee_Lazy_glVertexWeighthvNV(const GLhalfNV * weight)  {if (GLeeInit()) glVertexWeighthvNV(weight);}\r
+  GLEEPFNGLVERTEXWEIGHTHVNVPROC GLeeFuncPtr_glVertexWeighthvNV=GLee_Lazy_glVertexWeighthvNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib1hNV\r
+#define GLEE_C_DEFINED_glVertexAttrib1hNV\r
+  void __stdcall GLee_Lazy_glVertexAttrib1hNV(GLuint index, GLhalfNV x)  {if (GLeeInit()) glVertexAttrib1hNV(index, x);}\r
+  GLEEPFNGLVERTEXATTRIB1HNVPROC GLeeFuncPtr_glVertexAttrib1hNV=GLee_Lazy_glVertexAttrib1hNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib1hvNV\r
+#define GLEE_C_DEFINED_glVertexAttrib1hvNV\r
+  void __stdcall GLee_Lazy_glVertexAttrib1hvNV(GLuint index, const GLhalfNV * v)  {if (GLeeInit()) glVertexAttrib1hvNV(index, v);}\r
+  GLEEPFNGLVERTEXATTRIB1HVNVPROC GLeeFuncPtr_glVertexAttrib1hvNV=GLee_Lazy_glVertexAttrib1hvNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib2hNV\r
+#define GLEE_C_DEFINED_glVertexAttrib2hNV\r
+  void __stdcall GLee_Lazy_glVertexAttrib2hNV(GLuint index, GLhalfNV x, GLhalfNV y)  {if (GLeeInit()) glVertexAttrib2hNV(index, x, y);}\r
+  GLEEPFNGLVERTEXATTRIB2HNVPROC GLeeFuncPtr_glVertexAttrib2hNV=GLee_Lazy_glVertexAttrib2hNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib2hvNV\r
+#define GLEE_C_DEFINED_glVertexAttrib2hvNV\r
+  void __stdcall GLee_Lazy_glVertexAttrib2hvNV(GLuint index, const GLhalfNV * v)  {if (GLeeInit()) glVertexAttrib2hvNV(index, v);}\r
+  GLEEPFNGLVERTEXATTRIB2HVNVPROC GLeeFuncPtr_glVertexAttrib2hvNV=GLee_Lazy_glVertexAttrib2hvNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib3hNV\r
+#define GLEE_C_DEFINED_glVertexAttrib3hNV\r
+  void __stdcall GLee_Lazy_glVertexAttrib3hNV(GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z)  {if (GLeeInit()) glVertexAttrib3hNV(index, x, y, z);}\r
+  GLEEPFNGLVERTEXATTRIB3HNVPROC GLeeFuncPtr_glVertexAttrib3hNV=GLee_Lazy_glVertexAttrib3hNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib3hvNV\r
+#define GLEE_C_DEFINED_glVertexAttrib3hvNV\r
+  void __stdcall GLee_Lazy_glVertexAttrib3hvNV(GLuint index, const GLhalfNV * v)  {if (GLeeInit()) glVertexAttrib3hvNV(index, v);}\r
+  GLEEPFNGLVERTEXATTRIB3HVNVPROC GLeeFuncPtr_glVertexAttrib3hvNV=GLee_Lazy_glVertexAttrib3hvNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib4hNV\r
+#define GLEE_C_DEFINED_glVertexAttrib4hNV\r
+  void __stdcall GLee_Lazy_glVertexAttrib4hNV(GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w)  {if (GLeeInit()) glVertexAttrib4hNV(index, x, y, z, w);}\r
+  GLEEPFNGLVERTEXATTRIB4HNVPROC GLeeFuncPtr_glVertexAttrib4hNV=GLee_Lazy_glVertexAttrib4hNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttrib4hvNV\r
+#define GLEE_C_DEFINED_glVertexAttrib4hvNV\r
+  void __stdcall GLee_Lazy_glVertexAttrib4hvNV(GLuint index, const GLhalfNV * v)  {if (GLeeInit()) glVertexAttrib4hvNV(index, v);}\r
+  GLEEPFNGLVERTEXATTRIB4HVNVPROC GLeeFuncPtr_glVertexAttrib4hvNV=GLee_Lazy_glVertexAttrib4hvNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttribs1hvNV\r
+#define GLEE_C_DEFINED_glVertexAttribs1hvNV\r
+  void __stdcall GLee_Lazy_glVertexAttribs1hvNV(GLuint index, GLsizei n, const GLhalfNV * v)  {if (GLeeInit()) glVertexAttribs1hvNV(index, n, v);}\r
+  GLEEPFNGLVERTEXATTRIBS1HVNVPROC GLeeFuncPtr_glVertexAttribs1hvNV=GLee_Lazy_glVertexAttribs1hvNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttribs2hvNV\r
+#define GLEE_C_DEFINED_glVertexAttribs2hvNV\r
+  void __stdcall GLee_Lazy_glVertexAttribs2hvNV(GLuint index, GLsizei n, const GLhalfNV * v)  {if (GLeeInit()) glVertexAttribs2hvNV(index, n, v);}\r
+  GLEEPFNGLVERTEXATTRIBS2HVNVPROC GLeeFuncPtr_glVertexAttribs2hvNV=GLee_Lazy_glVertexAttribs2hvNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttribs3hvNV\r
+#define GLEE_C_DEFINED_glVertexAttribs3hvNV\r
+  void __stdcall GLee_Lazy_glVertexAttribs3hvNV(GLuint index, GLsizei n, const GLhalfNV * v)  {if (GLeeInit()) glVertexAttribs3hvNV(index, n, v);}\r
+  GLEEPFNGLVERTEXATTRIBS3HVNVPROC GLeeFuncPtr_glVertexAttribs3hvNV=GLee_Lazy_glVertexAttribs3hvNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttribs4hvNV\r
+#define GLEE_C_DEFINED_glVertexAttribs4hvNV\r
+  void __stdcall GLee_Lazy_glVertexAttribs4hvNV(GLuint index, GLsizei n, const GLhalfNV * v)  {if (GLeeInit()) glVertexAttribs4hvNV(index, n, v);}\r
+  GLEEPFNGLVERTEXATTRIBS4HVNVPROC GLeeFuncPtr_glVertexAttribs4hvNV=GLee_Lazy_glVertexAttribs4hvNV;\r
+#endif\r
+#endif \r
+\r
+/* GL_NV_pixel_data_range */\r
+\r
+#ifdef __GLEE_GL_NV_pixel_data_range\r
+#ifndef GLEE_C_DEFINED_glPixelDataRangeNV\r
+#define GLEE_C_DEFINED_glPixelDataRangeNV\r
+  void __stdcall GLee_Lazy_glPixelDataRangeNV(GLenum target, GLsizei length, GLvoid * pointer)  {if (GLeeInit()) glPixelDataRangeNV(target, length, pointer);}\r
+  GLEEPFNGLPIXELDATARANGENVPROC GLeeFuncPtr_glPixelDataRangeNV=GLee_Lazy_glPixelDataRangeNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFlushPixelDataRangeNV\r
+#define GLEE_C_DEFINED_glFlushPixelDataRangeNV\r
+  void __stdcall GLee_Lazy_glFlushPixelDataRangeNV(GLenum target)  {if (GLeeInit()) glFlushPixelDataRangeNV(target);}\r
+  GLEEPFNGLFLUSHPIXELDATARANGENVPROC GLeeFuncPtr_glFlushPixelDataRangeNV=GLee_Lazy_glFlushPixelDataRangeNV;\r
+#endif\r
+#endif \r
+\r
+/* GL_NV_primitive_restart */\r
+\r
+#ifdef __GLEE_GL_NV_primitive_restart\r
+#ifndef GLEE_C_DEFINED_glPrimitiveRestartNV\r
+#define GLEE_C_DEFINED_glPrimitiveRestartNV\r
+  void __stdcall GLee_Lazy_glPrimitiveRestartNV(void)  {if (GLeeInit()) glPrimitiveRestartNV();}\r
+  GLEEPFNGLPRIMITIVERESTARTNVPROC GLeeFuncPtr_glPrimitiveRestartNV=GLee_Lazy_glPrimitiveRestartNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glPrimitiveRestartIndexNV\r
+#define GLEE_C_DEFINED_glPrimitiveRestartIndexNV\r
+  void __stdcall GLee_Lazy_glPrimitiveRestartIndexNV(GLuint index)  {if (GLeeInit()) glPrimitiveRestartIndexNV(index);}\r
+  GLEEPFNGLPRIMITIVERESTARTINDEXNVPROC GLeeFuncPtr_glPrimitiveRestartIndexNV=GLee_Lazy_glPrimitiveRestartIndexNV;\r
+#endif\r
+#endif \r
+\r
+/* GL_NV_texture_expand_normal */\r
+\r
+#ifdef __GLEE_GL_NV_texture_expand_normal\r
+#endif \r
+\r
+/* GL_NV_vertex_program2 */\r
+\r
+#ifdef __GLEE_GL_NV_vertex_program2\r
+#endif \r
+\r
+/* GL_ATI_map_object_buffer */\r
+\r
+#ifdef __GLEE_GL_ATI_map_object_buffer\r
+#ifndef GLEE_C_DEFINED_glMapObjectBufferATI\r
+#define GLEE_C_DEFINED_glMapObjectBufferATI\r
+  GLvoid* __stdcall GLee_Lazy_glMapObjectBufferATI(GLuint buffer)  {if (GLeeInit()) return glMapObjectBufferATI(buffer); return (GLvoid*)0;}\r
+  GLEEPFNGLMAPOBJECTBUFFERATIPROC GLeeFuncPtr_glMapObjectBufferATI=GLee_Lazy_glMapObjectBufferATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUnmapObjectBufferATI\r
+#define GLEE_C_DEFINED_glUnmapObjectBufferATI\r
+  void __stdcall GLee_Lazy_glUnmapObjectBufferATI(GLuint buffer)  {if (GLeeInit()) glUnmapObjectBufferATI(buffer);}\r
+  GLEEPFNGLUNMAPOBJECTBUFFERATIPROC GLeeFuncPtr_glUnmapObjectBufferATI=GLee_Lazy_glUnmapObjectBufferATI;\r
+#endif\r
+#endif \r
+\r
+/* GL_ATI_separate_stencil */\r
+\r
+#ifdef __GLEE_GL_ATI_separate_stencil\r
+#ifndef GLEE_C_DEFINED_glStencilOpSeparateATI\r
+#define GLEE_C_DEFINED_glStencilOpSeparateATI\r
+  void __stdcall GLee_Lazy_glStencilOpSeparateATI(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass)  {if (GLeeInit()) glStencilOpSeparateATI(face, sfail, dpfail, dppass);}\r
+  GLEEPFNGLSTENCILOPSEPARATEATIPROC GLeeFuncPtr_glStencilOpSeparateATI=GLee_Lazy_glStencilOpSeparateATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glStencilFuncSeparateATI\r
+#define GLEE_C_DEFINED_glStencilFuncSeparateATI\r
+  void __stdcall GLee_Lazy_glStencilFuncSeparateATI(GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask)  {if (GLeeInit()) glStencilFuncSeparateATI(frontfunc, backfunc, ref, mask);}\r
+  GLEEPFNGLSTENCILFUNCSEPARATEATIPROC GLeeFuncPtr_glStencilFuncSeparateATI=GLee_Lazy_glStencilFuncSeparateATI;\r
+#endif\r
+#endif \r
+\r
+/* GL_ATI_vertex_attrib_array_object */\r
+\r
+#ifdef __GLEE_GL_ATI_vertex_attrib_array_object\r
+#ifndef GLEE_C_DEFINED_glVertexAttribArrayObjectATI\r
+#define GLEE_C_DEFINED_glVertexAttribArrayObjectATI\r
+  void __stdcall GLee_Lazy_glVertexAttribArrayObjectATI(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset)  {if (GLeeInit()) glVertexAttribArrayObjectATI(index, size, type, normalized, stride, buffer, offset);}\r
+  GLEEPFNGLVERTEXATTRIBARRAYOBJECTATIPROC GLeeFuncPtr_glVertexAttribArrayObjectATI=GLee_Lazy_glVertexAttribArrayObjectATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetVertexAttribArrayObjectfvATI\r
+#define GLEE_C_DEFINED_glGetVertexAttribArrayObjectfvATI\r
+  void __stdcall GLee_Lazy_glGetVertexAttribArrayObjectfvATI(GLuint index, GLenum pname, GLfloat * params)  {if (GLeeInit()) glGetVertexAttribArrayObjectfvATI(index, pname, params);}\r
+  GLEEPFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC GLeeFuncPtr_glGetVertexAttribArrayObjectfvATI=GLee_Lazy_glGetVertexAttribArrayObjectfvATI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetVertexAttribArrayObjectivATI\r
+#define GLEE_C_DEFINED_glGetVertexAttribArrayObjectivATI\r
+  void __stdcall GLee_Lazy_glGetVertexAttribArrayObjectivATI(GLuint index, GLenum pname, GLint * params)  {if (GLeeInit()) glGetVertexAttribArrayObjectivATI(index, pname, params);}\r
+  GLEEPFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC GLeeFuncPtr_glGetVertexAttribArrayObjectivATI=GLee_Lazy_glGetVertexAttribArrayObjectivATI;\r
+#endif\r
+#endif \r
+\r
+/* GL_OES_read_format */\r
+\r
+#ifdef __GLEE_GL_OES_read_format\r
+#endif \r
+\r
+/* GL_EXT_depth_bounds_test */\r
+\r
+#ifdef __GLEE_GL_EXT_depth_bounds_test\r
+#ifndef GLEE_C_DEFINED_glDepthBoundsEXT\r
+#define GLEE_C_DEFINED_glDepthBoundsEXT\r
+  void __stdcall GLee_Lazy_glDepthBoundsEXT(GLclampd zmin, GLclampd zmax)  {if (GLeeInit()) glDepthBoundsEXT(zmin, zmax);}\r
+  GLEEPFNGLDEPTHBOUNDSEXTPROC GLeeFuncPtr_glDepthBoundsEXT=GLee_Lazy_glDepthBoundsEXT;\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_texture_mirror_clamp */\r
+\r
+#ifdef __GLEE_GL_EXT_texture_mirror_clamp\r
+#endif \r
+\r
+/* GL_EXT_blend_equation_separate */\r
+\r
+#ifdef __GLEE_GL_EXT_blend_equation_separate\r
+#ifndef GLEE_C_DEFINED_glBlendEquationSeparateEXT\r
+#define GLEE_C_DEFINED_glBlendEquationSeparateEXT\r
+  void __stdcall GLee_Lazy_glBlendEquationSeparateEXT(GLenum modeRGB, GLenum modeAlpha)  {if (GLeeInit()) glBlendEquationSeparateEXT(modeRGB, modeAlpha);}\r
+  GLEEPFNGLBLENDEQUATIONSEPARATEEXTPROC GLeeFuncPtr_glBlendEquationSeparateEXT=GLee_Lazy_glBlendEquationSeparateEXT;\r
+#endif\r
+#endif \r
+\r
+/* GL_MESA_pack_invert */\r
+\r
+#ifdef __GLEE_GL_MESA_pack_invert\r
+#endif \r
+\r
+/* GL_MESA_ycbcr_texture */\r
+\r
+#ifdef __GLEE_GL_MESA_ycbcr_texture\r
+#endif \r
+\r
+/* GL_EXT_pixel_buffer_object */\r
+\r
+#ifdef __GLEE_GL_EXT_pixel_buffer_object\r
+#endif \r
+\r
+/* GL_NV_fragment_program_option */\r
+\r
+#ifdef __GLEE_GL_NV_fragment_program_option\r
+#endif \r
+\r
+/* GL_NV_fragment_program2 */\r
+\r
+#ifdef __GLEE_GL_NV_fragment_program2\r
+#endif \r
+\r
+/* GL_NV_vertex_program2_option */\r
+\r
+#ifdef __GLEE_GL_NV_vertex_program2_option\r
+#endif \r
+\r
+/* GL_NV_vertex_program3 */\r
+\r
+#ifdef __GLEE_GL_NV_vertex_program3\r
+#endif \r
+\r
+/* GL_EXT_framebuffer_object */\r
+\r
+#ifdef __GLEE_GL_EXT_framebuffer_object\r
+#ifndef GLEE_C_DEFINED_glIsRenderbufferEXT\r
+#define GLEE_C_DEFINED_glIsRenderbufferEXT\r
+  GLboolean __stdcall GLee_Lazy_glIsRenderbufferEXT(GLuint renderbuffer)  {if (GLeeInit()) return glIsRenderbufferEXT(renderbuffer); return (GLboolean)0;}\r
+  GLEEPFNGLISRENDERBUFFEREXTPROC GLeeFuncPtr_glIsRenderbufferEXT=GLee_Lazy_glIsRenderbufferEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glBindRenderbufferEXT\r
+#define GLEE_C_DEFINED_glBindRenderbufferEXT\r
+  void __stdcall GLee_Lazy_glBindRenderbufferEXT(GLenum target, GLuint renderbuffer)  {if (GLeeInit()) glBindRenderbufferEXT(target, renderbuffer);}\r
+  GLEEPFNGLBINDRENDERBUFFEREXTPROC GLeeFuncPtr_glBindRenderbufferEXT=GLee_Lazy_glBindRenderbufferEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glDeleteRenderbuffersEXT\r
+#define GLEE_C_DEFINED_glDeleteRenderbuffersEXT\r
+  void __stdcall GLee_Lazy_glDeleteRenderbuffersEXT(GLsizei n, const GLuint * renderbuffers)  {if (GLeeInit()) glDeleteRenderbuffersEXT(n, renderbuffers);}\r
+  GLEEPFNGLDELETERENDERBUFFERSEXTPROC GLeeFuncPtr_glDeleteRenderbuffersEXT=GLee_Lazy_glDeleteRenderbuffersEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGenRenderbuffersEXT\r
+#define GLEE_C_DEFINED_glGenRenderbuffersEXT\r
+  void __stdcall GLee_Lazy_glGenRenderbuffersEXT(GLsizei n, GLuint * renderbuffers)  {if (GLeeInit()) glGenRenderbuffersEXT(n, renderbuffers);}\r
+  GLEEPFNGLGENRENDERBUFFERSEXTPROC GLeeFuncPtr_glGenRenderbuffersEXT=GLee_Lazy_glGenRenderbuffersEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glRenderbufferStorageEXT\r
+#define GLEE_C_DEFINED_glRenderbufferStorageEXT\r
+  void __stdcall GLee_Lazy_glRenderbufferStorageEXT(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)  {if (GLeeInit()) glRenderbufferStorageEXT(target, internalformat, width, height);}\r
+  GLEEPFNGLRENDERBUFFERSTORAGEEXTPROC GLeeFuncPtr_glRenderbufferStorageEXT=GLee_Lazy_glRenderbufferStorageEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetRenderbufferParameterivEXT\r
+#define GLEE_C_DEFINED_glGetRenderbufferParameterivEXT\r
+  void __stdcall GLee_Lazy_glGetRenderbufferParameterivEXT(GLenum target, GLenum pname, GLint * params)  {if (GLeeInit()) glGetRenderbufferParameterivEXT(target, pname, params);}\r
+  GLEEPFNGLGETRENDERBUFFERPARAMETERIVEXTPROC GLeeFuncPtr_glGetRenderbufferParameterivEXT=GLee_Lazy_glGetRenderbufferParameterivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glIsFramebufferEXT\r
+#define GLEE_C_DEFINED_glIsFramebufferEXT\r
+  GLboolean __stdcall GLee_Lazy_glIsFramebufferEXT(GLuint framebuffer)  {if (GLeeInit()) return glIsFramebufferEXT(framebuffer); return (GLboolean)0;}\r
+  GLEEPFNGLISFRAMEBUFFEREXTPROC GLeeFuncPtr_glIsFramebufferEXT=GLee_Lazy_glIsFramebufferEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glBindFramebufferEXT\r
+#define GLEE_C_DEFINED_glBindFramebufferEXT\r
+  void __stdcall GLee_Lazy_glBindFramebufferEXT(GLenum target, GLuint framebuffer)  {if (GLeeInit()) glBindFramebufferEXT(target, framebuffer);}\r
+  GLEEPFNGLBINDFRAMEBUFFEREXTPROC GLeeFuncPtr_glBindFramebufferEXT=GLee_Lazy_glBindFramebufferEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glDeleteFramebuffersEXT\r
+#define GLEE_C_DEFINED_glDeleteFramebuffersEXT\r
+  void __stdcall GLee_Lazy_glDeleteFramebuffersEXT(GLsizei n, const GLuint * framebuffers)  {if (GLeeInit()) glDeleteFramebuffersEXT(n, framebuffers);}\r
+  GLEEPFNGLDELETEFRAMEBUFFERSEXTPROC GLeeFuncPtr_glDeleteFramebuffersEXT=GLee_Lazy_glDeleteFramebuffersEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGenFramebuffersEXT\r
+#define GLEE_C_DEFINED_glGenFramebuffersEXT\r
+  void __stdcall GLee_Lazy_glGenFramebuffersEXT(GLsizei n, GLuint * framebuffers)  {if (GLeeInit()) glGenFramebuffersEXT(n, framebuffers);}\r
+  GLEEPFNGLGENFRAMEBUFFERSEXTPROC GLeeFuncPtr_glGenFramebuffersEXT=GLee_Lazy_glGenFramebuffersEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glCheckFramebufferStatusEXT\r
+#define GLEE_C_DEFINED_glCheckFramebufferStatusEXT\r
+  GLenum __stdcall GLee_Lazy_glCheckFramebufferStatusEXT(GLenum target)  {if (GLeeInit()) return glCheckFramebufferStatusEXT(target); return (GLenum)0;}\r
+  GLEEPFNGLCHECKFRAMEBUFFERSTATUSEXTPROC GLeeFuncPtr_glCheckFramebufferStatusEXT=GLee_Lazy_glCheckFramebufferStatusEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFramebufferTexture1DEXT\r
+#define GLEE_C_DEFINED_glFramebufferTexture1DEXT\r
+  void __stdcall GLee_Lazy_glFramebufferTexture1DEXT(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)  {if (GLeeInit()) glFramebufferTexture1DEXT(target, attachment, textarget, texture, level);}\r
+  GLEEPFNGLFRAMEBUFFERTEXTURE1DEXTPROC GLeeFuncPtr_glFramebufferTexture1DEXT=GLee_Lazy_glFramebufferTexture1DEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFramebufferTexture2DEXT\r
+#define GLEE_C_DEFINED_glFramebufferTexture2DEXT\r
+  void __stdcall GLee_Lazy_glFramebufferTexture2DEXT(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)  {if (GLeeInit()) glFramebufferTexture2DEXT(target, attachment, textarget, texture, level);}\r
+  GLEEPFNGLFRAMEBUFFERTEXTURE2DEXTPROC GLeeFuncPtr_glFramebufferTexture2DEXT=GLee_Lazy_glFramebufferTexture2DEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFramebufferTexture3DEXT\r
+#define GLEE_C_DEFINED_glFramebufferTexture3DEXT\r
+  void __stdcall GLee_Lazy_glFramebufferTexture3DEXT(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)  {if (GLeeInit()) glFramebufferTexture3DEXT(target, attachment, textarget, texture, level, zoffset);}\r
+  GLEEPFNGLFRAMEBUFFERTEXTURE3DEXTPROC GLeeFuncPtr_glFramebufferTexture3DEXT=GLee_Lazy_glFramebufferTexture3DEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFramebufferRenderbufferEXT\r
+#define GLEE_C_DEFINED_glFramebufferRenderbufferEXT\r
+  void __stdcall GLee_Lazy_glFramebufferRenderbufferEXT(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)  {if (GLeeInit()) glFramebufferRenderbufferEXT(target, attachment, renderbuffertarget, renderbuffer);}\r
+  GLEEPFNGLFRAMEBUFFERRENDERBUFFEREXTPROC GLeeFuncPtr_glFramebufferRenderbufferEXT=GLee_Lazy_glFramebufferRenderbufferEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetFramebufferAttachmentParameterivEXT\r
+#define GLEE_C_DEFINED_glGetFramebufferAttachmentParameterivEXT\r
+  void __stdcall GLee_Lazy_glGetFramebufferAttachmentParameterivEXT(GLenum target, GLenum attachment, GLenum pname, GLint * params)  {if (GLeeInit()) glGetFramebufferAttachmentParameterivEXT(target, attachment, pname, params);}\r
+  GLEEPFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC GLeeFuncPtr_glGetFramebufferAttachmentParameterivEXT=GLee_Lazy_glGetFramebufferAttachmentParameterivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGenerateMipmapEXT\r
+#define GLEE_C_DEFINED_glGenerateMipmapEXT\r
+  void __stdcall GLee_Lazy_glGenerateMipmapEXT(GLenum target)  {if (GLeeInit()) glGenerateMipmapEXT(target);}\r
+  GLEEPFNGLGENERATEMIPMAPEXTPROC GLeeFuncPtr_glGenerateMipmapEXT=GLee_Lazy_glGenerateMipmapEXT;\r
+#endif\r
+#endif \r
+\r
+/* GL_GREMEDY_string_marker */\r
+\r
+#ifdef __GLEE_GL_GREMEDY_string_marker\r
+#ifndef GLEE_C_DEFINED_glStringMarkerGREMEDY\r
+#define GLEE_C_DEFINED_glStringMarkerGREMEDY\r
+  void __stdcall GLee_Lazy_glStringMarkerGREMEDY(GLsizei len, const GLvoid * string)  {if (GLeeInit()) glStringMarkerGREMEDY(len, string);}\r
+  GLEEPFNGLSTRINGMARKERGREMEDYPROC GLeeFuncPtr_glStringMarkerGREMEDY=GLee_Lazy_glStringMarkerGREMEDY;\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_packed_depth_stencil */\r
+\r
+#ifdef __GLEE_GL_EXT_packed_depth_stencil\r
+#endif \r
+\r
+/* GL_EXT_stencil_clear_tag */\r
+\r
+#ifdef __GLEE_GL_EXT_stencil_clear_tag\r
+#ifndef GLEE_C_DEFINED_glStencilClearTagEXT\r
+#define GLEE_C_DEFINED_glStencilClearTagEXT\r
+  void __stdcall GLee_Lazy_glStencilClearTagEXT(GLsizei stencilTagBits, GLuint stencilClearTag)  {if (GLeeInit()) glStencilClearTagEXT(stencilTagBits, stencilClearTag);}\r
+  GLEEPFNGLSTENCILCLEARTAGEXTPROC GLeeFuncPtr_glStencilClearTagEXT=GLee_Lazy_glStencilClearTagEXT;\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_texture_sRGB */\r
+\r
+#ifdef __GLEE_GL_EXT_texture_sRGB\r
+#endif \r
+\r
+/* GL_EXT_framebuffer_blit */\r
+\r
+#ifdef __GLEE_GL_EXT_framebuffer_blit\r
+#ifndef GLEE_C_DEFINED_glBlitFramebufferEXT\r
+#define GLEE_C_DEFINED_glBlitFramebufferEXT\r
+  void __stdcall GLee_Lazy_glBlitFramebufferEXT(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)  {if (GLeeInit()) glBlitFramebufferEXT(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);}\r
+  GLEEPFNGLBLITFRAMEBUFFEREXTPROC GLeeFuncPtr_glBlitFramebufferEXT=GLee_Lazy_glBlitFramebufferEXT;\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_framebuffer_multisample */\r
+\r
+#ifdef __GLEE_GL_EXT_framebuffer_multisample\r
+#ifndef GLEE_C_DEFINED_glRenderbufferStorageMultisampleEXT\r
+#define GLEE_C_DEFINED_glRenderbufferStorageMultisampleEXT\r
+  void __stdcall GLee_Lazy_glRenderbufferStorageMultisampleEXT(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)  {if (GLeeInit()) glRenderbufferStorageMultisampleEXT(target, samples, internalformat, width, height);}\r
+  GLEEPFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC GLeeFuncPtr_glRenderbufferStorageMultisampleEXT=GLee_Lazy_glRenderbufferStorageMultisampleEXT;\r
+#endif\r
+#endif \r
+\r
+/* GL_MESAX_texture_stack */\r
+\r
+#ifdef __GLEE_GL_MESAX_texture_stack\r
+#endif \r
+\r
+/* GL_EXT_timer_query */\r
+\r
+#ifdef __GLEE_GL_EXT_timer_query\r
+#ifndef GLEE_C_DEFINED_glGetQueryObjecti64vEXT\r
+#define GLEE_C_DEFINED_glGetQueryObjecti64vEXT\r
+  void __stdcall GLee_Lazy_glGetQueryObjecti64vEXT(GLuint id, GLenum pname, GLint64EXT * params)  {if (GLeeInit()) glGetQueryObjecti64vEXT(id, pname, params);}\r
+  GLEEPFNGLGETQUERYOBJECTI64VEXTPROC GLeeFuncPtr_glGetQueryObjecti64vEXT=GLee_Lazy_glGetQueryObjecti64vEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetQueryObjectui64vEXT\r
+#define GLEE_C_DEFINED_glGetQueryObjectui64vEXT\r
+  void __stdcall GLee_Lazy_glGetQueryObjectui64vEXT(GLuint id, GLenum pname, GLuint64EXT * params)  {if (GLeeInit()) glGetQueryObjectui64vEXT(id, pname, params);}\r
+  GLEEPFNGLGETQUERYOBJECTUI64VEXTPROC GLeeFuncPtr_glGetQueryObjectui64vEXT=GLee_Lazy_glGetQueryObjectui64vEXT;\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_gpu_program_parameters */\r
+\r
+#ifdef __GLEE_GL_EXT_gpu_program_parameters\r
+#ifndef GLEE_C_DEFINED_glProgramEnvParameters4fvEXT\r
+#define GLEE_C_DEFINED_glProgramEnvParameters4fvEXT\r
+  void __stdcall GLee_Lazy_glProgramEnvParameters4fvEXT(GLenum target, GLuint index, GLsizei count, const GLfloat * params)  {if (GLeeInit()) glProgramEnvParameters4fvEXT(target, index, count, params);}\r
+  GLEEPFNGLPROGRAMENVPARAMETERS4FVEXTPROC GLeeFuncPtr_glProgramEnvParameters4fvEXT=GLee_Lazy_glProgramEnvParameters4fvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramLocalParameters4fvEXT\r
+#define GLEE_C_DEFINED_glProgramLocalParameters4fvEXT\r
+  void __stdcall GLee_Lazy_glProgramLocalParameters4fvEXT(GLenum target, GLuint index, GLsizei count, const GLfloat * params)  {if (GLeeInit()) glProgramLocalParameters4fvEXT(target, index, count, params);}\r
+  GLEEPFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC GLeeFuncPtr_glProgramLocalParameters4fvEXT=GLee_Lazy_glProgramLocalParameters4fvEXT;\r
+#endif\r
+#endif \r
+\r
+/* GL_APPLE_flush_buffer_range */\r
+\r
+#ifdef __GLEE_GL_APPLE_flush_buffer_range\r
+#ifndef GLEE_C_DEFINED_glBufferParameteriAPPLE\r
+#define GLEE_C_DEFINED_glBufferParameteriAPPLE\r
+  void __stdcall GLee_Lazy_glBufferParameteriAPPLE(GLenum target, GLenum pname, GLint param)  {if (GLeeInit()) glBufferParameteriAPPLE(target, pname, param);}\r
+  GLEEPFNGLBUFFERPARAMETERIAPPLEPROC GLeeFuncPtr_glBufferParameteriAPPLE=GLee_Lazy_glBufferParameteriAPPLE;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFlushMappedBufferRangeAPPLE\r
+#define GLEE_C_DEFINED_glFlushMappedBufferRangeAPPLE\r
+  void __stdcall GLee_Lazy_glFlushMappedBufferRangeAPPLE(GLenum target, GLintptr offset, GLsizeiptr size)  {if (GLeeInit()) glFlushMappedBufferRangeAPPLE(target, offset, size);}\r
+  GLEEPFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC GLeeFuncPtr_glFlushMappedBufferRangeAPPLE=GLee_Lazy_glFlushMappedBufferRangeAPPLE;\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_gpu_shader4 */\r
+\r
+#ifdef __GLEE_GL_EXT_gpu_shader4\r
+#ifndef GLEE_C_DEFINED_glGetUniformuivEXT\r
+#define GLEE_C_DEFINED_glGetUniformuivEXT\r
+  void __stdcall GLee_Lazy_glGetUniformuivEXT(GLuint program, GLint location, GLuint * params)  {if (GLeeInit()) glGetUniformuivEXT(program, location, params);}\r
+  GLEEPFNGLGETUNIFORMUIVEXTPROC GLeeFuncPtr_glGetUniformuivEXT=GLee_Lazy_glGetUniformuivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glBindFragDataLocationEXT\r
+#define GLEE_C_DEFINED_glBindFragDataLocationEXT\r
+  void __stdcall GLee_Lazy_glBindFragDataLocationEXT(GLuint program, GLuint color, const GLchar * name)  {if (GLeeInit()) glBindFragDataLocationEXT(program, color, name);}\r
+  GLEEPFNGLBINDFRAGDATALOCATIONEXTPROC GLeeFuncPtr_glBindFragDataLocationEXT=GLee_Lazy_glBindFragDataLocationEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetFragDataLocationEXT\r
+#define GLEE_C_DEFINED_glGetFragDataLocationEXT\r
+  GLint __stdcall GLee_Lazy_glGetFragDataLocationEXT(GLuint program, const GLchar * name)  {if (GLeeInit()) return glGetFragDataLocationEXT(program, name); return (GLint)0;}\r
+  GLEEPFNGLGETFRAGDATALOCATIONEXTPROC GLeeFuncPtr_glGetFragDataLocationEXT=GLee_Lazy_glGetFragDataLocationEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUniform1uiEXT\r
+#define GLEE_C_DEFINED_glUniform1uiEXT\r
+  void __stdcall GLee_Lazy_glUniform1uiEXT(GLint location, GLuint v0)  {if (GLeeInit()) glUniform1uiEXT(location, v0);}\r
+  GLEEPFNGLUNIFORM1UIEXTPROC GLeeFuncPtr_glUniform1uiEXT=GLee_Lazy_glUniform1uiEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUniform2uiEXT\r
+#define GLEE_C_DEFINED_glUniform2uiEXT\r
+  void __stdcall GLee_Lazy_glUniform2uiEXT(GLint location, GLuint v0, GLuint v1)  {if (GLeeInit()) glUniform2uiEXT(location, v0, v1);}\r
+  GLEEPFNGLUNIFORM2UIEXTPROC GLeeFuncPtr_glUniform2uiEXT=GLee_Lazy_glUniform2uiEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUniform3uiEXT\r
+#define GLEE_C_DEFINED_glUniform3uiEXT\r
+  void __stdcall GLee_Lazy_glUniform3uiEXT(GLint location, GLuint v0, GLuint v1, GLuint v2)  {if (GLeeInit()) glUniform3uiEXT(location, v0, v1, v2);}\r
+  GLEEPFNGLUNIFORM3UIEXTPROC GLeeFuncPtr_glUniform3uiEXT=GLee_Lazy_glUniform3uiEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUniform4uiEXT\r
+#define GLEE_C_DEFINED_glUniform4uiEXT\r
+  void __stdcall GLee_Lazy_glUniform4uiEXT(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)  {if (GLeeInit()) glUniform4uiEXT(location, v0, v1, v2, v3);}\r
+  GLEEPFNGLUNIFORM4UIEXTPROC GLeeFuncPtr_glUniform4uiEXT=GLee_Lazy_glUniform4uiEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUniform1uivEXT\r
+#define GLEE_C_DEFINED_glUniform1uivEXT\r
+  void __stdcall GLee_Lazy_glUniform1uivEXT(GLint location, GLsizei count, const GLuint * value)  {if (GLeeInit()) glUniform1uivEXT(location, count, value);}\r
+  GLEEPFNGLUNIFORM1UIVEXTPROC GLeeFuncPtr_glUniform1uivEXT=GLee_Lazy_glUniform1uivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUniform2uivEXT\r
+#define GLEE_C_DEFINED_glUniform2uivEXT\r
+  void __stdcall GLee_Lazy_glUniform2uivEXT(GLint location, GLsizei count, const GLuint * value)  {if (GLeeInit()) glUniform2uivEXT(location, count, value);}\r
+  GLEEPFNGLUNIFORM2UIVEXTPROC GLeeFuncPtr_glUniform2uivEXT=GLee_Lazy_glUniform2uivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUniform3uivEXT\r
+#define GLEE_C_DEFINED_glUniform3uivEXT\r
+  void __stdcall GLee_Lazy_glUniform3uivEXT(GLint location, GLsizei count, const GLuint * value)  {if (GLeeInit()) glUniform3uivEXT(location, count, value);}\r
+  GLEEPFNGLUNIFORM3UIVEXTPROC GLeeFuncPtr_glUniform3uivEXT=GLee_Lazy_glUniform3uivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUniform4uivEXT\r
+#define GLEE_C_DEFINED_glUniform4uivEXT\r
+  void __stdcall GLee_Lazy_glUniform4uivEXT(GLint location, GLsizei count, const GLuint * value)  {if (GLeeInit()) glUniform4uivEXT(location, count, value);}\r
+  GLEEPFNGLUNIFORM4UIVEXTPROC GLeeFuncPtr_glUniform4uivEXT=GLee_Lazy_glUniform4uivEXT;\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_draw_instanced */\r
+\r
+#ifdef __GLEE_GL_EXT_draw_instanced\r
+#ifndef GLEE_C_DEFINED_glDrawArraysInstancedEXT\r
+#define GLEE_C_DEFINED_glDrawArraysInstancedEXT\r
+  void __stdcall GLee_Lazy_glDrawArraysInstancedEXT(GLenum mode, GLint start, GLsizei count, GLsizei primcount)  {if (GLeeInit()) glDrawArraysInstancedEXT(mode, start, count, primcount);}\r
+  GLEEPFNGLDRAWARRAYSINSTANCEDEXTPROC GLeeFuncPtr_glDrawArraysInstancedEXT=GLee_Lazy_glDrawArraysInstancedEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glDrawElementsInstancedEXT\r
+#define GLEE_C_DEFINED_glDrawElementsInstancedEXT\r
+  void __stdcall GLee_Lazy_glDrawElementsInstancedEXT(GLenum mode, GLsizei count, GLenum type, const GLvoid * indices, GLsizei primcount)  {if (GLeeInit()) glDrawElementsInstancedEXT(mode, count, type, indices, primcount);}\r
+  GLEEPFNGLDRAWELEMENTSINSTANCEDEXTPROC GLeeFuncPtr_glDrawElementsInstancedEXT=GLee_Lazy_glDrawElementsInstancedEXT;\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_packed_float */\r
+\r
+#ifdef __GLEE_GL_EXT_packed_float\r
+#endif \r
+\r
+/* GL_EXT_texture_array */\r
+\r
+#ifdef __GLEE_GL_EXT_texture_array\r
+#endif \r
+\r
+/* GL_EXT_texture_buffer_object */\r
+\r
+#ifdef __GLEE_GL_EXT_texture_buffer_object\r
+#ifndef GLEE_C_DEFINED_glTexBufferEXT\r
+#define GLEE_C_DEFINED_glTexBufferEXT\r
+  void __stdcall GLee_Lazy_glTexBufferEXT(GLenum target, GLenum internalformat, GLuint buffer)  {if (GLeeInit()) glTexBufferEXT(target, internalformat, buffer);}\r
+  GLEEPFNGLTEXBUFFEREXTPROC GLeeFuncPtr_glTexBufferEXT=GLee_Lazy_glTexBufferEXT;\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_texture_compression_latc */\r
+\r
+#ifdef __GLEE_GL_EXT_texture_compression_latc\r
+#endif \r
+\r
+/* GL_EXT_texture_compression_rgtc */\r
+\r
+#ifdef __GLEE_GL_EXT_texture_compression_rgtc\r
+#endif \r
+\r
+/* GL_EXT_texture_shared_exponent */\r
+\r
+#ifdef __GLEE_GL_EXT_texture_shared_exponent\r
+#endif \r
+\r
+/* GL_NV_depth_buffer_float */\r
+\r
+#ifdef __GLEE_GL_NV_depth_buffer_float\r
+#ifndef GLEE_C_DEFINED_glDepthRangedNV\r
+#define GLEE_C_DEFINED_glDepthRangedNV\r
+  void __stdcall GLee_Lazy_glDepthRangedNV(GLdouble zNear, GLdouble zFar)  {if (GLeeInit()) glDepthRangedNV(zNear, zFar);}\r
+  GLEEPFNGLDEPTHRANGEDNVPROC GLeeFuncPtr_glDepthRangedNV=GLee_Lazy_glDepthRangedNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glClearDepthdNV\r
+#define GLEE_C_DEFINED_glClearDepthdNV\r
+  void __stdcall GLee_Lazy_glClearDepthdNV(GLdouble depth)  {if (GLeeInit()) glClearDepthdNV(depth);}\r
+  GLEEPFNGLCLEARDEPTHDNVPROC GLeeFuncPtr_glClearDepthdNV=GLee_Lazy_glClearDepthdNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glDepthBoundsdNV\r
+#define GLEE_C_DEFINED_glDepthBoundsdNV\r
+  void __stdcall GLee_Lazy_glDepthBoundsdNV(GLdouble zmin, GLdouble zmax)  {if (GLeeInit()) glDepthBoundsdNV(zmin, zmax);}\r
+  GLEEPFNGLDEPTHBOUNDSDNVPROC GLeeFuncPtr_glDepthBoundsdNV=GLee_Lazy_glDepthBoundsdNV;\r
+#endif\r
+#endif \r
+\r
+/* GL_NV_framebuffer_multisample_coverage */\r
+\r
+#ifdef __GLEE_GL_NV_framebuffer_multisample_coverage\r
+#ifndef GLEE_C_DEFINED_glRenderbufferStorageMultisampleCoverageNV\r
+#define GLEE_C_DEFINED_glRenderbufferStorageMultisampleCoverageNV\r
+  void __stdcall GLee_Lazy_glRenderbufferStorageMultisampleCoverageNV(GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height)  {if (GLeeInit()) glRenderbufferStorageMultisampleCoverageNV(target, coverageSamples, colorSamples, internalformat, width, height);}\r
+  GLEEPFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC GLeeFuncPtr_glRenderbufferStorageMultisampleCoverageNV=GLee_Lazy_glRenderbufferStorageMultisampleCoverageNV;\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_framebuffer_sRGB */\r
+\r
+#ifdef __GLEE_GL_EXT_framebuffer_sRGB\r
+#endif \r
+\r
+/* GL_NV_geometry_shader4 */\r
+\r
+#ifdef __GLEE_GL_NV_geometry_shader4\r
+#endif \r
+\r
+/* GL_NV_parameter_buffer_object */\r
+\r
+#ifdef __GLEE_GL_NV_parameter_buffer_object\r
+#ifndef GLEE_C_DEFINED_glProgramBufferParametersfvNV\r
+#define GLEE_C_DEFINED_glProgramBufferParametersfvNV\r
+  void __stdcall GLee_Lazy_glProgramBufferParametersfvNV(GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLfloat * params)  {if (GLeeInit()) glProgramBufferParametersfvNV(target, buffer, index, count, params);}\r
+  GLEEPFNGLPROGRAMBUFFERPARAMETERSFVNVPROC GLeeFuncPtr_glProgramBufferParametersfvNV=GLee_Lazy_glProgramBufferParametersfvNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramBufferParametersIivNV\r
+#define GLEE_C_DEFINED_glProgramBufferParametersIivNV\r
+  void __stdcall GLee_Lazy_glProgramBufferParametersIivNV(GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLint * params)  {if (GLeeInit()) glProgramBufferParametersIivNV(target, buffer, index, count, params);}\r
+  GLEEPFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC GLeeFuncPtr_glProgramBufferParametersIivNV=GLee_Lazy_glProgramBufferParametersIivNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramBufferParametersIuivNV\r
+#define GLEE_C_DEFINED_glProgramBufferParametersIuivNV\r
+  void __stdcall GLee_Lazy_glProgramBufferParametersIuivNV(GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLuint * params)  {if (GLeeInit()) glProgramBufferParametersIuivNV(target, buffer, index, count, params);}\r
+  GLEEPFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC GLeeFuncPtr_glProgramBufferParametersIuivNV=GLee_Lazy_glProgramBufferParametersIuivNV;\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_draw_buffers2 */\r
+\r
+#ifdef __GLEE_GL_EXT_draw_buffers2\r
+#ifndef GLEE_C_DEFINED_glColorMaskIndexedEXT\r
+#define GLEE_C_DEFINED_glColorMaskIndexedEXT\r
+  void __stdcall GLee_Lazy_glColorMaskIndexedEXT(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a)  {if (GLeeInit()) glColorMaskIndexedEXT(index, r, g, b, a);}\r
+  GLEEPFNGLCOLORMASKINDEXEDEXTPROC GLeeFuncPtr_glColorMaskIndexedEXT=GLee_Lazy_glColorMaskIndexedEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetBooleanIndexedvEXT\r
+#define GLEE_C_DEFINED_glGetBooleanIndexedvEXT\r
+  void __stdcall GLee_Lazy_glGetBooleanIndexedvEXT(GLenum target, GLuint index, GLboolean * data)  {if (GLeeInit()) glGetBooleanIndexedvEXT(target, index, data);}\r
+  GLEEPFNGLGETBOOLEANINDEXEDVEXTPROC GLeeFuncPtr_glGetBooleanIndexedvEXT=GLee_Lazy_glGetBooleanIndexedvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetIntegerIndexedvEXT\r
+#define GLEE_C_DEFINED_glGetIntegerIndexedvEXT\r
+  void __stdcall GLee_Lazy_glGetIntegerIndexedvEXT(GLenum target, GLuint index, GLint * data)  {if (GLeeInit()) glGetIntegerIndexedvEXT(target, index, data);}\r
+  GLEEPFNGLGETINTEGERINDEXEDVEXTPROC GLeeFuncPtr_glGetIntegerIndexedvEXT=GLee_Lazy_glGetIntegerIndexedvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glEnableIndexedEXT\r
+#define GLEE_C_DEFINED_glEnableIndexedEXT\r
+  void __stdcall GLee_Lazy_glEnableIndexedEXT(GLenum target, GLuint index)  {if (GLeeInit()) glEnableIndexedEXT(target, index);}\r
+  GLEEPFNGLENABLEINDEXEDEXTPROC GLeeFuncPtr_glEnableIndexedEXT=GLee_Lazy_glEnableIndexedEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glDisableIndexedEXT\r
+#define GLEE_C_DEFINED_glDisableIndexedEXT\r
+  void __stdcall GLee_Lazy_glDisableIndexedEXT(GLenum target, GLuint index)  {if (GLeeInit()) glDisableIndexedEXT(target, index);}\r
+  GLEEPFNGLDISABLEINDEXEDEXTPROC GLeeFuncPtr_glDisableIndexedEXT=GLee_Lazy_glDisableIndexedEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glIsEnabledIndexedEXT\r
+#define GLEE_C_DEFINED_glIsEnabledIndexedEXT\r
+  GLboolean __stdcall GLee_Lazy_glIsEnabledIndexedEXT(GLenum target, GLuint index)  {if (GLeeInit()) return glIsEnabledIndexedEXT(target, index); return (GLboolean)0;}\r
+  GLEEPFNGLISENABLEDINDEXEDEXTPROC GLeeFuncPtr_glIsEnabledIndexedEXT=GLee_Lazy_glIsEnabledIndexedEXT;\r
+#endif\r
+#endif \r
+\r
+/* GL_NV_transform_feedback */\r
+\r
+#ifdef __GLEE_GL_NV_transform_feedback\r
+#ifndef GLEE_C_DEFINED_glBeginTransformFeedbackNV\r
+#define GLEE_C_DEFINED_glBeginTransformFeedbackNV\r
+  void __stdcall GLee_Lazy_glBeginTransformFeedbackNV(GLenum primitiveMode)  {if (GLeeInit()) glBeginTransformFeedbackNV(primitiveMode);}\r
+  GLEEPFNGLBEGINTRANSFORMFEEDBACKNVPROC GLeeFuncPtr_glBeginTransformFeedbackNV=GLee_Lazy_glBeginTransformFeedbackNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glEndTransformFeedbackNV\r
+#define GLEE_C_DEFINED_glEndTransformFeedbackNV\r
+  void __stdcall GLee_Lazy_glEndTransformFeedbackNV(void)  {if (GLeeInit()) glEndTransformFeedbackNV();}\r
+  GLEEPFNGLENDTRANSFORMFEEDBACKNVPROC GLeeFuncPtr_glEndTransformFeedbackNV=GLee_Lazy_glEndTransformFeedbackNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTransformFeedbackAttribsNV\r
+#define GLEE_C_DEFINED_glTransformFeedbackAttribsNV\r
+  void __stdcall GLee_Lazy_glTransformFeedbackAttribsNV(GLuint count, const GLint * attribs, GLenum bufferMode)  {if (GLeeInit()) glTransformFeedbackAttribsNV(count, attribs, bufferMode);}\r
+  GLEEPFNGLTRANSFORMFEEDBACKATTRIBSNVPROC GLeeFuncPtr_glTransformFeedbackAttribsNV=GLee_Lazy_glTransformFeedbackAttribsNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glBindBufferRangeNV\r
+#define GLEE_C_DEFINED_glBindBufferRangeNV\r
+  void __stdcall GLee_Lazy_glBindBufferRangeNV(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)  {if (GLeeInit()) glBindBufferRangeNV(target, index, buffer, offset, size);}\r
+  GLEEPFNGLBINDBUFFERRANGENVPROC GLeeFuncPtr_glBindBufferRangeNV=GLee_Lazy_glBindBufferRangeNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glBindBufferOffsetNV\r
+#define GLEE_C_DEFINED_glBindBufferOffsetNV\r
+  void __stdcall GLee_Lazy_glBindBufferOffsetNV(GLenum target, GLuint index, GLuint buffer, GLintptr offset)  {if (GLeeInit()) glBindBufferOffsetNV(target, index, buffer, offset);}\r
+  GLEEPFNGLBINDBUFFEROFFSETNVPROC GLeeFuncPtr_glBindBufferOffsetNV=GLee_Lazy_glBindBufferOffsetNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glBindBufferBaseNV\r
+#define GLEE_C_DEFINED_glBindBufferBaseNV\r
+  void __stdcall GLee_Lazy_glBindBufferBaseNV(GLenum target, GLuint index, GLuint buffer)  {if (GLeeInit()) glBindBufferBaseNV(target, index, buffer);}\r
+  GLEEPFNGLBINDBUFFERBASENVPROC GLeeFuncPtr_glBindBufferBaseNV=GLee_Lazy_glBindBufferBaseNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTransformFeedbackVaryingsNV\r
+#define GLEE_C_DEFINED_glTransformFeedbackVaryingsNV\r
+  void __stdcall GLee_Lazy_glTransformFeedbackVaryingsNV(GLuint program, GLsizei count, const GLint * locations, GLenum bufferMode)  {if (GLeeInit()) glTransformFeedbackVaryingsNV(program, count, locations, bufferMode);}\r
+  GLEEPFNGLTRANSFORMFEEDBACKVARYINGSNVPROC GLeeFuncPtr_glTransformFeedbackVaryingsNV=GLee_Lazy_glTransformFeedbackVaryingsNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glActiveVaryingNV\r
+#define GLEE_C_DEFINED_glActiveVaryingNV\r
+  void __stdcall GLee_Lazy_glActiveVaryingNV(GLuint program, const GLchar * name)  {if (GLeeInit()) glActiveVaryingNV(program, name);}\r
+  GLEEPFNGLACTIVEVARYINGNVPROC GLeeFuncPtr_glActiveVaryingNV=GLee_Lazy_glActiveVaryingNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetVaryingLocationNV\r
+#define GLEE_C_DEFINED_glGetVaryingLocationNV\r
+  GLint __stdcall GLee_Lazy_glGetVaryingLocationNV(GLuint program, const GLchar * name)  {if (GLeeInit()) return glGetVaryingLocationNV(program, name); return (GLint)0;}\r
+  GLEEPFNGLGETVARYINGLOCATIONNVPROC GLeeFuncPtr_glGetVaryingLocationNV=GLee_Lazy_glGetVaryingLocationNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetActiveVaryingNV\r
+#define GLEE_C_DEFINED_glGetActiveVaryingNV\r
+  void __stdcall GLee_Lazy_glGetActiveVaryingNV(GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLsizei * size, GLenum * type, GLchar * name)  {if (GLeeInit()) glGetActiveVaryingNV(program, index, bufSize, length, size, type, name);}\r
+  GLEEPFNGLGETACTIVEVARYINGNVPROC GLeeFuncPtr_glGetActiveVaryingNV=GLee_Lazy_glGetActiveVaryingNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetTransformFeedbackVaryingNV\r
+#define GLEE_C_DEFINED_glGetTransformFeedbackVaryingNV\r
+  void __stdcall GLee_Lazy_glGetTransformFeedbackVaryingNV(GLuint program, GLuint index, GLint * location)  {if (GLeeInit()) glGetTransformFeedbackVaryingNV(program, index, location);}\r
+  GLEEPFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC GLeeFuncPtr_glGetTransformFeedbackVaryingNV=GLee_Lazy_glGetTransformFeedbackVaryingNV;\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_bindable_uniform */\r
+\r
+#ifdef __GLEE_GL_EXT_bindable_uniform\r
+#ifndef GLEE_C_DEFINED_glUniformBufferEXT\r
+#define GLEE_C_DEFINED_glUniformBufferEXT\r
+  void __stdcall GLee_Lazy_glUniformBufferEXT(GLuint program, GLint location, GLuint buffer)  {if (GLeeInit()) glUniformBufferEXT(program, location, buffer);}\r
+  GLEEPFNGLUNIFORMBUFFEREXTPROC GLeeFuncPtr_glUniformBufferEXT=GLee_Lazy_glUniformBufferEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetUniformBufferSizeEXT\r
+#define GLEE_C_DEFINED_glGetUniformBufferSizeEXT\r
+  GLint __stdcall GLee_Lazy_glGetUniformBufferSizeEXT(GLuint program, GLint location)  {if (GLeeInit()) return glGetUniformBufferSizeEXT(program, location); return (GLint)0;}\r
+  GLEEPFNGLGETUNIFORMBUFFERSIZEEXTPROC GLeeFuncPtr_glGetUniformBufferSizeEXT=GLee_Lazy_glGetUniformBufferSizeEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetUniformOffsetEXT\r
+#define GLEE_C_DEFINED_glGetUniformOffsetEXT\r
+  GLintptr __stdcall GLee_Lazy_glGetUniformOffsetEXT(GLuint program, GLint location)  {if (GLeeInit()) return glGetUniformOffsetEXT(program, location); return (GLintptr)0;}\r
+  GLEEPFNGLGETUNIFORMOFFSETEXTPROC GLeeFuncPtr_glGetUniformOffsetEXT=GLee_Lazy_glGetUniformOffsetEXT;\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_texture_integer */\r
+\r
+#ifdef __GLEE_GL_EXT_texture_integer\r
+#ifndef GLEE_C_DEFINED_glTexParameterIivEXT\r
+#define GLEE_C_DEFINED_glTexParameterIivEXT\r
+  void __stdcall GLee_Lazy_glTexParameterIivEXT(GLenum target, GLenum pname, const GLint * params)  {if (GLeeInit()) glTexParameterIivEXT(target, pname, params);}\r
+  GLEEPFNGLTEXPARAMETERIIVEXTPROC GLeeFuncPtr_glTexParameterIivEXT=GLee_Lazy_glTexParameterIivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTexParameterIuivEXT\r
+#define GLEE_C_DEFINED_glTexParameterIuivEXT\r
+  void __stdcall GLee_Lazy_glTexParameterIuivEXT(GLenum target, GLenum pname, const GLuint * params)  {if (GLeeInit()) glTexParameterIuivEXT(target, pname, params);}\r
+  GLEEPFNGLTEXPARAMETERIUIVEXTPROC GLeeFuncPtr_glTexParameterIuivEXT=GLee_Lazy_glTexParameterIuivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetTexParameterIivEXT\r
+#define GLEE_C_DEFINED_glGetTexParameterIivEXT\r
+  void __stdcall GLee_Lazy_glGetTexParameterIivEXT(GLenum target, GLenum pname, GLint * params)  {if (GLeeInit()) glGetTexParameterIivEXT(target, pname, params);}\r
+  GLEEPFNGLGETTEXPARAMETERIIVEXTPROC GLeeFuncPtr_glGetTexParameterIivEXT=GLee_Lazy_glGetTexParameterIivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetTexParameterIuivEXT\r
+#define GLEE_C_DEFINED_glGetTexParameterIuivEXT\r
+  void __stdcall GLee_Lazy_glGetTexParameterIuivEXT(GLenum target, GLenum pname, GLuint * params)  {if (GLeeInit()) glGetTexParameterIuivEXT(target, pname, params);}\r
+  GLEEPFNGLGETTEXPARAMETERIUIVEXTPROC GLeeFuncPtr_glGetTexParameterIuivEXT=GLee_Lazy_glGetTexParameterIuivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glClearColorIiEXT\r
+#define GLEE_C_DEFINED_glClearColorIiEXT\r
+  void __stdcall GLee_Lazy_glClearColorIiEXT(GLint red, GLint green, GLint blue, GLint alpha)  {if (GLeeInit()) glClearColorIiEXT(red, green, blue, alpha);}\r
+  GLEEPFNGLCLEARCOLORIIEXTPROC GLeeFuncPtr_glClearColorIiEXT=GLee_Lazy_glClearColorIiEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glClearColorIuiEXT\r
+#define GLEE_C_DEFINED_glClearColorIuiEXT\r
+  void __stdcall GLee_Lazy_glClearColorIuiEXT(GLuint red, GLuint green, GLuint blue, GLuint alpha)  {if (GLeeInit()) glClearColorIuiEXT(red, green, blue, alpha);}\r
+  GLEEPFNGLCLEARCOLORIUIEXTPROC GLeeFuncPtr_glClearColorIuiEXT=GLee_Lazy_glClearColorIuiEXT;\r
+#endif\r
+#endif \r
+\r
+/* GL_GREMEDY_frame_terminator */\r
+\r
+#ifdef __GLEE_GL_GREMEDY_frame_terminator\r
+#ifndef GLEE_C_DEFINED_glFrameTerminatorGREMEDY\r
+#define GLEE_C_DEFINED_glFrameTerminatorGREMEDY\r
+  void __stdcall GLee_Lazy_glFrameTerminatorGREMEDY(void)  {if (GLeeInit()) glFrameTerminatorGREMEDY();}\r
+  GLEEPFNGLFRAMETERMINATORGREMEDYPROC GLeeFuncPtr_glFrameTerminatorGREMEDY=GLee_Lazy_glFrameTerminatorGREMEDY;\r
+#endif\r
+#endif \r
+\r
+/* GL_NV_conditional_render */\r
+\r
+#ifdef __GLEE_GL_NV_conditional_render\r
+#ifndef GLEE_C_DEFINED_glBeginConditionalRenderNV\r
+#define GLEE_C_DEFINED_glBeginConditionalRenderNV\r
+  void __stdcall GLee_Lazy_glBeginConditionalRenderNV(GLuint id, GLenum mode)  {if (GLeeInit()) glBeginConditionalRenderNV(id, mode);}\r
+  GLEEPFNGLBEGINCONDITIONALRENDERNVPROC GLeeFuncPtr_glBeginConditionalRenderNV=GLee_Lazy_glBeginConditionalRenderNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glEndConditionalRenderNV\r
+#define GLEE_C_DEFINED_glEndConditionalRenderNV\r
+  void __stdcall GLee_Lazy_glEndConditionalRenderNV(void)  {if (GLeeInit()) glEndConditionalRenderNV();}\r
+  GLEEPFNGLENDCONDITIONALRENDERNVPROC GLeeFuncPtr_glEndConditionalRenderNV=GLee_Lazy_glEndConditionalRenderNV;\r
+#endif\r
+#endif \r
+\r
+/* GL_NV_present_video */\r
+\r
+#ifdef __GLEE_GL_NV_present_video\r
+#endif \r
+\r
+/* GL_EXT_transform_feedback */\r
+\r
+#ifdef __GLEE_GL_EXT_transform_feedback\r
+#ifndef GLEE_C_DEFINED_glBeginTransformFeedbackEXT\r
+#define GLEE_C_DEFINED_glBeginTransformFeedbackEXT\r
+  void __stdcall GLee_Lazy_glBeginTransformFeedbackEXT(GLenum primitiveMode)  {if (GLeeInit()) glBeginTransformFeedbackEXT(primitiveMode);}\r
+  GLEEPFNGLBEGINTRANSFORMFEEDBACKEXTPROC GLeeFuncPtr_glBeginTransformFeedbackEXT=GLee_Lazy_glBeginTransformFeedbackEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glEndTransformFeedbackEXT\r
+#define GLEE_C_DEFINED_glEndTransformFeedbackEXT\r
+  void __stdcall GLee_Lazy_glEndTransformFeedbackEXT(void)  {if (GLeeInit()) glEndTransformFeedbackEXT();}\r
+  GLEEPFNGLENDTRANSFORMFEEDBACKEXTPROC GLeeFuncPtr_glEndTransformFeedbackEXT=GLee_Lazy_glEndTransformFeedbackEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glBindBufferRangeEXT\r
+#define GLEE_C_DEFINED_glBindBufferRangeEXT\r
+  void __stdcall GLee_Lazy_glBindBufferRangeEXT(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)  {if (GLeeInit()) glBindBufferRangeEXT(target, index, buffer, offset, size);}\r
+  GLEEPFNGLBINDBUFFERRANGEEXTPROC GLeeFuncPtr_glBindBufferRangeEXT=GLee_Lazy_glBindBufferRangeEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glBindBufferOffsetEXT\r
+#define GLEE_C_DEFINED_glBindBufferOffsetEXT\r
+  void __stdcall GLee_Lazy_glBindBufferOffsetEXT(GLenum target, GLuint index, GLuint buffer, GLintptr offset)  {if (GLeeInit()) glBindBufferOffsetEXT(target, index, buffer, offset);}\r
+  GLEEPFNGLBINDBUFFEROFFSETEXTPROC GLeeFuncPtr_glBindBufferOffsetEXT=GLee_Lazy_glBindBufferOffsetEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glBindBufferBaseEXT\r
+#define GLEE_C_DEFINED_glBindBufferBaseEXT\r
+  void __stdcall GLee_Lazy_glBindBufferBaseEXT(GLenum target, GLuint index, GLuint buffer)  {if (GLeeInit()) glBindBufferBaseEXT(target, index, buffer);}\r
+  GLEEPFNGLBINDBUFFERBASEEXTPROC GLeeFuncPtr_glBindBufferBaseEXT=GLee_Lazy_glBindBufferBaseEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTransformFeedbackVaryingsEXT\r
+#define GLEE_C_DEFINED_glTransformFeedbackVaryingsEXT\r
+  void __stdcall GLee_Lazy_glTransformFeedbackVaryingsEXT(GLuint program, GLsizei count, const GLint * locations, GLenum bufferMode)  {if (GLeeInit()) glTransformFeedbackVaryingsEXT(program, count, locations, bufferMode);}\r
+  GLEEPFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC GLeeFuncPtr_glTransformFeedbackVaryingsEXT=GLee_Lazy_glTransformFeedbackVaryingsEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetTransformFeedbackVaryingEXT\r
+#define GLEE_C_DEFINED_glGetTransformFeedbackVaryingEXT\r
+  void __stdcall GLee_Lazy_glGetTransformFeedbackVaryingEXT(GLuint program, GLuint index, GLint * location)  {if (GLeeInit()) glGetTransformFeedbackVaryingEXT(program, index, location);}\r
+  GLEEPFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC GLeeFuncPtr_glGetTransformFeedbackVaryingEXT=GLee_Lazy_glGetTransformFeedbackVaryingEXT;\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_direct_state_access */\r
+\r
+#ifdef __GLEE_GL_EXT_direct_state_access\r
+#ifndef GLEE_C_DEFINED_glClientAttribDefaultEXT\r
+#define GLEE_C_DEFINED_glClientAttribDefaultEXT\r
+  void __stdcall GLee_Lazy_glClientAttribDefaultEXT(GLbitfield mask)  {if (GLeeInit()) glClientAttribDefaultEXT(mask);}\r
+  GLEEPFNGLCLIENTATTRIBDEFAULTEXTPROC GLeeFuncPtr_glClientAttribDefaultEXT=GLee_Lazy_glClientAttribDefaultEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glPushClientAttribDefaultEXT\r
+#define GLEE_C_DEFINED_glPushClientAttribDefaultEXT\r
+  void __stdcall GLee_Lazy_glPushClientAttribDefaultEXT(GLbitfield mask)  {if (GLeeInit()) glPushClientAttribDefaultEXT(mask);}\r
+  GLEEPFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC GLeeFuncPtr_glPushClientAttribDefaultEXT=GLee_Lazy_glPushClientAttribDefaultEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMatrixLoadfEXT\r
+#define GLEE_C_DEFINED_glMatrixLoadfEXT\r
+  void __stdcall GLee_Lazy_glMatrixLoadfEXT(GLenum mode, const GLfloat * m)  {if (GLeeInit()) glMatrixLoadfEXT(mode, m);}\r
+  GLEEPFNGLMATRIXLOADFEXTPROC GLeeFuncPtr_glMatrixLoadfEXT=GLee_Lazy_glMatrixLoadfEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMatrixLoaddEXT\r
+#define GLEE_C_DEFINED_glMatrixLoaddEXT\r
+  void __stdcall GLee_Lazy_glMatrixLoaddEXT(GLenum mode, const GLdouble * m)  {if (GLeeInit()) glMatrixLoaddEXT(mode, m);}\r
+  GLEEPFNGLMATRIXLOADDEXTPROC GLeeFuncPtr_glMatrixLoaddEXT=GLee_Lazy_glMatrixLoaddEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMatrixMultfEXT\r
+#define GLEE_C_DEFINED_glMatrixMultfEXT\r
+  void __stdcall GLee_Lazy_glMatrixMultfEXT(GLenum mode, const GLfloat * m)  {if (GLeeInit()) glMatrixMultfEXT(mode, m);}\r
+  GLEEPFNGLMATRIXMULTFEXTPROC GLeeFuncPtr_glMatrixMultfEXT=GLee_Lazy_glMatrixMultfEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMatrixMultdEXT\r
+#define GLEE_C_DEFINED_glMatrixMultdEXT\r
+  void __stdcall GLee_Lazy_glMatrixMultdEXT(GLenum mode, const GLdouble * m)  {if (GLeeInit()) glMatrixMultdEXT(mode, m);}\r
+  GLEEPFNGLMATRIXMULTDEXTPROC GLeeFuncPtr_glMatrixMultdEXT=GLee_Lazy_glMatrixMultdEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMatrixLoadIdentityEXT\r
+#define GLEE_C_DEFINED_glMatrixLoadIdentityEXT\r
+  void __stdcall GLee_Lazy_glMatrixLoadIdentityEXT(GLenum mode)  {if (GLeeInit()) glMatrixLoadIdentityEXT(mode);}\r
+  GLEEPFNGLMATRIXLOADIDENTITYEXTPROC GLeeFuncPtr_glMatrixLoadIdentityEXT=GLee_Lazy_glMatrixLoadIdentityEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMatrixRotatefEXT\r
+#define GLEE_C_DEFINED_glMatrixRotatefEXT\r
+  void __stdcall GLee_Lazy_glMatrixRotatefEXT(GLenum mode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z)  {if (GLeeInit()) glMatrixRotatefEXT(mode, angle, x, y, z);}\r
+  GLEEPFNGLMATRIXROTATEFEXTPROC GLeeFuncPtr_glMatrixRotatefEXT=GLee_Lazy_glMatrixRotatefEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMatrixRotatedEXT\r
+#define GLEE_C_DEFINED_glMatrixRotatedEXT\r
+  void __stdcall GLee_Lazy_glMatrixRotatedEXT(GLenum mode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z)  {if (GLeeInit()) glMatrixRotatedEXT(mode, angle, x, y, z);}\r
+  GLEEPFNGLMATRIXROTATEDEXTPROC GLeeFuncPtr_glMatrixRotatedEXT=GLee_Lazy_glMatrixRotatedEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMatrixScalefEXT\r
+#define GLEE_C_DEFINED_glMatrixScalefEXT\r
+  void __stdcall GLee_Lazy_glMatrixScalefEXT(GLenum mode, GLfloat x, GLfloat y, GLfloat z)  {if (GLeeInit()) glMatrixScalefEXT(mode, x, y, z);}\r
+  GLEEPFNGLMATRIXSCALEFEXTPROC GLeeFuncPtr_glMatrixScalefEXT=GLee_Lazy_glMatrixScalefEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMatrixScaledEXT\r
+#define GLEE_C_DEFINED_glMatrixScaledEXT\r
+  void __stdcall GLee_Lazy_glMatrixScaledEXT(GLenum mode, GLdouble x, GLdouble y, GLdouble z)  {if (GLeeInit()) glMatrixScaledEXT(mode, x, y, z);}\r
+  GLEEPFNGLMATRIXSCALEDEXTPROC GLeeFuncPtr_glMatrixScaledEXT=GLee_Lazy_glMatrixScaledEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMatrixTranslatefEXT\r
+#define GLEE_C_DEFINED_glMatrixTranslatefEXT\r
+  void __stdcall GLee_Lazy_glMatrixTranslatefEXT(GLenum mode, GLfloat x, GLfloat y, GLfloat z)  {if (GLeeInit()) glMatrixTranslatefEXT(mode, x, y, z);}\r
+  GLEEPFNGLMATRIXTRANSLATEFEXTPROC GLeeFuncPtr_glMatrixTranslatefEXT=GLee_Lazy_glMatrixTranslatefEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMatrixTranslatedEXT\r
+#define GLEE_C_DEFINED_glMatrixTranslatedEXT\r
+  void __stdcall GLee_Lazy_glMatrixTranslatedEXT(GLenum mode, GLdouble x, GLdouble y, GLdouble z)  {if (GLeeInit()) glMatrixTranslatedEXT(mode, x, y, z);}\r
+  GLEEPFNGLMATRIXTRANSLATEDEXTPROC GLeeFuncPtr_glMatrixTranslatedEXT=GLee_Lazy_glMatrixTranslatedEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMatrixFrustumEXT\r
+#define GLEE_C_DEFINED_glMatrixFrustumEXT\r
+  void __stdcall GLee_Lazy_glMatrixFrustumEXT(GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)  {if (GLeeInit()) glMatrixFrustumEXT(mode, left, right, bottom, top, zNear, zFar);}\r
+  GLEEPFNGLMATRIXFRUSTUMEXTPROC GLeeFuncPtr_glMatrixFrustumEXT=GLee_Lazy_glMatrixFrustumEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMatrixOrthoEXT\r
+#define GLEE_C_DEFINED_glMatrixOrthoEXT\r
+  void __stdcall GLee_Lazy_glMatrixOrthoEXT(GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)  {if (GLeeInit()) glMatrixOrthoEXT(mode, left, right, bottom, top, zNear, zFar);}\r
+  GLEEPFNGLMATRIXORTHOEXTPROC GLeeFuncPtr_glMatrixOrthoEXT=GLee_Lazy_glMatrixOrthoEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMatrixPopEXT\r
+#define GLEE_C_DEFINED_glMatrixPopEXT\r
+  void __stdcall GLee_Lazy_glMatrixPopEXT(GLenum mode)  {if (GLeeInit()) glMatrixPopEXT(mode);}\r
+  GLEEPFNGLMATRIXPOPEXTPROC GLeeFuncPtr_glMatrixPopEXT=GLee_Lazy_glMatrixPopEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMatrixPushEXT\r
+#define GLEE_C_DEFINED_glMatrixPushEXT\r
+  void __stdcall GLee_Lazy_glMatrixPushEXT(GLenum mode)  {if (GLeeInit()) glMatrixPushEXT(mode);}\r
+  GLEEPFNGLMATRIXPUSHEXTPROC GLeeFuncPtr_glMatrixPushEXT=GLee_Lazy_glMatrixPushEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMatrixLoadTransposefEXT\r
+#define GLEE_C_DEFINED_glMatrixLoadTransposefEXT\r
+  void __stdcall GLee_Lazy_glMatrixLoadTransposefEXT(GLenum mode, const GLfloat * m)  {if (GLeeInit()) glMatrixLoadTransposefEXT(mode, m);}\r
+  GLEEPFNGLMATRIXLOADTRANSPOSEFEXTPROC GLeeFuncPtr_glMatrixLoadTransposefEXT=GLee_Lazy_glMatrixLoadTransposefEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMatrixLoadTransposedEXT\r
+#define GLEE_C_DEFINED_glMatrixLoadTransposedEXT\r
+  void __stdcall GLee_Lazy_glMatrixLoadTransposedEXT(GLenum mode, const GLdouble * m)  {if (GLeeInit()) glMatrixLoadTransposedEXT(mode, m);}\r
+  GLEEPFNGLMATRIXLOADTRANSPOSEDEXTPROC GLeeFuncPtr_glMatrixLoadTransposedEXT=GLee_Lazy_glMatrixLoadTransposedEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMatrixMultTransposefEXT\r
+#define GLEE_C_DEFINED_glMatrixMultTransposefEXT\r
+  void __stdcall GLee_Lazy_glMatrixMultTransposefEXT(GLenum mode, const GLfloat * m)  {if (GLeeInit()) glMatrixMultTransposefEXT(mode, m);}\r
+  GLEEPFNGLMATRIXMULTTRANSPOSEFEXTPROC GLeeFuncPtr_glMatrixMultTransposefEXT=GLee_Lazy_glMatrixMultTransposefEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMatrixMultTransposedEXT\r
+#define GLEE_C_DEFINED_glMatrixMultTransposedEXT\r
+  void __stdcall GLee_Lazy_glMatrixMultTransposedEXT(GLenum mode, const GLdouble * m)  {if (GLeeInit()) glMatrixMultTransposedEXT(mode, m);}\r
+  GLEEPFNGLMATRIXMULTTRANSPOSEDEXTPROC GLeeFuncPtr_glMatrixMultTransposedEXT=GLee_Lazy_glMatrixMultTransposedEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTextureParameterfEXT\r
+#define GLEE_C_DEFINED_glTextureParameterfEXT\r
+  void __stdcall GLee_Lazy_glTextureParameterfEXT(GLuint texture, GLenum target, GLenum pname, GLfloat param)  {if (GLeeInit()) glTextureParameterfEXT(texture, target, pname, param);}\r
+  GLEEPFNGLTEXTUREPARAMETERFEXTPROC GLeeFuncPtr_glTextureParameterfEXT=GLee_Lazy_glTextureParameterfEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTextureParameterfvEXT\r
+#define GLEE_C_DEFINED_glTextureParameterfvEXT\r
+  void __stdcall GLee_Lazy_glTextureParameterfvEXT(GLuint texture, GLenum target, GLenum pname, const GLfloat * params)  {if (GLeeInit()) glTextureParameterfvEXT(texture, target, pname, params);}\r
+  GLEEPFNGLTEXTUREPARAMETERFVEXTPROC GLeeFuncPtr_glTextureParameterfvEXT=GLee_Lazy_glTextureParameterfvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTextureParameteriEXT\r
+#define GLEE_C_DEFINED_glTextureParameteriEXT\r
+  void __stdcall GLee_Lazy_glTextureParameteriEXT(GLuint texture, GLenum target, GLenum pname, GLint param)  {if (GLeeInit()) glTextureParameteriEXT(texture, target, pname, param);}\r
+  GLEEPFNGLTEXTUREPARAMETERIEXTPROC GLeeFuncPtr_glTextureParameteriEXT=GLee_Lazy_glTextureParameteriEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTextureParameterivEXT\r
+#define GLEE_C_DEFINED_glTextureParameterivEXT\r
+  void __stdcall GLee_Lazy_glTextureParameterivEXT(GLuint texture, GLenum target, GLenum pname, const GLint * params)  {if (GLeeInit()) glTextureParameterivEXT(texture, target, pname, params);}\r
+  GLEEPFNGLTEXTUREPARAMETERIVEXTPROC GLeeFuncPtr_glTextureParameterivEXT=GLee_Lazy_glTextureParameterivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTextureImage1DEXT\r
+#define GLEE_C_DEFINED_glTextureImage1DEXT\r
+  void __stdcall GLee_Lazy_glTextureImage1DEXT(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid * pixels)  {if (GLeeInit()) glTextureImage1DEXT(texture, target, level, internalformat, width, border, format, type, pixels);}\r
+  GLEEPFNGLTEXTUREIMAGE1DEXTPROC GLeeFuncPtr_glTextureImage1DEXT=GLee_Lazy_glTextureImage1DEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTextureImage2DEXT\r
+#define GLEE_C_DEFINED_glTextureImage2DEXT\r
+  void __stdcall GLee_Lazy_glTextureImage2DEXT(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid * pixels)  {if (GLeeInit()) glTextureImage2DEXT(texture, target, level, internalformat, width, height, border, format, type, pixels);}\r
+  GLEEPFNGLTEXTUREIMAGE2DEXTPROC GLeeFuncPtr_glTextureImage2DEXT=GLee_Lazy_glTextureImage2DEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTextureSubImage1DEXT\r
+#define GLEE_C_DEFINED_glTextureSubImage1DEXT\r
+  void __stdcall GLee_Lazy_glTextureSubImage1DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid * pixels)  {if (GLeeInit()) glTextureSubImage1DEXT(texture, target, level, xoffset, width, format, type, pixels);}\r
+  GLEEPFNGLTEXTURESUBIMAGE1DEXTPROC GLeeFuncPtr_glTextureSubImage1DEXT=GLee_Lazy_glTextureSubImage1DEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTextureSubImage2DEXT\r
+#define GLEE_C_DEFINED_glTextureSubImage2DEXT\r
+  void __stdcall GLee_Lazy_glTextureSubImage2DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * pixels)  {if (GLeeInit()) glTextureSubImage2DEXT(texture, target, level, xoffset, yoffset, width, height, format, type, pixels);}\r
+  GLEEPFNGLTEXTURESUBIMAGE2DEXTPROC GLeeFuncPtr_glTextureSubImage2DEXT=GLee_Lazy_glTextureSubImage2DEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glCopyTextureImage1DEXT\r
+#define GLEE_C_DEFINED_glCopyTextureImage1DEXT\r
+  void __stdcall GLee_Lazy_glCopyTextureImage1DEXT(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)  {if (GLeeInit()) glCopyTextureImage1DEXT(texture, target, level, internalformat, x, y, width, border);}\r
+  GLEEPFNGLCOPYTEXTUREIMAGE1DEXTPROC GLeeFuncPtr_glCopyTextureImage1DEXT=GLee_Lazy_glCopyTextureImage1DEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glCopyTextureImage2DEXT\r
+#define GLEE_C_DEFINED_glCopyTextureImage2DEXT\r
+  void __stdcall GLee_Lazy_glCopyTextureImage2DEXT(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)  {if (GLeeInit()) glCopyTextureImage2DEXT(texture, target, level, internalformat, x, y, width, height, border);}\r
+  GLEEPFNGLCOPYTEXTUREIMAGE2DEXTPROC GLeeFuncPtr_glCopyTextureImage2DEXT=GLee_Lazy_glCopyTextureImage2DEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glCopyTextureSubImage1DEXT\r
+#define GLEE_C_DEFINED_glCopyTextureSubImage1DEXT\r
+  void __stdcall GLee_Lazy_glCopyTextureSubImage1DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)  {if (GLeeInit()) glCopyTextureSubImage1DEXT(texture, target, level, xoffset, x, y, width);}\r
+  GLEEPFNGLCOPYTEXTURESUBIMAGE1DEXTPROC GLeeFuncPtr_glCopyTextureSubImage1DEXT=GLee_Lazy_glCopyTextureSubImage1DEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glCopyTextureSubImage2DEXT\r
+#define GLEE_C_DEFINED_glCopyTextureSubImage2DEXT\r
+  void __stdcall GLee_Lazy_glCopyTextureSubImage2DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)  {if (GLeeInit()) glCopyTextureSubImage2DEXT(texture, target, level, xoffset, yoffset, x, y, width, height);}\r
+  GLEEPFNGLCOPYTEXTURESUBIMAGE2DEXTPROC GLeeFuncPtr_glCopyTextureSubImage2DEXT=GLee_Lazy_glCopyTextureSubImage2DEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetTextureImageEXT\r
+#define GLEE_C_DEFINED_glGetTextureImageEXT\r
+  void __stdcall GLee_Lazy_glGetTextureImageEXT(GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, GLvoid * pixels)  {if (GLeeInit()) glGetTextureImageEXT(texture, target, level, format, type, pixels);}\r
+  GLEEPFNGLGETTEXTUREIMAGEEXTPROC GLeeFuncPtr_glGetTextureImageEXT=GLee_Lazy_glGetTextureImageEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetTextureParameterfvEXT\r
+#define GLEE_C_DEFINED_glGetTextureParameterfvEXT\r
+  void __stdcall GLee_Lazy_glGetTextureParameterfvEXT(GLuint texture, GLenum target, GLenum pname, GLfloat * params)  {if (GLeeInit()) glGetTextureParameterfvEXT(texture, target, pname, params);}\r
+  GLEEPFNGLGETTEXTUREPARAMETERFVEXTPROC GLeeFuncPtr_glGetTextureParameterfvEXT=GLee_Lazy_glGetTextureParameterfvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetTextureParameterivEXT\r
+#define GLEE_C_DEFINED_glGetTextureParameterivEXT\r
+  void __stdcall GLee_Lazy_glGetTextureParameterivEXT(GLuint texture, GLenum target, GLenum pname, GLint * params)  {if (GLeeInit()) glGetTextureParameterivEXT(texture, target, pname, params);}\r
+  GLEEPFNGLGETTEXTUREPARAMETERIVEXTPROC GLeeFuncPtr_glGetTextureParameterivEXT=GLee_Lazy_glGetTextureParameterivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetTextureLevelParameterfvEXT\r
+#define GLEE_C_DEFINED_glGetTextureLevelParameterfvEXT\r
+  void __stdcall GLee_Lazy_glGetTextureLevelParameterfvEXT(GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat * params)  {if (GLeeInit()) glGetTextureLevelParameterfvEXT(texture, target, level, pname, params);}\r
+  GLEEPFNGLGETTEXTURELEVELPARAMETERFVEXTPROC GLeeFuncPtr_glGetTextureLevelParameterfvEXT=GLee_Lazy_glGetTextureLevelParameterfvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetTextureLevelParameterivEXT\r
+#define GLEE_C_DEFINED_glGetTextureLevelParameterivEXT\r
+  void __stdcall GLee_Lazy_glGetTextureLevelParameterivEXT(GLuint texture, GLenum target, GLint level, GLenum pname, GLint * params)  {if (GLeeInit()) glGetTextureLevelParameterivEXT(texture, target, level, pname, params);}\r
+  GLEEPFNGLGETTEXTURELEVELPARAMETERIVEXTPROC GLeeFuncPtr_glGetTextureLevelParameterivEXT=GLee_Lazy_glGetTextureLevelParameterivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTextureImage3DEXT\r
+#define GLEE_C_DEFINED_glTextureImage3DEXT\r
+  void __stdcall GLee_Lazy_glTextureImage3DEXT(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid * pixels)  {if (GLeeInit()) glTextureImage3DEXT(texture, target, level, internalformat, width, height, depth, border, format, type, pixels);}\r
+  GLEEPFNGLTEXTUREIMAGE3DEXTPROC GLeeFuncPtr_glTextureImage3DEXT=GLee_Lazy_glTextureImage3DEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTextureSubImage3DEXT\r
+#define GLEE_C_DEFINED_glTextureSubImage3DEXT\r
+  void __stdcall GLee_Lazy_glTextureSubImage3DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid * pixels)  {if (GLeeInit()) glTextureSubImage3DEXT(texture, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);}\r
+  GLEEPFNGLTEXTURESUBIMAGE3DEXTPROC GLeeFuncPtr_glTextureSubImage3DEXT=GLee_Lazy_glTextureSubImage3DEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glCopyTextureSubImage3DEXT\r
+#define GLEE_C_DEFINED_glCopyTextureSubImage3DEXT\r
+  void __stdcall GLee_Lazy_glCopyTextureSubImage3DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)  {if (GLeeInit()) glCopyTextureSubImage3DEXT(texture, target, level, xoffset, yoffset, zoffset, x, y, width, height);}\r
+  GLEEPFNGLCOPYTEXTURESUBIMAGE3DEXTPROC GLeeFuncPtr_glCopyTextureSubImage3DEXT=GLee_Lazy_glCopyTextureSubImage3DEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexParameterfEXT\r
+#define GLEE_C_DEFINED_glMultiTexParameterfEXT\r
+  void __stdcall GLee_Lazy_glMultiTexParameterfEXT(GLenum texunit, GLenum target, GLenum pname, GLfloat param)  {if (GLeeInit()) glMultiTexParameterfEXT(texunit, target, pname, param);}\r
+  GLEEPFNGLMULTITEXPARAMETERFEXTPROC GLeeFuncPtr_glMultiTexParameterfEXT=GLee_Lazy_glMultiTexParameterfEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexParameterfvEXT\r
+#define GLEE_C_DEFINED_glMultiTexParameterfvEXT\r
+  void __stdcall GLee_Lazy_glMultiTexParameterfvEXT(GLenum texunit, GLenum target, GLenum pname, const GLfloat * params)  {if (GLeeInit()) glMultiTexParameterfvEXT(texunit, target, pname, params);}\r
+  GLEEPFNGLMULTITEXPARAMETERFVEXTPROC GLeeFuncPtr_glMultiTexParameterfvEXT=GLee_Lazy_glMultiTexParameterfvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexParameteriEXT\r
+#define GLEE_C_DEFINED_glMultiTexParameteriEXT\r
+  void __stdcall GLee_Lazy_glMultiTexParameteriEXT(GLenum texunit, GLenum target, GLenum pname, GLint param)  {if (GLeeInit()) glMultiTexParameteriEXT(texunit, target, pname, param);}\r
+  GLEEPFNGLMULTITEXPARAMETERIEXTPROC GLeeFuncPtr_glMultiTexParameteriEXT=GLee_Lazy_glMultiTexParameteriEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexParameterivEXT\r
+#define GLEE_C_DEFINED_glMultiTexParameterivEXT\r
+  void __stdcall GLee_Lazy_glMultiTexParameterivEXT(GLenum texunit, GLenum target, GLenum pname, const GLint * params)  {if (GLeeInit()) glMultiTexParameterivEXT(texunit, target, pname, params);}\r
+  GLEEPFNGLMULTITEXPARAMETERIVEXTPROC GLeeFuncPtr_glMultiTexParameterivEXT=GLee_Lazy_glMultiTexParameterivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexImage1DEXT\r
+#define GLEE_C_DEFINED_glMultiTexImage1DEXT\r
+  void __stdcall GLee_Lazy_glMultiTexImage1DEXT(GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid * pixels)  {if (GLeeInit()) glMultiTexImage1DEXT(texunit, target, level, internalformat, width, border, format, type, pixels);}\r
+  GLEEPFNGLMULTITEXIMAGE1DEXTPROC GLeeFuncPtr_glMultiTexImage1DEXT=GLee_Lazy_glMultiTexImage1DEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexImage2DEXT\r
+#define GLEE_C_DEFINED_glMultiTexImage2DEXT\r
+  void __stdcall GLee_Lazy_glMultiTexImage2DEXT(GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid * pixels)  {if (GLeeInit()) glMultiTexImage2DEXT(texunit, target, level, internalformat, width, height, border, format, type, pixels);}\r
+  GLEEPFNGLMULTITEXIMAGE2DEXTPROC GLeeFuncPtr_glMultiTexImage2DEXT=GLee_Lazy_glMultiTexImage2DEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexSubImage1DEXT\r
+#define GLEE_C_DEFINED_glMultiTexSubImage1DEXT\r
+  void __stdcall GLee_Lazy_glMultiTexSubImage1DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid * pixels)  {if (GLeeInit()) glMultiTexSubImage1DEXT(texunit, target, level, xoffset, width, format, type, pixels);}\r
+  GLEEPFNGLMULTITEXSUBIMAGE1DEXTPROC GLeeFuncPtr_glMultiTexSubImage1DEXT=GLee_Lazy_glMultiTexSubImage1DEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexSubImage2DEXT\r
+#define GLEE_C_DEFINED_glMultiTexSubImage2DEXT\r
+  void __stdcall GLee_Lazy_glMultiTexSubImage2DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * pixels)  {if (GLeeInit()) glMultiTexSubImage2DEXT(texunit, target, level, xoffset, yoffset, width, height, format, type, pixels);}\r
+  GLEEPFNGLMULTITEXSUBIMAGE2DEXTPROC GLeeFuncPtr_glMultiTexSubImage2DEXT=GLee_Lazy_glMultiTexSubImage2DEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glCopyMultiTexImage1DEXT\r
+#define GLEE_C_DEFINED_glCopyMultiTexImage1DEXT\r
+  void __stdcall GLee_Lazy_glCopyMultiTexImage1DEXT(GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)  {if (GLeeInit()) glCopyMultiTexImage1DEXT(texunit, target, level, internalformat, x, y, width, border);}\r
+  GLEEPFNGLCOPYMULTITEXIMAGE1DEXTPROC GLeeFuncPtr_glCopyMultiTexImage1DEXT=GLee_Lazy_glCopyMultiTexImage1DEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glCopyMultiTexImage2DEXT\r
+#define GLEE_C_DEFINED_glCopyMultiTexImage2DEXT\r
+  void __stdcall GLee_Lazy_glCopyMultiTexImage2DEXT(GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)  {if (GLeeInit()) glCopyMultiTexImage2DEXT(texunit, target, level, internalformat, x, y, width, height, border);}\r
+  GLEEPFNGLCOPYMULTITEXIMAGE2DEXTPROC GLeeFuncPtr_glCopyMultiTexImage2DEXT=GLee_Lazy_glCopyMultiTexImage2DEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glCopyMultiTexSubImage1DEXT\r
+#define GLEE_C_DEFINED_glCopyMultiTexSubImage1DEXT\r
+  void __stdcall GLee_Lazy_glCopyMultiTexSubImage1DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)  {if (GLeeInit()) glCopyMultiTexSubImage1DEXT(texunit, target, level, xoffset, x, y, width);}\r
+  GLEEPFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC GLeeFuncPtr_glCopyMultiTexSubImage1DEXT=GLee_Lazy_glCopyMultiTexSubImage1DEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glCopyMultiTexSubImage2DEXT\r
+#define GLEE_C_DEFINED_glCopyMultiTexSubImage2DEXT\r
+  void __stdcall GLee_Lazy_glCopyMultiTexSubImage2DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)  {if (GLeeInit()) glCopyMultiTexSubImage2DEXT(texunit, target, level, xoffset, yoffset, x, y, width, height);}\r
+  GLEEPFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC GLeeFuncPtr_glCopyMultiTexSubImage2DEXT=GLee_Lazy_glCopyMultiTexSubImage2DEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetMultiTexImageEXT\r
+#define GLEE_C_DEFINED_glGetMultiTexImageEXT\r
+  void __stdcall GLee_Lazy_glGetMultiTexImageEXT(GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, GLvoid * pixels)  {if (GLeeInit()) glGetMultiTexImageEXT(texunit, target, level, format, type, pixels);}\r
+  GLEEPFNGLGETMULTITEXIMAGEEXTPROC GLeeFuncPtr_glGetMultiTexImageEXT=GLee_Lazy_glGetMultiTexImageEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetMultiTexParameterfvEXT\r
+#define GLEE_C_DEFINED_glGetMultiTexParameterfvEXT\r
+  void __stdcall GLee_Lazy_glGetMultiTexParameterfvEXT(GLenum texunit, GLenum target, GLenum pname, GLfloat * params)  {if (GLeeInit()) glGetMultiTexParameterfvEXT(texunit, target, pname, params);}\r
+  GLEEPFNGLGETMULTITEXPARAMETERFVEXTPROC GLeeFuncPtr_glGetMultiTexParameterfvEXT=GLee_Lazy_glGetMultiTexParameterfvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetMultiTexParameterivEXT\r
+#define GLEE_C_DEFINED_glGetMultiTexParameterivEXT\r
+  void __stdcall GLee_Lazy_glGetMultiTexParameterivEXT(GLenum texunit, GLenum target, GLenum pname, GLint * params)  {if (GLeeInit()) glGetMultiTexParameterivEXT(texunit, target, pname, params);}\r
+  GLEEPFNGLGETMULTITEXPARAMETERIVEXTPROC GLeeFuncPtr_glGetMultiTexParameterivEXT=GLee_Lazy_glGetMultiTexParameterivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetMultiTexLevelParameterfvEXT\r
+#define GLEE_C_DEFINED_glGetMultiTexLevelParameterfvEXT\r
+  void __stdcall GLee_Lazy_glGetMultiTexLevelParameterfvEXT(GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat * params)  {if (GLeeInit()) glGetMultiTexLevelParameterfvEXT(texunit, target, level, pname, params);}\r
+  GLEEPFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC GLeeFuncPtr_glGetMultiTexLevelParameterfvEXT=GLee_Lazy_glGetMultiTexLevelParameterfvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetMultiTexLevelParameterivEXT\r
+#define GLEE_C_DEFINED_glGetMultiTexLevelParameterivEXT\r
+  void __stdcall GLee_Lazy_glGetMultiTexLevelParameterivEXT(GLenum texunit, GLenum target, GLint level, GLenum pname, GLint * params)  {if (GLeeInit()) glGetMultiTexLevelParameterivEXT(texunit, target, level, pname, params);}\r
+  GLEEPFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC GLeeFuncPtr_glGetMultiTexLevelParameterivEXT=GLee_Lazy_glGetMultiTexLevelParameterivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexImage3DEXT\r
+#define GLEE_C_DEFINED_glMultiTexImage3DEXT\r
+  void __stdcall GLee_Lazy_glMultiTexImage3DEXT(GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid * pixels)  {if (GLeeInit()) glMultiTexImage3DEXT(texunit, target, level, internalformat, width, height, depth, border, format, type, pixels);}\r
+  GLEEPFNGLMULTITEXIMAGE3DEXTPROC GLeeFuncPtr_glMultiTexImage3DEXT=GLee_Lazy_glMultiTexImage3DEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexSubImage3DEXT\r
+#define GLEE_C_DEFINED_glMultiTexSubImage3DEXT\r
+  void __stdcall GLee_Lazy_glMultiTexSubImage3DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid * pixels)  {if (GLeeInit()) glMultiTexSubImage3DEXT(texunit, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);}\r
+  GLEEPFNGLMULTITEXSUBIMAGE3DEXTPROC GLeeFuncPtr_glMultiTexSubImage3DEXT=GLee_Lazy_glMultiTexSubImage3DEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glCopyMultiTexSubImage3DEXT\r
+#define GLEE_C_DEFINED_glCopyMultiTexSubImage3DEXT\r
+  void __stdcall GLee_Lazy_glCopyMultiTexSubImage3DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)  {if (GLeeInit()) glCopyMultiTexSubImage3DEXT(texunit, target, level, xoffset, yoffset, zoffset, x, y, width, height);}\r
+  GLEEPFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC GLeeFuncPtr_glCopyMultiTexSubImage3DEXT=GLee_Lazy_glCopyMultiTexSubImage3DEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glBindMultiTextureEXT\r
+#define GLEE_C_DEFINED_glBindMultiTextureEXT\r
+  void __stdcall GLee_Lazy_glBindMultiTextureEXT(GLenum texunit, GLenum target, GLuint texture)  {if (GLeeInit()) glBindMultiTextureEXT(texunit, target, texture);}\r
+  GLEEPFNGLBINDMULTITEXTUREEXTPROC GLeeFuncPtr_glBindMultiTextureEXT=GLee_Lazy_glBindMultiTextureEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glEnableClientStateIndexedEXT\r
+#define GLEE_C_DEFINED_glEnableClientStateIndexedEXT\r
+  void __stdcall GLee_Lazy_glEnableClientStateIndexedEXT(GLenum array, GLuint index)  {if (GLeeInit()) glEnableClientStateIndexedEXT(array, index);}\r
+  GLEEPFNGLENABLECLIENTSTATEINDEXEDEXTPROC GLeeFuncPtr_glEnableClientStateIndexedEXT=GLee_Lazy_glEnableClientStateIndexedEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glDisableClientStateIndexedEXT\r
+#define GLEE_C_DEFINED_glDisableClientStateIndexedEXT\r
+  void __stdcall GLee_Lazy_glDisableClientStateIndexedEXT(GLenum array, GLuint index)  {if (GLeeInit()) glDisableClientStateIndexedEXT(array, index);}\r
+  GLEEPFNGLDISABLECLIENTSTATEINDEXEDEXTPROC GLeeFuncPtr_glDisableClientStateIndexedEXT=GLee_Lazy_glDisableClientStateIndexedEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexCoordPointerEXT\r
+#define GLEE_C_DEFINED_glMultiTexCoordPointerEXT\r
+  void __stdcall GLee_Lazy_glMultiTexCoordPointerEXT(GLenum texunit, GLint size, GLenum type, GLsizei stride, const GLvoid * pointer)  {if (GLeeInit()) glMultiTexCoordPointerEXT(texunit, size, type, stride, pointer);}\r
+  GLEEPFNGLMULTITEXCOORDPOINTEREXTPROC GLeeFuncPtr_glMultiTexCoordPointerEXT=GLee_Lazy_glMultiTexCoordPointerEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexEnvfEXT\r
+#define GLEE_C_DEFINED_glMultiTexEnvfEXT\r
+  void __stdcall GLee_Lazy_glMultiTexEnvfEXT(GLenum texunit, GLenum target, GLenum pname, GLfloat param)  {if (GLeeInit()) glMultiTexEnvfEXT(texunit, target, pname, param);}\r
+  GLEEPFNGLMULTITEXENVFEXTPROC GLeeFuncPtr_glMultiTexEnvfEXT=GLee_Lazy_glMultiTexEnvfEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexEnvfvEXT\r
+#define GLEE_C_DEFINED_glMultiTexEnvfvEXT\r
+  void __stdcall GLee_Lazy_glMultiTexEnvfvEXT(GLenum texunit, GLenum target, GLenum pname, const GLfloat * params)  {if (GLeeInit()) glMultiTexEnvfvEXT(texunit, target, pname, params);}\r
+  GLEEPFNGLMULTITEXENVFVEXTPROC GLeeFuncPtr_glMultiTexEnvfvEXT=GLee_Lazy_glMultiTexEnvfvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexEnviEXT\r
+#define GLEE_C_DEFINED_glMultiTexEnviEXT\r
+  void __stdcall GLee_Lazy_glMultiTexEnviEXT(GLenum texunit, GLenum target, GLenum pname, GLint param)  {if (GLeeInit()) glMultiTexEnviEXT(texunit, target, pname, param);}\r
+  GLEEPFNGLMULTITEXENVIEXTPROC GLeeFuncPtr_glMultiTexEnviEXT=GLee_Lazy_glMultiTexEnviEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexEnvivEXT\r
+#define GLEE_C_DEFINED_glMultiTexEnvivEXT\r
+  void __stdcall GLee_Lazy_glMultiTexEnvivEXT(GLenum texunit, GLenum target, GLenum pname, const GLint * params)  {if (GLeeInit()) glMultiTexEnvivEXT(texunit, target, pname, params);}\r
+  GLEEPFNGLMULTITEXENVIVEXTPROC GLeeFuncPtr_glMultiTexEnvivEXT=GLee_Lazy_glMultiTexEnvivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexGendEXT\r
+#define GLEE_C_DEFINED_glMultiTexGendEXT\r
+  void __stdcall GLee_Lazy_glMultiTexGendEXT(GLenum texunit, GLenum coord, GLenum pname, GLdouble param)  {if (GLeeInit()) glMultiTexGendEXT(texunit, coord, pname, param);}\r
+  GLEEPFNGLMULTITEXGENDEXTPROC GLeeFuncPtr_glMultiTexGendEXT=GLee_Lazy_glMultiTexGendEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexGendvEXT\r
+#define GLEE_C_DEFINED_glMultiTexGendvEXT\r
+  void __stdcall GLee_Lazy_glMultiTexGendvEXT(GLenum texunit, GLenum coord, GLenum pname, const GLdouble * params)  {if (GLeeInit()) glMultiTexGendvEXT(texunit, coord, pname, params);}\r
+  GLEEPFNGLMULTITEXGENDVEXTPROC GLeeFuncPtr_glMultiTexGendvEXT=GLee_Lazy_glMultiTexGendvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexGenfEXT\r
+#define GLEE_C_DEFINED_glMultiTexGenfEXT\r
+  void __stdcall GLee_Lazy_glMultiTexGenfEXT(GLenum texunit, GLenum coord, GLenum pname, GLfloat param)  {if (GLeeInit()) glMultiTexGenfEXT(texunit, coord, pname, param);}\r
+  GLEEPFNGLMULTITEXGENFEXTPROC GLeeFuncPtr_glMultiTexGenfEXT=GLee_Lazy_glMultiTexGenfEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexGenfvEXT\r
+#define GLEE_C_DEFINED_glMultiTexGenfvEXT\r
+  void __stdcall GLee_Lazy_glMultiTexGenfvEXT(GLenum texunit, GLenum coord, GLenum pname, const GLfloat * params)  {if (GLeeInit()) glMultiTexGenfvEXT(texunit, coord, pname, params);}\r
+  GLEEPFNGLMULTITEXGENFVEXTPROC GLeeFuncPtr_glMultiTexGenfvEXT=GLee_Lazy_glMultiTexGenfvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexGeniEXT\r
+#define GLEE_C_DEFINED_glMultiTexGeniEXT\r
+  void __stdcall GLee_Lazy_glMultiTexGeniEXT(GLenum texunit, GLenum coord, GLenum pname, GLint param)  {if (GLeeInit()) glMultiTexGeniEXT(texunit, coord, pname, param);}\r
+  GLEEPFNGLMULTITEXGENIEXTPROC GLeeFuncPtr_glMultiTexGeniEXT=GLee_Lazy_glMultiTexGeniEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexGenivEXT\r
+#define GLEE_C_DEFINED_glMultiTexGenivEXT\r
+  void __stdcall GLee_Lazy_glMultiTexGenivEXT(GLenum texunit, GLenum coord, GLenum pname, const GLint * params)  {if (GLeeInit()) glMultiTexGenivEXT(texunit, coord, pname, params);}\r
+  GLEEPFNGLMULTITEXGENIVEXTPROC GLeeFuncPtr_glMultiTexGenivEXT=GLee_Lazy_glMultiTexGenivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetMultiTexEnvfvEXT\r
+#define GLEE_C_DEFINED_glGetMultiTexEnvfvEXT\r
+  void __stdcall GLee_Lazy_glGetMultiTexEnvfvEXT(GLenum texunit, GLenum target, GLenum pname, GLfloat * params)  {if (GLeeInit()) glGetMultiTexEnvfvEXT(texunit, target, pname, params);}\r
+  GLEEPFNGLGETMULTITEXENVFVEXTPROC GLeeFuncPtr_glGetMultiTexEnvfvEXT=GLee_Lazy_glGetMultiTexEnvfvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetMultiTexEnvivEXT\r
+#define GLEE_C_DEFINED_glGetMultiTexEnvivEXT\r
+  void __stdcall GLee_Lazy_glGetMultiTexEnvivEXT(GLenum texunit, GLenum target, GLenum pname, GLint * params)  {if (GLeeInit()) glGetMultiTexEnvivEXT(texunit, target, pname, params);}\r
+  GLEEPFNGLGETMULTITEXENVIVEXTPROC GLeeFuncPtr_glGetMultiTexEnvivEXT=GLee_Lazy_glGetMultiTexEnvivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetMultiTexGendvEXT\r
+#define GLEE_C_DEFINED_glGetMultiTexGendvEXT\r
+  void __stdcall GLee_Lazy_glGetMultiTexGendvEXT(GLenum texunit, GLenum coord, GLenum pname, GLdouble * params)  {if (GLeeInit()) glGetMultiTexGendvEXT(texunit, coord, pname, params);}\r
+  GLEEPFNGLGETMULTITEXGENDVEXTPROC GLeeFuncPtr_glGetMultiTexGendvEXT=GLee_Lazy_glGetMultiTexGendvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetMultiTexGenfvEXT\r
+#define GLEE_C_DEFINED_glGetMultiTexGenfvEXT\r
+  void __stdcall GLee_Lazy_glGetMultiTexGenfvEXT(GLenum texunit, GLenum coord, GLenum pname, GLfloat * params)  {if (GLeeInit()) glGetMultiTexGenfvEXT(texunit, coord, pname, params);}\r
+  GLEEPFNGLGETMULTITEXGENFVEXTPROC GLeeFuncPtr_glGetMultiTexGenfvEXT=GLee_Lazy_glGetMultiTexGenfvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetMultiTexGenivEXT\r
+#define GLEE_C_DEFINED_glGetMultiTexGenivEXT\r
+  void __stdcall GLee_Lazy_glGetMultiTexGenivEXT(GLenum texunit, GLenum coord, GLenum pname, GLint * params)  {if (GLeeInit()) glGetMultiTexGenivEXT(texunit, coord, pname, params);}\r
+  GLEEPFNGLGETMULTITEXGENIVEXTPROC GLeeFuncPtr_glGetMultiTexGenivEXT=GLee_Lazy_glGetMultiTexGenivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetFloatIndexedvEXT\r
+#define GLEE_C_DEFINED_glGetFloatIndexedvEXT\r
+  void __stdcall GLee_Lazy_glGetFloatIndexedvEXT(GLenum target, GLuint index, GLfloat * data)  {if (GLeeInit()) glGetFloatIndexedvEXT(target, index, data);}\r
+  GLEEPFNGLGETFLOATINDEXEDVEXTPROC GLeeFuncPtr_glGetFloatIndexedvEXT=GLee_Lazy_glGetFloatIndexedvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetDoubleIndexedvEXT\r
+#define GLEE_C_DEFINED_glGetDoubleIndexedvEXT\r
+  void __stdcall GLee_Lazy_glGetDoubleIndexedvEXT(GLenum target, GLuint index, GLdouble * data)  {if (GLeeInit()) glGetDoubleIndexedvEXT(target, index, data);}\r
+  GLEEPFNGLGETDOUBLEINDEXEDVEXTPROC GLeeFuncPtr_glGetDoubleIndexedvEXT=GLee_Lazy_glGetDoubleIndexedvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetPointerIndexedvEXT\r
+#define GLEE_C_DEFINED_glGetPointerIndexedvEXT\r
+  void __stdcall GLee_Lazy_glGetPointerIndexedvEXT(GLenum target, GLuint index, GLvoid* * data)  {if (GLeeInit()) glGetPointerIndexedvEXT(target, index, data);}\r
+  GLEEPFNGLGETPOINTERINDEXEDVEXTPROC GLeeFuncPtr_glGetPointerIndexedvEXT=GLee_Lazy_glGetPointerIndexedvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glCompressedTextureImage3DEXT\r
+#define GLEE_C_DEFINED_glCompressedTextureImage3DEXT\r
+  void __stdcall GLee_Lazy_glCompressedTextureImage3DEXT(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid * bits)  {if (GLeeInit()) glCompressedTextureImage3DEXT(texture, target, level, internalformat, width, height, depth, border, imageSize, bits);}\r
+  GLEEPFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC GLeeFuncPtr_glCompressedTextureImage3DEXT=GLee_Lazy_glCompressedTextureImage3DEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glCompressedTextureImage2DEXT\r
+#define GLEE_C_DEFINED_glCompressedTextureImage2DEXT\r
+  void __stdcall GLee_Lazy_glCompressedTextureImage2DEXT(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid * bits)  {if (GLeeInit()) glCompressedTextureImage2DEXT(texture, target, level, internalformat, width, height, border, imageSize, bits);}\r
+  GLEEPFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC GLeeFuncPtr_glCompressedTextureImage2DEXT=GLee_Lazy_glCompressedTextureImage2DEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glCompressedTextureImage1DEXT\r
+#define GLEE_C_DEFINED_glCompressedTextureImage1DEXT\r
+  void __stdcall GLee_Lazy_glCompressedTextureImage1DEXT(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid * bits)  {if (GLeeInit()) glCompressedTextureImage1DEXT(texture, target, level, internalformat, width, border, imageSize, bits);}\r
+  GLEEPFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC GLeeFuncPtr_glCompressedTextureImage1DEXT=GLee_Lazy_glCompressedTextureImage1DEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glCompressedTextureSubImage3DEXT\r
+#define GLEE_C_DEFINED_glCompressedTextureSubImage3DEXT\r
+  void __stdcall GLee_Lazy_glCompressedTextureSubImage3DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid * bits)  {if (GLeeInit()) glCompressedTextureSubImage3DEXT(texture, target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, bits);}\r
+  GLEEPFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC GLeeFuncPtr_glCompressedTextureSubImage3DEXT=GLee_Lazy_glCompressedTextureSubImage3DEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glCompressedTextureSubImage2DEXT\r
+#define GLEE_C_DEFINED_glCompressedTextureSubImage2DEXT\r
+  void __stdcall GLee_Lazy_glCompressedTextureSubImage2DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid * bits)  {if (GLeeInit()) glCompressedTextureSubImage2DEXT(texture, target, level, xoffset, yoffset, width, height, format, imageSize, bits);}\r
+  GLEEPFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC GLeeFuncPtr_glCompressedTextureSubImage2DEXT=GLee_Lazy_glCompressedTextureSubImage2DEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glCompressedTextureSubImage1DEXT\r
+#define GLEE_C_DEFINED_glCompressedTextureSubImage1DEXT\r
+  void __stdcall GLee_Lazy_glCompressedTextureSubImage1DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid * bits)  {if (GLeeInit()) glCompressedTextureSubImage1DEXT(texture, target, level, xoffset, width, format, imageSize, bits);}\r
+  GLEEPFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC GLeeFuncPtr_glCompressedTextureSubImage1DEXT=GLee_Lazy_glCompressedTextureSubImage1DEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetCompressedTextureImageEXT\r
+#define GLEE_C_DEFINED_glGetCompressedTextureImageEXT\r
+  void __stdcall GLee_Lazy_glGetCompressedTextureImageEXT(GLuint texture, GLenum target, GLint lod, GLvoid * img)  {if (GLeeInit()) glGetCompressedTextureImageEXT(texture, target, lod, img);}\r
+  GLEEPFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC GLeeFuncPtr_glGetCompressedTextureImageEXT=GLee_Lazy_glGetCompressedTextureImageEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glCompressedMultiTexImage3DEXT\r
+#define GLEE_C_DEFINED_glCompressedMultiTexImage3DEXT\r
+  void __stdcall GLee_Lazy_glCompressedMultiTexImage3DEXT(GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid * bits)  {if (GLeeInit()) glCompressedMultiTexImage3DEXT(texunit, target, level, internalformat, width, height, depth, border, imageSize, bits);}\r
+  GLEEPFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC GLeeFuncPtr_glCompressedMultiTexImage3DEXT=GLee_Lazy_glCompressedMultiTexImage3DEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glCompressedMultiTexImage2DEXT\r
+#define GLEE_C_DEFINED_glCompressedMultiTexImage2DEXT\r
+  void __stdcall GLee_Lazy_glCompressedMultiTexImage2DEXT(GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid * bits)  {if (GLeeInit()) glCompressedMultiTexImage2DEXT(texunit, target, level, internalformat, width, height, border, imageSize, bits);}\r
+  GLEEPFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC GLeeFuncPtr_glCompressedMultiTexImage2DEXT=GLee_Lazy_glCompressedMultiTexImage2DEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glCompressedMultiTexImage1DEXT\r
+#define GLEE_C_DEFINED_glCompressedMultiTexImage1DEXT\r
+  void __stdcall GLee_Lazy_glCompressedMultiTexImage1DEXT(GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid * bits)  {if (GLeeInit()) glCompressedMultiTexImage1DEXT(texunit, target, level, internalformat, width, border, imageSize, bits);}\r
+  GLEEPFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC GLeeFuncPtr_glCompressedMultiTexImage1DEXT=GLee_Lazy_glCompressedMultiTexImage1DEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glCompressedMultiTexSubImage3DEXT\r
+#define GLEE_C_DEFINED_glCompressedMultiTexSubImage3DEXT\r
+  void __stdcall GLee_Lazy_glCompressedMultiTexSubImage3DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid * bits)  {if (GLeeInit()) glCompressedMultiTexSubImage3DEXT(texunit, target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, bits);}\r
+  GLEEPFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC GLeeFuncPtr_glCompressedMultiTexSubImage3DEXT=GLee_Lazy_glCompressedMultiTexSubImage3DEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glCompressedMultiTexSubImage2DEXT\r
+#define GLEE_C_DEFINED_glCompressedMultiTexSubImage2DEXT\r
+  void __stdcall GLee_Lazy_glCompressedMultiTexSubImage2DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid * bits)  {if (GLeeInit()) glCompressedMultiTexSubImage2DEXT(texunit, target, level, xoffset, yoffset, width, height, format, imageSize, bits);}\r
+  GLEEPFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC GLeeFuncPtr_glCompressedMultiTexSubImage2DEXT=GLee_Lazy_glCompressedMultiTexSubImage2DEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glCompressedMultiTexSubImage1DEXT\r
+#define GLEE_C_DEFINED_glCompressedMultiTexSubImage1DEXT\r
+  void __stdcall GLee_Lazy_glCompressedMultiTexSubImage1DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid * bits)  {if (GLeeInit()) glCompressedMultiTexSubImage1DEXT(texunit, target, level, xoffset, width, format, imageSize, bits);}\r
+  GLEEPFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC GLeeFuncPtr_glCompressedMultiTexSubImage1DEXT=GLee_Lazy_glCompressedMultiTexSubImage1DEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetCompressedMultiTexImageEXT\r
+#define GLEE_C_DEFINED_glGetCompressedMultiTexImageEXT\r
+  void __stdcall GLee_Lazy_glGetCompressedMultiTexImageEXT(GLenum texunit, GLenum target, GLint lod, GLvoid * img)  {if (GLeeInit()) glGetCompressedMultiTexImageEXT(texunit, target, lod, img);}\r
+  GLEEPFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC GLeeFuncPtr_glGetCompressedMultiTexImageEXT=GLee_Lazy_glGetCompressedMultiTexImageEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glNamedProgramStringEXT\r
+#define GLEE_C_DEFINED_glNamedProgramStringEXT\r
+  void __stdcall GLee_Lazy_glNamedProgramStringEXT(GLuint program, GLenum target, GLenum format, GLsizei len, const GLvoid * string)  {if (GLeeInit()) glNamedProgramStringEXT(program, target, format, len, string);}\r
+  GLEEPFNGLNAMEDPROGRAMSTRINGEXTPROC GLeeFuncPtr_glNamedProgramStringEXT=GLee_Lazy_glNamedProgramStringEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glNamedProgramLocalParameter4dEXT\r
+#define GLEE_C_DEFINED_glNamedProgramLocalParameter4dEXT\r
+  void __stdcall GLee_Lazy_glNamedProgramLocalParameter4dEXT(GLuint program, GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)  {if (GLeeInit()) glNamedProgramLocalParameter4dEXT(program, target, index, x, y, z, w);}\r
+  GLEEPFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC GLeeFuncPtr_glNamedProgramLocalParameter4dEXT=GLee_Lazy_glNamedProgramLocalParameter4dEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glNamedProgramLocalParameter4dvEXT\r
+#define GLEE_C_DEFINED_glNamedProgramLocalParameter4dvEXT\r
+  void __stdcall GLee_Lazy_glNamedProgramLocalParameter4dvEXT(GLuint program, GLenum target, GLuint index, const GLdouble * params)  {if (GLeeInit()) glNamedProgramLocalParameter4dvEXT(program, target, index, params);}\r
+  GLEEPFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC GLeeFuncPtr_glNamedProgramLocalParameter4dvEXT=GLee_Lazy_glNamedProgramLocalParameter4dvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glNamedProgramLocalParameter4fEXT\r
+#define GLEE_C_DEFINED_glNamedProgramLocalParameter4fEXT\r
+  void __stdcall GLee_Lazy_glNamedProgramLocalParameter4fEXT(GLuint program, GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)  {if (GLeeInit()) glNamedProgramLocalParameter4fEXT(program, target, index, x, y, z, w);}\r
+  GLEEPFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC GLeeFuncPtr_glNamedProgramLocalParameter4fEXT=GLee_Lazy_glNamedProgramLocalParameter4fEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glNamedProgramLocalParameter4fvEXT\r
+#define GLEE_C_DEFINED_glNamedProgramLocalParameter4fvEXT\r
+  void __stdcall GLee_Lazy_glNamedProgramLocalParameter4fvEXT(GLuint program, GLenum target, GLuint index, const GLfloat * params)  {if (GLeeInit()) glNamedProgramLocalParameter4fvEXT(program, target, index, params);}\r
+  GLEEPFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC GLeeFuncPtr_glNamedProgramLocalParameter4fvEXT=GLee_Lazy_glNamedProgramLocalParameter4fvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetNamedProgramLocalParameterdvEXT\r
+#define GLEE_C_DEFINED_glGetNamedProgramLocalParameterdvEXT\r
+  void __stdcall GLee_Lazy_glGetNamedProgramLocalParameterdvEXT(GLuint program, GLenum target, GLuint index, GLdouble * params)  {if (GLeeInit()) glGetNamedProgramLocalParameterdvEXT(program, target, index, params);}\r
+  GLEEPFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC GLeeFuncPtr_glGetNamedProgramLocalParameterdvEXT=GLee_Lazy_glGetNamedProgramLocalParameterdvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetNamedProgramLocalParameterfvEXT\r
+#define GLEE_C_DEFINED_glGetNamedProgramLocalParameterfvEXT\r
+  void __stdcall GLee_Lazy_glGetNamedProgramLocalParameterfvEXT(GLuint program, GLenum target, GLuint index, GLfloat * params)  {if (GLeeInit()) glGetNamedProgramLocalParameterfvEXT(program, target, index, params);}\r
+  GLEEPFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC GLeeFuncPtr_glGetNamedProgramLocalParameterfvEXT=GLee_Lazy_glGetNamedProgramLocalParameterfvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetNamedProgramivEXT\r
+#define GLEE_C_DEFINED_glGetNamedProgramivEXT\r
+  void __stdcall GLee_Lazy_glGetNamedProgramivEXT(GLuint program, GLenum target, GLenum pname, GLint * params)  {if (GLeeInit()) glGetNamedProgramivEXT(program, target, pname, params);}\r
+  GLEEPFNGLGETNAMEDPROGRAMIVEXTPROC GLeeFuncPtr_glGetNamedProgramivEXT=GLee_Lazy_glGetNamedProgramivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetNamedProgramStringEXT\r
+#define GLEE_C_DEFINED_glGetNamedProgramStringEXT\r
+  void __stdcall GLee_Lazy_glGetNamedProgramStringEXT(GLuint program, GLenum target, GLenum pname, GLvoid * string)  {if (GLeeInit()) glGetNamedProgramStringEXT(program, target, pname, string);}\r
+  GLEEPFNGLGETNAMEDPROGRAMSTRINGEXTPROC GLeeFuncPtr_glGetNamedProgramStringEXT=GLee_Lazy_glGetNamedProgramStringEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glNamedProgramLocalParameters4fvEXT\r
+#define GLEE_C_DEFINED_glNamedProgramLocalParameters4fvEXT\r
+  void __stdcall GLee_Lazy_glNamedProgramLocalParameters4fvEXT(GLuint program, GLenum target, GLuint index, GLsizei count, const GLfloat * params)  {if (GLeeInit()) glNamedProgramLocalParameters4fvEXT(program, target, index, count, params);}\r
+  GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC GLeeFuncPtr_glNamedProgramLocalParameters4fvEXT=GLee_Lazy_glNamedProgramLocalParameters4fvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glNamedProgramLocalParameterI4iEXT\r
+#define GLEE_C_DEFINED_glNamedProgramLocalParameterI4iEXT\r
+  void __stdcall GLee_Lazy_glNamedProgramLocalParameterI4iEXT(GLuint program, GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w)  {if (GLeeInit()) glNamedProgramLocalParameterI4iEXT(program, target, index, x, y, z, w);}\r
+  GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC GLeeFuncPtr_glNamedProgramLocalParameterI4iEXT=GLee_Lazy_glNamedProgramLocalParameterI4iEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glNamedProgramLocalParameterI4ivEXT\r
+#define GLEE_C_DEFINED_glNamedProgramLocalParameterI4ivEXT\r
+  void __stdcall GLee_Lazy_glNamedProgramLocalParameterI4ivEXT(GLuint program, GLenum target, GLuint index, const GLint * params)  {if (GLeeInit()) glNamedProgramLocalParameterI4ivEXT(program, target, index, params);}\r
+  GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC GLeeFuncPtr_glNamedProgramLocalParameterI4ivEXT=GLee_Lazy_glNamedProgramLocalParameterI4ivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glNamedProgramLocalParametersI4ivEXT\r
+#define GLEE_C_DEFINED_glNamedProgramLocalParametersI4ivEXT\r
+  void __stdcall GLee_Lazy_glNamedProgramLocalParametersI4ivEXT(GLuint program, GLenum target, GLuint index, GLsizei count, const GLint * params)  {if (GLeeInit()) glNamedProgramLocalParametersI4ivEXT(program, target, index, count, params);}\r
+  GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC GLeeFuncPtr_glNamedProgramLocalParametersI4ivEXT=GLee_Lazy_glNamedProgramLocalParametersI4ivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glNamedProgramLocalParameterI4uiEXT\r
+#define GLEE_C_DEFINED_glNamedProgramLocalParameterI4uiEXT\r
+  void __stdcall GLee_Lazy_glNamedProgramLocalParameterI4uiEXT(GLuint program, GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)  {if (GLeeInit()) glNamedProgramLocalParameterI4uiEXT(program, target, index, x, y, z, w);}\r
+  GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC GLeeFuncPtr_glNamedProgramLocalParameterI4uiEXT=GLee_Lazy_glNamedProgramLocalParameterI4uiEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glNamedProgramLocalParameterI4uivEXT\r
+#define GLEE_C_DEFINED_glNamedProgramLocalParameterI4uivEXT\r
+  void __stdcall GLee_Lazy_glNamedProgramLocalParameterI4uivEXT(GLuint program, GLenum target, GLuint index, const GLuint * params)  {if (GLeeInit()) glNamedProgramLocalParameterI4uivEXT(program, target, index, params);}\r
+  GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC GLeeFuncPtr_glNamedProgramLocalParameterI4uivEXT=GLee_Lazy_glNamedProgramLocalParameterI4uivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glNamedProgramLocalParametersI4uivEXT\r
+#define GLEE_C_DEFINED_glNamedProgramLocalParametersI4uivEXT\r
+  void __stdcall GLee_Lazy_glNamedProgramLocalParametersI4uivEXT(GLuint program, GLenum target, GLuint index, GLsizei count, const GLuint * params)  {if (GLeeInit()) glNamedProgramLocalParametersI4uivEXT(program, target, index, count, params);}\r
+  GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC GLeeFuncPtr_glNamedProgramLocalParametersI4uivEXT=GLee_Lazy_glNamedProgramLocalParametersI4uivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetNamedProgramLocalParameterIivEXT\r
+#define GLEE_C_DEFINED_glGetNamedProgramLocalParameterIivEXT\r
+  void __stdcall GLee_Lazy_glGetNamedProgramLocalParameterIivEXT(GLuint program, GLenum target, GLuint index, GLint * params)  {if (GLeeInit()) glGetNamedProgramLocalParameterIivEXT(program, target, index, params);}\r
+  GLEEPFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC GLeeFuncPtr_glGetNamedProgramLocalParameterIivEXT=GLee_Lazy_glGetNamedProgramLocalParameterIivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetNamedProgramLocalParameterIuivEXT\r
+#define GLEE_C_DEFINED_glGetNamedProgramLocalParameterIuivEXT\r
+  void __stdcall GLee_Lazy_glGetNamedProgramLocalParameterIuivEXT(GLuint program, GLenum target, GLuint index, GLuint * params)  {if (GLeeInit()) glGetNamedProgramLocalParameterIuivEXT(program, target, index, params);}\r
+  GLEEPFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC GLeeFuncPtr_glGetNamedProgramLocalParameterIuivEXT=GLee_Lazy_glGetNamedProgramLocalParameterIuivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTextureParameterIivEXT\r
+#define GLEE_C_DEFINED_glTextureParameterIivEXT\r
+  void __stdcall GLee_Lazy_glTextureParameterIivEXT(GLuint texture, GLenum target, GLenum pname, const GLint * params)  {if (GLeeInit()) glTextureParameterIivEXT(texture, target, pname, params);}\r
+  GLEEPFNGLTEXTUREPARAMETERIIVEXTPROC GLeeFuncPtr_glTextureParameterIivEXT=GLee_Lazy_glTextureParameterIivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTextureParameterIuivEXT\r
+#define GLEE_C_DEFINED_glTextureParameterIuivEXT\r
+  void __stdcall GLee_Lazy_glTextureParameterIuivEXT(GLuint texture, GLenum target, GLenum pname, const GLuint * params)  {if (GLeeInit()) glTextureParameterIuivEXT(texture, target, pname, params);}\r
+  GLEEPFNGLTEXTUREPARAMETERIUIVEXTPROC GLeeFuncPtr_glTextureParameterIuivEXT=GLee_Lazy_glTextureParameterIuivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetTextureParameterIivEXT\r
+#define GLEE_C_DEFINED_glGetTextureParameterIivEXT\r
+  void __stdcall GLee_Lazy_glGetTextureParameterIivEXT(GLuint texture, GLenum target, GLenum pname, GLint * params)  {if (GLeeInit()) glGetTextureParameterIivEXT(texture, target, pname, params);}\r
+  GLEEPFNGLGETTEXTUREPARAMETERIIVEXTPROC GLeeFuncPtr_glGetTextureParameterIivEXT=GLee_Lazy_glGetTextureParameterIivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetTextureParameterIuivEXT\r
+#define GLEE_C_DEFINED_glGetTextureParameterIuivEXT\r
+  void __stdcall GLee_Lazy_glGetTextureParameterIuivEXT(GLuint texture, GLenum target, GLenum pname, GLuint * params)  {if (GLeeInit()) glGetTextureParameterIuivEXT(texture, target, pname, params);}\r
+  GLEEPFNGLGETTEXTUREPARAMETERIUIVEXTPROC GLeeFuncPtr_glGetTextureParameterIuivEXT=GLee_Lazy_glGetTextureParameterIuivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexParameterIivEXT\r
+#define GLEE_C_DEFINED_glMultiTexParameterIivEXT\r
+  void __stdcall GLee_Lazy_glMultiTexParameterIivEXT(GLenum texunit, GLenum target, GLenum pname, const GLint * params)  {if (GLeeInit()) glMultiTexParameterIivEXT(texunit, target, pname, params);}\r
+  GLEEPFNGLMULTITEXPARAMETERIIVEXTPROC GLeeFuncPtr_glMultiTexParameterIivEXT=GLee_Lazy_glMultiTexParameterIivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexParameterIuivEXT\r
+#define GLEE_C_DEFINED_glMultiTexParameterIuivEXT\r
+  void __stdcall GLee_Lazy_glMultiTexParameterIuivEXT(GLenum texunit, GLenum target, GLenum pname, const GLuint * params)  {if (GLeeInit()) glMultiTexParameterIuivEXT(texunit, target, pname, params);}\r
+  GLEEPFNGLMULTITEXPARAMETERIUIVEXTPROC GLeeFuncPtr_glMultiTexParameterIuivEXT=GLee_Lazy_glMultiTexParameterIuivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetMultiTexParameterIivEXT\r
+#define GLEE_C_DEFINED_glGetMultiTexParameterIivEXT\r
+  void __stdcall GLee_Lazy_glGetMultiTexParameterIivEXT(GLenum texunit, GLenum target, GLenum pname, GLint * params)  {if (GLeeInit()) glGetMultiTexParameterIivEXT(texunit, target, pname, params);}\r
+  GLEEPFNGLGETMULTITEXPARAMETERIIVEXTPROC GLeeFuncPtr_glGetMultiTexParameterIivEXT=GLee_Lazy_glGetMultiTexParameterIivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetMultiTexParameterIuivEXT\r
+#define GLEE_C_DEFINED_glGetMultiTexParameterIuivEXT\r
+  void __stdcall GLee_Lazy_glGetMultiTexParameterIuivEXT(GLenum texunit, GLenum target, GLenum pname, GLuint * params)  {if (GLeeInit()) glGetMultiTexParameterIuivEXT(texunit, target, pname, params);}\r
+  GLEEPFNGLGETMULTITEXPARAMETERIUIVEXTPROC GLeeFuncPtr_glGetMultiTexParameterIuivEXT=GLee_Lazy_glGetMultiTexParameterIuivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramUniform1fEXT\r
+#define GLEE_C_DEFINED_glProgramUniform1fEXT\r
+  void __stdcall GLee_Lazy_glProgramUniform1fEXT(GLuint program, GLint location, GLfloat v0)  {if (GLeeInit()) glProgramUniform1fEXT(program, location, v0);}\r
+  GLEEPFNGLPROGRAMUNIFORM1FEXTPROC GLeeFuncPtr_glProgramUniform1fEXT=GLee_Lazy_glProgramUniform1fEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramUniform2fEXT\r
+#define GLEE_C_DEFINED_glProgramUniform2fEXT\r
+  void __stdcall GLee_Lazy_glProgramUniform2fEXT(GLuint program, GLint location, GLfloat v0, GLfloat v1)  {if (GLeeInit()) glProgramUniform2fEXT(program, location, v0, v1);}\r
+  GLEEPFNGLPROGRAMUNIFORM2FEXTPROC GLeeFuncPtr_glProgramUniform2fEXT=GLee_Lazy_glProgramUniform2fEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramUniform3fEXT\r
+#define GLEE_C_DEFINED_glProgramUniform3fEXT\r
+  void __stdcall GLee_Lazy_glProgramUniform3fEXT(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2)  {if (GLeeInit()) glProgramUniform3fEXT(program, location, v0, v1, v2);}\r
+  GLEEPFNGLPROGRAMUNIFORM3FEXTPROC GLeeFuncPtr_glProgramUniform3fEXT=GLee_Lazy_glProgramUniform3fEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramUniform4fEXT\r
+#define GLEE_C_DEFINED_glProgramUniform4fEXT\r
+  void __stdcall GLee_Lazy_glProgramUniform4fEXT(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)  {if (GLeeInit()) glProgramUniform4fEXT(program, location, v0, v1, v2, v3);}\r
+  GLEEPFNGLPROGRAMUNIFORM4FEXTPROC GLeeFuncPtr_glProgramUniform4fEXT=GLee_Lazy_glProgramUniform4fEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramUniform1iEXT\r
+#define GLEE_C_DEFINED_glProgramUniform1iEXT\r
+  void __stdcall GLee_Lazy_glProgramUniform1iEXT(GLuint program, GLint location, GLint v0)  {if (GLeeInit()) glProgramUniform1iEXT(program, location, v0);}\r
+  GLEEPFNGLPROGRAMUNIFORM1IEXTPROC GLeeFuncPtr_glProgramUniform1iEXT=GLee_Lazy_glProgramUniform1iEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramUniform2iEXT\r
+#define GLEE_C_DEFINED_glProgramUniform2iEXT\r
+  void __stdcall GLee_Lazy_glProgramUniform2iEXT(GLuint program, GLint location, GLint v0, GLint v1)  {if (GLeeInit()) glProgramUniform2iEXT(program, location, v0, v1);}\r
+  GLEEPFNGLPROGRAMUNIFORM2IEXTPROC GLeeFuncPtr_glProgramUniform2iEXT=GLee_Lazy_glProgramUniform2iEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramUniform3iEXT\r
+#define GLEE_C_DEFINED_glProgramUniform3iEXT\r
+  void __stdcall GLee_Lazy_glProgramUniform3iEXT(GLuint program, GLint location, GLint v0, GLint v1, GLint v2)  {if (GLeeInit()) glProgramUniform3iEXT(program, location, v0, v1, v2);}\r
+  GLEEPFNGLPROGRAMUNIFORM3IEXTPROC GLeeFuncPtr_glProgramUniform3iEXT=GLee_Lazy_glProgramUniform3iEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramUniform4iEXT\r
+#define GLEE_C_DEFINED_glProgramUniform4iEXT\r
+  void __stdcall GLee_Lazy_glProgramUniform4iEXT(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3)  {if (GLeeInit()) glProgramUniform4iEXT(program, location, v0, v1, v2, v3);}\r
+  GLEEPFNGLPROGRAMUNIFORM4IEXTPROC GLeeFuncPtr_glProgramUniform4iEXT=GLee_Lazy_glProgramUniform4iEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramUniform1fvEXT\r
+#define GLEE_C_DEFINED_glProgramUniform1fvEXT\r
+  void __stdcall GLee_Lazy_glProgramUniform1fvEXT(GLuint program, GLint location, GLsizei count, const GLfloat * value)  {if (GLeeInit()) glProgramUniform1fvEXT(program, location, count, value);}\r
+  GLEEPFNGLPROGRAMUNIFORM1FVEXTPROC GLeeFuncPtr_glProgramUniform1fvEXT=GLee_Lazy_glProgramUniform1fvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramUniform2fvEXT\r
+#define GLEE_C_DEFINED_glProgramUniform2fvEXT\r
+  void __stdcall GLee_Lazy_glProgramUniform2fvEXT(GLuint program, GLint location, GLsizei count, const GLfloat * value)  {if (GLeeInit()) glProgramUniform2fvEXT(program, location, count, value);}\r
+  GLEEPFNGLPROGRAMUNIFORM2FVEXTPROC GLeeFuncPtr_glProgramUniform2fvEXT=GLee_Lazy_glProgramUniform2fvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramUniform3fvEXT\r
+#define GLEE_C_DEFINED_glProgramUniform3fvEXT\r
+  void __stdcall GLee_Lazy_glProgramUniform3fvEXT(GLuint program, GLint location, GLsizei count, const GLfloat * value)  {if (GLeeInit()) glProgramUniform3fvEXT(program, location, count, value);}\r
+  GLEEPFNGLPROGRAMUNIFORM3FVEXTPROC GLeeFuncPtr_glProgramUniform3fvEXT=GLee_Lazy_glProgramUniform3fvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramUniform4fvEXT\r
+#define GLEE_C_DEFINED_glProgramUniform4fvEXT\r
+  void __stdcall GLee_Lazy_glProgramUniform4fvEXT(GLuint program, GLint location, GLsizei count, const GLfloat * value)  {if (GLeeInit()) glProgramUniform4fvEXT(program, location, count, value);}\r
+  GLEEPFNGLPROGRAMUNIFORM4FVEXTPROC GLeeFuncPtr_glProgramUniform4fvEXT=GLee_Lazy_glProgramUniform4fvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramUniform1ivEXT\r
+#define GLEE_C_DEFINED_glProgramUniform1ivEXT\r
+  void __stdcall GLee_Lazy_glProgramUniform1ivEXT(GLuint program, GLint location, GLsizei count, const GLint * value)  {if (GLeeInit()) glProgramUniform1ivEXT(program, location, count, value);}\r
+  GLEEPFNGLPROGRAMUNIFORM1IVEXTPROC GLeeFuncPtr_glProgramUniform1ivEXT=GLee_Lazy_glProgramUniform1ivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramUniform2ivEXT\r
+#define GLEE_C_DEFINED_glProgramUniform2ivEXT\r
+  void __stdcall GLee_Lazy_glProgramUniform2ivEXT(GLuint program, GLint location, GLsizei count, const GLint * value)  {if (GLeeInit()) glProgramUniform2ivEXT(program, location, count, value);}\r
+  GLEEPFNGLPROGRAMUNIFORM2IVEXTPROC GLeeFuncPtr_glProgramUniform2ivEXT=GLee_Lazy_glProgramUniform2ivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramUniform3ivEXT\r
+#define GLEE_C_DEFINED_glProgramUniform3ivEXT\r
+  void __stdcall GLee_Lazy_glProgramUniform3ivEXT(GLuint program, GLint location, GLsizei count, const GLint * value)  {if (GLeeInit()) glProgramUniform3ivEXT(program, location, count, value);}\r
+  GLEEPFNGLPROGRAMUNIFORM3IVEXTPROC GLeeFuncPtr_glProgramUniform3ivEXT=GLee_Lazy_glProgramUniform3ivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramUniform4ivEXT\r
+#define GLEE_C_DEFINED_glProgramUniform4ivEXT\r
+  void __stdcall GLee_Lazy_glProgramUniform4ivEXT(GLuint program, GLint location, GLsizei count, const GLint * value)  {if (GLeeInit()) glProgramUniform4ivEXT(program, location, count, value);}\r
+  GLEEPFNGLPROGRAMUNIFORM4IVEXTPROC GLeeFuncPtr_glProgramUniform4ivEXT=GLee_Lazy_glProgramUniform4ivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramUniformMatrix2fvEXT\r
+#define GLEE_C_DEFINED_glProgramUniformMatrix2fvEXT\r
+  void __stdcall GLee_Lazy_glProgramUniformMatrix2fvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value)  {if (GLeeInit()) glProgramUniformMatrix2fvEXT(program, location, count, transpose, value);}\r
+  GLEEPFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC GLeeFuncPtr_glProgramUniformMatrix2fvEXT=GLee_Lazy_glProgramUniformMatrix2fvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramUniformMatrix3fvEXT\r
+#define GLEE_C_DEFINED_glProgramUniformMatrix3fvEXT\r
+  void __stdcall GLee_Lazy_glProgramUniformMatrix3fvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value)  {if (GLeeInit()) glProgramUniformMatrix3fvEXT(program, location, count, transpose, value);}\r
+  GLEEPFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC GLeeFuncPtr_glProgramUniformMatrix3fvEXT=GLee_Lazy_glProgramUniformMatrix3fvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramUniformMatrix4fvEXT\r
+#define GLEE_C_DEFINED_glProgramUniformMatrix4fvEXT\r
+  void __stdcall GLee_Lazy_glProgramUniformMatrix4fvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value)  {if (GLeeInit()) glProgramUniformMatrix4fvEXT(program, location, count, transpose, value);}\r
+  GLEEPFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC GLeeFuncPtr_glProgramUniformMatrix4fvEXT=GLee_Lazy_glProgramUniformMatrix4fvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramUniformMatrix2x3fvEXT\r
+#define GLEE_C_DEFINED_glProgramUniformMatrix2x3fvEXT\r
+  void __stdcall GLee_Lazy_glProgramUniformMatrix2x3fvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value)  {if (GLeeInit()) glProgramUniformMatrix2x3fvEXT(program, location, count, transpose, value);}\r
+  GLEEPFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC GLeeFuncPtr_glProgramUniformMatrix2x3fvEXT=GLee_Lazy_glProgramUniformMatrix2x3fvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramUniformMatrix3x2fvEXT\r
+#define GLEE_C_DEFINED_glProgramUniformMatrix3x2fvEXT\r
+  void __stdcall GLee_Lazy_glProgramUniformMatrix3x2fvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value)  {if (GLeeInit()) glProgramUniformMatrix3x2fvEXT(program, location, count, transpose, value);}\r
+  GLEEPFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC GLeeFuncPtr_glProgramUniformMatrix3x2fvEXT=GLee_Lazy_glProgramUniformMatrix3x2fvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramUniformMatrix2x4fvEXT\r
+#define GLEE_C_DEFINED_glProgramUniformMatrix2x4fvEXT\r
+  void __stdcall GLee_Lazy_glProgramUniformMatrix2x4fvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value)  {if (GLeeInit()) glProgramUniformMatrix2x4fvEXT(program, location, count, transpose, value);}\r
+  GLEEPFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC GLeeFuncPtr_glProgramUniformMatrix2x4fvEXT=GLee_Lazy_glProgramUniformMatrix2x4fvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramUniformMatrix4x2fvEXT\r
+#define GLEE_C_DEFINED_glProgramUniformMatrix4x2fvEXT\r
+  void __stdcall GLee_Lazy_glProgramUniformMatrix4x2fvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value)  {if (GLeeInit()) glProgramUniformMatrix4x2fvEXT(program, location, count, transpose, value);}\r
+  GLEEPFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC GLeeFuncPtr_glProgramUniformMatrix4x2fvEXT=GLee_Lazy_glProgramUniformMatrix4x2fvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramUniformMatrix3x4fvEXT\r
+#define GLEE_C_DEFINED_glProgramUniformMatrix3x4fvEXT\r
+  void __stdcall GLee_Lazy_glProgramUniformMatrix3x4fvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value)  {if (GLeeInit()) glProgramUniformMatrix3x4fvEXT(program, location, count, transpose, value);}\r
+  GLEEPFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC GLeeFuncPtr_glProgramUniformMatrix3x4fvEXT=GLee_Lazy_glProgramUniformMatrix3x4fvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramUniformMatrix4x3fvEXT\r
+#define GLEE_C_DEFINED_glProgramUniformMatrix4x3fvEXT\r
+  void __stdcall GLee_Lazy_glProgramUniformMatrix4x3fvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value)  {if (GLeeInit()) glProgramUniformMatrix4x3fvEXT(program, location, count, transpose, value);}\r
+  GLEEPFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC GLeeFuncPtr_glProgramUniformMatrix4x3fvEXT=GLee_Lazy_glProgramUniformMatrix4x3fvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramUniform1uiEXT\r
+#define GLEE_C_DEFINED_glProgramUniform1uiEXT\r
+  void __stdcall GLee_Lazy_glProgramUniform1uiEXT(GLuint program, GLint location, GLuint v0)  {if (GLeeInit()) glProgramUniform1uiEXT(program, location, v0);}\r
+  GLEEPFNGLPROGRAMUNIFORM1UIEXTPROC GLeeFuncPtr_glProgramUniform1uiEXT=GLee_Lazy_glProgramUniform1uiEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramUniform2uiEXT\r
+#define GLEE_C_DEFINED_glProgramUniform2uiEXT\r
+  void __stdcall GLee_Lazy_glProgramUniform2uiEXT(GLuint program, GLint location, GLuint v0, GLuint v1)  {if (GLeeInit()) glProgramUniform2uiEXT(program, location, v0, v1);}\r
+  GLEEPFNGLPROGRAMUNIFORM2UIEXTPROC GLeeFuncPtr_glProgramUniform2uiEXT=GLee_Lazy_glProgramUniform2uiEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramUniform3uiEXT\r
+#define GLEE_C_DEFINED_glProgramUniform3uiEXT\r
+  void __stdcall GLee_Lazy_glProgramUniform3uiEXT(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2)  {if (GLeeInit()) glProgramUniform3uiEXT(program, location, v0, v1, v2);}\r
+  GLEEPFNGLPROGRAMUNIFORM3UIEXTPROC GLeeFuncPtr_glProgramUniform3uiEXT=GLee_Lazy_glProgramUniform3uiEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramUniform4uiEXT\r
+#define GLEE_C_DEFINED_glProgramUniform4uiEXT\r
+  void __stdcall GLee_Lazy_glProgramUniform4uiEXT(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)  {if (GLeeInit()) glProgramUniform4uiEXT(program, location, v0, v1, v2, v3);}\r
+  GLEEPFNGLPROGRAMUNIFORM4UIEXTPROC GLeeFuncPtr_glProgramUniform4uiEXT=GLee_Lazy_glProgramUniform4uiEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramUniform1uivEXT\r
+#define GLEE_C_DEFINED_glProgramUniform1uivEXT\r
+  void __stdcall GLee_Lazy_glProgramUniform1uivEXT(GLuint program, GLint location, GLsizei count, const GLuint * value)  {if (GLeeInit()) glProgramUniform1uivEXT(program, location, count, value);}\r
+  GLEEPFNGLPROGRAMUNIFORM1UIVEXTPROC GLeeFuncPtr_glProgramUniform1uivEXT=GLee_Lazy_glProgramUniform1uivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramUniform2uivEXT\r
+#define GLEE_C_DEFINED_glProgramUniform2uivEXT\r
+  void __stdcall GLee_Lazy_glProgramUniform2uivEXT(GLuint program, GLint location, GLsizei count, const GLuint * value)  {if (GLeeInit()) glProgramUniform2uivEXT(program, location, count, value);}\r
+  GLEEPFNGLPROGRAMUNIFORM2UIVEXTPROC GLeeFuncPtr_glProgramUniform2uivEXT=GLee_Lazy_glProgramUniform2uivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramUniform3uivEXT\r
+#define GLEE_C_DEFINED_glProgramUniform3uivEXT\r
+  void __stdcall GLee_Lazy_glProgramUniform3uivEXT(GLuint program, GLint location, GLsizei count, const GLuint * value)  {if (GLeeInit()) glProgramUniform3uivEXT(program, location, count, value);}\r
+  GLEEPFNGLPROGRAMUNIFORM3UIVEXTPROC GLeeFuncPtr_glProgramUniform3uivEXT=GLee_Lazy_glProgramUniform3uivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramUniform4uivEXT\r
+#define GLEE_C_DEFINED_glProgramUniform4uivEXT\r
+  void __stdcall GLee_Lazy_glProgramUniform4uivEXT(GLuint program, GLint location, GLsizei count, const GLuint * value)  {if (GLeeInit()) glProgramUniform4uivEXT(program, location, count, value);}\r
+  GLEEPFNGLPROGRAMUNIFORM4UIVEXTPROC GLeeFuncPtr_glProgramUniform4uivEXT=GLee_Lazy_glProgramUniform4uivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glNamedBufferDataEXT\r
+#define GLEE_C_DEFINED_glNamedBufferDataEXT\r
+  void __stdcall GLee_Lazy_glNamedBufferDataEXT(GLuint buffer, GLsizeiptr size, const GLvoid * data, GLenum usage)  {if (GLeeInit()) glNamedBufferDataEXT(buffer, size, data, usage);}\r
+  GLEEPFNGLNAMEDBUFFERDATAEXTPROC GLeeFuncPtr_glNamedBufferDataEXT=GLee_Lazy_glNamedBufferDataEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glNamedBufferSubDataEXT\r
+#define GLEE_C_DEFINED_glNamedBufferSubDataEXT\r
+  void __stdcall GLee_Lazy_glNamedBufferSubDataEXT(GLuint buffer, GLintptr offset, GLsizeiptr size, const GLvoid * data)  {if (GLeeInit()) glNamedBufferSubDataEXT(buffer, offset, size, data);}\r
+  GLEEPFNGLNAMEDBUFFERSUBDATAEXTPROC GLeeFuncPtr_glNamedBufferSubDataEXT=GLee_Lazy_glNamedBufferSubDataEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMapNamedBufferEXT\r
+#define GLEE_C_DEFINED_glMapNamedBufferEXT\r
+  GLvoid* __stdcall GLee_Lazy_glMapNamedBufferEXT(GLuint buffer, GLenum access)  {if (GLeeInit()) return glMapNamedBufferEXT(buffer, access); return (GLvoid*)0;}\r
+  GLEEPFNGLMAPNAMEDBUFFEREXTPROC GLeeFuncPtr_glMapNamedBufferEXT=GLee_Lazy_glMapNamedBufferEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glUnmapNamedBufferEXT\r
+#define GLEE_C_DEFINED_glUnmapNamedBufferEXT\r
+  GLboolean __stdcall GLee_Lazy_glUnmapNamedBufferEXT(GLuint buffer)  {if (GLeeInit()) return glUnmapNamedBufferEXT(buffer); return (GLboolean)0;}\r
+  GLEEPFNGLUNMAPNAMEDBUFFEREXTPROC GLeeFuncPtr_glUnmapNamedBufferEXT=GLee_Lazy_glUnmapNamedBufferEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetNamedBufferParameterivEXT\r
+#define GLEE_C_DEFINED_glGetNamedBufferParameterivEXT\r
+  void __stdcall GLee_Lazy_glGetNamedBufferParameterivEXT(GLuint buffer, GLenum pname, GLint * params)  {if (GLeeInit()) glGetNamedBufferParameterivEXT(buffer, pname, params);}\r
+  GLEEPFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC GLeeFuncPtr_glGetNamedBufferParameterivEXT=GLee_Lazy_glGetNamedBufferParameterivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetNamedBufferPointervEXT\r
+#define GLEE_C_DEFINED_glGetNamedBufferPointervEXT\r
+  void __stdcall GLee_Lazy_glGetNamedBufferPointervEXT(GLuint buffer, GLenum pname, GLvoid* * params)  {if (GLeeInit()) glGetNamedBufferPointervEXT(buffer, pname, params);}\r
+  GLEEPFNGLGETNAMEDBUFFERPOINTERVEXTPROC GLeeFuncPtr_glGetNamedBufferPointervEXT=GLee_Lazy_glGetNamedBufferPointervEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetNamedBufferSubDataEXT\r
+#define GLEE_C_DEFINED_glGetNamedBufferSubDataEXT\r
+  void __stdcall GLee_Lazy_glGetNamedBufferSubDataEXT(GLuint buffer, GLintptr offset, GLsizeiptr size, GLvoid * data)  {if (GLeeInit()) glGetNamedBufferSubDataEXT(buffer, offset, size, data);}\r
+  GLEEPFNGLGETNAMEDBUFFERSUBDATAEXTPROC GLeeFuncPtr_glGetNamedBufferSubDataEXT=GLee_Lazy_glGetNamedBufferSubDataEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTextureBufferEXT\r
+#define GLEE_C_DEFINED_glTextureBufferEXT\r
+  void __stdcall GLee_Lazy_glTextureBufferEXT(GLuint texture, GLenum target, GLenum internalformat, GLuint buffer)  {if (GLeeInit()) glTextureBufferEXT(texture, target, internalformat, buffer);}\r
+  GLEEPFNGLTEXTUREBUFFEREXTPROC GLeeFuncPtr_glTextureBufferEXT=GLee_Lazy_glTextureBufferEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexBufferEXT\r
+#define GLEE_C_DEFINED_glMultiTexBufferEXT\r
+  void __stdcall GLee_Lazy_glMultiTexBufferEXT(GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer)  {if (GLeeInit()) glMultiTexBufferEXT(texunit, target, internalformat, buffer);}\r
+  GLEEPFNGLMULTITEXBUFFEREXTPROC GLeeFuncPtr_glMultiTexBufferEXT=GLee_Lazy_glMultiTexBufferEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glNamedRenderbufferStorageEXT\r
+#define GLEE_C_DEFINED_glNamedRenderbufferStorageEXT\r
+  void __stdcall GLee_Lazy_glNamedRenderbufferStorageEXT(GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height)  {if (GLeeInit()) glNamedRenderbufferStorageEXT(renderbuffer, internalformat, width, height);}\r
+  GLEEPFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC GLeeFuncPtr_glNamedRenderbufferStorageEXT=GLee_Lazy_glNamedRenderbufferStorageEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetNamedRenderbufferParameterivEXT\r
+#define GLEE_C_DEFINED_glGetNamedRenderbufferParameterivEXT\r
+  void __stdcall GLee_Lazy_glGetNamedRenderbufferParameterivEXT(GLuint renderbuffer, GLenum pname, GLint * params)  {if (GLeeInit()) glGetNamedRenderbufferParameterivEXT(renderbuffer, pname, params);}\r
+  GLEEPFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC GLeeFuncPtr_glGetNamedRenderbufferParameterivEXT=GLee_Lazy_glGetNamedRenderbufferParameterivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glCheckNamedFramebufferStatusEXT\r
+#define GLEE_C_DEFINED_glCheckNamedFramebufferStatusEXT\r
+  GLenum __stdcall GLee_Lazy_glCheckNamedFramebufferStatusEXT(GLuint framebuffer, GLenum target)  {if (GLeeInit()) return glCheckNamedFramebufferStatusEXT(framebuffer, target); return (GLenum)0;}\r
+  GLEEPFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC GLeeFuncPtr_glCheckNamedFramebufferStatusEXT=GLee_Lazy_glCheckNamedFramebufferStatusEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glNamedFramebufferTexture1DEXT\r
+#define GLEE_C_DEFINED_glNamedFramebufferTexture1DEXT\r
+  void __stdcall GLee_Lazy_glNamedFramebufferTexture1DEXT(GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level)  {if (GLeeInit()) glNamedFramebufferTexture1DEXT(framebuffer, attachment, textarget, texture, level);}\r
+  GLEEPFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC GLeeFuncPtr_glNamedFramebufferTexture1DEXT=GLee_Lazy_glNamedFramebufferTexture1DEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glNamedFramebufferTexture2DEXT\r
+#define GLEE_C_DEFINED_glNamedFramebufferTexture2DEXT\r
+  void __stdcall GLee_Lazy_glNamedFramebufferTexture2DEXT(GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level)  {if (GLeeInit()) glNamedFramebufferTexture2DEXT(framebuffer, attachment, textarget, texture, level);}\r
+  GLEEPFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC GLeeFuncPtr_glNamedFramebufferTexture2DEXT=GLee_Lazy_glNamedFramebufferTexture2DEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glNamedFramebufferTexture3DEXT\r
+#define GLEE_C_DEFINED_glNamedFramebufferTexture3DEXT\r
+  void __stdcall GLee_Lazy_glNamedFramebufferTexture3DEXT(GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)  {if (GLeeInit()) glNamedFramebufferTexture3DEXT(framebuffer, attachment, textarget, texture, level, zoffset);}\r
+  GLEEPFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC GLeeFuncPtr_glNamedFramebufferTexture3DEXT=GLee_Lazy_glNamedFramebufferTexture3DEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glNamedFramebufferRenderbufferEXT\r
+#define GLEE_C_DEFINED_glNamedFramebufferRenderbufferEXT\r
+  void __stdcall GLee_Lazy_glNamedFramebufferRenderbufferEXT(GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)  {if (GLeeInit()) glNamedFramebufferRenderbufferEXT(framebuffer, attachment, renderbuffertarget, renderbuffer);}\r
+  GLEEPFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC GLeeFuncPtr_glNamedFramebufferRenderbufferEXT=GLee_Lazy_glNamedFramebufferRenderbufferEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetNamedFramebufferAttachmentParameterivEXT\r
+#define GLEE_C_DEFINED_glGetNamedFramebufferAttachmentParameterivEXT\r
+  void __stdcall GLee_Lazy_glGetNamedFramebufferAttachmentParameterivEXT(GLuint framebuffer, GLenum attachment, GLenum pname, GLint * params)  {if (GLeeInit()) glGetNamedFramebufferAttachmentParameterivEXT(framebuffer, attachment, pname, params);}\r
+  GLEEPFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC GLeeFuncPtr_glGetNamedFramebufferAttachmentParameterivEXT=GLee_Lazy_glGetNamedFramebufferAttachmentParameterivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGenerateTextureMipmapEXT\r
+#define GLEE_C_DEFINED_glGenerateTextureMipmapEXT\r
+  void __stdcall GLee_Lazy_glGenerateTextureMipmapEXT(GLuint texture, GLenum target)  {if (GLeeInit()) glGenerateTextureMipmapEXT(texture, target);}\r
+  GLEEPFNGLGENERATETEXTUREMIPMAPEXTPROC GLeeFuncPtr_glGenerateTextureMipmapEXT=GLee_Lazy_glGenerateTextureMipmapEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGenerateMultiTexMipmapEXT\r
+#define GLEE_C_DEFINED_glGenerateMultiTexMipmapEXT\r
+  void __stdcall GLee_Lazy_glGenerateMultiTexMipmapEXT(GLenum texunit, GLenum target)  {if (GLeeInit()) glGenerateMultiTexMipmapEXT(texunit, target);}\r
+  GLEEPFNGLGENERATEMULTITEXMIPMAPEXTPROC GLeeFuncPtr_glGenerateMultiTexMipmapEXT=GLee_Lazy_glGenerateMultiTexMipmapEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFramebufferDrawBufferEXT\r
+#define GLEE_C_DEFINED_glFramebufferDrawBufferEXT\r
+  void __stdcall GLee_Lazy_glFramebufferDrawBufferEXT(GLuint framebuffer, GLenum mode)  {if (GLeeInit()) glFramebufferDrawBufferEXT(framebuffer, mode);}\r
+  GLEEPFNGLFRAMEBUFFERDRAWBUFFEREXTPROC GLeeFuncPtr_glFramebufferDrawBufferEXT=GLee_Lazy_glFramebufferDrawBufferEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFramebufferDrawBuffersEXT\r
+#define GLEE_C_DEFINED_glFramebufferDrawBuffersEXT\r
+  void __stdcall GLee_Lazy_glFramebufferDrawBuffersEXT(GLuint framebuffer, GLsizei n, const GLenum * bufs)  {if (GLeeInit()) glFramebufferDrawBuffersEXT(framebuffer, n, bufs);}\r
+  GLEEPFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC GLeeFuncPtr_glFramebufferDrawBuffersEXT=GLee_Lazy_glFramebufferDrawBuffersEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFramebufferReadBufferEXT\r
+#define GLEE_C_DEFINED_glFramebufferReadBufferEXT\r
+  void __stdcall GLee_Lazy_glFramebufferReadBufferEXT(GLuint framebuffer, GLenum mode)  {if (GLeeInit()) glFramebufferReadBufferEXT(framebuffer, mode);}\r
+  GLEEPFNGLFRAMEBUFFERREADBUFFEREXTPROC GLeeFuncPtr_glFramebufferReadBufferEXT=GLee_Lazy_glFramebufferReadBufferEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetFramebufferParameterivEXT\r
+#define GLEE_C_DEFINED_glGetFramebufferParameterivEXT\r
+  void __stdcall GLee_Lazy_glGetFramebufferParameterivEXT(GLuint framebuffer, GLenum pname, GLint * params)  {if (GLeeInit()) glGetFramebufferParameterivEXT(framebuffer, pname, params);}\r
+  GLEEPFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC GLeeFuncPtr_glGetFramebufferParameterivEXT=GLee_Lazy_glGetFramebufferParameterivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glNamedRenderbufferStorageMultisampleEXT\r
+#define GLEE_C_DEFINED_glNamedRenderbufferStorageMultisampleEXT\r
+  void __stdcall GLee_Lazy_glNamedRenderbufferStorageMultisampleEXT(GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)  {if (GLeeInit()) glNamedRenderbufferStorageMultisampleEXT(renderbuffer, samples, internalformat, width, height);}\r
+  GLEEPFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC GLeeFuncPtr_glNamedRenderbufferStorageMultisampleEXT=GLee_Lazy_glNamedRenderbufferStorageMultisampleEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glNamedRenderbufferStorageMultisampleCoverageEXT\r
+#define GLEE_C_DEFINED_glNamedRenderbufferStorageMultisampleCoverageEXT\r
+  void __stdcall GLee_Lazy_glNamedRenderbufferStorageMultisampleCoverageEXT(GLuint renderbuffer, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height)  {if (GLeeInit()) glNamedRenderbufferStorageMultisampleCoverageEXT(renderbuffer, coverageSamples, colorSamples, internalformat, width, height);}\r
+  GLEEPFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC GLeeFuncPtr_glNamedRenderbufferStorageMultisampleCoverageEXT=GLee_Lazy_glNamedRenderbufferStorageMultisampleCoverageEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glNamedFramebufferTextureEXT\r
+#define GLEE_C_DEFINED_glNamedFramebufferTextureEXT\r
+  void __stdcall GLee_Lazy_glNamedFramebufferTextureEXT(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level)  {if (GLeeInit()) glNamedFramebufferTextureEXT(framebuffer, attachment, texture, level);}\r
+  GLEEPFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC GLeeFuncPtr_glNamedFramebufferTextureEXT=GLee_Lazy_glNamedFramebufferTextureEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glNamedFramebufferTextureLayerEXT\r
+#define GLEE_C_DEFINED_glNamedFramebufferTextureLayerEXT\r
+  void __stdcall GLee_Lazy_glNamedFramebufferTextureLayerEXT(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer)  {if (GLeeInit()) glNamedFramebufferTextureLayerEXT(framebuffer, attachment, texture, level, layer);}\r
+  GLEEPFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC GLeeFuncPtr_glNamedFramebufferTextureLayerEXT=GLee_Lazy_glNamedFramebufferTextureLayerEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glNamedFramebufferTextureFaceEXT\r
+#define GLEE_C_DEFINED_glNamedFramebufferTextureFaceEXT\r
+  void __stdcall GLee_Lazy_glNamedFramebufferTextureFaceEXT(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLenum face)  {if (GLeeInit()) glNamedFramebufferTextureFaceEXT(framebuffer, attachment, texture, level, face);}\r
+  GLEEPFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC GLeeFuncPtr_glNamedFramebufferTextureFaceEXT=GLee_Lazy_glNamedFramebufferTextureFaceEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTextureRenderbufferEXT\r
+#define GLEE_C_DEFINED_glTextureRenderbufferEXT\r
+  void __stdcall GLee_Lazy_glTextureRenderbufferEXT(GLuint texture, GLenum target, GLuint renderbuffer)  {if (GLeeInit()) glTextureRenderbufferEXT(texture, target, renderbuffer);}\r
+  GLEEPFNGLTEXTURERENDERBUFFEREXTPROC GLeeFuncPtr_glTextureRenderbufferEXT=GLee_Lazy_glTextureRenderbufferEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glMultiTexRenderbufferEXT\r
+#define GLEE_C_DEFINED_glMultiTexRenderbufferEXT\r
+  void __stdcall GLee_Lazy_glMultiTexRenderbufferEXT(GLenum texunit, GLenum target, GLuint renderbuffer)  {if (GLeeInit()) glMultiTexRenderbufferEXT(texunit, target, renderbuffer);}\r
+  GLEEPFNGLMULTITEXRENDERBUFFEREXTPROC GLeeFuncPtr_glMultiTexRenderbufferEXT=GLee_Lazy_glMultiTexRenderbufferEXT;\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_vertex_array_bgra */\r
+\r
+#ifdef __GLEE_GL_EXT_vertex_array_bgra\r
+#endif \r
+\r
+/* GL_EXT_texture_swizzle */\r
+\r
+#ifdef __GLEE_GL_EXT_texture_swizzle\r
+#endif \r
+\r
+/* GL_NV_explicit_multisample */\r
+\r
+#ifdef __GLEE_GL_NV_explicit_multisample\r
+#ifndef GLEE_C_DEFINED_glGetMultisamplefvNV\r
+#define GLEE_C_DEFINED_glGetMultisamplefvNV\r
+  void __stdcall GLee_Lazy_glGetMultisamplefvNV(GLenum pname, GLuint index, GLfloat * val)  {if (GLeeInit()) glGetMultisamplefvNV(pname, index, val);}\r
+  GLEEPFNGLGETMULTISAMPLEFVNVPROC GLeeFuncPtr_glGetMultisamplefvNV=GLee_Lazy_glGetMultisamplefvNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glSampleMaskIndexedNV\r
+#define GLEE_C_DEFINED_glSampleMaskIndexedNV\r
+  void __stdcall GLee_Lazy_glSampleMaskIndexedNV(GLuint index, GLbitfield mask)  {if (GLeeInit()) glSampleMaskIndexedNV(index, mask);}\r
+  GLEEPFNGLSAMPLEMASKINDEXEDNVPROC GLeeFuncPtr_glSampleMaskIndexedNV=GLee_Lazy_glSampleMaskIndexedNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glTexRenderbufferNV\r
+#define GLEE_C_DEFINED_glTexRenderbufferNV\r
+  void __stdcall GLee_Lazy_glTexRenderbufferNV(GLenum target, GLuint renderbuffer)  {if (GLeeInit()) glTexRenderbufferNV(target, renderbuffer);}\r
+  GLEEPFNGLTEXRENDERBUFFERNVPROC GLeeFuncPtr_glTexRenderbufferNV=GLee_Lazy_glTexRenderbufferNV;\r
+#endif\r
+#endif \r
+\r
+/* GL_NV_transform_feedback2 */\r
+\r
+#ifdef __GLEE_GL_NV_transform_feedback2\r
+#ifndef GLEE_C_DEFINED_glBindTransformFeedbackNV\r
+#define GLEE_C_DEFINED_glBindTransformFeedbackNV\r
+  void __stdcall GLee_Lazy_glBindTransformFeedbackNV(GLenum target, GLuint id)  {if (GLeeInit()) glBindTransformFeedbackNV(target, id);}\r
+  GLEEPFNGLBINDTRANSFORMFEEDBACKNVPROC GLeeFuncPtr_glBindTransformFeedbackNV=GLee_Lazy_glBindTransformFeedbackNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glDeleteTransformFeedbacksNV\r
+#define GLEE_C_DEFINED_glDeleteTransformFeedbacksNV\r
+  void __stdcall GLee_Lazy_glDeleteTransformFeedbacksNV(GLsizei n, const GLuint * ids)  {if (GLeeInit()) glDeleteTransformFeedbacksNV(n, ids);}\r
+  GLEEPFNGLDELETETRANSFORMFEEDBACKSNVPROC GLeeFuncPtr_glDeleteTransformFeedbacksNV=GLee_Lazy_glDeleteTransformFeedbacksNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGenTransformFeedbacksNV\r
+#define GLEE_C_DEFINED_glGenTransformFeedbacksNV\r
+  void __stdcall GLee_Lazy_glGenTransformFeedbacksNV(GLsizei n, GLuint * ids)  {if (GLeeInit()) glGenTransformFeedbacksNV(n, ids);}\r
+  GLEEPFNGLGENTRANSFORMFEEDBACKSNVPROC GLeeFuncPtr_glGenTransformFeedbacksNV=GLee_Lazy_glGenTransformFeedbacksNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glIsTransformFeedbackNV\r
+#define GLEE_C_DEFINED_glIsTransformFeedbackNV\r
+  GLboolean __stdcall GLee_Lazy_glIsTransformFeedbackNV(GLuint id)  {if (GLeeInit()) return glIsTransformFeedbackNV(id); return (GLboolean)0;}\r
+  GLEEPFNGLISTRANSFORMFEEDBACKNVPROC GLeeFuncPtr_glIsTransformFeedbackNV=GLee_Lazy_glIsTransformFeedbackNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glPauseTransformFeedbackNV\r
+#define GLEE_C_DEFINED_glPauseTransformFeedbackNV\r
+  void __stdcall GLee_Lazy_glPauseTransformFeedbackNV(void)  {if (GLeeInit()) glPauseTransformFeedbackNV();}\r
+  GLEEPFNGLPAUSETRANSFORMFEEDBACKNVPROC GLeeFuncPtr_glPauseTransformFeedbackNV=GLee_Lazy_glPauseTransformFeedbackNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glResumeTransformFeedbackNV\r
+#define GLEE_C_DEFINED_glResumeTransformFeedbackNV\r
+  void __stdcall GLee_Lazy_glResumeTransformFeedbackNV(void)  {if (GLeeInit()) glResumeTransformFeedbackNV();}\r
+  GLEEPFNGLRESUMETRANSFORMFEEDBACKNVPROC GLeeFuncPtr_glResumeTransformFeedbackNV=GLee_Lazy_glResumeTransformFeedbackNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glDrawTransformFeedbackNV\r
+#define GLEE_C_DEFINED_glDrawTransformFeedbackNV\r
+  void __stdcall GLee_Lazy_glDrawTransformFeedbackNV(GLenum mode, GLuint id)  {if (GLeeInit()) glDrawTransformFeedbackNV(mode, id);}\r
+  GLEEPFNGLDRAWTRANSFORMFEEDBACKNVPROC GLeeFuncPtr_glDrawTransformFeedbackNV=GLee_Lazy_glDrawTransformFeedbackNV;\r
+#endif\r
+#endif \r
+\r
+/* GL_SGIX_texture_select */\r
+\r
+#ifdef __GLEE_GL_SGIX_texture_select\r
+#endif \r
+\r
+/* GL_INGR_blend_func_separate */\r
+\r
+#ifdef __GLEE_GL_INGR_blend_func_separate\r
+#ifndef GLEE_C_DEFINED_glBlendFuncSeparateINGR\r
+#define GLEE_C_DEFINED_glBlendFuncSeparateINGR\r
+  void __stdcall GLee_Lazy_glBlendFuncSeparateINGR(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha)  {if (GLeeInit()) glBlendFuncSeparateINGR(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);}\r
+  GLEEPFNGLBLENDFUNCSEPARATEINGRPROC GLeeFuncPtr_glBlendFuncSeparateINGR=GLee_Lazy_glBlendFuncSeparateINGR;\r
+#endif\r
+#endif \r
+\r
+/* GL_SGIX_depth_pass_instrument */\r
+\r
+#ifdef __GLEE_GL_SGIX_depth_pass_instrument\r
+#endif \r
+\r
+/* GL_SGIX_igloo_interface */\r
+\r
+#ifdef __GLEE_GL_SGIX_igloo_interface\r
+#ifndef GLEE_C_DEFINED_glIglooInterfaceSGIX\r
+#define GLEE_C_DEFINED_glIglooInterfaceSGIX\r
+  void __stdcall GLee_Lazy_glIglooInterfaceSGIX(GLenum pname, const GLvoid * params)  {if (GLeeInit()) glIglooInterfaceSGIX(pname, params);}\r
+  GLEEPFNGLIGLOOINTERFACESGIXPROC GLeeFuncPtr_glIglooInterfaceSGIX=GLee_Lazy_glIglooInterfaceSGIX;\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_fragment_lighting */\r
+\r
+#ifdef __GLEE_GL_EXT_fragment_lighting\r
+#ifndef GLEE_C_DEFINED_glFragmentLightModeliEXT\r
+#define GLEE_C_DEFINED_glFragmentLightModeliEXT\r
+  GLvoid __stdcall GLee_Lazy_glFragmentLightModeliEXT(GLenum pname, GLint param)  {if (GLeeInit()) glFragmentLightModeliEXT(pname, param);}\r
+  GLEEPFNGLFRAGMENTLIGHTMODELIEXTPROC GLeeFuncPtr_glFragmentLightModeliEXT=GLee_Lazy_glFragmentLightModeliEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFragmentLightModelfEXT\r
+#define GLEE_C_DEFINED_glFragmentLightModelfEXT\r
+  GLvoid __stdcall GLee_Lazy_glFragmentLightModelfEXT(GLenum pname, GLfloat param)  {if (GLeeInit()) glFragmentLightModelfEXT(pname, param);}\r
+  GLEEPFNGLFRAGMENTLIGHTMODELFEXTPROC GLeeFuncPtr_glFragmentLightModelfEXT=GLee_Lazy_glFragmentLightModelfEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFragmentLightModelivEXT\r
+#define GLEE_C_DEFINED_glFragmentLightModelivEXT\r
+  GLvoid __stdcall GLee_Lazy_glFragmentLightModelivEXT(GLenum pname, GLint * params)  {if (GLeeInit()) glFragmentLightModelivEXT(pname, params);}\r
+  GLEEPFNGLFRAGMENTLIGHTMODELIVEXTPROC GLeeFuncPtr_glFragmentLightModelivEXT=GLee_Lazy_glFragmentLightModelivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFragmentLightModelfvEXT\r
+#define GLEE_C_DEFINED_glFragmentLightModelfvEXT\r
+  GLvoid __stdcall GLee_Lazy_glFragmentLightModelfvEXT(GLenum pname, GLfloat * params)  {if (GLeeInit()) glFragmentLightModelfvEXT(pname, params);}\r
+  GLEEPFNGLFRAGMENTLIGHTMODELFVEXTPROC GLeeFuncPtr_glFragmentLightModelfvEXT=GLee_Lazy_glFragmentLightModelfvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFragmentLightiEXT\r
+#define GLEE_C_DEFINED_glFragmentLightiEXT\r
+  GLvoid __stdcall GLee_Lazy_glFragmentLightiEXT(GLenum light, GLenum pname, GLint param)  {if (GLeeInit()) glFragmentLightiEXT(light, pname, param);}\r
+  GLEEPFNGLFRAGMENTLIGHTIEXTPROC GLeeFuncPtr_glFragmentLightiEXT=GLee_Lazy_glFragmentLightiEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFragmentLightfEXT\r
+#define GLEE_C_DEFINED_glFragmentLightfEXT\r
+  GLvoid __stdcall GLee_Lazy_glFragmentLightfEXT(GLenum light, GLenum pname, GLfloat param)  {if (GLeeInit()) glFragmentLightfEXT(light, pname, param);}\r
+  GLEEPFNGLFRAGMENTLIGHTFEXTPROC GLeeFuncPtr_glFragmentLightfEXT=GLee_Lazy_glFragmentLightfEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFragmentLightivEXT\r
+#define GLEE_C_DEFINED_glFragmentLightivEXT\r
+  GLvoid __stdcall GLee_Lazy_glFragmentLightivEXT(GLenum light, GLenum pname, GLint * params)  {if (GLeeInit()) glFragmentLightivEXT(light, pname, params);}\r
+  GLEEPFNGLFRAGMENTLIGHTIVEXTPROC GLeeFuncPtr_glFragmentLightivEXT=GLee_Lazy_glFragmentLightivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFragmentLightfvEXT\r
+#define GLEE_C_DEFINED_glFragmentLightfvEXT\r
+  GLvoid __stdcall GLee_Lazy_glFragmentLightfvEXT(GLenum light, GLenum pname, GLfloat * params)  {if (GLeeInit()) glFragmentLightfvEXT(light, pname, params);}\r
+  GLEEPFNGLFRAGMENTLIGHTFVEXTPROC GLeeFuncPtr_glFragmentLightfvEXT=GLee_Lazy_glFragmentLightfvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetFragmentLightivEXT\r
+#define GLEE_C_DEFINED_glGetFragmentLightivEXT\r
+  GLvoid __stdcall GLee_Lazy_glGetFragmentLightivEXT(GLenum light, GLenum pname, GLint * params)  {if (GLeeInit()) glGetFragmentLightivEXT(light, pname, params);}\r
+  GLEEPFNGLGETFRAGMENTLIGHTIVEXTPROC GLeeFuncPtr_glGetFragmentLightivEXT=GLee_Lazy_glGetFragmentLightivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetFragmentLightfvEXT\r
+#define GLEE_C_DEFINED_glGetFragmentLightfvEXT\r
+  GLvoid __stdcall GLee_Lazy_glGetFragmentLightfvEXT(GLenum light, GLenum pname, GLfloat * params)  {if (GLeeInit()) glGetFragmentLightfvEXT(light, pname, params);}\r
+  GLEEPFNGLGETFRAGMENTLIGHTFVEXTPROC GLeeFuncPtr_glGetFragmentLightfvEXT=GLee_Lazy_glGetFragmentLightfvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFragmentMaterialfEXT\r
+#define GLEE_C_DEFINED_glFragmentMaterialfEXT\r
+  GLvoid __stdcall GLee_Lazy_glFragmentMaterialfEXT(GLenum face, GLenum pname, const GLfloat param)  {if (GLeeInit()) glFragmentMaterialfEXT(face, pname, param);}\r
+  GLEEPFNGLFRAGMENTMATERIALFEXTPROC GLeeFuncPtr_glFragmentMaterialfEXT=GLee_Lazy_glFragmentMaterialfEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFragmentMaterialiEXT\r
+#define GLEE_C_DEFINED_glFragmentMaterialiEXT\r
+  GLvoid __stdcall GLee_Lazy_glFragmentMaterialiEXT(GLenum face, GLenum pname, const GLint param)  {if (GLeeInit()) glFragmentMaterialiEXT(face, pname, param);}\r
+  GLEEPFNGLFRAGMENTMATERIALIEXTPROC GLeeFuncPtr_glFragmentMaterialiEXT=GLee_Lazy_glFragmentMaterialiEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFragmentMaterialfvEXT\r
+#define GLEE_C_DEFINED_glFragmentMaterialfvEXT\r
+  GLvoid __stdcall GLee_Lazy_glFragmentMaterialfvEXT(GLenum face, GLenum pname, const GLfloat * params)  {if (GLeeInit()) glFragmentMaterialfvEXT(face, pname, params);}\r
+  GLEEPFNGLFRAGMENTMATERIALFVEXTPROC GLeeFuncPtr_glFragmentMaterialfvEXT=GLee_Lazy_glFragmentMaterialfvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFragmentMaterialivEXT\r
+#define GLEE_C_DEFINED_glFragmentMaterialivEXT\r
+  GLvoid __stdcall GLee_Lazy_glFragmentMaterialivEXT(GLenum face, GLenum pname, const GLint * params)  {if (GLeeInit()) glFragmentMaterialivEXT(face, pname, params);}\r
+  GLEEPFNGLFRAGMENTMATERIALIVEXTPROC GLeeFuncPtr_glFragmentMaterialivEXT=GLee_Lazy_glFragmentMaterialivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFragmentColorMaterialEXT\r
+#define GLEE_C_DEFINED_glFragmentColorMaterialEXT\r
+  GLvoid __stdcall GLee_Lazy_glFragmentColorMaterialEXT(GLenum face, GLenum mode)  {if (GLeeInit()) glFragmentColorMaterialEXT(face, mode);}\r
+  GLEEPFNGLFRAGMENTCOLORMATERIALEXTPROC GLeeFuncPtr_glFragmentColorMaterialEXT=GLee_Lazy_glFragmentColorMaterialEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetFragmentMaterialfvEXT\r
+#define GLEE_C_DEFINED_glGetFragmentMaterialfvEXT\r
+  GLvoid __stdcall GLee_Lazy_glGetFragmentMaterialfvEXT(GLenum face, GLenum pname, const GLfloat * params)  {if (GLeeInit()) glGetFragmentMaterialfvEXT(face, pname, params);}\r
+  GLEEPFNGLGETFRAGMENTMATERIALFVEXTPROC GLeeFuncPtr_glGetFragmentMaterialfvEXT=GLee_Lazy_glGetFragmentMaterialfvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetFragmentMaterialivEXT\r
+#define GLEE_C_DEFINED_glGetFragmentMaterialivEXT\r
+  GLvoid __stdcall GLee_Lazy_glGetFragmentMaterialivEXT(GLenum face, GLenum pname, const GLint * params)  {if (GLeeInit()) glGetFragmentMaterialivEXT(face, pname, params);}\r
+  GLEEPFNGLGETFRAGMENTMATERIALIVEXTPROC GLeeFuncPtr_glGetFragmentMaterialivEXT=GLee_Lazy_glGetFragmentMaterialivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glLightEnviEXT\r
+#define GLEE_C_DEFINED_glLightEnviEXT\r
+  GLvoid __stdcall GLee_Lazy_glLightEnviEXT(GLenum pname, GLint param)  {if (GLeeInit()) glLightEnviEXT(pname, param);}\r
+  GLEEPFNGLLIGHTENVIEXTPROC GLeeFuncPtr_glLightEnviEXT=GLee_Lazy_glLightEnviEXT;\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_geometry_shader4 */\r
+\r
+#ifdef __GLEE_GL_EXT_geometry_shader4\r
+#ifndef GLEE_C_DEFINED_glProgramParameteriEXT\r
+#define GLEE_C_DEFINED_glProgramParameteriEXT\r
+  GLvoid __stdcall GLee_Lazy_glProgramParameteriEXT(GLuint program, GLenum pname, GLint value)  {if (GLeeInit()) glProgramParameteriEXT(program, pname, value);}\r
+  GLEEPFNGLPROGRAMPARAMETERIEXTPROC GLeeFuncPtr_glProgramParameteriEXT=GLee_Lazy_glProgramParameteriEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFramebufferTextureEXT\r
+#define GLEE_C_DEFINED_glFramebufferTextureEXT\r
+  GLvoid __stdcall GLee_Lazy_glFramebufferTextureEXT(GLenum target, GLenum attachment, GLuint texture, GLint level)  {if (GLeeInit()) glFramebufferTextureEXT(target, attachment, texture, level);}\r
+  GLEEPFNGLFRAMEBUFFERTEXTUREEXTPROC GLeeFuncPtr_glFramebufferTextureEXT=GLee_Lazy_glFramebufferTextureEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFramebufferTextureLayerEXT\r
+#define GLEE_C_DEFINED_glFramebufferTextureLayerEXT\r
+  GLvoid __stdcall GLee_Lazy_glFramebufferTextureLayerEXT(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)  {if (GLeeInit()) glFramebufferTextureLayerEXT(target, attachment, texture, level, layer);}\r
+  GLEEPFNGLFRAMEBUFFERTEXTURELAYEREXTPROC GLeeFuncPtr_glFramebufferTextureLayerEXT=GLee_Lazy_glFramebufferTextureLayerEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFramebufferTextureFaceEXT\r
+#define GLEE_C_DEFINED_glFramebufferTextureFaceEXT\r
+  GLvoid __stdcall GLee_Lazy_glFramebufferTextureFaceEXT(GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face)  {if (GLeeInit()) glFramebufferTextureFaceEXT(target, attachment, texture, level, face);}\r
+  GLEEPFNGLFRAMEBUFFERTEXTUREFACEEXTPROC GLeeFuncPtr_glFramebufferTextureFaceEXT=GLee_Lazy_glFramebufferTextureFaceEXT;\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_scene_marker */\r
+\r
+#ifdef __GLEE_GL_EXT_scene_marker\r
+#ifndef GLEE_C_DEFINED_glBeginSceneEXT\r
+#define GLEE_C_DEFINED_glBeginSceneEXT\r
+  GLvoid __stdcall GLee_Lazy_glBeginSceneEXT(void)  {if (GLeeInit()) glBeginSceneEXT();}\r
+  GLEEPFNGLBEGINSCENEEXTPROC GLeeFuncPtr_glBeginSceneEXT=GLee_Lazy_glBeginSceneEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glEndSceneEXT\r
+#define GLEE_C_DEFINED_glEndSceneEXT\r
+  GLvoid __stdcall GLee_Lazy_glEndSceneEXT(void)  {if (GLeeInit()) glEndSceneEXT();}\r
+  GLEEPFNGLENDSCENEEXTPROC GLeeFuncPtr_glEndSceneEXT=GLee_Lazy_glEndSceneEXT;\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_texture_compression_dxt1 */\r
+\r
+#ifdef __GLEE_GL_EXT_texture_compression_dxt1\r
+#endif \r
+\r
+/* GL_EXT_texture_env */\r
+\r
+#ifdef __GLEE_GL_EXT_texture_env\r
+#endif \r
+\r
+/* GL_IBM_static_data */\r
+\r
+#ifdef __GLEE_GL_IBM_static_data\r
+#endif \r
+\r
+/* GL_NV_gpu_program4 */\r
+\r
+#ifdef __GLEE_GL_NV_gpu_program4\r
+#ifndef GLEE_C_DEFINED_glProgramLocalParameterI4iNV\r
+#define GLEE_C_DEFINED_glProgramLocalParameterI4iNV\r
+  GLvoid __stdcall GLee_Lazy_glProgramLocalParameterI4iNV(GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w)  {if (GLeeInit()) glProgramLocalParameterI4iNV(target, index, x, y, z, w);}\r
+  GLEEPFNGLPROGRAMLOCALPARAMETERI4INVPROC GLeeFuncPtr_glProgramLocalParameterI4iNV=GLee_Lazy_glProgramLocalParameterI4iNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramLocalParameterI4ivNV\r
+#define GLEE_C_DEFINED_glProgramLocalParameterI4ivNV\r
+  GLvoid __stdcall GLee_Lazy_glProgramLocalParameterI4ivNV(GLenum target, GLuint index, const GLint * params)  {if (GLeeInit()) glProgramLocalParameterI4ivNV(target, index, params);}\r
+  GLEEPFNGLPROGRAMLOCALPARAMETERI4IVNVPROC GLeeFuncPtr_glProgramLocalParameterI4ivNV=GLee_Lazy_glProgramLocalParameterI4ivNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramLocalParametersI4ivNV\r
+#define GLEE_C_DEFINED_glProgramLocalParametersI4ivNV\r
+  GLvoid __stdcall GLee_Lazy_glProgramLocalParametersI4ivNV(GLenum target, GLuint index, GLsizei count, const GLint * params)  {if (GLeeInit()) glProgramLocalParametersI4ivNV(target, index, count, params);}\r
+  GLEEPFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC GLeeFuncPtr_glProgramLocalParametersI4ivNV=GLee_Lazy_glProgramLocalParametersI4ivNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramLocalParameterI4uiNV\r
+#define GLEE_C_DEFINED_glProgramLocalParameterI4uiNV\r
+  GLvoid __stdcall GLee_Lazy_glProgramLocalParameterI4uiNV(GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)  {if (GLeeInit()) glProgramLocalParameterI4uiNV(target, index, x, y, z, w);}\r
+  GLEEPFNGLPROGRAMLOCALPARAMETERI4UINVPROC GLeeFuncPtr_glProgramLocalParameterI4uiNV=GLee_Lazy_glProgramLocalParameterI4uiNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramLocalParameterI4uivNV\r
+#define GLEE_C_DEFINED_glProgramLocalParameterI4uivNV\r
+  GLvoid __stdcall GLee_Lazy_glProgramLocalParameterI4uivNV(GLenum target, GLuint index, const GLuint * params)  {if (GLeeInit()) glProgramLocalParameterI4uivNV(target, index, params);}\r
+  GLEEPFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC GLeeFuncPtr_glProgramLocalParameterI4uivNV=GLee_Lazy_glProgramLocalParameterI4uivNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramLocalParametersI4uivNV\r
+#define GLEE_C_DEFINED_glProgramLocalParametersI4uivNV\r
+  GLvoid __stdcall GLee_Lazy_glProgramLocalParametersI4uivNV(GLenum target, GLuint index, GLsizei count, const GLuint * params)  {if (GLeeInit()) glProgramLocalParametersI4uivNV(target, index, count, params);}\r
+  GLEEPFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC GLeeFuncPtr_glProgramLocalParametersI4uivNV=GLee_Lazy_glProgramLocalParametersI4uivNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramEnvParameterI4iNV\r
+#define GLEE_C_DEFINED_glProgramEnvParameterI4iNV\r
+  GLvoid __stdcall GLee_Lazy_glProgramEnvParameterI4iNV(GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w)  {if (GLeeInit()) glProgramEnvParameterI4iNV(target, index, x, y, z, w);}\r
+  GLEEPFNGLPROGRAMENVPARAMETERI4INVPROC GLeeFuncPtr_glProgramEnvParameterI4iNV=GLee_Lazy_glProgramEnvParameterI4iNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramEnvParameterI4ivNV\r
+#define GLEE_C_DEFINED_glProgramEnvParameterI4ivNV\r
+  GLvoid __stdcall GLee_Lazy_glProgramEnvParameterI4ivNV(GLenum target, GLuint index, const GLint * params)  {if (GLeeInit()) glProgramEnvParameterI4ivNV(target, index, params);}\r
+  GLEEPFNGLPROGRAMENVPARAMETERI4IVNVPROC GLeeFuncPtr_glProgramEnvParameterI4ivNV=GLee_Lazy_glProgramEnvParameterI4ivNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramEnvParametersI4ivNV\r
+#define GLEE_C_DEFINED_glProgramEnvParametersI4ivNV\r
+  GLvoid __stdcall GLee_Lazy_glProgramEnvParametersI4ivNV(GLenum target, GLuint index, GLsizei count, const GLint * params)  {if (GLeeInit()) glProgramEnvParametersI4ivNV(target, index, count, params);}\r
+  GLEEPFNGLPROGRAMENVPARAMETERSI4IVNVPROC GLeeFuncPtr_glProgramEnvParametersI4ivNV=GLee_Lazy_glProgramEnvParametersI4ivNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramEnvParameterI4uiNV\r
+#define GLEE_C_DEFINED_glProgramEnvParameterI4uiNV\r
+  GLvoid __stdcall GLee_Lazy_glProgramEnvParameterI4uiNV(GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)  {if (GLeeInit()) glProgramEnvParameterI4uiNV(target, index, x, y, z, w);}\r
+  GLEEPFNGLPROGRAMENVPARAMETERI4UINVPROC GLeeFuncPtr_glProgramEnvParameterI4uiNV=GLee_Lazy_glProgramEnvParameterI4uiNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramEnvParameterI4uivNV\r
+#define GLEE_C_DEFINED_glProgramEnvParameterI4uivNV\r
+  GLvoid __stdcall GLee_Lazy_glProgramEnvParameterI4uivNV(GLenum target, GLuint index, const GLuint * params)  {if (GLeeInit()) glProgramEnvParameterI4uivNV(target, index, params);}\r
+  GLEEPFNGLPROGRAMENVPARAMETERI4UIVNVPROC GLeeFuncPtr_glProgramEnvParameterI4uivNV=GLee_Lazy_glProgramEnvParameterI4uivNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glProgramEnvParametersI4uivNV\r
+#define GLEE_C_DEFINED_glProgramEnvParametersI4uivNV\r
+  GLvoid __stdcall GLee_Lazy_glProgramEnvParametersI4uivNV(GLenum target, GLuint index, GLsizei count, const GLuint * params)  {if (GLeeInit()) glProgramEnvParametersI4uivNV(target, index, count, params);}\r
+  GLEEPFNGLPROGRAMENVPARAMETERSI4UIVNVPROC GLeeFuncPtr_glProgramEnvParametersI4uivNV=GLee_Lazy_glProgramEnvParametersI4uivNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetProgramLocalParameterIivNV\r
+#define GLEE_C_DEFINED_glGetProgramLocalParameterIivNV\r
+  GLvoid __stdcall GLee_Lazy_glGetProgramLocalParameterIivNV(GLenum target, GLuint index, GLint * params)  {if (GLeeInit()) glGetProgramLocalParameterIivNV(target, index, params);}\r
+  GLEEPFNGLGETPROGRAMLOCALPARAMETERIIVNVPROC GLeeFuncPtr_glGetProgramLocalParameterIivNV=GLee_Lazy_glGetProgramLocalParameterIivNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetProgramLocalParameterIuivNV\r
+#define GLEE_C_DEFINED_glGetProgramLocalParameterIuivNV\r
+  GLvoid __stdcall GLee_Lazy_glGetProgramLocalParameterIuivNV(GLenum target, GLuint index, GLuint * params)  {if (GLeeInit()) glGetProgramLocalParameterIuivNV(target, index, params);}\r
+  GLEEPFNGLGETPROGRAMLOCALPARAMETERIUIVNVPROC GLeeFuncPtr_glGetProgramLocalParameterIuivNV=GLee_Lazy_glGetProgramLocalParameterIuivNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetProgramEnvParameterIivNV\r
+#define GLEE_C_DEFINED_glGetProgramEnvParameterIivNV\r
+  GLvoid __stdcall GLee_Lazy_glGetProgramEnvParameterIivNV(GLenum target, GLuint index, GLint * params)  {if (GLeeInit()) glGetProgramEnvParameterIivNV(target, index, params);}\r
+  GLEEPFNGLGETPROGRAMENVPARAMETERIIVNVPROC GLeeFuncPtr_glGetProgramEnvParameterIivNV=GLee_Lazy_glGetProgramEnvParameterIivNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetProgramEnvParameterIuivNV\r
+#define GLEE_C_DEFINED_glGetProgramEnvParameterIuivNV\r
+  GLvoid __stdcall GLee_Lazy_glGetProgramEnvParameterIuivNV(GLenum target, GLuint index, GLuint * params)  {if (GLeeInit()) glGetProgramEnvParameterIuivNV(target, index, params);}\r
+  GLEEPFNGLGETPROGRAMENVPARAMETERIUIVNVPROC GLeeFuncPtr_glGetProgramEnvParameterIuivNV=GLee_Lazy_glGetProgramEnvParameterIuivNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFramebufferTextureEXT\r
+#define GLEE_C_DEFINED_glFramebufferTextureEXT\r
+  GLvoid __stdcall GLee_Lazy_glFramebufferTextureEXT(GLenum target, GLenum attachment, GLuint texture, GLint level)  {if (GLeeInit()) glFramebufferTextureEXT(target, attachment, texture, level);}\r
+  GLEEPFNGLFRAMEBUFFERTEXTUREEXTPROC GLeeFuncPtr_glFramebufferTextureEXT=GLee_Lazy_glFramebufferTextureEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFramebufferTextureLayerEXT\r
+#define GLEE_C_DEFINED_glFramebufferTextureLayerEXT\r
+  GLvoid __stdcall GLee_Lazy_glFramebufferTextureLayerEXT(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)  {if (GLeeInit()) glFramebufferTextureLayerEXT(target, attachment, texture, level, layer);}\r
+  GLEEPFNGLFRAMEBUFFERTEXTURELAYEREXTPROC GLeeFuncPtr_glFramebufferTextureLayerEXT=GLee_Lazy_glFramebufferTextureLayerEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFramebufferTextureFaceEXT\r
+#define GLEE_C_DEFINED_glFramebufferTextureFaceEXT\r
+  GLvoid __stdcall GLee_Lazy_glFramebufferTextureFaceEXT(GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face)  {if (GLeeInit()) glFramebufferTextureFaceEXT(target, attachment, texture, level, face);}\r
+  GLEEPFNGLFRAMEBUFFERTEXTUREFACEEXTPROC GLeeFuncPtr_glFramebufferTextureFaceEXT=GLee_Lazy_glFramebufferTextureFaceEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttribI2iEXT\r
+#define GLEE_C_DEFINED_glVertexAttribI2iEXT\r
+  GLvoid __stdcall GLee_Lazy_glVertexAttribI2iEXT(GLuint index, GLint x, GLint y)  {if (GLeeInit()) glVertexAttribI2iEXT(index, x, y);}\r
+  GLEEPFNGLVERTEXATTRIBI2IEXTPROC GLeeFuncPtr_glVertexAttribI2iEXT=GLee_Lazy_glVertexAttribI2iEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttribI3iEXT\r
+#define GLEE_C_DEFINED_glVertexAttribI3iEXT\r
+  GLvoid __stdcall GLee_Lazy_glVertexAttribI3iEXT(GLuint index, GLint x, GLint y, GLint z)  {if (GLeeInit()) glVertexAttribI3iEXT(index, x, y, z);}\r
+  GLEEPFNGLVERTEXATTRIBI3IEXTPROC GLeeFuncPtr_glVertexAttribI3iEXT=GLee_Lazy_glVertexAttribI3iEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttribI4iEXT\r
+#define GLEE_C_DEFINED_glVertexAttribI4iEXT\r
+  GLvoid __stdcall GLee_Lazy_glVertexAttribI4iEXT(GLuint index, GLint x, GLint y, GLint z, GLint w)  {if (GLeeInit()) glVertexAttribI4iEXT(index, x, y, z, w);}\r
+  GLEEPFNGLVERTEXATTRIBI4IEXTPROC GLeeFuncPtr_glVertexAttribI4iEXT=GLee_Lazy_glVertexAttribI4iEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttribI1uiEXT\r
+#define GLEE_C_DEFINED_glVertexAttribI1uiEXT\r
+  GLvoid __stdcall GLee_Lazy_glVertexAttribI1uiEXT(GLuint index, GLuint x)  {if (GLeeInit()) glVertexAttribI1uiEXT(index, x);}\r
+  GLEEPFNGLVERTEXATTRIBI1UIEXTPROC GLeeFuncPtr_glVertexAttribI1uiEXT=GLee_Lazy_glVertexAttribI1uiEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttribI2uiEXT\r
+#define GLEE_C_DEFINED_glVertexAttribI2uiEXT\r
+  GLvoid __stdcall GLee_Lazy_glVertexAttribI2uiEXT(GLuint index, GLuint x, GLuint y)  {if (GLeeInit()) glVertexAttribI2uiEXT(index, x, y);}\r
+  GLEEPFNGLVERTEXATTRIBI2UIEXTPROC GLeeFuncPtr_glVertexAttribI2uiEXT=GLee_Lazy_glVertexAttribI2uiEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttribI3uiEXT\r
+#define GLEE_C_DEFINED_glVertexAttribI3uiEXT\r
+  GLvoid __stdcall GLee_Lazy_glVertexAttribI3uiEXT(GLuint index, GLuint x, GLuint y, GLuint z)  {if (GLeeInit()) glVertexAttribI3uiEXT(index, x, y, z);}\r
+  GLEEPFNGLVERTEXATTRIBI3UIEXTPROC GLeeFuncPtr_glVertexAttribI3uiEXT=GLee_Lazy_glVertexAttribI3uiEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttribI4uiEXT\r
+#define GLEE_C_DEFINED_glVertexAttribI4uiEXT\r
+  GLvoid __stdcall GLee_Lazy_glVertexAttribI4uiEXT(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)  {if (GLeeInit()) glVertexAttribI4uiEXT(index, x, y, z, w);}\r
+  GLEEPFNGLVERTEXATTRIBI4UIEXTPROC GLeeFuncPtr_glVertexAttribI4uiEXT=GLee_Lazy_glVertexAttribI4uiEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttribI1ivEXT\r
+#define GLEE_C_DEFINED_glVertexAttribI1ivEXT\r
+  GLvoid __stdcall GLee_Lazy_glVertexAttribI1ivEXT(GLuint index, const GLint * v)  {if (GLeeInit()) glVertexAttribI1ivEXT(index, v);}\r
+  GLEEPFNGLVERTEXATTRIBI1IVEXTPROC GLeeFuncPtr_glVertexAttribI1ivEXT=GLee_Lazy_glVertexAttribI1ivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttribI2ivEXT\r
+#define GLEE_C_DEFINED_glVertexAttribI2ivEXT\r
+  GLvoid __stdcall GLee_Lazy_glVertexAttribI2ivEXT(GLuint index, const GLint * v)  {if (GLeeInit()) glVertexAttribI2ivEXT(index, v);}\r
+  GLEEPFNGLVERTEXATTRIBI2IVEXTPROC GLeeFuncPtr_glVertexAttribI2ivEXT=GLee_Lazy_glVertexAttribI2ivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttribI3ivEXT\r
+#define GLEE_C_DEFINED_glVertexAttribI3ivEXT\r
+  GLvoid __stdcall GLee_Lazy_glVertexAttribI3ivEXT(GLuint index, const GLint * v)  {if (GLeeInit()) glVertexAttribI3ivEXT(index, v);}\r
+  GLEEPFNGLVERTEXATTRIBI3IVEXTPROC GLeeFuncPtr_glVertexAttribI3ivEXT=GLee_Lazy_glVertexAttribI3ivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttribI4ivEXT\r
+#define GLEE_C_DEFINED_glVertexAttribI4ivEXT\r
+  GLvoid __stdcall GLee_Lazy_glVertexAttribI4ivEXT(GLuint index, const GLint * v)  {if (GLeeInit()) glVertexAttribI4ivEXT(index, v);}\r
+  GLEEPFNGLVERTEXATTRIBI4IVEXTPROC GLeeFuncPtr_glVertexAttribI4ivEXT=GLee_Lazy_glVertexAttribI4ivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttribI1uivEXT\r
+#define GLEE_C_DEFINED_glVertexAttribI1uivEXT\r
+  GLvoid __stdcall GLee_Lazy_glVertexAttribI1uivEXT(GLuint index, const GLuint * v)  {if (GLeeInit()) glVertexAttribI1uivEXT(index, v);}\r
+  GLEEPFNGLVERTEXATTRIBI1UIVEXTPROC GLeeFuncPtr_glVertexAttribI1uivEXT=GLee_Lazy_glVertexAttribI1uivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttribI2uivEXT\r
+#define GLEE_C_DEFINED_glVertexAttribI2uivEXT\r
+  GLvoid __stdcall GLee_Lazy_glVertexAttribI2uivEXT(GLuint index, const GLuint * v)  {if (GLeeInit()) glVertexAttribI2uivEXT(index, v);}\r
+  GLEEPFNGLVERTEXATTRIBI2UIVEXTPROC GLeeFuncPtr_glVertexAttribI2uivEXT=GLee_Lazy_glVertexAttribI2uivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttribI3uivEXT\r
+#define GLEE_C_DEFINED_glVertexAttribI3uivEXT\r
+  GLvoid __stdcall GLee_Lazy_glVertexAttribI3uivEXT(GLuint index, const GLuint * v)  {if (GLeeInit()) glVertexAttribI3uivEXT(index, v);}\r
+  GLEEPFNGLVERTEXATTRIBI3UIVEXTPROC GLeeFuncPtr_glVertexAttribI3uivEXT=GLee_Lazy_glVertexAttribI3uivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttribI4uivEXT\r
+#define GLEE_C_DEFINED_glVertexAttribI4uivEXT\r
+  GLvoid __stdcall GLee_Lazy_glVertexAttribI4uivEXT(GLuint index, const GLuint * v)  {if (GLeeInit()) glVertexAttribI4uivEXT(index, v);}\r
+  GLEEPFNGLVERTEXATTRIBI4UIVEXTPROC GLeeFuncPtr_glVertexAttribI4uivEXT=GLee_Lazy_glVertexAttribI4uivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttribI4bvEXT\r
+#define GLEE_C_DEFINED_glVertexAttribI4bvEXT\r
+  GLvoid __stdcall GLee_Lazy_glVertexAttribI4bvEXT(GLuint index, const GLbyte * v)  {if (GLeeInit()) glVertexAttribI4bvEXT(index, v);}\r
+  GLEEPFNGLVERTEXATTRIBI4BVEXTPROC GLeeFuncPtr_glVertexAttribI4bvEXT=GLee_Lazy_glVertexAttribI4bvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttribI4svEXT\r
+#define GLEE_C_DEFINED_glVertexAttribI4svEXT\r
+  GLvoid __stdcall GLee_Lazy_glVertexAttribI4svEXT(GLuint index, const GLshort * v)  {if (GLeeInit()) glVertexAttribI4svEXT(index, v);}\r
+  GLEEPFNGLVERTEXATTRIBI4SVEXTPROC GLeeFuncPtr_glVertexAttribI4svEXT=GLee_Lazy_glVertexAttribI4svEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttribI4ubvEXT\r
+#define GLEE_C_DEFINED_glVertexAttribI4ubvEXT\r
+  GLvoid __stdcall GLee_Lazy_glVertexAttribI4ubvEXT(GLuint index, const GLubyte * v)  {if (GLeeInit()) glVertexAttribI4ubvEXT(index, v);}\r
+  GLEEPFNGLVERTEXATTRIBI4UBVEXTPROC GLeeFuncPtr_glVertexAttribI4ubvEXT=GLee_Lazy_glVertexAttribI4ubvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttribI4usvEXT\r
+#define GLEE_C_DEFINED_glVertexAttribI4usvEXT\r
+  GLvoid __stdcall GLee_Lazy_glVertexAttribI4usvEXT(GLuint index, const GLushort * v)  {if (GLeeInit()) glVertexAttribI4usvEXT(index, v);}\r
+  GLEEPFNGLVERTEXATTRIBI4USVEXTPROC GLeeFuncPtr_glVertexAttribI4usvEXT=GLee_Lazy_glVertexAttribI4usvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glVertexAttribIPointerEXT\r
+#define GLEE_C_DEFINED_glVertexAttribIPointerEXT\r
+  GLvoid __stdcall GLee_Lazy_glVertexAttribIPointerEXT(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid * pointer)  {if (GLeeInit()) glVertexAttribIPointerEXT(index, size, type, stride, pointer);}\r
+  GLEEPFNGLVERTEXATTRIBIPOINTEREXTPROC GLeeFuncPtr_glVertexAttribIPointerEXT=GLee_Lazy_glVertexAttribIPointerEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetVertexAttribIivEXT\r
+#define GLEE_C_DEFINED_glGetVertexAttribIivEXT\r
+  GLvoid __stdcall GLee_Lazy_glGetVertexAttribIivEXT(GLuint index, GLenum pname, GLint * params)  {if (GLeeInit()) glGetVertexAttribIivEXT(index, pname, params);}\r
+  GLEEPFNGLGETVERTEXATTRIBIIVEXTPROC GLeeFuncPtr_glGetVertexAttribIivEXT=GLee_Lazy_glGetVertexAttribIivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetVertexAttribIuivEXT\r
+#define GLEE_C_DEFINED_glGetVertexAttribIuivEXT\r
+  GLvoid __stdcall GLee_Lazy_glGetVertexAttribIuivEXT(GLuint index, GLenum pname, GLuint * params)  {if (GLeeInit()) glGetVertexAttribIuivEXT(index, pname, params);}\r
+  GLEEPFNGLGETVERTEXATTRIBIUIVEXTPROC GLeeFuncPtr_glGetVertexAttribIuivEXT=GLee_Lazy_glGetVertexAttribIuivEXT;\r
+#endif\r
+#endif \r
+\r
+/* GL_OES_byte_coordinates */\r
+\r
+#ifdef __GLEE_GL_OES_byte_coordinates\r
+#endif \r
+\r
+/* GL_OES_compressed_paletted_texture */\r
+\r
+#ifdef __GLEE_GL_OES_compressed_paletted_texture\r
+#endif \r
+\r
+/* GL_OES_single_precision */\r
+\r
+#ifdef __GLEE_GL_OES_single_precision\r
+#ifndef GLEE_C_DEFINED_glDepthRangefOES\r
+#define GLEE_C_DEFINED_glDepthRangefOES\r
+  GLvoid __stdcall GLee_Lazy_glDepthRangefOES(GLclampf n, GLclampf f)  {if (GLeeInit()) glDepthRangefOES(n, f);}\r
+  GLEEPFNGLDEPTHRANGEFOESPROC GLeeFuncPtr_glDepthRangefOES=GLee_Lazy_glDepthRangefOES;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glFrustumfOES\r
+#define GLEE_C_DEFINED_glFrustumfOES\r
+  GLvoid __stdcall GLee_Lazy_glFrustumfOES(GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f)  {if (GLeeInit()) glFrustumfOES(l, r, b, t, n, f);}\r
+  GLEEPFNGLFRUSTUMFOESPROC GLeeFuncPtr_glFrustumfOES=GLee_Lazy_glFrustumfOES;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glOrthofOES\r
+#define GLEE_C_DEFINED_glOrthofOES\r
+  GLvoid __stdcall GLee_Lazy_glOrthofOES(GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f)  {if (GLeeInit()) glOrthofOES(l, r, b, t, n, f);}\r
+  GLEEPFNGLORTHOFOESPROC GLeeFuncPtr_glOrthofOES=GLee_Lazy_glOrthofOES;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glClipPlanefOES\r
+#define GLEE_C_DEFINED_glClipPlanefOES\r
+  GLvoid __stdcall GLee_Lazy_glClipPlanefOES(GLenum plane, const GLfloat* equation)  {if (GLeeInit()) glClipPlanefOES(plane, equation);}\r
+  GLEEPFNGLCLIPPLANEFOESPROC GLeeFuncPtr_glClipPlanefOES=GLee_Lazy_glClipPlanefOES;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glGetClipPlanefOES\r
+#define GLEE_C_DEFINED_glGetClipPlanefOES\r
+  GLvoid __stdcall GLee_Lazy_glGetClipPlanefOES(GLenum plane, GLfloat* equation)  {if (GLeeInit()) glGetClipPlanefOES(plane, equation);}\r
+  GLEEPFNGLGETCLIPPLANEFOESPROC GLeeFuncPtr_glGetClipPlanefOES=GLee_Lazy_glGetClipPlanefOES;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glClearDepthfOES\r
+#define GLEE_C_DEFINED_glClearDepthfOES\r
+  GLvoid __stdcall GLee_Lazy_glClearDepthfOES(GLclampd depth)  {if (GLeeInit()) glClearDepthfOES(depth);}\r
+  GLEEPFNGLCLEARDEPTHFOESPROC GLeeFuncPtr_glClearDepthfOES=GLee_Lazy_glClearDepthfOES;\r
+#endif\r
+#endif \r
+\r
+/* GL_SGIX_pixel_texture_bits */\r
+\r
+#ifdef __GLEE_GL_SGIX_pixel_texture_bits\r
+#endif \r
+\r
+/* GL_SGIX_texture_range */\r
+\r
+#ifdef __GLEE_GL_SGIX_texture_range\r
+#endif \r
+\r
+/* WGL */\r
+\r
+#ifdef WIN32\r
+\r
+/* Extension querying variables */\r
+\r
+GLboolean _GLEE_WGL_ARB_buffer_region = GL_FALSE;\r
+GLboolean _GLEE_WGL_ARB_multisample = GL_FALSE;\r
+GLboolean _GLEE_WGL_ARB_extensions_string = GL_FALSE;\r
+GLboolean _GLEE_WGL_ARB_pixel_format = GL_FALSE;\r
+GLboolean _GLEE_WGL_ARB_make_current_read = GL_FALSE;\r
+GLboolean _GLEE_WGL_ARB_pbuffer = GL_FALSE;\r
+GLboolean _GLEE_WGL_ARB_render_texture = GL_FALSE;\r
+GLboolean _GLEE_WGL_ARB_pixel_format_float = GL_FALSE;\r
+GLboolean _GLEE_WGL_ARB_create_context = GL_FALSE;\r
+GLboolean _GLEE_WGL_EXT_make_current_read = GL_FALSE;\r
+GLboolean _GLEE_WGL_EXT_pixel_format = GL_FALSE;\r
+GLboolean _GLEE_WGL_EXT_pbuffer = GL_FALSE;\r
+GLboolean _GLEE_WGL_EXT_depth_float = GL_FALSE;\r
+GLboolean _GLEE_WGL_3DFX_multisample = GL_FALSE;\r
+GLboolean _GLEE_WGL_EXT_multisample = GL_FALSE;\r
+GLboolean _GLEE_WGL_I3D_digital_video_control = GL_FALSE;\r
+GLboolean _GLEE_WGL_I3D_gamma = GL_FALSE;\r
+GLboolean _GLEE_WGL_I3D_genlock = GL_FALSE;\r
+GLboolean _GLEE_WGL_I3D_image_buffer = GL_FALSE;\r
+GLboolean _GLEE_WGL_I3D_swap_frame_lock = GL_FALSE;\r
+GLboolean _GLEE_WGL_NV_render_depth_texture = GL_FALSE;\r
+GLboolean _GLEE_WGL_NV_render_texture_rectangle = GL_FALSE;\r
+GLboolean _GLEE_WGL_ATI_pixel_format_float = GL_FALSE;\r
+GLboolean _GLEE_WGL_NV_float_buffer = GL_FALSE;\r
+GLboolean _GLEE_WGL_3DL_stereo_control = GL_FALSE;\r
+GLboolean _GLEE_WGL_EXT_pixel_format_packed_float = GL_FALSE;\r
+GLboolean _GLEE_WGL_EXT_framebuffer_sRGB = GL_FALSE;\r
+GLboolean _GLEE_WGL_NV_present_video = GL_FALSE;\r
+GLboolean _GLEE_WGL_NV_swap_group = GL_FALSE;\r
+GLboolean _GLEE_WGL_NV_gpu_affinity = GL_FALSE;\r
+GLboolean _GLEE_WGL_EXT_display_color_table = GL_FALSE;\r
+GLboolean _GLEE_WGL_EXT_extensions_string = GL_FALSE;\r
+GLboolean _GLEE_WGL_EXT_swap_control = GL_FALSE;\r
+GLboolean _GLEE_WGL_NV_vertex_array_range = GL_FALSE;\r
+GLboolean _GLEE_WGL_OML_sync_control = GL_FALSE;\r
+GLboolean _GLEE_WGL_I3D_swap_frame_usage = GL_FALSE;\r
+GLboolean _GLEE_WGL_NV_video_output = GL_FALSE;\r
+\r
+/*  WGL Extension names */\r
+\r
+char __GLeeWGLExtensionNames[37][34]={\r
+    "WGL_ARB_buffer_region",\r
+    "WGL_ARB_multisample",\r
+    "WGL_ARB_extensions_string",\r
+    "WGL_ARB_pixel_format",\r
+    "WGL_ARB_make_current_read",\r
+    "WGL_ARB_pbuffer",\r
+    "WGL_ARB_render_texture",\r
+    "WGL_ARB_pixel_format_float",\r
+    "WGL_ARB_create_context",\r
+    "WGL_EXT_make_current_read",\r
+    "WGL_EXT_pixel_format",\r
+    "WGL_EXT_pbuffer",\r
+    "WGL_EXT_depth_float",\r
+    "WGL_3DFX_multisample",\r
+    "WGL_EXT_multisample",\r
+    "WGL_I3D_digital_video_control",\r
+    "WGL_I3D_gamma",\r
+    "WGL_I3D_genlock",\r
+    "WGL_I3D_image_buffer",\r
+    "WGL_I3D_swap_frame_lock",\r
+    "WGL_NV_render_depth_texture",\r
+    "WGL_NV_render_texture_rectangle",\r
+    "WGL_ATI_pixel_format_float",\r
+    "WGL_NV_float_buffer",\r
+    "WGL_3DL_stereo_control",\r
+    "WGL_EXT_pixel_format_packed_float",\r
+    "WGL_EXT_framebuffer_sRGB",\r
+    "WGL_NV_present_video",\r
+    "WGL_NV_swap_group",\r
+    "WGL_NV_gpu_affinity",\r
+    "WGL_EXT_display_color_table",\r
+    "WGL_EXT_extensions_string",\r
+    "WGL_EXT_swap_control",\r
+    "WGL_NV_vertex_array_range",\r
+    "WGL_OML_sync_control",\r
+    "WGL_I3D_swap_frame_usage",\r
+    "WGL_NV_video_output"\r
+};\r
+int __GLeeWGLNumExtensions=37;\r
+\r
+/* WGL_ARB_buffer_region */\r
+\r
+#ifdef __GLEE_WGL_ARB_buffer_region\r
+#ifndef GLEE_C_DEFINED_wglCreateBufferRegionARB\r
+#define GLEE_C_DEFINED_wglCreateBufferRegionARB\r
+  HANDLE __stdcall GLee_Lazy_wglCreateBufferRegionARB(HDC hDC, int iLayerPlane, UINT uType)  {if (GLeeInit()) return wglCreateBufferRegionARB(hDC, iLayerPlane, uType); return (HANDLE)0;}\r
+  GLEEPFNWGLCREATEBUFFERREGIONARBPROC GLeeFuncPtr_wglCreateBufferRegionARB=GLee_Lazy_wglCreateBufferRegionARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglDeleteBufferRegionARB\r
+#define GLEE_C_DEFINED_wglDeleteBufferRegionARB\r
+  VOID __stdcall GLee_Lazy_wglDeleteBufferRegionARB(HANDLE hRegion)  {if (GLeeInit()) wglDeleteBufferRegionARB(hRegion);}\r
+  GLEEPFNWGLDELETEBUFFERREGIONARBPROC GLeeFuncPtr_wglDeleteBufferRegionARB=GLee_Lazy_wglDeleteBufferRegionARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglSaveBufferRegionARB\r
+#define GLEE_C_DEFINED_wglSaveBufferRegionARB\r
+  BOOL __stdcall GLee_Lazy_wglSaveBufferRegionARB(HANDLE hRegion, int x, int y, int width, int height)  {if (GLeeInit()) return wglSaveBufferRegionARB(hRegion, x, y, width, height); return (BOOL)0;}\r
+  GLEEPFNWGLSAVEBUFFERREGIONARBPROC GLeeFuncPtr_wglSaveBufferRegionARB=GLee_Lazy_wglSaveBufferRegionARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglRestoreBufferRegionARB\r
+#define GLEE_C_DEFINED_wglRestoreBufferRegionARB\r
+  BOOL __stdcall GLee_Lazy_wglRestoreBufferRegionARB(HANDLE hRegion, int x, int y, int width, int height, int xSrc, int ySrc)  {if (GLeeInit()) return wglRestoreBufferRegionARB(hRegion, x, y, width, height, xSrc, ySrc); return (BOOL)0;}\r
+  GLEEPFNWGLRESTOREBUFFERREGIONARBPROC GLeeFuncPtr_wglRestoreBufferRegionARB=GLee_Lazy_wglRestoreBufferRegionARB;\r
+#endif\r
+#endif \r
+\r
+/* WGL_ARB_multisample */\r
+\r
+#ifdef __GLEE_WGL_ARB_multisample\r
+#endif \r
+\r
+/* WGL_ARB_extensions_string */\r
+\r
+#ifdef __GLEE_WGL_ARB_extensions_string\r
+#ifndef GLEE_C_DEFINED_wglGetExtensionsStringARB\r
+#define GLEE_C_DEFINED_wglGetExtensionsStringARB\r
+  const char * __stdcall GLee_Lazy_wglGetExtensionsStringARB(HDC hdc)  {if (GLeeInit()) return wglGetExtensionsStringARB(hdc); return (const char *)0;}\r
+  GLEEPFNWGLGETEXTENSIONSSTRINGARBPROC GLeeFuncPtr_wglGetExtensionsStringARB=GLee_Lazy_wglGetExtensionsStringARB;\r
+#endif\r
+#endif \r
+\r
+/* WGL_ARB_pixel_format */\r
+\r
+#ifdef __GLEE_WGL_ARB_pixel_format\r
+#ifndef GLEE_C_DEFINED_wglGetPixelFormatAttribivARB\r
+#define GLEE_C_DEFINED_wglGetPixelFormatAttribivARB\r
+  BOOL __stdcall GLee_Lazy_wglGetPixelFormatAttribivARB(HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int * piAttributes, int * piValues)  {if (GLeeInit()) return wglGetPixelFormatAttribivARB(hdc, iPixelFormat, iLayerPlane, nAttributes, piAttributes, piValues); return (BOOL)0;}\r
+  GLEEPFNWGLGETPIXELFORMATATTRIBIVARBPROC GLeeFuncPtr_wglGetPixelFormatAttribivARB=GLee_Lazy_wglGetPixelFormatAttribivARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglGetPixelFormatAttribfvARB\r
+#define GLEE_C_DEFINED_wglGetPixelFormatAttribfvARB\r
+  BOOL __stdcall GLee_Lazy_wglGetPixelFormatAttribfvARB(HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int * piAttributes, FLOAT * pfValues)  {if (GLeeInit()) return wglGetPixelFormatAttribfvARB(hdc, iPixelFormat, iLayerPlane, nAttributes, piAttributes, pfValues); return (BOOL)0;}\r
+  GLEEPFNWGLGETPIXELFORMATATTRIBFVARBPROC GLeeFuncPtr_wglGetPixelFormatAttribfvARB=GLee_Lazy_wglGetPixelFormatAttribfvARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglChoosePixelFormatARB\r
+#define GLEE_C_DEFINED_wglChoosePixelFormatARB\r
+  BOOL __stdcall GLee_Lazy_wglChoosePixelFormatARB(HDC hdc, const int * piAttribIList, const FLOAT * pfAttribFList, UINT nMaxFormats, int * piFormats, UINT * nNumFormats)  {if (GLeeInit()) return wglChoosePixelFormatARB(hdc, piAttribIList, pfAttribFList, nMaxFormats, piFormats, nNumFormats); return (BOOL)0;}\r
+  GLEEPFNWGLCHOOSEPIXELFORMATARBPROC GLeeFuncPtr_wglChoosePixelFormatARB=GLee_Lazy_wglChoosePixelFormatARB;\r
+#endif\r
+#endif \r
+\r
+/* WGL_ARB_make_current_read */\r
+\r
+#ifdef __GLEE_WGL_ARB_make_current_read\r
+#ifndef GLEE_C_DEFINED_wglMakeContextCurrentARB\r
+#define GLEE_C_DEFINED_wglMakeContextCurrentARB\r
+  BOOL __stdcall GLee_Lazy_wglMakeContextCurrentARB(HDC hDrawDC, HDC hReadDC, HGLRC hglrc)  {if (GLeeInit()) return wglMakeContextCurrentARB(hDrawDC, hReadDC, hglrc); return (BOOL)0;}\r
+  GLEEPFNWGLMAKECONTEXTCURRENTARBPROC GLeeFuncPtr_wglMakeContextCurrentARB=GLee_Lazy_wglMakeContextCurrentARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglGetCurrentReadDCARB\r
+#define GLEE_C_DEFINED_wglGetCurrentReadDCARB\r
+  HDC __stdcall GLee_Lazy_wglGetCurrentReadDCARB(void)  {if (GLeeInit()) return wglGetCurrentReadDCARB(); return (HDC)0;}\r
+  GLEEPFNWGLGETCURRENTREADDCARBPROC GLeeFuncPtr_wglGetCurrentReadDCARB=GLee_Lazy_wglGetCurrentReadDCARB;\r
+#endif\r
+#endif \r
+\r
+/* WGL_ARB_pbuffer */\r
+\r
+#ifdef __GLEE_WGL_ARB_pbuffer\r
+#ifndef GLEE_C_DEFINED_wglCreatePbufferARB\r
+#define GLEE_C_DEFINED_wglCreatePbufferARB\r
+  HPBUFFERARB __stdcall GLee_Lazy_wglCreatePbufferARB(HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int * piAttribList)  {if (GLeeInit()) return wglCreatePbufferARB(hDC, iPixelFormat, iWidth, iHeight, piAttribList); return (HPBUFFERARB)0;}\r
+  GLEEPFNWGLCREATEPBUFFERARBPROC GLeeFuncPtr_wglCreatePbufferARB=GLee_Lazy_wglCreatePbufferARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglGetPbufferDCARB\r
+#define GLEE_C_DEFINED_wglGetPbufferDCARB\r
+  HDC __stdcall GLee_Lazy_wglGetPbufferDCARB(HPBUFFERARB hPbuffer)  {if (GLeeInit()) return wglGetPbufferDCARB(hPbuffer); return (HDC)0;}\r
+  GLEEPFNWGLGETPBUFFERDCARBPROC GLeeFuncPtr_wglGetPbufferDCARB=GLee_Lazy_wglGetPbufferDCARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglReleasePbufferDCARB\r
+#define GLEE_C_DEFINED_wglReleasePbufferDCARB\r
+  int __stdcall GLee_Lazy_wglReleasePbufferDCARB(HPBUFFERARB hPbuffer, HDC hDC)  {if (GLeeInit()) return wglReleasePbufferDCARB(hPbuffer, hDC); return (int)0;}\r
+  GLEEPFNWGLRELEASEPBUFFERDCARBPROC GLeeFuncPtr_wglReleasePbufferDCARB=GLee_Lazy_wglReleasePbufferDCARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglDestroyPbufferARB\r
+#define GLEE_C_DEFINED_wglDestroyPbufferARB\r
+  BOOL __stdcall GLee_Lazy_wglDestroyPbufferARB(HPBUFFERARB hPbuffer)  {if (GLeeInit()) return wglDestroyPbufferARB(hPbuffer); return (BOOL)0;}\r
+  GLEEPFNWGLDESTROYPBUFFERARBPROC GLeeFuncPtr_wglDestroyPbufferARB=GLee_Lazy_wglDestroyPbufferARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglQueryPbufferARB\r
+#define GLEE_C_DEFINED_wglQueryPbufferARB\r
+  BOOL __stdcall GLee_Lazy_wglQueryPbufferARB(HPBUFFERARB hPbuffer, int iAttribute, int * piValue)  {if (GLeeInit()) return wglQueryPbufferARB(hPbuffer, iAttribute, piValue); return (BOOL)0;}\r
+  GLEEPFNWGLQUERYPBUFFERARBPROC GLeeFuncPtr_wglQueryPbufferARB=GLee_Lazy_wglQueryPbufferARB;\r
+#endif\r
+#endif \r
+\r
+/* WGL_ARB_render_texture */\r
+\r
+#ifdef __GLEE_WGL_ARB_render_texture\r
+#ifndef GLEE_C_DEFINED_wglBindTexImageARB\r
+#define GLEE_C_DEFINED_wglBindTexImageARB\r
+  BOOL __stdcall GLee_Lazy_wglBindTexImageARB(HPBUFFERARB hPbuffer, int iBuffer)  {if (GLeeInit()) return wglBindTexImageARB(hPbuffer, iBuffer); return (BOOL)0;}\r
+  GLEEPFNWGLBINDTEXIMAGEARBPROC GLeeFuncPtr_wglBindTexImageARB=GLee_Lazy_wglBindTexImageARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglReleaseTexImageARB\r
+#define GLEE_C_DEFINED_wglReleaseTexImageARB\r
+  BOOL __stdcall GLee_Lazy_wglReleaseTexImageARB(HPBUFFERARB hPbuffer, int iBuffer)  {if (GLeeInit()) return wglReleaseTexImageARB(hPbuffer, iBuffer); return (BOOL)0;}\r
+  GLEEPFNWGLRELEASETEXIMAGEARBPROC GLeeFuncPtr_wglReleaseTexImageARB=GLee_Lazy_wglReleaseTexImageARB;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglSetPbufferAttribARB\r
+#define GLEE_C_DEFINED_wglSetPbufferAttribARB\r
+  BOOL __stdcall GLee_Lazy_wglSetPbufferAttribARB(HPBUFFERARB hPbuffer, const int * piAttribList)  {if (GLeeInit()) return wglSetPbufferAttribARB(hPbuffer, piAttribList); return (BOOL)0;}\r
+  GLEEPFNWGLSETPBUFFERATTRIBARBPROC GLeeFuncPtr_wglSetPbufferAttribARB=GLee_Lazy_wglSetPbufferAttribARB;\r
+#endif\r
+#endif \r
+\r
+/* WGL_ARB_pixel_format_float */\r
+\r
+#ifdef __GLEE_WGL_ARB_pixel_format_float\r
+#endif \r
+\r
+/* WGL_ARB_create_context */\r
+\r
+#ifdef __GLEE_WGL_ARB_create_context\r
+#ifndef GLEE_C_DEFINED_wglCreateContextAttribsARB\r
+#define GLEE_C_DEFINED_wglCreateContextAttribsARB\r
+  HGLRC __stdcall GLee_Lazy_wglCreateContextAttribsARB(HDC hDC, HGLRC hShareContext, const int * attribList)  {if (GLeeInit()) return wglCreateContextAttribsARB(hDC, hShareContext, attribList); return (HGLRC)0;}\r
+  GLEEPFNWGLCREATECONTEXTATTRIBSARBPROC GLeeFuncPtr_wglCreateContextAttribsARB=GLee_Lazy_wglCreateContextAttribsARB;\r
+#endif\r
+#endif \r
+\r
+/* WGL_EXT_make_current_read */\r
+\r
+#ifdef __GLEE_WGL_EXT_make_current_read\r
+#ifndef GLEE_C_DEFINED_wglMakeContextCurrentEXT\r
+#define GLEE_C_DEFINED_wglMakeContextCurrentEXT\r
+  BOOL __stdcall GLee_Lazy_wglMakeContextCurrentEXT(HDC hDrawDC, HDC hReadDC, HGLRC hglrc)  {if (GLeeInit()) return wglMakeContextCurrentEXT(hDrawDC, hReadDC, hglrc); return (BOOL)0;}\r
+  GLEEPFNWGLMAKECONTEXTCURRENTEXTPROC GLeeFuncPtr_wglMakeContextCurrentEXT=GLee_Lazy_wglMakeContextCurrentEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglGetCurrentReadDCEXT\r
+#define GLEE_C_DEFINED_wglGetCurrentReadDCEXT\r
+  HDC __stdcall GLee_Lazy_wglGetCurrentReadDCEXT(void)  {if (GLeeInit()) return wglGetCurrentReadDCEXT(); return (HDC)0;}\r
+  GLEEPFNWGLGETCURRENTREADDCEXTPROC GLeeFuncPtr_wglGetCurrentReadDCEXT=GLee_Lazy_wglGetCurrentReadDCEXT;\r
+#endif\r
+#endif \r
+\r
+/* WGL_EXT_pixel_format */\r
+\r
+#ifdef __GLEE_WGL_EXT_pixel_format\r
+#ifndef GLEE_C_DEFINED_wglGetPixelFormatAttribivEXT\r
+#define GLEE_C_DEFINED_wglGetPixelFormatAttribivEXT\r
+  BOOL __stdcall GLee_Lazy_wglGetPixelFormatAttribivEXT(HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int * piAttributes, int * piValues)  {if (GLeeInit()) return wglGetPixelFormatAttribivEXT(hdc, iPixelFormat, iLayerPlane, nAttributes, piAttributes, piValues); return (BOOL)0;}\r
+  GLEEPFNWGLGETPIXELFORMATATTRIBIVEXTPROC GLeeFuncPtr_wglGetPixelFormatAttribivEXT=GLee_Lazy_wglGetPixelFormatAttribivEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglGetPixelFormatAttribfvEXT\r
+#define GLEE_C_DEFINED_wglGetPixelFormatAttribfvEXT\r
+  BOOL __stdcall GLee_Lazy_wglGetPixelFormatAttribfvEXT(HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int * piAttributes, FLOAT * pfValues)  {if (GLeeInit()) return wglGetPixelFormatAttribfvEXT(hdc, iPixelFormat, iLayerPlane, nAttributes, piAttributes, pfValues); return (BOOL)0;}\r
+  GLEEPFNWGLGETPIXELFORMATATTRIBFVEXTPROC GLeeFuncPtr_wglGetPixelFormatAttribfvEXT=GLee_Lazy_wglGetPixelFormatAttribfvEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglChoosePixelFormatEXT\r
+#define GLEE_C_DEFINED_wglChoosePixelFormatEXT\r
+  BOOL __stdcall GLee_Lazy_wglChoosePixelFormatEXT(HDC hdc, const int * piAttribIList, const FLOAT * pfAttribFList, UINT nMaxFormats, int * piFormats, UINT * nNumFormats)  {if (GLeeInit()) return wglChoosePixelFormatEXT(hdc, piAttribIList, pfAttribFList, nMaxFormats, piFormats, nNumFormats); return (BOOL)0;}\r
+  GLEEPFNWGLCHOOSEPIXELFORMATEXTPROC GLeeFuncPtr_wglChoosePixelFormatEXT=GLee_Lazy_wglChoosePixelFormatEXT;\r
+#endif\r
+#endif \r
+\r
+/* WGL_EXT_pbuffer */\r
+\r
+#ifdef __GLEE_WGL_EXT_pbuffer\r
+#ifndef GLEE_C_DEFINED_wglCreatePbufferEXT\r
+#define GLEE_C_DEFINED_wglCreatePbufferEXT\r
+  HPBUFFEREXT __stdcall GLee_Lazy_wglCreatePbufferEXT(HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int * piAttribList)  {if (GLeeInit()) return wglCreatePbufferEXT(hDC, iPixelFormat, iWidth, iHeight, piAttribList); return (HPBUFFEREXT)0;}\r
+  GLEEPFNWGLCREATEPBUFFEREXTPROC GLeeFuncPtr_wglCreatePbufferEXT=GLee_Lazy_wglCreatePbufferEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglGetPbufferDCEXT\r
+#define GLEE_C_DEFINED_wglGetPbufferDCEXT\r
+  HDC __stdcall GLee_Lazy_wglGetPbufferDCEXT(HPBUFFEREXT hPbuffer)  {if (GLeeInit()) return wglGetPbufferDCEXT(hPbuffer); return (HDC)0;}\r
+  GLEEPFNWGLGETPBUFFERDCEXTPROC GLeeFuncPtr_wglGetPbufferDCEXT=GLee_Lazy_wglGetPbufferDCEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglReleasePbufferDCEXT\r
+#define GLEE_C_DEFINED_wglReleasePbufferDCEXT\r
+  int __stdcall GLee_Lazy_wglReleasePbufferDCEXT(HPBUFFEREXT hPbuffer, HDC hDC)  {if (GLeeInit()) return wglReleasePbufferDCEXT(hPbuffer, hDC); return (int)0;}\r
+  GLEEPFNWGLRELEASEPBUFFERDCEXTPROC GLeeFuncPtr_wglReleasePbufferDCEXT=GLee_Lazy_wglReleasePbufferDCEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglDestroyPbufferEXT\r
+#define GLEE_C_DEFINED_wglDestroyPbufferEXT\r
+  BOOL __stdcall GLee_Lazy_wglDestroyPbufferEXT(HPBUFFEREXT hPbuffer)  {if (GLeeInit()) return wglDestroyPbufferEXT(hPbuffer); return (BOOL)0;}\r
+  GLEEPFNWGLDESTROYPBUFFEREXTPROC GLeeFuncPtr_wglDestroyPbufferEXT=GLee_Lazy_wglDestroyPbufferEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglQueryPbufferEXT\r
+#define GLEE_C_DEFINED_wglQueryPbufferEXT\r
+  BOOL __stdcall GLee_Lazy_wglQueryPbufferEXT(HPBUFFEREXT hPbuffer, int iAttribute, int * piValue)  {if (GLeeInit()) return wglQueryPbufferEXT(hPbuffer, iAttribute, piValue); return (BOOL)0;}\r
+  GLEEPFNWGLQUERYPBUFFEREXTPROC GLeeFuncPtr_wglQueryPbufferEXT=GLee_Lazy_wglQueryPbufferEXT;\r
+#endif\r
+#endif \r
+\r
+/* WGL_EXT_depth_float */\r
+\r
+#ifdef __GLEE_WGL_EXT_depth_float\r
+#endif \r
+\r
+/* WGL_3DFX_multisample */\r
+\r
+#ifdef __GLEE_WGL_3DFX_multisample\r
+#endif \r
+\r
+/* WGL_EXT_multisample */\r
+\r
+#ifdef __GLEE_WGL_EXT_multisample\r
+#endif \r
+\r
+/* WGL_I3D_digital_video_control */\r
+\r
+#ifdef __GLEE_WGL_I3D_digital_video_control\r
+#ifndef GLEE_C_DEFINED_wglGetDigitalVideoParametersI3D\r
+#define GLEE_C_DEFINED_wglGetDigitalVideoParametersI3D\r
+  BOOL __stdcall GLee_Lazy_wglGetDigitalVideoParametersI3D(HDC hDC, int iAttribute, int * piValue)  {if (GLeeInit()) return wglGetDigitalVideoParametersI3D(hDC, iAttribute, piValue); return (BOOL)0;}\r
+  GLEEPFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC GLeeFuncPtr_wglGetDigitalVideoParametersI3D=GLee_Lazy_wglGetDigitalVideoParametersI3D;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglSetDigitalVideoParametersI3D\r
+#define GLEE_C_DEFINED_wglSetDigitalVideoParametersI3D\r
+  BOOL __stdcall GLee_Lazy_wglSetDigitalVideoParametersI3D(HDC hDC, int iAttribute, const int * piValue)  {if (GLeeInit()) return wglSetDigitalVideoParametersI3D(hDC, iAttribute, piValue); return (BOOL)0;}\r
+  GLEEPFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC GLeeFuncPtr_wglSetDigitalVideoParametersI3D=GLee_Lazy_wglSetDigitalVideoParametersI3D;\r
+#endif\r
+#endif \r
+\r
+/* WGL_I3D_gamma */\r
+\r
+#ifdef __GLEE_WGL_I3D_gamma\r
+#ifndef GLEE_C_DEFINED_wglGetGammaTableParametersI3D\r
+#define GLEE_C_DEFINED_wglGetGammaTableParametersI3D\r
+  BOOL __stdcall GLee_Lazy_wglGetGammaTableParametersI3D(HDC hDC, int iAttribute, int * piValue)  {if (GLeeInit()) return wglGetGammaTableParametersI3D(hDC, iAttribute, piValue); return (BOOL)0;}\r
+  GLEEPFNWGLGETGAMMATABLEPARAMETERSI3DPROC GLeeFuncPtr_wglGetGammaTableParametersI3D=GLee_Lazy_wglGetGammaTableParametersI3D;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglSetGammaTableParametersI3D\r
+#define GLEE_C_DEFINED_wglSetGammaTableParametersI3D\r
+  BOOL __stdcall GLee_Lazy_wglSetGammaTableParametersI3D(HDC hDC, int iAttribute, const int * piValue)  {if (GLeeInit()) return wglSetGammaTableParametersI3D(hDC, iAttribute, piValue); return (BOOL)0;}\r
+  GLEEPFNWGLSETGAMMATABLEPARAMETERSI3DPROC GLeeFuncPtr_wglSetGammaTableParametersI3D=GLee_Lazy_wglSetGammaTableParametersI3D;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglGetGammaTableI3D\r
+#define GLEE_C_DEFINED_wglGetGammaTableI3D\r
+  BOOL __stdcall GLee_Lazy_wglGetGammaTableI3D(HDC hDC, int iEntries, USHORT * puRed, USHORT * puGreen, USHORT * puBlue)  {if (GLeeInit()) return wglGetGammaTableI3D(hDC, iEntries, puRed, puGreen, puBlue); return (BOOL)0;}\r
+  GLEEPFNWGLGETGAMMATABLEI3DPROC GLeeFuncPtr_wglGetGammaTableI3D=GLee_Lazy_wglGetGammaTableI3D;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglSetGammaTableI3D\r
+#define GLEE_C_DEFINED_wglSetGammaTableI3D\r
+  BOOL __stdcall GLee_Lazy_wglSetGammaTableI3D(HDC hDC, int iEntries, const USHORT * puRed, const USHORT * puGreen, const USHORT * puBlue)  {if (GLeeInit()) return wglSetGammaTableI3D(hDC, iEntries, puRed, puGreen, puBlue); return (BOOL)0;}\r
+  GLEEPFNWGLSETGAMMATABLEI3DPROC GLeeFuncPtr_wglSetGammaTableI3D=GLee_Lazy_wglSetGammaTableI3D;\r
+#endif\r
+#endif \r
+\r
+/* WGL_I3D_genlock */\r
+\r
+#ifdef __GLEE_WGL_I3D_genlock\r
+#ifndef GLEE_C_DEFINED_wglEnableGenlockI3D\r
+#define GLEE_C_DEFINED_wglEnableGenlockI3D\r
+  BOOL __stdcall GLee_Lazy_wglEnableGenlockI3D(HDC hDC)  {if (GLeeInit()) return wglEnableGenlockI3D(hDC); return (BOOL)0;}\r
+  GLEEPFNWGLENABLEGENLOCKI3DPROC GLeeFuncPtr_wglEnableGenlockI3D=GLee_Lazy_wglEnableGenlockI3D;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglDisableGenlockI3D\r
+#define GLEE_C_DEFINED_wglDisableGenlockI3D\r
+  BOOL __stdcall GLee_Lazy_wglDisableGenlockI3D(HDC hDC)  {if (GLeeInit()) return wglDisableGenlockI3D(hDC); return (BOOL)0;}\r
+  GLEEPFNWGLDISABLEGENLOCKI3DPROC GLeeFuncPtr_wglDisableGenlockI3D=GLee_Lazy_wglDisableGenlockI3D;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglIsEnabledGenlockI3D\r
+#define GLEE_C_DEFINED_wglIsEnabledGenlockI3D\r
+  BOOL __stdcall GLee_Lazy_wglIsEnabledGenlockI3D(HDC hDC, BOOL * pFlag)  {if (GLeeInit()) return wglIsEnabledGenlockI3D(hDC, pFlag); return (BOOL)0;}\r
+  GLEEPFNWGLISENABLEDGENLOCKI3DPROC GLeeFuncPtr_wglIsEnabledGenlockI3D=GLee_Lazy_wglIsEnabledGenlockI3D;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglGenlockSourceI3D\r
+#define GLEE_C_DEFINED_wglGenlockSourceI3D\r
+  BOOL __stdcall GLee_Lazy_wglGenlockSourceI3D(HDC hDC, UINT uSource)  {if (GLeeInit()) return wglGenlockSourceI3D(hDC, uSource); return (BOOL)0;}\r
+  GLEEPFNWGLGENLOCKSOURCEI3DPROC GLeeFuncPtr_wglGenlockSourceI3D=GLee_Lazy_wglGenlockSourceI3D;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglGetGenlockSourceI3D\r
+#define GLEE_C_DEFINED_wglGetGenlockSourceI3D\r
+  BOOL __stdcall GLee_Lazy_wglGetGenlockSourceI3D(HDC hDC, UINT * uSource)  {if (GLeeInit()) return wglGetGenlockSourceI3D(hDC, uSource); return (BOOL)0;}\r
+  GLEEPFNWGLGETGENLOCKSOURCEI3DPROC GLeeFuncPtr_wglGetGenlockSourceI3D=GLee_Lazy_wglGetGenlockSourceI3D;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglGenlockSourceEdgeI3D\r
+#define GLEE_C_DEFINED_wglGenlockSourceEdgeI3D\r
+  BOOL __stdcall GLee_Lazy_wglGenlockSourceEdgeI3D(HDC hDC, UINT uEdge)  {if (GLeeInit()) return wglGenlockSourceEdgeI3D(hDC, uEdge); return (BOOL)0;}\r
+  GLEEPFNWGLGENLOCKSOURCEEDGEI3DPROC GLeeFuncPtr_wglGenlockSourceEdgeI3D=GLee_Lazy_wglGenlockSourceEdgeI3D;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglGetGenlockSourceEdgeI3D\r
+#define GLEE_C_DEFINED_wglGetGenlockSourceEdgeI3D\r
+  BOOL __stdcall GLee_Lazy_wglGetGenlockSourceEdgeI3D(HDC hDC, UINT * uEdge)  {if (GLeeInit()) return wglGetGenlockSourceEdgeI3D(hDC, uEdge); return (BOOL)0;}\r
+  GLEEPFNWGLGETGENLOCKSOURCEEDGEI3DPROC GLeeFuncPtr_wglGetGenlockSourceEdgeI3D=GLee_Lazy_wglGetGenlockSourceEdgeI3D;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglGenlockSampleRateI3D\r
+#define GLEE_C_DEFINED_wglGenlockSampleRateI3D\r
+  BOOL __stdcall GLee_Lazy_wglGenlockSampleRateI3D(HDC hDC, UINT uRate)  {if (GLeeInit()) return wglGenlockSampleRateI3D(hDC, uRate); return (BOOL)0;}\r
+  GLEEPFNWGLGENLOCKSAMPLERATEI3DPROC GLeeFuncPtr_wglGenlockSampleRateI3D=GLee_Lazy_wglGenlockSampleRateI3D;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglGetGenlockSampleRateI3D\r
+#define GLEE_C_DEFINED_wglGetGenlockSampleRateI3D\r
+  BOOL __stdcall GLee_Lazy_wglGetGenlockSampleRateI3D(HDC hDC, UINT * uRate)  {if (GLeeInit()) return wglGetGenlockSampleRateI3D(hDC, uRate); return (BOOL)0;}\r
+  GLEEPFNWGLGETGENLOCKSAMPLERATEI3DPROC GLeeFuncPtr_wglGetGenlockSampleRateI3D=GLee_Lazy_wglGetGenlockSampleRateI3D;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglGenlockSourceDelayI3D\r
+#define GLEE_C_DEFINED_wglGenlockSourceDelayI3D\r
+  BOOL __stdcall GLee_Lazy_wglGenlockSourceDelayI3D(HDC hDC, UINT uDelay)  {if (GLeeInit()) return wglGenlockSourceDelayI3D(hDC, uDelay); return (BOOL)0;}\r
+  GLEEPFNWGLGENLOCKSOURCEDELAYI3DPROC GLeeFuncPtr_wglGenlockSourceDelayI3D=GLee_Lazy_wglGenlockSourceDelayI3D;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglGetGenlockSourceDelayI3D\r
+#define GLEE_C_DEFINED_wglGetGenlockSourceDelayI3D\r
+  BOOL __stdcall GLee_Lazy_wglGetGenlockSourceDelayI3D(HDC hDC, UINT * uDelay)  {if (GLeeInit()) return wglGetGenlockSourceDelayI3D(hDC, uDelay); return (BOOL)0;}\r
+  GLEEPFNWGLGETGENLOCKSOURCEDELAYI3DPROC GLeeFuncPtr_wglGetGenlockSourceDelayI3D=GLee_Lazy_wglGetGenlockSourceDelayI3D;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglQueryGenlockMaxSourceDelayI3D\r
+#define GLEE_C_DEFINED_wglQueryGenlockMaxSourceDelayI3D\r
+  BOOL __stdcall GLee_Lazy_wglQueryGenlockMaxSourceDelayI3D(HDC hDC, UINT * uMaxLineDelay, UINT * uMaxPixelDelay)  {if (GLeeInit()) return wglQueryGenlockMaxSourceDelayI3D(hDC, uMaxLineDelay, uMaxPixelDelay); return (BOOL)0;}\r
+  GLEEPFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC GLeeFuncPtr_wglQueryGenlockMaxSourceDelayI3D=GLee_Lazy_wglQueryGenlockMaxSourceDelayI3D;\r
+#endif\r
+#endif \r
+\r
+/* WGL_I3D_image_buffer */\r
+\r
+#ifdef __GLEE_WGL_I3D_image_buffer\r
+#ifndef GLEE_C_DEFINED_wglCreateImageBufferI3D\r
+#define GLEE_C_DEFINED_wglCreateImageBufferI3D\r
+  LPVOID __stdcall GLee_Lazy_wglCreateImageBufferI3D(HDC hDC, DWORD dwSize, UINT uFlags)  {if (GLeeInit()) return wglCreateImageBufferI3D(hDC, dwSize, uFlags); return (LPVOID)0;}\r
+  GLEEPFNWGLCREATEIMAGEBUFFERI3DPROC GLeeFuncPtr_wglCreateImageBufferI3D=GLee_Lazy_wglCreateImageBufferI3D;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglDestroyImageBufferI3D\r
+#define GLEE_C_DEFINED_wglDestroyImageBufferI3D\r
+  BOOL __stdcall GLee_Lazy_wglDestroyImageBufferI3D(HDC hDC, LPVOID pAddress)  {if (GLeeInit()) return wglDestroyImageBufferI3D(hDC, pAddress); return (BOOL)0;}\r
+  GLEEPFNWGLDESTROYIMAGEBUFFERI3DPROC GLeeFuncPtr_wglDestroyImageBufferI3D=GLee_Lazy_wglDestroyImageBufferI3D;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglAssociateImageBufferEventsI3D\r
+#define GLEE_C_DEFINED_wglAssociateImageBufferEventsI3D\r
+  BOOL __stdcall GLee_Lazy_wglAssociateImageBufferEventsI3D(HDC hDC, const HANDLE * pEvent, const LPVOID * pAddress, const DWORD * pSize, UINT count)  {if (GLeeInit()) return wglAssociateImageBufferEventsI3D(hDC, pEvent, pAddress, pSize, count); return (BOOL)0;}\r
+  GLEEPFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC GLeeFuncPtr_wglAssociateImageBufferEventsI3D=GLee_Lazy_wglAssociateImageBufferEventsI3D;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglReleaseImageBufferEventsI3D\r
+#define GLEE_C_DEFINED_wglReleaseImageBufferEventsI3D\r
+  BOOL __stdcall GLee_Lazy_wglReleaseImageBufferEventsI3D(HDC hDC, const LPVOID * pAddress, UINT count)  {if (GLeeInit()) return wglReleaseImageBufferEventsI3D(hDC, pAddress, count); return (BOOL)0;}\r
+  GLEEPFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC GLeeFuncPtr_wglReleaseImageBufferEventsI3D=GLee_Lazy_wglReleaseImageBufferEventsI3D;\r
+#endif\r
+#endif \r
+\r
+/* WGL_I3D_swap_frame_lock */\r
+\r
+#ifdef __GLEE_WGL_I3D_swap_frame_lock\r
+#ifndef GLEE_C_DEFINED_wglEnableFrameLockI3D\r
+#define GLEE_C_DEFINED_wglEnableFrameLockI3D\r
+  BOOL __stdcall GLee_Lazy_wglEnableFrameLockI3D(void)  {if (GLeeInit()) return wglEnableFrameLockI3D(); return (BOOL)0;}\r
+  GLEEPFNWGLENABLEFRAMELOCKI3DPROC GLeeFuncPtr_wglEnableFrameLockI3D=GLee_Lazy_wglEnableFrameLockI3D;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglDisableFrameLockI3D\r
+#define GLEE_C_DEFINED_wglDisableFrameLockI3D\r
+  BOOL __stdcall GLee_Lazy_wglDisableFrameLockI3D(void)  {if (GLeeInit()) return wglDisableFrameLockI3D(); return (BOOL)0;}\r
+  GLEEPFNWGLDISABLEFRAMELOCKI3DPROC GLeeFuncPtr_wglDisableFrameLockI3D=GLee_Lazy_wglDisableFrameLockI3D;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglIsEnabledFrameLockI3D\r
+#define GLEE_C_DEFINED_wglIsEnabledFrameLockI3D\r
+  BOOL __stdcall GLee_Lazy_wglIsEnabledFrameLockI3D(BOOL * pFlag)  {if (GLeeInit()) return wglIsEnabledFrameLockI3D(pFlag); return (BOOL)0;}\r
+  GLEEPFNWGLISENABLEDFRAMELOCKI3DPROC GLeeFuncPtr_wglIsEnabledFrameLockI3D=GLee_Lazy_wglIsEnabledFrameLockI3D;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglQueryFrameLockMasterI3D\r
+#define GLEE_C_DEFINED_wglQueryFrameLockMasterI3D\r
+  BOOL __stdcall GLee_Lazy_wglQueryFrameLockMasterI3D(BOOL * pFlag)  {if (GLeeInit()) return wglQueryFrameLockMasterI3D(pFlag); return (BOOL)0;}\r
+  GLEEPFNWGLQUERYFRAMELOCKMASTERI3DPROC GLeeFuncPtr_wglQueryFrameLockMasterI3D=GLee_Lazy_wglQueryFrameLockMasterI3D;\r
+#endif\r
+#endif \r
+\r
+/* WGL_NV_render_depth_texture */\r
+\r
+#ifdef __GLEE_WGL_NV_render_depth_texture\r
+#endif \r
+\r
+/* WGL_NV_render_texture_rectangle */\r
+\r
+#ifdef __GLEE_WGL_NV_render_texture_rectangle\r
+#endif \r
+\r
+/* WGL_ATI_pixel_format_float */\r
+\r
+#ifdef __GLEE_WGL_ATI_pixel_format_float\r
+#endif \r
+\r
+/* WGL_NV_float_buffer */\r
+\r
+#ifdef __GLEE_WGL_NV_float_buffer\r
+#endif \r
+\r
+/* WGL_3DL_stereo_control */\r
+\r
+#ifdef __GLEE_WGL_3DL_stereo_control\r
+#endif \r
+\r
+/* WGL_EXT_pixel_format_packed_float */\r
+\r
+#ifdef __GLEE_WGL_EXT_pixel_format_packed_float\r
+#endif \r
+\r
+/* WGL_EXT_framebuffer_sRGB */\r
+\r
+#ifdef __GLEE_WGL_EXT_framebuffer_sRGB\r
+#endif \r
+\r
+/* WGL_NV_present_video */\r
+\r
+#ifdef __GLEE_WGL_NV_present_video\r
+#ifndef GLEE_C_DEFINED_wglEnumerateVideoDevicesNV\r
+#define GLEE_C_DEFINED_wglEnumerateVideoDevicesNV\r
+  int __stdcall GLee_Lazy_wglEnumerateVideoDevicesNV(HDC hDC, HVIDEOOUTPUTDEVICENV * phDeviceList)  {if (GLeeInit()) return wglEnumerateVideoDevicesNV(hDC, phDeviceList); return (int)0;}\r
+  GLEEPFNWGLENUMERATEVIDEODEVICESNVPROC GLeeFuncPtr_wglEnumerateVideoDevicesNV=GLee_Lazy_wglEnumerateVideoDevicesNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglBindVideoDeviceNV\r
+#define GLEE_C_DEFINED_wglBindVideoDeviceNV\r
+  BOOL __stdcall GLee_Lazy_wglBindVideoDeviceNV(HDC hDC, unsigned int uVideoSlot, HVIDEOOUTPUTDEVICENV hVideoDevice, const int * piAttribList)  {if (GLeeInit()) return wglBindVideoDeviceNV(hDC, uVideoSlot, hVideoDevice, piAttribList); return (BOOL)0;}\r
+  GLEEPFNWGLBINDVIDEODEVICENVPROC GLeeFuncPtr_wglBindVideoDeviceNV=GLee_Lazy_wglBindVideoDeviceNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglQueryCurrentContextNV\r
+#define GLEE_C_DEFINED_wglQueryCurrentContextNV\r
+  BOOL __stdcall GLee_Lazy_wglQueryCurrentContextNV(int iAttribute, int * piValue)  {if (GLeeInit()) return wglQueryCurrentContextNV(iAttribute, piValue); return (BOOL)0;}\r
+  GLEEPFNWGLQUERYCURRENTCONTEXTNVPROC GLeeFuncPtr_wglQueryCurrentContextNV=GLee_Lazy_wglQueryCurrentContextNV;\r
+#endif\r
+#endif \r
+\r
+/* WGL_NV_swap_group */\r
+\r
+#ifdef __GLEE_WGL_NV_swap_group\r
+#ifndef GLEE_C_DEFINED_wglJoinSwapGroupNV\r
+#define GLEE_C_DEFINED_wglJoinSwapGroupNV\r
+  BOOL __stdcall GLee_Lazy_wglJoinSwapGroupNV(HDC hDC, GLuint group)  {if (GLeeInit()) return wglJoinSwapGroupNV(hDC, group); return (BOOL)0;}\r
+  GLEEPFNWGLJOINSWAPGROUPNVPROC GLeeFuncPtr_wglJoinSwapGroupNV=GLee_Lazy_wglJoinSwapGroupNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglBindSwapBarrierNV\r
+#define GLEE_C_DEFINED_wglBindSwapBarrierNV\r
+  BOOL __stdcall GLee_Lazy_wglBindSwapBarrierNV(GLuint group, GLuint barrier)  {if (GLeeInit()) return wglBindSwapBarrierNV(group, barrier); return (BOOL)0;}\r
+  GLEEPFNWGLBINDSWAPBARRIERNVPROC GLeeFuncPtr_wglBindSwapBarrierNV=GLee_Lazy_wglBindSwapBarrierNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglQuerySwapGroupNV\r
+#define GLEE_C_DEFINED_wglQuerySwapGroupNV\r
+  BOOL __stdcall GLee_Lazy_wglQuerySwapGroupNV(HDC hDC, GLuint * group, GLuint * barrier)  {if (GLeeInit()) return wglQuerySwapGroupNV(hDC, group, barrier); return (BOOL)0;}\r
+  GLEEPFNWGLQUERYSWAPGROUPNVPROC GLeeFuncPtr_wglQuerySwapGroupNV=GLee_Lazy_wglQuerySwapGroupNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglQueryMaxSwapGroupsNV\r
+#define GLEE_C_DEFINED_wglQueryMaxSwapGroupsNV\r
+  BOOL __stdcall GLee_Lazy_wglQueryMaxSwapGroupsNV(HDC hDC, GLuint * maxGroups, GLuint * maxBarriers)  {if (GLeeInit()) return wglQueryMaxSwapGroupsNV(hDC, maxGroups, maxBarriers); return (BOOL)0;}\r
+  GLEEPFNWGLQUERYMAXSWAPGROUPSNVPROC GLeeFuncPtr_wglQueryMaxSwapGroupsNV=GLee_Lazy_wglQueryMaxSwapGroupsNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglQueryFrameCountNV\r
+#define GLEE_C_DEFINED_wglQueryFrameCountNV\r
+  BOOL __stdcall GLee_Lazy_wglQueryFrameCountNV(HDC hDC, GLuint * count)  {if (GLeeInit()) return wglQueryFrameCountNV(hDC, count); return (BOOL)0;}\r
+  GLEEPFNWGLQUERYFRAMECOUNTNVPROC GLeeFuncPtr_wglQueryFrameCountNV=GLee_Lazy_wglQueryFrameCountNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglResetFrameCountNV\r
+#define GLEE_C_DEFINED_wglResetFrameCountNV\r
+  BOOL __stdcall GLee_Lazy_wglResetFrameCountNV(HDC hDC)  {if (GLeeInit()) return wglResetFrameCountNV(hDC); return (BOOL)0;}\r
+  GLEEPFNWGLRESETFRAMECOUNTNVPROC GLeeFuncPtr_wglResetFrameCountNV=GLee_Lazy_wglResetFrameCountNV;\r
+#endif\r
+#endif \r
+\r
+/* WGL_NV_gpu_affinity */\r
+\r
+#ifdef __GLEE_WGL_NV_gpu_affinity\r
+#ifndef GLEE_C_DEFINED_wglEnumGpusNV\r
+#define GLEE_C_DEFINED_wglEnumGpusNV\r
+  BOOL __stdcall GLee_Lazy_wglEnumGpusNV(UINT iGpuIndex, HGPUNV * phGpu)  {if (GLeeInit()) return wglEnumGpusNV(iGpuIndex, phGpu); return (BOOL)0;}\r
+  GLEEPFNWGLENUMGPUSNVPROC GLeeFuncPtr_wglEnumGpusNV=GLee_Lazy_wglEnumGpusNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglEnumGpuDevicesNV\r
+#define GLEE_C_DEFINED_wglEnumGpuDevicesNV\r
+  BOOL __stdcall GLee_Lazy_wglEnumGpuDevicesNV(HGPUNV hGpu, UINT iDeviceIndex, PGPU_DEVICE lpGpuDevice)  {if (GLeeInit()) return wglEnumGpuDevicesNV(hGpu, iDeviceIndex, lpGpuDevice); return (BOOL)0;}\r
+  GLEEPFNWGLENUMGPUDEVICESNVPROC GLeeFuncPtr_wglEnumGpuDevicesNV=GLee_Lazy_wglEnumGpuDevicesNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglCreateAffinityDCNV\r
+#define GLEE_C_DEFINED_wglCreateAffinityDCNV\r
+  HDC __stdcall GLee_Lazy_wglCreateAffinityDCNV(const HGPUNV * phGpuList)  {if (GLeeInit()) return wglCreateAffinityDCNV(phGpuList); return (HDC)0;}\r
+  GLEEPFNWGLCREATEAFFINITYDCNVPROC GLeeFuncPtr_wglCreateAffinityDCNV=GLee_Lazy_wglCreateAffinityDCNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglEnumGpusFromAffinityDCNV\r
+#define GLEE_C_DEFINED_wglEnumGpusFromAffinityDCNV\r
+  BOOL __stdcall GLee_Lazy_wglEnumGpusFromAffinityDCNV(HDC hAffinityDC, UINT iGpuIndex, HGPUNV * hGpu)  {if (GLeeInit()) return wglEnumGpusFromAffinityDCNV(hAffinityDC, iGpuIndex, hGpu); return (BOOL)0;}\r
+  GLEEPFNWGLENUMGPUSFROMAFFINITYDCNVPROC GLeeFuncPtr_wglEnumGpusFromAffinityDCNV=GLee_Lazy_wglEnumGpusFromAffinityDCNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglDeleteDCNV\r
+#define GLEE_C_DEFINED_wglDeleteDCNV\r
+  BOOL __stdcall GLee_Lazy_wglDeleteDCNV(HDC hdc)  {if (GLeeInit()) return wglDeleteDCNV(hdc); return (BOOL)0;}\r
+  GLEEPFNWGLDELETEDCNVPROC GLeeFuncPtr_wglDeleteDCNV=GLee_Lazy_wglDeleteDCNV;\r
+#endif\r
+#endif \r
+\r
+/* WGL_EXT_display_color_table */\r
+\r
+#ifdef __GLEE_WGL_EXT_display_color_table\r
+#ifndef GLEE_C_DEFINED_wglCreateDisplayColorTableEXT\r
+#define GLEE_C_DEFINED_wglCreateDisplayColorTableEXT\r
+  GLboolean __stdcall GLee_Lazy_wglCreateDisplayColorTableEXT(GLushort id)  {if (GLeeInit()) return wglCreateDisplayColorTableEXT(id); return (GLboolean)0;}\r
+  GLEEPFNWGLCREATEDISPLAYCOLORTABLEEXTPROC GLeeFuncPtr_wglCreateDisplayColorTableEXT=GLee_Lazy_wglCreateDisplayColorTableEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglLoadDisplayColorTableEXT\r
+#define GLEE_C_DEFINED_wglLoadDisplayColorTableEXT\r
+  GLboolean __stdcall GLee_Lazy_wglLoadDisplayColorTableEXT(const GLushort * table, GLuint length)  {if (GLeeInit()) return wglLoadDisplayColorTableEXT(table, length); return (GLboolean)0;}\r
+  GLEEPFNWGLLOADDISPLAYCOLORTABLEEXTPROC GLeeFuncPtr_wglLoadDisplayColorTableEXT=GLee_Lazy_wglLoadDisplayColorTableEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglBindDisplayColorTableEXT\r
+#define GLEE_C_DEFINED_wglBindDisplayColorTableEXT\r
+  GLboolean __stdcall GLee_Lazy_wglBindDisplayColorTableEXT(GLushort id)  {if (GLeeInit()) return wglBindDisplayColorTableEXT(id); return (GLboolean)0;}\r
+  GLEEPFNWGLBINDDISPLAYCOLORTABLEEXTPROC GLeeFuncPtr_wglBindDisplayColorTableEXT=GLee_Lazy_wglBindDisplayColorTableEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglDestroyDisplayColorTableEXT\r
+#define GLEE_C_DEFINED_wglDestroyDisplayColorTableEXT\r
+  VOID __stdcall GLee_Lazy_wglDestroyDisplayColorTableEXT(GLushort id)  {if (GLeeInit()) wglDestroyDisplayColorTableEXT(id);}\r
+  GLEEPFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC GLeeFuncPtr_wglDestroyDisplayColorTableEXT=GLee_Lazy_wglDestroyDisplayColorTableEXT;\r
+#endif\r
+#endif \r
+\r
+/* WGL_EXT_extensions_string */\r
+\r
+#ifdef __GLEE_WGL_EXT_extensions_string\r
+#ifndef GLEE_C_DEFINED_wglGetExtensionsStringEXT\r
+#define GLEE_C_DEFINED_wglGetExtensionsStringEXT\r
+  const char * __stdcall GLee_Lazy_wglGetExtensionsStringEXT(void)  {if (GLeeInit()) return wglGetExtensionsStringEXT(); return (const char *)0;}\r
+  GLEEPFNWGLGETEXTENSIONSSTRINGEXTPROC GLeeFuncPtr_wglGetExtensionsStringEXT=GLee_Lazy_wglGetExtensionsStringEXT;\r
+#endif\r
+#endif \r
+\r
+/* WGL_EXT_swap_control */\r
+\r
+#ifdef __GLEE_WGL_EXT_swap_control\r
+#ifndef GLEE_C_DEFINED_wglSwapIntervalEXT\r
+#define GLEE_C_DEFINED_wglSwapIntervalEXT\r
+  BOOL __stdcall GLee_Lazy_wglSwapIntervalEXT(int interval)  {if (GLeeInit()) return wglSwapIntervalEXT(interval); return (BOOL)0;}\r
+  GLEEPFNWGLSWAPINTERVALEXTPROC GLeeFuncPtr_wglSwapIntervalEXT=GLee_Lazy_wglSwapIntervalEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglGetSwapIntervalEXT\r
+#define GLEE_C_DEFINED_wglGetSwapIntervalEXT\r
+  int __stdcall GLee_Lazy_wglGetSwapIntervalEXT(void)  {if (GLeeInit()) return wglGetSwapIntervalEXT(); return (int)0;}\r
+  GLEEPFNWGLGETSWAPINTERVALEXTPROC GLeeFuncPtr_wglGetSwapIntervalEXT=GLee_Lazy_wglGetSwapIntervalEXT;\r
+#endif\r
+#endif \r
+\r
+/* WGL_NV_vertex_array_range */\r
+\r
+#ifdef __GLEE_WGL_NV_vertex_array_range\r
+#ifndef GLEE_C_DEFINED_wglAllocateMemoryNV\r
+#define GLEE_C_DEFINED_wglAllocateMemoryNV\r
+  void* __stdcall GLee_Lazy_wglAllocateMemoryNV(GLsizei size, GLfloat readfreq, GLfloat writefreq, GLfloat priority)  {if (GLeeInit()) return wglAllocateMemoryNV(size, readfreq, writefreq, priority); return (void*)0;}\r
+  GLEEPFNWGLALLOCATEMEMORYNVPROC GLeeFuncPtr_wglAllocateMemoryNV=GLee_Lazy_wglAllocateMemoryNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglFreeMemoryNV\r
+#define GLEE_C_DEFINED_wglFreeMemoryNV\r
+  void __stdcall GLee_Lazy_wglFreeMemoryNV(void * pointer)  {if (GLeeInit()) wglFreeMemoryNV(pointer);}\r
+  GLEEPFNWGLFREEMEMORYNVPROC GLeeFuncPtr_wglFreeMemoryNV=GLee_Lazy_wglFreeMemoryNV;\r
+#endif\r
+#endif \r
+\r
+/* WGL_OML_sync_control */\r
+\r
+#ifdef __GLEE_WGL_OML_sync_control\r
+#ifndef GLEE_C_DEFINED_wglGetSyncValuesOML\r
+#define GLEE_C_DEFINED_wglGetSyncValuesOML\r
+  BOOL __stdcall GLee_Lazy_wglGetSyncValuesOML(HDC hdc, INT64 * ust, INT64 * msc, INT64 * sbc)  {if (GLeeInit()) return wglGetSyncValuesOML(hdc, ust, msc, sbc); return (BOOL)0;}\r
+  GLEEPFNWGLGETSYNCVALUESOMLPROC GLeeFuncPtr_wglGetSyncValuesOML=GLee_Lazy_wglGetSyncValuesOML;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglGetMscRateOML\r
+#define GLEE_C_DEFINED_wglGetMscRateOML\r
+  BOOL __stdcall GLee_Lazy_wglGetMscRateOML(HDC hdc, INT32 * numerator, INT32 * denominator)  {if (GLeeInit()) return wglGetMscRateOML(hdc, numerator, denominator); return (BOOL)0;}\r
+  GLEEPFNWGLGETMSCRATEOMLPROC GLeeFuncPtr_wglGetMscRateOML=GLee_Lazy_wglGetMscRateOML;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglSwapBuffersMscOML\r
+#define GLEE_C_DEFINED_wglSwapBuffersMscOML\r
+  INT64 __stdcall GLee_Lazy_wglSwapBuffersMscOML(HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder)  {if (GLeeInit()) return wglSwapBuffersMscOML(hdc, target_msc, divisor, remainder); return (INT64)0;}\r
+  GLEEPFNWGLSWAPBUFFERSMSCOMLPROC GLeeFuncPtr_wglSwapBuffersMscOML=GLee_Lazy_wglSwapBuffersMscOML;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglSwapLayerBuffersMscOML\r
+#define GLEE_C_DEFINED_wglSwapLayerBuffersMscOML\r
+  INT64 __stdcall GLee_Lazy_wglSwapLayerBuffersMscOML(HDC hdc, int fuPlanes, INT64 target_msc, INT64 divisor, INT64 remainder)  {if (GLeeInit()) return wglSwapLayerBuffersMscOML(hdc, fuPlanes, target_msc, divisor, remainder); return (INT64)0;}\r
+  GLEEPFNWGLSWAPLAYERBUFFERSMSCOMLPROC GLeeFuncPtr_wglSwapLayerBuffersMscOML=GLee_Lazy_wglSwapLayerBuffersMscOML;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglWaitForMscOML\r
+#define GLEE_C_DEFINED_wglWaitForMscOML\r
+  BOOL __stdcall GLee_Lazy_wglWaitForMscOML(HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder, INT64 * ust, INT64 * msc, INT64 * sbc)  {if (GLeeInit()) return wglWaitForMscOML(hdc, target_msc, divisor, remainder, ust, msc, sbc); return (BOOL)0;}\r
+  GLEEPFNWGLWAITFORMSCOMLPROC GLeeFuncPtr_wglWaitForMscOML=GLee_Lazy_wglWaitForMscOML;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglWaitForSbcOML\r
+#define GLEE_C_DEFINED_wglWaitForSbcOML\r
+  BOOL __stdcall GLee_Lazy_wglWaitForSbcOML(HDC hdc, INT64 target_sbc, INT64 * ust, INT64 * msc, INT64 * sbc)  {if (GLeeInit()) return wglWaitForSbcOML(hdc, target_sbc, ust, msc, sbc); return (BOOL)0;}\r
+  GLEEPFNWGLWAITFORSBCOMLPROC GLeeFuncPtr_wglWaitForSbcOML=GLee_Lazy_wglWaitForSbcOML;\r
+#endif\r
+#endif \r
+\r
+/* WGL_I3D_swap_frame_usage */\r
+\r
+#ifdef __GLEE_WGL_I3D_swap_frame_usage\r
+#ifndef GLEE_C_DEFINED_wglGetFrameUsageI3D\r
+#define GLEE_C_DEFINED_wglGetFrameUsageI3D\r
+  BOOL __stdcall GLee_Lazy_wglGetFrameUsageI3D(float * pUsage)  {if (GLeeInit()) return wglGetFrameUsageI3D(pUsage); return (BOOL)0;}\r
+  GLEEPFNWGLGETFRAMEUSAGEI3DPROC GLeeFuncPtr_wglGetFrameUsageI3D=GLee_Lazy_wglGetFrameUsageI3D;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglBeginFrameTrackingI3D\r
+#define GLEE_C_DEFINED_wglBeginFrameTrackingI3D\r
+  BOOL __stdcall GLee_Lazy_wglBeginFrameTrackingI3D(void)  {if (GLeeInit()) return wglBeginFrameTrackingI3D(); return (BOOL)0;}\r
+  GLEEPFNWGLBEGINFRAMETRACKINGI3DPROC GLeeFuncPtr_wglBeginFrameTrackingI3D=GLee_Lazy_wglBeginFrameTrackingI3D;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglEndFrameTrackingI3D\r
+#define GLEE_C_DEFINED_wglEndFrameTrackingI3D\r
+  BOOL __stdcall GLee_Lazy_wglEndFrameTrackingI3D(void)  {if (GLeeInit()) return wglEndFrameTrackingI3D(); return (BOOL)0;}\r
+  GLEEPFNWGLENDFRAMETRACKINGI3DPROC GLeeFuncPtr_wglEndFrameTrackingI3D=GLee_Lazy_wglEndFrameTrackingI3D;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglQueryFrameTrackingI3D\r
+#define GLEE_C_DEFINED_wglQueryFrameTrackingI3D\r
+  BOOL __stdcall GLee_Lazy_wglQueryFrameTrackingI3D(DWORD * pFrameCount, DWORD * pMissedFrames, float * pLastMissedUsage)  {if (GLeeInit()) return wglQueryFrameTrackingI3D(pFrameCount, pMissedFrames, pLastMissedUsage); return (BOOL)0;}\r
+  GLEEPFNWGLQUERYFRAMETRACKINGI3DPROC GLeeFuncPtr_wglQueryFrameTrackingI3D=GLee_Lazy_wglQueryFrameTrackingI3D;\r
+#endif\r
+#endif \r
+\r
+/* WGL_NV_video_output */\r
+\r
+#ifdef __GLEE_WGL_NV_video_output\r
+#ifndef GLEE_C_DEFINED_wglGetVideoDeviceNV\r
+#define GLEE_C_DEFINED_wglGetVideoDeviceNV\r
+  BOOL __stdcall GLee_Lazy_wglGetVideoDeviceNV(HDC hDC, int numDevices, HPVIDEODEV * hVideoDevice)  {if (GLeeInit()) return wglGetVideoDeviceNV(hDC, numDevices, hVideoDevice); return (BOOL)0;}\r
+  GLEEPFNWGLGETVIDEODEVICENVPROC GLeeFuncPtr_wglGetVideoDeviceNV=GLee_Lazy_wglGetVideoDeviceNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglReleaseVideoDeviceNV\r
+#define GLEE_C_DEFINED_wglReleaseVideoDeviceNV\r
+  BOOL __stdcall GLee_Lazy_wglReleaseVideoDeviceNV(HPVIDEODEV hVideoDevice)  {if (GLeeInit()) return wglReleaseVideoDeviceNV(hVideoDevice); return (BOOL)0;}\r
+  GLEEPFNWGLRELEASEVIDEODEVICENVPROC GLeeFuncPtr_wglReleaseVideoDeviceNV=GLee_Lazy_wglReleaseVideoDeviceNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglBindVideoImageNV\r
+#define GLEE_C_DEFINED_wglBindVideoImageNV\r
+  BOOL __stdcall GLee_Lazy_wglBindVideoImageNV(HPVIDEODEV hVideoDevice, HPBUFFERARB hPbuffer, int iVideoBuffer)  {if (GLeeInit()) return wglBindVideoImageNV(hVideoDevice, hPbuffer, iVideoBuffer); return (BOOL)0;}\r
+  GLEEPFNWGLBINDVIDEOIMAGENVPROC GLeeFuncPtr_wglBindVideoImageNV=GLee_Lazy_wglBindVideoImageNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglReleaseVideoImageNV\r
+#define GLEE_C_DEFINED_wglReleaseVideoImageNV\r
+  BOOL __stdcall GLee_Lazy_wglReleaseVideoImageNV(HPBUFFERARB hPbuffer, int iVideoBuffer)  {if (GLeeInit()) return wglReleaseVideoImageNV(hPbuffer, iVideoBuffer); return (BOOL)0;}\r
+  GLEEPFNWGLRELEASEVIDEOIMAGENVPROC GLeeFuncPtr_wglReleaseVideoImageNV=GLee_Lazy_wglReleaseVideoImageNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglSendPbufferToVideoNV\r
+#define GLEE_C_DEFINED_wglSendPbufferToVideoNV\r
+  BOOL __stdcall GLee_Lazy_wglSendPbufferToVideoNV(HPBUFFERARB hPbuffer, int iBufferType, unsigned long * pulCounterPbuffer, BOOL bBlock)  {if (GLeeInit()) return wglSendPbufferToVideoNV(hPbuffer, iBufferType, pulCounterPbuffer, bBlock); return (BOOL)0;}\r
+  GLEEPFNWGLSENDPBUFFERTOVIDEONVPROC GLeeFuncPtr_wglSendPbufferToVideoNV=GLee_Lazy_wglSendPbufferToVideoNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_wglGetVideoInfoNV\r
+#define GLEE_C_DEFINED_wglGetVideoInfoNV\r
+  BOOL __stdcall GLee_Lazy_wglGetVideoInfoNV(HPVIDEODEV hpVideoDevice, unsigned long * pulCounterOutputPbuffer, unsigned long * pulCounterOutputVideo)  {if (GLeeInit()) return wglGetVideoInfoNV(hpVideoDevice, pulCounterOutputPbuffer, pulCounterOutputVideo); return (BOOL)0;}\r
+  GLEEPFNWGLGETVIDEOINFONVPROC GLeeFuncPtr_wglGetVideoInfoNV=GLee_Lazy_wglGetVideoInfoNV;\r
+#endif\r
+#endif \r
+#elif defined(__APPLE__) || defined(__APPLE_CC__)\r
+#else /* GLX */\r
+\r
+/* Extension querying variables */\r
+\r
+GLboolean _GLEE_GLX_VERSION_1_3 = GL_FALSE;\r
+GLboolean _GLEE_GLX_VERSION_1_4 = GL_FALSE;\r
+GLboolean _GLEE_GLX_ARB_multisample = GL_FALSE;\r
+GLboolean _GLEE_GLX_ARB_fbconfig_float = GL_FALSE;\r
+GLboolean _GLEE_GLX_ARB_create_context = GL_FALSE;\r
+GLboolean _GLEE_GLX_SGIS_multisample = GL_FALSE;\r
+GLboolean _GLEE_GLX_EXT_visual_info = GL_FALSE;\r
+GLboolean _GLEE_GLX_SGI_swap_control = GL_FALSE;\r
+GLboolean _GLEE_GLX_SGI_video_sync = GL_FALSE;\r
+GLboolean _GLEE_GLX_SGI_make_current_read = GL_FALSE;\r
+GLboolean _GLEE_GLX_EXT_visual_rating = GL_FALSE;\r
+GLboolean _GLEE_GLX_EXT_import_context = GL_FALSE;\r
+GLboolean _GLEE_GLX_SGIX_fbconfig = GL_FALSE;\r
+GLboolean _GLEE_GLX_SGIX_pbuffer = GL_FALSE;\r
+GLboolean _GLEE_GLX_SGI_cushion = GL_FALSE;\r
+GLboolean _GLEE_GLX_SGIX_video_resize = GL_FALSE;\r
+GLboolean _GLEE_GLX_SGIX_swap_group = GL_FALSE;\r
+GLboolean _GLEE_GLX_SGIX_swap_barrier = GL_FALSE;\r
+GLboolean _GLEE_GLX_SGIS_blended_overlay = GL_FALSE;\r
+GLboolean _GLEE_GLX_SGIS_shared_multisample = GL_FALSE;\r
+GLboolean _GLEE_GLX_SUN_get_transparent_index = GL_FALSE;\r
+GLboolean _GLEE_GLX_3DFX_multisample = GL_FALSE;\r
+GLboolean _GLEE_GLX_MESA_copy_sub_buffer = GL_FALSE;\r
+GLboolean _GLEE_GLX_MESA_pixmap_colormap = GL_FALSE;\r
+GLboolean _GLEE_GLX_MESA_release_buffers = GL_FALSE;\r
+GLboolean _GLEE_GLX_MESA_set_3dfx_mode = GL_FALSE;\r
+GLboolean _GLEE_GLX_SGIX_visual_select_group = GL_FALSE;\r
+GLboolean _GLEE_GLX_OML_swap_method = GL_FALSE;\r
+GLboolean _GLEE_GLX_OML_sync_control = GL_FALSE;\r
+GLboolean _GLEE_GLX_NV_float_buffer = GL_FALSE;\r
+GLboolean _GLEE_GLX_SGIX_hyperpipe = GL_FALSE;\r
+GLboolean _GLEE_GLX_MESA_agp_offset = GL_FALSE;\r
+GLboolean _GLEE_GLX_EXT_fbconfig_packed_float = GL_FALSE;\r
+GLboolean _GLEE_GLX_EXT_framebuffer_sRGB = GL_FALSE;\r
+GLboolean _GLEE_GLX_EXT_texture_from_pixmap = GL_FALSE;\r
+GLboolean _GLEE_GLX_NV_present_video = GL_FALSE;\r
+GLboolean _GLEE_GLX_NV_video_out = GL_FALSE;\r
+GLboolean _GLEE_GLX_NV_swap_group = GL_FALSE;\r
+GLboolean _GLEE_GLX_EXT_scene_marker = GL_FALSE;\r
+GLboolean _GLEE_GLX_NV_video_output = GL_FALSE;\r
+\r
+/*  GLX Extension names */\r
+\r
+char __GLeeGLXExtensionNames[40][30]={\r
+    "GLX_VERSION_1_3",\r
+    "GLX_VERSION_1_4",\r
+    "GLX_ARB_multisample",\r
+    "GLX_ARB_fbconfig_float",\r
+    "GLX_ARB_create_context",\r
+    "GLX_SGIS_multisample",\r
+    "GLX_EXT_visual_info",\r
+    "GLX_SGI_swap_control",\r
+    "GLX_SGI_video_sync",\r
+    "GLX_SGI_make_current_read",\r
+    "GLX_EXT_visual_rating",\r
+    "GLX_EXT_import_context",\r
+    "GLX_SGIX_fbconfig",\r
+    "GLX_SGIX_pbuffer",\r
+    "GLX_SGI_cushion",\r
+    "GLX_SGIX_video_resize",\r
+    "GLX_SGIX_swap_group",\r
+    "GLX_SGIX_swap_barrier",\r
+    "GLX_SGIS_blended_overlay",\r
+    "GLX_SGIS_shared_multisample",\r
+    "GLX_SUN_get_transparent_index",\r
+    "GLX_3DFX_multisample",\r
+    "GLX_MESA_copy_sub_buffer",\r
+    "GLX_MESA_pixmap_colormap",\r
+    "GLX_MESA_release_buffers",\r
+    "GLX_MESA_set_3dfx_mode",\r
+    "GLX_SGIX_visual_select_group",\r
+    "GLX_OML_swap_method",\r
+    "GLX_OML_sync_control",\r
+    "GLX_NV_float_buffer",\r
+    "GLX_SGIX_hyperpipe",\r
+    "GLX_MESA_agp_offset",\r
+    "GLX_EXT_fbconfig_packed_float",\r
+    "GLX_EXT_framebuffer_sRGB",\r
+    "GLX_EXT_texture_from_pixmap",\r
+    "GLX_NV_present_video",\r
+    "GLX_NV_video_out",\r
+    "GLX_NV_swap_group",\r
+    "GLX_EXT_scene_marker",\r
+    "GLX_NV_video_output"\r
+};\r
+int __GLeeGLXNumExtensions=40;\r
+\r
+/* GLX_VERSION_1_3 */\r
+\r
+#ifdef __GLEE_GLX_VERSION_1_3\r
+#ifndef GLEE_C_DEFINED_glXGetFBConfigs\r
+#define GLEE_C_DEFINED_glXGetFBConfigs\r
+  GLXFBConfig * __stdcall GLee_Lazy_glXGetFBConfigs(Display * dpy, int screen, int * nelements)  {if (GLeeInit()) return glXGetFBConfigs(dpy, screen, nelements); return (GLXFBConfig *)0;}\r
+  GLEEPFNGLXGETFBCONFIGSPROC GLeeFuncPtr_glXGetFBConfigs=GLee_Lazy_glXGetFBConfigs;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glXChooseFBConfig\r
+#define GLEE_C_DEFINED_glXChooseFBConfig\r
+  GLXFBConfig * __stdcall GLee_Lazy_glXChooseFBConfig(Display * dpy, int screen, const int * attrib_list, int * nelements)  {if (GLeeInit()) return glXChooseFBConfig(dpy, screen, attrib_list, nelements); return (GLXFBConfig *)0;}\r
+  GLEEPFNGLXCHOOSEFBCONFIGPROC GLeeFuncPtr_glXChooseFBConfig=GLee_Lazy_glXChooseFBConfig;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glXGetFBConfigAttrib\r
+#define GLEE_C_DEFINED_glXGetFBConfigAttrib\r
+  int __stdcall GLee_Lazy_glXGetFBConfigAttrib(Display * dpy, GLXFBConfig config, int attribute, int * value)  {if (GLeeInit()) return glXGetFBConfigAttrib(dpy, config, attribute, value); return (int)0;}\r
+  GLEEPFNGLXGETFBCONFIGATTRIBPROC GLeeFuncPtr_glXGetFBConfigAttrib=GLee_Lazy_glXGetFBConfigAttrib;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glXGetVisualFromFBConfig\r
+#define GLEE_C_DEFINED_glXGetVisualFromFBConfig\r
+  XVisualInfo * __stdcall GLee_Lazy_glXGetVisualFromFBConfig(Display * dpy, GLXFBConfig config)  {if (GLeeInit()) return glXGetVisualFromFBConfig(dpy, config); return (XVisualInfo *)0;}\r
+  GLEEPFNGLXGETVISUALFROMFBCONFIGPROC GLeeFuncPtr_glXGetVisualFromFBConfig=GLee_Lazy_glXGetVisualFromFBConfig;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glXCreateWindow\r
+#define GLEE_C_DEFINED_glXCreateWindow\r
+  GLXWindow __stdcall GLee_Lazy_glXCreateWindow(Display * dpy, GLXFBConfig config, Window win, const int * attrib_list)  {if (GLeeInit()) return glXCreateWindow(dpy, config, win, attrib_list); return (GLXWindow)0;}\r
+  GLEEPFNGLXCREATEWINDOWPROC GLeeFuncPtr_glXCreateWindow=GLee_Lazy_glXCreateWindow;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glXDestroyWindow\r
+#define GLEE_C_DEFINED_glXDestroyWindow\r
+  void __stdcall GLee_Lazy_glXDestroyWindow(Display * dpy, GLXWindow win)  {if (GLeeInit()) glXDestroyWindow(dpy, win);}\r
+  GLEEPFNGLXDESTROYWINDOWPROC GLeeFuncPtr_glXDestroyWindow=GLee_Lazy_glXDestroyWindow;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glXCreatePixmap\r
+#define GLEE_C_DEFINED_glXCreatePixmap\r
+  GLXPixmap __stdcall GLee_Lazy_glXCreatePixmap(Display * dpy, GLXFBConfig config, Pixmap pixmap, const int * attrib_list)  {if (GLeeInit()) return glXCreatePixmap(dpy, config, pixmap, attrib_list); return (GLXPixmap)0;}\r
+  GLEEPFNGLXCREATEPIXMAPPROC GLeeFuncPtr_glXCreatePixmap=GLee_Lazy_glXCreatePixmap;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glXDestroyPixmap\r
+#define GLEE_C_DEFINED_glXDestroyPixmap\r
+  void __stdcall GLee_Lazy_glXDestroyPixmap(Display * dpy, GLXPixmap pixmap)  {if (GLeeInit()) glXDestroyPixmap(dpy, pixmap);}\r
+  GLEEPFNGLXDESTROYPIXMAPPROC GLeeFuncPtr_glXDestroyPixmap=GLee_Lazy_glXDestroyPixmap;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glXCreatePbuffer\r
+#define GLEE_C_DEFINED_glXCreatePbuffer\r
+  GLXPbuffer __stdcall GLee_Lazy_glXCreatePbuffer(Display * dpy, GLXFBConfig config, const int * attrib_list)  {if (GLeeInit()) return glXCreatePbuffer(dpy, config, attrib_list); return (GLXPbuffer)0;}\r
+  GLEEPFNGLXCREATEPBUFFERPROC GLeeFuncPtr_glXCreatePbuffer=GLee_Lazy_glXCreatePbuffer;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glXDestroyPbuffer\r
+#define GLEE_C_DEFINED_glXDestroyPbuffer\r
+  void __stdcall GLee_Lazy_glXDestroyPbuffer(Display * dpy, GLXPbuffer pbuf)  {if (GLeeInit()) glXDestroyPbuffer(dpy, pbuf);}\r
+  GLEEPFNGLXDESTROYPBUFFERPROC GLeeFuncPtr_glXDestroyPbuffer=GLee_Lazy_glXDestroyPbuffer;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glXQueryDrawable\r
+#define GLEE_C_DEFINED_glXQueryDrawable\r
+  void __stdcall GLee_Lazy_glXQueryDrawable(Display * dpy, GLXDrawable draw, int attribute, unsigned int * value)  {if (GLeeInit()) glXQueryDrawable(dpy, draw, attribute, value);}\r
+  GLEEPFNGLXQUERYDRAWABLEPROC GLeeFuncPtr_glXQueryDrawable=GLee_Lazy_glXQueryDrawable;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glXCreateNewContext\r
+#define GLEE_C_DEFINED_glXCreateNewContext\r
+  GLXContext __stdcall GLee_Lazy_glXCreateNewContext(Display * dpy, GLXFBConfig config, int render_type, GLXContext share_list, Bool direct)  {if (GLeeInit()) return glXCreateNewContext(dpy, config, render_type, share_list, direct); return (GLXContext)0;}\r
+  GLEEPFNGLXCREATENEWCONTEXTPROC GLeeFuncPtr_glXCreateNewContext=GLee_Lazy_glXCreateNewContext;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glXMakeContextCurrent\r
+#define GLEE_C_DEFINED_glXMakeContextCurrent\r
+  Bool __stdcall GLee_Lazy_glXMakeContextCurrent(Display * dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx)  {if (GLeeInit()) return glXMakeContextCurrent(dpy, draw, read, ctx); return (Bool)0;}\r
+  GLEEPFNGLXMAKECONTEXTCURRENTPROC GLeeFuncPtr_glXMakeContextCurrent=GLee_Lazy_glXMakeContextCurrent;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glXGetCurrentReadDrawable\r
+#define GLEE_C_DEFINED_glXGetCurrentReadDrawable\r
+  GLXDrawable __stdcall GLee_Lazy_glXGetCurrentReadDrawable(void)  {if (GLeeInit()) return glXGetCurrentReadDrawable(); return (GLXDrawable)0;}\r
+  GLEEPFNGLXGETCURRENTREADDRAWABLEPROC GLeeFuncPtr_glXGetCurrentReadDrawable=GLee_Lazy_glXGetCurrentReadDrawable;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glXGetCurrentDisplay\r
+#define GLEE_C_DEFINED_glXGetCurrentDisplay\r
+  Display * __stdcall GLee_Lazy_glXGetCurrentDisplay(void)  {if (GLeeInit()) return glXGetCurrentDisplay(); return (Display *)0;}\r
+  GLEEPFNGLXGETCURRENTDISPLAYPROC GLeeFuncPtr_glXGetCurrentDisplay=GLee_Lazy_glXGetCurrentDisplay;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glXQueryContext\r
+#define GLEE_C_DEFINED_glXQueryContext\r
+  int __stdcall GLee_Lazy_glXQueryContext(Display * dpy, GLXContext ctx, int attribute, int * value)  {if (GLeeInit()) return glXQueryContext(dpy, ctx, attribute, value); return (int)0;}\r
+  GLEEPFNGLXQUERYCONTEXTPROC GLeeFuncPtr_glXQueryContext=GLee_Lazy_glXQueryContext;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glXSelectEvent\r
+#define GLEE_C_DEFINED_glXSelectEvent\r
+  void __stdcall GLee_Lazy_glXSelectEvent(Display * dpy, GLXDrawable draw, unsigned long event_mask)  {if (GLeeInit()) glXSelectEvent(dpy, draw, event_mask);}\r
+  GLEEPFNGLXSELECTEVENTPROC GLeeFuncPtr_glXSelectEvent=GLee_Lazy_glXSelectEvent;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glXGetSelectedEvent\r
+#define GLEE_C_DEFINED_glXGetSelectedEvent\r
+  void __stdcall GLee_Lazy_glXGetSelectedEvent(Display * dpy, GLXDrawable draw, unsigned long * event_mask)  {if (GLeeInit()) glXGetSelectedEvent(dpy, draw, event_mask);}\r
+  GLEEPFNGLXGETSELECTEDEVENTPROC GLeeFuncPtr_glXGetSelectedEvent=GLee_Lazy_glXGetSelectedEvent;\r
+#endif\r
+#endif \r
+\r
+/* GLX_VERSION_1_4 */\r
+\r
+#ifdef __GLEE_GLX_VERSION_1_4\r
+#ifndef GLEE_C_DEFINED_glXGetProcAddress\r
+#define GLEE_C_DEFINED_glXGetProcAddress\r
+  __GLXextFuncPtr __stdcall GLee_Lazy_glXGetProcAddress(const GLubyte * procName)  {if (GLeeInit()) return glXGetProcAddress(procName); return (__GLXextFuncPtr)0;}\r
+  GLEEPFNGLXGETPROCADDRESSPROC GLeeFuncPtr_glXGetProcAddress=GLee_Lazy_glXGetProcAddress;\r
+#endif\r
+#endif \r
+\r
+/* GLX_ARB_multisample */\r
+\r
+#ifdef __GLEE_GLX_ARB_multisample\r
+#endif \r
+\r
+/* GLX_ARB_fbconfig_float */\r
+\r
+#ifdef __GLEE_GLX_ARB_fbconfig_float\r
+#endif \r
+\r
+/* GLX_ARB_create_context */\r
+\r
+#ifdef __GLEE_GLX_ARB_create_context\r
+#ifndef GLEE_C_DEFINED_glXCreateContextAttribsARB\r
+#define GLEE_C_DEFINED_glXCreateContextAttribsARB\r
+  GLXContext __stdcall GLee_Lazy_glXCreateContextAttribsARB(Display * dpy, GLXFBConfig config, GLXContext share_context, Bool direct, const int * attrib_list)  {if (GLeeInit()) return glXCreateContextAttribsARB(dpy, config, share_context, direct, attrib_list); return (GLXContext)0;}\r
+  GLEEPFNGLXCREATECONTEXTATTRIBSARBPROC GLeeFuncPtr_glXCreateContextAttribsARB=GLee_Lazy_glXCreateContextAttribsARB;\r
+#endif\r
+#endif \r
+\r
+/* GLX_SGIS_multisample */\r
+\r
+#ifdef __GLEE_GLX_SGIS_multisample\r
+#endif \r
+\r
+/* GLX_EXT_visual_info */\r
+\r
+#ifdef __GLEE_GLX_EXT_visual_info\r
+#endif \r
+\r
+/* GLX_SGI_swap_control */\r
+\r
+#ifdef __GLEE_GLX_SGI_swap_control\r
+#ifndef GLEE_C_DEFINED_glXSwapIntervalSGI\r
+#define GLEE_C_DEFINED_glXSwapIntervalSGI\r
+  int __stdcall GLee_Lazy_glXSwapIntervalSGI(int interval)  {if (GLeeInit()) return glXSwapIntervalSGI(interval); return (int)0;}\r
+  GLEEPFNGLXSWAPINTERVALSGIPROC GLeeFuncPtr_glXSwapIntervalSGI=GLee_Lazy_glXSwapIntervalSGI;\r
+#endif\r
+#endif \r
+\r
+/* GLX_SGI_video_sync */\r
+\r
+#ifdef __GLEE_GLX_SGI_video_sync\r
+#ifndef GLEE_C_DEFINED_glXGetVideoSyncSGI\r
+#define GLEE_C_DEFINED_glXGetVideoSyncSGI\r
+  int __stdcall GLee_Lazy_glXGetVideoSyncSGI(unsigned int * count)  {if (GLeeInit()) return glXGetVideoSyncSGI(count); return (int)0;}\r
+  GLEEPFNGLXGETVIDEOSYNCSGIPROC GLeeFuncPtr_glXGetVideoSyncSGI=GLee_Lazy_glXGetVideoSyncSGI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glXWaitVideoSyncSGI\r
+#define GLEE_C_DEFINED_glXWaitVideoSyncSGI\r
+  int __stdcall GLee_Lazy_glXWaitVideoSyncSGI(int divisor, int remainder, unsigned int * count)  {if (GLeeInit()) return glXWaitVideoSyncSGI(divisor, remainder, count); return (int)0;}\r
+  GLEEPFNGLXWAITVIDEOSYNCSGIPROC GLeeFuncPtr_glXWaitVideoSyncSGI=GLee_Lazy_glXWaitVideoSyncSGI;\r
+#endif\r
+#endif \r
+\r
+/* GLX_SGI_make_current_read */\r
+\r
+#ifdef __GLEE_GLX_SGI_make_current_read\r
+#ifndef GLEE_C_DEFINED_glXMakeCurrentReadSGI\r
+#define GLEE_C_DEFINED_glXMakeCurrentReadSGI\r
+  Bool __stdcall GLee_Lazy_glXMakeCurrentReadSGI(Display * dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx)  {if (GLeeInit()) return glXMakeCurrentReadSGI(dpy, draw, read, ctx); return (Bool)0;}\r
+  GLEEPFNGLXMAKECURRENTREADSGIPROC GLeeFuncPtr_glXMakeCurrentReadSGI=GLee_Lazy_glXMakeCurrentReadSGI;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glXGetCurrentReadDrawableSGI\r
+#define GLEE_C_DEFINED_glXGetCurrentReadDrawableSGI\r
+  GLXDrawable __stdcall GLee_Lazy_glXGetCurrentReadDrawableSGI(void)  {if (GLeeInit()) return glXGetCurrentReadDrawableSGI(); return (GLXDrawable)0;}\r
+  GLEEPFNGLXGETCURRENTREADDRAWABLESGIPROC GLeeFuncPtr_glXGetCurrentReadDrawableSGI=GLee_Lazy_glXGetCurrentReadDrawableSGI;\r
+#endif\r
+#endif \r
+\r
+/* GLX_EXT_visual_rating */\r
+\r
+#ifdef __GLEE_GLX_EXT_visual_rating\r
+#endif \r
+\r
+/* GLX_EXT_import_context */\r
+\r
+#ifdef __GLEE_GLX_EXT_import_context\r
+#ifndef GLEE_C_DEFINED_glXGetCurrentDisplayEXT\r
+#define GLEE_C_DEFINED_glXGetCurrentDisplayEXT\r
+  Display * __stdcall GLee_Lazy_glXGetCurrentDisplayEXT(void)  {if (GLeeInit()) return glXGetCurrentDisplayEXT(); return (Display *)0;}\r
+  GLEEPFNGLXGETCURRENTDISPLAYEXTPROC GLeeFuncPtr_glXGetCurrentDisplayEXT=GLee_Lazy_glXGetCurrentDisplayEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glXQueryContextInfoEXT\r
+#define GLEE_C_DEFINED_glXQueryContextInfoEXT\r
+  int __stdcall GLee_Lazy_glXQueryContextInfoEXT(Display * dpy, GLXContext context, int attribute, int * value)  {if (GLeeInit()) return glXQueryContextInfoEXT(dpy, context, attribute, value); return (int)0;}\r
+  GLEEPFNGLXQUERYCONTEXTINFOEXTPROC GLeeFuncPtr_glXQueryContextInfoEXT=GLee_Lazy_glXQueryContextInfoEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glXGetContextIDEXT\r
+#define GLEE_C_DEFINED_glXGetContextIDEXT\r
+  GLXContextID __stdcall GLee_Lazy_glXGetContextIDEXT(const GLXContext context)  {if (GLeeInit()) return glXGetContextIDEXT(context); return (GLXContextID)0;}\r
+  GLEEPFNGLXGETCONTEXTIDEXTPROC GLeeFuncPtr_glXGetContextIDEXT=GLee_Lazy_glXGetContextIDEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glXImportContextEXT\r
+#define GLEE_C_DEFINED_glXImportContextEXT\r
+  GLXContext __stdcall GLee_Lazy_glXImportContextEXT(Display * dpy, GLXContextID contextID)  {if (GLeeInit()) return glXImportContextEXT(dpy, contextID); return (GLXContext)0;}\r
+  GLEEPFNGLXIMPORTCONTEXTEXTPROC GLeeFuncPtr_glXImportContextEXT=GLee_Lazy_glXImportContextEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glXFreeContextEXT\r
+#define GLEE_C_DEFINED_glXFreeContextEXT\r
+  void __stdcall GLee_Lazy_glXFreeContextEXT(Display * dpy, GLXContext context)  {if (GLeeInit()) glXFreeContextEXT(dpy, context);}\r
+  GLEEPFNGLXFREECONTEXTEXTPROC GLeeFuncPtr_glXFreeContextEXT=GLee_Lazy_glXFreeContextEXT;\r
+#endif\r
+#endif \r
+\r
+/* GLX_SGIX_fbconfig */\r
+\r
+#ifdef __GLEE_GLX_SGIX_fbconfig\r
+#ifndef GLEE_C_DEFINED_glXGetFBConfigAttribSGIX\r
+#define GLEE_C_DEFINED_glXGetFBConfigAttribSGIX\r
+  int __stdcall GLee_Lazy_glXGetFBConfigAttribSGIX(Display * dpy, GLXFBConfigSGIX config, int attribute, int * value)  {if (GLeeInit()) return glXGetFBConfigAttribSGIX(dpy, config, attribute, value); return (int)0;}\r
+  GLEEPFNGLXGETFBCONFIGATTRIBSGIXPROC GLeeFuncPtr_glXGetFBConfigAttribSGIX=GLee_Lazy_glXGetFBConfigAttribSGIX;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glXChooseFBConfigSGIX\r
+#define GLEE_C_DEFINED_glXChooseFBConfigSGIX\r
+  GLXFBConfigSGIX * __stdcall GLee_Lazy_glXChooseFBConfigSGIX(Display * dpy, int screen, int * attrib_list, int * nelements)  {if (GLeeInit()) return glXChooseFBConfigSGIX(dpy, screen, attrib_list, nelements); return (GLXFBConfigSGIX *)0;}\r
+  GLEEPFNGLXCHOOSEFBCONFIGSGIXPROC GLeeFuncPtr_glXChooseFBConfigSGIX=GLee_Lazy_glXChooseFBConfigSGIX;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glXCreateGLXPixmapWithConfigSGIX\r
+#define GLEE_C_DEFINED_glXCreateGLXPixmapWithConfigSGIX\r
+  GLXPixmap __stdcall GLee_Lazy_glXCreateGLXPixmapWithConfigSGIX(Display * dpy, GLXFBConfigSGIX config, Pixmap pixmap)  {if (GLeeInit()) return glXCreateGLXPixmapWithConfigSGIX(dpy, config, pixmap); return (GLXPixmap)0;}\r
+  GLEEPFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC GLeeFuncPtr_glXCreateGLXPixmapWithConfigSGIX=GLee_Lazy_glXCreateGLXPixmapWithConfigSGIX;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glXCreateContextWithConfigSGIX\r
+#define GLEE_C_DEFINED_glXCreateContextWithConfigSGIX\r
+  GLXContext __stdcall GLee_Lazy_glXCreateContextWithConfigSGIX(Display * dpy, GLXFBConfigSGIX config, int render_type, GLXContext share_list, Bool direct)  {if (GLeeInit()) return glXCreateContextWithConfigSGIX(dpy, config, render_type, share_list, direct); return (GLXContext)0;}\r
+  GLEEPFNGLXCREATECONTEXTWITHCONFIGSGIXPROC GLeeFuncPtr_glXCreateContextWithConfigSGIX=GLee_Lazy_glXCreateContextWithConfigSGIX;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glXGetVisualFromFBConfigSGIX\r
+#define GLEE_C_DEFINED_glXGetVisualFromFBConfigSGIX\r
+  XVisualInfo * __stdcall GLee_Lazy_glXGetVisualFromFBConfigSGIX(Display * dpy, GLXFBConfigSGIX config)  {if (GLeeInit()) return glXGetVisualFromFBConfigSGIX(dpy, config); return (XVisualInfo *)0;}\r
+  GLEEPFNGLXGETVISUALFROMFBCONFIGSGIXPROC GLeeFuncPtr_glXGetVisualFromFBConfigSGIX=GLee_Lazy_glXGetVisualFromFBConfigSGIX;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glXGetFBConfigFromVisualSGIX\r
+#define GLEE_C_DEFINED_glXGetFBConfigFromVisualSGIX\r
+  GLXFBConfigSGIX __stdcall GLee_Lazy_glXGetFBConfigFromVisualSGIX(Display * dpy, XVisualInfo * vis)  {if (GLeeInit()) return glXGetFBConfigFromVisualSGIX(dpy, vis); return (GLXFBConfigSGIX)0;}\r
+  GLEEPFNGLXGETFBCONFIGFROMVISUALSGIXPROC GLeeFuncPtr_glXGetFBConfigFromVisualSGIX=GLee_Lazy_glXGetFBConfigFromVisualSGIX;\r
+#endif\r
+#endif \r
+\r
+/* GLX_SGIX_pbuffer */\r
+\r
+#ifdef __GLEE_GLX_SGIX_pbuffer\r
+#ifndef GLEE_C_DEFINED_glXCreateGLXPbufferSGIX\r
+#define GLEE_C_DEFINED_glXCreateGLXPbufferSGIX\r
+  GLXPbufferSGIX __stdcall GLee_Lazy_glXCreateGLXPbufferSGIX(Display * dpy, GLXFBConfigSGIX config, unsigned int width, unsigned int height, int * attrib_list)  {if (GLeeInit()) return glXCreateGLXPbufferSGIX(dpy, config, width, height, attrib_list); return (GLXPbufferSGIX)0;}\r
+  GLEEPFNGLXCREATEGLXPBUFFERSGIXPROC GLeeFuncPtr_glXCreateGLXPbufferSGIX=GLee_Lazy_glXCreateGLXPbufferSGIX;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glXDestroyGLXPbufferSGIX\r
+#define GLEE_C_DEFINED_glXDestroyGLXPbufferSGIX\r
+  void __stdcall GLee_Lazy_glXDestroyGLXPbufferSGIX(Display * dpy, GLXPbufferSGIX pbuf)  {if (GLeeInit()) glXDestroyGLXPbufferSGIX(dpy, pbuf);}\r
+  GLEEPFNGLXDESTROYGLXPBUFFERSGIXPROC GLeeFuncPtr_glXDestroyGLXPbufferSGIX=GLee_Lazy_glXDestroyGLXPbufferSGIX;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glXQueryGLXPbufferSGIX\r
+#define GLEE_C_DEFINED_glXQueryGLXPbufferSGIX\r
+  int __stdcall GLee_Lazy_glXQueryGLXPbufferSGIX(Display * dpy, GLXPbufferSGIX pbuf, int attribute, unsigned int * value)  {if (GLeeInit()) return glXQueryGLXPbufferSGIX(dpy, pbuf, attribute, value); return (int)0;}\r
+  GLEEPFNGLXQUERYGLXPBUFFERSGIXPROC GLeeFuncPtr_glXQueryGLXPbufferSGIX=GLee_Lazy_glXQueryGLXPbufferSGIX;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glXSelectEventSGIX\r
+#define GLEE_C_DEFINED_glXSelectEventSGIX\r
+  void __stdcall GLee_Lazy_glXSelectEventSGIX(Display * dpy, GLXDrawable drawable, unsigned long mask)  {if (GLeeInit()) glXSelectEventSGIX(dpy, drawable, mask);}\r
+  GLEEPFNGLXSELECTEVENTSGIXPROC GLeeFuncPtr_glXSelectEventSGIX=GLee_Lazy_glXSelectEventSGIX;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glXGetSelectedEventSGIX\r
+#define GLEE_C_DEFINED_glXGetSelectedEventSGIX\r
+  void __stdcall GLee_Lazy_glXGetSelectedEventSGIX(Display * dpy, GLXDrawable drawable, unsigned long * mask)  {if (GLeeInit()) glXGetSelectedEventSGIX(dpy, drawable, mask);}\r
+  GLEEPFNGLXGETSELECTEDEVENTSGIXPROC GLeeFuncPtr_glXGetSelectedEventSGIX=GLee_Lazy_glXGetSelectedEventSGIX;\r
+#endif\r
+#endif \r
+\r
+/* GLX_SGI_cushion */\r
+\r
+#ifdef __GLEE_GLX_SGI_cushion\r
+#ifndef GLEE_C_DEFINED_glXCushionSGI\r
+#define GLEE_C_DEFINED_glXCushionSGI\r
+  void __stdcall GLee_Lazy_glXCushionSGI(Display * dpy, Window window, float cushion)  {if (GLeeInit()) glXCushionSGI(dpy, window, cushion);}\r
+  GLEEPFNGLXCUSHIONSGIPROC GLeeFuncPtr_glXCushionSGI=GLee_Lazy_glXCushionSGI;\r
+#endif\r
+#endif \r
+\r
+/* GLX_SGIX_video_resize */\r
+\r
+#ifdef __GLEE_GLX_SGIX_video_resize\r
+#ifndef GLEE_C_DEFINED_glXBindChannelToWindowSGIX\r
+#define GLEE_C_DEFINED_glXBindChannelToWindowSGIX\r
+  int __stdcall GLee_Lazy_glXBindChannelToWindowSGIX(Display * display, int screen, int channel, Window window)  {if (GLeeInit()) return glXBindChannelToWindowSGIX(display, screen, channel, window); return (int)0;}\r
+  GLEEPFNGLXBINDCHANNELTOWINDOWSGIXPROC GLeeFuncPtr_glXBindChannelToWindowSGIX=GLee_Lazy_glXBindChannelToWindowSGIX;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glXChannelRectSGIX\r
+#define GLEE_C_DEFINED_glXChannelRectSGIX\r
+  int __stdcall GLee_Lazy_glXChannelRectSGIX(Display * display, int screen, int channel, int x, int y, int w, int h)  {if (GLeeInit()) return glXChannelRectSGIX(display, screen, channel, x, y, w, h); return (int)0;}\r
+  GLEEPFNGLXCHANNELRECTSGIXPROC GLeeFuncPtr_glXChannelRectSGIX=GLee_Lazy_glXChannelRectSGIX;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glXQueryChannelRectSGIX\r
+#define GLEE_C_DEFINED_glXQueryChannelRectSGIX\r
+  int __stdcall GLee_Lazy_glXQueryChannelRectSGIX(Display * display, int screen, int channel, int * dx, int * dy, int * dw, int * dh)  {if (GLeeInit()) return glXQueryChannelRectSGIX(display, screen, channel, dx, dy, dw, dh); return (int)0;}\r
+  GLEEPFNGLXQUERYCHANNELRECTSGIXPROC GLeeFuncPtr_glXQueryChannelRectSGIX=GLee_Lazy_glXQueryChannelRectSGIX;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glXQueryChannelDeltasSGIX\r
+#define GLEE_C_DEFINED_glXQueryChannelDeltasSGIX\r
+  int __stdcall GLee_Lazy_glXQueryChannelDeltasSGIX(Display * display, int screen, int channel, int * x, int * y, int * w, int * h)  {if (GLeeInit()) return glXQueryChannelDeltasSGIX(display, screen, channel, x, y, w, h); return (int)0;}\r
+  GLEEPFNGLXQUERYCHANNELDELTASSGIXPROC GLeeFuncPtr_glXQueryChannelDeltasSGIX=GLee_Lazy_glXQueryChannelDeltasSGIX;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glXChannelRectSyncSGIX\r
+#define GLEE_C_DEFINED_glXChannelRectSyncSGIX\r
+  int __stdcall GLee_Lazy_glXChannelRectSyncSGIX(Display * display, int screen, int channel, GLenum synctype)  {if (GLeeInit()) return glXChannelRectSyncSGIX(display, screen, channel, synctype); return (int)0;}\r
+  GLEEPFNGLXCHANNELRECTSYNCSGIXPROC GLeeFuncPtr_glXChannelRectSyncSGIX=GLee_Lazy_glXChannelRectSyncSGIX;\r
+#endif\r
+#endif \r
+\r
+/* GLX_SGIX_swap_group */\r
+\r
+#ifdef __GLEE_GLX_SGIX_swap_group\r
+#ifndef GLEE_C_DEFINED_glXJoinSwapGroupSGIX\r
+#define GLEE_C_DEFINED_glXJoinSwapGroupSGIX\r
+  void __stdcall GLee_Lazy_glXJoinSwapGroupSGIX(Display * dpy, GLXDrawable drawable, GLXDrawable member)  {if (GLeeInit()) glXJoinSwapGroupSGIX(dpy, drawable, member);}\r
+  GLEEPFNGLXJOINSWAPGROUPSGIXPROC GLeeFuncPtr_glXJoinSwapGroupSGIX=GLee_Lazy_glXJoinSwapGroupSGIX;\r
+#endif\r
+#endif \r
+\r
+/* GLX_SGIX_swap_barrier */\r
+\r
+#ifdef __GLEE_GLX_SGIX_swap_barrier\r
+#ifndef GLEE_C_DEFINED_glXBindSwapBarrierSGIX\r
+#define GLEE_C_DEFINED_glXBindSwapBarrierSGIX\r
+  void __stdcall GLee_Lazy_glXBindSwapBarrierSGIX(Display * dpy, GLXDrawable drawable, int barrier)  {if (GLeeInit()) glXBindSwapBarrierSGIX(dpy, drawable, barrier);}\r
+  GLEEPFNGLXBINDSWAPBARRIERSGIXPROC GLeeFuncPtr_glXBindSwapBarrierSGIX=GLee_Lazy_glXBindSwapBarrierSGIX;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glXQueryMaxSwapBarriersSGIX\r
+#define GLEE_C_DEFINED_glXQueryMaxSwapBarriersSGIX\r
+  Bool __stdcall GLee_Lazy_glXQueryMaxSwapBarriersSGIX(Display * dpy, int screen, int * max)  {if (GLeeInit()) return glXQueryMaxSwapBarriersSGIX(dpy, screen, max); return (Bool)0;}\r
+  GLEEPFNGLXQUERYMAXSWAPBARRIERSSGIXPROC GLeeFuncPtr_glXQueryMaxSwapBarriersSGIX=GLee_Lazy_glXQueryMaxSwapBarriersSGIX;\r
+#endif\r
+#endif \r
+\r
+/* GLX_SGIS_blended_overlay */\r
+\r
+#ifdef __GLEE_GLX_SGIS_blended_overlay\r
+#endif \r
+\r
+/* GLX_SGIS_shared_multisample */\r
+\r
+#ifdef __GLEE_GLX_SGIS_shared_multisample\r
+#endif \r
+\r
+/* GLX_SUN_get_transparent_index */\r
+\r
+#ifdef __GLEE_GLX_SUN_get_transparent_index\r
+#ifndef GLEE_C_DEFINED_glXGetTransparentIndexSUN\r
+#define GLEE_C_DEFINED_glXGetTransparentIndexSUN\r
+  Status __stdcall GLee_Lazy_glXGetTransparentIndexSUN(Display * dpy, Window overlay, Window underlay, long * pTransparentIndex)  {if (GLeeInit()) return glXGetTransparentIndexSUN(dpy, overlay, underlay, pTransparentIndex); return (Status)0;}\r
+  GLEEPFNGLXGETTRANSPARENTINDEXSUNPROC GLeeFuncPtr_glXGetTransparentIndexSUN=GLee_Lazy_glXGetTransparentIndexSUN;\r
+#endif\r
+#endif \r
+\r
+/* GLX_3DFX_multisample */\r
+\r
+#ifdef __GLEE_GLX_3DFX_multisample\r
+#endif \r
+\r
+/* GLX_MESA_copy_sub_buffer */\r
+\r
+#ifdef __GLEE_GLX_MESA_copy_sub_buffer\r
+#ifndef GLEE_C_DEFINED_glXCopySubBufferMESA\r
+#define GLEE_C_DEFINED_glXCopySubBufferMESA\r
+  void __stdcall GLee_Lazy_glXCopySubBufferMESA(Display * dpy, GLXDrawable drawable, int x, int y, int width, int height)  {if (GLeeInit()) glXCopySubBufferMESA(dpy, drawable, x, y, width, height);}\r
+  GLEEPFNGLXCOPYSUBBUFFERMESAPROC GLeeFuncPtr_glXCopySubBufferMESA=GLee_Lazy_glXCopySubBufferMESA;\r
+#endif\r
+#endif \r
+\r
+/* GLX_MESA_pixmap_colormap */\r
+\r
+#ifdef __GLEE_GLX_MESA_pixmap_colormap\r
+#ifndef GLEE_C_DEFINED_glXCreateGLXPixmapMESA\r
+#define GLEE_C_DEFINED_glXCreateGLXPixmapMESA\r
+  GLXPixmap __stdcall GLee_Lazy_glXCreateGLXPixmapMESA(Display * dpy, XVisualInfo * visual, Pixmap pixmap, Colormap cmap)  {if (GLeeInit()) return glXCreateGLXPixmapMESA(dpy, visual, pixmap, cmap); return (GLXPixmap)0;}\r
+  GLEEPFNGLXCREATEGLXPIXMAPMESAPROC GLeeFuncPtr_glXCreateGLXPixmapMESA=GLee_Lazy_glXCreateGLXPixmapMESA;\r
+#endif\r
+#endif \r
+\r
+/* GLX_MESA_release_buffers */\r
+\r
+#ifdef __GLEE_GLX_MESA_release_buffers\r
+#ifndef GLEE_C_DEFINED_glXReleaseBuffersMESA\r
+#define GLEE_C_DEFINED_glXReleaseBuffersMESA\r
+  Bool __stdcall GLee_Lazy_glXReleaseBuffersMESA(Display * dpy, GLXDrawable drawable)  {if (GLeeInit()) return glXReleaseBuffersMESA(dpy, drawable); return (Bool)0;}\r
+  GLEEPFNGLXRELEASEBUFFERSMESAPROC GLeeFuncPtr_glXReleaseBuffersMESA=GLee_Lazy_glXReleaseBuffersMESA;\r
+#endif\r
+#endif \r
+\r
+/* GLX_MESA_set_3dfx_mode */\r
+\r
+#ifdef __GLEE_GLX_MESA_set_3dfx_mode\r
+#ifndef GLEE_C_DEFINED_glXSet3DfxModeMESA\r
+#define GLEE_C_DEFINED_glXSet3DfxModeMESA\r
+  Bool __stdcall GLee_Lazy_glXSet3DfxModeMESA(int mode)  {if (GLeeInit()) return glXSet3DfxModeMESA(mode); return (Bool)0;}\r
+  GLEEPFNGLXSET3DFXMODEMESAPROC GLeeFuncPtr_glXSet3DfxModeMESA=GLee_Lazy_glXSet3DfxModeMESA;\r
+#endif\r
+#endif \r
+\r
+/* GLX_SGIX_visual_select_group */\r
+\r
+#ifdef __GLEE_GLX_SGIX_visual_select_group\r
+#endif \r
+\r
+/* GLX_OML_swap_method */\r
+\r
+#ifdef __GLEE_GLX_OML_swap_method\r
+#endif \r
+\r
+/* GLX_OML_sync_control */\r
+\r
+#ifdef __GLEE_GLX_OML_sync_control\r
+#ifndef GLEE_C_DEFINED_glXGetSyncValuesOML\r
+#define GLEE_C_DEFINED_glXGetSyncValuesOML\r
+  Bool __stdcall GLee_Lazy_glXGetSyncValuesOML(Display * dpy, GLXDrawable drawable, int64_t * ust, int64_t * msc, int64_t * sbc)  {if (GLeeInit()) return glXGetSyncValuesOML(dpy, drawable, ust, msc, sbc); return (Bool)0;}\r
+  GLEEPFNGLXGETSYNCVALUESOMLPROC GLeeFuncPtr_glXGetSyncValuesOML=GLee_Lazy_glXGetSyncValuesOML;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glXGetMscRateOML\r
+#define GLEE_C_DEFINED_glXGetMscRateOML\r
+  Bool __stdcall GLee_Lazy_glXGetMscRateOML(Display * dpy, GLXDrawable drawable, int32_t * numerator, int32_t * denominator)  {if (GLeeInit()) return glXGetMscRateOML(dpy, drawable, numerator, denominator); return (Bool)0;}\r
+  GLEEPFNGLXGETMSCRATEOMLPROC GLeeFuncPtr_glXGetMscRateOML=GLee_Lazy_glXGetMscRateOML;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glXSwapBuffersMscOML\r
+#define GLEE_C_DEFINED_glXSwapBuffersMscOML\r
+  int64_t __stdcall GLee_Lazy_glXSwapBuffersMscOML(Display * dpy, GLXDrawable drawable, int64_t target_msc, int64_t divisor, int64_t remainder)  {if (GLeeInit()) return glXSwapBuffersMscOML(dpy, drawable, target_msc, divisor, remainder); return (int64_t)0;}\r
+  GLEEPFNGLXSWAPBUFFERSMSCOMLPROC GLeeFuncPtr_glXSwapBuffersMscOML=GLee_Lazy_glXSwapBuffersMscOML;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glXWaitForMscOML\r
+#define GLEE_C_DEFINED_glXWaitForMscOML\r
+  Bool __stdcall GLee_Lazy_glXWaitForMscOML(Display * dpy, GLXDrawable drawable, int64_t target_msc, int64_t divisor, int64_t remainder, int64_t * ust, int64_t * msc, int64_t * sbc)  {if (GLeeInit()) return glXWaitForMscOML(dpy, drawable, target_msc, divisor, remainder, ust, msc, sbc); return (Bool)0;}\r
+  GLEEPFNGLXWAITFORMSCOMLPROC GLeeFuncPtr_glXWaitForMscOML=GLee_Lazy_glXWaitForMscOML;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glXWaitForSbcOML\r
+#define GLEE_C_DEFINED_glXWaitForSbcOML\r
+  Bool __stdcall GLee_Lazy_glXWaitForSbcOML(Display * dpy, GLXDrawable drawable, int64_t target_sbc, int64_t * ust, int64_t * msc, int64_t * sbc)  {if (GLeeInit()) return glXWaitForSbcOML(dpy, drawable, target_sbc, ust, msc, sbc); return (Bool)0;}\r
+  GLEEPFNGLXWAITFORSBCOMLPROC GLeeFuncPtr_glXWaitForSbcOML=GLee_Lazy_glXWaitForSbcOML;\r
+#endif\r
+#endif \r
+\r
+/* GLX_NV_float_buffer */\r
+\r
+#ifdef __GLEE_GLX_NV_float_buffer\r
+#endif \r
+\r
+/* GLX_SGIX_hyperpipe */\r
+\r
+#ifdef __GLEE_GLX_SGIX_hyperpipe\r
+#ifndef GLEE_C_DEFINED_glXQueryHyperpipeNetworkSGIX\r
+#define GLEE_C_DEFINED_glXQueryHyperpipeNetworkSGIX\r
+  GLXHyperpipeNetworkSGIX * __stdcall GLee_Lazy_glXQueryHyperpipeNetworkSGIX(Display * dpy, int * npipes)  {if (GLeeInit()) return glXQueryHyperpipeNetworkSGIX(dpy, npipes); return (GLXHyperpipeNetworkSGIX *)0;}\r
+  GLEEPFNGLXQUERYHYPERPIPENETWORKSGIXPROC GLeeFuncPtr_glXQueryHyperpipeNetworkSGIX=GLee_Lazy_glXQueryHyperpipeNetworkSGIX;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glXHyperpipeConfigSGIX\r
+#define GLEE_C_DEFINED_glXHyperpipeConfigSGIX\r
+  int __stdcall GLee_Lazy_glXHyperpipeConfigSGIX(Display * dpy, int networkId, int npipes, GLXHyperpipeConfigSGIX * cfg, int * hpId)  {if (GLeeInit()) return glXHyperpipeConfigSGIX(dpy, networkId, npipes, cfg, hpId); return (int)0;}\r
+  GLEEPFNGLXHYPERPIPECONFIGSGIXPROC GLeeFuncPtr_glXHyperpipeConfigSGIX=GLee_Lazy_glXHyperpipeConfigSGIX;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glXQueryHyperpipeConfigSGIX\r
+#define GLEE_C_DEFINED_glXQueryHyperpipeConfigSGIX\r
+  GLXHyperpipeConfigSGIX * __stdcall GLee_Lazy_glXQueryHyperpipeConfigSGIX(Display * dpy, int hpId, int * npipes)  {if (GLeeInit()) return glXQueryHyperpipeConfigSGIX(dpy, hpId, npipes); return (GLXHyperpipeConfigSGIX *)0;}\r
+  GLEEPFNGLXQUERYHYPERPIPECONFIGSGIXPROC GLeeFuncPtr_glXQueryHyperpipeConfigSGIX=GLee_Lazy_glXQueryHyperpipeConfigSGIX;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glXDestroyHyperpipeConfigSGIX\r
+#define GLEE_C_DEFINED_glXDestroyHyperpipeConfigSGIX\r
+  int __stdcall GLee_Lazy_glXDestroyHyperpipeConfigSGIX(Display * dpy, int hpId)  {if (GLeeInit()) return glXDestroyHyperpipeConfigSGIX(dpy, hpId); return (int)0;}\r
+  GLEEPFNGLXDESTROYHYPERPIPECONFIGSGIXPROC GLeeFuncPtr_glXDestroyHyperpipeConfigSGIX=GLee_Lazy_glXDestroyHyperpipeConfigSGIX;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glXBindHyperpipeSGIX\r
+#define GLEE_C_DEFINED_glXBindHyperpipeSGIX\r
+  int __stdcall GLee_Lazy_glXBindHyperpipeSGIX(Display * dpy, int hpId)  {if (GLeeInit()) return glXBindHyperpipeSGIX(dpy, hpId); return (int)0;}\r
+  GLEEPFNGLXBINDHYPERPIPESGIXPROC GLeeFuncPtr_glXBindHyperpipeSGIX=GLee_Lazy_glXBindHyperpipeSGIX;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glXQueryHyperpipeBestAttribSGIX\r
+#define GLEE_C_DEFINED_glXQueryHyperpipeBestAttribSGIX\r
+  int __stdcall GLee_Lazy_glXQueryHyperpipeBestAttribSGIX(Display * dpy, int timeSlice, int attrib, int size, void * attribList, void * returnAttribList)  {if (GLeeInit()) return glXQueryHyperpipeBestAttribSGIX(dpy, timeSlice, attrib, size, attribList, returnAttribList); return (int)0;}\r
+  GLEEPFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC GLeeFuncPtr_glXQueryHyperpipeBestAttribSGIX=GLee_Lazy_glXQueryHyperpipeBestAttribSGIX;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glXHyperpipeAttribSGIX\r
+#define GLEE_C_DEFINED_glXHyperpipeAttribSGIX\r
+  int __stdcall GLee_Lazy_glXHyperpipeAttribSGIX(Display * dpy, int timeSlice, int attrib, int size, void * attribList)  {if (GLeeInit()) return glXHyperpipeAttribSGIX(dpy, timeSlice, attrib, size, attribList); return (int)0;}\r
+  GLEEPFNGLXHYPERPIPEATTRIBSGIXPROC GLeeFuncPtr_glXHyperpipeAttribSGIX=GLee_Lazy_glXHyperpipeAttribSGIX;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glXQueryHyperpipeAttribSGIX\r
+#define GLEE_C_DEFINED_glXQueryHyperpipeAttribSGIX\r
+  int __stdcall GLee_Lazy_glXQueryHyperpipeAttribSGIX(Display * dpy, int timeSlice, int attrib, int size, void * returnAttribList)  {if (GLeeInit()) return glXQueryHyperpipeAttribSGIX(dpy, timeSlice, attrib, size, returnAttribList); return (int)0;}\r
+  GLEEPFNGLXQUERYHYPERPIPEATTRIBSGIXPROC GLeeFuncPtr_glXQueryHyperpipeAttribSGIX=GLee_Lazy_glXQueryHyperpipeAttribSGIX;\r
+#endif\r
+#endif \r
+\r
+/* GLX_MESA_agp_offset */\r
+\r
+#ifdef __GLEE_GLX_MESA_agp_offset\r
+#ifndef GLEE_C_DEFINED_glXGetAGPOffsetMESA\r
+#define GLEE_C_DEFINED_glXGetAGPOffsetMESA\r
+  unsigned int __stdcall GLee_Lazy_glXGetAGPOffsetMESA(const void * pointer)  {if (GLeeInit()) return glXGetAGPOffsetMESA(pointer); return (unsigned int)0;}\r
+  GLEEPFNGLXGETAGPOFFSETMESAPROC GLeeFuncPtr_glXGetAGPOffsetMESA=GLee_Lazy_glXGetAGPOffsetMESA;\r
+#endif\r
+#endif \r
+\r
+/* GLX_EXT_fbconfig_packed_float */\r
+\r
+#ifdef __GLEE_GLX_EXT_fbconfig_packed_float\r
+#endif \r
+\r
+/* GLX_EXT_framebuffer_sRGB */\r
+\r
+#ifdef __GLEE_GLX_EXT_framebuffer_sRGB\r
+#endif \r
+\r
+/* GLX_EXT_texture_from_pixmap */\r
+\r
+#ifdef __GLEE_GLX_EXT_texture_from_pixmap\r
+#ifndef GLEE_C_DEFINED_glXBindTexImageEXT\r
+#define GLEE_C_DEFINED_glXBindTexImageEXT\r
+  void __stdcall GLee_Lazy_glXBindTexImageEXT(Display * dpy, GLXDrawable drawable, int buffer, const int * attrib_list)  {if (GLeeInit()) glXBindTexImageEXT(dpy, drawable, buffer, attrib_list);}\r
+  GLEEPFNGLXBINDTEXIMAGEEXTPROC GLeeFuncPtr_glXBindTexImageEXT=GLee_Lazy_glXBindTexImageEXT;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glXReleaseTexImageEXT\r
+#define GLEE_C_DEFINED_glXReleaseTexImageEXT\r
+  void __stdcall GLee_Lazy_glXReleaseTexImageEXT(Display * dpy, GLXDrawable drawable, int buffer)  {if (GLeeInit()) glXReleaseTexImageEXT(dpy, drawable, buffer);}\r
+  GLEEPFNGLXRELEASETEXIMAGEEXTPROC GLeeFuncPtr_glXReleaseTexImageEXT=GLee_Lazy_glXReleaseTexImageEXT;\r
+#endif\r
+#endif \r
+\r
+/* GLX_NV_present_video */\r
+\r
+#ifdef __GLEE_GLX_NV_present_video\r
+#endif \r
+\r
+/* GLX_NV_video_out */\r
+\r
+#ifdef __GLEE_GLX_NV_video_out\r
+#endif \r
+\r
+/* GLX_NV_swap_group */\r
+\r
+#ifdef __GLEE_GLX_NV_swap_group\r
+#endif \r
+\r
+/* GLX_EXT_scene_marker */\r
+\r
+#ifdef __GLEE_GLX_EXT_scene_marker\r
+#endif \r
+\r
+/* GLX_NV_video_output */\r
+\r
+#ifdef __GLEE_GLX_NV_video_output\r
+#ifndef GLEE_C_DEFINED_glXGetVideoDeviceNV\r
+#define GLEE_C_DEFINED_glXGetVideoDeviceNV\r
+  int __stdcall GLee_Lazy_glXGetVideoDeviceNV(Display * dpy, int screen, int numVideoDevices, GLXVideoDeviceNV * pVideoDevice)  {if (GLeeInit()) return glXGetVideoDeviceNV(dpy, screen, numVideoDevices, pVideoDevice); return (int)0;}\r
+  GLEEPFNGLXGETVIDEODEVICENVPROC GLeeFuncPtr_glXGetVideoDeviceNV=GLee_Lazy_glXGetVideoDeviceNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glXReleaseVideoDeviceNV\r
+#define GLEE_C_DEFINED_glXReleaseVideoDeviceNV\r
+  int __stdcall GLee_Lazy_glXReleaseVideoDeviceNV(Display * dpy, int screen, GLXVideoDeviceNV VideoDevice)  {if (GLeeInit()) return glXReleaseVideoDeviceNV(dpy, screen, VideoDevice); return (int)0;}\r
+  GLEEPFNGLXRELEASEVIDEODEVICENVPROC GLeeFuncPtr_glXReleaseVideoDeviceNV=GLee_Lazy_glXReleaseVideoDeviceNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glXBindVideoImageNV\r
+#define GLEE_C_DEFINED_glXBindVideoImageNV\r
+  int __stdcall GLee_Lazy_glXBindVideoImageNV(Display * dpy, GLXVideoDeviceNV VideoDevice, GLXPbuffer pbuf, int iVideoBuffer)  {if (GLeeInit()) return glXBindVideoImageNV(dpy, VideoDevice, pbuf, iVideoBuffer); return (int)0;}\r
+  GLEEPFNGLXBINDVIDEOIMAGENVPROC GLeeFuncPtr_glXBindVideoImageNV=GLee_Lazy_glXBindVideoImageNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glXReleaseVideoImageNV\r
+#define GLEE_C_DEFINED_glXReleaseVideoImageNV\r
+  int __stdcall GLee_Lazy_glXReleaseVideoImageNV(Display * dpy, GLXPbuffer pbuf)  {if (GLeeInit()) return glXReleaseVideoImageNV(dpy, pbuf); return (int)0;}\r
+  GLEEPFNGLXRELEASEVIDEOIMAGENVPROC GLeeFuncPtr_glXReleaseVideoImageNV=GLee_Lazy_glXReleaseVideoImageNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glXSendPbufferToVideoNV\r
+#define GLEE_C_DEFINED_glXSendPbufferToVideoNV\r
+  int __stdcall GLee_Lazy_glXSendPbufferToVideoNV(Display * dpy, GLXPbuffer pbuf, int iBufferType, unsigned long * pulCounterPbuffer, GLboolean bBlock)  {if (GLeeInit()) return glXSendPbufferToVideoNV(dpy, pbuf, iBufferType, pulCounterPbuffer, bBlock); return (int)0;}\r
+  GLEEPFNGLXSENDPBUFFERTOVIDEONVPROC GLeeFuncPtr_glXSendPbufferToVideoNV=GLee_Lazy_glXSendPbufferToVideoNV;\r
+#endif\r
+#ifndef GLEE_C_DEFINED_glXGetVideoInfoNV\r
+#define GLEE_C_DEFINED_glXGetVideoInfoNV\r
+  int __stdcall GLee_Lazy_glXGetVideoInfoNV(Display * dpy, int screen, GLXVideoDeviceNV VideoDevice, unsigned long * pulCounterOutputPbuffer, unsigned long * pulCounterOutputVideo)  {if (GLeeInit()) return glXGetVideoInfoNV(dpy, screen, VideoDevice, pulCounterOutputPbuffer, pulCounterOutputVideo); return (int)0;}\r
+  GLEEPFNGLXGETVIDEOINFONVPROC GLeeFuncPtr_glXGetVideoInfoNV=GLee_Lazy_glXGetVideoInfoNV;\r
+#endif\r
+#endif \r
+#endif /* end GLX */\r
+/*****************************************************************\r
+* Extension link functions\r
+*****************************************************************/\r
+\r
+GLuint __GLeeLink_GL_VERSION_1_2(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_VERSION_1_2\r
+    if ((GLeeFuncPtr_glBlendColor = (GLEEPFNGLBLENDCOLORPROC) __GLeeGetProcAddress("glBlendColor"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glBlendEquation = (GLEEPFNGLBLENDEQUATIONPROC) __GLeeGetProcAddress("glBlendEquation"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glDrawRangeElements = (GLEEPFNGLDRAWRANGEELEMENTSPROC) __GLeeGetProcAddress("glDrawRangeElements"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glColorTable = (GLEEPFNGLCOLORTABLEPROC) __GLeeGetProcAddress("glColorTable"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glColorTableParameterfv = (GLEEPFNGLCOLORTABLEPARAMETERFVPROC) __GLeeGetProcAddress("glColorTableParameterfv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glColorTableParameteriv = (GLEEPFNGLCOLORTABLEPARAMETERIVPROC) __GLeeGetProcAddress("glColorTableParameteriv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glCopyColorTable = (GLEEPFNGLCOPYCOLORTABLEPROC) __GLeeGetProcAddress("glCopyColorTable"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetColorTable = (GLEEPFNGLGETCOLORTABLEPROC) __GLeeGetProcAddress("glGetColorTable"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetColorTableParameterfv = (GLEEPFNGLGETCOLORTABLEPARAMETERFVPROC) __GLeeGetProcAddress("glGetColorTableParameterfv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetColorTableParameteriv = (GLEEPFNGLGETCOLORTABLEPARAMETERIVPROC) __GLeeGetProcAddress("glGetColorTableParameteriv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glColorSubTable = (GLEEPFNGLCOLORSUBTABLEPROC) __GLeeGetProcAddress("glColorSubTable"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glCopyColorSubTable = (GLEEPFNGLCOPYCOLORSUBTABLEPROC) __GLeeGetProcAddress("glCopyColorSubTable"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glConvolutionFilter1D = (GLEEPFNGLCONVOLUTIONFILTER1DPROC) __GLeeGetProcAddress("glConvolutionFilter1D"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glConvolutionFilter2D = (GLEEPFNGLCONVOLUTIONFILTER2DPROC) __GLeeGetProcAddress("glConvolutionFilter2D"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glConvolutionParameterf = (GLEEPFNGLCONVOLUTIONPARAMETERFPROC) __GLeeGetProcAddress("glConvolutionParameterf"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glConvolutionParameterfv = (GLEEPFNGLCONVOLUTIONPARAMETERFVPROC) __GLeeGetProcAddress("glConvolutionParameterfv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glConvolutionParameteri = (GLEEPFNGLCONVOLUTIONPARAMETERIPROC) __GLeeGetProcAddress("glConvolutionParameteri"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glConvolutionParameteriv = (GLEEPFNGLCONVOLUTIONPARAMETERIVPROC) __GLeeGetProcAddress("glConvolutionParameteriv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glCopyConvolutionFilter1D = (GLEEPFNGLCOPYCONVOLUTIONFILTER1DPROC) __GLeeGetProcAddress("glCopyConvolutionFilter1D"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glCopyConvolutionFilter2D = (GLEEPFNGLCOPYCONVOLUTIONFILTER2DPROC) __GLeeGetProcAddress("glCopyConvolutionFilter2D"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetConvolutionFilter = (GLEEPFNGLGETCONVOLUTIONFILTERPROC) __GLeeGetProcAddress("glGetConvolutionFilter"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetConvolutionParameterfv = (GLEEPFNGLGETCONVOLUTIONPARAMETERFVPROC) __GLeeGetProcAddress("glGetConvolutionParameterfv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetConvolutionParameteriv = (GLEEPFNGLGETCONVOLUTIONPARAMETERIVPROC) __GLeeGetProcAddress("glGetConvolutionParameteriv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetSeparableFilter = (GLEEPFNGLGETSEPARABLEFILTERPROC) __GLeeGetProcAddress("glGetSeparableFilter"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glSeparableFilter2D = (GLEEPFNGLSEPARABLEFILTER2DPROC) __GLeeGetProcAddress("glSeparableFilter2D"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetHistogram = (GLEEPFNGLGETHISTOGRAMPROC) __GLeeGetProcAddress("glGetHistogram"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetHistogramParameterfv = (GLEEPFNGLGETHISTOGRAMPARAMETERFVPROC) __GLeeGetProcAddress("glGetHistogramParameterfv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetHistogramParameteriv = (GLEEPFNGLGETHISTOGRAMPARAMETERIVPROC) __GLeeGetProcAddress("glGetHistogramParameteriv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetMinmax = (GLEEPFNGLGETMINMAXPROC) __GLeeGetProcAddress("glGetMinmax"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetMinmaxParameterfv = (GLEEPFNGLGETMINMAXPARAMETERFVPROC) __GLeeGetProcAddress("glGetMinmaxParameterfv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetMinmaxParameteriv = (GLEEPFNGLGETMINMAXPARAMETERIVPROC) __GLeeGetProcAddress("glGetMinmaxParameteriv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glHistogram = (GLEEPFNGLHISTOGRAMPROC) __GLeeGetProcAddress("glHistogram"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMinmax = (GLEEPFNGLMINMAXPROC) __GLeeGetProcAddress("glMinmax"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glResetHistogram = (GLEEPFNGLRESETHISTOGRAMPROC) __GLeeGetProcAddress("glResetHistogram"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glResetMinmax = (GLEEPFNGLRESETMINMAXPROC) __GLeeGetProcAddress("glResetMinmax"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTexImage3D = (GLEEPFNGLTEXIMAGE3DPROC) __GLeeGetProcAddress("glTexImage3D"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTexSubImage3D = (GLEEPFNGLTEXSUBIMAGE3DPROC) __GLeeGetProcAddress("glTexSubImage3D"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glCopyTexSubImage3D = (GLEEPFNGLCOPYTEXSUBIMAGE3DPROC) __GLeeGetProcAddress("glCopyTexSubImage3D"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==38) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_ARB_imaging(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_VERSION_1_3(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_VERSION_1_3\r
+    if ((GLeeFuncPtr_glActiveTexture = (GLEEPFNGLACTIVETEXTUREPROC) __GLeeGetProcAddress("glActiveTexture"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glClientActiveTexture = (GLEEPFNGLCLIENTACTIVETEXTUREPROC) __GLeeGetProcAddress("glClientActiveTexture"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord1d = (GLEEPFNGLMULTITEXCOORD1DPROC) __GLeeGetProcAddress("glMultiTexCoord1d"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord1dv = (GLEEPFNGLMULTITEXCOORD1DVPROC) __GLeeGetProcAddress("glMultiTexCoord1dv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord1f = (GLEEPFNGLMULTITEXCOORD1FPROC) __GLeeGetProcAddress("glMultiTexCoord1f"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord1fv = (GLEEPFNGLMULTITEXCOORD1FVPROC) __GLeeGetProcAddress("glMultiTexCoord1fv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord1i = (GLEEPFNGLMULTITEXCOORD1IPROC) __GLeeGetProcAddress("glMultiTexCoord1i"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord1iv = (GLEEPFNGLMULTITEXCOORD1IVPROC) __GLeeGetProcAddress("glMultiTexCoord1iv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord1s = (GLEEPFNGLMULTITEXCOORD1SPROC) __GLeeGetProcAddress("glMultiTexCoord1s"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord1sv = (GLEEPFNGLMULTITEXCOORD1SVPROC) __GLeeGetProcAddress("glMultiTexCoord1sv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord2d = (GLEEPFNGLMULTITEXCOORD2DPROC) __GLeeGetProcAddress("glMultiTexCoord2d"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord2dv = (GLEEPFNGLMULTITEXCOORD2DVPROC) __GLeeGetProcAddress("glMultiTexCoord2dv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord2f = (GLEEPFNGLMULTITEXCOORD2FPROC) __GLeeGetProcAddress("glMultiTexCoord2f"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord2fv = (GLEEPFNGLMULTITEXCOORD2FVPROC) __GLeeGetProcAddress("glMultiTexCoord2fv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord2i = (GLEEPFNGLMULTITEXCOORD2IPROC) __GLeeGetProcAddress("glMultiTexCoord2i"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord2iv = (GLEEPFNGLMULTITEXCOORD2IVPROC) __GLeeGetProcAddress("glMultiTexCoord2iv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord2s = (GLEEPFNGLMULTITEXCOORD2SPROC) __GLeeGetProcAddress("glMultiTexCoord2s"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord2sv = (GLEEPFNGLMULTITEXCOORD2SVPROC) __GLeeGetProcAddress("glMultiTexCoord2sv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord3d = (GLEEPFNGLMULTITEXCOORD3DPROC) __GLeeGetProcAddress("glMultiTexCoord3d"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord3dv = (GLEEPFNGLMULTITEXCOORD3DVPROC) __GLeeGetProcAddress("glMultiTexCoord3dv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord3f = (GLEEPFNGLMULTITEXCOORD3FPROC) __GLeeGetProcAddress("glMultiTexCoord3f"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord3fv = (GLEEPFNGLMULTITEXCOORD3FVPROC) __GLeeGetProcAddress("glMultiTexCoord3fv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord3i = (GLEEPFNGLMULTITEXCOORD3IPROC) __GLeeGetProcAddress("glMultiTexCoord3i"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord3iv = (GLEEPFNGLMULTITEXCOORD3IVPROC) __GLeeGetProcAddress("glMultiTexCoord3iv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord3s = (GLEEPFNGLMULTITEXCOORD3SPROC) __GLeeGetProcAddress("glMultiTexCoord3s"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord3sv = (GLEEPFNGLMULTITEXCOORD3SVPROC) __GLeeGetProcAddress("glMultiTexCoord3sv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord4d = (GLEEPFNGLMULTITEXCOORD4DPROC) __GLeeGetProcAddress("glMultiTexCoord4d"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord4dv = (GLEEPFNGLMULTITEXCOORD4DVPROC) __GLeeGetProcAddress("glMultiTexCoord4dv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord4f = (GLEEPFNGLMULTITEXCOORD4FPROC) __GLeeGetProcAddress("glMultiTexCoord4f"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord4fv = (GLEEPFNGLMULTITEXCOORD4FVPROC) __GLeeGetProcAddress("glMultiTexCoord4fv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord4i = (GLEEPFNGLMULTITEXCOORD4IPROC) __GLeeGetProcAddress("glMultiTexCoord4i"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord4iv = (GLEEPFNGLMULTITEXCOORD4IVPROC) __GLeeGetProcAddress("glMultiTexCoord4iv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord4s = (GLEEPFNGLMULTITEXCOORD4SPROC) __GLeeGetProcAddress("glMultiTexCoord4s"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord4sv = (GLEEPFNGLMULTITEXCOORD4SVPROC) __GLeeGetProcAddress("glMultiTexCoord4sv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glLoadTransposeMatrixf = (GLEEPFNGLLOADTRANSPOSEMATRIXFPROC) __GLeeGetProcAddress("glLoadTransposeMatrixf"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glLoadTransposeMatrixd = (GLEEPFNGLLOADTRANSPOSEMATRIXDPROC) __GLeeGetProcAddress("glLoadTransposeMatrixd"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultTransposeMatrixf = (GLEEPFNGLMULTTRANSPOSEMATRIXFPROC) __GLeeGetProcAddress("glMultTransposeMatrixf"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultTransposeMatrixd = (GLEEPFNGLMULTTRANSPOSEMATRIXDPROC) __GLeeGetProcAddress("glMultTransposeMatrixd"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glSampleCoverage = (GLEEPFNGLSAMPLECOVERAGEPROC) __GLeeGetProcAddress("glSampleCoverage"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glCompressedTexImage3D = (GLEEPFNGLCOMPRESSEDTEXIMAGE3DPROC) __GLeeGetProcAddress("glCompressedTexImage3D"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glCompressedTexImage2D = (GLEEPFNGLCOMPRESSEDTEXIMAGE2DPROC) __GLeeGetProcAddress("glCompressedTexImage2D"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glCompressedTexImage1D = (GLEEPFNGLCOMPRESSEDTEXIMAGE1DPROC) __GLeeGetProcAddress("glCompressedTexImage1D"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glCompressedTexSubImage3D = (GLEEPFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) __GLeeGetProcAddress("glCompressedTexSubImage3D"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glCompressedTexSubImage2D = (GLEEPFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) __GLeeGetProcAddress("glCompressedTexSubImage2D"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glCompressedTexSubImage1D = (GLEEPFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) __GLeeGetProcAddress("glCompressedTexSubImage1D"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetCompressedTexImage = (GLEEPFNGLGETCOMPRESSEDTEXIMAGEPROC) __GLeeGetProcAddress("glGetCompressedTexImage"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==46) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_VERSION_1_4(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_VERSION_1_4\r
+    if ((GLeeFuncPtr_glBlendFuncSeparate = (GLEEPFNGLBLENDFUNCSEPARATEPROC) __GLeeGetProcAddress("glBlendFuncSeparate"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFogCoordf = (GLEEPFNGLFOGCOORDFPROC) __GLeeGetProcAddress("glFogCoordf"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFogCoordfv = (GLEEPFNGLFOGCOORDFVPROC) __GLeeGetProcAddress("glFogCoordfv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFogCoordd = (GLEEPFNGLFOGCOORDDPROC) __GLeeGetProcAddress("glFogCoordd"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFogCoorddv = (GLEEPFNGLFOGCOORDDVPROC) __GLeeGetProcAddress("glFogCoorddv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFogCoordPointer = (GLEEPFNGLFOGCOORDPOINTERPROC) __GLeeGetProcAddress("glFogCoordPointer"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiDrawArrays = (GLEEPFNGLMULTIDRAWARRAYSPROC) __GLeeGetProcAddress("glMultiDrawArrays"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiDrawElements = (GLEEPFNGLMULTIDRAWELEMENTSPROC) __GLeeGetProcAddress("glMultiDrawElements"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glPointParameterf = (GLEEPFNGLPOINTPARAMETERFPROC) __GLeeGetProcAddress("glPointParameterf"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glPointParameterfv = (GLEEPFNGLPOINTPARAMETERFVPROC) __GLeeGetProcAddress("glPointParameterfv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glPointParameteri = (GLEEPFNGLPOINTPARAMETERIPROC) __GLeeGetProcAddress("glPointParameteri"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glPointParameteriv = (GLEEPFNGLPOINTPARAMETERIVPROC) __GLeeGetProcAddress("glPointParameteriv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glSecondaryColor3b = (GLEEPFNGLSECONDARYCOLOR3BPROC) __GLeeGetProcAddress("glSecondaryColor3b"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glSecondaryColor3bv = (GLEEPFNGLSECONDARYCOLOR3BVPROC) __GLeeGetProcAddress("glSecondaryColor3bv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glSecondaryColor3d = (GLEEPFNGLSECONDARYCOLOR3DPROC) __GLeeGetProcAddress("glSecondaryColor3d"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glSecondaryColor3dv = (GLEEPFNGLSECONDARYCOLOR3DVPROC) __GLeeGetProcAddress("glSecondaryColor3dv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glSecondaryColor3f = (GLEEPFNGLSECONDARYCOLOR3FPROC) __GLeeGetProcAddress("glSecondaryColor3f"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glSecondaryColor3fv = (GLEEPFNGLSECONDARYCOLOR3FVPROC) __GLeeGetProcAddress("glSecondaryColor3fv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glSecondaryColor3i = (GLEEPFNGLSECONDARYCOLOR3IPROC) __GLeeGetProcAddress("glSecondaryColor3i"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glSecondaryColor3iv = (GLEEPFNGLSECONDARYCOLOR3IVPROC) __GLeeGetProcAddress("glSecondaryColor3iv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glSecondaryColor3s = (GLEEPFNGLSECONDARYCOLOR3SPROC) __GLeeGetProcAddress("glSecondaryColor3s"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glSecondaryColor3sv = (GLEEPFNGLSECONDARYCOLOR3SVPROC) __GLeeGetProcAddress("glSecondaryColor3sv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glSecondaryColor3ub = (GLEEPFNGLSECONDARYCOLOR3UBPROC) __GLeeGetProcAddress("glSecondaryColor3ub"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glSecondaryColor3ubv = (GLEEPFNGLSECONDARYCOLOR3UBVPROC) __GLeeGetProcAddress("glSecondaryColor3ubv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glSecondaryColor3ui = (GLEEPFNGLSECONDARYCOLOR3UIPROC) __GLeeGetProcAddress("glSecondaryColor3ui"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glSecondaryColor3uiv = (GLEEPFNGLSECONDARYCOLOR3UIVPROC) __GLeeGetProcAddress("glSecondaryColor3uiv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glSecondaryColor3us = (GLEEPFNGLSECONDARYCOLOR3USPROC) __GLeeGetProcAddress("glSecondaryColor3us"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glSecondaryColor3usv = (GLEEPFNGLSECONDARYCOLOR3USVPROC) __GLeeGetProcAddress("glSecondaryColor3usv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glSecondaryColorPointer = (GLEEPFNGLSECONDARYCOLORPOINTERPROC) __GLeeGetProcAddress("glSecondaryColorPointer"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glWindowPos2d = (GLEEPFNGLWINDOWPOS2DPROC) __GLeeGetProcAddress("glWindowPos2d"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glWindowPos2dv = (GLEEPFNGLWINDOWPOS2DVPROC) __GLeeGetProcAddress("glWindowPos2dv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glWindowPos2f = (GLEEPFNGLWINDOWPOS2FPROC) __GLeeGetProcAddress("glWindowPos2f"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glWindowPos2fv = (GLEEPFNGLWINDOWPOS2FVPROC) __GLeeGetProcAddress("glWindowPos2fv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glWindowPos2i = (GLEEPFNGLWINDOWPOS2IPROC) __GLeeGetProcAddress("glWindowPos2i"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glWindowPos2iv = (GLEEPFNGLWINDOWPOS2IVPROC) __GLeeGetProcAddress("glWindowPos2iv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glWindowPos2s = (GLEEPFNGLWINDOWPOS2SPROC) __GLeeGetProcAddress("glWindowPos2s"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glWindowPos2sv = (GLEEPFNGLWINDOWPOS2SVPROC) __GLeeGetProcAddress("glWindowPos2sv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glWindowPos3d = (GLEEPFNGLWINDOWPOS3DPROC) __GLeeGetProcAddress("glWindowPos3d"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glWindowPos3dv = (GLEEPFNGLWINDOWPOS3DVPROC) __GLeeGetProcAddress("glWindowPos3dv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glWindowPos3f = (GLEEPFNGLWINDOWPOS3FPROC) __GLeeGetProcAddress("glWindowPos3f"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glWindowPos3fv = (GLEEPFNGLWINDOWPOS3FVPROC) __GLeeGetProcAddress("glWindowPos3fv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glWindowPos3i = (GLEEPFNGLWINDOWPOS3IPROC) __GLeeGetProcAddress("glWindowPos3i"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glWindowPos3iv = (GLEEPFNGLWINDOWPOS3IVPROC) __GLeeGetProcAddress("glWindowPos3iv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glWindowPos3s = (GLEEPFNGLWINDOWPOS3SPROC) __GLeeGetProcAddress("glWindowPos3s"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glWindowPos3sv = (GLEEPFNGLWINDOWPOS3SVPROC) __GLeeGetProcAddress("glWindowPos3sv"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==45) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_VERSION_1_5(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_VERSION_1_5\r
+    if ((GLeeFuncPtr_glGenQueries = (GLEEPFNGLGENQUERIESPROC) __GLeeGetProcAddress("glGenQueries"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glDeleteQueries = (GLEEPFNGLDELETEQUERIESPROC) __GLeeGetProcAddress("glDeleteQueries"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glIsQuery = (GLEEPFNGLISQUERYPROC) __GLeeGetProcAddress("glIsQuery"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glBeginQuery = (GLEEPFNGLBEGINQUERYPROC) __GLeeGetProcAddress("glBeginQuery"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glEndQuery = (GLEEPFNGLENDQUERYPROC) __GLeeGetProcAddress("glEndQuery"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetQueryiv = (GLEEPFNGLGETQUERYIVPROC) __GLeeGetProcAddress("glGetQueryiv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetQueryObjectiv = (GLEEPFNGLGETQUERYOBJECTIVPROC) __GLeeGetProcAddress("glGetQueryObjectiv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetQueryObjectuiv = (GLEEPFNGLGETQUERYOBJECTUIVPROC) __GLeeGetProcAddress("glGetQueryObjectuiv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glBindBuffer = (GLEEPFNGLBINDBUFFERPROC) __GLeeGetProcAddress("glBindBuffer"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glDeleteBuffers = (GLEEPFNGLDELETEBUFFERSPROC) __GLeeGetProcAddress("glDeleteBuffers"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGenBuffers = (GLEEPFNGLGENBUFFERSPROC) __GLeeGetProcAddress("glGenBuffers"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glIsBuffer = (GLEEPFNGLISBUFFERPROC) __GLeeGetProcAddress("glIsBuffer"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glBufferData = (GLEEPFNGLBUFFERDATAPROC) __GLeeGetProcAddress("glBufferData"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glBufferSubData = (GLEEPFNGLBUFFERSUBDATAPROC) __GLeeGetProcAddress("glBufferSubData"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetBufferSubData = (GLEEPFNGLGETBUFFERSUBDATAPROC) __GLeeGetProcAddress("glGetBufferSubData"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMapBuffer = (GLEEPFNGLMAPBUFFERPROC) __GLeeGetProcAddress("glMapBuffer"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUnmapBuffer = (GLEEPFNGLUNMAPBUFFERPROC) __GLeeGetProcAddress("glUnmapBuffer"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetBufferParameteriv = (GLEEPFNGLGETBUFFERPARAMETERIVPROC) __GLeeGetProcAddress("glGetBufferParameteriv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetBufferPointerv = (GLEEPFNGLGETBUFFERPOINTERVPROC) __GLeeGetProcAddress("glGetBufferPointerv"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==19) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_VERSION_2_0(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_VERSION_2_0\r
+    if ((GLeeFuncPtr_glBlendEquationSeparate = (GLEEPFNGLBLENDEQUATIONSEPARATEPROC) __GLeeGetProcAddress("glBlendEquationSeparate"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glDrawBuffers = (GLEEPFNGLDRAWBUFFERSPROC) __GLeeGetProcAddress("glDrawBuffers"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glStencilOpSeparate = (GLEEPFNGLSTENCILOPSEPARATEPROC) __GLeeGetProcAddress("glStencilOpSeparate"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glStencilFuncSeparate = (GLEEPFNGLSTENCILFUNCSEPARATEPROC) __GLeeGetProcAddress("glStencilFuncSeparate"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glStencilMaskSeparate = (GLEEPFNGLSTENCILMASKSEPARATEPROC) __GLeeGetProcAddress("glStencilMaskSeparate"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glAttachShader = (GLEEPFNGLATTACHSHADERPROC) __GLeeGetProcAddress("glAttachShader"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glBindAttribLocation = (GLEEPFNGLBINDATTRIBLOCATIONPROC) __GLeeGetProcAddress("glBindAttribLocation"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glCompileShader = (GLEEPFNGLCOMPILESHADERPROC) __GLeeGetProcAddress("glCompileShader"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glCreateProgram = (GLEEPFNGLCREATEPROGRAMPROC) __GLeeGetProcAddress("glCreateProgram"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glCreateShader = (GLEEPFNGLCREATESHADERPROC) __GLeeGetProcAddress("glCreateShader"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glDeleteProgram = (GLEEPFNGLDELETEPROGRAMPROC) __GLeeGetProcAddress("glDeleteProgram"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glDeleteShader = (GLEEPFNGLDELETESHADERPROC) __GLeeGetProcAddress("glDeleteShader"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glDetachShader = (GLEEPFNGLDETACHSHADERPROC) __GLeeGetProcAddress("glDetachShader"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glDisableVertexAttribArray = (GLEEPFNGLDISABLEVERTEXATTRIBARRAYPROC) __GLeeGetProcAddress("glDisableVertexAttribArray"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glEnableVertexAttribArray = (GLEEPFNGLENABLEVERTEXATTRIBARRAYPROC) __GLeeGetProcAddress("glEnableVertexAttribArray"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetActiveAttrib = (GLEEPFNGLGETACTIVEATTRIBPROC) __GLeeGetProcAddress("glGetActiveAttrib"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetActiveUniform = (GLEEPFNGLGETACTIVEUNIFORMPROC) __GLeeGetProcAddress("glGetActiveUniform"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetAttachedShaders = (GLEEPFNGLGETATTACHEDSHADERSPROC) __GLeeGetProcAddress("glGetAttachedShaders"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetAttribLocation = (GLEEPFNGLGETATTRIBLOCATIONPROC) __GLeeGetProcAddress("glGetAttribLocation"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetProgramiv = (GLEEPFNGLGETPROGRAMIVPROC) __GLeeGetProcAddress("glGetProgramiv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetProgramInfoLog = (GLEEPFNGLGETPROGRAMINFOLOGPROC) __GLeeGetProcAddress("glGetProgramInfoLog"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetShaderiv = (GLEEPFNGLGETSHADERIVPROC) __GLeeGetProcAddress("glGetShaderiv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetShaderInfoLog = (GLEEPFNGLGETSHADERINFOLOGPROC) __GLeeGetProcAddress("glGetShaderInfoLog"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetShaderSource = (GLEEPFNGLGETSHADERSOURCEPROC) __GLeeGetProcAddress("glGetShaderSource"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetUniformLocation = (GLEEPFNGLGETUNIFORMLOCATIONPROC) __GLeeGetProcAddress("glGetUniformLocation"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetUniformfv = (GLEEPFNGLGETUNIFORMFVPROC) __GLeeGetProcAddress("glGetUniformfv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetUniformiv = (GLEEPFNGLGETUNIFORMIVPROC) __GLeeGetProcAddress("glGetUniformiv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetVertexAttribdv = (GLEEPFNGLGETVERTEXATTRIBDVPROC) __GLeeGetProcAddress("glGetVertexAttribdv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetVertexAttribfv = (GLEEPFNGLGETVERTEXATTRIBFVPROC) __GLeeGetProcAddress("glGetVertexAttribfv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetVertexAttribiv = (GLEEPFNGLGETVERTEXATTRIBIVPROC) __GLeeGetProcAddress("glGetVertexAttribiv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetVertexAttribPointerv = (GLEEPFNGLGETVERTEXATTRIBPOINTERVPROC) __GLeeGetProcAddress("glGetVertexAttribPointerv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glIsProgram = (GLEEPFNGLISPROGRAMPROC) __GLeeGetProcAddress("glIsProgram"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glIsShader = (GLEEPFNGLISSHADERPROC) __GLeeGetProcAddress("glIsShader"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glLinkProgram = (GLEEPFNGLLINKPROGRAMPROC) __GLeeGetProcAddress("glLinkProgram"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glShaderSource = (GLEEPFNGLSHADERSOURCEPROC) __GLeeGetProcAddress("glShaderSource"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUseProgram = (GLEEPFNGLUSEPROGRAMPROC) __GLeeGetProcAddress("glUseProgram"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUniform1f = (GLEEPFNGLUNIFORM1FPROC) __GLeeGetProcAddress("glUniform1f"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUniform2f = (GLEEPFNGLUNIFORM2FPROC) __GLeeGetProcAddress("glUniform2f"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUniform3f = (GLEEPFNGLUNIFORM3FPROC) __GLeeGetProcAddress("glUniform3f"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUniform4f = (GLEEPFNGLUNIFORM4FPROC) __GLeeGetProcAddress("glUniform4f"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUniform1i = (GLEEPFNGLUNIFORM1IPROC) __GLeeGetProcAddress("glUniform1i"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUniform2i = (GLEEPFNGLUNIFORM2IPROC) __GLeeGetProcAddress("glUniform2i"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUniform3i = (GLEEPFNGLUNIFORM3IPROC) __GLeeGetProcAddress("glUniform3i"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUniform4i = (GLEEPFNGLUNIFORM4IPROC) __GLeeGetProcAddress("glUniform4i"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUniform1fv = (GLEEPFNGLUNIFORM1FVPROC) __GLeeGetProcAddress("glUniform1fv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUniform2fv = (GLEEPFNGLUNIFORM2FVPROC) __GLeeGetProcAddress("glUniform2fv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUniform3fv = (GLEEPFNGLUNIFORM3FVPROC) __GLeeGetProcAddress("glUniform3fv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUniform4fv = (GLEEPFNGLUNIFORM4FVPROC) __GLeeGetProcAddress("glUniform4fv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUniform1iv = (GLEEPFNGLUNIFORM1IVPROC) __GLeeGetProcAddress("glUniform1iv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUniform2iv = (GLEEPFNGLUNIFORM2IVPROC) __GLeeGetProcAddress("glUniform2iv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUniform3iv = (GLEEPFNGLUNIFORM3IVPROC) __GLeeGetProcAddress("glUniform3iv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUniform4iv = (GLEEPFNGLUNIFORM4IVPROC) __GLeeGetProcAddress("glUniform4iv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUniformMatrix2fv = (GLEEPFNGLUNIFORMMATRIX2FVPROC) __GLeeGetProcAddress("glUniformMatrix2fv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUniformMatrix3fv = (GLEEPFNGLUNIFORMMATRIX3FVPROC) __GLeeGetProcAddress("glUniformMatrix3fv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUniformMatrix4fv = (GLEEPFNGLUNIFORMMATRIX4FVPROC) __GLeeGetProcAddress("glUniformMatrix4fv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glValidateProgram = (GLEEPFNGLVALIDATEPROGRAMPROC) __GLeeGetProcAddress("glValidateProgram"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib1d = (GLEEPFNGLVERTEXATTRIB1DPROC) __GLeeGetProcAddress("glVertexAttrib1d"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib1dv = (GLEEPFNGLVERTEXATTRIB1DVPROC) __GLeeGetProcAddress("glVertexAttrib1dv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib1f = (GLEEPFNGLVERTEXATTRIB1FPROC) __GLeeGetProcAddress("glVertexAttrib1f"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib1fv = (GLEEPFNGLVERTEXATTRIB1FVPROC) __GLeeGetProcAddress("glVertexAttrib1fv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib1s = (GLEEPFNGLVERTEXATTRIB1SPROC) __GLeeGetProcAddress("glVertexAttrib1s"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib1sv = (GLEEPFNGLVERTEXATTRIB1SVPROC) __GLeeGetProcAddress("glVertexAttrib1sv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib2d = (GLEEPFNGLVERTEXATTRIB2DPROC) __GLeeGetProcAddress("glVertexAttrib2d"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib2dv = (GLEEPFNGLVERTEXATTRIB2DVPROC) __GLeeGetProcAddress("glVertexAttrib2dv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib2f = (GLEEPFNGLVERTEXATTRIB2FPROC) __GLeeGetProcAddress("glVertexAttrib2f"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib2fv = (GLEEPFNGLVERTEXATTRIB2FVPROC) __GLeeGetProcAddress("glVertexAttrib2fv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib2s = (GLEEPFNGLVERTEXATTRIB2SPROC) __GLeeGetProcAddress("glVertexAttrib2s"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib2sv = (GLEEPFNGLVERTEXATTRIB2SVPROC) __GLeeGetProcAddress("glVertexAttrib2sv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib3d = (GLEEPFNGLVERTEXATTRIB3DPROC) __GLeeGetProcAddress("glVertexAttrib3d"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib3dv = (GLEEPFNGLVERTEXATTRIB3DVPROC) __GLeeGetProcAddress("glVertexAttrib3dv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib3f = (GLEEPFNGLVERTEXATTRIB3FPROC) __GLeeGetProcAddress("glVertexAttrib3f"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib3fv = (GLEEPFNGLVERTEXATTRIB3FVPROC) __GLeeGetProcAddress("glVertexAttrib3fv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib3s = (GLEEPFNGLVERTEXATTRIB3SPROC) __GLeeGetProcAddress("glVertexAttrib3s"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib3sv = (GLEEPFNGLVERTEXATTRIB3SVPROC) __GLeeGetProcAddress("glVertexAttrib3sv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib4Nbv = (GLEEPFNGLVERTEXATTRIB4NBVPROC) __GLeeGetProcAddress("glVertexAttrib4Nbv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib4Niv = (GLEEPFNGLVERTEXATTRIB4NIVPROC) __GLeeGetProcAddress("glVertexAttrib4Niv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib4Nsv = (GLEEPFNGLVERTEXATTRIB4NSVPROC) __GLeeGetProcAddress("glVertexAttrib4Nsv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib4Nub = (GLEEPFNGLVERTEXATTRIB4NUBPROC) __GLeeGetProcAddress("glVertexAttrib4Nub"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib4Nubv = (GLEEPFNGLVERTEXATTRIB4NUBVPROC) __GLeeGetProcAddress("glVertexAttrib4Nubv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib4Nuiv = (GLEEPFNGLVERTEXATTRIB4NUIVPROC) __GLeeGetProcAddress("glVertexAttrib4Nuiv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib4Nusv = (GLEEPFNGLVERTEXATTRIB4NUSVPROC) __GLeeGetProcAddress("glVertexAttrib4Nusv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib4bv = (GLEEPFNGLVERTEXATTRIB4BVPROC) __GLeeGetProcAddress("glVertexAttrib4bv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib4d = (GLEEPFNGLVERTEXATTRIB4DPROC) __GLeeGetProcAddress("glVertexAttrib4d"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib4dv = (GLEEPFNGLVERTEXATTRIB4DVPROC) __GLeeGetProcAddress("glVertexAttrib4dv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib4f = (GLEEPFNGLVERTEXATTRIB4FPROC) __GLeeGetProcAddress("glVertexAttrib4f"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib4fv = (GLEEPFNGLVERTEXATTRIB4FVPROC) __GLeeGetProcAddress("glVertexAttrib4fv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib4iv = (GLEEPFNGLVERTEXATTRIB4IVPROC) __GLeeGetProcAddress("glVertexAttrib4iv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib4s = (GLEEPFNGLVERTEXATTRIB4SPROC) __GLeeGetProcAddress("glVertexAttrib4s"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib4sv = (GLEEPFNGLVERTEXATTRIB4SVPROC) __GLeeGetProcAddress("glVertexAttrib4sv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib4ubv = (GLEEPFNGLVERTEXATTRIB4UBVPROC) __GLeeGetProcAddress("glVertexAttrib4ubv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib4uiv = (GLEEPFNGLVERTEXATTRIB4UIVPROC) __GLeeGetProcAddress("glVertexAttrib4uiv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib4usv = (GLEEPFNGLVERTEXATTRIB4USVPROC) __GLeeGetProcAddress("glVertexAttrib4usv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttribPointer = (GLEEPFNGLVERTEXATTRIBPOINTERPROC) __GLeeGetProcAddress("glVertexAttribPointer"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==93) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_VERSION_2_1(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_VERSION_2_1\r
+    if ((GLeeFuncPtr_glUniformMatrix2x3fv = (GLEEPFNGLUNIFORMMATRIX2X3FVPROC) __GLeeGetProcAddress("glUniformMatrix2x3fv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUniformMatrix3x2fv = (GLEEPFNGLUNIFORMMATRIX3X2FVPROC) __GLeeGetProcAddress("glUniformMatrix3x2fv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUniformMatrix2x4fv = (GLEEPFNGLUNIFORMMATRIX2X4FVPROC) __GLeeGetProcAddress("glUniformMatrix2x4fv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUniformMatrix4x2fv = (GLEEPFNGLUNIFORMMATRIX4X2FVPROC) __GLeeGetProcAddress("glUniformMatrix4x2fv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUniformMatrix3x4fv = (GLEEPFNGLUNIFORMMATRIX3X4FVPROC) __GLeeGetProcAddress("glUniformMatrix3x4fv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUniformMatrix4x3fv = (GLEEPFNGLUNIFORMMATRIX4X3FVPROC) __GLeeGetProcAddress("glUniformMatrix4x3fv"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==6) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_VERSION_3_0(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_VERSION_3_0\r
+    if ((GLeeFuncPtr_glColorMaski = (GLEEPFNGLCOLORMASKIPROC) __GLeeGetProcAddress("glColorMaski"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetBooleani_v = (GLEEPFNGLGETBOOLEANI_VPROC) __GLeeGetProcAddress("glGetBooleani_v"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetIntegeri_v = (GLEEPFNGLGETINTEGERI_VPROC) __GLeeGetProcAddress("glGetIntegeri_v"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glEnablei = (GLEEPFNGLENABLEIPROC) __GLeeGetProcAddress("glEnablei"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glDisablei = (GLEEPFNGLDISABLEIPROC) __GLeeGetProcAddress("glDisablei"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glIsEnabledi = (GLEEPFNGLISENABLEDIPROC) __GLeeGetProcAddress("glIsEnabledi"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glBeginTransformFeedback = (GLEEPFNGLBEGINTRANSFORMFEEDBACKPROC) __GLeeGetProcAddress("glBeginTransformFeedback"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glEndTransformFeedback = (GLEEPFNGLENDTRANSFORMFEEDBACKPROC) __GLeeGetProcAddress("glEndTransformFeedback"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glBindBufferRange = (GLEEPFNGLBINDBUFFERRANGEPROC) __GLeeGetProcAddress("glBindBufferRange"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glBindBufferBase = (GLEEPFNGLBINDBUFFERBASEPROC) __GLeeGetProcAddress("glBindBufferBase"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTransformFeedbackVaryings = (GLEEPFNGLTRANSFORMFEEDBACKVARYINGSPROC) __GLeeGetProcAddress("glTransformFeedbackVaryings"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetTransformFeedbackVarying = (GLEEPFNGLGETTRANSFORMFEEDBACKVARYINGPROC) __GLeeGetProcAddress("glGetTransformFeedbackVarying"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glClampColor = (GLEEPFNGLCLAMPCOLORPROC) __GLeeGetProcAddress("glClampColor"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glBeginConditionalRender = (GLEEPFNGLBEGINCONDITIONALRENDERPROC) __GLeeGetProcAddress("glBeginConditionalRender"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glEndConditionalRender = (GLEEPFNGLENDCONDITIONALRENDERPROC) __GLeeGetProcAddress("glEndConditionalRender"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttribI1i = (GLEEPFNGLVERTEXATTRIBI1IPROC) __GLeeGetProcAddress("glVertexAttribI1i"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttribI2i = (GLEEPFNGLVERTEXATTRIBI2IPROC) __GLeeGetProcAddress("glVertexAttribI2i"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttribI3i = (GLEEPFNGLVERTEXATTRIBI3IPROC) __GLeeGetProcAddress("glVertexAttribI3i"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttribI4i = (GLEEPFNGLVERTEXATTRIBI4IPROC) __GLeeGetProcAddress("glVertexAttribI4i"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttribI1ui = (GLEEPFNGLVERTEXATTRIBI1UIPROC) __GLeeGetProcAddress("glVertexAttribI1ui"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttribI2ui = (GLEEPFNGLVERTEXATTRIBI2UIPROC) __GLeeGetProcAddress("glVertexAttribI2ui"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttribI3ui = (GLEEPFNGLVERTEXATTRIBI3UIPROC) __GLeeGetProcAddress("glVertexAttribI3ui"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttribI4ui = (GLEEPFNGLVERTEXATTRIBI4UIPROC) __GLeeGetProcAddress("glVertexAttribI4ui"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttribI1iv = (GLEEPFNGLVERTEXATTRIBI1IVPROC) __GLeeGetProcAddress("glVertexAttribI1iv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttribI2iv = (GLEEPFNGLVERTEXATTRIBI2IVPROC) __GLeeGetProcAddress("glVertexAttribI2iv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttribI3iv = (GLEEPFNGLVERTEXATTRIBI3IVPROC) __GLeeGetProcAddress("glVertexAttribI3iv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttribI4iv = (GLEEPFNGLVERTEXATTRIBI4IVPROC) __GLeeGetProcAddress("glVertexAttribI4iv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttribI1uiv = (GLEEPFNGLVERTEXATTRIBI1UIVPROC) __GLeeGetProcAddress("glVertexAttribI1uiv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttribI2uiv = (GLEEPFNGLVERTEXATTRIBI2UIVPROC) __GLeeGetProcAddress("glVertexAttribI2uiv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttribI3uiv = (GLEEPFNGLVERTEXATTRIBI3UIVPROC) __GLeeGetProcAddress("glVertexAttribI3uiv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttribI4uiv = (GLEEPFNGLVERTEXATTRIBI4UIVPROC) __GLeeGetProcAddress("glVertexAttribI4uiv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttribI4bv = (GLEEPFNGLVERTEXATTRIBI4BVPROC) __GLeeGetProcAddress("glVertexAttribI4bv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttribI4sv = (GLEEPFNGLVERTEXATTRIBI4SVPROC) __GLeeGetProcAddress("glVertexAttribI4sv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttribI4ubv = (GLEEPFNGLVERTEXATTRIBI4UBVPROC) __GLeeGetProcAddress("glVertexAttribI4ubv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttribI4usv = (GLEEPFNGLVERTEXATTRIBI4USVPROC) __GLeeGetProcAddress("glVertexAttribI4usv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttribIPointer = (GLEEPFNGLVERTEXATTRIBIPOINTERPROC) __GLeeGetProcAddress("glVertexAttribIPointer"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetVertexAttribIiv = (GLEEPFNGLGETVERTEXATTRIBIIVPROC) __GLeeGetProcAddress("glGetVertexAttribIiv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetVertexAttribIuiv = (GLEEPFNGLGETVERTEXATTRIBIUIVPROC) __GLeeGetProcAddress("glGetVertexAttribIuiv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetUniformuiv = (GLEEPFNGLGETUNIFORMUIVPROC) __GLeeGetProcAddress("glGetUniformuiv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glBindFragDataLocation = (GLEEPFNGLBINDFRAGDATALOCATIONPROC) __GLeeGetProcAddress("glBindFragDataLocation"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetFragDataLocation = (GLEEPFNGLGETFRAGDATALOCATIONPROC) __GLeeGetProcAddress("glGetFragDataLocation"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUniform1ui = (GLEEPFNGLUNIFORM1UIPROC) __GLeeGetProcAddress("glUniform1ui"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUniform2ui = (GLEEPFNGLUNIFORM2UIPROC) __GLeeGetProcAddress("glUniform2ui"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUniform3ui = (GLEEPFNGLUNIFORM3UIPROC) __GLeeGetProcAddress("glUniform3ui"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUniform4ui = (GLEEPFNGLUNIFORM4UIPROC) __GLeeGetProcAddress("glUniform4ui"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUniform1uiv = (GLEEPFNGLUNIFORM1UIVPROC) __GLeeGetProcAddress("glUniform1uiv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUniform2uiv = (GLEEPFNGLUNIFORM2UIVPROC) __GLeeGetProcAddress("glUniform2uiv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUniform3uiv = (GLEEPFNGLUNIFORM3UIVPROC) __GLeeGetProcAddress("glUniform3uiv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUniform4uiv = (GLEEPFNGLUNIFORM4UIVPROC) __GLeeGetProcAddress("glUniform4uiv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTexParameterIiv = (GLEEPFNGLTEXPARAMETERIIVPROC) __GLeeGetProcAddress("glTexParameterIiv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTexParameterIuiv = (GLEEPFNGLTEXPARAMETERIUIVPROC) __GLeeGetProcAddress("glTexParameterIuiv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetTexParameterIiv = (GLEEPFNGLGETTEXPARAMETERIIVPROC) __GLeeGetProcAddress("glGetTexParameterIiv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetTexParameterIuiv = (GLEEPFNGLGETTEXPARAMETERIUIVPROC) __GLeeGetProcAddress("glGetTexParameterIuiv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glClearBufferiv = (GLEEPFNGLCLEARBUFFERIVPROC) __GLeeGetProcAddress("glClearBufferiv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glClearBufferuiv = (GLEEPFNGLCLEARBUFFERUIVPROC) __GLeeGetProcAddress("glClearBufferuiv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glClearBufferfv = (GLEEPFNGLCLEARBUFFERFVPROC) __GLeeGetProcAddress("glClearBufferfv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glClearBufferfi = (GLEEPFNGLCLEARBUFFERFIPROC) __GLeeGetProcAddress("glClearBufferfi"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetStringi = (GLEEPFNGLGETSTRINGIPROC) __GLeeGetProcAddress("glGetStringi"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==58) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_ARB_multitexture(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_ARB_multitexture\r
+    if ((GLeeFuncPtr_glActiveTextureARB = (GLEEPFNGLACTIVETEXTUREARBPROC) __GLeeGetProcAddress("glActiveTextureARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glClientActiveTextureARB = (GLEEPFNGLCLIENTACTIVETEXTUREARBPROC) __GLeeGetProcAddress("glClientActiveTextureARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord1dARB = (GLEEPFNGLMULTITEXCOORD1DARBPROC) __GLeeGetProcAddress("glMultiTexCoord1dARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord1dvARB = (GLEEPFNGLMULTITEXCOORD1DVARBPROC) __GLeeGetProcAddress("glMultiTexCoord1dvARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord1fARB = (GLEEPFNGLMULTITEXCOORD1FARBPROC) __GLeeGetProcAddress("glMultiTexCoord1fARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord1fvARB = (GLEEPFNGLMULTITEXCOORD1FVARBPROC) __GLeeGetProcAddress("glMultiTexCoord1fvARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord1iARB = (GLEEPFNGLMULTITEXCOORD1IARBPROC) __GLeeGetProcAddress("glMultiTexCoord1iARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord1ivARB = (GLEEPFNGLMULTITEXCOORD1IVARBPROC) __GLeeGetProcAddress("glMultiTexCoord1ivARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord1sARB = (GLEEPFNGLMULTITEXCOORD1SARBPROC) __GLeeGetProcAddress("glMultiTexCoord1sARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord1svARB = (GLEEPFNGLMULTITEXCOORD1SVARBPROC) __GLeeGetProcAddress("glMultiTexCoord1svARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord2dARB = (GLEEPFNGLMULTITEXCOORD2DARBPROC) __GLeeGetProcAddress("glMultiTexCoord2dARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord2dvARB = (GLEEPFNGLMULTITEXCOORD2DVARBPROC) __GLeeGetProcAddress("glMultiTexCoord2dvARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord2fARB = (GLEEPFNGLMULTITEXCOORD2FARBPROC) __GLeeGetProcAddress("glMultiTexCoord2fARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord2fvARB = (GLEEPFNGLMULTITEXCOORD2FVARBPROC) __GLeeGetProcAddress("glMultiTexCoord2fvARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord2iARB = (GLEEPFNGLMULTITEXCOORD2IARBPROC) __GLeeGetProcAddress("glMultiTexCoord2iARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord2ivARB = (GLEEPFNGLMULTITEXCOORD2IVARBPROC) __GLeeGetProcAddress("glMultiTexCoord2ivARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord2sARB = (GLEEPFNGLMULTITEXCOORD2SARBPROC) __GLeeGetProcAddress("glMultiTexCoord2sARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord2svARB = (GLEEPFNGLMULTITEXCOORD2SVARBPROC) __GLeeGetProcAddress("glMultiTexCoord2svARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord3dARB = (GLEEPFNGLMULTITEXCOORD3DARBPROC) __GLeeGetProcAddress("glMultiTexCoord3dARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord3dvARB = (GLEEPFNGLMULTITEXCOORD3DVARBPROC) __GLeeGetProcAddress("glMultiTexCoord3dvARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord3fARB = (GLEEPFNGLMULTITEXCOORD3FARBPROC) __GLeeGetProcAddress("glMultiTexCoord3fARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord3fvARB = (GLEEPFNGLMULTITEXCOORD3FVARBPROC) __GLeeGetProcAddress("glMultiTexCoord3fvARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord3iARB = (GLEEPFNGLMULTITEXCOORD3IARBPROC) __GLeeGetProcAddress("glMultiTexCoord3iARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord3ivARB = (GLEEPFNGLMULTITEXCOORD3IVARBPROC) __GLeeGetProcAddress("glMultiTexCoord3ivARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord3sARB = (GLEEPFNGLMULTITEXCOORD3SARBPROC) __GLeeGetProcAddress("glMultiTexCoord3sARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord3svARB = (GLEEPFNGLMULTITEXCOORD3SVARBPROC) __GLeeGetProcAddress("glMultiTexCoord3svARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord4dARB = (GLEEPFNGLMULTITEXCOORD4DARBPROC) __GLeeGetProcAddress("glMultiTexCoord4dARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord4dvARB = (GLEEPFNGLMULTITEXCOORD4DVARBPROC) __GLeeGetProcAddress("glMultiTexCoord4dvARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord4fARB = (GLEEPFNGLMULTITEXCOORD4FARBPROC) __GLeeGetProcAddress("glMultiTexCoord4fARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord4fvARB = (GLEEPFNGLMULTITEXCOORD4FVARBPROC) __GLeeGetProcAddress("glMultiTexCoord4fvARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord4iARB = (GLEEPFNGLMULTITEXCOORD4IARBPROC) __GLeeGetProcAddress("glMultiTexCoord4iARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord4ivARB = (GLEEPFNGLMULTITEXCOORD4IVARBPROC) __GLeeGetProcAddress("glMultiTexCoord4ivARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord4sARB = (GLEEPFNGLMULTITEXCOORD4SARBPROC) __GLeeGetProcAddress("glMultiTexCoord4sARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord4svARB = (GLEEPFNGLMULTITEXCOORD4SVARBPROC) __GLeeGetProcAddress("glMultiTexCoord4svARB"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==34) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_ARB_transpose_matrix(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_ARB_transpose_matrix\r
+    if ((GLeeFuncPtr_glLoadTransposeMatrixfARB = (GLEEPFNGLLOADTRANSPOSEMATRIXFARBPROC) __GLeeGetProcAddress("glLoadTransposeMatrixfARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glLoadTransposeMatrixdARB = (GLEEPFNGLLOADTRANSPOSEMATRIXDARBPROC) __GLeeGetProcAddress("glLoadTransposeMatrixdARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultTransposeMatrixfARB = (GLEEPFNGLMULTTRANSPOSEMATRIXFARBPROC) __GLeeGetProcAddress("glMultTransposeMatrixfARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultTransposeMatrixdARB = (GLEEPFNGLMULTTRANSPOSEMATRIXDARBPROC) __GLeeGetProcAddress("glMultTransposeMatrixdARB"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==4) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_ARB_multisample(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_ARB_multisample\r
+    if ((GLeeFuncPtr_glSampleCoverageARB = (GLEEPFNGLSAMPLECOVERAGEARBPROC) __GLeeGetProcAddress("glSampleCoverageARB"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==1) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_ARB_texture_env_add(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_ARB_texture_cube_map(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_ARB_texture_compression(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_ARB_texture_compression\r
+    if ((GLeeFuncPtr_glCompressedTexImage3DARB = (GLEEPFNGLCOMPRESSEDTEXIMAGE3DARBPROC) __GLeeGetProcAddress("glCompressedTexImage3DARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glCompressedTexImage2DARB = (GLEEPFNGLCOMPRESSEDTEXIMAGE2DARBPROC) __GLeeGetProcAddress("glCompressedTexImage2DARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glCompressedTexImage1DARB = (GLEEPFNGLCOMPRESSEDTEXIMAGE1DARBPROC) __GLeeGetProcAddress("glCompressedTexImage1DARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glCompressedTexSubImage3DARB = (GLEEPFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC) __GLeeGetProcAddress("glCompressedTexSubImage3DARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glCompressedTexSubImage2DARB = (GLEEPFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC) __GLeeGetProcAddress("glCompressedTexSubImage2DARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glCompressedTexSubImage1DARB = (GLEEPFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC) __GLeeGetProcAddress("glCompressedTexSubImage1DARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetCompressedTexImageARB = (GLEEPFNGLGETCOMPRESSEDTEXIMAGEARBPROC) __GLeeGetProcAddress("glGetCompressedTexImageARB"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==7) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_ARB_texture_border_clamp(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_ARB_point_parameters(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_ARB_point_parameters\r
+    if ((GLeeFuncPtr_glPointParameterfARB = (GLEEPFNGLPOINTPARAMETERFARBPROC) __GLeeGetProcAddress("glPointParameterfARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glPointParameterfvARB = (GLEEPFNGLPOINTPARAMETERFVARBPROC) __GLeeGetProcAddress("glPointParameterfvARB"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==2) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_ARB_vertex_blend(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_ARB_vertex_blend\r
+    if ((GLeeFuncPtr_glWeightbvARB = (GLEEPFNGLWEIGHTBVARBPROC) __GLeeGetProcAddress("glWeightbvARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glWeightsvARB = (GLEEPFNGLWEIGHTSVARBPROC) __GLeeGetProcAddress("glWeightsvARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glWeightivARB = (GLEEPFNGLWEIGHTIVARBPROC) __GLeeGetProcAddress("glWeightivARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glWeightfvARB = (GLEEPFNGLWEIGHTFVARBPROC) __GLeeGetProcAddress("glWeightfvARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glWeightdvARB = (GLEEPFNGLWEIGHTDVARBPROC) __GLeeGetProcAddress("glWeightdvARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glWeightubvARB = (GLEEPFNGLWEIGHTUBVARBPROC) __GLeeGetProcAddress("glWeightubvARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glWeightusvARB = (GLEEPFNGLWEIGHTUSVARBPROC) __GLeeGetProcAddress("glWeightusvARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glWeightuivARB = (GLEEPFNGLWEIGHTUIVARBPROC) __GLeeGetProcAddress("glWeightuivARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glWeightPointerARB = (GLEEPFNGLWEIGHTPOINTERARBPROC) __GLeeGetProcAddress("glWeightPointerARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexBlendARB = (GLEEPFNGLVERTEXBLENDARBPROC) __GLeeGetProcAddress("glVertexBlendARB"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==10) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_ARB_matrix_palette(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_ARB_matrix_palette\r
+    if ((GLeeFuncPtr_glCurrentPaletteMatrixARB = (GLEEPFNGLCURRENTPALETTEMATRIXARBPROC) __GLeeGetProcAddress("glCurrentPaletteMatrixARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMatrixIndexubvARB = (GLEEPFNGLMATRIXINDEXUBVARBPROC) __GLeeGetProcAddress("glMatrixIndexubvARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMatrixIndexusvARB = (GLEEPFNGLMATRIXINDEXUSVARBPROC) __GLeeGetProcAddress("glMatrixIndexusvARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMatrixIndexuivARB = (GLEEPFNGLMATRIXINDEXUIVARBPROC) __GLeeGetProcAddress("glMatrixIndexuivARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMatrixIndexPointerARB = (GLEEPFNGLMATRIXINDEXPOINTERARBPROC) __GLeeGetProcAddress("glMatrixIndexPointerARB"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==5) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_ARB_texture_env_combine(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_ARB_texture_env_crossbar(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_ARB_texture_env_dot3(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_ARB_texture_mirrored_repeat(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_ARB_depth_texture(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_ARB_shadow(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_ARB_shadow_ambient(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_ARB_window_pos(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_ARB_window_pos\r
+    if ((GLeeFuncPtr_glWindowPos2dARB = (GLEEPFNGLWINDOWPOS2DARBPROC) __GLeeGetProcAddress("glWindowPos2dARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glWindowPos2dvARB = (GLEEPFNGLWINDOWPOS2DVARBPROC) __GLeeGetProcAddress("glWindowPos2dvARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glWindowPos2fARB = (GLEEPFNGLWINDOWPOS2FARBPROC) __GLeeGetProcAddress("glWindowPos2fARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glWindowPos2fvARB = (GLEEPFNGLWINDOWPOS2FVARBPROC) __GLeeGetProcAddress("glWindowPos2fvARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glWindowPos2iARB = (GLEEPFNGLWINDOWPOS2IARBPROC) __GLeeGetProcAddress("glWindowPos2iARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glWindowPos2ivARB = (GLEEPFNGLWINDOWPOS2IVARBPROC) __GLeeGetProcAddress("glWindowPos2ivARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glWindowPos2sARB = (GLEEPFNGLWINDOWPOS2SARBPROC) __GLeeGetProcAddress("glWindowPos2sARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glWindowPos2svARB = (GLEEPFNGLWINDOWPOS2SVARBPROC) __GLeeGetProcAddress("glWindowPos2svARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glWindowPos3dARB = (GLEEPFNGLWINDOWPOS3DARBPROC) __GLeeGetProcAddress("glWindowPos3dARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glWindowPos3dvARB = (GLEEPFNGLWINDOWPOS3DVARBPROC) __GLeeGetProcAddress("glWindowPos3dvARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glWindowPos3fARB = (GLEEPFNGLWINDOWPOS3FARBPROC) __GLeeGetProcAddress("glWindowPos3fARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glWindowPos3fvARB = (GLEEPFNGLWINDOWPOS3FVARBPROC) __GLeeGetProcAddress("glWindowPos3fvARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glWindowPos3iARB = (GLEEPFNGLWINDOWPOS3IARBPROC) __GLeeGetProcAddress("glWindowPos3iARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glWindowPos3ivARB = (GLEEPFNGLWINDOWPOS3IVARBPROC) __GLeeGetProcAddress("glWindowPos3ivARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glWindowPos3sARB = (GLEEPFNGLWINDOWPOS3SARBPROC) __GLeeGetProcAddress("glWindowPos3sARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glWindowPos3svARB = (GLEEPFNGLWINDOWPOS3SVARBPROC) __GLeeGetProcAddress("glWindowPos3svARB"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==16) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_ARB_vertex_program(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_ARB_vertex_program\r
+    if ((GLeeFuncPtr_glVertexAttrib1dARB = (GLEEPFNGLVERTEXATTRIB1DARBPROC) __GLeeGetProcAddress("glVertexAttrib1dARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib1dvARB = (GLEEPFNGLVERTEXATTRIB1DVARBPROC) __GLeeGetProcAddress("glVertexAttrib1dvARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib1fARB = (GLEEPFNGLVERTEXATTRIB1FARBPROC) __GLeeGetProcAddress("glVertexAttrib1fARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib1fvARB = (GLEEPFNGLVERTEXATTRIB1FVARBPROC) __GLeeGetProcAddress("glVertexAttrib1fvARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib1sARB = (GLEEPFNGLVERTEXATTRIB1SARBPROC) __GLeeGetProcAddress("glVertexAttrib1sARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib1svARB = (GLEEPFNGLVERTEXATTRIB1SVARBPROC) __GLeeGetProcAddress("glVertexAttrib1svARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib2dARB = (GLEEPFNGLVERTEXATTRIB2DARBPROC) __GLeeGetProcAddress("glVertexAttrib2dARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib2dvARB = (GLEEPFNGLVERTEXATTRIB2DVARBPROC) __GLeeGetProcAddress("glVertexAttrib2dvARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib2fARB = (GLEEPFNGLVERTEXATTRIB2FARBPROC) __GLeeGetProcAddress("glVertexAttrib2fARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib2fvARB = (GLEEPFNGLVERTEXATTRIB2FVARBPROC) __GLeeGetProcAddress("glVertexAttrib2fvARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib2sARB = (GLEEPFNGLVERTEXATTRIB2SARBPROC) __GLeeGetProcAddress("glVertexAttrib2sARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib2svARB = (GLEEPFNGLVERTEXATTRIB2SVARBPROC) __GLeeGetProcAddress("glVertexAttrib2svARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib3dARB = (GLEEPFNGLVERTEXATTRIB3DARBPROC) __GLeeGetProcAddress("glVertexAttrib3dARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib3dvARB = (GLEEPFNGLVERTEXATTRIB3DVARBPROC) __GLeeGetProcAddress("glVertexAttrib3dvARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib3fARB = (GLEEPFNGLVERTEXATTRIB3FARBPROC) __GLeeGetProcAddress("glVertexAttrib3fARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib3fvARB = (GLEEPFNGLVERTEXATTRIB3FVARBPROC) __GLeeGetProcAddress("glVertexAttrib3fvARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib3sARB = (GLEEPFNGLVERTEXATTRIB3SARBPROC) __GLeeGetProcAddress("glVertexAttrib3sARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib3svARB = (GLEEPFNGLVERTEXATTRIB3SVARBPROC) __GLeeGetProcAddress("glVertexAttrib3svARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib4NbvARB = (GLEEPFNGLVERTEXATTRIB4NBVARBPROC) __GLeeGetProcAddress("glVertexAttrib4NbvARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib4NivARB = (GLEEPFNGLVERTEXATTRIB4NIVARBPROC) __GLeeGetProcAddress("glVertexAttrib4NivARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib4NsvARB = (GLEEPFNGLVERTEXATTRIB4NSVARBPROC) __GLeeGetProcAddress("glVertexAttrib4NsvARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib4NubARB = (GLEEPFNGLVERTEXATTRIB4NUBARBPROC) __GLeeGetProcAddress("glVertexAttrib4NubARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib4NubvARB = (GLEEPFNGLVERTEXATTRIB4NUBVARBPROC) __GLeeGetProcAddress("glVertexAttrib4NubvARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib4NuivARB = (GLEEPFNGLVERTEXATTRIB4NUIVARBPROC) __GLeeGetProcAddress("glVertexAttrib4NuivARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib4NusvARB = (GLEEPFNGLVERTEXATTRIB4NUSVARBPROC) __GLeeGetProcAddress("glVertexAttrib4NusvARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib4bvARB = (GLEEPFNGLVERTEXATTRIB4BVARBPROC) __GLeeGetProcAddress("glVertexAttrib4bvARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib4dARB = (GLEEPFNGLVERTEXATTRIB4DARBPROC) __GLeeGetProcAddress("glVertexAttrib4dARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib4dvARB = (GLEEPFNGLVERTEXATTRIB4DVARBPROC) __GLeeGetProcAddress("glVertexAttrib4dvARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib4fARB = (GLEEPFNGLVERTEXATTRIB4FARBPROC) __GLeeGetProcAddress("glVertexAttrib4fARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib4fvARB = (GLEEPFNGLVERTEXATTRIB4FVARBPROC) __GLeeGetProcAddress("glVertexAttrib4fvARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib4ivARB = (GLEEPFNGLVERTEXATTRIB4IVARBPROC) __GLeeGetProcAddress("glVertexAttrib4ivARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib4sARB = (GLEEPFNGLVERTEXATTRIB4SARBPROC) __GLeeGetProcAddress("glVertexAttrib4sARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib4svARB = (GLEEPFNGLVERTEXATTRIB4SVARBPROC) __GLeeGetProcAddress("glVertexAttrib4svARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib4ubvARB = (GLEEPFNGLVERTEXATTRIB4UBVARBPROC) __GLeeGetProcAddress("glVertexAttrib4ubvARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib4uivARB = (GLEEPFNGLVERTEXATTRIB4UIVARBPROC) __GLeeGetProcAddress("glVertexAttrib4uivARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib4usvARB = (GLEEPFNGLVERTEXATTRIB4USVARBPROC) __GLeeGetProcAddress("glVertexAttrib4usvARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttribPointerARB = (GLEEPFNGLVERTEXATTRIBPOINTERARBPROC) __GLeeGetProcAddress("glVertexAttribPointerARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glEnableVertexAttribArrayARB = (GLEEPFNGLENABLEVERTEXATTRIBARRAYARBPROC) __GLeeGetProcAddress("glEnableVertexAttribArrayARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glDisableVertexAttribArrayARB = (GLEEPFNGLDISABLEVERTEXATTRIBARRAYARBPROC) __GLeeGetProcAddress("glDisableVertexAttribArrayARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramStringARB = (GLEEPFNGLPROGRAMSTRINGARBPROC) __GLeeGetProcAddress("glProgramStringARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glBindProgramARB = (GLEEPFNGLBINDPROGRAMARBPROC) __GLeeGetProcAddress("glBindProgramARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glDeleteProgramsARB = (GLEEPFNGLDELETEPROGRAMSARBPROC) __GLeeGetProcAddress("glDeleteProgramsARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGenProgramsARB = (GLEEPFNGLGENPROGRAMSARBPROC) __GLeeGetProcAddress("glGenProgramsARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramEnvParameter4dARB = (GLEEPFNGLPROGRAMENVPARAMETER4DARBPROC) __GLeeGetProcAddress("glProgramEnvParameter4dARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramEnvParameter4dvARB = (GLEEPFNGLPROGRAMENVPARAMETER4DVARBPROC) __GLeeGetProcAddress("glProgramEnvParameter4dvARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramEnvParameter4fARB = (GLEEPFNGLPROGRAMENVPARAMETER4FARBPROC) __GLeeGetProcAddress("glProgramEnvParameter4fARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramEnvParameter4fvARB = (GLEEPFNGLPROGRAMENVPARAMETER4FVARBPROC) __GLeeGetProcAddress("glProgramEnvParameter4fvARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramLocalParameter4dARB = (GLEEPFNGLPROGRAMLOCALPARAMETER4DARBPROC) __GLeeGetProcAddress("glProgramLocalParameter4dARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramLocalParameter4dvARB = (GLEEPFNGLPROGRAMLOCALPARAMETER4DVARBPROC) __GLeeGetProcAddress("glProgramLocalParameter4dvARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramLocalParameter4fARB = (GLEEPFNGLPROGRAMLOCALPARAMETER4FARBPROC) __GLeeGetProcAddress("glProgramLocalParameter4fARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramLocalParameter4fvARB = (GLEEPFNGLPROGRAMLOCALPARAMETER4FVARBPROC) __GLeeGetProcAddress("glProgramLocalParameter4fvARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetProgramEnvParameterdvARB = (GLEEPFNGLGETPROGRAMENVPARAMETERDVARBPROC) __GLeeGetProcAddress("glGetProgramEnvParameterdvARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetProgramEnvParameterfvARB = (GLEEPFNGLGETPROGRAMENVPARAMETERFVARBPROC) __GLeeGetProcAddress("glGetProgramEnvParameterfvARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetProgramLocalParameterdvARB = (GLEEPFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) __GLeeGetProcAddress("glGetProgramLocalParameterdvARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetProgramLocalParameterfvARB = (GLEEPFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) __GLeeGetProcAddress("glGetProgramLocalParameterfvARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetProgramivARB = (GLEEPFNGLGETPROGRAMIVARBPROC) __GLeeGetProcAddress("glGetProgramivARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetProgramStringARB = (GLEEPFNGLGETPROGRAMSTRINGARBPROC) __GLeeGetProcAddress("glGetProgramStringARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetVertexAttribdvARB = (GLEEPFNGLGETVERTEXATTRIBDVARBPROC) __GLeeGetProcAddress("glGetVertexAttribdvARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetVertexAttribfvARB = (GLEEPFNGLGETVERTEXATTRIBFVARBPROC) __GLeeGetProcAddress("glGetVertexAttribfvARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetVertexAttribivARB = (GLEEPFNGLGETVERTEXATTRIBIVARBPROC) __GLeeGetProcAddress("glGetVertexAttribivARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetVertexAttribPointervARB = (GLEEPFNGLGETVERTEXATTRIBPOINTERVARBPROC) __GLeeGetProcAddress("glGetVertexAttribPointervARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glIsProgramARB = (GLEEPFNGLISPROGRAMARBPROC) __GLeeGetProcAddress("glIsProgramARB"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==62) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_ARB_fragment_program(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_ARB_vertex_buffer_object(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_ARB_vertex_buffer_object\r
+    if ((GLeeFuncPtr_glBindBufferARB = (GLEEPFNGLBINDBUFFERARBPROC) __GLeeGetProcAddress("glBindBufferARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glDeleteBuffersARB = (GLEEPFNGLDELETEBUFFERSARBPROC) __GLeeGetProcAddress("glDeleteBuffersARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGenBuffersARB = (GLEEPFNGLGENBUFFERSARBPROC) __GLeeGetProcAddress("glGenBuffersARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glIsBufferARB = (GLEEPFNGLISBUFFERARBPROC) __GLeeGetProcAddress("glIsBufferARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glBufferDataARB = (GLEEPFNGLBUFFERDATAARBPROC) __GLeeGetProcAddress("glBufferDataARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glBufferSubDataARB = (GLEEPFNGLBUFFERSUBDATAARBPROC) __GLeeGetProcAddress("glBufferSubDataARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetBufferSubDataARB = (GLEEPFNGLGETBUFFERSUBDATAARBPROC) __GLeeGetProcAddress("glGetBufferSubDataARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMapBufferARB = (GLEEPFNGLMAPBUFFERARBPROC) __GLeeGetProcAddress("glMapBufferARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUnmapBufferARB = (GLEEPFNGLUNMAPBUFFERARBPROC) __GLeeGetProcAddress("glUnmapBufferARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetBufferParameterivARB = (GLEEPFNGLGETBUFFERPARAMETERIVARBPROC) __GLeeGetProcAddress("glGetBufferParameterivARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetBufferPointervARB = (GLEEPFNGLGETBUFFERPOINTERVARBPROC) __GLeeGetProcAddress("glGetBufferPointervARB"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==11) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_ARB_occlusion_query(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_ARB_occlusion_query\r
+    if ((GLeeFuncPtr_glGenQueriesARB = (GLEEPFNGLGENQUERIESARBPROC) __GLeeGetProcAddress("glGenQueriesARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glDeleteQueriesARB = (GLEEPFNGLDELETEQUERIESARBPROC) __GLeeGetProcAddress("glDeleteQueriesARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glIsQueryARB = (GLEEPFNGLISQUERYARBPROC) __GLeeGetProcAddress("glIsQueryARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glBeginQueryARB = (GLEEPFNGLBEGINQUERYARBPROC) __GLeeGetProcAddress("glBeginQueryARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glEndQueryARB = (GLEEPFNGLENDQUERYARBPROC) __GLeeGetProcAddress("glEndQueryARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetQueryivARB = (GLEEPFNGLGETQUERYIVARBPROC) __GLeeGetProcAddress("glGetQueryivARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetQueryObjectivARB = (GLEEPFNGLGETQUERYOBJECTIVARBPROC) __GLeeGetProcAddress("glGetQueryObjectivARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetQueryObjectuivARB = (GLEEPFNGLGETQUERYOBJECTUIVARBPROC) __GLeeGetProcAddress("glGetQueryObjectuivARB"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==8) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_ARB_shader_objects(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_ARB_shader_objects\r
+    if ((GLeeFuncPtr_glDeleteObjectARB = (GLEEPFNGLDELETEOBJECTARBPROC) __GLeeGetProcAddress("glDeleteObjectARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetHandleARB = (GLEEPFNGLGETHANDLEARBPROC) __GLeeGetProcAddress("glGetHandleARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glDetachObjectARB = (GLEEPFNGLDETACHOBJECTARBPROC) __GLeeGetProcAddress("glDetachObjectARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glCreateShaderObjectARB = (GLEEPFNGLCREATESHADEROBJECTARBPROC) __GLeeGetProcAddress("glCreateShaderObjectARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glShaderSourceARB = (GLEEPFNGLSHADERSOURCEARBPROC) __GLeeGetProcAddress("glShaderSourceARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glCompileShaderARB = (GLEEPFNGLCOMPILESHADERARBPROC) __GLeeGetProcAddress("glCompileShaderARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glCreateProgramObjectARB = (GLEEPFNGLCREATEPROGRAMOBJECTARBPROC) __GLeeGetProcAddress("glCreateProgramObjectARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glAttachObjectARB = (GLEEPFNGLATTACHOBJECTARBPROC) __GLeeGetProcAddress("glAttachObjectARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glLinkProgramARB = (GLEEPFNGLLINKPROGRAMARBPROC) __GLeeGetProcAddress("glLinkProgramARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUseProgramObjectARB = (GLEEPFNGLUSEPROGRAMOBJECTARBPROC) __GLeeGetProcAddress("glUseProgramObjectARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glValidateProgramARB = (GLEEPFNGLVALIDATEPROGRAMARBPROC) __GLeeGetProcAddress("glValidateProgramARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUniform1fARB = (GLEEPFNGLUNIFORM1FARBPROC) __GLeeGetProcAddress("glUniform1fARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUniform2fARB = (GLEEPFNGLUNIFORM2FARBPROC) __GLeeGetProcAddress("glUniform2fARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUniform3fARB = (GLEEPFNGLUNIFORM3FARBPROC) __GLeeGetProcAddress("glUniform3fARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUniform4fARB = (GLEEPFNGLUNIFORM4FARBPROC) __GLeeGetProcAddress("glUniform4fARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUniform1iARB = (GLEEPFNGLUNIFORM1IARBPROC) __GLeeGetProcAddress("glUniform1iARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUniform2iARB = (GLEEPFNGLUNIFORM2IARBPROC) __GLeeGetProcAddress("glUniform2iARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUniform3iARB = (GLEEPFNGLUNIFORM3IARBPROC) __GLeeGetProcAddress("glUniform3iARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUniform4iARB = (GLEEPFNGLUNIFORM4IARBPROC) __GLeeGetProcAddress("glUniform4iARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUniform1fvARB = (GLEEPFNGLUNIFORM1FVARBPROC) __GLeeGetProcAddress("glUniform1fvARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUniform2fvARB = (GLEEPFNGLUNIFORM2FVARBPROC) __GLeeGetProcAddress("glUniform2fvARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUniform3fvARB = (GLEEPFNGLUNIFORM3FVARBPROC) __GLeeGetProcAddress("glUniform3fvARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUniform4fvARB = (GLEEPFNGLUNIFORM4FVARBPROC) __GLeeGetProcAddress("glUniform4fvARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUniform1ivARB = (GLEEPFNGLUNIFORM1IVARBPROC) __GLeeGetProcAddress("glUniform1ivARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUniform2ivARB = (GLEEPFNGLUNIFORM2IVARBPROC) __GLeeGetProcAddress("glUniform2ivARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUniform3ivARB = (GLEEPFNGLUNIFORM3IVARBPROC) __GLeeGetProcAddress("glUniform3ivARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUniform4ivARB = (GLEEPFNGLUNIFORM4IVARBPROC) __GLeeGetProcAddress("glUniform4ivARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUniformMatrix2fvARB = (GLEEPFNGLUNIFORMMATRIX2FVARBPROC) __GLeeGetProcAddress("glUniformMatrix2fvARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUniformMatrix3fvARB = (GLEEPFNGLUNIFORMMATRIX3FVARBPROC) __GLeeGetProcAddress("glUniformMatrix3fvARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUniformMatrix4fvARB = (GLEEPFNGLUNIFORMMATRIX4FVARBPROC) __GLeeGetProcAddress("glUniformMatrix4fvARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetObjectParameterfvARB = (GLEEPFNGLGETOBJECTPARAMETERFVARBPROC) __GLeeGetProcAddress("glGetObjectParameterfvARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetObjectParameterivARB = (GLEEPFNGLGETOBJECTPARAMETERIVARBPROC) __GLeeGetProcAddress("glGetObjectParameterivARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetInfoLogARB = (GLEEPFNGLGETINFOLOGARBPROC) __GLeeGetProcAddress("glGetInfoLogARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetAttachedObjectsARB = (GLEEPFNGLGETATTACHEDOBJECTSARBPROC) __GLeeGetProcAddress("glGetAttachedObjectsARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetUniformLocationARB = (GLEEPFNGLGETUNIFORMLOCATIONARBPROC) __GLeeGetProcAddress("glGetUniformLocationARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetActiveUniformARB = (GLEEPFNGLGETACTIVEUNIFORMARBPROC) __GLeeGetProcAddress("glGetActiveUniformARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetUniformfvARB = (GLEEPFNGLGETUNIFORMFVARBPROC) __GLeeGetProcAddress("glGetUniformfvARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetUniformivARB = (GLEEPFNGLGETUNIFORMIVARBPROC) __GLeeGetProcAddress("glGetUniformivARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetShaderSourceARB = (GLEEPFNGLGETSHADERSOURCEARBPROC) __GLeeGetProcAddress("glGetShaderSourceARB"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==39) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_ARB_vertex_shader(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_ARB_vertex_shader\r
+    if ((GLeeFuncPtr_glBindAttribLocationARB = (GLEEPFNGLBINDATTRIBLOCATIONARBPROC) __GLeeGetProcAddress("glBindAttribLocationARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetActiveAttribARB = (GLEEPFNGLGETACTIVEATTRIBARBPROC) __GLeeGetProcAddress("glGetActiveAttribARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetAttribLocationARB = (GLEEPFNGLGETATTRIBLOCATIONARBPROC) __GLeeGetProcAddress("glGetAttribLocationARB"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==3) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_ARB_fragment_shader(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_ARB_shading_language_100(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_ARB_texture_non_power_of_two(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_ARB_point_sprite(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_ARB_fragment_program_shadow(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_ARB_draw_buffers(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_ARB_draw_buffers\r
+    if ((GLeeFuncPtr_glDrawBuffersARB = (GLEEPFNGLDRAWBUFFERSARBPROC) __GLeeGetProcAddress("glDrawBuffersARB"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==1) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_ARB_texture_rectangle(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_ARB_color_buffer_float(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_ARB_color_buffer_float\r
+    if ((GLeeFuncPtr_glClampColorARB = (GLEEPFNGLCLAMPCOLORARBPROC) __GLeeGetProcAddress("glClampColorARB"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==1) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_ARB_half_float_pixel(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_ARB_texture_float(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_ARB_pixel_buffer_object(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_ARB_depth_buffer_float(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_ARB_draw_instanced(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_ARB_draw_instanced\r
+    if ((GLeeFuncPtr_glDrawArraysInstancedARB = (GLEEPFNGLDRAWARRAYSINSTANCEDARBPROC) __GLeeGetProcAddress("glDrawArraysInstancedARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glDrawElementsInstancedARB = (GLEEPFNGLDRAWELEMENTSINSTANCEDARBPROC) __GLeeGetProcAddress("glDrawElementsInstancedARB"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==2) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_ARB_framebuffer_object(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_ARB_framebuffer_object\r
+    if ((GLeeFuncPtr_glIsRenderbuffer = (GLEEPFNGLISRENDERBUFFERPROC) __GLeeGetProcAddress("glIsRenderbuffer"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glBindRenderbuffer = (GLEEPFNGLBINDRENDERBUFFERPROC) __GLeeGetProcAddress("glBindRenderbuffer"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glDeleteRenderbuffers = (GLEEPFNGLDELETERENDERBUFFERSPROC) __GLeeGetProcAddress("glDeleteRenderbuffers"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGenRenderbuffers = (GLEEPFNGLGENRENDERBUFFERSPROC) __GLeeGetProcAddress("glGenRenderbuffers"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glRenderbufferStorage = (GLEEPFNGLRENDERBUFFERSTORAGEPROC) __GLeeGetProcAddress("glRenderbufferStorage"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetRenderbufferParameteriv = (GLEEPFNGLGETRENDERBUFFERPARAMETERIVPROC) __GLeeGetProcAddress("glGetRenderbufferParameteriv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glIsFramebuffer = (GLEEPFNGLISFRAMEBUFFERPROC) __GLeeGetProcAddress("glIsFramebuffer"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glBindFramebuffer = (GLEEPFNGLBINDFRAMEBUFFERPROC) __GLeeGetProcAddress("glBindFramebuffer"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glDeleteFramebuffers = (GLEEPFNGLDELETEFRAMEBUFFERSPROC) __GLeeGetProcAddress("glDeleteFramebuffers"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGenFramebuffers = (GLEEPFNGLGENFRAMEBUFFERSPROC) __GLeeGetProcAddress("glGenFramebuffers"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glCheckFramebufferStatus = (GLEEPFNGLCHECKFRAMEBUFFERSTATUSPROC) __GLeeGetProcAddress("glCheckFramebufferStatus"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFramebufferTexture1D = (GLEEPFNGLFRAMEBUFFERTEXTURE1DPROC) __GLeeGetProcAddress("glFramebufferTexture1D"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFramebufferTexture2D = (GLEEPFNGLFRAMEBUFFERTEXTURE2DPROC) __GLeeGetProcAddress("glFramebufferTexture2D"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFramebufferTexture3D = (GLEEPFNGLFRAMEBUFFERTEXTURE3DPROC) __GLeeGetProcAddress("glFramebufferTexture3D"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFramebufferRenderbuffer = (GLEEPFNGLFRAMEBUFFERRENDERBUFFERPROC) __GLeeGetProcAddress("glFramebufferRenderbuffer"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetFramebufferAttachmentParameteriv = (GLEEPFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) __GLeeGetProcAddress("glGetFramebufferAttachmentParameteriv"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGenerateMipmap = (GLEEPFNGLGENERATEMIPMAPPROC) __GLeeGetProcAddress("glGenerateMipmap"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glBlitFramebuffer = (GLEEPFNGLBLITFRAMEBUFFERPROC) __GLeeGetProcAddress("glBlitFramebuffer"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glRenderbufferStorageMultisample = (GLEEPFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) __GLeeGetProcAddress("glRenderbufferStorageMultisample"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFramebufferTextureLayer = (GLEEPFNGLFRAMEBUFFERTEXTURELAYERPROC) __GLeeGetProcAddress("glFramebufferTextureLayer"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==20) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_ARB_framebuffer_sRGB(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_ARB_geometry_shader4(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_ARB_geometry_shader4\r
+    if ((GLeeFuncPtr_glProgramParameteriARB = (GLEEPFNGLPROGRAMPARAMETERIARBPROC) __GLeeGetProcAddress("glProgramParameteriARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFramebufferTextureARB = (GLEEPFNGLFRAMEBUFFERTEXTUREARBPROC) __GLeeGetProcAddress("glFramebufferTextureARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFramebufferTextureLayerARB = (GLEEPFNGLFRAMEBUFFERTEXTURELAYERARBPROC) __GLeeGetProcAddress("glFramebufferTextureLayerARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFramebufferTextureFaceARB = (GLEEPFNGLFRAMEBUFFERTEXTUREFACEARBPROC) __GLeeGetProcAddress("glFramebufferTextureFaceARB"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==4) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_ARB_half_float_vertex(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_ARB_instanced_arrays(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_ARB_instanced_arrays\r
+    if ((GLeeFuncPtr_glVertexAttribDivisor = (GLEEPFNGLVERTEXATTRIBDIVISORPROC) __GLeeGetProcAddress("glVertexAttribDivisor"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==1) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_ARB_map_buffer_range(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_ARB_map_buffer_range\r
+    if ((GLeeFuncPtr_glMapBufferRange = (GLEEPFNGLMAPBUFFERRANGEPROC) __GLeeGetProcAddress("glMapBufferRange"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFlushMappedBufferRange = (GLEEPFNGLFLUSHMAPPEDBUFFERRANGEPROC) __GLeeGetProcAddress("glFlushMappedBufferRange"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==2) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_ARB_texture_buffer_object(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_ARB_texture_buffer_object\r
+    if ((GLeeFuncPtr_glTexBufferARB = (GLEEPFNGLTEXBUFFERARBPROC) __GLeeGetProcAddress("glTexBufferARB"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==1) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_ARB_texture_compression_rgtc(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_ARB_texture_rg(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_ARB_vertex_array_object(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_ARB_vertex_array_object\r
+    if ((GLeeFuncPtr_glBindVertexArray = (GLEEPFNGLBINDVERTEXARRAYPROC) __GLeeGetProcAddress("glBindVertexArray"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glDeleteVertexArrays = (GLEEPFNGLDELETEVERTEXARRAYSPROC) __GLeeGetProcAddress("glDeleteVertexArrays"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGenVertexArrays = (GLEEPFNGLGENVERTEXARRAYSPROC) __GLeeGetProcAddress("glGenVertexArrays"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glIsVertexArray = (GLEEPFNGLISVERTEXARRAYPROC) __GLeeGetProcAddress("glIsVertexArray"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==4) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_EXT_abgr(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_EXT_blend_color(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_EXT_blend_color\r
+    if ((GLeeFuncPtr_glBlendColorEXT = (GLEEPFNGLBLENDCOLOREXTPROC) __GLeeGetProcAddress("glBlendColorEXT"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==1) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_EXT_polygon_offset(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_EXT_polygon_offset\r
+    if ((GLeeFuncPtr_glPolygonOffsetEXT = (GLEEPFNGLPOLYGONOFFSETEXTPROC) __GLeeGetProcAddress("glPolygonOffsetEXT"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==1) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_EXT_texture(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_EXT_texture3D(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_EXT_texture3D\r
+    if ((GLeeFuncPtr_glTexImage3DEXT = (GLEEPFNGLTEXIMAGE3DEXTPROC) __GLeeGetProcAddress("glTexImage3DEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTexSubImage3DEXT = (GLEEPFNGLTEXSUBIMAGE3DEXTPROC) __GLeeGetProcAddress("glTexSubImage3DEXT"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==2) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_SGIS_texture_filter4(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_SGIS_texture_filter4\r
+    if ((GLeeFuncPtr_glGetTexFilterFuncSGIS = (GLEEPFNGLGETTEXFILTERFUNCSGISPROC) __GLeeGetProcAddress("glGetTexFilterFuncSGIS"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTexFilterFuncSGIS = (GLEEPFNGLTEXFILTERFUNCSGISPROC) __GLeeGetProcAddress("glTexFilterFuncSGIS"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==2) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_EXT_subtexture(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_EXT_subtexture\r
+    if ((GLeeFuncPtr_glTexSubImage1DEXT = (GLEEPFNGLTEXSUBIMAGE1DEXTPROC) __GLeeGetProcAddress("glTexSubImage1DEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTexSubImage2DEXT = (GLEEPFNGLTEXSUBIMAGE2DEXTPROC) __GLeeGetProcAddress("glTexSubImage2DEXT"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==2) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_EXT_copy_texture(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_EXT_copy_texture\r
+    if ((GLeeFuncPtr_glCopyTexImage1DEXT = (GLEEPFNGLCOPYTEXIMAGE1DEXTPROC) __GLeeGetProcAddress("glCopyTexImage1DEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glCopyTexImage2DEXT = (GLEEPFNGLCOPYTEXIMAGE2DEXTPROC) __GLeeGetProcAddress("glCopyTexImage2DEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glCopyTexSubImage1DEXT = (GLEEPFNGLCOPYTEXSUBIMAGE1DEXTPROC) __GLeeGetProcAddress("glCopyTexSubImage1DEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glCopyTexSubImage2DEXT = (GLEEPFNGLCOPYTEXSUBIMAGE2DEXTPROC) __GLeeGetProcAddress("glCopyTexSubImage2DEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glCopyTexSubImage3DEXT = (GLEEPFNGLCOPYTEXSUBIMAGE3DEXTPROC) __GLeeGetProcAddress("glCopyTexSubImage3DEXT"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==5) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_EXT_histogram(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_EXT_histogram\r
+    if ((GLeeFuncPtr_glGetHistogramEXT = (GLEEPFNGLGETHISTOGRAMEXTPROC) __GLeeGetProcAddress("glGetHistogramEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetHistogramParameterfvEXT = (GLEEPFNGLGETHISTOGRAMPARAMETERFVEXTPROC) __GLeeGetProcAddress("glGetHistogramParameterfvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetHistogramParameterivEXT = (GLEEPFNGLGETHISTOGRAMPARAMETERIVEXTPROC) __GLeeGetProcAddress("glGetHistogramParameterivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetMinmaxEXT = (GLEEPFNGLGETMINMAXEXTPROC) __GLeeGetProcAddress("glGetMinmaxEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetMinmaxParameterfvEXT = (GLEEPFNGLGETMINMAXPARAMETERFVEXTPROC) __GLeeGetProcAddress("glGetMinmaxParameterfvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetMinmaxParameterivEXT = (GLEEPFNGLGETMINMAXPARAMETERIVEXTPROC) __GLeeGetProcAddress("glGetMinmaxParameterivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glHistogramEXT = (GLEEPFNGLHISTOGRAMEXTPROC) __GLeeGetProcAddress("glHistogramEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMinmaxEXT = (GLEEPFNGLMINMAXEXTPROC) __GLeeGetProcAddress("glMinmaxEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glResetHistogramEXT = (GLEEPFNGLRESETHISTOGRAMEXTPROC) __GLeeGetProcAddress("glResetHistogramEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glResetMinmaxEXT = (GLEEPFNGLRESETMINMAXEXTPROC) __GLeeGetProcAddress("glResetMinmaxEXT"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==10) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_EXT_convolution(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_EXT_convolution\r
+    if ((GLeeFuncPtr_glConvolutionFilter1DEXT = (GLEEPFNGLCONVOLUTIONFILTER1DEXTPROC) __GLeeGetProcAddress("glConvolutionFilter1DEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glConvolutionFilter2DEXT = (GLEEPFNGLCONVOLUTIONFILTER2DEXTPROC) __GLeeGetProcAddress("glConvolutionFilter2DEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glConvolutionParameterfEXT = (GLEEPFNGLCONVOLUTIONPARAMETERFEXTPROC) __GLeeGetProcAddress("glConvolutionParameterfEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glConvolutionParameterfvEXT = (GLEEPFNGLCONVOLUTIONPARAMETERFVEXTPROC) __GLeeGetProcAddress("glConvolutionParameterfvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glConvolutionParameteriEXT = (GLEEPFNGLCONVOLUTIONPARAMETERIEXTPROC) __GLeeGetProcAddress("glConvolutionParameteriEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glConvolutionParameterivEXT = (GLEEPFNGLCONVOLUTIONPARAMETERIVEXTPROC) __GLeeGetProcAddress("glConvolutionParameterivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glCopyConvolutionFilter1DEXT = (GLEEPFNGLCOPYCONVOLUTIONFILTER1DEXTPROC) __GLeeGetProcAddress("glCopyConvolutionFilter1DEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glCopyConvolutionFilter2DEXT = (GLEEPFNGLCOPYCONVOLUTIONFILTER2DEXTPROC) __GLeeGetProcAddress("glCopyConvolutionFilter2DEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetConvolutionFilterEXT = (GLEEPFNGLGETCONVOLUTIONFILTEREXTPROC) __GLeeGetProcAddress("glGetConvolutionFilterEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetConvolutionParameterfvEXT = (GLEEPFNGLGETCONVOLUTIONPARAMETERFVEXTPROC) __GLeeGetProcAddress("glGetConvolutionParameterfvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetConvolutionParameterivEXT = (GLEEPFNGLGETCONVOLUTIONPARAMETERIVEXTPROC) __GLeeGetProcAddress("glGetConvolutionParameterivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetSeparableFilterEXT = (GLEEPFNGLGETSEPARABLEFILTEREXTPROC) __GLeeGetProcAddress("glGetSeparableFilterEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glSeparableFilter2DEXT = (GLEEPFNGLSEPARABLEFILTER2DEXTPROC) __GLeeGetProcAddress("glSeparableFilter2DEXT"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==13) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_SGI_color_matrix(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_SGI_color_table(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_SGI_color_table\r
+    if ((GLeeFuncPtr_glColorTableSGI = (GLEEPFNGLCOLORTABLESGIPROC) __GLeeGetProcAddress("glColorTableSGI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glColorTableParameterfvSGI = (GLEEPFNGLCOLORTABLEPARAMETERFVSGIPROC) __GLeeGetProcAddress("glColorTableParameterfvSGI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glColorTableParameterivSGI = (GLEEPFNGLCOLORTABLEPARAMETERIVSGIPROC) __GLeeGetProcAddress("glColorTableParameterivSGI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glCopyColorTableSGI = (GLEEPFNGLCOPYCOLORTABLESGIPROC) __GLeeGetProcAddress("glCopyColorTableSGI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetColorTableSGI = (GLEEPFNGLGETCOLORTABLESGIPROC) __GLeeGetProcAddress("glGetColorTableSGI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetColorTableParameterfvSGI = (GLEEPFNGLGETCOLORTABLEPARAMETERFVSGIPROC) __GLeeGetProcAddress("glGetColorTableParameterfvSGI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetColorTableParameterivSGI = (GLEEPFNGLGETCOLORTABLEPARAMETERIVSGIPROC) __GLeeGetProcAddress("glGetColorTableParameterivSGI"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==7) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_SGIS_pixel_texture(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_SGIS_pixel_texture\r
+    if ((GLeeFuncPtr_glPixelTexGenParameteriSGIS = (GLEEPFNGLPIXELTEXGENPARAMETERISGISPROC) __GLeeGetProcAddress("glPixelTexGenParameteriSGIS"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glPixelTexGenParameterivSGIS = (GLEEPFNGLPIXELTEXGENPARAMETERIVSGISPROC) __GLeeGetProcAddress("glPixelTexGenParameterivSGIS"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glPixelTexGenParameterfSGIS = (GLEEPFNGLPIXELTEXGENPARAMETERFSGISPROC) __GLeeGetProcAddress("glPixelTexGenParameterfSGIS"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glPixelTexGenParameterfvSGIS = (GLEEPFNGLPIXELTEXGENPARAMETERFVSGISPROC) __GLeeGetProcAddress("glPixelTexGenParameterfvSGIS"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetPixelTexGenParameterivSGIS = (GLEEPFNGLGETPIXELTEXGENPARAMETERIVSGISPROC) __GLeeGetProcAddress("glGetPixelTexGenParameterivSGIS"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetPixelTexGenParameterfvSGIS = (GLEEPFNGLGETPIXELTEXGENPARAMETERFVSGISPROC) __GLeeGetProcAddress("glGetPixelTexGenParameterfvSGIS"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==6) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_SGIX_pixel_texture(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_SGIX_pixel_texture\r
+    if ((GLeeFuncPtr_glPixelTexGenSGIX = (GLEEPFNGLPIXELTEXGENSGIXPROC) __GLeeGetProcAddress("glPixelTexGenSGIX"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==1) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_SGIS_texture4D(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_SGIS_texture4D\r
+    if ((GLeeFuncPtr_glTexImage4DSGIS = (GLEEPFNGLTEXIMAGE4DSGISPROC) __GLeeGetProcAddress("glTexImage4DSGIS"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTexSubImage4DSGIS = (GLEEPFNGLTEXSUBIMAGE4DSGISPROC) __GLeeGetProcAddress("glTexSubImage4DSGIS"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==2) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_SGI_texture_color_table(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_EXT_cmyka(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_EXT_texture_object(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_EXT_texture_object\r
+    if ((GLeeFuncPtr_glAreTexturesResidentEXT = (GLEEPFNGLARETEXTURESRESIDENTEXTPROC) __GLeeGetProcAddress("glAreTexturesResidentEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glBindTextureEXT = (GLEEPFNGLBINDTEXTUREEXTPROC) __GLeeGetProcAddress("glBindTextureEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glDeleteTexturesEXT = (GLEEPFNGLDELETETEXTURESEXTPROC) __GLeeGetProcAddress("glDeleteTexturesEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGenTexturesEXT = (GLEEPFNGLGENTEXTURESEXTPROC) __GLeeGetProcAddress("glGenTexturesEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glIsTextureEXT = (GLEEPFNGLISTEXTUREEXTPROC) __GLeeGetProcAddress("glIsTextureEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glPrioritizeTexturesEXT = (GLEEPFNGLPRIORITIZETEXTURESEXTPROC) __GLeeGetProcAddress("glPrioritizeTexturesEXT"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==6) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_SGIS_detail_texture(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_SGIS_detail_texture\r
+    if ((GLeeFuncPtr_glDetailTexFuncSGIS = (GLEEPFNGLDETAILTEXFUNCSGISPROC) __GLeeGetProcAddress("glDetailTexFuncSGIS"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetDetailTexFuncSGIS = (GLEEPFNGLGETDETAILTEXFUNCSGISPROC) __GLeeGetProcAddress("glGetDetailTexFuncSGIS"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==2) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_SGIS_sharpen_texture(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_SGIS_sharpen_texture\r
+    if ((GLeeFuncPtr_glSharpenTexFuncSGIS = (GLEEPFNGLSHARPENTEXFUNCSGISPROC) __GLeeGetProcAddress("glSharpenTexFuncSGIS"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetSharpenTexFuncSGIS = (GLEEPFNGLGETSHARPENTEXFUNCSGISPROC) __GLeeGetProcAddress("glGetSharpenTexFuncSGIS"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==2) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_EXT_packed_pixels(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_SGIS_texture_lod(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_SGIS_multisample(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_SGIS_multisample\r
+    if ((GLeeFuncPtr_glSampleMaskSGIS = (GLEEPFNGLSAMPLEMASKSGISPROC) __GLeeGetProcAddress("glSampleMaskSGIS"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glSamplePatternSGIS = (GLEEPFNGLSAMPLEPATTERNSGISPROC) __GLeeGetProcAddress("glSamplePatternSGIS"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==2) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_EXT_rescale_normal(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_EXT_vertex_array(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_EXT_vertex_array\r
+    if ((GLeeFuncPtr_glArrayElementEXT = (GLEEPFNGLARRAYELEMENTEXTPROC) __GLeeGetProcAddress("glArrayElementEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glColorPointerEXT = (GLEEPFNGLCOLORPOINTEREXTPROC) __GLeeGetProcAddress("glColorPointerEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glDrawArraysEXT = (GLEEPFNGLDRAWARRAYSEXTPROC) __GLeeGetProcAddress("glDrawArraysEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glEdgeFlagPointerEXT = (GLEEPFNGLEDGEFLAGPOINTEREXTPROC) __GLeeGetProcAddress("glEdgeFlagPointerEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetPointervEXT = (GLEEPFNGLGETPOINTERVEXTPROC) __GLeeGetProcAddress("glGetPointervEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glIndexPointerEXT = (GLEEPFNGLINDEXPOINTEREXTPROC) __GLeeGetProcAddress("glIndexPointerEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glNormalPointerEXT = (GLEEPFNGLNORMALPOINTEREXTPROC) __GLeeGetProcAddress("glNormalPointerEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTexCoordPointerEXT = (GLEEPFNGLTEXCOORDPOINTEREXTPROC) __GLeeGetProcAddress("glTexCoordPointerEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexPointerEXT = (GLEEPFNGLVERTEXPOINTEREXTPROC) __GLeeGetProcAddress("glVertexPointerEXT"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==9) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_EXT_misc_attribute(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_SGIS_generate_mipmap(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_SGIX_clipmap(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_SGIX_shadow(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_SGIS_texture_edge_clamp(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_SGIS_texture_border_clamp(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_EXT_blend_minmax(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_EXT_blend_minmax\r
+    if ((GLeeFuncPtr_glBlendEquationEXT = (GLEEPFNGLBLENDEQUATIONEXTPROC) __GLeeGetProcAddress("glBlendEquationEXT"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==1) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_EXT_blend_subtract(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_EXT_blend_logic_op(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_SGIX_interlace(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_SGIX_pixel_tiles(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_SGIS_texture_select(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_SGIX_sprite(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_SGIX_sprite\r
+    if ((GLeeFuncPtr_glSpriteParameterfSGIX = (GLEEPFNGLSPRITEPARAMETERFSGIXPROC) __GLeeGetProcAddress("glSpriteParameterfSGIX"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glSpriteParameterfvSGIX = (GLEEPFNGLSPRITEPARAMETERFVSGIXPROC) __GLeeGetProcAddress("glSpriteParameterfvSGIX"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glSpriteParameteriSGIX = (GLEEPFNGLSPRITEPARAMETERISGIXPROC) __GLeeGetProcAddress("glSpriteParameteriSGIX"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glSpriteParameterivSGIX = (GLEEPFNGLSPRITEPARAMETERIVSGIXPROC) __GLeeGetProcAddress("glSpriteParameterivSGIX"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==4) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_SGIX_texture_multi_buffer(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_EXT_point_parameters(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_EXT_point_parameters\r
+    if ((GLeeFuncPtr_glPointParameterfEXT = (GLEEPFNGLPOINTPARAMETERFEXTPROC) __GLeeGetProcAddress("glPointParameterfEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glPointParameterfvEXT = (GLEEPFNGLPOINTPARAMETERFVEXTPROC) __GLeeGetProcAddress("glPointParameterfvEXT"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==2) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_SGIS_point_parameters(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_SGIS_point_parameters\r
+    if ((GLeeFuncPtr_glPointParameterfSGIS = (GLEEPFNGLPOINTPARAMETERFSGISPROC) __GLeeGetProcAddress("glPointParameterfSGIS"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glPointParameterfvSGIS = (GLEEPFNGLPOINTPARAMETERFVSGISPROC) __GLeeGetProcAddress("glPointParameterfvSGIS"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==2) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_SGIX_instruments(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_SGIX_instruments\r
+    if ((GLeeFuncPtr_glGetInstrumentsSGIX = (GLEEPFNGLGETINSTRUMENTSSGIXPROC) __GLeeGetProcAddress("glGetInstrumentsSGIX"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glInstrumentsBufferSGIX = (GLEEPFNGLINSTRUMENTSBUFFERSGIXPROC) __GLeeGetProcAddress("glInstrumentsBufferSGIX"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glPollInstrumentsSGIX = (GLEEPFNGLPOLLINSTRUMENTSSGIXPROC) __GLeeGetProcAddress("glPollInstrumentsSGIX"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glReadInstrumentsSGIX = (GLEEPFNGLREADINSTRUMENTSSGIXPROC) __GLeeGetProcAddress("glReadInstrumentsSGIX"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glStartInstrumentsSGIX = (GLEEPFNGLSTARTINSTRUMENTSSGIXPROC) __GLeeGetProcAddress("glStartInstrumentsSGIX"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glStopInstrumentsSGIX = (GLEEPFNGLSTOPINSTRUMENTSSGIXPROC) __GLeeGetProcAddress("glStopInstrumentsSGIX"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==6) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_SGIX_texture_scale_bias(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_SGIX_framezoom(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_SGIX_framezoom\r
+    if ((GLeeFuncPtr_glFrameZoomSGIX = (GLEEPFNGLFRAMEZOOMSGIXPROC) __GLeeGetProcAddress("glFrameZoomSGIX"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==1) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_SGIX_tag_sample_buffer(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_SGIX_tag_sample_buffer\r
+    if ((GLeeFuncPtr_glTagSampleBufferSGIX = (GLEEPFNGLTAGSAMPLEBUFFERSGIXPROC) __GLeeGetProcAddress("glTagSampleBufferSGIX"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==1) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_FfdMaskSGIX(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_SGIX_polynomial_ffd(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_SGIX_polynomial_ffd\r
+    if ((GLeeFuncPtr_glDeformationMap3dSGIX = (GLEEPFNGLDEFORMATIONMAP3DSGIXPROC) __GLeeGetProcAddress("glDeformationMap3dSGIX"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glDeformationMap3fSGIX = (GLEEPFNGLDEFORMATIONMAP3FSGIXPROC) __GLeeGetProcAddress("glDeformationMap3fSGIX"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glDeformSGIX = (GLEEPFNGLDEFORMSGIXPROC) __GLeeGetProcAddress("glDeformSGIX"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glLoadIdentityDeformationMapSGIX = (GLEEPFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC) __GLeeGetProcAddress("glLoadIdentityDeformationMapSGIX"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==4) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_SGIX_reference_plane(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_SGIX_reference_plane\r
+    if ((GLeeFuncPtr_glReferencePlaneSGIX = (GLEEPFNGLREFERENCEPLANESGIXPROC) __GLeeGetProcAddress("glReferencePlaneSGIX"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==1) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_SGIX_flush_raster(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_SGIX_flush_raster\r
+    if ((GLeeFuncPtr_glFlushRasterSGIX = (GLEEPFNGLFLUSHRASTERSGIXPROC) __GLeeGetProcAddress("glFlushRasterSGIX"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==1) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_SGIX_depth_texture(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_SGIS_fog_function(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_SGIS_fog_function\r
+    if ((GLeeFuncPtr_glFogFuncSGIS = (GLEEPFNGLFOGFUNCSGISPROC) __GLeeGetProcAddress("glFogFuncSGIS"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetFogFuncSGIS = (GLEEPFNGLGETFOGFUNCSGISPROC) __GLeeGetProcAddress("glGetFogFuncSGIS"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==2) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_SGIX_fog_offset(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_HP_image_transform(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_HP_image_transform\r
+    if ((GLeeFuncPtr_glImageTransformParameteriHP = (GLEEPFNGLIMAGETRANSFORMPARAMETERIHPPROC) __GLeeGetProcAddress("glImageTransformParameteriHP"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glImageTransformParameterfHP = (GLEEPFNGLIMAGETRANSFORMPARAMETERFHPPROC) __GLeeGetProcAddress("glImageTransformParameterfHP"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glImageTransformParameterivHP = (GLEEPFNGLIMAGETRANSFORMPARAMETERIVHPPROC) __GLeeGetProcAddress("glImageTransformParameterivHP"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glImageTransformParameterfvHP = (GLEEPFNGLIMAGETRANSFORMPARAMETERFVHPPROC) __GLeeGetProcAddress("glImageTransformParameterfvHP"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetImageTransformParameterivHP = (GLEEPFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC) __GLeeGetProcAddress("glGetImageTransformParameterivHP"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetImageTransformParameterfvHP = (GLEEPFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC) __GLeeGetProcAddress("glGetImageTransformParameterfvHP"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==6) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_HP_convolution_border_modes(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_INGR_palette_buffer(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_SGIX_texture_add_env(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_EXT_color_subtable(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_EXT_color_subtable\r
+    if ((GLeeFuncPtr_glColorSubTableEXT = (GLEEPFNGLCOLORSUBTABLEEXTPROC) __GLeeGetProcAddress("glColorSubTableEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glCopyColorSubTableEXT = (GLEEPFNGLCOPYCOLORSUBTABLEEXTPROC) __GLeeGetProcAddress("glCopyColorSubTableEXT"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==2) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_PGI_vertex_hints(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_PGI_misc_hints(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_PGI_misc_hints\r
+    if ((GLeeFuncPtr_glHintPGI = (GLEEPFNGLHINTPGIPROC) __GLeeGetProcAddress("glHintPGI"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==1) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_EXT_paletted_texture(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_EXT_paletted_texture\r
+    if ((GLeeFuncPtr_glColorTableEXT = (GLEEPFNGLCOLORTABLEEXTPROC) __GLeeGetProcAddress("glColorTableEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetColorTableEXT = (GLEEPFNGLGETCOLORTABLEEXTPROC) __GLeeGetProcAddress("glGetColorTableEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetColorTableParameterivEXT = (GLEEPFNGLGETCOLORTABLEPARAMETERIVEXTPROC) __GLeeGetProcAddress("glGetColorTableParameterivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetColorTableParameterfvEXT = (GLEEPFNGLGETCOLORTABLEPARAMETERFVEXTPROC) __GLeeGetProcAddress("glGetColorTableParameterfvEXT"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==4) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_EXT_clip_volume_hint(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_SGIX_list_priority(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_SGIX_list_priority\r
+    if ((GLeeFuncPtr_glGetListParameterfvSGIX = (GLEEPFNGLGETLISTPARAMETERFVSGIXPROC) __GLeeGetProcAddress("glGetListParameterfvSGIX"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetListParameterivSGIX = (GLEEPFNGLGETLISTPARAMETERIVSGIXPROC) __GLeeGetProcAddress("glGetListParameterivSGIX"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glListParameterfSGIX = (GLEEPFNGLLISTPARAMETERFSGIXPROC) __GLeeGetProcAddress("glListParameterfSGIX"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glListParameterfvSGIX = (GLEEPFNGLLISTPARAMETERFVSGIXPROC) __GLeeGetProcAddress("glListParameterfvSGIX"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glListParameteriSGIX = (GLEEPFNGLLISTPARAMETERISGIXPROC) __GLeeGetProcAddress("glListParameteriSGIX"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glListParameterivSGIX = (GLEEPFNGLLISTPARAMETERIVSGIXPROC) __GLeeGetProcAddress("glListParameterivSGIX"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==6) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_SGIX_ir_instrument1(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_SGIX_calligraphic_fragment(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_SGIX_texture_lod_bias(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_SGIX_shadow_ambient(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_EXT_index_texture(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_EXT_index_material(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_EXT_index_material\r
+    if ((GLeeFuncPtr_glIndexMaterialEXT = (GLEEPFNGLINDEXMATERIALEXTPROC) __GLeeGetProcAddress("glIndexMaterialEXT"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==1) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_EXT_index_func(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_EXT_index_func\r
+    if ((GLeeFuncPtr_glIndexFuncEXT = (GLEEPFNGLINDEXFUNCEXTPROC) __GLeeGetProcAddress("glIndexFuncEXT"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==1) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_EXT_index_array_formats(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_EXT_compiled_vertex_array(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_EXT_compiled_vertex_array\r
+    if ((GLeeFuncPtr_glLockArraysEXT = (GLEEPFNGLLOCKARRAYSEXTPROC) __GLeeGetProcAddress("glLockArraysEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUnlockArraysEXT = (GLEEPFNGLUNLOCKARRAYSEXTPROC) __GLeeGetProcAddress("glUnlockArraysEXT"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==2) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_EXT_cull_vertex(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_EXT_cull_vertex\r
+    if ((GLeeFuncPtr_glCullParameterdvEXT = (GLEEPFNGLCULLPARAMETERDVEXTPROC) __GLeeGetProcAddress("glCullParameterdvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glCullParameterfvEXT = (GLEEPFNGLCULLPARAMETERFVEXTPROC) __GLeeGetProcAddress("glCullParameterfvEXT"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==2) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_SGIX_ycrcb(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_SGIX_fragment_lighting(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_SGIX_fragment_lighting\r
+    if ((GLeeFuncPtr_glFragmentColorMaterialSGIX = (GLEEPFNGLFRAGMENTCOLORMATERIALSGIXPROC) __GLeeGetProcAddress("glFragmentColorMaterialSGIX"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFragmentLightfSGIX = (GLEEPFNGLFRAGMENTLIGHTFSGIXPROC) __GLeeGetProcAddress("glFragmentLightfSGIX"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFragmentLightfvSGIX = (GLEEPFNGLFRAGMENTLIGHTFVSGIXPROC) __GLeeGetProcAddress("glFragmentLightfvSGIX"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFragmentLightiSGIX = (GLEEPFNGLFRAGMENTLIGHTISGIXPROC) __GLeeGetProcAddress("glFragmentLightiSGIX"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFragmentLightivSGIX = (GLEEPFNGLFRAGMENTLIGHTIVSGIXPROC) __GLeeGetProcAddress("glFragmentLightivSGIX"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFragmentLightModelfSGIX = (GLEEPFNGLFRAGMENTLIGHTMODELFSGIXPROC) __GLeeGetProcAddress("glFragmentLightModelfSGIX"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFragmentLightModelfvSGIX = (GLEEPFNGLFRAGMENTLIGHTMODELFVSGIXPROC) __GLeeGetProcAddress("glFragmentLightModelfvSGIX"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFragmentLightModeliSGIX = (GLEEPFNGLFRAGMENTLIGHTMODELISGIXPROC) __GLeeGetProcAddress("glFragmentLightModeliSGIX"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFragmentLightModelivSGIX = (GLEEPFNGLFRAGMENTLIGHTMODELIVSGIXPROC) __GLeeGetProcAddress("glFragmentLightModelivSGIX"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFragmentMaterialfSGIX = (GLEEPFNGLFRAGMENTMATERIALFSGIXPROC) __GLeeGetProcAddress("glFragmentMaterialfSGIX"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFragmentMaterialfvSGIX = (GLEEPFNGLFRAGMENTMATERIALFVSGIXPROC) __GLeeGetProcAddress("glFragmentMaterialfvSGIX"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFragmentMaterialiSGIX = (GLEEPFNGLFRAGMENTMATERIALISGIXPROC) __GLeeGetProcAddress("glFragmentMaterialiSGIX"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFragmentMaterialivSGIX = (GLEEPFNGLFRAGMENTMATERIALIVSGIXPROC) __GLeeGetProcAddress("glFragmentMaterialivSGIX"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetFragmentLightfvSGIX = (GLEEPFNGLGETFRAGMENTLIGHTFVSGIXPROC) __GLeeGetProcAddress("glGetFragmentLightfvSGIX"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetFragmentLightivSGIX = (GLEEPFNGLGETFRAGMENTLIGHTIVSGIXPROC) __GLeeGetProcAddress("glGetFragmentLightivSGIX"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetFragmentMaterialfvSGIX = (GLEEPFNGLGETFRAGMENTMATERIALFVSGIXPROC) __GLeeGetProcAddress("glGetFragmentMaterialfvSGIX"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetFragmentMaterialivSGIX = (GLEEPFNGLGETFRAGMENTMATERIALIVSGIXPROC) __GLeeGetProcAddress("glGetFragmentMaterialivSGIX"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glLightEnviSGIX = (GLEEPFNGLLIGHTENVISGIXPROC) __GLeeGetProcAddress("glLightEnviSGIX"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==18) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_IBM_rasterpos_clip(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_HP_texture_lighting(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_EXT_draw_range_elements(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_EXT_draw_range_elements\r
+    if ((GLeeFuncPtr_glDrawRangeElementsEXT = (GLEEPFNGLDRAWRANGEELEMENTSEXTPROC) __GLeeGetProcAddress("glDrawRangeElementsEXT"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==1) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_WIN_phong_shading(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_WIN_specular_fog(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_EXT_light_texture(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_EXT_light_texture\r
+    if ((GLeeFuncPtr_glApplyTextureEXT = (GLEEPFNGLAPPLYTEXTUREEXTPROC) __GLeeGetProcAddress("glApplyTextureEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTextureLightEXT = (GLEEPFNGLTEXTURELIGHTEXTPROC) __GLeeGetProcAddress("glTextureLightEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTextureMaterialEXT = (GLEEPFNGLTEXTUREMATERIALEXTPROC) __GLeeGetProcAddress("glTextureMaterialEXT"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==3) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_SGIX_blend_alpha_minmax(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_SGIX_impact_pixel_texture(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_EXT_bgra(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_SGIX_async(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_SGIX_async\r
+    if ((GLeeFuncPtr_glAsyncMarkerSGIX = (GLEEPFNGLASYNCMARKERSGIXPROC) __GLeeGetProcAddress("glAsyncMarkerSGIX"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFinishAsyncSGIX = (GLEEPFNGLFINISHASYNCSGIXPROC) __GLeeGetProcAddress("glFinishAsyncSGIX"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glPollAsyncSGIX = (GLEEPFNGLPOLLASYNCSGIXPROC) __GLeeGetProcAddress("glPollAsyncSGIX"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGenAsyncMarkersSGIX = (GLEEPFNGLGENASYNCMARKERSSGIXPROC) __GLeeGetProcAddress("glGenAsyncMarkersSGIX"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glDeleteAsyncMarkersSGIX = (GLEEPFNGLDELETEASYNCMARKERSSGIXPROC) __GLeeGetProcAddress("glDeleteAsyncMarkersSGIX"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glIsAsyncMarkerSGIX = (GLEEPFNGLISASYNCMARKERSGIXPROC) __GLeeGetProcAddress("glIsAsyncMarkerSGIX"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==6) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_SGIX_async_pixel(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_SGIX_async_histogram(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_INTEL_texture_scissor(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_INTEL_parallel_arrays(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_INTEL_parallel_arrays\r
+    if ((GLeeFuncPtr_glVertexPointervINTEL = (GLEEPFNGLVERTEXPOINTERVINTELPROC) __GLeeGetProcAddress("glVertexPointervINTEL"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glNormalPointervINTEL = (GLEEPFNGLNORMALPOINTERVINTELPROC) __GLeeGetProcAddress("glNormalPointervINTEL"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glColorPointervINTEL = (GLEEPFNGLCOLORPOINTERVINTELPROC) __GLeeGetProcAddress("glColorPointervINTEL"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTexCoordPointervINTEL = (GLEEPFNGLTEXCOORDPOINTERVINTELPROC) __GLeeGetProcAddress("glTexCoordPointervINTEL"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==4) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_HP_occlusion_test(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_EXT_pixel_transform(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_EXT_pixel_transform\r
+    if ((GLeeFuncPtr_glPixelTransformParameteriEXT = (GLEEPFNGLPIXELTRANSFORMPARAMETERIEXTPROC) __GLeeGetProcAddress("glPixelTransformParameteriEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glPixelTransformParameterfEXT = (GLEEPFNGLPIXELTRANSFORMPARAMETERFEXTPROC) __GLeeGetProcAddress("glPixelTransformParameterfEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glPixelTransformParameterivEXT = (GLEEPFNGLPIXELTRANSFORMPARAMETERIVEXTPROC) __GLeeGetProcAddress("glPixelTransformParameterivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glPixelTransformParameterfvEXT = (GLEEPFNGLPIXELTRANSFORMPARAMETERFVEXTPROC) __GLeeGetProcAddress("glPixelTransformParameterfvEXT"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==4) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_EXT_pixel_transform_color_table(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_EXT_shared_texture_palette(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_EXT_separate_specular_color(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_EXT_secondary_color(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_EXT_secondary_color\r
+    if ((GLeeFuncPtr_glSecondaryColor3bEXT = (GLEEPFNGLSECONDARYCOLOR3BEXTPROC) __GLeeGetProcAddress("glSecondaryColor3bEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glSecondaryColor3bvEXT = (GLEEPFNGLSECONDARYCOLOR3BVEXTPROC) __GLeeGetProcAddress("glSecondaryColor3bvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glSecondaryColor3dEXT = (GLEEPFNGLSECONDARYCOLOR3DEXTPROC) __GLeeGetProcAddress("glSecondaryColor3dEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glSecondaryColor3dvEXT = (GLEEPFNGLSECONDARYCOLOR3DVEXTPROC) __GLeeGetProcAddress("glSecondaryColor3dvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glSecondaryColor3fEXT = (GLEEPFNGLSECONDARYCOLOR3FEXTPROC) __GLeeGetProcAddress("glSecondaryColor3fEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glSecondaryColor3fvEXT = (GLEEPFNGLSECONDARYCOLOR3FVEXTPROC) __GLeeGetProcAddress("glSecondaryColor3fvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glSecondaryColor3iEXT = (GLEEPFNGLSECONDARYCOLOR3IEXTPROC) __GLeeGetProcAddress("glSecondaryColor3iEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glSecondaryColor3ivEXT = (GLEEPFNGLSECONDARYCOLOR3IVEXTPROC) __GLeeGetProcAddress("glSecondaryColor3ivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glSecondaryColor3sEXT = (GLEEPFNGLSECONDARYCOLOR3SEXTPROC) __GLeeGetProcAddress("glSecondaryColor3sEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glSecondaryColor3svEXT = (GLEEPFNGLSECONDARYCOLOR3SVEXTPROC) __GLeeGetProcAddress("glSecondaryColor3svEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glSecondaryColor3ubEXT = (GLEEPFNGLSECONDARYCOLOR3UBEXTPROC) __GLeeGetProcAddress("glSecondaryColor3ubEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glSecondaryColor3ubvEXT = (GLEEPFNGLSECONDARYCOLOR3UBVEXTPROC) __GLeeGetProcAddress("glSecondaryColor3ubvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glSecondaryColor3uiEXT = (GLEEPFNGLSECONDARYCOLOR3UIEXTPROC) __GLeeGetProcAddress("glSecondaryColor3uiEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glSecondaryColor3uivEXT = (GLEEPFNGLSECONDARYCOLOR3UIVEXTPROC) __GLeeGetProcAddress("glSecondaryColor3uivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glSecondaryColor3usEXT = (GLEEPFNGLSECONDARYCOLOR3USEXTPROC) __GLeeGetProcAddress("glSecondaryColor3usEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glSecondaryColor3usvEXT = (GLEEPFNGLSECONDARYCOLOR3USVEXTPROC) __GLeeGetProcAddress("glSecondaryColor3usvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glSecondaryColorPointerEXT = (GLEEPFNGLSECONDARYCOLORPOINTEREXTPROC) __GLeeGetProcAddress("glSecondaryColorPointerEXT"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==17) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_EXT_texture_perturb_normal(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_EXT_texture_perturb_normal\r
+    if ((GLeeFuncPtr_glTextureNormalEXT = (GLEEPFNGLTEXTURENORMALEXTPROC) __GLeeGetProcAddress("glTextureNormalEXT"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==1) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_EXT_multi_draw_arrays(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_EXT_multi_draw_arrays\r
+    if ((GLeeFuncPtr_glMultiDrawArraysEXT = (GLEEPFNGLMULTIDRAWARRAYSEXTPROC) __GLeeGetProcAddress("glMultiDrawArraysEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiDrawElementsEXT = (GLEEPFNGLMULTIDRAWELEMENTSEXTPROC) __GLeeGetProcAddress("glMultiDrawElementsEXT"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==2) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_EXT_fog_coord(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_EXT_fog_coord\r
+    if ((GLeeFuncPtr_glFogCoordfEXT = (GLEEPFNGLFOGCOORDFEXTPROC) __GLeeGetProcAddress("glFogCoordfEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFogCoordfvEXT = (GLEEPFNGLFOGCOORDFVEXTPROC) __GLeeGetProcAddress("glFogCoordfvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFogCoorddEXT = (GLEEPFNGLFOGCOORDDEXTPROC) __GLeeGetProcAddress("glFogCoorddEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFogCoorddvEXT = (GLEEPFNGLFOGCOORDDVEXTPROC) __GLeeGetProcAddress("glFogCoorddvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFogCoordPointerEXT = (GLEEPFNGLFOGCOORDPOINTEREXTPROC) __GLeeGetProcAddress("glFogCoordPointerEXT"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==5) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_REND_screen_coordinates(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_EXT_coordinate_frame(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_EXT_coordinate_frame\r
+    if ((GLeeFuncPtr_glTangent3bEXT = (GLEEPFNGLTANGENT3BEXTPROC) __GLeeGetProcAddress("glTangent3bEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTangent3bvEXT = (GLEEPFNGLTANGENT3BVEXTPROC) __GLeeGetProcAddress("glTangent3bvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTangent3dEXT = (GLEEPFNGLTANGENT3DEXTPROC) __GLeeGetProcAddress("glTangent3dEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTangent3dvEXT = (GLEEPFNGLTANGENT3DVEXTPROC) __GLeeGetProcAddress("glTangent3dvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTangent3fEXT = (GLEEPFNGLTANGENT3FEXTPROC) __GLeeGetProcAddress("glTangent3fEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTangent3fvEXT = (GLEEPFNGLTANGENT3FVEXTPROC) __GLeeGetProcAddress("glTangent3fvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTangent3iEXT = (GLEEPFNGLTANGENT3IEXTPROC) __GLeeGetProcAddress("glTangent3iEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTangent3ivEXT = (GLEEPFNGLTANGENT3IVEXTPROC) __GLeeGetProcAddress("glTangent3ivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTangent3sEXT = (GLEEPFNGLTANGENT3SEXTPROC) __GLeeGetProcAddress("glTangent3sEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTangent3svEXT = (GLEEPFNGLTANGENT3SVEXTPROC) __GLeeGetProcAddress("glTangent3svEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glBinormal3bEXT = (GLEEPFNGLBINORMAL3BEXTPROC) __GLeeGetProcAddress("glBinormal3bEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glBinormal3bvEXT = (GLEEPFNGLBINORMAL3BVEXTPROC) __GLeeGetProcAddress("glBinormal3bvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glBinormal3dEXT = (GLEEPFNGLBINORMAL3DEXTPROC) __GLeeGetProcAddress("glBinormal3dEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glBinormal3dvEXT = (GLEEPFNGLBINORMAL3DVEXTPROC) __GLeeGetProcAddress("glBinormal3dvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glBinormal3fEXT = (GLEEPFNGLBINORMAL3FEXTPROC) __GLeeGetProcAddress("glBinormal3fEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glBinormal3fvEXT = (GLEEPFNGLBINORMAL3FVEXTPROC) __GLeeGetProcAddress("glBinormal3fvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glBinormal3iEXT = (GLEEPFNGLBINORMAL3IEXTPROC) __GLeeGetProcAddress("glBinormal3iEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glBinormal3ivEXT = (GLEEPFNGLBINORMAL3IVEXTPROC) __GLeeGetProcAddress("glBinormal3ivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glBinormal3sEXT = (GLEEPFNGLBINORMAL3SEXTPROC) __GLeeGetProcAddress("glBinormal3sEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glBinormal3svEXT = (GLEEPFNGLBINORMAL3SVEXTPROC) __GLeeGetProcAddress("glBinormal3svEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTangentPointerEXT = (GLEEPFNGLTANGENTPOINTEREXTPROC) __GLeeGetProcAddress("glTangentPointerEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glBinormalPointerEXT = (GLEEPFNGLBINORMALPOINTEREXTPROC) __GLeeGetProcAddress("glBinormalPointerEXT"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==22) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_EXT_texture_env_combine(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_APPLE_specular_vector(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_APPLE_transform_hint(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_SGIX_fog_scale(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_SUNX_constant_data(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_SUNX_constant_data\r
+    if ((GLeeFuncPtr_glFinishTextureSUNX = (GLEEPFNGLFINISHTEXTURESUNXPROC) __GLeeGetProcAddress("glFinishTextureSUNX"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==1) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_SUN_global_alpha(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_SUN_global_alpha\r
+    if ((GLeeFuncPtr_glGlobalAlphaFactorbSUN = (GLEEPFNGLGLOBALALPHAFACTORBSUNPROC) __GLeeGetProcAddress("glGlobalAlphaFactorbSUN"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGlobalAlphaFactorsSUN = (GLEEPFNGLGLOBALALPHAFACTORSSUNPROC) __GLeeGetProcAddress("glGlobalAlphaFactorsSUN"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGlobalAlphaFactoriSUN = (GLEEPFNGLGLOBALALPHAFACTORISUNPROC) __GLeeGetProcAddress("glGlobalAlphaFactoriSUN"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGlobalAlphaFactorfSUN = (GLEEPFNGLGLOBALALPHAFACTORFSUNPROC) __GLeeGetProcAddress("glGlobalAlphaFactorfSUN"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGlobalAlphaFactordSUN = (GLEEPFNGLGLOBALALPHAFACTORDSUNPROC) __GLeeGetProcAddress("glGlobalAlphaFactordSUN"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGlobalAlphaFactorubSUN = (GLEEPFNGLGLOBALALPHAFACTORUBSUNPROC) __GLeeGetProcAddress("glGlobalAlphaFactorubSUN"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGlobalAlphaFactorusSUN = (GLEEPFNGLGLOBALALPHAFACTORUSSUNPROC) __GLeeGetProcAddress("glGlobalAlphaFactorusSUN"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGlobalAlphaFactoruiSUN = (GLEEPFNGLGLOBALALPHAFACTORUISUNPROC) __GLeeGetProcAddress("glGlobalAlphaFactoruiSUN"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==8) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_SUN_triangle_list(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_SUN_triangle_list\r
+    if ((GLeeFuncPtr_glReplacementCodeuiSUN = (GLEEPFNGLREPLACEMENTCODEUISUNPROC) __GLeeGetProcAddress("glReplacementCodeuiSUN"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glReplacementCodeusSUN = (GLEEPFNGLREPLACEMENTCODEUSSUNPROC) __GLeeGetProcAddress("glReplacementCodeusSUN"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glReplacementCodeubSUN = (GLEEPFNGLREPLACEMENTCODEUBSUNPROC) __GLeeGetProcAddress("glReplacementCodeubSUN"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glReplacementCodeuivSUN = (GLEEPFNGLREPLACEMENTCODEUIVSUNPROC) __GLeeGetProcAddress("glReplacementCodeuivSUN"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glReplacementCodeusvSUN = (GLEEPFNGLREPLACEMENTCODEUSVSUNPROC) __GLeeGetProcAddress("glReplacementCodeusvSUN"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glReplacementCodeubvSUN = (GLEEPFNGLREPLACEMENTCODEUBVSUNPROC) __GLeeGetProcAddress("glReplacementCodeubvSUN"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glReplacementCodePointerSUN = (GLEEPFNGLREPLACEMENTCODEPOINTERSUNPROC) __GLeeGetProcAddress("glReplacementCodePointerSUN"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==7) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_SUN_vertex(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_SUN_vertex\r
+    if ((GLeeFuncPtr_glColor4ubVertex2fSUN = (GLEEPFNGLCOLOR4UBVERTEX2FSUNPROC) __GLeeGetProcAddress("glColor4ubVertex2fSUN"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glColor4ubVertex2fvSUN = (GLEEPFNGLCOLOR4UBVERTEX2FVSUNPROC) __GLeeGetProcAddress("glColor4ubVertex2fvSUN"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glColor4ubVertex3fSUN = (GLEEPFNGLCOLOR4UBVERTEX3FSUNPROC) __GLeeGetProcAddress("glColor4ubVertex3fSUN"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glColor4ubVertex3fvSUN = (GLEEPFNGLCOLOR4UBVERTEX3FVSUNPROC) __GLeeGetProcAddress("glColor4ubVertex3fvSUN"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glColor3fVertex3fSUN = (GLEEPFNGLCOLOR3FVERTEX3FSUNPROC) __GLeeGetProcAddress("glColor3fVertex3fSUN"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glColor3fVertex3fvSUN = (GLEEPFNGLCOLOR3FVERTEX3FVSUNPROC) __GLeeGetProcAddress("glColor3fVertex3fvSUN"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glNormal3fVertex3fSUN = (GLEEPFNGLNORMAL3FVERTEX3FSUNPROC) __GLeeGetProcAddress("glNormal3fVertex3fSUN"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glNormal3fVertex3fvSUN = (GLEEPFNGLNORMAL3FVERTEX3FVSUNPROC) __GLeeGetProcAddress("glNormal3fVertex3fvSUN"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glColor4fNormal3fVertex3fSUN = (GLEEPFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC) __GLeeGetProcAddress("glColor4fNormal3fVertex3fSUN"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glColor4fNormal3fVertex3fvSUN = (GLEEPFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC) __GLeeGetProcAddress("glColor4fNormal3fVertex3fvSUN"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTexCoord2fVertex3fSUN = (GLEEPFNGLTEXCOORD2FVERTEX3FSUNPROC) __GLeeGetProcAddress("glTexCoord2fVertex3fSUN"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTexCoord2fVertex3fvSUN = (GLEEPFNGLTEXCOORD2FVERTEX3FVSUNPROC) __GLeeGetProcAddress("glTexCoord2fVertex3fvSUN"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTexCoord4fVertex4fSUN = (GLEEPFNGLTEXCOORD4FVERTEX4FSUNPROC) __GLeeGetProcAddress("glTexCoord4fVertex4fSUN"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTexCoord4fVertex4fvSUN = (GLEEPFNGLTEXCOORD4FVERTEX4FVSUNPROC) __GLeeGetProcAddress("glTexCoord4fVertex4fvSUN"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTexCoord2fColor4ubVertex3fSUN = (GLEEPFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC) __GLeeGetProcAddress("glTexCoord2fColor4ubVertex3fSUN"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTexCoord2fColor4ubVertex3fvSUN = (GLEEPFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC) __GLeeGetProcAddress("glTexCoord2fColor4ubVertex3fvSUN"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTexCoord2fColor3fVertex3fSUN = (GLEEPFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC) __GLeeGetProcAddress("glTexCoord2fColor3fVertex3fSUN"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTexCoord2fColor3fVertex3fvSUN = (GLEEPFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC) __GLeeGetProcAddress("glTexCoord2fColor3fVertex3fvSUN"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTexCoord2fNormal3fVertex3fSUN = (GLEEPFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC) __GLeeGetProcAddress("glTexCoord2fNormal3fVertex3fSUN"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTexCoord2fNormal3fVertex3fvSUN = (GLEEPFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) __GLeeGetProcAddress("glTexCoord2fNormal3fVertex3fvSUN"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTexCoord2fColor4fNormal3fVertex3fSUN = (GLEEPFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) __GLeeGetProcAddress("glTexCoord2fColor4fNormal3fVertex3fSUN"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTexCoord2fColor4fNormal3fVertex3fvSUN = (GLEEPFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) __GLeeGetProcAddress("glTexCoord2fColor4fNormal3fVertex3fvSUN"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTexCoord4fColor4fNormal3fVertex4fSUN = (GLEEPFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC) __GLeeGetProcAddress("glTexCoord4fColor4fNormal3fVertex4fSUN"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTexCoord4fColor4fNormal3fVertex4fvSUN = (GLEEPFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC) __GLeeGetProcAddress("glTexCoord4fColor4fNormal3fVertex4fvSUN"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glReplacementCodeuiVertex3fSUN = (GLEEPFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC) __GLeeGetProcAddress("glReplacementCodeuiVertex3fSUN"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glReplacementCodeuiVertex3fvSUN = (GLEEPFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC) __GLeeGetProcAddress("glReplacementCodeuiVertex3fvSUN"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glReplacementCodeuiColor4ubVertex3fSUN = (GLEEPFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC) __GLeeGetProcAddress("glReplacementCodeuiColor4ubVertex3fSUN"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glReplacementCodeuiColor4ubVertex3fvSUN = (GLEEPFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC) __GLeeGetProcAddress("glReplacementCodeuiColor4ubVertex3fvSUN"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glReplacementCodeuiColor3fVertex3fSUN = (GLEEPFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC) __GLeeGetProcAddress("glReplacementCodeuiColor3fVertex3fSUN"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glReplacementCodeuiColor3fVertex3fvSUN = (GLEEPFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC) __GLeeGetProcAddress("glReplacementCodeuiColor3fVertex3fvSUN"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glReplacementCodeuiNormal3fVertex3fSUN = (GLEEPFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC) __GLeeGetProcAddress("glReplacementCodeuiNormal3fVertex3fSUN"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glReplacementCodeuiNormal3fVertex3fvSUN = (GLEEPFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC) __GLeeGetProcAddress("glReplacementCodeuiNormal3fVertex3fvSUN"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glReplacementCodeuiColor4fNormal3fVertex3fSUN = (GLEEPFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC) __GLeeGetProcAddress("glReplacementCodeuiColor4fNormal3fVertex3fSUN"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glReplacementCodeuiColor4fNormal3fVertex3fvSUN = (GLEEPFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC) __GLeeGetProcAddress("glReplacementCodeuiColor4fNormal3fVertex3fvSUN"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glReplacementCodeuiTexCoord2fVertex3fSUN = (GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC) __GLeeGetProcAddress("glReplacementCodeuiTexCoord2fVertex3fSUN"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glReplacementCodeuiTexCoord2fVertex3fvSUN = (GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC) __GLeeGetProcAddress("glReplacementCodeuiTexCoord2fVertex3fvSUN"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN = (GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC) __GLeeGetProcAddress("glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN = (GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) __GLeeGetProcAddress("glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN = (GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) __GLeeGetProcAddress("glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN = (GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) __GLeeGetProcAddress("glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==40) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_EXT_blend_func_separate(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_EXT_blend_func_separate\r
+    if ((GLeeFuncPtr_glBlendFuncSeparateEXT = (GLEEPFNGLBLENDFUNCSEPARATEEXTPROC) __GLeeGetProcAddress("glBlendFuncSeparateEXT"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==1) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_INGR_color_clamp(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_INGR_interlace_read(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_EXT_stencil_wrap(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_EXT_422_pixels(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_NV_texgen_reflection(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_EXT_texture_cube_map(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_SUN_convolution_border_modes(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_EXT_texture_env_add(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_EXT_texture_lod_bias(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_EXT_texture_filter_anisotropic(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_EXT_vertex_weighting(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_EXT_vertex_weighting\r
+    if ((GLeeFuncPtr_glVertexWeightfEXT = (GLEEPFNGLVERTEXWEIGHTFEXTPROC) __GLeeGetProcAddress("glVertexWeightfEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexWeightfvEXT = (GLEEPFNGLVERTEXWEIGHTFVEXTPROC) __GLeeGetProcAddress("glVertexWeightfvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexWeightPointerEXT = (GLEEPFNGLVERTEXWEIGHTPOINTEREXTPROC) __GLeeGetProcAddress("glVertexWeightPointerEXT"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==3) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_NV_light_max_exponent(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_NV_vertex_array_range(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_NV_vertex_array_range\r
+    if ((GLeeFuncPtr_glFlushVertexArrayRangeNV = (GLEEPFNGLFLUSHVERTEXARRAYRANGENVPROC) __GLeeGetProcAddress("glFlushVertexArrayRangeNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexArrayRangeNV = (GLEEPFNGLVERTEXARRAYRANGENVPROC) __GLeeGetProcAddress("glVertexArrayRangeNV"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==2) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_NV_register_combiners(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_NV_register_combiners\r
+    if ((GLeeFuncPtr_glCombinerParameterfvNV = (GLEEPFNGLCOMBINERPARAMETERFVNVPROC) __GLeeGetProcAddress("glCombinerParameterfvNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glCombinerParameterfNV = (GLEEPFNGLCOMBINERPARAMETERFNVPROC) __GLeeGetProcAddress("glCombinerParameterfNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glCombinerParameterivNV = (GLEEPFNGLCOMBINERPARAMETERIVNVPROC) __GLeeGetProcAddress("glCombinerParameterivNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glCombinerParameteriNV = (GLEEPFNGLCOMBINERPARAMETERINVPROC) __GLeeGetProcAddress("glCombinerParameteriNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glCombinerInputNV = (GLEEPFNGLCOMBINERINPUTNVPROC) __GLeeGetProcAddress("glCombinerInputNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glCombinerOutputNV = (GLEEPFNGLCOMBINEROUTPUTNVPROC) __GLeeGetProcAddress("glCombinerOutputNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFinalCombinerInputNV = (GLEEPFNGLFINALCOMBINERINPUTNVPROC) __GLeeGetProcAddress("glFinalCombinerInputNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetCombinerInputParameterfvNV = (GLEEPFNGLGETCOMBINERINPUTPARAMETERFVNVPROC) __GLeeGetProcAddress("glGetCombinerInputParameterfvNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetCombinerInputParameterivNV = (GLEEPFNGLGETCOMBINERINPUTPARAMETERIVNVPROC) __GLeeGetProcAddress("glGetCombinerInputParameterivNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetCombinerOutputParameterfvNV = (GLEEPFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC) __GLeeGetProcAddress("glGetCombinerOutputParameterfvNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetCombinerOutputParameterivNV = (GLEEPFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC) __GLeeGetProcAddress("glGetCombinerOutputParameterivNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetFinalCombinerInputParameterfvNV = (GLEEPFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC) __GLeeGetProcAddress("glGetFinalCombinerInputParameterfvNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetFinalCombinerInputParameterivNV = (GLEEPFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC) __GLeeGetProcAddress("glGetFinalCombinerInputParameterivNV"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==13) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_NV_fog_distance(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_NV_texgen_emboss(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_NV_blend_square(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_NV_texture_env_combine4(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_MESA_resize_buffers(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_MESA_resize_buffers\r
+    if ((GLeeFuncPtr_glResizeBuffersMESA = (GLEEPFNGLRESIZEBUFFERSMESAPROC) __GLeeGetProcAddress("glResizeBuffersMESA"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==1) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_MESA_window_pos(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_MESA_window_pos\r
+    if ((GLeeFuncPtr_glWindowPos2dMESA = (GLEEPFNGLWINDOWPOS2DMESAPROC) __GLeeGetProcAddress("glWindowPos2dMESA"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glWindowPos2dvMESA = (GLEEPFNGLWINDOWPOS2DVMESAPROC) __GLeeGetProcAddress("glWindowPos2dvMESA"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glWindowPos2fMESA = (GLEEPFNGLWINDOWPOS2FMESAPROC) __GLeeGetProcAddress("glWindowPos2fMESA"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glWindowPos2fvMESA = (GLEEPFNGLWINDOWPOS2FVMESAPROC) __GLeeGetProcAddress("glWindowPos2fvMESA"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glWindowPos2iMESA = (GLEEPFNGLWINDOWPOS2IMESAPROC) __GLeeGetProcAddress("glWindowPos2iMESA"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glWindowPos2ivMESA = (GLEEPFNGLWINDOWPOS2IVMESAPROC) __GLeeGetProcAddress("glWindowPos2ivMESA"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glWindowPos2sMESA = (GLEEPFNGLWINDOWPOS2SMESAPROC) __GLeeGetProcAddress("glWindowPos2sMESA"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glWindowPos2svMESA = (GLEEPFNGLWINDOWPOS2SVMESAPROC) __GLeeGetProcAddress("glWindowPos2svMESA"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glWindowPos3dMESA = (GLEEPFNGLWINDOWPOS3DMESAPROC) __GLeeGetProcAddress("glWindowPos3dMESA"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glWindowPos3dvMESA = (GLEEPFNGLWINDOWPOS3DVMESAPROC) __GLeeGetProcAddress("glWindowPos3dvMESA"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glWindowPos3fMESA = (GLEEPFNGLWINDOWPOS3FMESAPROC) __GLeeGetProcAddress("glWindowPos3fMESA"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glWindowPos3fvMESA = (GLEEPFNGLWINDOWPOS3FVMESAPROC) __GLeeGetProcAddress("glWindowPos3fvMESA"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glWindowPos3iMESA = (GLEEPFNGLWINDOWPOS3IMESAPROC) __GLeeGetProcAddress("glWindowPos3iMESA"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glWindowPos3ivMESA = (GLEEPFNGLWINDOWPOS3IVMESAPROC) __GLeeGetProcAddress("glWindowPos3ivMESA"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glWindowPos3sMESA = (GLEEPFNGLWINDOWPOS3SMESAPROC) __GLeeGetProcAddress("glWindowPos3sMESA"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glWindowPos3svMESA = (GLEEPFNGLWINDOWPOS3SVMESAPROC) __GLeeGetProcAddress("glWindowPos3svMESA"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glWindowPos4dMESA = (GLEEPFNGLWINDOWPOS4DMESAPROC) __GLeeGetProcAddress("glWindowPos4dMESA"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glWindowPos4dvMESA = (GLEEPFNGLWINDOWPOS4DVMESAPROC) __GLeeGetProcAddress("glWindowPos4dvMESA"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glWindowPos4fMESA = (GLEEPFNGLWINDOWPOS4FMESAPROC) __GLeeGetProcAddress("glWindowPos4fMESA"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glWindowPos4fvMESA = (GLEEPFNGLWINDOWPOS4FVMESAPROC) __GLeeGetProcAddress("glWindowPos4fvMESA"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glWindowPos4iMESA = (GLEEPFNGLWINDOWPOS4IMESAPROC) __GLeeGetProcAddress("glWindowPos4iMESA"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glWindowPos4ivMESA = (GLEEPFNGLWINDOWPOS4IVMESAPROC) __GLeeGetProcAddress("glWindowPos4ivMESA"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glWindowPos4sMESA = (GLEEPFNGLWINDOWPOS4SMESAPROC) __GLeeGetProcAddress("glWindowPos4sMESA"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glWindowPos4svMESA = (GLEEPFNGLWINDOWPOS4SVMESAPROC) __GLeeGetProcAddress("glWindowPos4svMESA"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==24) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_EXT_texture_compression_s3tc(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_IBM_cull_vertex(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_IBM_multimode_draw_arrays(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_IBM_multimode_draw_arrays\r
+    if ((GLeeFuncPtr_glMultiModeDrawArraysIBM = (GLEEPFNGLMULTIMODEDRAWARRAYSIBMPROC) __GLeeGetProcAddress("glMultiModeDrawArraysIBM"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiModeDrawElementsIBM = (GLEEPFNGLMULTIMODEDRAWELEMENTSIBMPROC) __GLeeGetProcAddress("glMultiModeDrawElementsIBM"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==2) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_IBM_vertex_array_lists(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_IBM_vertex_array_lists\r
+    if ((GLeeFuncPtr_glColorPointerListIBM = (GLEEPFNGLCOLORPOINTERLISTIBMPROC) __GLeeGetProcAddress("glColorPointerListIBM"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glSecondaryColorPointerListIBM = (GLEEPFNGLSECONDARYCOLORPOINTERLISTIBMPROC) __GLeeGetProcAddress("glSecondaryColorPointerListIBM"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glEdgeFlagPointerListIBM = (GLEEPFNGLEDGEFLAGPOINTERLISTIBMPROC) __GLeeGetProcAddress("glEdgeFlagPointerListIBM"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFogCoordPointerListIBM = (GLEEPFNGLFOGCOORDPOINTERLISTIBMPROC) __GLeeGetProcAddress("glFogCoordPointerListIBM"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glIndexPointerListIBM = (GLEEPFNGLINDEXPOINTERLISTIBMPROC) __GLeeGetProcAddress("glIndexPointerListIBM"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glNormalPointerListIBM = (GLEEPFNGLNORMALPOINTERLISTIBMPROC) __GLeeGetProcAddress("glNormalPointerListIBM"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTexCoordPointerListIBM = (GLEEPFNGLTEXCOORDPOINTERLISTIBMPROC) __GLeeGetProcAddress("glTexCoordPointerListIBM"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexPointerListIBM = (GLEEPFNGLVERTEXPOINTERLISTIBMPROC) __GLeeGetProcAddress("glVertexPointerListIBM"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==8) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_SGIX_subsample(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_SGIX_ycrcb_subsample(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_SGIX_ycrcba(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_SGI_depth_pass_instrument(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_3DFX_texture_compression_FXT1(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_3DFX_multisample(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_3DFX_tbuffer(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_3DFX_tbuffer\r
+    if ((GLeeFuncPtr_glTbufferMask3DFX = (GLEEPFNGLTBUFFERMASK3DFXPROC) __GLeeGetProcAddress("glTbufferMask3DFX"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==1) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_EXT_multisample(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_EXT_multisample\r
+    if ((GLeeFuncPtr_glSampleMaskEXT = (GLEEPFNGLSAMPLEMASKEXTPROC) __GLeeGetProcAddress("glSampleMaskEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glSamplePatternEXT = (GLEEPFNGLSAMPLEPATTERNEXTPROC) __GLeeGetProcAddress("glSamplePatternEXT"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==2) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_SGIX_vertex_preclip(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_SGIX_convolution_accuracy(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_SGIX_resample(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_SGIS_point_line_texgen(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_SGIS_texture_color_mask(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_SGIS_texture_color_mask\r
+    if ((GLeeFuncPtr_glTextureColorMaskSGIS = (GLEEPFNGLTEXTURECOLORMASKSGISPROC) __GLeeGetProcAddress("glTextureColorMaskSGIS"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==1) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_EXT_texture_env_dot3(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_ATI_texture_mirror_once(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_NV_fence(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_NV_fence\r
+    if ((GLeeFuncPtr_glDeleteFencesNV = (GLEEPFNGLDELETEFENCESNVPROC) __GLeeGetProcAddress("glDeleteFencesNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGenFencesNV = (GLEEPFNGLGENFENCESNVPROC) __GLeeGetProcAddress("glGenFencesNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glIsFenceNV = (GLEEPFNGLISFENCENVPROC) __GLeeGetProcAddress("glIsFenceNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTestFenceNV = (GLEEPFNGLTESTFENCENVPROC) __GLeeGetProcAddress("glTestFenceNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetFenceivNV = (GLEEPFNGLGETFENCEIVNVPROC) __GLeeGetProcAddress("glGetFenceivNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFinishFenceNV = (GLEEPFNGLFINISHFENCENVPROC) __GLeeGetProcAddress("glFinishFenceNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glSetFenceNV = (GLEEPFNGLSETFENCENVPROC) __GLeeGetProcAddress("glSetFenceNV"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==7) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_IBM_texture_mirrored_repeat(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_NV_evaluators(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_NV_evaluators\r
+    if ((GLeeFuncPtr_glMapControlPointsNV = (GLEEPFNGLMAPCONTROLPOINTSNVPROC) __GLeeGetProcAddress("glMapControlPointsNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMapParameterivNV = (GLEEPFNGLMAPPARAMETERIVNVPROC) __GLeeGetProcAddress("glMapParameterivNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMapParameterfvNV = (GLEEPFNGLMAPPARAMETERFVNVPROC) __GLeeGetProcAddress("glMapParameterfvNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetMapControlPointsNV = (GLEEPFNGLGETMAPCONTROLPOINTSNVPROC) __GLeeGetProcAddress("glGetMapControlPointsNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetMapParameterivNV = (GLEEPFNGLGETMAPPARAMETERIVNVPROC) __GLeeGetProcAddress("glGetMapParameterivNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetMapParameterfvNV = (GLEEPFNGLGETMAPPARAMETERFVNVPROC) __GLeeGetProcAddress("glGetMapParameterfvNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetMapAttribParameterivNV = (GLEEPFNGLGETMAPATTRIBPARAMETERIVNVPROC) __GLeeGetProcAddress("glGetMapAttribParameterivNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetMapAttribParameterfvNV = (GLEEPFNGLGETMAPATTRIBPARAMETERFVNVPROC) __GLeeGetProcAddress("glGetMapAttribParameterfvNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glEvalMapsNV = (GLEEPFNGLEVALMAPSNVPROC) __GLeeGetProcAddress("glEvalMapsNV"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==9) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_NV_packed_depth_stencil(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_NV_register_combiners2(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_NV_register_combiners2\r
+    if ((GLeeFuncPtr_glCombinerStageParameterfvNV = (GLEEPFNGLCOMBINERSTAGEPARAMETERFVNVPROC) __GLeeGetProcAddress("glCombinerStageParameterfvNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetCombinerStageParameterfvNV = (GLEEPFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC) __GLeeGetProcAddress("glGetCombinerStageParameterfvNV"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==2) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_NV_texture_compression_vtc(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_NV_texture_rectangle(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_NV_texture_shader(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_NV_texture_shader2(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_NV_vertex_array_range2(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_NV_vertex_program(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_NV_vertex_program\r
+    if ((GLeeFuncPtr_glAreProgramsResidentNV = (GLEEPFNGLAREPROGRAMSRESIDENTNVPROC) __GLeeGetProcAddress("glAreProgramsResidentNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glBindProgramNV = (GLEEPFNGLBINDPROGRAMNVPROC) __GLeeGetProcAddress("glBindProgramNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glDeleteProgramsNV = (GLEEPFNGLDELETEPROGRAMSNVPROC) __GLeeGetProcAddress("glDeleteProgramsNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glExecuteProgramNV = (GLEEPFNGLEXECUTEPROGRAMNVPROC) __GLeeGetProcAddress("glExecuteProgramNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGenProgramsNV = (GLEEPFNGLGENPROGRAMSNVPROC) __GLeeGetProcAddress("glGenProgramsNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetProgramParameterdvNV = (GLEEPFNGLGETPROGRAMPARAMETERDVNVPROC) __GLeeGetProcAddress("glGetProgramParameterdvNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetProgramParameterfvNV = (GLEEPFNGLGETPROGRAMPARAMETERFVNVPROC) __GLeeGetProcAddress("glGetProgramParameterfvNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetProgramivNV = (GLEEPFNGLGETPROGRAMIVNVPROC) __GLeeGetProcAddress("glGetProgramivNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetProgramStringNV = (GLEEPFNGLGETPROGRAMSTRINGNVPROC) __GLeeGetProcAddress("glGetProgramStringNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetTrackMatrixivNV = (GLEEPFNGLGETTRACKMATRIXIVNVPROC) __GLeeGetProcAddress("glGetTrackMatrixivNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetVertexAttribdvNV = (GLEEPFNGLGETVERTEXATTRIBDVNVPROC) __GLeeGetProcAddress("glGetVertexAttribdvNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetVertexAttribfvNV = (GLEEPFNGLGETVERTEXATTRIBFVNVPROC) __GLeeGetProcAddress("glGetVertexAttribfvNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetVertexAttribivNV = (GLEEPFNGLGETVERTEXATTRIBIVNVPROC) __GLeeGetProcAddress("glGetVertexAttribivNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetVertexAttribPointervNV = (GLEEPFNGLGETVERTEXATTRIBPOINTERVNVPROC) __GLeeGetProcAddress("glGetVertexAttribPointervNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glIsProgramNV = (GLEEPFNGLISPROGRAMNVPROC) __GLeeGetProcAddress("glIsProgramNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glLoadProgramNV = (GLEEPFNGLLOADPROGRAMNVPROC) __GLeeGetProcAddress("glLoadProgramNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramParameter4dNV = (GLEEPFNGLPROGRAMPARAMETER4DNVPROC) __GLeeGetProcAddress("glProgramParameter4dNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramParameter4dvNV = (GLEEPFNGLPROGRAMPARAMETER4DVNVPROC) __GLeeGetProcAddress("glProgramParameter4dvNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramParameter4fNV = (GLEEPFNGLPROGRAMPARAMETER4FNVPROC) __GLeeGetProcAddress("glProgramParameter4fNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramParameter4fvNV = (GLEEPFNGLPROGRAMPARAMETER4FVNVPROC) __GLeeGetProcAddress("glProgramParameter4fvNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramParameters4dvNV = (GLEEPFNGLPROGRAMPARAMETERS4DVNVPROC) __GLeeGetProcAddress("glProgramParameters4dvNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramParameters4fvNV = (GLEEPFNGLPROGRAMPARAMETERS4FVNVPROC) __GLeeGetProcAddress("glProgramParameters4fvNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glRequestResidentProgramsNV = (GLEEPFNGLREQUESTRESIDENTPROGRAMSNVPROC) __GLeeGetProcAddress("glRequestResidentProgramsNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTrackMatrixNV = (GLEEPFNGLTRACKMATRIXNVPROC) __GLeeGetProcAddress("glTrackMatrixNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttribPointerNV = (GLEEPFNGLVERTEXATTRIBPOINTERNVPROC) __GLeeGetProcAddress("glVertexAttribPointerNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib1dNV = (GLEEPFNGLVERTEXATTRIB1DNVPROC) __GLeeGetProcAddress("glVertexAttrib1dNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib1dvNV = (GLEEPFNGLVERTEXATTRIB1DVNVPROC) __GLeeGetProcAddress("glVertexAttrib1dvNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib1fNV = (GLEEPFNGLVERTEXATTRIB1FNVPROC) __GLeeGetProcAddress("glVertexAttrib1fNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib1fvNV = (GLEEPFNGLVERTEXATTRIB1FVNVPROC) __GLeeGetProcAddress("glVertexAttrib1fvNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib1sNV = (GLEEPFNGLVERTEXATTRIB1SNVPROC) __GLeeGetProcAddress("glVertexAttrib1sNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib1svNV = (GLEEPFNGLVERTEXATTRIB1SVNVPROC) __GLeeGetProcAddress("glVertexAttrib1svNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib2dNV = (GLEEPFNGLVERTEXATTRIB2DNVPROC) __GLeeGetProcAddress("glVertexAttrib2dNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib2dvNV = (GLEEPFNGLVERTEXATTRIB2DVNVPROC) __GLeeGetProcAddress("glVertexAttrib2dvNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib2fNV = (GLEEPFNGLVERTEXATTRIB2FNVPROC) __GLeeGetProcAddress("glVertexAttrib2fNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib2fvNV = (GLEEPFNGLVERTEXATTRIB2FVNVPROC) __GLeeGetProcAddress("glVertexAttrib2fvNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib2sNV = (GLEEPFNGLVERTEXATTRIB2SNVPROC) __GLeeGetProcAddress("glVertexAttrib2sNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib2svNV = (GLEEPFNGLVERTEXATTRIB2SVNVPROC) __GLeeGetProcAddress("glVertexAttrib2svNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib3dNV = (GLEEPFNGLVERTEXATTRIB3DNVPROC) __GLeeGetProcAddress("glVertexAttrib3dNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib3dvNV = (GLEEPFNGLVERTEXATTRIB3DVNVPROC) __GLeeGetProcAddress("glVertexAttrib3dvNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib3fNV = (GLEEPFNGLVERTEXATTRIB3FNVPROC) __GLeeGetProcAddress("glVertexAttrib3fNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib3fvNV = (GLEEPFNGLVERTEXATTRIB3FVNVPROC) __GLeeGetProcAddress("glVertexAttrib3fvNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib3sNV = (GLEEPFNGLVERTEXATTRIB3SNVPROC) __GLeeGetProcAddress("glVertexAttrib3sNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib3svNV = (GLEEPFNGLVERTEXATTRIB3SVNVPROC) __GLeeGetProcAddress("glVertexAttrib3svNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib4dNV = (GLEEPFNGLVERTEXATTRIB4DNVPROC) __GLeeGetProcAddress("glVertexAttrib4dNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib4dvNV = (GLEEPFNGLVERTEXATTRIB4DVNVPROC) __GLeeGetProcAddress("glVertexAttrib4dvNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib4fNV = (GLEEPFNGLVERTEXATTRIB4FNVPROC) __GLeeGetProcAddress("glVertexAttrib4fNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib4fvNV = (GLEEPFNGLVERTEXATTRIB4FVNVPROC) __GLeeGetProcAddress("glVertexAttrib4fvNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib4sNV = (GLEEPFNGLVERTEXATTRIB4SNVPROC) __GLeeGetProcAddress("glVertexAttrib4sNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib4svNV = (GLEEPFNGLVERTEXATTRIB4SVNVPROC) __GLeeGetProcAddress("glVertexAttrib4svNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib4ubNV = (GLEEPFNGLVERTEXATTRIB4UBNVPROC) __GLeeGetProcAddress("glVertexAttrib4ubNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib4ubvNV = (GLEEPFNGLVERTEXATTRIB4UBVNVPROC) __GLeeGetProcAddress("glVertexAttrib4ubvNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttribs1dvNV = (GLEEPFNGLVERTEXATTRIBS1DVNVPROC) __GLeeGetProcAddress("glVertexAttribs1dvNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttribs1fvNV = (GLEEPFNGLVERTEXATTRIBS1FVNVPROC) __GLeeGetProcAddress("glVertexAttribs1fvNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttribs1svNV = (GLEEPFNGLVERTEXATTRIBS1SVNVPROC) __GLeeGetProcAddress("glVertexAttribs1svNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttribs2dvNV = (GLEEPFNGLVERTEXATTRIBS2DVNVPROC) __GLeeGetProcAddress("glVertexAttribs2dvNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttribs2fvNV = (GLEEPFNGLVERTEXATTRIBS2FVNVPROC) __GLeeGetProcAddress("glVertexAttribs2fvNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttribs2svNV = (GLEEPFNGLVERTEXATTRIBS2SVNVPROC) __GLeeGetProcAddress("glVertexAttribs2svNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttribs3dvNV = (GLEEPFNGLVERTEXATTRIBS3DVNVPROC) __GLeeGetProcAddress("glVertexAttribs3dvNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttribs3fvNV = (GLEEPFNGLVERTEXATTRIBS3FVNVPROC) __GLeeGetProcAddress("glVertexAttribs3fvNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttribs3svNV = (GLEEPFNGLVERTEXATTRIBS3SVNVPROC) __GLeeGetProcAddress("glVertexAttribs3svNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttribs4dvNV = (GLEEPFNGLVERTEXATTRIBS4DVNVPROC) __GLeeGetProcAddress("glVertexAttribs4dvNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttribs4fvNV = (GLEEPFNGLVERTEXATTRIBS4FVNVPROC) __GLeeGetProcAddress("glVertexAttribs4fvNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttribs4svNV = (GLEEPFNGLVERTEXATTRIBS4SVNVPROC) __GLeeGetProcAddress("glVertexAttribs4svNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttribs4ubvNV = (GLEEPFNGLVERTEXATTRIBS4UBVNVPROC) __GLeeGetProcAddress("glVertexAttribs4ubvNV"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==64) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_SGIX_texture_coordinate_clamp(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_SGIX_scalebias_hint(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_OML_interlace(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_OML_subsample(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_OML_resample(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_NV_copy_depth_to_color(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_ATI_envmap_bumpmap(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_ATI_envmap_bumpmap\r
+    if ((GLeeFuncPtr_glTexBumpParameterivATI = (GLEEPFNGLTEXBUMPPARAMETERIVATIPROC) __GLeeGetProcAddress("glTexBumpParameterivATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTexBumpParameterfvATI = (GLEEPFNGLTEXBUMPPARAMETERFVATIPROC) __GLeeGetProcAddress("glTexBumpParameterfvATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetTexBumpParameterivATI = (GLEEPFNGLGETTEXBUMPPARAMETERIVATIPROC) __GLeeGetProcAddress("glGetTexBumpParameterivATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetTexBumpParameterfvATI = (GLEEPFNGLGETTEXBUMPPARAMETERFVATIPROC) __GLeeGetProcAddress("glGetTexBumpParameterfvATI"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==4) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_ATI_fragment_shader(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_ATI_fragment_shader\r
+    if ((GLeeFuncPtr_glGenFragmentShadersATI = (GLEEPFNGLGENFRAGMENTSHADERSATIPROC) __GLeeGetProcAddress("glGenFragmentShadersATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glBindFragmentShaderATI = (GLEEPFNGLBINDFRAGMENTSHADERATIPROC) __GLeeGetProcAddress("glBindFragmentShaderATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glDeleteFragmentShaderATI = (GLEEPFNGLDELETEFRAGMENTSHADERATIPROC) __GLeeGetProcAddress("glDeleteFragmentShaderATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glBeginFragmentShaderATI = (GLEEPFNGLBEGINFRAGMENTSHADERATIPROC) __GLeeGetProcAddress("glBeginFragmentShaderATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glEndFragmentShaderATI = (GLEEPFNGLENDFRAGMENTSHADERATIPROC) __GLeeGetProcAddress("glEndFragmentShaderATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glPassTexCoordATI = (GLEEPFNGLPASSTEXCOORDATIPROC) __GLeeGetProcAddress("glPassTexCoordATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glSampleMapATI = (GLEEPFNGLSAMPLEMAPATIPROC) __GLeeGetProcAddress("glSampleMapATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glColorFragmentOp1ATI = (GLEEPFNGLCOLORFRAGMENTOP1ATIPROC) __GLeeGetProcAddress("glColorFragmentOp1ATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glColorFragmentOp2ATI = (GLEEPFNGLCOLORFRAGMENTOP2ATIPROC) __GLeeGetProcAddress("glColorFragmentOp2ATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glColorFragmentOp3ATI = (GLEEPFNGLCOLORFRAGMENTOP3ATIPROC) __GLeeGetProcAddress("glColorFragmentOp3ATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glAlphaFragmentOp1ATI = (GLEEPFNGLALPHAFRAGMENTOP1ATIPROC) __GLeeGetProcAddress("glAlphaFragmentOp1ATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glAlphaFragmentOp2ATI = (GLEEPFNGLALPHAFRAGMENTOP2ATIPROC) __GLeeGetProcAddress("glAlphaFragmentOp2ATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glAlphaFragmentOp3ATI = (GLEEPFNGLALPHAFRAGMENTOP3ATIPROC) __GLeeGetProcAddress("glAlphaFragmentOp3ATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glSetFragmentShaderConstantATI = (GLEEPFNGLSETFRAGMENTSHADERCONSTANTATIPROC) __GLeeGetProcAddress("glSetFragmentShaderConstantATI"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==14) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_ATI_pn_triangles(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_ATI_pn_triangles\r
+    if ((GLeeFuncPtr_glPNTrianglesiATI = (GLEEPFNGLPNTRIANGLESIATIPROC) __GLeeGetProcAddress("glPNTrianglesiATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glPNTrianglesfATI = (GLEEPFNGLPNTRIANGLESFATIPROC) __GLeeGetProcAddress("glPNTrianglesfATI"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==2) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_ATI_vertex_array_object(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_ATI_vertex_array_object\r
+    if ((GLeeFuncPtr_glNewObjectBufferATI = (GLEEPFNGLNEWOBJECTBUFFERATIPROC) __GLeeGetProcAddress("glNewObjectBufferATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glIsObjectBufferATI = (GLEEPFNGLISOBJECTBUFFERATIPROC) __GLeeGetProcAddress("glIsObjectBufferATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUpdateObjectBufferATI = (GLEEPFNGLUPDATEOBJECTBUFFERATIPROC) __GLeeGetProcAddress("glUpdateObjectBufferATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetObjectBufferfvATI = (GLEEPFNGLGETOBJECTBUFFERFVATIPROC) __GLeeGetProcAddress("glGetObjectBufferfvATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetObjectBufferivATI = (GLEEPFNGLGETOBJECTBUFFERIVATIPROC) __GLeeGetProcAddress("glGetObjectBufferivATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFreeObjectBufferATI = (GLEEPFNGLFREEOBJECTBUFFERATIPROC) __GLeeGetProcAddress("glFreeObjectBufferATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glArrayObjectATI = (GLEEPFNGLARRAYOBJECTATIPROC) __GLeeGetProcAddress("glArrayObjectATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetArrayObjectfvATI = (GLEEPFNGLGETARRAYOBJECTFVATIPROC) __GLeeGetProcAddress("glGetArrayObjectfvATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetArrayObjectivATI = (GLEEPFNGLGETARRAYOBJECTIVATIPROC) __GLeeGetProcAddress("glGetArrayObjectivATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVariantArrayObjectATI = (GLEEPFNGLVARIANTARRAYOBJECTATIPROC) __GLeeGetProcAddress("glVariantArrayObjectATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetVariantArrayObjectfvATI = (GLEEPFNGLGETVARIANTARRAYOBJECTFVATIPROC) __GLeeGetProcAddress("glGetVariantArrayObjectfvATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetVariantArrayObjectivATI = (GLEEPFNGLGETVARIANTARRAYOBJECTIVATIPROC) __GLeeGetProcAddress("glGetVariantArrayObjectivATI"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==12) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_EXT_vertex_shader(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_EXT_vertex_shader\r
+    if ((GLeeFuncPtr_glBeginVertexShaderEXT = (GLEEPFNGLBEGINVERTEXSHADEREXTPROC) __GLeeGetProcAddress("glBeginVertexShaderEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glEndVertexShaderEXT = (GLEEPFNGLENDVERTEXSHADEREXTPROC) __GLeeGetProcAddress("glEndVertexShaderEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glBindVertexShaderEXT = (GLEEPFNGLBINDVERTEXSHADEREXTPROC) __GLeeGetProcAddress("glBindVertexShaderEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGenVertexShadersEXT = (GLEEPFNGLGENVERTEXSHADERSEXTPROC) __GLeeGetProcAddress("glGenVertexShadersEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glDeleteVertexShaderEXT = (GLEEPFNGLDELETEVERTEXSHADEREXTPROC) __GLeeGetProcAddress("glDeleteVertexShaderEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glShaderOp1EXT = (GLEEPFNGLSHADEROP1EXTPROC) __GLeeGetProcAddress("glShaderOp1EXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glShaderOp2EXT = (GLEEPFNGLSHADEROP2EXTPROC) __GLeeGetProcAddress("glShaderOp2EXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glShaderOp3EXT = (GLEEPFNGLSHADEROP3EXTPROC) __GLeeGetProcAddress("glShaderOp3EXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glSwizzleEXT = (GLEEPFNGLSWIZZLEEXTPROC) __GLeeGetProcAddress("glSwizzleEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glWriteMaskEXT = (GLEEPFNGLWRITEMASKEXTPROC) __GLeeGetProcAddress("glWriteMaskEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glInsertComponentEXT = (GLEEPFNGLINSERTCOMPONENTEXTPROC) __GLeeGetProcAddress("glInsertComponentEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glExtractComponentEXT = (GLEEPFNGLEXTRACTCOMPONENTEXTPROC) __GLeeGetProcAddress("glExtractComponentEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGenSymbolsEXT = (GLEEPFNGLGENSYMBOLSEXTPROC) __GLeeGetProcAddress("glGenSymbolsEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glSetInvariantEXT = (GLEEPFNGLSETINVARIANTEXTPROC) __GLeeGetProcAddress("glSetInvariantEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glSetLocalConstantEXT = (GLEEPFNGLSETLOCALCONSTANTEXTPROC) __GLeeGetProcAddress("glSetLocalConstantEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVariantbvEXT = (GLEEPFNGLVARIANTBVEXTPROC) __GLeeGetProcAddress("glVariantbvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVariantsvEXT = (GLEEPFNGLVARIANTSVEXTPROC) __GLeeGetProcAddress("glVariantsvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVariantivEXT = (GLEEPFNGLVARIANTIVEXTPROC) __GLeeGetProcAddress("glVariantivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVariantfvEXT = (GLEEPFNGLVARIANTFVEXTPROC) __GLeeGetProcAddress("glVariantfvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVariantdvEXT = (GLEEPFNGLVARIANTDVEXTPROC) __GLeeGetProcAddress("glVariantdvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVariantubvEXT = (GLEEPFNGLVARIANTUBVEXTPROC) __GLeeGetProcAddress("glVariantubvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVariantusvEXT = (GLEEPFNGLVARIANTUSVEXTPROC) __GLeeGetProcAddress("glVariantusvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVariantuivEXT = (GLEEPFNGLVARIANTUIVEXTPROC) __GLeeGetProcAddress("glVariantuivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVariantPointerEXT = (GLEEPFNGLVARIANTPOINTEREXTPROC) __GLeeGetProcAddress("glVariantPointerEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glEnableVariantClientStateEXT = (GLEEPFNGLENABLEVARIANTCLIENTSTATEEXTPROC) __GLeeGetProcAddress("glEnableVariantClientStateEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glDisableVariantClientStateEXT = (GLEEPFNGLDISABLEVARIANTCLIENTSTATEEXTPROC) __GLeeGetProcAddress("glDisableVariantClientStateEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glBindLightParameterEXT = (GLEEPFNGLBINDLIGHTPARAMETEREXTPROC) __GLeeGetProcAddress("glBindLightParameterEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glBindMaterialParameterEXT = (GLEEPFNGLBINDMATERIALPARAMETEREXTPROC) __GLeeGetProcAddress("glBindMaterialParameterEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glBindTexGenParameterEXT = (GLEEPFNGLBINDTEXGENPARAMETEREXTPROC) __GLeeGetProcAddress("glBindTexGenParameterEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glBindTextureUnitParameterEXT = (GLEEPFNGLBINDTEXTUREUNITPARAMETEREXTPROC) __GLeeGetProcAddress("glBindTextureUnitParameterEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glBindParameterEXT = (GLEEPFNGLBINDPARAMETEREXTPROC) __GLeeGetProcAddress("glBindParameterEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glIsVariantEnabledEXT = (GLEEPFNGLISVARIANTENABLEDEXTPROC) __GLeeGetProcAddress("glIsVariantEnabledEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetVariantBooleanvEXT = (GLEEPFNGLGETVARIANTBOOLEANVEXTPROC) __GLeeGetProcAddress("glGetVariantBooleanvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetVariantIntegervEXT = (GLEEPFNGLGETVARIANTINTEGERVEXTPROC) __GLeeGetProcAddress("glGetVariantIntegervEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetVariantFloatvEXT = (GLEEPFNGLGETVARIANTFLOATVEXTPROC) __GLeeGetProcAddress("glGetVariantFloatvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetVariantPointervEXT = (GLEEPFNGLGETVARIANTPOINTERVEXTPROC) __GLeeGetProcAddress("glGetVariantPointervEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetInvariantBooleanvEXT = (GLEEPFNGLGETINVARIANTBOOLEANVEXTPROC) __GLeeGetProcAddress("glGetInvariantBooleanvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetInvariantIntegervEXT = (GLEEPFNGLGETINVARIANTINTEGERVEXTPROC) __GLeeGetProcAddress("glGetInvariantIntegervEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetInvariantFloatvEXT = (GLEEPFNGLGETINVARIANTFLOATVEXTPROC) __GLeeGetProcAddress("glGetInvariantFloatvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetLocalConstantBooleanvEXT = (GLEEPFNGLGETLOCALCONSTANTBOOLEANVEXTPROC) __GLeeGetProcAddress("glGetLocalConstantBooleanvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetLocalConstantIntegervEXT = (GLEEPFNGLGETLOCALCONSTANTINTEGERVEXTPROC) __GLeeGetProcAddress("glGetLocalConstantIntegervEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetLocalConstantFloatvEXT = (GLEEPFNGLGETLOCALCONSTANTFLOATVEXTPROC) __GLeeGetProcAddress("glGetLocalConstantFloatvEXT"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==42) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_ATI_vertex_streams(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_ATI_vertex_streams\r
+    if ((GLeeFuncPtr_glVertexStream1sATI = (GLEEPFNGLVERTEXSTREAM1SATIPROC) __GLeeGetProcAddress("glVertexStream1sATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexStream1svATI = (GLEEPFNGLVERTEXSTREAM1SVATIPROC) __GLeeGetProcAddress("glVertexStream1svATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexStream1iATI = (GLEEPFNGLVERTEXSTREAM1IATIPROC) __GLeeGetProcAddress("glVertexStream1iATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexStream1ivATI = (GLEEPFNGLVERTEXSTREAM1IVATIPROC) __GLeeGetProcAddress("glVertexStream1ivATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexStream1fATI = (GLEEPFNGLVERTEXSTREAM1FATIPROC) __GLeeGetProcAddress("glVertexStream1fATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexStream1fvATI = (GLEEPFNGLVERTEXSTREAM1FVATIPROC) __GLeeGetProcAddress("glVertexStream1fvATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexStream1dATI = (GLEEPFNGLVERTEXSTREAM1DATIPROC) __GLeeGetProcAddress("glVertexStream1dATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexStream1dvATI = (GLEEPFNGLVERTEXSTREAM1DVATIPROC) __GLeeGetProcAddress("glVertexStream1dvATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexStream2sATI = (GLEEPFNGLVERTEXSTREAM2SATIPROC) __GLeeGetProcAddress("glVertexStream2sATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexStream2svATI = (GLEEPFNGLVERTEXSTREAM2SVATIPROC) __GLeeGetProcAddress("glVertexStream2svATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexStream2iATI = (GLEEPFNGLVERTEXSTREAM2IATIPROC) __GLeeGetProcAddress("glVertexStream2iATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexStream2ivATI = (GLEEPFNGLVERTEXSTREAM2IVATIPROC) __GLeeGetProcAddress("glVertexStream2ivATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexStream2fATI = (GLEEPFNGLVERTEXSTREAM2FATIPROC) __GLeeGetProcAddress("glVertexStream2fATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexStream2fvATI = (GLEEPFNGLVERTEXSTREAM2FVATIPROC) __GLeeGetProcAddress("glVertexStream2fvATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexStream2dATI = (GLEEPFNGLVERTEXSTREAM2DATIPROC) __GLeeGetProcAddress("glVertexStream2dATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexStream2dvATI = (GLEEPFNGLVERTEXSTREAM2DVATIPROC) __GLeeGetProcAddress("glVertexStream2dvATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexStream3sATI = (GLEEPFNGLVERTEXSTREAM3SATIPROC) __GLeeGetProcAddress("glVertexStream3sATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexStream3svATI = (GLEEPFNGLVERTEXSTREAM3SVATIPROC) __GLeeGetProcAddress("glVertexStream3svATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexStream3iATI = (GLEEPFNGLVERTEXSTREAM3IATIPROC) __GLeeGetProcAddress("glVertexStream3iATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexStream3ivATI = (GLEEPFNGLVERTEXSTREAM3IVATIPROC) __GLeeGetProcAddress("glVertexStream3ivATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexStream3fATI = (GLEEPFNGLVERTEXSTREAM3FATIPROC) __GLeeGetProcAddress("glVertexStream3fATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexStream3fvATI = (GLEEPFNGLVERTEXSTREAM3FVATIPROC) __GLeeGetProcAddress("glVertexStream3fvATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexStream3dATI = (GLEEPFNGLVERTEXSTREAM3DATIPROC) __GLeeGetProcAddress("glVertexStream3dATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexStream3dvATI = (GLEEPFNGLVERTEXSTREAM3DVATIPROC) __GLeeGetProcAddress("glVertexStream3dvATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexStream4sATI = (GLEEPFNGLVERTEXSTREAM4SATIPROC) __GLeeGetProcAddress("glVertexStream4sATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexStream4svATI = (GLEEPFNGLVERTEXSTREAM4SVATIPROC) __GLeeGetProcAddress("glVertexStream4svATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexStream4iATI = (GLEEPFNGLVERTEXSTREAM4IATIPROC) __GLeeGetProcAddress("glVertexStream4iATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexStream4ivATI = (GLEEPFNGLVERTEXSTREAM4IVATIPROC) __GLeeGetProcAddress("glVertexStream4ivATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexStream4fATI = (GLEEPFNGLVERTEXSTREAM4FATIPROC) __GLeeGetProcAddress("glVertexStream4fATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexStream4fvATI = (GLEEPFNGLVERTEXSTREAM4FVATIPROC) __GLeeGetProcAddress("glVertexStream4fvATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexStream4dATI = (GLEEPFNGLVERTEXSTREAM4DATIPROC) __GLeeGetProcAddress("glVertexStream4dATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexStream4dvATI = (GLEEPFNGLVERTEXSTREAM4DVATIPROC) __GLeeGetProcAddress("glVertexStream4dvATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glNormalStream3bATI = (GLEEPFNGLNORMALSTREAM3BATIPROC) __GLeeGetProcAddress("glNormalStream3bATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glNormalStream3bvATI = (GLEEPFNGLNORMALSTREAM3BVATIPROC) __GLeeGetProcAddress("glNormalStream3bvATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glNormalStream3sATI = (GLEEPFNGLNORMALSTREAM3SATIPROC) __GLeeGetProcAddress("glNormalStream3sATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glNormalStream3svATI = (GLEEPFNGLNORMALSTREAM3SVATIPROC) __GLeeGetProcAddress("glNormalStream3svATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glNormalStream3iATI = (GLEEPFNGLNORMALSTREAM3IATIPROC) __GLeeGetProcAddress("glNormalStream3iATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glNormalStream3ivATI = (GLEEPFNGLNORMALSTREAM3IVATIPROC) __GLeeGetProcAddress("glNormalStream3ivATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glNormalStream3fATI = (GLEEPFNGLNORMALSTREAM3FATIPROC) __GLeeGetProcAddress("glNormalStream3fATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glNormalStream3fvATI = (GLEEPFNGLNORMALSTREAM3FVATIPROC) __GLeeGetProcAddress("glNormalStream3fvATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glNormalStream3dATI = (GLEEPFNGLNORMALSTREAM3DATIPROC) __GLeeGetProcAddress("glNormalStream3dATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glNormalStream3dvATI = (GLEEPFNGLNORMALSTREAM3DVATIPROC) __GLeeGetProcAddress("glNormalStream3dvATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glClientActiveVertexStreamATI = (GLEEPFNGLCLIENTACTIVEVERTEXSTREAMATIPROC) __GLeeGetProcAddress("glClientActiveVertexStreamATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexBlendEnviATI = (GLEEPFNGLVERTEXBLENDENVIATIPROC) __GLeeGetProcAddress("glVertexBlendEnviATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexBlendEnvfATI = (GLEEPFNGLVERTEXBLENDENVFATIPROC) __GLeeGetProcAddress("glVertexBlendEnvfATI"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==45) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_ATI_element_array(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_ATI_element_array\r
+    if ((GLeeFuncPtr_glElementPointerATI = (GLEEPFNGLELEMENTPOINTERATIPROC) __GLeeGetProcAddress("glElementPointerATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glDrawElementArrayATI = (GLEEPFNGLDRAWELEMENTARRAYATIPROC) __GLeeGetProcAddress("glDrawElementArrayATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glDrawRangeElementArrayATI = (GLEEPFNGLDRAWRANGEELEMENTARRAYATIPROC) __GLeeGetProcAddress("glDrawRangeElementArrayATI"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==3) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_SUN_mesh_array(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_SUN_mesh_array\r
+    if ((GLeeFuncPtr_glDrawMeshArraysSUN = (GLEEPFNGLDRAWMESHARRAYSSUNPROC) __GLeeGetProcAddress("glDrawMeshArraysSUN"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==1) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_SUN_slice_accum(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_NV_multisample_filter_hint(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_NV_depth_clamp(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_NV_occlusion_query(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_NV_occlusion_query\r
+    if ((GLeeFuncPtr_glGenOcclusionQueriesNV = (GLEEPFNGLGENOCCLUSIONQUERIESNVPROC) __GLeeGetProcAddress("glGenOcclusionQueriesNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glDeleteOcclusionQueriesNV = (GLEEPFNGLDELETEOCCLUSIONQUERIESNVPROC) __GLeeGetProcAddress("glDeleteOcclusionQueriesNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glIsOcclusionQueryNV = (GLEEPFNGLISOCCLUSIONQUERYNVPROC) __GLeeGetProcAddress("glIsOcclusionQueryNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glBeginOcclusionQueryNV = (GLEEPFNGLBEGINOCCLUSIONQUERYNVPROC) __GLeeGetProcAddress("glBeginOcclusionQueryNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glEndOcclusionQueryNV = (GLEEPFNGLENDOCCLUSIONQUERYNVPROC) __GLeeGetProcAddress("glEndOcclusionQueryNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetOcclusionQueryivNV = (GLEEPFNGLGETOCCLUSIONQUERYIVNVPROC) __GLeeGetProcAddress("glGetOcclusionQueryivNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetOcclusionQueryuivNV = (GLEEPFNGLGETOCCLUSIONQUERYUIVNVPROC) __GLeeGetProcAddress("glGetOcclusionQueryuivNV"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==7) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_NV_point_sprite(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_NV_point_sprite\r
+    if ((GLeeFuncPtr_glPointParameteriNV = (GLEEPFNGLPOINTPARAMETERINVPROC) __GLeeGetProcAddress("glPointParameteriNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glPointParameterivNV = (GLEEPFNGLPOINTPARAMETERIVNVPROC) __GLeeGetProcAddress("glPointParameterivNV"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==2) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_NV_texture_shader3(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_NV_vertex_program1_1(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_EXT_shadow_funcs(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_EXT_stencil_two_side(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_EXT_stencil_two_side\r
+    if ((GLeeFuncPtr_glActiveStencilFaceEXT = (GLEEPFNGLACTIVESTENCILFACEEXTPROC) __GLeeGetProcAddress("glActiveStencilFaceEXT"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==1) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_ATI_text_fragment_shader(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_APPLE_client_storage(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_APPLE_element_array(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_APPLE_element_array\r
+    if ((GLeeFuncPtr_glElementPointerAPPLE = (GLEEPFNGLELEMENTPOINTERAPPLEPROC) __GLeeGetProcAddress("glElementPointerAPPLE"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glDrawElementArrayAPPLE = (GLEEPFNGLDRAWELEMENTARRAYAPPLEPROC) __GLeeGetProcAddress("glDrawElementArrayAPPLE"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glDrawRangeElementArrayAPPLE = (GLEEPFNGLDRAWRANGEELEMENTARRAYAPPLEPROC) __GLeeGetProcAddress("glDrawRangeElementArrayAPPLE"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiDrawElementArrayAPPLE = (GLEEPFNGLMULTIDRAWELEMENTARRAYAPPLEPROC) __GLeeGetProcAddress("glMultiDrawElementArrayAPPLE"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiDrawRangeElementArrayAPPLE = (GLEEPFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC) __GLeeGetProcAddress("glMultiDrawRangeElementArrayAPPLE"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==5) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_APPLE_fence(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_APPLE_fence\r
+    if ((GLeeFuncPtr_glGenFencesAPPLE = (GLEEPFNGLGENFENCESAPPLEPROC) __GLeeGetProcAddress("glGenFencesAPPLE"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glDeleteFencesAPPLE = (GLEEPFNGLDELETEFENCESAPPLEPROC) __GLeeGetProcAddress("glDeleteFencesAPPLE"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glSetFenceAPPLE = (GLEEPFNGLSETFENCEAPPLEPROC) __GLeeGetProcAddress("glSetFenceAPPLE"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glIsFenceAPPLE = (GLEEPFNGLISFENCEAPPLEPROC) __GLeeGetProcAddress("glIsFenceAPPLE"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTestFenceAPPLE = (GLEEPFNGLTESTFENCEAPPLEPROC) __GLeeGetProcAddress("glTestFenceAPPLE"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFinishFenceAPPLE = (GLEEPFNGLFINISHFENCEAPPLEPROC) __GLeeGetProcAddress("glFinishFenceAPPLE"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTestObjectAPPLE = (GLEEPFNGLTESTOBJECTAPPLEPROC) __GLeeGetProcAddress("glTestObjectAPPLE"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFinishObjectAPPLE = (GLEEPFNGLFINISHOBJECTAPPLEPROC) __GLeeGetProcAddress("glFinishObjectAPPLE"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==8) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_APPLE_vertex_array_object(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_APPLE_vertex_array_object\r
+    if ((GLeeFuncPtr_glBindVertexArrayAPPLE = (GLEEPFNGLBINDVERTEXARRAYAPPLEPROC) __GLeeGetProcAddress("glBindVertexArrayAPPLE"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glDeleteVertexArraysAPPLE = (GLEEPFNGLDELETEVERTEXARRAYSAPPLEPROC) __GLeeGetProcAddress("glDeleteVertexArraysAPPLE"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGenVertexArraysAPPLE = (GLEEPFNGLGENVERTEXARRAYSAPPLEPROC) __GLeeGetProcAddress("glGenVertexArraysAPPLE"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glIsVertexArrayAPPLE = (GLEEPFNGLISVERTEXARRAYAPPLEPROC) __GLeeGetProcAddress("glIsVertexArrayAPPLE"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==4) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_APPLE_vertex_array_range(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_APPLE_vertex_array_range\r
+    if ((GLeeFuncPtr_glVertexArrayRangeAPPLE = (GLEEPFNGLVERTEXARRAYRANGEAPPLEPROC) __GLeeGetProcAddress("glVertexArrayRangeAPPLE"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFlushVertexArrayRangeAPPLE = (GLEEPFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC) __GLeeGetProcAddress("glFlushVertexArrayRangeAPPLE"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexArrayParameteriAPPLE = (GLEEPFNGLVERTEXARRAYPARAMETERIAPPLEPROC) __GLeeGetProcAddress("glVertexArrayParameteriAPPLE"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==3) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_APPLE_ycbcr_422(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_S3_s3tc(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_ATI_draw_buffers(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_ATI_draw_buffers\r
+    if ((GLeeFuncPtr_glDrawBuffersATI = (GLEEPFNGLDRAWBUFFERSATIPROC) __GLeeGetProcAddress("glDrawBuffersATI"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==1) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_ATI_pixel_format_float(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_ATI_texture_env_combine3(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_ATI_texture_float(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_NV_float_buffer(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_NV_fragment_program(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_NV_fragment_program\r
+    if ((GLeeFuncPtr_glProgramNamedParameter4fNV = (GLEEPFNGLPROGRAMNAMEDPARAMETER4FNVPROC) __GLeeGetProcAddress("glProgramNamedParameter4fNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramNamedParameter4dNV = (GLEEPFNGLPROGRAMNAMEDPARAMETER4DNVPROC) __GLeeGetProcAddress("glProgramNamedParameter4dNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramNamedParameter4fvNV = (GLEEPFNGLPROGRAMNAMEDPARAMETER4FVNVPROC) __GLeeGetProcAddress("glProgramNamedParameter4fvNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramNamedParameter4dvNV = (GLEEPFNGLPROGRAMNAMEDPARAMETER4DVNVPROC) __GLeeGetProcAddress("glProgramNamedParameter4dvNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetProgramNamedParameterfvNV = (GLEEPFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC) __GLeeGetProcAddress("glGetProgramNamedParameterfvNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetProgramNamedParameterdvNV = (GLEEPFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC) __GLeeGetProcAddress("glGetProgramNamedParameterdvNV"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==6) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_NV_half_float(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_NV_half_float\r
+    if ((GLeeFuncPtr_glVertex2hNV = (GLEEPFNGLVERTEX2HNVPROC) __GLeeGetProcAddress("glVertex2hNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertex2hvNV = (GLEEPFNGLVERTEX2HVNVPROC) __GLeeGetProcAddress("glVertex2hvNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertex3hNV = (GLEEPFNGLVERTEX3HNVPROC) __GLeeGetProcAddress("glVertex3hNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertex3hvNV = (GLEEPFNGLVERTEX3HVNVPROC) __GLeeGetProcAddress("glVertex3hvNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertex4hNV = (GLEEPFNGLVERTEX4HNVPROC) __GLeeGetProcAddress("glVertex4hNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertex4hvNV = (GLEEPFNGLVERTEX4HVNVPROC) __GLeeGetProcAddress("glVertex4hvNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glNormal3hNV = (GLEEPFNGLNORMAL3HNVPROC) __GLeeGetProcAddress("glNormal3hNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glNormal3hvNV = (GLEEPFNGLNORMAL3HVNVPROC) __GLeeGetProcAddress("glNormal3hvNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glColor3hNV = (GLEEPFNGLCOLOR3HNVPROC) __GLeeGetProcAddress("glColor3hNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glColor3hvNV = (GLEEPFNGLCOLOR3HVNVPROC) __GLeeGetProcAddress("glColor3hvNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glColor4hNV = (GLEEPFNGLCOLOR4HNVPROC) __GLeeGetProcAddress("glColor4hNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glColor4hvNV = (GLEEPFNGLCOLOR4HVNVPROC) __GLeeGetProcAddress("glColor4hvNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTexCoord1hNV = (GLEEPFNGLTEXCOORD1HNVPROC) __GLeeGetProcAddress("glTexCoord1hNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTexCoord1hvNV = (GLEEPFNGLTEXCOORD1HVNVPROC) __GLeeGetProcAddress("glTexCoord1hvNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTexCoord2hNV = (GLEEPFNGLTEXCOORD2HNVPROC) __GLeeGetProcAddress("glTexCoord2hNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTexCoord2hvNV = (GLEEPFNGLTEXCOORD2HVNVPROC) __GLeeGetProcAddress("glTexCoord2hvNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTexCoord3hNV = (GLEEPFNGLTEXCOORD3HNVPROC) __GLeeGetProcAddress("glTexCoord3hNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTexCoord3hvNV = (GLEEPFNGLTEXCOORD3HVNVPROC) __GLeeGetProcAddress("glTexCoord3hvNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTexCoord4hNV = (GLEEPFNGLTEXCOORD4HNVPROC) __GLeeGetProcAddress("glTexCoord4hNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTexCoord4hvNV = (GLEEPFNGLTEXCOORD4HVNVPROC) __GLeeGetProcAddress("glTexCoord4hvNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord1hNV = (GLEEPFNGLMULTITEXCOORD1HNVPROC) __GLeeGetProcAddress("glMultiTexCoord1hNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord1hvNV = (GLEEPFNGLMULTITEXCOORD1HVNVPROC) __GLeeGetProcAddress("glMultiTexCoord1hvNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord2hNV = (GLEEPFNGLMULTITEXCOORD2HNVPROC) __GLeeGetProcAddress("glMultiTexCoord2hNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord2hvNV = (GLEEPFNGLMULTITEXCOORD2HVNVPROC) __GLeeGetProcAddress("glMultiTexCoord2hvNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord3hNV = (GLEEPFNGLMULTITEXCOORD3HNVPROC) __GLeeGetProcAddress("glMultiTexCoord3hNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord3hvNV = (GLEEPFNGLMULTITEXCOORD3HVNVPROC) __GLeeGetProcAddress("glMultiTexCoord3hvNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord4hNV = (GLEEPFNGLMULTITEXCOORD4HNVPROC) __GLeeGetProcAddress("glMultiTexCoord4hNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoord4hvNV = (GLEEPFNGLMULTITEXCOORD4HVNVPROC) __GLeeGetProcAddress("glMultiTexCoord4hvNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFogCoordhNV = (GLEEPFNGLFOGCOORDHNVPROC) __GLeeGetProcAddress("glFogCoordhNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFogCoordhvNV = (GLEEPFNGLFOGCOORDHVNVPROC) __GLeeGetProcAddress("glFogCoordhvNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glSecondaryColor3hNV = (GLEEPFNGLSECONDARYCOLOR3HNVPROC) __GLeeGetProcAddress("glSecondaryColor3hNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glSecondaryColor3hvNV = (GLEEPFNGLSECONDARYCOLOR3HVNVPROC) __GLeeGetProcAddress("glSecondaryColor3hvNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexWeighthNV = (GLEEPFNGLVERTEXWEIGHTHNVPROC) __GLeeGetProcAddress("glVertexWeighthNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexWeighthvNV = (GLEEPFNGLVERTEXWEIGHTHVNVPROC) __GLeeGetProcAddress("glVertexWeighthvNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib1hNV = (GLEEPFNGLVERTEXATTRIB1HNVPROC) __GLeeGetProcAddress("glVertexAttrib1hNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib1hvNV = (GLEEPFNGLVERTEXATTRIB1HVNVPROC) __GLeeGetProcAddress("glVertexAttrib1hvNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib2hNV = (GLEEPFNGLVERTEXATTRIB2HNVPROC) __GLeeGetProcAddress("glVertexAttrib2hNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib2hvNV = (GLEEPFNGLVERTEXATTRIB2HVNVPROC) __GLeeGetProcAddress("glVertexAttrib2hvNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib3hNV = (GLEEPFNGLVERTEXATTRIB3HNVPROC) __GLeeGetProcAddress("glVertexAttrib3hNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib3hvNV = (GLEEPFNGLVERTEXATTRIB3HVNVPROC) __GLeeGetProcAddress("glVertexAttrib3hvNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib4hNV = (GLEEPFNGLVERTEXATTRIB4HNVPROC) __GLeeGetProcAddress("glVertexAttrib4hNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttrib4hvNV = (GLEEPFNGLVERTEXATTRIB4HVNVPROC) __GLeeGetProcAddress("glVertexAttrib4hvNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttribs1hvNV = (GLEEPFNGLVERTEXATTRIBS1HVNVPROC) __GLeeGetProcAddress("glVertexAttribs1hvNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttribs2hvNV = (GLEEPFNGLVERTEXATTRIBS2HVNVPROC) __GLeeGetProcAddress("glVertexAttribs2hvNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttribs3hvNV = (GLEEPFNGLVERTEXATTRIBS3HVNVPROC) __GLeeGetProcAddress("glVertexAttribs3hvNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttribs4hvNV = (GLEEPFNGLVERTEXATTRIBS4HVNVPROC) __GLeeGetProcAddress("glVertexAttribs4hvNV"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==46) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_NV_pixel_data_range(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_NV_pixel_data_range\r
+    if ((GLeeFuncPtr_glPixelDataRangeNV = (GLEEPFNGLPIXELDATARANGENVPROC) __GLeeGetProcAddress("glPixelDataRangeNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFlushPixelDataRangeNV = (GLEEPFNGLFLUSHPIXELDATARANGENVPROC) __GLeeGetProcAddress("glFlushPixelDataRangeNV"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==2) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_NV_primitive_restart(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_NV_primitive_restart\r
+    if ((GLeeFuncPtr_glPrimitiveRestartNV = (GLEEPFNGLPRIMITIVERESTARTNVPROC) __GLeeGetProcAddress("glPrimitiveRestartNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glPrimitiveRestartIndexNV = (GLEEPFNGLPRIMITIVERESTARTINDEXNVPROC) __GLeeGetProcAddress("glPrimitiveRestartIndexNV"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==2) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_NV_texture_expand_normal(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_NV_vertex_program2(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_ATI_map_object_buffer(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_ATI_map_object_buffer\r
+    if ((GLeeFuncPtr_glMapObjectBufferATI = (GLEEPFNGLMAPOBJECTBUFFERATIPROC) __GLeeGetProcAddress("glMapObjectBufferATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUnmapObjectBufferATI = (GLEEPFNGLUNMAPOBJECTBUFFERATIPROC) __GLeeGetProcAddress("glUnmapObjectBufferATI"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==2) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_ATI_separate_stencil(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_ATI_separate_stencil\r
+    if ((GLeeFuncPtr_glStencilOpSeparateATI = (GLEEPFNGLSTENCILOPSEPARATEATIPROC) __GLeeGetProcAddress("glStencilOpSeparateATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glStencilFuncSeparateATI = (GLEEPFNGLSTENCILFUNCSEPARATEATIPROC) __GLeeGetProcAddress("glStencilFuncSeparateATI"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==2) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_ATI_vertex_attrib_array_object(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_ATI_vertex_attrib_array_object\r
+    if ((GLeeFuncPtr_glVertexAttribArrayObjectATI = (GLEEPFNGLVERTEXATTRIBARRAYOBJECTATIPROC) __GLeeGetProcAddress("glVertexAttribArrayObjectATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetVertexAttribArrayObjectfvATI = (GLEEPFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC) __GLeeGetProcAddress("glGetVertexAttribArrayObjectfvATI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetVertexAttribArrayObjectivATI = (GLEEPFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC) __GLeeGetProcAddress("glGetVertexAttribArrayObjectivATI"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==3) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_OES_read_format(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_EXT_depth_bounds_test(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_EXT_depth_bounds_test\r
+    if ((GLeeFuncPtr_glDepthBoundsEXT = (GLEEPFNGLDEPTHBOUNDSEXTPROC) __GLeeGetProcAddress("glDepthBoundsEXT"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==1) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_EXT_texture_mirror_clamp(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_EXT_blend_equation_separate(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_EXT_blend_equation_separate\r
+    if ((GLeeFuncPtr_glBlendEquationSeparateEXT = (GLEEPFNGLBLENDEQUATIONSEPARATEEXTPROC) __GLeeGetProcAddress("glBlendEquationSeparateEXT"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==1) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_MESA_pack_invert(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_MESA_ycbcr_texture(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_EXT_pixel_buffer_object(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_NV_fragment_program_option(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_NV_fragment_program2(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_NV_vertex_program2_option(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_NV_vertex_program3(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_EXT_framebuffer_object(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_EXT_framebuffer_object\r
+    if ((GLeeFuncPtr_glIsRenderbufferEXT = (GLEEPFNGLISRENDERBUFFEREXTPROC) __GLeeGetProcAddress("glIsRenderbufferEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glBindRenderbufferEXT = (GLEEPFNGLBINDRENDERBUFFEREXTPROC) __GLeeGetProcAddress("glBindRenderbufferEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glDeleteRenderbuffersEXT = (GLEEPFNGLDELETERENDERBUFFERSEXTPROC) __GLeeGetProcAddress("glDeleteRenderbuffersEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGenRenderbuffersEXT = (GLEEPFNGLGENRENDERBUFFERSEXTPROC) __GLeeGetProcAddress("glGenRenderbuffersEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glRenderbufferStorageEXT = (GLEEPFNGLRENDERBUFFERSTORAGEEXTPROC) __GLeeGetProcAddress("glRenderbufferStorageEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetRenderbufferParameterivEXT = (GLEEPFNGLGETRENDERBUFFERPARAMETERIVEXTPROC) __GLeeGetProcAddress("glGetRenderbufferParameterivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glIsFramebufferEXT = (GLEEPFNGLISFRAMEBUFFEREXTPROC) __GLeeGetProcAddress("glIsFramebufferEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glBindFramebufferEXT = (GLEEPFNGLBINDFRAMEBUFFEREXTPROC) __GLeeGetProcAddress("glBindFramebufferEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glDeleteFramebuffersEXT = (GLEEPFNGLDELETEFRAMEBUFFERSEXTPROC) __GLeeGetProcAddress("glDeleteFramebuffersEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGenFramebuffersEXT = (GLEEPFNGLGENFRAMEBUFFERSEXTPROC) __GLeeGetProcAddress("glGenFramebuffersEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glCheckFramebufferStatusEXT = (GLEEPFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) __GLeeGetProcAddress("glCheckFramebufferStatusEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFramebufferTexture1DEXT = (GLEEPFNGLFRAMEBUFFERTEXTURE1DEXTPROC) __GLeeGetProcAddress("glFramebufferTexture1DEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFramebufferTexture2DEXT = (GLEEPFNGLFRAMEBUFFERTEXTURE2DEXTPROC) __GLeeGetProcAddress("glFramebufferTexture2DEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFramebufferTexture3DEXT = (GLEEPFNGLFRAMEBUFFERTEXTURE3DEXTPROC) __GLeeGetProcAddress("glFramebufferTexture3DEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFramebufferRenderbufferEXT = (GLEEPFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) __GLeeGetProcAddress("glFramebufferRenderbufferEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetFramebufferAttachmentParameterivEXT = (GLEEPFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) __GLeeGetProcAddress("glGetFramebufferAttachmentParameterivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGenerateMipmapEXT = (GLEEPFNGLGENERATEMIPMAPEXTPROC) __GLeeGetProcAddress("glGenerateMipmapEXT"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==17) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_GREMEDY_string_marker(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_GREMEDY_string_marker\r
+    if ((GLeeFuncPtr_glStringMarkerGREMEDY = (GLEEPFNGLSTRINGMARKERGREMEDYPROC) __GLeeGetProcAddress("glStringMarkerGREMEDY"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==1) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_EXT_packed_depth_stencil(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_EXT_stencil_clear_tag(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_EXT_stencil_clear_tag\r
+    if ((GLeeFuncPtr_glStencilClearTagEXT = (GLEEPFNGLSTENCILCLEARTAGEXTPROC) __GLeeGetProcAddress("glStencilClearTagEXT"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==1) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_EXT_texture_sRGB(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_EXT_framebuffer_blit(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_EXT_framebuffer_blit\r
+    if ((GLeeFuncPtr_glBlitFramebufferEXT = (GLEEPFNGLBLITFRAMEBUFFEREXTPROC) __GLeeGetProcAddress("glBlitFramebufferEXT"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==1) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_EXT_framebuffer_multisample(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_EXT_framebuffer_multisample\r
+    if ((GLeeFuncPtr_glRenderbufferStorageMultisampleEXT = (GLEEPFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) __GLeeGetProcAddress("glRenderbufferStorageMultisampleEXT"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==1) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_MESAX_texture_stack(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_EXT_timer_query(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_EXT_timer_query\r
+    if ((GLeeFuncPtr_glGetQueryObjecti64vEXT = (GLEEPFNGLGETQUERYOBJECTI64VEXTPROC) __GLeeGetProcAddress("glGetQueryObjecti64vEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetQueryObjectui64vEXT = (GLEEPFNGLGETQUERYOBJECTUI64VEXTPROC) __GLeeGetProcAddress("glGetQueryObjectui64vEXT"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==2) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_EXT_gpu_program_parameters(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_EXT_gpu_program_parameters\r
+    if ((GLeeFuncPtr_glProgramEnvParameters4fvEXT = (GLEEPFNGLPROGRAMENVPARAMETERS4FVEXTPROC) __GLeeGetProcAddress("glProgramEnvParameters4fvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramLocalParameters4fvEXT = (GLEEPFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC) __GLeeGetProcAddress("glProgramLocalParameters4fvEXT"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==2) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_APPLE_flush_buffer_range(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_APPLE_flush_buffer_range\r
+    if ((GLeeFuncPtr_glBufferParameteriAPPLE = (GLEEPFNGLBUFFERPARAMETERIAPPLEPROC) __GLeeGetProcAddress("glBufferParameteriAPPLE"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFlushMappedBufferRangeAPPLE = (GLEEPFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC) __GLeeGetProcAddress("glFlushMappedBufferRangeAPPLE"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==2) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_EXT_gpu_shader4(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_EXT_gpu_shader4\r
+    if ((GLeeFuncPtr_glGetUniformuivEXT = (GLEEPFNGLGETUNIFORMUIVEXTPROC) __GLeeGetProcAddress("glGetUniformuivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glBindFragDataLocationEXT = (GLEEPFNGLBINDFRAGDATALOCATIONEXTPROC) __GLeeGetProcAddress("glBindFragDataLocationEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetFragDataLocationEXT = (GLEEPFNGLGETFRAGDATALOCATIONEXTPROC) __GLeeGetProcAddress("glGetFragDataLocationEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUniform1uiEXT = (GLEEPFNGLUNIFORM1UIEXTPROC) __GLeeGetProcAddress("glUniform1uiEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUniform2uiEXT = (GLEEPFNGLUNIFORM2UIEXTPROC) __GLeeGetProcAddress("glUniform2uiEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUniform3uiEXT = (GLEEPFNGLUNIFORM3UIEXTPROC) __GLeeGetProcAddress("glUniform3uiEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUniform4uiEXT = (GLEEPFNGLUNIFORM4UIEXTPROC) __GLeeGetProcAddress("glUniform4uiEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUniform1uivEXT = (GLEEPFNGLUNIFORM1UIVEXTPROC) __GLeeGetProcAddress("glUniform1uivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUniform2uivEXT = (GLEEPFNGLUNIFORM2UIVEXTPROC) __GLeeGetProcAddress("glUniform2uivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUniform3uivEXT = (GLEEPFNGLUNIFORM3UIVEXTPROC) __GLeeGetProcAddress("glUniform3uivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUniform4uivEXT = (GLEEPFNGLUNIFORM4UIVEXTPROC) __GLeeGetProcAddress("glUniform4uivEXT"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==11) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_EXT_draw_instanced(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_EXT_draw_instanced\r
+    if ((GLeeFuncPtr_glDrawArraysInstancedEXT = (GLEEPFNGLDRAWARRAYSINSTANCEDEXTPROC) __GLeeGetProcAddress("glDrawArraysInstancedEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glDrawElementsInstancedEXT = (GLEEPFNGLDRAWELEMENTSINSTANCEDEXTPROC) __GLeeGetProcAddress("glDrawElementsInstancedEXT"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==2) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_EXT_packed_float(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_EXT_texture_array(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_EXT_texture_buffer_object(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_EXT_texture_buffer_object\r
+    if ((GLeeFuncPtr_glTexBufferEXT = (GLEEPFNGLTEXBUFFEREXTPROC) __GLeeGetProcAddress("glTexBufferEXT"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==1) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_EXT_texture_compression_latc(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_EXT_texture_compression_rgtc(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_EXT_texture_shared_exponent(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_NV_depth_buffer_float(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_NV_depth_buffer_float\r
+    if ((GLeeFuncPtr_glDepthRangedNV = (GLEEPFNGLDEPTHRANGEDNVPROC) __GLeeGetProcAddress("glDepthRangedNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glClearDepthdNV = (GLEEPFNGLCLEARDEPTHDNVPROC) __GLeeGetProcAddress("glClearDepthdNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glDepthBoundsdNV = (GLEEPFNGLDEPTHBOUNDSDNVPROC) __GLeeGetProcAddress("glDepthBoundsdNV"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==3) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_NV_framebuffer_multisample_coverage(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_NV_framebuffer_multisample_coverage\r
+    if ((GLeeFuncPtr_glRenderbufferStorageMultisampleCoverageNV = (GLEEPFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC) __GLeeGetProcAddress("glRenderbufferStorageMultisampleCoverageNV"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==1) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_EXT_framebuffer_sRGB(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_NV_geometry_shader4(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_NV_parameter_buffer_object(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_NV_parameter_buffer_object\r
+    if ((GLeeFuncPtr_glProgramBufferParametersfvNV = (GLEEPFNGLPROGRAMBUFFERPARAMETERSFVNVPROC) __GLeeGetProcAddress("glProgramBufferParametersfvNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramBufferParametersIivNV = (GLEEPFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC) __GLeeGetProcAddress("glProgramBufferParametersIivNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramBufferParametersIuivNV = (GLEEPFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC) __GLeeGetProcAddress("glProgramBufferParametersIuivNV"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==3) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_EXT_draw_buffers2(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_EXT_draw_buffers2\r
+    if ((GLeeFuncPtr_glColorMaskIndexedEXT = (GLEEPFNGLCOLORMASKINDEXEDEXTPROC) __GLeeGetProcAddress("glColorMaskIndexedEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetBooleanIndexedvEXT = (GLEEPFNGLGETBOOLEANINDEXEDVEXTPROC) __GLeeGetProcAddress("glGetBooleanIndexedvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetIntegerIndexedvEXT = (GLEEPFNGLGETINTEGERINDEXEDVEXTPROC) __GLeeGetProcAddress("glGetIntegerIndexedvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glEnableIndexedEXT = (GLEEPFNGLENABLEINDEXEDEXTPROC) __GLeeGetProcAddress("glEnableIndexedEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glDisableIndexedEXT = (GLEEPFNGLDISABLEINDEXEDEXTPROC) __GLeeGetProcAddress("glDisableIndexedEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glIsEnabledIndexedEXT = (GLEEPFNGLISENABLEDINDEXEDEXTPROC) __GLeeGetProcAddress("glIsEnabledIndexedEXT"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==6) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_NV_transform_feedback(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_NV_transform_feedback\r
+    if ((GLeeFuncPtr_glBeginTransformFeedbackNV = (GLEEPFNGLBEGINTRANSFORMFEEDBACKNVPROC) __GLeeGetProcAddress("glBeginTransformFeedbackNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glEndTransformFeedbackNV = (GLEEPFNGLENDTRANSFORMFEEDBACKNVPROC) __GLeeGetProcAddress("glEndTransformFeedbackNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTransformFeedbackAttribsNV = (GLEEPFNGLTRANSFORMFEEDBACKATTRIBSNVPROC) __GLeeGetProcAddress("glTransformFeedbackAttribsNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glBindBufferRangeNV = (GLEEPFNGLBINDBUFFERRANGENVPROC) __GLeeGetProcAddress("glBindBufferRangeNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glBindBufferOffsetNV = (GLEEPFNGLBINDBUFFEROFFSETNVPROC) __GLeeGetProcAddress("glBindBufferOffsetNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glBindBufferBaseNV = (GLEEPFNGLBINDBUFFERBASENVPROC) __GLeeGetProcAddress("glBindBufferBaseNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTransformFeedbackVaryingsNV = (GLEEPFNGLTRANSFORMFEEDBACKVARYINGSNVPROC) __GLeeGetProcAddress("glTransformFeedbackVaryingsNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glActiveVaryingNV = (GLEEPFNGLACTIVEVARYINGNVPROC) __GLeeGetProcAddress("glActiveVaryingNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetVaryingLocationNV = (GLEEPFNGLGETVARYINGLOCATIONNVPROC) __GLeeGetProcAddress("glGetVaryingLocationNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetActiveVaryingNV = (GLEEPFNGLGETACTIVEVARYINGNVPROC) __GLeeGetProcAddress("glGetActiveVaryingNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetTransformFeedbackVaryingNV = (GLEEPFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC) __GLeeGetProcAddress("glGetTransformFeedbackVaryingNV"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==11) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_EXT_bindable_uniform(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_EXT_bindable_uniform\r
+    if ((GLeeFuncPtr_glUniformBufferEXT = (GLEEPFNGLUNIFORMBUFFEREXTPROC) __GLeeGetProcAddress("glUniformBufferEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetUniformBufferSizeEXT = (GLEEPFNGLGETUNIFORMBUFFERSIZEEXTPROC) __GLeeGetProcAddress("glGetUniformBufferSizeEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetUniformOffsetEXT = (GLEEPFNGLGETUNIFORMOFFSETEXTPROC) __GLeeGetProcAddress("glGetUniformOffsetEXT"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==3) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_EXT_texture_integer(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_EXT_texture_integer\r
+    if ((GLeeFuncPtr_glTexParameterIivEXT = (GLEEPFNGLTEXPARAMETERIIVEXTPROC) __GLeeGetProcAddress("glTexParameterIivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTexParameterIuivEXT = (GLEEPFNGLTEXPARAMETERIUIVEXTPROC) __GLeeGetProcAddress("glTexParameterIuivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetTexParameterIivEXT = (GLEEPFNGLGETTEXPARAMETERIIVEXTPROC) __GLeeGetProcAddress("glGetTexParameterIivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetTexParameterIuivEXT = (GLEEPFNGLGETTEXPARAMETERIUIVEXTPROC) __GLeeGetProcAddress("glGetTexParameterIuivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glClearColorIiEXT = (GLEEPFNGLCLEARCOLORIIEXTPROC) __GLeeGetProcAddress("glClearColorIiEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glClearColorIuiEXT = (GLEEPFNGLCLEARCOLORIUIEXTPROC) __GLeeGetProcAddress("glClearColorIuiEXT"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==6) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_GREMEDY_frame_terminator(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_GREMEDY_frame_terminator\r
+    if ((GLeeFuncPtr_glFrameTerminatorGREMEDY = (GLEEPFNGLFRAMETERMINATORGREMEDYPROC) __GLeeGetProcAddress("glFrameTerminatorGREMEDY"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==1) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_NV_conditional_render(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_NV_conditional_render\r
+    if ((GLeeFuncPtr_glBeginConditionalRenderNV = (GLEEPFNGLBEGINCONDITIONALRENDERNVPROC) __GLeeGetProcAddress("glBeginConditionalRenderNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glEndConditionalRenderNV = (GLEEPFNGLENDCONDITIONALRENDERNVPROC) __GLeeGetProcAddress("glEndConditionalRenderNV"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==2) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_NV_present_video(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_EXT_transform_feedback(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_EXT_transform_feedback\r
+    if ((GLeeFuncPtr_glBeginTransformFeedbackEXT = (GLEEPFNGLBEGINTRANSFORMFEEDBACKEXTPROC) __GLeeGetProcAddress("glBeginTransformFeedbackEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glEndTransformFeedbackEXT = (GLEEPFNGLENDTRANSFORMFEEDBACKEXTPROC) __GLeeGetProcAddress("glEndTransformFeedbackEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glBindBufferRangeEXT = (GLEEPFNGLBINDBUFFERRANGEEXTPROC) __GLeeGetProcAddress("glBindBufferRangeEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glBindBufferOffsetEXT = (GLEEPFNGLBINDBUFFEROFFSETEXTPROC) __GLeeGetProcAddress("glBindBufferOffsetEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glBindBufferBaseEXT = (GLEEPFNGLBINDBUFFERBASEEXTPROC) __GLeeGetProcAddress("glBindBufferBaseEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTransformFeedbackVaryingsEXT = (GLEEPFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC) __GLeeGetProcAddress("glTransformFeedbackVaryingsEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetTransformFeedbackVaryingEXT = (GLEEPFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC) __GLeeGetProcAddress("glGetTransformFeedbackVaryingEXT"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==7) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_EXT_direct_state_access(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_EXT_direct_state_access\r
+    if ((GLeeFuncPtr_glClientAttribDefaultEXT = (GLEEPFNGLCLIENTATTRIBDEFAULTEXTPROC) __GLeeGetProcAddress("glClientAttribDefaultEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glPushClientAttribDefaultEXT = (GLEEPFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC) __GLeeGetProcAddress("glPushClientAttribDefaultEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMatrixLoadfEXT = (GLEEPFNGLMATRIXLOADFEXTPROC) __GLeeGetProcAddress("glMatrixLoadfEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMatrixLoaddEXT = (GLEEPFNGLMATRIXLOADDEXTPROC) __GLeeGetProcAddress("glMatrixLoaddEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMatrixMultfEXT = (GLEEPFNGLMATRIXMULTFEXTPROC) __GLeeGetProcAddress("glMatrixMultfEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMatrixMultdEXT = (GLEEPFNGLMATRIXMULTDEXTPROC) __GLeeGetProcAddress("glMatrixMultdEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMatrixLoadIdentityEXT = (GLEEPFNGLMATRIXLOADIDENTITYEXTPROC) __GLeeGetProcAddress("glMatrixLoadIdentityEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMatrixRotatefEXT = (GLEEPFNGLMATRIXROTATEFEXTPROC) __GLeeGetProcAddress("glMatrixRotatefEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMatrixRotatedEXT = (GLEEPFNGLMATRIXROTATEDEXTPROC) __GLeeGetProcAddress("glMatrixRotatedEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMatrixScalefEXT = (GLEEPFNGLMATRIXSCALEFEXTPROC) __GLeeGetProcAddress("glMatrixScalefEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMatrixScaledEXT = (GLEEPFNGLMATRIXSCALEDEXTPROC) __GLeeGetProcAddress("glMatrixScaledEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMatrixTranslatefEXT = (GLEEPFNGLMATRIXTRANSLATEFEXTPROC) __GLeeGetProcAddress("glMatrixTranslatefEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMatrixTranslatedEXT = (GLEEPFNGLMATRIXTRANSLATEDEXTPROC) __GLeeGetProcAddress("glMatrixTranslatedEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMatrixFrustumEXT = (GLEEPFNGLMATRIXFRUSTUMEXTPROC) __GLeeGetProcAddress("glMatrixFrustumEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMatrixOrthoEXT = (GLEEPFNGLMATRIXORTHOEXTPROC) __GLeeGetProcAddress("glMatrixOrthoEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMatrixPopEXT = (GLEEPFNGLMATRIXPOPEXTPROC) __GLeeGetProcAddress("glMatrixPopEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMatrixPushEXT = (GLEEPFNGLMATRIXPUSHEXTPROC) __GLeeGetProcAddress("glMatrixPushEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMatrixLoadTransposefEXT = (GLEEPFNGLMATRIXLOADTRANSPOSEFEXTPROC) __GLeeGetProcAddress("glMatrixLoadTransposefEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMatrixLoadTransposedEXT = (GLEEPFNGLMATRIXLOADTRANSPOSEDEXTPROC) __GLeeGetProcAddress("glMatrixLoadTransposedEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMatrixMultTransposefEXT = (GLEEPFNGLMATRIXMULTTRANSPOSEFEXTPROC) __GLeeGetProcAddress("glMatrixMultTransposefEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMatrixMultTransposedEXT = (GLEEPFNGLMATRIXMULTTRANSPOSEDEXTPROC) __GLeeGetProcAddress("glMatrixMultTransposedEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTextureParameterfEXT = (GLEEPFNGLTEXTUREPARAMETERFEXTPROC) __GLeeGetProcAddress("glTextureParameterfEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTextureParameterfvEXT = (GLEEPFNGLTEXTUREPARAMETERFVEXTPROC) __GLeeGetProcAddress("glTextureParameterfvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTextureParameteriEXT = (GLEEPFNGLTEXTUREPARAMETERIEXTPROC) __GLeeGetProcAddress("glTextureParameteriEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTextureParameterivEXT = (GLEEPFNGLTEXTUREPARAMETERIVEXTPROC) __GLeeGetProcAddress("glTextureParameterivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTextureImage1DEXT = (GLEEPFNGLTEXTUREIMAGE1DEXTPROC) __GLeeGetProcAddress("glTextureImage1DEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTextureImage2DEXT = (GLEEPFNGLTEXTUREIMAGE2DEXTPROC) __GLeeGetProcAddress("glTextureImage2DEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTextureSubImage1DEXT = (GLEEPFNGLTEXTURESUBIMAGE1DEXTPROC) __GLeeGetProcAddress("glTextureSubImage1DEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTextureSubImage2DEXT = (GLEEPFNGLTEXTURESUBIMAGE2DEXTPROC) __GLeeGetProcAddress("glTextureSubImage2DEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glCopyTextureImage1DEXT = (GLEEPFNGLCOPYTEXTUREIMAGE1DEXTPROC) __GLeeGetProcAddress("glCopyTextureImage1DEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glCopyTextureImage2DEXT = (GLEEPFNGLCOPYTEXTUREIMAGE2DEXTPROC) __GLeeGetProcAddress("glCopyTextureImage2DEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glCopyTextureSubImage1DEXT = (GLEEPFNGLCOPYTEXTURESUBIMAGE1DEXTPROC) __GLeeGetProcAddress("glCopyTextureSubImage1DEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glCopyTextureSubImage2DEXT = (GLEEPFNGLCOPYTEXTURESUBIMAGE2DEXTPROC) __GLeeGetProcAddress("glCopyTextureSubImage2DEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetTextureImageEXT = (GLEEPFNGLGETTEXTUREIMAGEEXTPROC) __GLeeGetProcAddress("glGetTextureImageEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetTextureParameterfvEXT = (GLEEPFNGLGETTEXTUREPARAMETERFVEXTPROC) __GLeeGetProcAddress("glGetTextureParameterfvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetTextureParameterivEXT = (GLEEPFNGLGETTEXTUREPARAMETERIVEXTPROC) __GLeeGetProcAddress("glGetTextureParameterivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetTextureLevelParameterfvEXT = (GLEEPFNGLGETTEXTURELEVELPARAMETERFVEXTPROC) __GLeeGetProcAddress("glGetTextureLevelParameterfvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetTextureLevelParameterivEXT = (GLEEPFNGLGETTEXTURELEVELPARAMETERIVEXTPROC) __GLeeGetProcAddress("glGetTextureLevelParameterivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTextureImage3DEXT = (GLEEPFNGLTEXTUREIMAGE3DEXTPROC) __GLeeGetProcAddress("glTextureImage3DEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTextureSubImage3DEXT = (GLEEPFNGLTEXTURESUBIMAGE3DEXTPROC) __GLeeGetProcAddress("glTextureSubImage3DEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glCopyTextureSubImage3DEXT = (GLEEPFNGLCOPYTEXTURESUBIMAGE3DEXTPROC) __GLeeGetProcAddress("glCopyTextureSubImage3DEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexParameterfEXT = (GLEEPFNGLMULTITEXPARAMETERFEXTPROC) __GLeeGetProcAddress("glMultiTexParameterfEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexParameterfvEXT = (GLEEPFNGLMULTITEXPARAMETERFVEXTPROC) __GLeeGetProcAddress("glMultiTexParameterfvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexParameteriEXT = (GLEEPFNGLMULTITEXPARAMETERIEXTPROC) __GLeeGetProcAddress("glMultiTexParameteriEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexParameterivEXT = (GLEEPFNGLMULTITEXPARAMETERIVEXTPROC) __GLeeGetProcAddress("glMultiTexParameterivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexImage1DEXT = (GLEEPFNGLMULTITEXIMAGE1DEXTPROC) __GLeeGetProcAddress("glMultiTexImage1DEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexImage2DEXT = (GLEEPFNGLMULTITEXIMAGE2DEXTPROC) __GLeeGetProcAddress("glMultiTexImage2DEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexSubImage1DEXT = (GLEEPFNGLMULTITEXSUBIMAGE1DEXTPROC) __GLeeGetProcAddress("glMultiTexSubImage1DEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexSubImage2DEXT = (GLEEPFNGLMULTITEXSUBIMAGE2DEXTPROC) __GLeeGetProcAddress("glMultiTexSubImage2DEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glCopyMultiTexImage1DEXT = (GLEEPFNGLCOPYMULTITEXIMAGE1DEXTPROC) __GLeeGetProcAddress("glCopyMultiTexImage1DEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glCopyMultiTexImage2DEXT = (GLEEPFNGLCOPYMULTITEXIMAGE2DEXTPROC) __GLeeGetProcAddress("glCopyMultiTexImage2DEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glCopyMultiTexSubImage1DEXT = (GLEEPFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC) __GLeeGetProcAddress("glCopyMultiTexSubImage1DEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glCopyMultiTexSubImage2DEXT = (GLEEPFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC) __GLeeGetProcAddress("glCopyMultiTexSubImage2DEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetMultiTexImageEXT = (GLEEPFNGLGETMULTITEXIMAGEEXTPROC) __GLeeGetProcAddress("glGetMultiTexImageEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetMultiTexParameterfvEXT = (GLEEPFNGLGETMULTITEXPARAMETERFVEXTPROC) __GLeeGetProcAddress("glGetMultiTexParameterfvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetMultiTexParameterivEXT = (GLEEPFNGLGETMULTITEXPARAMETERIVEXTPROC) __GLeeGetProcAddress("glGetMultiTexParameterivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetMultiTexLevelParameterfvEXT = (GLEEPFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC) __GLeeGetProcAddress("glGetMultiTexLevelParameterfvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetMultiTexLevelParameterivEXT = (GLEEPFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC) __GLeeGetProcAddress("glGetMultiTexLevelParameterivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexImage3DEXT = (GLEEPFNGLMULTITEXIMAGE3DEXTPROC) __GLeeGetProcAddress("glMultiTexImage3DEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexSubImage3DEXT = (GLEEPFNGLMULTITEXSUBIMAGE3DEXTPROC) __GLeeGetProcAddress("glMultiTexSubImage3DEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glCopyMultiTexSubImage3DEXT = (GLEEPFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC) __GLeeGetProcAddress("glCopyMultiTexSubImage3DEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glBindMultiTextureEXT = (GLEEPFNGLBINDMULTITEXTUREEXTPROC) __GLeeGetProcAddress("glBindMultiTextureEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glEnableClientStateIndexedEXT = (GLEEPFNGLENABLECLIENTSTATEINDEXEDEXTPROC) __GLeeGetProcAddress("glEnableClientStateIndexedEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glDisableClientStateIndexedEXT = (GLEEPFNGLDISABLECLIENTSTATEINDEXEDEXTPROC) __GLeeGetProcAddress("glDisableClientStateIndexedEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexCoordPointerEXT = (GLEEPFNGLMULTITEXCOORDPOINTEREXTPROC) __GLeeGetProcAddress("glMultiTexCoordPointerEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexEnvfEXT = (GLEEPFNGLMULTITEXENVFEXTPROC) __GLeeGetProcAddress("glMultiTexEnvfEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexEnvfvEXT = (GLEEPFNGLMULTITEXENVFVEXTPROC) __GLeeGetProcAddress("glMultiTexEnvfvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexEnviEXT = (GLEEPFNGLMULTITEXENVIEXTPROC) __GLeeGetProcAddress("glMultiTexEnviEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexEnvivEXT = (GLEEPFNGLMULTITEXENVIVEXTPROC) __GLeeGetProcAddress("glMultiTexEnvivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexGendEXT = (GLEEPFNGLMULTITEXGENDEXTPROC) __GLeeGetProcAddress("glMultiTexGendEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexGendvEXT = (GLEEPFNGLMULTITEXGENDVEXTPROC) __GLeeGetProcAddress("glMultiTexGendvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexGenfEXT = (GLEEPFNGLMULTITEXGENFEXTPROC) __GLeeGetProcAddress("glMultiTexGenfEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexGenfvEXT = (GLEEPFNGLMULTITEXGENFVEXTPROC) __GLeeGetProcAddress("glMultiTexGenfvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexGeniEXT = (GLEEPFNGLMULTITEXGENIEXTPROC) __GLeeGetProcAddress("glMultiTexGeniEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexGenivEXT = (GLEEPFNGLMULTITEXGENIVEXTPROC) __GLeeGetProcAddress("glMultiTexGenivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetMultiTexEnvfvEXT = (GLEEPFNGLGETMULTITEXENVFVEXTPROC) __GLeeGetProcAddress("glGetMultiTexEnvfvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetMultiTexEnvivEXT = (GLEEPFNGLGETMULTITEXENVIVEXTPROC) __GLeeGetProcAddress("glGetMultiTexEnvivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetMultiTexGendvEXT = (GLEEPFNGLGETMULTITEXGENDVEXTPROC) __GLeeGetProcAddress("glGetMultiTexGendvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetMultiTexGenfvEXT = (GLEEPFNGLGETMULTITEXGENFVEXTPROC) __GLeeGetProcAddress("glGetMultiTexGenfvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetMultiTexGenivEXT = (GLEEPFNGLGETMULTITEXGENIVEXTPROC) __GLeeGetProcAddress("glGetMultiTexGenivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetFloatIndexedvEXT = (GLEEPFNGLGETFLOATINDEXEDVEXTPROC) __GLeeGetProcAddress("glGetFloatIndexedvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetDoubleIndexedvEXT = (GLEEPFNGLGETDOUBLEINDEXEDVEXTPROC) __GLeeGetProcAddress("glGetDoubleIndexedvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetPointerIndexedvEXT = (GLEEPFNGLGETPOINTERINDEXEDVEXTPROC) __GLeeGetProcAddress("glGetPointerIndexedvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glCompressedTextureImage3DEXT = (GLEEPFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC) __GLeeGetProcAddress("glCompressedTextureImage3DEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glCompressedTextureImage2DEXT = (GLEEPFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC) __GLeeGetProcAddress("glCompressedTextureImage2DEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glCompressedTextureImage1DEXT = (GLEEPFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC) __GLeeGetProcAddress("glCompressedTextureImage1DEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glCompressedTextureSubImage3DEXT = (GLEEPFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC) __GLeeGetProcAddress("glCompressedTextureSubImage3DEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glCompressedTextureSubImage2DEXT = (GLEEPFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC) __GLeeGetProcAddress("glCompressedTextureSubImage2DEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glCompressedTextureSubImage1DEXT = (GLEEPFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC) __GLeeGetProcAddress("glCompressedTextureSubImage1DEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetCompressedTextureImageEXT = (GLEEPFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC) __GLeeGetProcAddress("glGetCompressedTextureImageEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glCompressedMultiTexImage3DEXT = (GLEEPFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC) __GLeeGetProcAddress("glCompressedMultiTexImage3DEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glCompressedMultiTexImage2DEXT = (GLEEPFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC) __GLeeGetProcAddress("glCompressedMultiTexImage2DEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glCompressedMultiTexImage1DEXT = (GLEEPFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC) __GLeeGetProcAddress("glCompressedMultiTexImage1DEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glCompressedMultiTexSubImage3DEXT = (GLEEPFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC) __GLeeGetProcAddress("glCompressedMultiTexSubImage3DEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glCompressedMultiTexSubImage2DEXT = (GLEEPFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC) __GLeeGetProcAddress("glCompressedMultiTexSubImage2DEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glCompressedMultiTexSubImage1DEXT = (GLEEPFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC) __GLeeGetProcAddress("glCompressedMultiTexSubImage1DEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetCompressedMultiTexImageEXT = (GLEEPFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC) __GLeeGetProcAddress("glGetCompressedMultiTexImageEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glNamedProgramStringEXT = (GLEEPFNGLNAMEDPROGRAMSTRINGEXTPROC) __GLeeGetProcAddress("glNamedProgramStringEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glNamedProgramLocalParameter4dEXT = (GLEEPFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC) __GLeeGetProcAddress("glNamedProgramLocalParameter4dEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glNamedProgramLocalParameter4dvEXT = (GLEEPFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC) __GLeeGetProcAddress("glNamedProgramLocalParameter4dvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glNamedProgramLocalParameter4fEXT = (GLEEPFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC) __GLeeGetProcAddress("glNamedProgramLocalParameter4fEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glNamedProgramLocalParameter4fvEXT = (GLEEPFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC) __GLeeGetProcAddress("glNamedProgramLocalParameter4fvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetNamedProgramLocalParameterdvEXT = (GLEEPFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC) __GLeeGetProcAddress("glGetNamedProgramLocalParameterdvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetNamedProgramLocalParameterfvEXT = (GLEEPFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC) __GLeeGetProcAddress("glGetNamedProgramLocalParameterfvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetNamedProgramivEXT = (GLEEPFNGLGETNAMEDPROGRAMIVEXTPROC) __GLeeGetProcAddress("glGetNamedProgramivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetNamedProgramStringEXT = (GLEEPFNGLGETNAMEDPROGRAMSTRINGEXTPROC) __GLeeGetProcAddress("glGetNamedProgramStringEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glNamedProgramLocalParameters4fvEXT = (GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC) __GLeeGetProcAddress("glNamedProgramLocalParameters4fvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glNamedProgramLocalParameterI4iEXT = (GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC) __GLeeGetProcAddress("glNamedProgramLocalParameterI4iEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glNamedProgramLocalParameterI4ivEXT = (GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC) __GLeeGetProcAddress("glNamedProgramLocalParameterI4ivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glNamedProgramLocalParametersI4ivEXT = (GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC) __GLeeGetProcAddress("glNamedProgramLocalParametersI4ivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glNamedProgramLocalParameterI4uiEXT = (GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC) __GLeeGetProcAddress("glNamedProgramLocalParameterI4uiEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glNamedProgramLocalParameterI4uivEXT = (GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC) __GLeeGetProcAddress("glNamedProgramLocalParameterI4uivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glNamedProgramLocalParametersI4uivEXT = (GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC) __GLeeGetProcAddress("glNamedProgramLocalParametersI4uivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetNamedProgramLocalParameterIivEXT = (GLEEPFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC) __GLeeGetProcAddress("glGetNamedProgramLocalParameterIivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetNamedProgramLocalParameterIuivEXT = (GLEEPFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC) __GLeeGetProcAddress("glGetNamedProgramLocalParameterIuivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTextureParameterIivEXT = (GLEEPFNGLTEXTUREPARAMETERIIVEXTPROC) __GLeeGetProcAddress("glTextureParameterIivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTextureParameterIuivEXT = (GLEEPFNGLTEXTUREPARAMETERIUIVEXTPROC) __GLeeGetProcAddress("glTextureParameterIuivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetTextureParameterIivEXT = (GLEEPFNGLGETTEXTUREPARAMETERIIVEXTPROC) __GLeeGetProcAddress("glGetTextureParameterIivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetTextureParameterIuivEXT = (GLEEPFNGLGETTEXTUREPARAMETERIUIVEXTPROC) __GLeeGetProcAddress("glGetTextureParameterIuivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexParameterIivEXT = (GLEEPFNGLMULTITEXPARAMETERIIVEXTPROC) __GLeeGetProcAddress("glMultiTexParameterIivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexParameterIuivEXT = (GLEEPFNGLMULTITEXPARAMETERIUIVEXTPROC) __GLeeGetProcAddress("glMultiTexParameterIuivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetMultiTexParameterIivEXT = (GLEEPFNGLGETMULTITEXPARAMETERIIVEXTPROC) __GLeeGetProcAddress("glGetMultiTexParameterIivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetMultiTexParameterIuivEXT = (GLEEPFNGLGETMULTITEXPARAMETERIUIVEXTPROC) __GLeeGetProcAddress("glGetMultiTexParameterIuivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramUniform1fEXT = (GLEEPFNGLPROGRAMUNIFORM1FEXTPROC) __GLeeGetProcAddress("glProgramUniform1fEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramUniform2fEXT = (GLEEPFNGLPROGRAMUNIFORM2FEXTPROC) __GLeeGetProcAddress("glProgramUniform2fEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramUniform3fEXT = (GLEEPFNGLPROGRAMUNIFORM3FEXTPROC) __GLeeGetProcAddress("glProgramUniform3fEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramUniform4fEXT = (GLEEPFNGLPROGRAMUNIFORM4FEXTPROC) __GLeeGetProcAddress("glProgramUniform4fEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramUniform1iEXT = (GLEEPFNGLPROGRAMUNIFORM1IEXTPROC) __GLeeGetProcAddress("glProgramUniform1iEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramUniform2iEXT = (GLEEPFNGLPROGRAMUNIFORM2IEXTPROC) __GLeeGetProcAddress("glProgramUniform2iEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramUniform3iEXT = (GLEEPFNGLPROGRAMUNIFORM3IEXTPROC) __GLeeGetProcAddress("glProgramUniform3iEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramUniform4iEXT = (GLEEPFNGLPROGRAMUNIFORM4IEXTPROC) __GLeeGetProcAddress("glProgramUniform4iEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramUniform1fvEXT = (GLEEPFNGLPROGRAMUNIFORM1FVEXTPROC) __GLeeGetProcAddress("glProgramUniform1fvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramUniform2fvEXT = (GLEEPFNGLPROGRAMUNIFORM2FVEXTPROC) __GLeeGetProcAddress("glProgramUniform2fvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramUniform3fvEXT = (GLEEPFNGLPROGRAMUNIFORM3FVEXTPROC) __GLeeGetProcAddress("glProgramUniform3fvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramUniform4fvEXT = (GLEEPFNGLPROGRAMUNIFORM4FVEXTPROC) __GLeeGetProcAddress("glProgramUniform4fvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramUniform1ivEXT = (GLEEPFNGLPROGRAMUNIFORM1IVEXTPROC) __GLeeGetProcAddress("glProgramUniform1ivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramUniform2ivEXT = (GLEEPFNGLPROGRAMUNIFORM2IVEXTPROC) __GLeeGetProcAddress("glProgramUniform2ivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramUniform3ivEXT = (GLEEPFNGLPROGRAMUNIFORM3IVEXTPROC) __GLeeGetProcAddress("glProgramUniform3ivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramUniform4ivEXT = (GLEEPFNGLPROGRAMUNIFORM4IVEXTPROC) __GLeeGetProcAddress("glProgramUniform4ivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramUniformMatrix2fvEXT = (GLEEPFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC) __GLeeGetProcAddress("glProgramUniformMatrix2fvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramUniformMatrix3fvEXT = (GLEEPFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC) __GLeeGetProcAddress("glProgramUniformMatrix3fvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramUniformMatrix4fvEXT = (GLEEPFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC) __GLeeGetProcAddress("glProgramUniformMatrix4fvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramUniformMatrix2x3fvEXT = (GLEEPFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC) __GLeeGetProcAddress("glProgramUniformMatrix2x3fvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramUniformMatrix3x2fvEXT = (GLEEPFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC) __GLeeGetProcAddress("glProgramUniformMatrix3x2fvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramUniformMatrix2x4fvEXT = (GLEEPFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC) __GLeeGetProcAddress("glProgramUniformMatrix2x4fvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramUniformMatrix4x2fvEXT = (GLEEPFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC) __GLeeGetProcAddress("glProgramUniformMatrix4x2fvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramUniformMatrix3x4fvEXT = (GLEEPFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC) __GLeeGetProcAddress("glProgramUniformMatrix3x4fvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramUniformMatrix4x3fvEXT = (GLEEPFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC) __GLeeGetProcAddress("glProgramUniformMatrix4x3fvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramUniform1uiEXT = (GLEEPFNGLPROGRAMUNIFORM1UIEXTPROC) __GLeeGetProcAddress("glProgramUniform1uiEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramUniform2uiEXT = (GLEEPFNGLPROGRAMUNIFORM2UIEXTPROC) __GLeeGetProcAddress("glProgramUniform2uiEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramUniform3uiEXT = (GLEEPFNGLPROGRAMUNIFORM3UIEXTPROC) __GLeeGetProcAddress("glProgramUniform3uiEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramUniform4uiEXT = (GLEEPFNGLPROGRAMUNIFORM4UIEXTPROC) __GLeeGetProcAddress("glProgramUniform4uiEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramUniform1uivEXT = (GLEEPFNGLPROGRAMUNIFORM1UIVEXTPROC) __GLeeGetProcAddress("glProgramUniform1uivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramUniform2uivEXT = (GLEEPFNGLPROGRAMUNIFORM2UIVEXTPROC) __GLeeGetProcAddress("glProgramUniform2uivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramUniform3uivEXT = (GLEEPFNGLPROGRAMUNIFORM3UIVEXTPROC) __GLeeGetProcAddress("glProgramUniform3uivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramUniform4uivEXT = (GLEEPFNGLPROGRAMUNIFORM4UIVEXTPROC) __GLeeGetProcAddress("glProgramUniform4uivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glNamedBufferDataEXT = (GLEEPFNGLNAMEDBUFFERDATAEXTPROC) __GLeeGetProcAddress("glNamedBufferDataEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glNamedBufferSubDataEXT = (GLEEPFNGLNAMEDBUFFERSUBDATAEXTPROC) __GLeeGetProcAddress("glNamedBufferSubDataEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMapNamedBufferEXT = (GLEEPFNGLMAPNAMEDBUFFEREXTPROC) __GLeeGetProcAddress("glMapNamedBufferEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glUnmapNamedBufferEXT = (GLEEPFNGLUNMAPNAMEDBUFFEREXTPROC) __GLeeGetProcAddress("glUnmapNamedBufferEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetNamedBufferParameterivEXT = (GLEEPFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC) __GLeeGetProcAddress("glGetNamedBufferParameterivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetNamedBufferPointervEXT = (GLEEPFNGLGETNAMEDBUFFERPOINTERVEXTPROC) __GLeeGetProcAddress("glGetNamedBufferPointervEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetNamedBufferSubDataEXT = (GLEEPFNGLGETNAMEDBUFFERSUBDATAEXTPROC) __GLeeGetProcAddress("glGetNamedBufferSubDataEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTextureBufferEXT = (GLEEPFNGLTEXTUREBUFFEREXTPROC) __GLeeGetProcAddress("glTextureBufferEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexBufferEXT = (GLEEPFNGLMULTITEXBUFFEREXTPROC) __GLeeGetProcAddress("glMultiTexBufferEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glNamedRenderbufferStorageEXT = (GLEEPFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC) __GLeeGetProcAddress("glNamedRenderbufferStorageEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetNamedRenderbufferParameterivEXT = (GLEEPFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC) __GLeeGetProcAddress("glGetNamedRenderbufferParameterivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glCheckNamedFramebufferStatusEXT = (GLEEPFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC) __GLeeGetProcAddress("glCheckNamedFramebufferStatusEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glNamedFramebufferTexture1DEXT = (GLEEPFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC) __GLeeGetProcAddress("glNamedFramebufferTexture1DEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glNamedFramebufferTexture2DEXT = (GLEEPFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC) __GLeeGetProcAddress("glNamedFramebufferTexture2DEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glNamedFramebufferTexture3DEXT = (GLEEPFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC) __GLeeGetProcAddress("glNamedFramebufferTexture3DEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glNamedFramebufferRenderbufferEXT = (GLEEPFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC) __GLeeGetProcAddress("glNamedFramebufferRenderbufferEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetNamedFramebufferAttachmentParameterivEXT = (GLEEPFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) __GLeeGetProcAddress("glGetNamedFramebufferAttachmentParameterivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGenerateTextureMipmapEXT = (GLEEPFNGLGENERATETEXTUREMIPMAPEXTPROC) __GLeeGetProcAddress("glGenerateTextureMipmapEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGenerateMultiTexMipmapEXT = (GLEEPFNGLGENERATEMULTITEXMIPMAPEXTPROC) __GLeeGetProcAddress("glGenerateMultiTexMipmapEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFramebufferDrawBufferEXT = (GLEEPFNGLFRAMEBUFFERDRAWBUFFEREXTPROC) __GLeeGetProcAddress("glFramebufferDrawBufferEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFramebufferDrawBuffersEXT = (GLEEPFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC) __GLeeGetProcAddress("glFramebufferDrawBuffersEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFramebufferReadBufferEXT = (GLEEPFNGLFRAMEBUFFERREADBUFFEREXTPROC) __GLeeGetProcAddress("glFramebufferReadBufferEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetFramebufferParameterivEXT = (GLEEPFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC) __GLeeGetProcAddress("glGetFramebufferParameterivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glNamedRenderbufferStorageMultisampleEXT = (GLEEPFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) __GLeeGetProcAddress("glNamedRenderbufferStorageMultisampleEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glNamedRenderbufferStorageMultisampleCoverageEXT = (GLEEPFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC) __GLeeGetProcAddress("glNamedRenderbufferStorageMultisampleCoverageEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glNamedFramebufferTextureEXT = (GLEEPFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC) __GLeeGetProcAddress("glNamedFramebufferTextureEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glNamedFramebufferTextureLayerEXT = (GLEEPFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC) __GLeeGetProcAddress("glNamedFramebufferTextureLayerEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glNamedFramebufferTextureFaceEXT = (GLEEPFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC) __GLeeGetProcAddress("glNamedFramebufferTextureFaceEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTextureRenderbufferEXT = (GLEEPFNGLTEXTURERENDERBUFFEREXTPROC) __GLeeGetProcAddress("glTextureRenderbufferEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glMultiTexRenderbufferEXT = (GLEEPFNGLMULTITEXRENDERBUFFEREXTPROC) __GLeeGetProcAddress("glMultiTexRenderbufferEXT"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==186) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_EXT_vertex_array_bgra(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_EXT_texture_swizzle(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_NV_explicit_multisample(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_NV_explicit_multisample\r
+    if ((GLeeFuncPtr_glGetMultisamplefvNV = (GLEEPFNGLGETMULTISAMPLEFVNVPROC) __GLeeGetProcAddress("glGetMultisamplefvNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glSampleMaskIndexedNV = (GLEEPFNGLSAMPLEMASKINDEXEDNVPROC) __GLeeGetProcAddress("glSampleMaskIndexedNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glTexRenderbufferNV = (GLEEPFNGLTEXRENDERBUFFERNVPROC) __GLeeGetProcAddress("glTexRenderbufferNV"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==3) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_NV_transform_feedback2(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_NV_transform_feedback2\r
+    if ((GLeeFuncPtr_glBindTransformFeedbackNV = (GLEEPFNGLBINDTRANSFORMFEEDBACKNVPROC) __GLeeGetProcAddress("glBindTransformFeedbackNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glDeleteTransformFeedbacksNV = (GLEEPFNGLDELETETRANSFORMFEEDBACKSNVPROC) __GLeeGetProcAddress("glDeleteTransformFeedbacksNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGenTransformFeedbacksNV = (GLEEPFNGLGENTRANSFORMFEEDBACKSNVPROC) __GLeeGetProcAddress("glGenTransformFeedbacksNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glIsTransformFeedbackNV = (GLEEPFNGLISTRANSFORMFEEDBACKNVPROC) __GLeeGetProcAddress("glIsTransformFeedbackNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glPauseTransformFeedbackNV = (GLEEPFNGLPAUSETRANSFORMFEEDBACKNVPROC) __GLeeGetProcAddress("glPauseTransformFeedbackNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glResumeTransformFeedbackNV = (GLEEPFNGLRESUMETRANSFORMFEEDBACKNVPROC) __GLeeGetProcAddress("glResumeTransformFeedbackNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glDrawTransformFeedbackNV = (GLEEPFNGLDRAWTRANSFORMFEEDBACKNVPROC) __GLeeGetProcAddress("glDrawTransformFeedbackNV"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==7) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_SGIX_texture_select(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_INGR_blend_func_separate(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_INGR_blend_func_separate\r
+    if ((GLeeFuncPtr_glBlendFuncSeparateINGR = (GLEEPFNGLBLENDFUNCSEPARATEINGRPROC) __GLeeGetProcAddress("glBlendFuncSeparateINGR"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==1) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_SGIX_depth_pass_instrument(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_SGIX_igloo_interface(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_SGIX_igloo_interface\r
+    if ((GLeeFuncPtr_glIglooInterfaceSGIX = (GLEEPFNGLIGLOOINTERFACESGIXPROC) __GLeeGetProcAddress("glIglooInterfaceSGIX"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==1) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_EXT_fragment_lighting(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_EXT_fragment_lighting\r
+    if ((GLeeFuncPtr_glFragmentLightModeliEXT = (GLEEPFNGLFRAGMENTLIGHTMODELIEXTPROC) __GLeeGetProcAddress("glFragmentLightModeliEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFragmentLightModelfEXT = (GLEEPFNGLFRAGMENTLIGHTMODELFEXTPROC) __GLeeGetProcAddress("glFragmentLightModelfEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFragmentLightModelivEXT = (GLEEPFNGLFRAGMENTLIGHTMODELIVEXTPROC) __GLeeGetProcAddress("glFragmentLightModelivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFragmentLightModelfvEXT = (GLEEPFNGLFRAGMENTLIGHTMODELFVEXTPROC) __GLeeGetProcAddress("glFragmentLightModelfvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFragmentLightiEXT = (GLEEPFNGLFRAGMENTLIGHTIEXTPROC) __GLeeGetProcAddress("glFragmentLightiEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFragmentLightfEXT = (GLEEPFNGLFRAGMENTLIGHTFEXTPROC) __GLeeGetProcAddress("glFragmentLightfEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFragmentLightivEXT = (GLEEPFNGLFRAGMENTLIGHTIVEXTPROC) __GLeeGetProcAddress("glFragmentLightivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFragmentLightfvEXT = (GLEEPFNGLFRAGMENTLIGHTFVEXTPROC) __GLeeGetProcAddress("glFragmentLightfvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetFragmentLightivEXT = (GLEEPFNGLGETFRAGMENTLIGHTIVEXTPROC) __GLeeGetProcAddress("glGetFragmentLightivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetFragmentLightfvEXT = (GLEEPFNGLGETFRAGMENTLIGHTFVEXTPROC) __GLeeGetProcAddress("glGetFragmentLightfvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFragmentMaterialfEXT = (GLEEPFNGLFRAGMENTMATERIALFEXTPROC) __GLeeGetProcAddress("glFragmentMaterialfEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFragmentMaterialiEXT = (GLEEPFNGLFRAGMENTMATERIALIEXTPROC) __GLeeGetProcAddress("glFragmentMaterialiEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFragmentMaterialfvEXT = (GLEEPFNGLFRAGMENTMATERIALFVEXTPROC) __GLeeGetProcAddress("glFragmentMaterialfvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFragmentMaterialivEXT = (GLEEPFNGLFRAGMENTMATERIALIVEXTPROC) __GLeeGetProcAddress("glFragmentMaterialivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFragmentColorMaterialEXT = (GLEEPFNGLFRAGMENTCOLORMATERIALEXTPROC) __GLeeGetProcAddress("glFragmentColorMaterialEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetFragmentMaterialfvEXT = (GLEEPFNGLGETFRAGMENTMATERIALFVEXTPROC) __GLeeGetProcAddress("glGetFragmentMaterialfvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetFragmentMaterialivEXT = (GLEEPFNGLGETFRAGMENTMATERIALIVEXTPROC) __GLeeGetProcAddress("glGetFragmentMaterialivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glLightEnviEXT = (GLEEPFNGLLIGHTENVIEXTPROC) __GLeeGetProcAddress("glLightEnviEXT"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==18) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_EXT_geometry_shader4(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_EXT_geometry_shader4\r
+    if ((GLeeFuncPtr_glProgramParameteriEXT = (GLEEPFNGLPROGRAMPARAMETERIEXTPROC) __GLeeGetProcAddress("glProgramParameteriEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFramebufferTextureEXT = (GLEEPFNGLFRAMEBUFFERTEXTUREEXTPROC) __GLeeGetProcAddress("glFramebufferTextureEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFramebufferTextureLayerEXT = (GLEEPFNGLFRAMEBUFFERTEXTURELAYEREXTPROC) __GLeeGetProcAddress("glFramebufferTextureLayerEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFramebufferTextureFaceEXT = (GLEEPFNGLFRAMEBUFFERTEXTUREFACEEXTPROC) __GLeeGetProcAddress("glFramebufferTextureFaceEXT"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==4) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_EXT_scene_marker(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_EXT_scene_marker\r
+    if ((GLeeFuncPtr_glBeginSceneEXT = (GLEEPFNGLBEGINSCENEEXTPROC) __GLeeGetProcAddress("glBeginSceneEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glEndSceneEXT = (GLEEPFNGLENDSCENEEXTPROC) __GLeeGetProcAddress("glEndSceneEXT"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==2) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_EXT_texture_compression_dxt1(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_EXT_texture_env(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_IBM_static_data(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_NV_gpu_program4(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_NV_gpu_program4\r
+    if ((GLeeFuncPtr_glProgramLocalParameterI4iNV = (GLEEPFNGLPROGRAMLOCALPARAMETERI4INVPROC) __GLeeGetProcAddress("glProgramLocalParameterI4iNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramLocalParameterI4ivNV = (GLEEPFNGLPROGRAMLOCALPARAMETERI4IVNVPROC) __GLeeGetProcAddress("glProgramLocalParameterI4ivNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramLocalParametersI4ivNV = (GLEEPFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC) __GLeeGetProcAddress("glProgramLocalParametersI4ivNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramLocalParameterI4uiNV = (GLEEPFNGLPROGRAMLOCALPARAMETERI4UINVPROC) __GLeeGetProcAddress("glProgramLocalParameterI4uiNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramLocalParameterI4uivNV = (GLEEPFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC) __GLeeGetProcAddress("glProgramLocalParameterI4uivNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramLocalParametersI4uivNV = (GLEEPFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC) __GLeeGetProcAddress("glProgramLocalParametersI4uivNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramEnvParameterI4iNV = (GLEEPFNGLPROGRAMENVPARAMETERI4INVPROC) __GLeeGetProcAddress("glProgramEnvParameterI4iNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramEnvParameterI4ivNV = (GLEEPFNGLPROGRAMENVPARAMETERI4IVNVPROC) __GLeeGetProcAddress("glProgramEnvParameterI4ivNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramEnvParametersI4ivNV = (GLEEPFNGLPROGRAMENVPARAMETERSI4IVNVPROC) __GLeeGetProcAddress("glProgramEnvParametersI4ivNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramEnvParameterI4uiNV = (GLEEPFNGLPROGRAMENVPARAMETERI4UINVPROC) __GLeeGetProcAddress("glProgramEnvParameterI4uiNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramEnvParameterI4uivNV = (GLEEPFNGLPROGRAMENVPARAMETERI4UIVNVPROC) __GLeeGetProcAddress("glProgramEnvParameterI4uivNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glProgramEnvParametersI4uivNV = (GLEEPFNGLPROGRAMENVPARAMETERSI4UIVNVPROC) __GLeeGetProcAddress("glProgramEnvParametersI4uivNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetProgramLocalParameterIivNV = (GLEEPFNGLGETPROGRAMLOCALPARAMETERIIVNVPROC) __GLeeGetProcAddress("glGetProgramLocalParameterIivNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetProgramLocalParameterIuivNV = (GLEEPFNGLGETPROGRAMLOCALPARAMETERIUIVNVPROC) __GLeeGetProcAddress("glGetProgramLocalParameterIuivNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetProgramEnvParameterIivNV = (GLEEPFNGLGETPROGRAMENVPARAMETERIIVNVPROC) __GLeeGetProcAddress("glGetProgramEnvParameterIivNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetProgramEnvParameterIuivNV = (GLEEPFNGLGETPROGRAMENVPARAMETERIUIVNVPROC) __GLeeGetProcAddress("glGetProgramEnvParameterIuivNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFramebufferTextureEXT = (GLEEPFNGLFRAMEBUFFERTEXTUREEXTPROC) __GLeeGetProcAddress("glFramebufferTextureEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFramebufferTextureLayerEXT = (GLEEPFNGLFRAMEBUFFERTEXTURELAYEREXTPROC) __GLeeGetProcAddress("glFramebufferTextureLayerEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFramebufferTextureFaceEXT = (GLEEPFNGLFRAMEBUFFERTEXTUREFACEEXTPROC) __GLeeGetProcAddress("glFramebufferTextureFaceEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttribI2iEXT = (GLEEPFNGLVERTEXATTRIBI2IEXTPROC) __GLeeGetProcAddress("glVertexAttribI2iEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttribI3iEXT = (GLEEPFNGLVERTEXATTRIBI3IEXTPROC) __GLeeGetProcAddress("glVertexAttribI3iEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttribI4iEXT = (GLEEPFNGLVERTEXATTRIBI4IEXTPROC) __GLeeGetProcAddress("glVertexAttribI4iEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttribI1uiEXT = (GLEEPFNGLVERTEXATTRIBI1UIEXTPROC) __GLeeGetProcAddress("glVertexAttribI1uiEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttribI2uiEXT = (GLEEPFNGLVERTEXATTRIBI2UIEXTPROC) __GLeeGetProcAddress("glVertexAttribI2uiEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttribI3uiEXT = (GLEEPFNGLVERTEXATTRIBI3UIEXTPROC) __GLeeGetProcAddress("glVertexAttribI3uiEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttribI4uiEXT = (GLEEPFNGLVERTEXATTRIBI4UIEXTPROC) __GLeeGetProcAddress("glVertexAttribI4uiEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttribI1ivEXT = (GLEEPFNGLVERTEXATTRIBI1IVEXTPROC) __GLeeGetProcAddress("glVertexAttribI1ivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttribI2ivEXT = (GLEEPFNGLVERTEXATTRIBI2IVEXTPROC) __GLeeGetProcAddress("glVertexAttribI2ivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttribI3ivEXT = (GLEEPFNGLVERTEXATTRIBI3IVEXTPROC) __GLeeGetProcAddress("glVertexAttribI3ivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttribI4ivEXT = (GLEEPFNGLVERTEXATTRIBI4IVEXTPROC) __GLeeGetProcAddress("glVertexAttribI4ivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttribI1uivEXT = (GLEEPFNGLVERTEXATTRIBI1UIVEXTPROC) __GLeeGetProcAddress("glVertexAttribI1uivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttribI2uivEXT = (GLEEPFNGLVERTEXATTRIBI2UIVEXTPROC) __GLeeGetProcAddress("glVertexAttribI2uivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttribI3uivEXT = (GLEEPFNGLVERTEXATTRIBI3UIVEXTPROC) __GLeeGetProcAddress("glVertexAttribI3uivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttribI4uivEXT = (GLEEPFNGLVERTEXATTRIBI4UIVEXTPROC) __GLeeGetProcAddress("glVertexAttribI4uivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttribI4bvEXT = (GLEEPFNGLVERTEXATTRIBI4BVEXTPROC) __GLeeGetProcAddress("glVertexAttribI4bvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttribI4svEXT = (GLEEPFNGLVERTEXATTRIBI4SVEXTPROC) __GLeeGetProcAddress("glVertexAttribI4svEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttribI4ubvEXT = (GLEEPFNGLVERTEXATTRIBI4UBVEXTPROC) __GLeeGetProcAddress("glVertexAttribI4ubvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttribI4usvEXT = (GLEEPFNGLVERTEXATTRIBI4USVEXTPROC) __GLeeGetProcAddress("glVertexAttribI4usvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glVertexAttribIPointerEXT = (GLEEPFNGLVERTEXATTRIBIPOINTEREXTPROC) __GLeeGetProcAddress("glVertexAttribIPointerEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetVertexAttribIivEXT = (GLEEPFNGLGETVERTEXATTRIBIIVEXTPROC) __GLeeGetProcAddress("glGetVertexAttribIivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetVertexAttribIuivEXT = (GLEEPFNGLGETVERTEXATTRIBIUIVEXTPROC) __GLeeGetProcAddress("glGetVertexAttribIuivEXT"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==41) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_OES_byte_coordinates(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_OES_compressed_paletted_texture(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_OES_single_precision(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GL_OES_single_precision\r
+    if ((GLeeFuncPtr_glDepthRangefOES = (GLEEPFNGLDEPTHRANGEFOESPROC) __GLeeGetProcAddress("glDepthRangefOES"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glFrustumfOES = (GLEEPFNGLFRUSTUMFOESPROC) __GLeeGetProcAddress("glFrustumfOES"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glOrthofOES = (GLEEPFNGLORTHOFOESPROC) __GLeeGetProcAddress("glOrthofOES"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glClipPlanefOES = (GLEEPFNGLCLIPPLANEFOESPROC) __GLeeGetProcAddress("glClipPlanefOES"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glGetClipPlanefOES = (GLEEPFNGLGETCLIPPLANEFOESPROC) __GLeeGetProcAddress("glGetClipPlanefOES"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glClearDepthfOES = (GLEEPFNGLCLEARDEPTHFOESPROC) __GLeeGetProcAddress("glClearDepthfOES"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==6) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GL_SGIX_pixel_texture_bits(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GL_SGIX_texture_range(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLEE_LINK_FUNCTION __GLeeGLLoadFunction[322];\r
+\r
+void initGLLoadFunctions(void)\r
+{\r
+    __GLeeGLLoadFunction[0]=__GLeeLink_GL_VERSION_1_2;\r
+    __GLeeGLLoadFunction[1]=__GLeeLink_GL_ARB_imaging;\r
+    __GLeeGLLoadFunction[2]=__GLeeLink_GL_VERSION_1_3;\r
+    __GLeeGLLoadFunction[3]=__GLeeLink_GL_VERSION_1_4;\r
+    __GLeeGLLoadFunction[4]=__GLeeLink_GL_VERSION_1_5;\r
+    __GLeeGLLoadFunction[5]=__GLeeLink_GL_VERSION_2_0;\r
+    __GLeeGLLoadFunction[6]=__GLeeLink_GL_VERSION_2_1;\r
+    __GLeeGLLoadFunction[7]=__GLeeLink_GL_VERSION_3_0;\r
+    __GLeeGLLoadFunction[8]=__GLeeLink_GL_ARB_multitexture;\r
+    __GLeeGLLoadFunction[9]=__GLeeLink_GL_ARB_transpose_matrix;\r
+    __GLeeGLLoadFunction[10]=__GLeeLink_GL_ARB_multisample;\r
+    __GLeeGLLoadFunction[11]=__GLeeLink_GL_ARB_texture_env_add;\r
+    __GLeeGLLoadFunction[12]=__GLeeLink_GL_ARB_texture_cube_map;\r
+    __GLeeGLLoadFunction[13]=__GLeeLink_GL_ARB_texture_compression;\r
+    __GLeeGLLoadFunction[14]=__GLeeLink_GL_ARB_texture_border_clamp;\r
+    __GLeeGLLoadFunction[15]=__GLeeLink_GL_ARB_point_parameters;\r
+    __GLeeGLLoadFunction[16]=__GLeeLink_GL_ARB_vertex_blend;\r
+    __GLeeGLLoadFunction[17]=__GLeeLink_GL_ARB_matrix_palette;\r
+    __GLeeGLLoadFunction[18]=__GLeeLink_GL_ARB_texture_env_combine;\r
+    __GLeeGLLoadFunction[19]=__GLeeLink_GL_ARB_texture_env_crossbar;\r
+    __GLeeGLLoadFunction[20]=__GLeeLink_GL_ARB_texture_env_dot3;\r
+    __GLeeGLLoadFunction[21]=__GLeeLink_GL_ARB_texture_mirrored_repeat;\r
+    __GLeeGLLoadFunction[22]=__GLeeLink_GL_ARB_depth_texture;\r
+    __GLeeGLLoadFunction[23]=__GLeeLink_GL_ARB_shadow;\r
+    __GLeeGLLoadFunction[24]=__GLeeLink_GL_ARB_shadow_ambient;\r
+    __GLeeGLLoadFunction[25]=__GLeeLink_GL_ARB_window_pos;\r
+    __GLeeGLLoadFunction[26]=__GLeeLink_GL_ARB_vertex_program;\r
+    __GLeeGLLoadFunction[27]=__GLeeLink_GL_ARB_fragment_program;\r
+    __GLeeGLLoadFunction[28]=__GLeeLink_GL_ARB_vertex_buffer_object;\r
+    __GLeeGLLoadFunction[29]=__GLeeLink_GL_ARB_occlusion_query;\r
+    __GLeeGLLoadFunction[30]=__GLeeLink_GL_ARB_shader_objects;\r
+    __GLeeGLLoadFunction[31]=__GLeeLink_GL_ARB_vertex_shader;\r
+    __GLeeGLLoadFunction[32]=__GLeeLink_GL_ARB_fragment_shader;\r
+    __GLeeGLLoadFunction[33]=__GLeeLink_GL_ARB_shading_language_100;\r
+    __GLeeGLLoadFunction[34]=__GLeeLink_GL_ARB_texture_non_power_of_two;\r
+    __GLeeGLLoadFunction[35]=__GLeeLink_GL_ARB_point_sprite;\r
+    __GLeeGLLoadFunction[36]=__GLeeLink_GL_ARB_fragment_program_shadow;\r
+    __GLeeGLLoadFunction[37]=__GLeeLink_GL_ARB_draw_buffers;\r
+    __GLeeGLLoadFunction[38]=__GLeeLink_GL_ARB_texture_rectangle;\r
+    __GLeeGLLoadFunction[39]=__GLeeLink_GL_ARB_color_buffer_float;\r
+    __GLeeGLLoadFunction[40]=__GLeeLink_GL_ARB_half_float_pixel;\r
+    __GLeeGLLoadFunction[41]=__GLeeLink_GL_ARB_texture_float;\r
+    __GLeeGLLoadFunction[42]=__GLeeLink_GL_ARB_pixel_buffer_object;\r
+    __GLeeGLLoadFunction[43]=__GLeeLink_GL_ARB_depth_buffer_float;\r
+    __GLeeGLLoadFunction[44]=__GLeeLink_GL_ARB_draw_instanced;\r
+    __GLeeGLLoadFunction[45]=__GLeeLink_GL_ARB_framebuffer_object;\r
+    __GLeeGLLoadFunction[46]=__GLeeLink_GL_ARB_framebuffer_sRGB;\r
+    __GLeeGLLoadFunction[47]=__GLeeLink_GL_ARB_geometry_shader4;\r
+    __GLeeGLLoadFunction[48]=__GLeeLink_GL_ARB_half_float_vertex;\r
+    __GLeeGLLoadFunction[49]=__GLeeLink_GL_ARB_instanced_arrays;\r
+    __GLeeGLLoadFunction[50]=__GLeeLink_GL_ARB_map_buffer_range;\r
+    __GLeeGLLoadFunction[51]=__GLeeLink_GL_ARB_texture_buffer_object;\r
+    __GLeeGLLoadFunction[52]=__GLeeLink_GL_ARB_texture_compression_rgtc;\r
+    __GLeeGLLoadFunction[53]=__GLeeLink_GL_ARB_texture_rg;\r
+    __GLeeGLLoadFunction[54]=__GLeeLink_GL_ARB_vertex_array_object;\r
+    __GLeeGLLoadFunction[55]=__GLeeLink_GL_EXT_abgr;\r
+    __GLeeGLLoadFunction[56]=__GLeeLink_GL_EXT_blend_color;\r
+    __GLeeGLLoadFunction[57]=__GLeeLink_GL_EXT_polygon_offset;\r
+    __GLeeGLLoadFunction[58]=__GLeeLink_GL_EXT_texture;\r
+    __GLeeGLLoadFunction[59]=__GLeeLink_GL_EXT_texture3D;\r
+    __GLeeGLLoadFunction[60]=__GLeeLink_GL_SGIS_texture_filter4;\r
+    __GLeeGLLoadFunction[61]=__GLeeLink_GL_EXT_subtexture;\r
+    __GLeeGLLoadFunction[62]=__GLeeLink_GL_EXT_copy_texture;\r
+    __GLeeGLLoadFunction[63]=__GLeeLink_GL_EXT_histogram;\r
+    __GLeeGLLoadFunction[64]=__GLeeLink_GL_EXT_convolution;\r
+    __GLeeGLLoadFunction[65]=__GLeeLink_GL_SGI_color_matrix;\r
+    __GLeeGLLoadFunction[66]=__GLeeLink_GL_SGI_color_table;\r
+    __GLeeGLLoadFunction[67]=__GLeeLink_GL_SGIS_pixel_texture;\r
+    __GLeeGLLoadFunction[68]=__GLeeLink_GL_SGIX_pixel_texture;\r
+    __GLeeGLLoadFunction[69]=__GLeeLink_GL_SGIS_texture4D;\r
+    __GLeeGLLoadFunction[70]=__GLeeLink_GL_SGI_texture_color_table;\r
+    __GLeeGLLoadFunction[71]=__GLeeLink_GL_EXT_cmyka;\r
+    __GLeeGLLoadFunction[72]=__GLeeLink_GL_EXT_texture_object;\r
+    __GLeeGLLoadFunction[73]=__GLeeLink_GL_SGIS_detail_texture;\r
+    __GLeeGLLoadFunction[74]=__GLeeLink_GL_SGIS_sharpen_texture;\r
+    __GLeeGLLoadFunction[75]=__GLeeLink_GL_EXT_packed_pixels;\r
+    __GLeeGLLoadFunction[76]=__GLeeLink_GL_SGIS_texture_lod;\r
+    __GLeeGLLoadFunction[77]=__GLeeLink_GL_SGIS_multisample;\r
+    __GLeeGLLoadFunction[78]=__GLeeLink_GL_EXT_rescale_normal;\r
+    __GLeeGLLoadFunction[79]=__GLeeLink_GL_EXT_vertex_array;\r
+    __GLeeGLLoadFunction[80]=__GLeeLink_GL_EXT_misc_attribute;\r
+    __GLeeGLLoadFunction[81]=__GLeeLink_GL_SGIS_generate_mipmap;\r
+    __GLeeGLLoadFunction[82]=__GLeeLink_GL_SGIX_clipmap;\r
+    __GLeeGLLoadFunction[83]=__GLeeLink_GL_SGIX_shadow;\r
+    __GLeeGLLoadFunction[84]=__GLeeLink_GL_SGIS_texture_edge_clamp;\r
+    __GLeeGLLoadFunction[85]=__GLeeLink_GL_SGIS_texture_border_clamp;\r
+    __GLeeGLLoadFunction[86]=__GLeeLink_GL_EXT_blend_minmax;\r
+    __GLeeGLLoadFunction[87]=__GLeeLink_GL_EXT_blend_subtract;\r
+    __GLeeGLLoadFunction[88]=__GLeeLink_GL_EXT_blend_logic_op;\r
+    __GLeeGLLoadFunction[89]=__GLeeLink_GL_SGIX_interlace;\r
+    __GLeeGLLoadFunction[90]=__GLeeLink_GL_SGIX_pixel_tiles;\r
+    __GLeeGLLoadFunction[91]=__GLeeLink_GL_SGIS_texture_select;\r
+    __GLeeGLLoadFunction[92]=__GLeeLink_GL_SGIX_sprite;\r
+    __GLeeGLLoadFunction[93]=__GLeeLink_GL_SGIX_texture_multi_buffer;\r
+    __GLeeGLLoadFunction[94]=__GLeeLink_GL_EXT_point_parameters;\r
+    __GLeeGLLoadFunction[95]=__GLeeLink_GL_SGIS_point_parameters;\r
+    __GLeeGLLoadFunction[96]=__GLeeLink_GL_SGIX_instruments;\r
+    __GLeeGLLoadFunction[97]=__GLeeLink_GL_SGIX_texture_scale_bias;\r
+    __GLeeGLLoadFunction[98]=__GLeeLink_GL_SGIX_framezoom;\r
+    __GLeeGLLoadFunction[99]=__GLeeLink_GL_SGIX_tag_sample_buffer;\r
+    __GLeeGLLoadFunction[100]=__GLeeLink_GL_FfdMaskSGIX;\r
+    __GLeeGLLoadFunction[101]=__GLeeLink_GL_SGIX_polynomial_ffd;\r
+    __GLeeGLLoadFunction[102]=__GLeeLink_GL_SGIX_reference_plane;\r
+    __GLeeGLLoadFunction[103]=__GLeeLink_GL_SGIX_flush_raster;\r
+    __GLeeGLLoadFunction[104]=__GLeeLink_GL_SGIX_depth_texture;\r
+    __GLeeGLLoadFunction[105]=__GLeeLink_GL_SGIS_fog_function;\r
+    __GLeeGLLoadFunction[106]=__GLeeLink_GL_SGIX_fog_offset;\r
+    __GLeeGLLoadFunction[107]=__GLeeLink_GL_HP_image_transform;\r
+    __GLeeGLLoadFunction[108]=__GLeeLink_GL_HP_convolution_border_modes;\r
+    __GLeeGLLoadFunction[109]=__GLeeLink_GL_INGR_palette_buffer;\r
+    __GLeeGLLoadFunction[110]=__GLeeLink_GL_SGIX_texture_add_env;\r
+    __GLeeGLLoadFunction[111]=__GLeeLink_GL_EXT_color_subtable;\r
+    __GLeeGLLoadFunction[112]=__GLeeLink_GL_PGI_vertex_hints;\r
+    __GLeeGLLoadFunction[113]=__GLeeLink_GL_PGI_misc_hints;\r
+    __GLeeGLLoadFunction[114]=__GLeeLink_GL_EXT_paletted_texture;\r
+    __GLeeGLLoadFunction[115]=__GLeeLink_GL_EXT_clip_volume_hint;\r
+    __GLeeGLLoadFunction[116]=__GLeeLink_GL_SGIX_list_priority;\r
+    __GLeeGLLoadFunction[117]=__GLeeLink_GL_SGIX_ir_instrument1;\r
+    __GLeeGLLoadFunction[118]=__GLeeLink_GL_SGIX_calligraphic_fragment;\r
+    __GLeeGLLoadFunction[119]=__GLeeLink_GL_SGIX_texture_lod_bias;\r
+    __GLeeGLLoadFunction[120]=__GLeeLink_GL_SGIX_shadow_ambient;\r
+    __GLeeGLLoadFunction[121]=__GLeeLink_GL_EXT_index_texture;\r
+    __GLeeGLLoadFunction[122]=__GLeeLink_GL_EXT_index_material;\r
+    __GLeeGLLoadFunction[123]=__GLeeLink_GL_EXT_index_func;\r
+    __GLeeGLLoadFunction[124]=__GLeeLink_GL_EXT_index_array_formats;\r
+    __GLeeGLLoadFunction[125]=__GLeeLink_GL_EXT_compiled_vertex_array;\r
+    __GLeeGLLoadFunction[126]=__GLeeLink_GL_EXT_cull_vertex;\r
+    __GLeeGLLoadFunction[127]=__GLeeLink_GL_SGIX_ycrcb;\r
+    __GLeeGLLoadFunction[128]=__GLeeLink_GL_SGIX_fragment_lighting;\r
+    __GLeeGLLoadFunction[129]=__GLeeLink_GL_IBM_rasterpos_clip;\r
+    __GLeeGLLoadFunction[130]=__GLeeLink_GL_HP_texture_lighting;\r
+    __GLeeGLLoadFunction[131]=__GLeeLink_GL_EXT_draw_range_elements;\r
+    __GLeeGLLoadFunction[132]=__GLeeLink_GL_WIN_phong_shading;\r
+    __GLeeGLLoadFunction[133]=__GLeeLink_GL_WIN_specular_fog;\r
+    __GLeeGLLoadFunction[134]=__GLeeLink_GL_EXT_light_texture;\r
+    __GLeeGLLoadFunction[135]=__GLeeLink_GL_SGIX_blend_alpha_minmax;\r
+    __GLeeGLLoadFunction[136]=__GLeeLink_GL_SGIX_impact_pixel_texture;\r
+    __GLeeGLLoadFunction[137]=__GLeeLink_GL_EXT_bgra;\r
+    __GLeeGLLoadFunction[138]=__GLeeLink_GL_SGIX_async;\r
+    __GLeeGLLoadFunction[139]=__GLeeLink_GL_SGIX_async_pixel;\r
+    __GLeeGLLoadFunction[140]=__GLeeLink_GL_SGIX_async_histogram;\r
+    __GLeeGLLoadFunction[141]=__GLeeLink_GL_INTEL_texture_scissor;\r
+    __GLeeGLLoadFunction[142]=__GLeeLink_GL_INTEL_parallel_arrays;\r
+    __GLeeGLLoadFunction[143]=__GLeeLink_GL_HP_occlusion_test;\r
+    __GLeeGLLoadFunction[144]=__GLeeLink_GL_EXT_pixel_transform;\r
+    __GLeeGLLoadFunction[145]=__GLeeLink_GL_EXT_pixel_transform_color_table;\r
+    __GLeeGLLoadFunction[146]=__GLeeLink_GL_EXT_shared_texture_palette;\r
+    __GLeeGLLoadFunction[147]=__GLeeLink_GL_EXT_separate_specular_color;\r
+    __GLeeGLLoadFunction[148]=__GLeeLink_GL_EXT_secondary_color;\r
+    __GLeeGLLoadFunction[149]=__GLeeLink_GL_EXT_texture_perturb_normal;\r
+    __GLeeGLLoadFunction[150]=__GLeeLink_GL_EXT_multi_draw_arrays;\r
+    __GLeeGLLoadFunction[151]=__GLeeLink_GL_EXT_fog_coord;\r
+    __GLeeGLLoadFunction[152]=__GLeeLink_GL_REND_screen_coordinates;\r
+    __GLeeGLLoadFunction[153]=__GLeeLink_GL_EXT_coordinate_frame;\r
+    __GLeeGLLoadFunction[154]=__GLeeLink_GL_EXT_texture_env_combine;\r
+    __GLeeGLLoadFunction[155]=__GLeeLink_GL_APPLE_specular_vector;\r
+    __GLeeGLLoadFunction[156]=__GLeeLink_GL_APPLE_transform_hint;\r
+    __GLeeGLLoadFunction[157]=__GLeeLink_GL_SGIX_fog_scale;\r
+    __GLeeGLLoadFunction[158]=__GLeeLink_GL_SUNX_constant_data;\r
+    __GLeeGLLoadFunction[159]=__GLeeLink_GL_SUN_global_alpha;\r
+    __GLeeGLLoadFunction[160]=__GLeeLink_GL_SUN_triangle_list;\r
+    __GLeeGLLoadFunction[161]=__GLeeLink_GL_SUN_vertex;\r
+    __GLeeGLLoadFunction[162]=__GLeeLink_GL_EXT_blend_func_separate;\r
+    __GLeeGLLoadFunction[163]=__GLeeLink_GL_INGR_color_clamp;\r
+    __GLeeGLLoadFunction[164]=__GLeeLink_GL_INGR_interlace_read;\r
+    __GLeeGLLoadFunction[165]=__GLeeLink_GL_EXT_stencil_wrap;\r
+    __GLeeGLLoadFunction[166]=__GLeeLink_GL_EXT_422_pixels;\r
+    __GLeeGLLoadFunction[167]=__GLeeLink_GL_NV_texgen_reflection;\r
+    __GLeeGLLoadFunction[168]=__GLeeLink_GL_EXT_texture_cube_map;\r
+    __GLeeGLLoadFunction[169]=__GLeeLink_GL_SUN_convolution_border_modes;\r
+    __GLeeGLLoadFunction[170]=__GLeeLink_GL_EXT_texture_env_add;\r
+    __GLeeGLLoadFunction[171]=__GLeeLink_GL_EXT_texture_lod_bias;\r
+    __GLeeGLLoadFunction[172]=__GLeeLink_GL_EXT_texture_filter_anisotropic;\r
+    __GLeeGLLoadFunction[173]=__GLeeLink_GL_EXT_vertex_weighting;\r
+    __GLeeGLLoadFunction[174]=__GLeeLink_GL_NV_light_max_exponent;\r
+    __GLeeGLLoadFunction[175]=__GLeeLink_GL_NV_vertex_array_range;\r
+    __GLeeGLLoadFunction[176]=__GLeeLink_GL_NV_register_combiners;\r
+    __GLeeGLLoadFunction[177]=__GLeeLink_GL_NV_fog_distance;\r
+    __GLeeGLLoadFunction[178]=__GLeeLink_GL_NV_texgen_emboss;\r
+    __GLeeGLLoadFunction[179]=__GLeeLink_GL_NV_blend_square;\r
+    __GLeeGLLoadFunction[180]=__GLeeLink_GL_NV_texture_env_combine4;\r
+    __GLeeGLLoadFunction[181]=__GLeeLink_GL_MESA_resize_buffers;\r
+    __GLeeGLLoadFunction[182]=__GLeeLink_GL_MESA_window_pos;\r
+    __GLeeGLLoadFunction[183]=__GLeeLink_GL_EXT_texture_compression_s3tc;\r
+    __GLeeGLLoadFunction[184]=__GLeeLink_GL_IBM_cull_vertex;\r
+    __GLeeGLLoadFunction[185]=__GLeeLink_GL_IBM_multimode_draw_arrays;\r
+    __GLeeGLLoadFunction[186]=__GLeeLink_GL_IBM_vertex_array_lists;\r
+    __GLeeGLLoadFunction[187]=__GLeeLink_GL_SGIX_subsample;\r
+    __GLeeGLLoadFunction[188]=__GLeeLink_GL_SGIX_ycrcb_subsample;\r
+    __GLeeGLLoadFunction[189]=__GLeeLink_GL_SGIX_ycrcba;\r
+    __GLeeGLLoadFunction[190]=__GLeeLink_GL_SGI_depth_pass_instrument;\r
+    __GLeeGLLoadFunction[191]=__GLeeLink_GL_3DFX_texture_compression_FXT1;\r
+    __GLeeGLLoadFunction[192]=__GLeeLink_GL_3DFX_multisample;\r
+    __GLeeGLLoadFunction[193]=__GLeeLink_GL_3DFX_tbuffer;\r
+    __GLeeGLLoadFunction[194]=__GLeeLink_GL_EXT_multisample;\r
+    __GLeeGLLoadFunction[195]=__GLeeLink_GL_SGIX_vertex_preclip;\r
+    __GLeeGLLoadFunction[196]=__GLeeLink_GL_SGIX_convolution_accuracy;\r
+    __GLeeGLLoadFunction[197]=__GLeeLink_GL_SGIX_resample;\r
+    __GLeeGLLoadFunction[198]=__GLeeLink_GL_SGIS_point_line_texgen;\r
+    __GLeeGLLoadFunction[199]=__GLeeLink_GL_SGIS_texture_color_mask;\r
+    __GLeeGLLoadFunction[200]=__GLeeLink_GL_EXT_texture_env_dot3;\r
+    __GLeeGLLoadFunction[201]=__GLeeLink_GL_ATI_texture_mirror_once;\r
+    __GLeeGLLoadFunction[202]=__GLeeLink_GL_NV_fence;\r
+    __GLeeGLLoadFunction[203]=__GLeeLink_GL_IBM_texture_mirrored_repeat;\r
+    __GLeeGLLoadFunction[204]=__GLeeLink_GL_NV_evaluators;\r
+    __GLeeGLLoadFunction[205]=__GLeeLink_GL_NV_packed_depth_stencil;\r
+    __GLeeGLLoadFunction[206]=__GLeeLink_GL_NV_register_combiners2;\r
+    __GLeeGLLoadFunction[207]=__GLeeLink_GL_NV_texture_compression_vtc;\r
+    __GLeeGLLoadFunction[208]=__GLeeLink_GL_NV_texture_rectangle;\r
+    __GLeeGLLoadFunction[209]=__GLeeLink_GL_NV_texture_shader;\r
+    __GLeeGLLoadFunction[210]=__GLeeLink_GL_NV_texture_shader2;\r
+    __GLeeGLLoadFunction[211]=__GLeeLink_GL_NV_vertex_array_range2;\r
+    __GLeeGLLoadFunction[212]=__GLeeLink_GL_NV_vertex_program;\r
+    __GLeeGLLoadFunction[213]=__GLeeLink_GL_SGIX_texture_coordinate_clamp;\r
+    __GLeeGLLoadFunction[214]=__GLeeLink_GL_SGIX_scalebias_hint;\r
+    __GLeeGLLoadFunction[215]=__GLeeLink_GL_OML_interlace;\r
+    __GLeeGLLoadFunction[216]=__GLeeLink_GL_OML_subsample;\r
+    __GLeeGLLoadFunction[217]=__GLeeLink_GL_OML_resample;\r
+    __GLeeGLLoadFunction[218]=__GLeeLink_GL_NV_copy_depth_to_color;\r
+    __GLeeGLLoadFunction[219]=__GLeeLink_GL_ATI_envmap_bumpmap;\r
+    __GLeeGLLoadFunction[220]=__GLeeLink_GL_ATI_fragment_shader;\r
+    __GLeeGLLoadFunction[221]=__GLeeLink_GL_ATI_pn_triangles;\r
+    __GLeeGLLoadFunction[222]=__GLeeLink_GL_ATI_vertex_array_object;\r
+    __GLeeGLLoadFunction[223]=__GLeeLink_GL_EXT_vertex_shader;\r
+    __GLeeGLLoadFunction[224]=__GLeeLink_GL_ATI_vertex_streams;\r
+    __GLeeGLLoadFunction[225]=__GLeeLink_GL_ATI_element_array;\r
+    __GLeeGLLoadFunction[226]=__GLeeLink_GL_SUN_mesh_array;\r
+    __GLeeGLLoadFunction[227]=__GLeeLink_GL_SUN_slice_accum;\r
+    __GLeeGLLoadFunction[228]=__GLeeLink_GL_NV_multisample_filter_hint;\r
+    __GLeeGLLoadFunction[229]=__GLeeLink_GL_NV_depth_clamp;\r
+    __GLeeGLLoadFunction[230]=__GLeeLink_GL_NV_occlusion_query;\r
+    __GLeeGLLoadFunction[231]=__GLeeLink_GL_NV_point_sprite;\r
+    __GLeeGLLoadFunction[232]=__GLeeLink_GL_NV_texture_shader3;\r
+    __GLeeGLLoadFunction[233]=__GLeeLink_GL_NV_vertex_program1_1;\r
+    __GLeeGLLoadFunction[234]=__GLeeLink_GL_EXT_shadow_funcs;\r
+    __GLeeGLLoadFunction[235]=__GLeeLink_GL_EXT_stencil_two_side;\r
+    __GLeeGLLoadFunction[236]=__GLeeLink_GL_ATI_text_fragment_shader;\r
+    __GLeeGLLoadFunction[237]=__GLeeLink_GL_APPLE_client_storage;\r
+    __GLeeGLLoadFunction[238]=__GLeeLink_GL_APPLE_element_array;\r
+    __GLeeGLLoadFunction[239]=__GLeeLink_GL_APPLE_fence;\r
+    __GLeeGLLoadFunction[240]=__GLeeLink_GL_APPLE_vertex_array_object;\r
+    __GLeeGLLoadFunction[241]=__GLeeLink_GL_APPLE_vertex_array_range;\r
+    __GLeeGLLoadFunction[242]=__GLeeLink_GL_APPLE_ycbcr_422;\r
+    __GLeeGLLoadFunction[243]=__GLeeLink_GL_S3_s3tc;\r
+    __GLeeGLLoadFunction[244]=__GLeeLink_GL_ATI_draw_buffers;\r
+    __GLeeGLLoadFunction[245]=__GLeeLink_GL_ATI_pixel_format_float;\r
+    __GLeeGLLoadFunction[246]=__GLeeLink_GL_ATI_texture_env_combine3;\r
+    __GLeeGLLoadFunction[247]=__GLeeLink_GL_ATI_texture_float;\r
+    __GLeeGLLoadFunction[248]=__GLeeLink_GL_NV_float_buffer;\r
+    __GLeeGLLoadFunction[249]=__GLeeLink_GL_NV_fragment_program;\r
+    __GLeeGLLoadFunction[250]=__GLeeLink_GL_NV_half_float;\r
+    __GLeeGLLoadFunction[251]=__GLeeLink_GL_NV_pixel_data_range;\r
+    __GLeeGLLoadFunction[252]=__GLeeLink_GL_NV_primitive_restart;\r
+    __GLeeGLLoadFunction[253]=__GLeeLink_GL_NV_texture_expand_normal;\r
+    __GLeeGLLoadFunction[254]=__GLeeLink_GL_NV_vertex_program2;\r
+    __GLeeGLLoadFunction[255]=__GLeeLink_GL_ATI_map_object_buffer;\r
+    __GLeeGLLoadFunction[256]=__GLeeLink_GL_ATI_separate_stencil;\r
+    __GLeeGLLoadFunction[257]=__GLeeLink_GL_ATI_vertex_attrib_array_object;\r
+    __GLeeGLLoadFunction[258]=__GLeeLink_GL_OES_read_format;\r
+    __GLeeGLLoadFunction[259]=__GLeeLink_GL_EXT_depth_bounds_test;\r
+    __GLeeGLLoadFunction[260]=__GLeeLink_GL_EXT_texture_mirror_clamp;\r
+    __GLeeGLLoadFunction[261]=__GLeeLink_GL_EXT_blend_equation_separate;\r
+    __GLeeGLLoadFunction[262]=__GLeeLink_GL_MESA_pack_invert;\r
+    __GLeeGLLoadFunction[263]=__GLeeLink_GL_MESA_ycbcr_texture;\r
+    __GLeeGLLoadFunction[264]=__GLeeLink_GL_EXT_pixel_buffer_object;\r
+    __GLeeGLLoadFunction[265]=__GLeeLink_GL_NV_fragment_program_option;\r
+    __GLeeGLLoadFunction[266]=__GLeeLink_GL_NV_fragment_program2;\r
+    __GLeeGLLoadFunction[267]=__GLeeLink_GL_NV_vertex_program2_option;\r
+    __GLeeGLLoadFunction[268]=__GLeeLink_GL_NV_vertex_program3;\r
+    __GLeeGLLoadFunction[269]=__GLeeLink_GL_EXT_framebuffer_object;\r
+    __GLeeGLLoadFunction[270]=__GLeeLink_GL_GREMEDY_string_marker;\r
+    __GLeeGLLoadFunction[271]=__GLeeLink_GL_EXT_packed_depth_stencil;\r
+    __GLeeGLLoadFunction[272]=__GLeeLink_GL_EXT_stencil_clear_tag;\r
+    __GLeeGLLoadFunction[273]=__GLeeLink_GL_EXT_texture_sRGB;\r
+    __GLeeGLLoadFunction[274]=__GLeeLink_GL_EXT_framebuffer_blit;\r
+    __GLeeGLLoadFunction[275]=__GLeeLink_GL_EXT_framebuffer_multisample;\r
+    __GLeeGLLoadFunction[276]=__GLeeLink_GL_MESAX_texture_stack;\r
+    __GLeeGLLoadFunction[277]=__GLeeLink_GL_EXT_timer_query;\r
+    __GLeeGLLoadFunction[278]=__GLeeLink_GL_EXT_gpu_program_parameters;\r
+    __GLeeGLLoadFunction[279]=__GLeeLink_GL_APPLE_flush_buffer_range;\r
+    __GLeeGLLoadFunction[280]=__GLeeLink_GL_EXT_gpu_shader4;\r
+    __GLeeGLLoadFunction[281]=__GLeeLink_GL_EXT_draw_instanced;\r
+    __GLeeGLLoadFunction[282]=__GLeeLink_GL_EXT_packed_float;\r
+    __GLeeGLLoadFunction[283]=__GLeeLink_GL_EXT_texture_array;\r
+    __GLeeGLLoadFunction[284]=__GLeeLink_GL_EXT_texture_buffer_object;\r
+    __GLeeGLLoadFunction[285]=__GLeeLink_GL_EXT_texture_compression_latc;\r
+    __GLeeGLLoadFunction[286]=__GLeeLink_GL_EXT_texture_compression_rgtc;\r
+    __GLeeGLLoadFunction[287]=__GLeeLink_GL_EXT_texture_shared_exponent;\r
+    __GLeeGLLoadFunction[288]=__GLeeLink_GL_NV_depth_buffer_float;\r
+    __GLeeGLLoadFunction[289]=__GLeeLink_GL_NV_framebuffer_multisample_coverage;\r
+    __GLeeGLLoadFunction[290]=__GLeeLink_GL_EXT_framebuffer_sRGB;\r
+    __GLeeGLLoadFunction[291]=__GLeeLink_GL_NV_geometry_shader4;\r
+    __GLeeGLLoadFunction[292]=__GLeeLink_GL_NV_parameter_buffer_object;\r
+    __GLeeGLLoadFunction[293]=__GLeeLink_GL_EXT_draw_buffers2;\r
+    __GLeeGLLoadFunction[294]=__GLeeLink_GL_NV_transform_feedback;\r
+    __GLeeGLLoadFunction[295]=__GLeeLink_GL_EXT_bindable_uniform;\r
+    __GLeeGLLoadFunction[296]=__GLeeLink_GL_EXT_texture_integer;\r
+    __GLeeGLLoadFunction[297]=__GLeeLink_GL_GREMEDY_frame_terminator;\r
+    __GLeeGLLoadFunction[298]=__GLeeLink_GL_NV_conditional_render;\r
+    __GLeeGLLoadFunction[299]=__GLeeLink_GL_NV_present_video;\r
+    __GLeeGLLoadFunction[300]=__GLeeLink_GL_EXT_transform_feedback;\r
+    __GLeeGLLoadFunction[301]=__GLeeLink_GL_EXT_direct_state_access;\r
+    __GLeeGLLoadFunction[302]=__GLeeLink_GL_EXT_vertex_array_bgra;\r
+    __GLeeGLLoadFunction[303]=__GLeeLink_GL_EXT_texture_swizzle;\r
+    __GLeeGLLoadFunction[304]=__GLeeLink_GL_NV_explicit_multisample;\r
+    __GLeeGLLoadFunction[305]=__GLeeLink_GL_NV_transform_feedback2;\r
+    __GLeeGLLoadFunction[306]=__GLeeLink_GL_SGIX_texture_select;\r
+    __GLeeGLLoadFunction[307]=__GLeeLink_GL_INGR_blend_func_separate;\r
+    __GLeeGLLoadFunction[308]=__GLeeLink_GL_SGIX_depth_pass_instrument;\r
+    __GLeeGLLoadFunction[309]=__GLeeLink_GL_SGIX_igloo_interface;\r
+    __GLeeGLLoadFunction[310]=__GLeeLink_GL_EXT_fragment_lighting;\r
+    __GLeeGLLoadFunction[311]=__GLeeLink_GL_EXT_geometry_shader4;\r
+    __GLeeGLLoadFunction[312]=__GLeeLink_GL_EXT_scene_marker;\r
+    __GLeeGLLoadFunction[313]=__GLeeLink_GL_EXT_texture_compression_dxt1;\r
+    __GLeeGLLoadFunction[314]=__GLeeLink_GL_EXT_texture_env;\r
+    __GLeeGLLoadFunction[315]=__GLeeLink_GL_IBM_static_data;\r
+    __GLeeGLLoadFunction[316]=__GLeeLink_GL_NV_gpu_program4;\r
+    __GLeeGLLoadFunction[317]=__GLeeLink_GL_OES_byte_coordinates;\r
+    __GLeeGLLoadFunction[318]=__GLeeLink_GL_OES_compressed_paletted_texture;\r
+    __GLeeGLLoadFunction[319]=__GLeeLink_GL_OES_single_precision;\r
+    __GLeeGLLoadFunction[320]=__GLeeLink_GL_SGIX_pixel_texture_bits;\r
+    __GLeeGLLoadFunction[321]=__GLeeLink_GL_SGIX_texture_range;\r
+}\r
+\r
+#ifdef WIN32\r
+GLuint __GLeeLink_WGL_ARB_buffer_region(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_WGL_ARB_buffer_region\r
+    if ((GLeeFuncPtr_wglCreateBufferRegionARB = (GLEEPFNWGLCREATEBUFFERREGIONARBPROC) __GLeeGetProcAddress("wglCreateBufferRegionARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglDeleteBufferRegionARB = (GLEEPFNWGLDELETEBUFFERREGIONARBPROC) __GLeeGetProcAddress("wglDeleteBufferRegionARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglSaveBufferRegionARB = (GLEEPFNWGLSAVEBUFFERREGIONARBPROC) __GLeeGetProcAddress("wglSaveBufferRegionARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglRestoreBufferRegionARB = (GLEEPFNWGLRESTOREBUFFERREGIONARBPROC) __GLeeGetProcAddress("wglRestoreBufferRegionARB"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==4) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_WGL_ARB_multisample(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_WGL_ARB_extensions_string(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_WGL_ARB_extensions_string\r
+    if ((GLeeFuncPtr_wglGetExtensionsStringARB = (GLEEPFNWGLGETEXTENSIONSSTRINGARBPROC) __GLeeGetProcAddress("wglGetExtensionsStringARB"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==1) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_WGL_ARB_pixel_format(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_WGL_ARB_pixel_format\r
+    if ((GLeeFuncPtr_wglGetPixelFormatAttribivARB = (GLEEPFNWGLGETPIXELFORMATATTRIBIVARBPROC) __GLeeGetProcAddress("wglGetPixelFormatAttribivARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglGetPixelFormatAttribfvARB = (GLEEPFNWGLGETPIXELFORMATATTRIBFVARBPROC) __GLeeGetProcAddress("wglGetPixelFormatAttribfvARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglChoosePixelFormatARB = (GLEEPFNWGLCHOOSEPIXELFORMATARBPROC) __GLeeGetProcAddress("wglChoosePixelFormatARB"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==3) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_WGL_ARB_make_current_read(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_WGL_ARB_make_current_read\r
+    if ((GLeeFuncPtr_wglMakeContextCurrentARB = (GLEEPFNWGLMAKECONTEXTCURRENTARBPROC) __GLeeGetProcAddress("wglMakeContextCurrentARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglGetCurrentReadDCARB = (GLEEPFNWGLGETCURRENTREADDCARBPROC) __GLeeGetProcAddress("wglGetCurrentReadDCARB"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==2) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_WGL_ARB_pbuffer(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_WGL_ARB_pbuffer\r
+    if ((GLeeFuncPtr_wglCreatePbufferARB = (GLEEPFNWGLCREATEPBUFFERARBPROC) __GLeeGetProcAddress("wglCreatePbufferARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglGetPbufferDCARB = (GLEEPFNWGLGETPBUFFERDCARBPROC) __GLeeGetProcAddress("wglGetPbufferDCARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglReleasePbufferDCARB = (GLEEPFNWGLRELEASEPBUFFERDCARBPROC) __GLeeGetProcAddress("wglReleasePbufferDCARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglDestroyPbufferARB = (GLEEPFNWGLDESTROYPBUFFERARBPROC) __GLeeGetProcAddress("wglDestroyPbufferARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglQueryPbufferARB = (GLEEPFNWGLQUERYPBUFFERARBPROC) __GLeeGetProcAddress("wglQueryPbufferARB"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==5) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_WGL_ARB_render_texture(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_WGL_ARB_render_texture\r
+    if ((GLeeFuncPtr_wglBindTexImageARB = (GLEEPFNWGLBINDTEXIMAGEARBPROC) __GLeeGetProcAddress("wglBindTexImageARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglReleaseTexImageARB = (GLEEPFNWGLRELEASETEXIMAGEARBPROC) __GLeeGetProcAddress("wglReleaseTexImageARB"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglSetPbufferAttribARB = (GLEEPFNWGLSETPBUFFERATTRIBARBPROC) __GLeeGetProcAddress("wglSetPbufferAttribARB"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==3) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_WGL_ARB_pixel_format_float(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_WGL_ARB_create_context(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_WGL_ARB_create_context\r
+    if ((GLeeFuncPtr_wglCreateContextAttribsARB = (GLEEPFNWGLCREATECONTEXTATTRIBSARBPROC) __GLeeGetProcAddress("wglCreateContextAttribsARB"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==1) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_WGL_EXT_make_current_read(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_WGL_EXT_make_current_read\r
+    if ((GLeeFuncPtr_wglMakeContextCurrentEXT = (GLEEPFNWGLMAKECONTEXTCURRENTEXTPROC) __GLeeGetProcAddress("wglMakeContextCurrentEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglGetCurrentReadDCEXT = (GLEEPFNWGLGETCURRENTREADDCEXTPROC) __GLeeGetProcAddress("wglGetCurrentReadDCEXT"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==2) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_WGL_EXT_pixel_format(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_WGL_EXT_pixel_format\r
+    if ((GLeeFuncPtr_wglGetPixelFormatAttribivEXT = (GLEEPFNWGLGETPIXELFORMATATTRIBIVEXTPROC) __GLeeGetProcAddress("wglGetPixelFormatAttribivEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglGetPixelFormatAttribfvEXT = (GLEEPFNWGLGETPIXELFORMATATTRIBFVEXTPROC) __GLeeGetProcAddress("wglGetPixelFormatAttribfvEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglChoosePixelFormatEXT = (GLEEPFNWGLCHOOSEPIXELFORMATEXTPROC) __GLeeGetProcAddress("wglChoosePixelFormatEXT"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==3) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_WGL_EXT_pbuffer(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_WGL_EXT_pbuffer\r
+    if ((GLeeFuncPtr_wglCreatePbufferEXT = (GLEEPFNWGLCREATEPBUFFEREXTPROC) __GLeeGetProcAddress("wglCreatePbufferEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglGetPbufferDCEXT = (GLEEPFNWGLGETPBUFFERDCEXTPROC) __GLeeGetProcAddress("wglGetPbufferDCEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglReleasePbufferDCEXT = (GLEEPFNWGLRELEASEPBUFFERDCEXTPROC) __GLeeGetProcAddress("wglReleasePbufferDCEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglDestroyPbufferEXT = (GLEEPFNWGLDESTROYPBUFFEREXTPROC) __GLeeGetProcAddress("wglDestroyPbufferEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglQueryPbufferEXT = (GLEEPFNWGLQUERYPBUFFEREXTPROC) __GLeeGetProcAddress("wglQueryPbufferEXT"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==5) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_WGL_EXT_depth_float(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_WGL_3DFX_multisample(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_WGL_EXT_multisample(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_WGL_I3D_digital_video_control(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_WGL_I3D_digital_video_control\r
+    if ((GLeeFuncPtr_wglGetDigitalVideoParametersI3D = (GLEEPFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC) __GLeeGetProcAddress("wglGetDigitalVideoParametersI3D"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglSetDigitalVideoParametersI3D = (GLEEPFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC) __GLeeGetProcAddress("wglSetDigitalVideoParametersI3D"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==2) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_WGL_I3D_gamma(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_WGL_I3D_gamma\r
+    if ((GLeeFuncPtr_wglGetGammaTableParametersI3D = (GLEEPFNWGLGETGAMMATABLEPARAMETERSI3DPROC) __GLeeGetProcAddress("wglGetGammaTableParametersI3D"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglSetGammaTableParametersI3D = (GLEEPFNWGLSETGAMMATABLEPARAMETERSI3DPROC) __GLeeGetProcAddress("wglSetGammaTableParametersI3D"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglGetGammaTableI3D = (GLEEPFNWGLGETGAMMATABLEI3DPROC) __GLeeGetProcAddress("wglGetGammaTableI3D"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglSetGammaTableI3D = (GLEEPFNWGLSETGAMMATABLEI3DPROC) __GLeeGetProcAddress("wglSetGammaTableI3D"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==4) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_WGL_I3D_genlock(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_WGL_I3D_genlock\r
+    if ((GLeeFuncPtr_wglEnableGenlockI3D = (GLEEPFNWGLENABLEGENLOCKI3DPROC) __GLeeGetProcAddress("wglEnableGenlockI3D"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglDisableGenlockI3D = (GLEEPFNWGLDISABLEGENLOCKI3DPROC) __GLeeGetProcAddress("wglDisableGenlockI3D"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglIsEnabledGenlockI3D = (GLEEPFNWGLISENABLEDGENLOCKI3DPROC) __GLeeGetProcAddress("wglIsEnabledGenlockI3D"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglGenlockSourceI3D = (GLEEPFNWGLGENLOCKSOURCEI3DPROC) __GLeeGetProcAddress("wglGenlockSourceI3D"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglGetGenlockSourceI3D = (GLEEPFNWGLGETGENLOCKSOURCEI3DPROC) __GLeeGetProcAddress("wglGetGenlockSourceI3D"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglGenlockSourceEdgeI3D = (GLEEPFNWGLGENLOCKSOURCEEDGEI3DPROC) __GLeeGetProcAddress("wglGenlockSourceEdgeI3D"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglGetGenlockSourceEdgeI3D = (GLEEPFNWGLGETGENLOCKSOURCEEDGEI3DPROC) __GLeeGetProcAddress("wglGetGenlockSourceEdgeI3D"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglGenlockSampleRateI3D = (GLEEPFNWGLGENLOCKSAMPLERATEI3DPROC) __GLeeGetProcAddress("wglGenlockSampleRateI3D"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglGetGenlockSampleRateI3D = (GLEEPFNWGLGETGENLOCKSAMPLERATEI3DPROC) __GLeeGetProcAddress("wglGetGenlockSampleRateI3D"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglGenlockSourceDelayI3D = (GLEEPFNWGLGENLOCKSOURCEDELAYI3DPROC) __GLeeGetProcAddress("wglGenlockSourceDelayI3D"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglGetGenlockSourceDelayI3D = (GLEEPFNWGLGETGENLOCKSOURCEDELAYI3DPROC) __GLeeGetProcAddress("wglGetGenlockSourceDelayI3D"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglQueryGenlockMaxSourceDelayI3D = (GLEEPFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC) __GLeeGetProcAddress("wglQueryGenlockMaxSourceDelayI3D"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==12) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_WGL_I3D_image_buffer(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_WGL_I3D_image_buffer\r
+    if ((GLeeFuncPtr_wglCreateImageBufferI3D = (GLEEPFNWGLCREATEIMAGEBUFFERI3DPROC) __GLeeGetProcAddress("wglCreateImageBufferI3D"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglDestroyImageBufferI3D = (GLEEPFNWGLDESTROYIMAGEBUFFERI3DPROC) __GLeeGetProcAddress("wglDestroyImageBufferI3D"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglAssociateImageBufferEventsI3D = (GLEEPFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC) __GLeeGetProcAddress("wglAssociateImageBufferEventsI3D"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglReleaseImageBufferEventsI3D = (GLEEPFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC) __GLeeGetProcAddress("wglReleaseImageBufferEventsI3D"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==4) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_WGL_I3D_swap_frame_lock(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_WGL_I3D_swap_frame_lock\r
+    if ((GLeeFuncPtr_wglEnableFrameLockI3D = (GLEEPFNWGLENABLEFRAMELOCKI3DPROC) __GLeeGetProcAddress("wglEnableFrameLockI3D"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglDisableFrameLockI3D = (GLEEPFNWGLDISABLEFRAMELOCKI3DPROC) __GLeeGetProcAddress("wglDisableFrameLockI3D"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglIsEnabledFrameLockI3D = (GLEEPFNWGLISENABLEDFRAMELOCKI3DPROC) __GLeeGetProcAddress("wglIsEnabledFrameLockI3D"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglQueryFrameLockMasterI3D = (GLEEPFNWGLQUERYFRAMELOCKMASTERI3DPROC) __GLeeGetProcAddress("wglQueryFrameLockMasterI3D"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==4) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_WGL_NV_render_depth_texture(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_WGL_NV_render_texture_rectangle(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_WGL_ATI_pixel_format_float(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_WGL_NV_float_buffer(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_WGL_3DL_stereo_control(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_WGL_EXT_pixel_format_packed_float(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_WGL_EXT_framebuffer_sRGB(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_WGL_NV_present_video(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_WGL_NV_present_video\r
+    if ((GLeeFuncPtr_wglEnumerateVideoDevicesNV = (GLEEPFNWGLENUMERATEVIDEODEVICESNVPROC) __GLeeGetProcAddress("wglEnumerateVideoDevicesNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglBindVideoDeviceNV = (GLEEPFNWGLBINDVIDEODEVICENVPROC) __GLeeGetProcAddress("wglBindVideoDeviceNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglQueryCurrentContextNV = (GLEEPFNWGLQUERYCURRENTCONTEXTNVPROC) __GLeeGetProcAddress("wglQueryCurrentContextNV"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==3) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_WGL_NV_swap_group(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_WGL_NV_swap_group\r
+    if ((GLeeFuncPtr_wglJoinSwapGroupNV = (GLEEPFNWGLJOINSWAPGROUPNVPROC) __GLeeGetProcAddress("wglJoinSwapGroupNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglBindSwapBarrierNV = (GLEEPFNWGLBINDSWAPBARRIERNVPROC) __GLeeGetProcAddress("wglBindSwapBarrierNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglQuerySwapGroupNV = (GLEEPFNWGLQUERYSWAPGROUPNVPROC) __GLeeGetProcAddress("wglQuerySwapGroupNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglQueryMaxSwapGroupsNV = (GLEEPFNWGLQUERYMAXSWAPGROUPSNVPROC) __GLeeGetProcAddress("wglQueryMaxSwapGroupsNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglQueryFrameCountNV = (GLEEPFNWGLQUERYFRAMECOUNTNVPROC) __GLeeGetProcAddress("wglQueryFrameCountNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglResetFrameCountNV = (GLEEPFNWGLRESETFRAMECOUNTNVPROC) __GLeeGetProcAddress("wglResetFrameCountNV"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==6) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_WGL_NV_gpu_affinity(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_WGL_NV_gpu_affinity\r
+    if ((GLeeFuncPtr_wglEnumGpusNV = (GLEEPFNWGLENUMGPUSNVPROC) __GLeeGetProcAddress("wglEnumGpusNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglEnumGpuDevicesNV = (GLEEPFNWGLENUMGPUDEVICESNVPROC) __GLeeGetProcAddress("wglEnumGpuDevicesNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglCreateAffinityDCNV = (GLEEPFNWGLCREATEAFFINITYDCNVPROC) __GLeeGetProcAddress("wglCreateAffinityDCNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglEnumGpusFromAffinityDCNV = (GLEEPFNWGLENUMGPUSFROMAFFINITYDCNVPROC) __GLeeGetProcAddress("wglEnumGpusFromAffinityDCNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglDeleteDCNV = (GLEEPFNWGLDELETEDCNVPROC) __GLeeGetProcAddress("wglDeleteDCNV"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==5) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_WGL_EXT_display_color_table(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_WGL_EXT_display_color_table\r
+    if ((GLeeFuncPtr_wglCreateDisplayColorTableEXT = (GLEEPFNWGLCREATEDISPLAYCOLORTABLEEXTPROC) __GLeeGetProcAddress("wglCreateDisplayColorTableEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglLoadDisplayColorTableEXT = (GLEEPFNWGLLOADDISPLAYCOLORTABLEEXTPROC) __GLeeGetProcAddress("wglLoadDisplayColorTableEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglBindDisplayColorTableEXT = (GLEEPFNWGLBINDDISPLAYCOLORTABLEEXTPROC) __GLeeGetProcAddress("wglBindDisplayColorTableEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglDestroyDisplayColorTableEXT = (GLEEPFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC) __GLeeGetProcAddress("wglDestroyDisplayColorTableEXT"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==4) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_WGL_EXT_extensions_string(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_WGL_EXT_extensions_string\r
+    if ((GLeeFuncPtr_wglGetExtensionsStringEXT = (GLEEPFNWGLGETEXTENSIONSSTRINGEXTPROC) __GLeeGetProcAddress("wglGetExtensionsStringEXT"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==1) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_WGL_EXT_swap_control(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_WGL_EXT_swap_control\r
+    if ((GLeeFuncPtr_wglSwapIntervalEXT = (GLEEPFNWGLSWAPINTERVALEXTPROC) __GLeeGetProcAddress("wglSwapIntervalEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglGetSwapIntervalEXT = (GLEEPFNWGLGETSWAPINTERVALEXTPROC) __GLeeGetProcAddress("wglGetSwapIntervalEXT"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==2) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_WGL_NV_vertex_array_range(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_WGL_NV_vertex_array_range\r
+    if ((GLeeFuncPtr_wglAllocateMemoryNV = (GLEEPFNWGLALLOCATEMEMORYNVPROC) __GLeeGetProcAddress("wglAllocateMemoryNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglFreeMemoryNV = (GLEEPFNWGLFREEMEMORYNVPROC) __GLeeGetProcAddress("wglFreeMemoryNV"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==2) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_WGL_OML_sync_control(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_WGL_OML_sync_control\r
+    if ((GLeeFuncPtr_wglGetSyncValuesOML = (GLEEPFNWGLGETSYNCVALUESOMLPROC) __GLeeGetProcAddress("wglGetSyncValuesOML"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglGetMscRateOML = (GLEEPFNWGLGETMSCRATEOMLPROC) __GLeeGetProcAddress("wglGetMscRateOML"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglSwapBuffersMscOML = (GLEEPFNWGLSWAPBUFFERSMSCOMLPROC) __GLeeGetProcAddress("wglSwapBuffersMscOML"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglSwapLayerBuffersMscOML = (GLEEPFNWGLSWAPLAYERBUFFERSMSCOMLPROC) __GLeeGetProcAddress("wglSwapLayerBuffersMscOML"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglWaitForMscOML = (GLEEPFNWGLWAITFORMSCOMLPROC) __GLeeGetProcAddress("wglWaitForMscOML"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglWaitForSbcOML = (GLEEPFNWGLWAITFORSBCOMLPROC) __GLeeGetProcAddress("wglWaitForSbcOML"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==6) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_WGL_I3D_swap_frame_usage(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_WGL_I3D_swap_frame_usage\r
+    if ((GLeeFuncPtr_wglGetFrameUsageI3D = (GLEEPFNWGLGETFRAMEUSAGEI3DPROC) __GLeeGetProcAddress("wglGetFrameUsageI3D"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglBeginFrameTrackingI3D = (GLEEPFNWGLBEGINFRAMETRACKINGI3DPROC) __GLeeGetProcAddress("wglBeginFrameTrackingI3D"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglEndFrameTrackingI3D = (GLEEPFNWGLENDFRAMETRACKINGI3DPROC) __GLeeGetProcAddress("wglEndFrameTrackingI3D"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglQueryFrameTrackingI3D = (GLEEPFNWGLQUERYFRAMETRACKINGI3DPROC) __GLeeGetProcAddress("wglQueryFrameTrackingI3D"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==4) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_WGL_NV_video_output(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_WGL_NV_video_output\r
+    if ((GLeeFuncPtr_wglGetVideoDeviceNV = (GLEEPFNWGLGETVIDEODEVICENVPROC) __GLeeGetProcAddress("wglGetVideoDeviceNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglReleaseVideoDeviceNV = (GLEEPFNWGLRELEASEVIDEODEVICENVPROC) __GLeeGetProcAddress("wglReleaseVideoDeviceNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglBindVideoImageNV = (GLEEPFNWGLBINDVIDEOIMAGENVPROC) __GLeeGetProcAddress("wglBindVideoImageNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglReleaseVideoImageNV = (GLEEPFNWGLRELEASEVIDEOIMAGENVPROC) __GLeeGetProcAddress("wglReleaseVideoImageNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglSendPbufferToVideoNV = (GLEEPFNWGLSENDPBUFFERTOVIDEONVPROC) __GLeeGetProcAddress("wglSendPbufferToVideoNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_wglGetVideoInfoNV = (GLEEPFNWGLGETVIDEOINFONVPROC) __GLeeGetProcAddress("wglGetVideoInfoNV"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==6) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLEE_LINK_FUNCTION __GLeeWGLLoadFunction[37];\r
+\r
+void initWGLLoadFunctions(void)\r
+{\r
+    __GLeeWGLLoadFunction[0]=__GLeeLink_WGL_ARB_buffer_region;\r
+    __GLeeWGLLoadFunction[1]=__GLeeLink_WGL_ARB_multisample;\r
+    __GLeeWGLLoadFunction[2]=__GLeeLink_WGL_ARB_extensions_string;\r
+    __GLeeWGLLoadFunction[3]=__GLeeLink_WGL_ARB_pixel_format;\r
+    __GLeeWGLLoadFunction[4]=__GLeeLink_WGL_ARB_make_current_read;\r
+    __GLeeWGLLoadFunction[5]=__GLeeLink_WGL_ARB_pbuffer;\r
+    __GLeeWGLLoadFunction[6]=__GLeeLink_WGL_ARB_render_texture;\r
+    __GLeeWGLLoadFunction[7]=__GLeeLink_WGL_ARB_pixel_format_float;\r
+    __GLeeWGLLoadFunction[8]=__GLeeLink_WGL_ARB_create_context;\r
+    __GLeeWGLLoadFunction[9]=__GLeeLink_WGL_EXT_make_current_read;\r
+    __GLeeWGLLoadFunction[10]=__GLeeLink_WGL_EXT_pixel_format;\r
+    __GLeeWGLLoadFunction[11]=__GLeeLink_WGL_EXT_pbuffer;\r
+    __GLeeWGLLoadFunction[12]=__GLeeLink_WGL_EXT_depth_float;\r
+    __GLeeWGLLoadFunction[13]=__GLeeLink_WGL_3DFX_multisample;\r
+    __GLeeWGLLoadFunction[14]=__GLeeLink_WGL_EXT_multisample;\r
+    __GLeeWGLLoadFunction[15]=__GLeeLink_WGL_I3D_digital_video_control;\r
+    __GLeeWGLLoadFunction[16]=__GLeeLink_WGL_I3D_gamma;\r
+    __GLeeWGLLoadFunction[17]=__GLeeLink_WGL_I3D_genlock;\r
+    __GLeeWGLLoadFunction[18]=__GLeeLink_WGL_I3D_image_buffer;\r
+    __GLeeWGLLoadFunction[19]=__GLeeLink_WGL_I3D_swap_frame_lock;\r
+    __GLeeWGLLoadFunction[20]=__GLeeLink_WGL_NV_render_depth_texture;\r
+    __GLeeWGLLoadFunction[21]=__GLeeLink_WGL_NV_render_texture_rectangle;\r
+    __GLeeWGLLoadFunction[22]=__GLeeLink_WGL_ATI_pixel_format_float;\r
+    __GLeeWGLLoadFunction[23]=__GLeeLink_WGL_NV_float_buffer;\r
+    __GLeeWGLLoadFunction[24]=__GLeeLink_WGL_3DL_stereo_control;\r
+    __GLeeWGLLoadFunction[25]=__GLeeLink_WGL_EXT_pixel_format_packed_float;\r
+    __GLeeWGLLoadFunction[26]=__GLeeLink_WGL_EXT_framebuffer_sRGB;\r
+    __GLeeWGLLoadFunction[27]=__GLeeLink_WGL_NV_present_video;\r
+    __GLeeWGLLoadFunction[28]=__GLeeLink_WGL_NV_swap_group;\r
+    __GLeeWGLLoadFunction[29]=__GLeeLink_WGL_NV_gpu_affinity;\r
+    __GLeeWGLLoadFunction[30]=__GLeeLink_WGL_EXT_display_color_table;\r
+    __GLeeWGLLoadFunction[31]=__GLeeLink_WGL_EXT_extensions_string;\r
+    __GLeeWGLLoadFunction[32]=__GLeeLink_WGL_EXT_swap_control;\r
+    __GLeeWGLLoadFunction[33]=__GLeeLink_WGL_NV_vertex_array_range;\r
+    __GLeeWGLLoadFunction[34]=__GLeeLink_WGL_OML_sync_control;\r
+    __GLeeWGLLoadFunction[35]=__GLeeLink_WGL_I3D_swap_frame_usage;\r
+    __GLeeWGLLoadFunction[36]=__GLeeLink_WGL_NV_video_output;\r
+}\r
+\r
+#elif defined(__APPLE__) || defined(__APPLE_CC__)\r
+#else /* Linux */\r
+GLuint __GLeeLink_GLX_VERSION_1_3(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GLX_VERSION_1_3\r
+    if ((GLeeFuncPtr_glXGetFBConfigs = (GLEEPFNGLXGETFBCONFIGSPROC) __GLeeGetProcAddress("glXGetFBConfigs"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glXChooseFBConfig = (GLEEPFNGLXCHOOSEFBCONFIGPROC) __GLeeGetProcAddress("glXChooseFBConfig"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glXGetFBConfigAttrib = (GLEEPFNGLXGETFBCONFIGATTRIBPROC) __GLeeGetProcAddress("glXGetFBConfigAttrib"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glXGetVisualFromFBConfig = (GLEEPFNGLXGETVISUALFROMFBCONFIGPROC) __GLeeGetProcAddress("glXGetVisualFromFBConfig"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glXCreateWindow = (GLEEPFNGLXCREATEWINDOWPROC) __GLeeGetProcAddress("glXCreateWindow"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glXDestroyWindow = (GLEEPFNGLXDESTROYWINDOWPROC) __GLeeGetProcAddress("glXDestroyWindow"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glXCreatePixmap = (GLEEPFNGLXCREATEPIXMAPPROC) __GLeeGetProcAddress("glXCreatePixmap"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glXDestroyPixmap = (GLEEPFNGLXDESTROYPIXMAPPROC) __GLeeGetProcAddress("glXDestroyPixmap"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glXCreatePbuffer = (GLEEPFNGLXCREATEPBUFFERPROC) __GLeeGetProcAddress("glXCreatePbuffer"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glXDestroyPbuffer = (GLEEPFNGLXDESTROYPBUFFERPROC) __GLeeGetProcAddress("glXDestroyPbuffer"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glXQueryDrawable = (GLEEPFNGLXQUERYDRAWABLEPROC) __GLeeGetProcAddress("glXQueryDrawable"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glXCreateNewContext = (GLEEPFNGLXCREATENEWCONTEXTPROC) __GLeeGetProcAddress("glXCreateNewContext"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glXMakeContextCurrent = (GLEEPFNGLXMAKECONTEXTCURRENTPROC) __GLeeGetProcAddress("glXMakeContextCurrent"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glXGetCurrentReadDrawable = (GLEEPFNGLXGETCURRENTREADDRAWABLEPROC) __GLeeGetProcAddress("glXGetCurrentReadDrawable"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glXGetCurrentDisplay = (GLEEPFNGLXGETCURRENTDISPLAYPROC) __GLeeGetProcAddress("glXGetCurrentDisplay"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glXQueryContext = (GLEEPFNGLXQUERYCONTEXTPROC) __GLeeGetProcAddress("glXQueryContext"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glXSelectEvent = (GLEEPFNGLXSELECTEVENTPROC) __GLeeGetProcAddress("glXSelectEvent"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glXGetSelectedEvent = (GLEEPFNGLXGETSELECTEDEVENTPROC) __GLeeGetProcAddress("glXGetSelectedEvent"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==18) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GLX_VERSION_1_4(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GLX_VERSION_1_4\r
+    if ((GLeeFuncPtr_glXGetProcAddress = (GLEEPFNGLXGETPROCADDRESSPROC) __GLeeGetProcAddress("glXGetProcAddress"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==1) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GLX_ARB_multisample(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GLX_ARB_fbconfig_float(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GLX_ARB_create_context(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GLX_ARB_create_context\r
+    if ((GLeeFuncPtr_glXCreateContextAttribsARB = (GLEEPFNGLXCREATECONTEXTATTRIBSARBPROC) __GLeeGetProcAddress("glXCreateContextAttribsARB"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==1) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GLX_SGIS_multisample(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GLX_EXT_visual_info(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GLX_SGI_swap_control(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GLX_SGI_swap_control\r
+    if ((GLeeFuncPtr_glXSwapIntervalSGI = (GLEEPFNGLXSWAPINTERVALSGIPROC) __GLeeGetProcAddress("glXSwapIntervalSGI"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==1) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GLX_SGI_video_sync(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GLX_SGI_video_sync\r
+    if ((GLeeFuncPtr_glXGetVideoSyncSGI = (GLEEPFNGLXGETVIDEOSYNCSGIPROC) __GLeeGetProcAddress("glXGetVideoSyncSGI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glXWaitVideoSyncSGI = (GLEEPFNGLXWAITVIDEOSYNCSGIPROC) __GLeeGetProcAddress("glXWaitVideoSyncSGI"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==2) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GLX_SGI_make_current_read(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GLX_SGI_make_current_read\r
+    if ((GLeeFuncPtr_glXMakeCurrentReadSGI = (GLEEPFNGLXMAKECURRENTREADSGIPROC) __GLeeGetProcAddress("glXMakeCurrentReadSGI"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glXGetCurrentReadDrawableSGI = (GLEEPFNGLXGETCURRENTREADDRAWABLESGIPROC) __GLeeGetProcAddress("glXGetCurrentReadDrawableSGI"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==2) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GLX_EXT_visual_rating(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GLX_EXT_import_context(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GLX_EXT_import_context\r
+    if ((GLeeFuncPtr_glXGetCurrentDisplayEXT = (GLEEPFNGLXGETCURRENTDISPLAYEXTPROC) __GLeeGetProcAddress("glXGetCurrentDisplayEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glXQueryContextInfoEXT = (GLEEPFNGLXQUERYCONTEXTINFOEXTPROC) __GLeeGetProcAddress("glXQueryContextInfoEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glXGetContextIDEXT = (GLEEPFNGLXGETCONTEXTIDEXTPROC) __GLeeGetProcAddress("glXGetContextIDEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glXImportContextEXT = (GLEEPFNGLXIMPORTCONTEXTEXTPROC) __GLeeGetProcAddress("glXImportContextEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glXFreeContextEXT = (GLEEPFNGLXFREECONTEXTEXTPROC) __GLeeGetProcAddress("glXFreeContextEXT"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==5) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GLX_SGIX_fbconfig(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GLX_SGIX_fbconfig\r
+    if ((GLeeFuncPtr_glXGetFBConfigAttribSGIX = (GLEEPFNGLXGETFBCONFIGATTRIBSGIXPROC) __GLeeGetProcAddress("glXGetFBConfigAttribSGIX"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glXChooseFBConfigSGIX = (GLEEPFNGLXCHOOSEFBCONFIGSGIXPROC) __GLeeGetProcAddress("glXChooseFBConfigSGIX"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glXCreateGLXPixmapWithConfigSGIX = (GLEEPFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC) __GLeeGetProcAddress("glXCreateGLXPixmapWithConfigSGIX"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glXCreateContextWithConfigSGIX = (GLEEPFNGLXCREATECONTEXTWITHCONFIGSGIXPROC) __GLeeGetProcAddress("glXCreateContextWithConfigSGIX"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glXGetVisualFromFBConfigSGIX = (GLEEPFNGLXGETVISUALFROMFBCONFIGSGIXPROC) __GLeeGetProcAddress("glXGetVisualFromFBConfigSGIX"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glXGetFBConfigFromVisualSGIX = (GLEEPFNGLXGETFBCONFIGFROMVISUALSGIXPROC) __GLeeGetProcAddress("glXGetFBConfigFromVisualSGIX"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==6) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GLX_SGIX_pbuffer(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GLX_SGIX_pbuffer\r
+    if ((GLeeFuncPtr_glXCreateGLXPbufferSGIX = (GLEEPFNGLXCREATEGLXPBUFFERSGIXPROC) __GLeeGetProcAddress("glXCreateGLXPbufferSGIX"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glXDestroyGLXPbufferSGIX = (GLEEPFNGLXDESTROYGLXPBUFFERSGIXPROC) __GLeeGetProcAddress("glXDestroyGLXPbufferSGIX"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glXQueryGLXPbufferSGIX = (GLEEPFNGLXQUERYGLXPBUFFERSGIXPROC) __GLeeGetProcAddress("glXQueryGLXPbufferSGIX"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glXSelectEventSGIX = (GLEEPFNGLXSELECTEVENTSGIXPROC) __GLeeGetProcAddress("glXSelectEventSGIX"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glXGetSelectedEventSGIX = (GLEEPFNGLXGETSELECTEDEVENTSGIXPROC) __GLeeGetProcAddress("glXGetSelectedEventSGIX"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==5) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GLX_SGI_cushion(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GLX_SGI_cushion\r
+    if ((GLeeFuncPtr_glXCushionSGI = (GLEEPFNGLXCUSHIONSGIPROC) __GLeeGetProcAddress("glXCushionSGI"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==1) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GLX_SGIX_video_resize(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GLX_SGIX_video_resize\r
+    if ((GLeeFuncPtr_glXBindChannelToWindowSGIX = (GLEEPFNGLXBINDCHANNELTOWINDOWSGIXPROC) __GLeeGetProcAddress("glXBindChannelToWindowSGIX"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glXChannelRectSGIX = (GLEEPFNGLXCHANNELRECTSGIXPROC) __GLeeGetProcAddress("glXChannelRectSGIX"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glXQueryChannelRectSGIX = (GLEEPFNGLXQUERYCHANNELRECTSGIXPROC) __GLeeGetProcAddress("glXQueryChannelRectSGIX"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glXQueryChannelDeltasSGIX = (GLEEPFNGLXQUERYCHANNELDELTASSGIXPROC) __GLeeGetProcAddress("glXQueryChannelDeltasSGIX"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glXChannelRectSyncSGIX = (GLEEPFNGLXCHANNELRECTSYNCSGIXPROC) __GLeeGetProcAddress("glXChannelRectSyncSGIX"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==5) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GLX_SGIX_swap_group(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GLX_SGIX_swap_group\r
+    if ((GLeeFuncPtr_glXJoinSwapGroupSGIX = (GLEEPFNGLXJOINSWAPGROUPSGIXPROC) __GLeeGetProcAddress("glXJoinSwapGroupSGIX"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==1) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GLX_SGIX_swap_barrier(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GLX_SGIX_swap_barrier\r
+    if ((GLeeFuncPtr_glXBindSwapBarrierSGIX = (GLEEPFNGLXBINDSWAPBARRIERSGIXPROC) __GLeeGetProcAddress("glXBindSwapBarrierSGIX"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glXQueryMaxSwapBarriersSGIX = (GLEEPFNGLXQUERYMAXSWAPBARRIERSSGIXPROC) __GLeeGetProcAddress("glXQueryMaxSwapBarriersSGIX"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==2) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GLX_SGIS_blended_overlay(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GLX_SGIS_shared_multisample(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GLX_SUN_get_transparent_index(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GLX_SUN_get_transparent_index\r
+    if ((GLeeFuncPtr_glXGetTransparentIndexSUN = (GLEEPFNGLXGETTRANSPARENTINDEXSUNPROC) __GLeeGetProcAddress("glXGetTransparentIndexSUN"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==1) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GLX_3DFX_multisample(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GLX_MESA_copy_sub_buffer(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GLX_MESA_copy_sub_buffer\r
+    if ((GLeeFuncPtr_glXCopySubBufferMESA = (GLEEPFNGLXCOPYSUBBUFFERMESAPROC) __GLeeGetProcAddress("glXCopySubBufferMESA"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==1) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GLX_MESA_pixmap_colormap(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GLX_MESA_pixmap_colormap\r
+    if ((GLeeFuncPtr_glXCreateGLXPixmapMESA = (GLEEPFNGLXCREATEGLXPIXMAPMESAPROC) __GLeeGetProcAddress("glXCreateGLXPixmapMESA"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==1) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GLX_MESA_release_buffers(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GLX_MESA_release_buffers\r
+    if ((GLeeFuncPtr_glXReleaseBuffersMESA = (GLEEPFNGLXRELEASEBUFFERSMESAPROC) __GLeeGetProcAddress("glXReleaseBuffersMESA"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==1) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GLX_MESA_set_3dfx_mode(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GLX_MESA_set_3dfx_mode\r
+    if ((GLeeFuncPtr_glXSet3DfxModeMESA = (GLEEPFNGLXSET3DFXMODEMESAPROC) __GLeeGetProcAddress("glXSet3DfxModeMESA"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==1) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GLX_SGIX_visual_select_group(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GLX_OML_swap_method(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GLX_OML_sync_control(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GLX_OML_sync_control\r
+    if ((GLeeFuncPtr_glXGetSyncValuesOML = (GLEEPFNGLXGETSYNCVALUESOMLPROC) __GLeeGetProcAddress("glXGetSyncValuesOML"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glXGetMscRateOML = (GLEEPFNGLXGETMSCRATEOMLPROC) __GLeeGetProcAddress("glXGetMscRateOML"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glXSwapBuffersMscOML = (GLEEPFNGLXSWAPBUFFERSMSCOMLPROC) __GLeeGetProcAddress("glXSwapBuffersMscOML"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glXWaitForMscOML = (GLEEPFNGLXWAITFORMSCOMLPROC) __GLeeGetProcAddress("glXWaitForMscOML"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glXWaitForSbcOML = (GLEEPFNGLXWAITFORSBCOMLPROC) __GLeeGetProcAddress("glXWaitForSbcOML"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==5) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GLX_NV_float_buffer(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GLX_SGIX_hyperpipe(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GLX_SGIX_hyperpipe\r
+    if ((GLeeFuncPtr_glXQueryHyperpipeNetworkSGIX = (GLEEPFNGLXQUERYHYPERPIPENETWORKSGIXPROC) __GLeeGetProcAddress("glXQueryHyperpipeNetworkSGIX"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glXHyperpipeConfigSGIX = (GLEEPFNGLXHYPERPIPECONFIGSGIXPROC) __GLeeGetProcAddress("glXHyperpipeConfigSGIX"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glXQueryHyperpipeConfigSGIX = (GLEEPFNGLXQUERYHYPERPIPECONFIGSGIXPROC) __GLeeGetProcAddress("glXQueryHyperpipeConfigSGIX"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glXDestroyHyperpipeConfigSGIX = (GLEEPFNGLXDESTROYHYPERPIPECONFIGSGIXPROC) __GLeeGetProcAddress("glXDestroyHyperpipeConfigSGIX"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glXBindHyperpipeSGIX = (GLEEPFNGLXBINDHYPERPIPESGIXPROC) __GLeeGetProcAddress("glXBindHyperpipeSGIX"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glXQueryHyperpipeBestAttribSGIX = (GLEEPFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC) __GLeeGetProcAddress("glXQueryHyperpipeBestAttribSGIX"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glXHyperpipeAttribSGIX = (GLEEPFNGLXHYPERPIPEATTRIBSGIXPROC) __GLeeGetProcAddress("glXHyperpipeAttribSGIX"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glXQueryHyperpipeAttribSGIX = (GLEEPFNGLXQUERYHYPERPIPEATTRIBSGIXPROC) __GLeeGetProcAddress("glXQueryHyperpipeAttribSGIX"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==8) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GLX_MESA_agp_offset(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GLX_MESA_agp_offset\r
+    if ((GLeeFuncPtr_glXGetAGPOffsetMESA = (GLEEPFNGLXGETAGPOFFSETMESAPROC) __GLeeGetProcAddress("glXGetAGPOffsetMESA"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==1) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GLX_EXT_fbconfig_packed_float(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GLX_EXT_framebuffer_sRGB(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GLX_EXT_texture_from_pixmap(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GLX_EXT_texture_from_pixmap\r
+    if ((GLeeFuncPtr_glXBindTexImageEXT = (GLEEPFNGLXBINDTEXIMAGEEXTPROC) __GLeeGetProcAddress("glXBindTexImageEXT"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glXReleaseTexImageEXT = (GLEEPFNGLXRELEASETEXIMAGEEXTPROC) __GLeeGetProcAddress("glXReleaseTexImageEXT"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==2) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLuint __GLeeLink_GLX_NV_present_video(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GLX_NV_video_out(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GLX_NV_swap_group(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GLX_EXT_scene_marker(void) {return GLEE_LINK_COMPLETE;}\r
+\r
+GLuint __GLeeLink_GLX_NV_video_output(void)\r
+{\r
+    GLint nLinked=0;\r
+#ifdef __GLEE_GLX_NV_video_output\r
+    if ((GLeeFuncPtr_glXGetVideoDeviceNV = (GLEEPFNGLXGETVIDEODEVICENVPROC) __GLeeGetProcAddress("glXGetVideoDeviceNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glXReleaseVideoDeviceNV = (GLEEPFNGLXRELEASEVIDEODEVICENVPROC) __GLeeGetProcAddress("glXReleaseVideoDeviceNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glXBindVideoImageNV = (GLEEPFNGLXBINDVIDEOIMAGENVPROC) __GLeeGetProcAddress("glXBindVideoImageNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glXReleaseVideoImageNV = (GLEEPFNGLXRELEASEVIDEOIMAGENVPROC) __GLeeGetProcAddress("glXReleaseVideoImageNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glXSendPbufferToVideoNV = (GLEEPFNGLXSENDPBUFFERTOVIDEONVPROC) __GLeeGetProcAddress("glXSendPbufferToVideoNV"))!=0) nLinked++;\r
+    if ((GLeeFuncPtr_glXGetVideoInfoNV = (GLEEPFNGLXGETVIDEOINFONVPROC) __GLeeGetProcAddress("glXGetVideoInfoNV"))!=0) nLinked++;\r
+#endif\r
+    if (nLinked==6) return GLEE_LINK_COMPLETE;\r
+    if (nLinked==0) return GLEE_LINK_FAIL;\r
+    return GLEE_LINK_PARTIAL;\r
+}\r
+\r
+GLEE_LINK_FUNCTION __GLeeGLXLoadFunction[40];\r
+\r
+void initGLXLoadFunctions(void)\r
+{\r
+    __GLeeGLXLoadFunction[0]=__GLeeLink_GLX_VERSION_1_3;\r
+    __GLeeGLXLoadFunction[1]=__GLeeLink_GLX_VERSION_1_4;\r
+    __GLeeGLXLoadFunction[2]=__GLeeLink_GLX_ARB_multisample;\r
+    __GLeeGLXLoadFunction[3]=__GLeeLink_GLX_ARB_fbconfig_float;\r
+    __GLeeGLXLoadFunction[4]=__GLeeLink_GLX_ARB_create_context;\r
+    __GLeeGLXLoadFunction[5]=__GLeeLink_GLX_SGIS_multisample;\r
+    __GLeeGLXLoadFunction[6]=__GLeeLink_GLX_EXT_visual_info;\r
+    __GLeeGLXLoadFunction[7]=__GLeeLink_GLX_SGI_swap_control;\r
+    __GLeeGLXLoadFunction[8]=__GLeeLink_GLX_SGI_video_sync;\r
+    __GLeeGLXLoadFunction[9]=__GLeeLink_GLX_SGI_make_current_read;\r
+    __GLeeGLXLoadFunction[10]=__GLeeLink_GLX_EXT_visual_rating;\r
+    __GLeeGLXLoadFunction[11]=__GLeeLink_GLX_EXT_import_context;\r
+    __GLeeGLXLoadFunction[12]=__GLeeLink_GLX_SGIX_fbconfig;\r
+    __GLeeGLXLoadFunction[13]=__GLeeLink_GLX_SGIX_pbuffer;\r
+    __GLeeGLXLoadFunction[14]=__GLeeLink_GLX_SGI_cushion;\r
+    __GLeeGLXLoadFunction[15]=__GLeeLink_GLX_SGIX_video_resize;\r
+    __GLeeGLXLoadFunction[16]=__GLeeLink_GLX_SGIX_swap_group;\r
+    __GLeeGLXLoadFunction[17]=__GLeeLink_GLX_SGIX_swap_barrier;\r
+    __GLeeGLXLoadFunction[18]=__GLeeLink_GLX_SGIS_blended_overlay;\r
+    __GLeeGLXLoadFunction[19]=__GLeeLink_GLX_SGIS_shared_multisample;\r
+    __GLeeGLXLoadFunction[20]=__GLeeLink_GLX_SUN_get_transparent_index;\r
+    __GLeeGLXLoadFunction[21]=__GLeeLink_GLX_3DFX_multisample;\r
+    __GLeeGLXLoadFunction[22]=__GLeeLink_GLX_MESA_copy_sub_buffer;\r
+    __GLeeGLXLoadFunction[23]=__GLeeLink_GLX_MESA_pixmap_colormap;\r
+    __GLeeGLXLoadFunction[24]=__GLeeLink_GLX_MESA_release_buffers;\r
+    __GLeeGLXLoadFunction[25]=__GLeeLink_GLX_MESA_set_3dfx_mode;\r
+    __GLeeGLXLoadFunction[26]=__GLeeLink_GLX_SGIX_visual_select_group;\r
+    __GLeeGLXLoadFunction[27]=__GLeeLink_GLX_OML_swap_method;\r
+    __GLeeGLXLoadFunction[28]=__GLeeLink_GLX_OML_sync_control;\r
+    __GLeeGLXLoadFunction[29]=__GLeeLink_GLX_NV_float_buffer;\r
+    __GLeeGLXLoadFunction[30]=__GLeeLink_GLX_SGIX_hyperpipe;\r
+    __GLeeGLXLoadFunction[31]=__GLeeLink_GLX_MESA_agp_offset;\r
+    __GLeeGLXLoadFunction[32]=__GLeeLink_GLX_EXT_fbconfig_packed_float;\r
+    __GLeeGLXLoadFunction[33]=__GLeeLink_GLX_EXT_framebuffer_sRGB;\r
+    __GLeeGLXLoadFunction[34]=__GLeeLink_GLX_EXT_texture_from_pixmap;\r
+    __GLeeGLXLoadFunction[35]=__GLeeLink_GLX_NV_present_video;\r
+    __GLeeGLXLoadFunction[36]=__GLeeLink_GLX_NV_video_out;\r
+    __GLeeGLXLoadFunction[37]=__GLeeLink_GLX_NV_swap_group;\r
+    __GLeeGLXLoadFunction[38]=__GLeeLink_GLX_EXT_scene_marker;\r
+    __GLeeGLXLoadFunction[39]=__GLeeLink_GLX_NV_video_output;\r
+}\r
+\r
+#endif /* end Linux */\r
+\r
+\r
+/*****************************************************************\r
+ * GLee internal types\r
+ *****************************************************************/\r
+typedef struct \r
+{\r
+       char ** names;\r
+       int * lengths;\r
+       int numNames;\r
+}ExtensionList;\r
+\r
+\r
+/*****************************************************************\r
+ * GLee internal variables\r
+ *****************************************************************/\r
+char GLeeErrorString[256]="";\r
+\r
+\r
+/*****************************************************************\r
+ * GLee internal functions\r
+ *****************************************************************/\r
+\r
+void __GLeeExtList_init(ExtensionList *extList)\r
+{\r
+       extList->names=0;\r
+       extList->lengths=0;\r
+       extList->numNames=0;\r
+}\r
+\r
+void __GLeeExtList_clean(ExtensionList *extList)\r
+{\r
+       int a;\r
+       for (a=0;a<extList->numNames;a++)\r
+       {\r
+               if (extList->names[a]!=0) free((void *)extList->names[a]);\r
+       }\r
+       if (extList->names!=0) free((void *)extList->names);\r
+       if (extList->lengths!=0) free((void *)extList->lengths);\r
+       extList->names=0;\r
+       extList->lengths=0;\r
+       extList->numNames=0;\r
+}\r
+\r
+void __GLeeExtList_add(ExtensionList *extList, const char * extName)\r
+{\r
+       int length=strlen(extName)+1;\r
+       int i=extList->numNames;\r
+       int n=i+1;\r
+       if (i==0)\r
+       {\r
+               extList->lengths=(int *)malloc(sizeof(int));\r
+               extList->names=(char **)malloc(sizeof(char *));\r
+       }else\r
+       {\r
+               extList->lengths=(int *)realloc((void *)extList->lengths, n*sizeof(int));\r
+               extList->names=(char **)realloc((void *)extList->names, n*sizeof(char *));\r
+       }\r
+       extList->names[i]=(char *)malloc(length*sizeof(char));\r
+       strcpy(extList->names[i],extName);\r
+       extList->lengths[i]=length;\r
+       extList->numNames++;\r
+}\r
+\r
+const char *__GLeeGetExtStrPlat( void )\r
+{\r
+#ifdef WIN32\r
+       if (!_GLEE_WGL_ARB_extensions_string)\r
+               wglGetExtensionsStringARB = (GLEEPFNWGLGETEXTENSIONSSTRINGARBPROC) wglGetProcAddress("wglGetExtensionsStringARB");\r
+\r
+       if (wglGetExtensionsStringARB)\r
+               return (const char *)wglGetExtensionsStringARB(wglGetCurrentDC());\r
+#elif defined(__APPLE__) || defined(__APPLE_CC__)\r
+#else\r
+       Display *dpy=glXGetCurrentDisplay();\r
+       if(dpy)\r
+       {\r
+               int dpynr=DefaultScreen(dpy);\r
+               return (const char*)glXQueryExtensionsString(dpy,dpynr);\r
+       }\r
+#endif\r
+       return 0;\r
+}\r
+\r
+void __GLeeWriteError(const char * errorStr)\r
+{\r
+       int a=0;\r
+       for (a=0;a<256;a++)\r
+       {\r
+               GLeeErrorString[a]=errorStr[a];\r
+       }\r
+       GLeeErrorString[255]='\0';\r
+}\r
+\r
+int __GLeeGetVersionNumber(char *versionStr)\r
+{\r
+       int major=(int)versionStr[0]-(int)'0';\r
+       int minor=(int)versionStr[2]-(int)'0';\r
+       return major<<8 | minor;\r
+}\r
+\r
+GLboolean __GLeeGetExtensions(ExtensionList* extList)\r
+{\r
+       const char * platExtStr;\r
+       const char * glExtStr;\r
+       char * extStr;\r
+       char emptyString[1] = ""; \r
+       char extensionName[1024];\r
+       int a,b;\r
+       int totalExtStrLen;\r
+       int platExtStrLen;\r
+       int addASpace;\r
+       \r
+       /* read the platform specific extension string */\r
+       platExtStr=__GLeeGetExtStrPlat(); \r
+       if (!platExtStr) platExtStr=emptyString;\r
+\r
+       glExtStr=(const char *)glGetString(GL_EXTENSIONS);\r
+       if (glExtStr==0) \r
+       {\r
+               __GLeeWriteError("glGetString(GL_EXTENSIONS) failed.");\r
+               return GL_FALSE;\r
+       }\r
+\r
+       /* allocate the extension string */\r
+       platExtStrLen = strlen(platExtStr);\r
+       totalExtStrLen = platExtStrLen + strlen(glExtStr);\r
+       extStr=(char *)malloc( (totalExtStrLen+2) * sizeof(char) ); /* we add 2 to allow for an extra space and a null terminator */\r
+\r
+       /* If the last character of platExtStr is not a space, we need to add one when we concatenate the extension strings*/\r
+       addASpace = 0;\r
+       if ( platExtStrLen > 2 )\r
+       {\r
+           if ( platExtStr[ platExtStrLen-1 ] != ' ')\r
+               {\r
+                       addASpace = 1;\r
+               }\r
+       }\r
+       \r
+       /* concatenate the two extension strings */\r
+       if ( addASpace )\r
+       {\r
+           sprintf(extStr,"%s %s",platExtStr,glExtStr);\r
+       }\r
+       else\r
+       {\r
+           sprintf(extStr,"%s%s",platExtStr,glExtStr);\r
+       }\r
+\r
+       /* extract the extensions */\r
+       for ( a=0;a<totalExtStrLen;a++ )\r
+       {\r
+               b=0;\r
+               while (extStr[a]!=' ' && a<totalExtStrLen && b<1022)\r
+               {\r
+                       extensionName[b]=extStr[a];\r
+                       b++; a++;\r
+               }\r
+               if (b==1023)\r
+               {\r
+                       __GLeeWriteError("Extension name exceeds 1023 characters.");\r
+                       free((void *)extStr);\r
+                       return GL_FALSE;\r
+               }\r
+\r
+               extensionName[b]='\0'; \r
+\r
+               /* add the extension */\r
+               __GLeeExtList_add(extList,extensionName);\r
+       }\r
+       free((void *)extStr);\r
+       return GL_TRUE;\r
+}\r
+\r
+GLboolean __GLeeCheckExtension(const char * name, ExtensionList *extensionNames)\r
+{\r
+       int n=extensionNames->numNames;\r
+       int a;\r
+    for (a=0;a<n;a++)\r
+       {\r
+               if (strcmp(extensionNames->names[a],name)==0)\r
+                       return GL_TRUE;\r
+       }\r
+       return GL_FALSE;\r
+}\r
+\r
+GLEE_EXTERN GLint __GLeeGetExtensionNumber(const char *extensionName, int type)\r
+{\r
+       int a;\r
+       switch (type)\r
+       {\r
+       case 0:\r
+               for (a=0;a<__GLeeGLNumExtensions;a++)\r
+                       if (strcmp(extensionName,__GLeeGLExtensionNames[a])==0) return a;\r
+               return -1;\r
+#ifdef WIN32\r
+       case 1:\r
+               for (a=0;a<__GLeeWGLNumExtensions;a++)\r
+                       if (strcmp(extensionName,__GLeeWGLExtensionNames[a])==0) return a;\r
+               return -1;\r
+#elif defined(__APPLE__) || defined(__APPLE_CC__)\r
+#else\r
+       case 2:\r
+               for (a=0;a<__GLeeGLXNumExtensions;a++)\r
+                       if (strcmp(extensionName,__GLeeGLXExtensionNames[a])==0) return a;\r
+               return -1;\r
+#endif\r
+       }\r
+       return -1;\r
+}\r
+\r
+/*****************************************************************\r
+ * GLee external functions \r
+ *****************************************************************/\r
+\r
+#ifdef WIN32\r
+GLEE_EXTERN const char * GLeeGetExtStrWGL( void )\r
+{\r
+       return __GLeeGetExtStrPlat();\r
+}\r
+#elif defined(__APPLE__) || defined(__APPLE_CC__)\r
+#else\r
+GLEE_EXTERN const char * GLeeGetExtStrGLX( void )      \r
+{\r
+       return __GLeeGetExtStrPlat();\r
+}\r
+#endif\r
+\r
+GLEE_EXTERN const char * GLeeGetExtStrGL( void )\r
+{\r
+       return (const char *)glGetString(GL_EXTENSIONS);\r
+}\r
+\r
+GLEE_EXTERN const char * GLeeGetErrorString( void )\r
+{\r
+       return GLeeErrorString;\r
+}\r
+\r
+GLboolean __GLeeInitedLoadFunctions=GL_FALSE;\r
+\r
+GLEE_EXTERN GLint GLeeForceLink(const char * extensionName)\r
+{\r
+       int type=0; \r
+       int extNum;\r
+       int len=strlen(extensionName);\r
+       if (len<5) return GLEE_LINK_FAIL;\r
+       if (!__GLeeInitedLoadFunctions)\r
+       {\r
+               if (!__GLeeInited) GLeeInit();\r
+               initGLLoadFunctions();\r
+#ifdef WIN32\r
+               initWGLLoadFunctions();\r
+#elif defined(__APPLE__) || defined(__APPLE_CC__)\r
+#else\r
+               initGLXLoadFunctions();\r
+#endif\r
+               __GLeeInitedLoadFunctions=GL_TRUE;\r
+       }\r
+       if (extensionName[0]=='W') type=1;\r
+       else if (extensionName[2]=='X') type=2; \r
+       extNum=__GLeeGetExtensionNumber(extensionName,type);\r
+       if (extNum==-1) return GLEE_LINK_FAIL;\r
+       if (type==0) return __GLeeGLLoadFunction[extNum]();\r
+#ifdef WIN32\r
+       if (type==1) return __GLeeWGLLoadFunction[extNum]();\r
+#elif defined(__APPLE__) || defined(__APPLE_CC__)      \r
+#else\r
+       if (type==2) return __GLeeGLXLoadFunction[extNum]();\r
+#endif\r
+       return GLEE_LINK_FAIL;\r
+}\r
+\r
+GLEE_EXTERN GLboolean GLeeEnabled(GLboolean * extensionQueryingVariable)\r
+{\r
+       if (!__GLeeInited) GLeeInit();\r
+       return *extensionQueryingVariable;      \r
+}\r
+\r
+GLEE_EXTERN GLboolean GLeeInit( void )\r
+{\r
+       int version;\r
+       ExtensionList extensionNames;\r
+       \r
+       if (__GLeeInited) \r
+       {\r
+               return GL_FALSE;\r
+       }\r
+\r
+       __GLeeExtList_init(&extensionNames);\r
+       if (!__GLeeGetExtensions(&extensionNames)) \r
+       {\r
+               __GLeeWriteError("GL extension querying failed.");\r
+               __GLeeExtList_clean(&extensionNames);\r
+               return GL_FALSE;\r
+       }\r
+\r
+       version=__GLeeGetVersionNumber((char *)glGetString(GL_VERSION));\r
+\r
+       __GLeeInited = GL_TRUE;\r
+\r
+\r
+/*****************************************************************\r
+ * Autogenerated linking functions\r
+ *****************************************************************/\r
+    if (version>=258)\r
+    {\r
+        _GLEE_VERSION_1_2 = GL_TRUE;\r
+        __GLeeLink_GL_VERSION_1_2();\r
+    }\r
+    if (__GLeeCheckExtension("GL_ARB_imaging", &extensionNames) )\r
+    {\r
+        _GLEE_ARB_imaging = GL_TRUE;\r
+        __GLeeLink_GL_ARB_imaging();\r
+    }\r
+    if (version>=259)\r
+    {\r
+        _GLEE_VERSION_1_3 = GL_TRUE;\r
+        __GLeeLink_GL_VERSION_1_3();\r
+    }\r
+    if (version>=260)\r
+    {\r
+        _GLEE_VERSION_1_4 = GL_TRUE;\r
+        __GLeeLink_GL_VERSION_1_4();\r
+    }\r
+    if (version>=261)\r
+    {\r
+        _GLEE_VERSION_1_5 = GL_TRUE;\r
+        __GLeeLink_GL_VERSION_1_5();\r
+    }\r
+    if (version>=512)\r
+    {\r
+        _GLEE_VERSION_2_0 = GL_TRUE;\r
+        __GLeeLink_GL_VERSION_2_0();\r
+    }\r
+    if (version>=513)\r
+    {\r
+        _GLEE_VERSION_2_1 = GL_TRUE;\r
+        __GLeeLink_GL_VERSION_2_1();\r
+    }\r
+    if (version>=768)\r
+    {\r
+        _GLEE_VERSION_3_0 = GL_TRUE;\r
+        __GLeeLink_GL_VERSION_3_0();\r
+    }\r
+    if (__GLeeCheckExtension("GL_ARB_multitexture", &extensionNames) )\r
+    {\r
+        _GLEE_ARB_multitexture = GL_TRUE;\r
+        __GLeeLink_GL_ARB_multitexture();\r
+    }\r
+    if (__GLeeCheckExtension("GL_ARB_transpose_matrix", &extensionNames) )\r
+    {\r
+        _GLEE_ARB_transpose_matrix = GL_TRUE;\r
+        __GLeeLink_GL_ARB_transpose_matrix();\r
+    }\r
+    if (__GLeeCheckExtension("GL_ARB_multisample", &extensionNames) )\r
+    {\r
+        _GLEE_ARB_multisample = GL_TRUE;\r
+        __GLeeLink_GL_ARB_multisample();\r
+    }\r
+    if (__GLeeCheckExtension("GL_ARB_texture_env_add", &extensionNames) )\r
+    {\r
+        _GLEE_ARB_texture_env_add = GL_TRUE;\r
+        __GLeeLink_GL_ARB_texture_env_add();\r
+    }\r
+    if (__GLeeCheckExtension("GL_ARB_texture_cube_map", &extensionNames) )\r
+    {\r
+        _GLEE_ARB_texture_cube_map = GL_TRUE;\r
+        __GLeeLink_GL_ARB_texture_cube_map();\r
+    }\r
+    if (__GLeeCheckExtension("GL_ARB_texture_compression", &extensionNames) )\r
+    {\r
+        _GLEE_ARB_texture_compression = GL_TRUE;\r
+        __GLeeLink_GL_ARB_texture_compression();\r
+    }\r
+    if (__GLeeCheckExtension("GL_ARB_texture_border_clamp", &extensionNames) )\r
+    {\r
+        _GLEE_ARB_texture_border_clamp = GL_TRUE;\r
+        __GLeeLink_GL_ARB_texture_border_clamp();\r
+    }\r
+    if (__GLeeCheckExtension("GL_ARB_point_parameters", &extensionNames) )\r
+    {\r
+        _GLEE_ARB_point_parameters = GL_TRUE;\r
+        __GLeeLink_GL_ARB_point_parameters();\r
+    }\r
+    if (__GLeeCheckExtension("GL_ARB_vertex_blend", &extensionNames) )\r
+    {\r
+        _GLEE_ARB_vertex_blend = GL_TRUE;\r
+        __GLeeLink_GL_ARB_vertex_blend();\r
+    }\r
+    if (__GLeeCheckExtension("GL_ARB_matrix_palette", &extensionNames) )\r
+    {\r
+        _GLEE_ARB_matrix_palette = GL_TRUE;\r
+        __GLeeLink_GL_ARB_matrix_palette();\r
+    }\r
+    if (__GLeeCheckExtension("GL_ARB_texture_env_combine", &extensionNames) )\r
+    {\r
+        _GLEE_ARB_texture_env_combine = GL_TRUE;\r
+        __GLeeLink_GL_ARB_texture_env_combine();\r
+    }\r
+    if (__GLeeCheckExtension("GL_ARB_texture_env_crossbar", &extensionNames) )\r
+    {\r
+        _GLEE_ARB_texture_env_crossbar = GL_TRUE;\r
+        __GLeeLink_GL_ARB_texture_env_crossbar();\r
+    }\r
+    if (__GLeeCheckExtension("GL_ARB_texture_env_dot3", &extensionNames) )\r
+    {\r
+        _GLEE_ARB_texture_env_dot3 = GL_TRUE;\r
+        __GLeeLink_GL_ARB_texture_env_dot3();\r
+    }\r
+    if (__GLeeCheckExtension("GL_ARB_texture_mirrored_repeat", &extensionNames) )\r
+    {\r
+        _GLEE_ARB_texture_mirrored_repeat = GL_TRUE;\r
+        __GLeeLink_GL_ARB_texture_mirrored_repeat();\r
+    }\r
+    if (__GLeeCheckExtension("GL_ARB_depth_texture", &extensionNames) )\r
+    {\r
+        _GLEE_ARB_depth_texture = GL_TRUE;\r
+        __GLeeLink_GL_ARB_depth_texture();\r
+    }\r
+    if (__GLeeCheckExtension("GL_ARB_shadow", &extensionNames) )\r
+    {\r
+        _GLEE_ARB_shadow = GL_TRUE;\r
+        __GLeeLink_GL_ARB_shadow();\r
+    }\r
+    if (__GLeeCheckExtension("GL_ARB_shadow_ambient", &extensionNames) )\r
+    {\r
+        _GLEE_ARB_shadow_ambient = GL_TRUE;\r
+        __GLeeLink_GL_ARB_shadow_ambient();\r
+    }\r
+    if (__GLeeCheckExtension("GL_ARB_window_pos", &extensionNames) )\r
+    {\r
+        _GLEE_ARB_window_pos = GL_TRUE;\r
+        __GLeeLink_GL_ARB_window_pos();\r
+    }\r
+    if (__GLeeCheckExtension("GL_ARB_vertex_program", &extensionNames) )\r
+    {\r
+        _GLEE_ARB_vertex_program = GL_TRUE;\r
+        __GLeeLink_GL_ARB_vertex_program();\r
+    }\r
+    if (__GLeeCheckExtension("GL_ARB_fragment_program", &extensionNames) )\r
+    {\r
+        _GLEE_ARB_fragment_program = GL_TRUE;\r
+        __GLeeLink_GL_ARB_fragment_program();\r
+    }\r
+    if (__GLeeCheckExtension("GL_ARB_vertex_buffer_object", &extensionNames) )\r
+    {\r
+        _GLEE_ARB_vertex_buffer_object = GL_TRUE;\r
+        __GLeeLink_GL_ARB_vertex_buffer_object();\r
+    }\r
+    if (__GLeeCheckExtension("GL_ARB_occlusion_query", &extensionNames) )\r
+    {\r
+        _GLEE_ARB_occlusion_query = GL_TRUE;\r
+        __GLeeLink_GL_ARB_occlusion_query();\r
+    }\r
+    if (__GLeeCheckExtension("GL_ARB_shader_objects", &extensionNames) )\r
+    {\r
+        _GLEE_ARB_shader_objects = GL_TRUE;\r
+        __GLeeLink_GL_ARB_shader_objects();\r
+    }\r
+    if (__GLeeCheckExtension("GL_ARB_vertex_shader", &extensionNames) )\r
+    {\r
+        _GLEE_ARB_vertex_shader = GL_TRUE;\r
+        __GLeeLink_GL_ARB_vertex_shader();\r
+    }\r
+    if (__GLeeCheckExtension("GL_ARB_fragment_shader", &extensionNames) )\r
+    {\r
+        _GLEE_ARB_fragment_shader = GL_TRUE;\r
+        __GLeeLink_GL_ARB_fragment_shader();\r
+    }\r
+    if (__GLeeCheckExtension("GL_ARB_shading_language_100", &extensionNames) )\r
+    {\r
+        _GLEE_ARB_shading_language_100 = GL_TRUE;\r
+        __GLeeLink_GL_ARB_shading_language_100();\r
+    }\r
+    if (__GLeeCheckExtension("GL_ARB_texture_non_power_of_two", &extensionNames) )\r
+    {\r
+        _GLEE_ARB_texture_non_power_of_two = GL_TRUE;\r
+        __GLeeLink_GL_ARB_texture_non_power_of_two();\r
+    }\r
+    if (__GLeeCheckExtension("GL_ARB_point_sprite", &extensionNames) )\r
+    {\r
+        _GLEE_ARB_point_sprite = GL_TRUE;\r
+        __GLeeLink_GL_ARB_point_sprite();\r
+    }\r
+    if (__GLeeCheckExtension("GL_ARB_fragment_program_shadow", &extensionNames) )\r
+    {\r
+        _GLEE_ARB_fragment_program_shadow = GL_TRUE;\r
+        __GLeeLink_GL_ARB_fragment_program_shadow();\r
+    }\r
+    if (__GLeeCheckExtension("GL_ARB_draw_buffers", &extensionNames) )\r
+    {\r
+        _GLEE_ARB_draw_buffers = GL_TRUE;\r
+        __GLeeLink_GL_ARB_draw_buffers();\r
+    }\r
+    if (__GLeeCheckExtension("GL_ARB_texture_rectangle", &extensionNames) )\r
+    {\r
+        _GLEE_ARB_texture_rectangle = GL_TRUE;\r
+        __GLeeLink_GL_ARB_texture_rectangle();\r
+    }\r
+    if (__GLeeCheckExtension("GL_ARB_color_buffer_float", &extensionNames) )\r
+    {\r
+        _GLEE_ARB_color_buffer_float = GL_TRUE;\r
+        __GLeeLink_GL_ARB_color_buffer_float();\r
+    }\r
+    if (__GLeeCheckExtension("GL_ARB_half_float_pixel", &extensionNames) )\r
+    {\r
+        _GLEE_ARB_half_float_pixel = GL_TRUE;\r
+        __GLeeLink_GL_ARB_half_float_pixel();\r
+    }\r
+    if (__GLeeCheckExtension("GL_ARB_texture_float", &extensionNames) )\r
+    {\r
+        _GLEE_ARB_texture_float = GL_TRUE;\r
+        __GLeeLink_GL_ARB_texture_float();\r
+    }\r
+    if (__GLeeCheckExtension("GL_ARB_pixel_buffer_object", &extensionNames) )\r
+    {\r
+        _GLEE_ARB_pixel_buffer_object = GL_TRUE;\r
+        __GLeeLink_GL_ARB_pixel_buffer_object();\r
+    }\r
+    if (__GLeeCheckExtension("GL_ARB_depth_buffer_float", &extensionNames) )\r
+    {\r
+        _GLEE_ARB_depth_buffer_float = GL_TRUE;\r
+        __GLeeLink_GL_ARB_depth_buffer_float();\r
+    }\r
+    if (__GLeeCheckExtension("GL_ARB_draw_instanced", &extensionNames) )\r
+    {\r
+        _GLEE_ARB_draw_instanced = GL_TRUE;\r
+        __GLeeLink_GL_ARB_draw_instanced();\r
+    }\r
+    if (__GLeeCheckExtension("GL_ARB_framebuffer_object", &extensionNames) )\r
+    {\r
+        _GLEE_ARB_framebuffer_object = GL_TRUE;\r
+        __GLeeLink_GL_ARB_framebuffer_object();\r
+    }\r
+    if (__GLeeCheckExtension("GL_ARB_framebuffer_sRGB", &extensionNames) )\r
+    {\r
+        _GLEE_ARB_framebuffer_sRGB = GL_TRUE;\r
+        __GLeeLink_GL_ARB_framebuffer_sRGB();\r
+    }\r
+    if (__GLeeCheckExtension("GL_ARB_geometry_shader4", &extensionNames) )\r
+    {\r
+        _GLEE_ARB_geometry_shader4 = GL_TRUE;\r
+        __GLeeLink_GL_ARB_geometry_shader4();\r
+    }\r
+    if (__GLeeCheckExtension("GL_ARB_half_float_vertex", &extensionNames) )\r
+    {\r
+        _GLEE_ARB_half_float_vertex = GL_TRUE;\r
+        __GLeeLink_GL_ARB_half_float_vertex();\r
+    }\r
+    if (__GLeeCheckExtension("GL_ARB_instanced_arrays", &extensionNames) )\r
+    {\r
+        _GLEE_ARB_instanced_arrays = GL_TRUE;\r
+        __GLeeLink_GL_ARB_instanced_arrays();\r
+    }\r
+    if (__GLeeCheckExtension("GL_ARB_map_buffer_range", &extensionNames) )\r
+    {\r
+        _GLEE_ARB_map_buffer_range = GL_TRUE;\r
+        __GLeeLink_GL_ARB_map_buffer_range();\r
+    }\r
+    if (__GLeeCheckExtension("GL_ARB_texture_buffer_object", &extensionNames) )\r
+    {\r
+        _GLEE_ARB_texture_buffer_object = GL_TRUE;\r
+        __GLeeLink_GL_ARB_texture_buffer_object();\r
+    }\r
+    if (__GLeeCheckExtension("GL_ARB_texture_compression_rgtc", &extensionNames) )\r
+    {\r
+        _GLEE_ARB_texture_compression_rgtc = GL_TRUE;\r
+        __GLeeLink_GL_ARB_texture_compression_rgtc();\r
+    }\r
+    if (__GLeeCheckExtension("GL_ARB_texture_rg", &extensionNames) )\r
+    {\r
+        _GLEE_ARB_texture_rg = GL_TRUE;\r
+        __GLeeLink_GL_ARB_texture_rg();\r
+    }\r
+    if (__GLeeCheckExtension("GL_ARB_vertex_array_object", &extensionNames) )\r
+    {\r
+        _GLEE_ARB_vertex_array_object = GL_TRUE;\r
+        __GLeeLink_GL_ARB_vertex_array_object();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_abgr", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_abgr = GL_TRUE;\r
+        __GLeeLink_GL_EXT_abgr();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_blend_color", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_blend_color = GL_TRUE;\r
+        __GLeeLink_GL_EXT_blend_color();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_polygon_offset", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_polygon_offset = GL_TRUE;\r
+        __GLeeLink_GL_EXT_polygon_offset();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_texture", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_texture = GL_TRUE;\r
+        __GLeeLink_GL_EXT_texture();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_texture3D", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_texture3D = GL_TRUE;\r
+        __GLeeLink_GL_EXT_texture3D();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SGIS_texture_filter4", &extensionNames) )\r
+    {\r
+        _GLEE_SGIS_texture_filter4 = GL_TRUE;\r
+        __GLeeLink_GL_SGIS_texture_filter4();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_subtexture", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_subtexture = GL_TRUE;\r
+        __GLeeLink_GL_EXT_subtexture();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_copy_texture", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_copy_texture = GL_TRUE;\r
+        __GLeeLink_GL_EXT_copy_texture();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_histogram", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_histogram = GL_TRUE;\r
+        __GLeeLink_GL_EXT_histogram();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_convolution", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_convolution = GL_TRUE;\r
+        __GLeeLink_GL_EXT_convolution();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SGI_color_matrix", &extensionNames) )\r
+    {\r
+        _GLEE_SGI_color_matrix = GL_TRUE;\r
+        __GLeeLink_GL_SGI_color_matrix();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SGI_color_table", &extensionNames) )\r
+    {\r
+        _GLEE_SGI_color_table = GL_TRUE;\r
+        __GLeeLink_GL_SGI_color_table();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SGIS_pixel_texture", &extensionNames) )\r
+    {\r
+        _GLEE_SGIS_pixel_texture = GL_TRUE;\r
+        __GLeeLink_GL_SGIS_pixel_texture();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SGIX_pixel_texture", &extensionNames) )\r
+    {\r
+        _GLEE_SGIX_pixel_texture = GL_TRUE;\r
+        __GLeeLink_GL_SGIX_pixel_texture();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SGIS_texture4D", &extensionNames) )\r
+    {\r
+        _GLEE_SGIS_texture4D = GL_TRUE;\r
+        __GLeeLink_GL_SGIS_texture4D();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SGI_texture_color_table", &extensionNames) )\r
+    {\r
+        _GLEE_SGI_texture_color_table = GL_TRUE;\r
+        __GLeeLink_GL_SGI_texture_color_table();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_cmyka", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_cmyka = GL_TRUE;\r
+        __GLeeLink_GL_EXT_cmyka();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_texture_object", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_texture_object = GL_TRUE;\r
+        __GLeeLink_GL_EXT_texture_object();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SGIS_detail_texture", &extensionNames) )\r
+    {\r
+        _GLEE_SGIS_detail_texture = GL_TRUE;\r
+        __GLeeLink_GL_SGIS_detail_texture();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SGIS_sharpen_texture", &extensionNames) )\r
+    {\r
+        _GLEE_SGIS_sharpen_texture = GL_TRUE;\r
+        __GLeeLink_GL_SGIS_sharpen_texture();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_packed_pixels", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_packed_pixels = GL_TRUE;\r
+        __GLeeLink_GL_EXT_packed_pixels();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SGIS_texture_lod", &extensionNames) )\r
+    {\r
+        _GLEE_SGIS_texture_lod = GL_TRUE;\r
+        __GLeeLink_GL_SGIS_texture_lod();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SGIS_multisample", &extensionNames) )\r
+    {\r
+        _GLEE_SGIS_multisample = GL_TRUE;\r
+        __GLeeLink_GL_SGIS_multisample();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_rescale_normal", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_rescale_normal = GL_TRUE;\r
+        __GLeeLink_GL_EXT_rescale_normal();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_vertex_array", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_vertex_array = GL_TRUE;\r
+        __GLeeLink_GL_EXT_vertex_array();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_misc_attribute", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_misc_attribute = GL_TRUE;\r
+        __GLeeLink_GL_EXT_misc_attribute();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SGIS_generate_mipmap", &extensionNames) )\r
+    {\r
+        _GLEE_SGIS_generate_mipmap = GL_TRUE;\r
+        __GLeeLink_GL_SGIS_generate_mipmap();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SGIX_clipmap", &extensionNames) )\r
+    {\r
+        _GLEE_SGIX_clipmap = GL_TRUE;\r
+        __GLeeLink_GL_SGIX_clipmap();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SGIX_shadow", &extensionNames) )\r
+    {\r
+        _GLEE_SGIX_shadow = GL_TRUE;\r
+        __GLeeLink_GL_SGIX_shadow();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SGIS_texture_edge_clamp", &extensionNames) )\r
+    {\r
+        _GLEE_SGIS_texture_edge_clamp = GL_TRUE;\r
+        __GLeeLink_GL_SGIS_texture_edge_clamp();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SGIS_texture_border_clamp", &extensionNames) )\r
+    {\r
+        _GLEE_SGIS_texture_border_clamp = GL_TRUE;\r
+        __GLeeLink_GL_SGIS_texture_border_clamp();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_blend_minmax", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_blend_minmax = GL_TRUE;\r
+        __GLeeLink_GL_EXT_blend_minmax();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_blend_subtract", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_blend_subtract = GL_TRUE;\r
+        __GLeeLink_GL_EXT_blend_subtract();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_blend_logic_op", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_blend_logic_op = GL_TRUE;\r
+        __GLeeLink_GL_EXT_blend_logic_op();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SGIX_interlace", &extensionNames) )\r
+    {\r
+        _GLEE_SGIX_interlace = GL_TRUE;\r
+        __GLeeLink_GL_SGIX_interlace();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SGIX_pixel_tiles", &extensionNames) )\r
+    {\r
+        _GLEE_SGIX_pixel_tiles = GL_TRUE;\r
+        __GLeeLink_GL_SGIX_pixel_tiles();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SGIS_texture_select", &extensionNames) )\r
+    {\r
+        _GLEE_SGIS_texture_select = GL_TRUE;\r
+        __GLeeLink_GL_SGIS_texture_select();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SGIX_sprite", &extensionNames) )\r
+    {\r
+        _GLEE_SGIX_sprite = GL_TRUE;\r
+        __GLeeLink_GL_SGIX_sprite();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SGIX_texture_multi_buffer", &extensionNames) )\r
+    {\r
+        _GLEE_SGIX_texture_multi_buffer = GL_TRUE;\r
+        __GLeeLink_GL_SGIX_texture_multi_buffer();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_point_parameters", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_point_parameters = GL_TRUE;\r
+        __GLeeLink_GL_EXT_point_parameters();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SGIS_point_parameters", &extensionNames) )\r
+    {\r
+        _GLEE_SGIS_point_parameters = GL_TRUE;\r
+        __GLeeLink_GL_SGIS_point_parameters();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SGIX_instruments", &extensionNames) )\r
+    {\r
+        _GLEE_SGIX_instruments = GL_TRUE;\r
+        __GLeeLink_GL_SGIX_instruments();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SGIX_texture_scale_bias", &extensionNames) )\r
+    {\r
+        _GLEE_SGIX_texture_scale_bias = GL_TRUE;\r
+        __GLeeLink_GL_SGIX_texture_scale_bias();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SGIX_framezoom", &extensionNames) )\r
+    {\r
+        _GLEE_SGIX_framezoom = GL_TRUE;\r
+        __GLeeLink_GL_SGIX_framezoom();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SGIX_tag_sample_buffer", &extensionNames) )\r
+    {\r
+        _GLEE_SGIX_tag_sample_buffer = GL_TRUE;\r
+        __GLeeLink_GL_SGIX_tag_sample_buffer();\r
+    }\r
+    if (__GLeeCheckExtension("GL_FfdMaskSGIX", &extensionNames) )\r
+    {\r
+        _GLEE_FfdMaskSGIX = GL_TRUE;\r
+        __GLeeLink_GL_FfdMaskSGIX();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SGIX_polynomial_ffd", &extensionNames) )\r
+    {\r
+        _GLEE_SGIX_polynomial_ffd = GL_TRUE;\r
+        __GLeeLink_GL_SGIX_polynomial_ffd();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SGIX_reference_plane", &extensionNames) )\r
+    {\r
+        _GLEE_SGIX_reference_plane = GL_TRUE;\r
+        __GLeeLink_GL_SGIX_reference_plane();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SGIX_flush_raster", &extensionNames) )\r
+    {\r
+        _GLEE_SGIX_flush_raster = GL_TRUE;\r
+        __GLeeLink_GL_SGIX_flush_raster();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SGIX_depth_texture", &extensionNames) )\r
+    {\r
+        _GLEE_SGIX_depth_texture = GL_TRUE;\r
+        __GLeeLink_GL_SGIX_depth_texture();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SGIS_fog_function", &extensionNames) )\r
+    {\r
+        _GLEE_SGIS_fog_function = GL_TRUE;\r
+        __GLeeLink_GL_SGIS_fog_function();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SGIX_fog_offset", &extensionNames) )\r
+    {\r
+        _GLEE_SGIX_fog_offset = GL_TRUE;\r
+        __GLeeLink_GL_SGIX_fog_offset();\r
+    }\r
+    if (__GLeeCheckExtension("GL_HP_image_transform", &extensionNames) )\r
+    {\r
+        _GLEE_HP_image_transform = GL_TRUE;\r
+        __GLeeLink_GL_HP_image_transform();\r
+    }\r
+    if (__GLeeCheckExtension("GL_HP_convolution_border_modes", &extensionNames) )\r
+    {\r
+        _GLEE_HP_convolution_border_modes = GL_TRUE;\r
+        __GLeeLink_GL_HP_convolution_border_modes();\r
+    }\r
+    if (__GLeeCheckExtension("GL_INGR_palette_buffer", &extensionNames) )\r
+    {\r
+        _GLEE_INGR_palette_buffer = GL_TRUE;\r
+        __GLeeLink_GL_INGR_palette_buffer();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SGIX_texture_add_env", &extensionNames) )\r
+    {\r
+        _GLEE_SGIX_texture_add_env = GL_TRUE;\r
+        __GLeeLink_GL_SGIX_texture_add_env();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_color_subtable", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_color_subtable = GL_TRUE;\r
+        __GLeeLink_GL_EXT_color_subtable();\r
+    }\r
+    if (__GLeeCheckExtension("GL_PGI_vertex_hints", &extensionNames) )\r
+    {\r
+        _GLEE_PGI_vertex_hints = GL_TRUE;\r
+        __GLeeLink_GL_PGI_vertex_hints();\r
+    }\r
+    if (__GLeeCheckExtension("GL_PGI_misc_hints", &extensionNames) )\r
+    {\r
+        _GLEE_PGI_misc_hints = GL_TRUE;\r
+        __GLeeLink_GL_PGI_misc_hints();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_paletted_texture", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_paletted_texture = GL_TRUE;\r
+        __GLeeLink_GL_EXT_paletted_texture();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_clip_volume_hint", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_clip_volume_hint = GL_TRUE;\r
+        __GLeeLink_GL_EXT_clip_volume_hint();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SGIX_list_priority", &extensionNames) )\r
+    {\r
+        _GLEE_SGIX_list_priority = GL_TRUE;\r
+        __GLeeLink_GL_SGIX_list_priority();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SGIX_ir_instrument1", &extensionNames) )\r
+    {\r
+        _GLEE_SGIX_ir_instrument1 = GL_TRUE;\r
+        __GLeeLink_GL_SGIX_ir_instrument1();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SGIX_calligraphic_fragment", &extensionNames) )\r
+    {\r
+        _GLEE_SGIX_calligraphic_fragment = GL_TRUE;\r
+        __GLeeLink_GL_SGIX_calligraphic_fragment();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SGIX_texture_lod_bias", &extensionNames) )\r
+    {\r
+        _GLEE_SGIX_texture_lod_bias = GL_TRUE;\r
+        __GLeeLink_GL_SGIX_texture_lod_bias();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SGIX_shadow_ambient", &extensionNames) )\r
+    {\r
+        _GLEE_SGIX_shadow_ambient = GL_TRUE;\r
+        __GLeeLink_GL_SGIX_shadow_ambient();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_index_texture", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_index_texture = GL_TRUE;\r
+        __GLeeLink_GL_EXT_index_texture();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_index_material", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_index_material = GL_TRUE;\r
+        __GLeeLink_GL_EXT_index_material();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_index_func", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_index_func = GL_TRUE;\r
+        __GLeeLink_GL_EXT_index_func();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_index_array_formats", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_index_array_formats = GL_TRUE;\r
+        __GLeeLink_GL_EXT_index_array_formats();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_compiled_vertex_array", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_compiled_vertex_array = GL_TRUE;\r
+        __GLeeLink_GL_EXT_compiled_vertex_array();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_cull_vertex", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_cull_vertex = GL_TRUE;\r
+        __GLeeLink_GL_EXT_cull_vertex();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SGIX_ycrcb", &extensionNames) )\r
+    {\r
+        _GLEE_SGIX_ycrcb = GL_TRUE;\r
+        __GLeeLink_GL_SGIX_ycrcb();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SGIX_fragment_lighting", &extensionNames) )\r
+    {\r
+        _GLEE_SGIX_fragment_lighting = GL_TRUE;\r
+        __GLeeLink_GL_SGIX_fragment_lighting();\r
+    }\r
+    if (__GLeeCheckExtension("GL_IBM_rasterpos_clip", &extensionNames) )\r
+    {\r
+        _GLEE_IBM_rasterpos_clip = GL_TRUE;\r
+        __GLeeLink_GL_IBM_rasterpos_clip();\r
+    }\r
+    if (__GLeeCheckExtension("GL_HP_texture_lighting", &extensionNames) )\r
+    {\r
+        _GLEE_HP_texture_lighting = GL_TRUE;\r
+        __GLeeLink_GL_HP_texture_lighting();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_draw_range_elements", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_draw_range_elements = GL_TRUE;\r
+        __GLeeLink_GL_EXT_draw_range_elements();\r
+    }\r
+    if (__GLeeCheckExtension("GL_WIN_phong_shading", &extensionNames) )\r
+    {\r
+        _GLEE_WIN_phong_shading = GL_TRUE;\r
+        __GLeeLink_GL_WIN_phong_shading();\r
+    }\r
+    if (__GLeeCheckExtension("GL_WIN_specular_fog", &extensionNames) )\r
+    {\r
+        _GLEE_WIN_specular_fog = GL_TRUE;\r
+        __GLeeLink_GL_WIN_specular_fog();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_light_texture", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_light_texture = GL_TRUE;\r
+        __GLeeLink_GL_EXT_light_texture();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SGIX_blend_alpha_minmax", &extensionNames) )\r
+    {\r
+        _GLEE_SGIX_blend_alpha_minmax = GL_TRUE;\r
+        __GLeeLink_GL_SGIX_blend_alpha_minmax();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SGIX_impact_pixel_texture", &extensionNames) )\r
+    {\r
+        _GLEE_SGIX_impact_pixel_texture = GL_TRUE;\r
+        __GLeeLink_GL_SGIX_impact_pixel_texture();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_bgra", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_bgra = GL_TRUE;\r
+        __GLeeLink_GL_EXT_bgra();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SGIX_async", &extensionNames) )\r
+    {\r
+        _GLEE_SGIX_async = GL_TRUE;\r
+        __GLeeLink_GL_SGIX_async();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SGIX_async_pixel", &extensionNames) )\r
+    {\r
+        _GLEE_SGIX_async_pixel = GL_TRUE;\r
+        __GLeeLink_GL_SGIX_async_pixel();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SGIX_async_histogram", &extensionNames) )\r
+    {\r
+        _GLEE_SGIX_async_histogram = GL_TRUE;\r
+        __GLeeLink_GL_SGIX_async_histogram();\r
+    }\r
+    if (__GLeeCheckExtension("GL_INTEL_texture_scissor", &extensionNames) )\r
+    {\r
+        _GLEE_INTEL_texture_scissor = GL_TRUE;\r
+        __GLeeLink_GL_INTEL_texture_scissor();\r
+    }\r
+    if (__GLeeCheckExtension("GL_INTEL_parallel_arrays", &extensionNames) )\r
+    {\r
+        _GLEE_INTEL_parallel_arrays = GL_TRUE;\r
+        __GLeeLink_GL_INTEL_parallel_arrays();\r
+    }\r
+    if (__GLeeCheckExtension("GL_HP_occlusion_test", &extensionNames) )\r
+    {\r
+        _GLEE_HP_occlusion_test = GL_TRUE;\r
+        __GLeeLink_GL_HP_occlusion_test();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_pixel_transform", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_pixel_transform = GL_TRUE;\r
+        __GLeeLink_GL_EXT_pixel_transform();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_pixel_transform_color_table", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_pixel_transform_color_table = GL_TRUE;\r
+        __GLeeLink_GL_EXT_pixel_transform_color_table();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_shared_texture_palette", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_shared_texture_palette = GL_TRUE;\r
+        __GLeeLink_GL_EXT_shared_texture_palette();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_separate_specular_color", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_separate_specular_color = GL_TRUE;\r
+        __GLeeLink_GL_EXT_separate_specular_color();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_secondary_color", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_secondary_color = GL_TRUE;\r
+        __GLeeLink_GL_EXT_secondary_color();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_texture_perturb_normal", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_texture_perturb_normal = GL_TRUE;\r
+        __GLeeLink_GL_EXT_texture_perturb_normal();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_multi_draw_arrays", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_multi_draw_arrays = GL_TRUE;\r
+        __GLeeLink_GL_EXT_multi_draw_arrays();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_fog_coord", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_fog_coord = GL_TRUE;\r
+        __GLeeLink_GL_EXT_fog_coord();\r
+    }\r
+    if (__GLeeCheckExtension("GL_REND_screen_coordinates", &extensionNames) )\r
+    {\r
+        _GLEE_REND_screen_coordinates = GL_TRUE;\r
+        __GLeeLink_GL_REND_screen_coordinates();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_coordinate_frame", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_coordinate_frame = GL_TRUE;\r
+        __GLeeLink_GL_EXT_coordinate_frame();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_texture_env_combine", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_texture_env_combine = GL_TRUE;\r
+        __GLeeLink_GL_EXT_texture_env_combine();\r
+    }\r
+    if (__GLeeCheckExtension("GL_APPLE_specular_vector", &extensionNames) )\r
+    {\r
+        _GLEE_APPLE_specular_vector = GL_TRUE;\r
+        __GLeeLink_GL_APPLE_specular_vector();\r
+    }\r
+    if (__GLeeCheckExtension("GL_APPLE_transform_hint", &extensionNames) )\r
+    {\r
+        _GLEE_APPLE_transform_hint = GL_TRUE;\r
+        __GLeeLink_GL_APPLE_transform_hint();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SGIX_fog_scale", &extensionNames) )\r
+    {\r
+        _GLEE_SGIX_fog_scale = GL_TRUE;\r
+        __GLeeLink_GL_SGIX_fog_scale();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SUNX_constant_data", &extensionNames) )\r
+    {\r
+        _GLEE_SUNX_constant_data = GL_TRUE;\r
+        __GLeeLink_GL_SUNX_constant_data();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SUN_global_alpha", &extensionNames) )\r
+    {\r
+        _GLEE_SUN_global_alpha = GL_TRUE;\r
+        __GLeeLink_GL_SUN_global_alpha();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SUN_triangle_list", &extensionNames) )\r
+    {\r
+        _GLEE_SUN_triangle_list = GL_TRUE;\r
+        __GLeeLink_GL_SUN_triangle_list();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SUN_vertex", &extensionNames) )\r
+    {\r
+        _GLEE_SUN_vertex = GL_TRUE;\r
+        __GLeeLink_GL_SUN_vertex();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_blend_func_separate", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_blend_func_separate = GL_TRUE;\r
+        __GLeeLink_GL_EXT_blend_func_separate();\r
+    }\r
+    if (__GLeeCheckExtension("GL_INGR_color_clamp", &extensionNames) )\r
+    {\r
+        _GLEE_INGR_color_clamp = GL_TRUE;\r
+        __GLeeLink_GL_INGR_color_clamp();\r
+    }\r
+    if (__GLeeCheckExtension("GL_INGR_interlace_read", &extensionNames) )\r
+    {\r
+        _GLEE_INGR_interlace_read = GL_TRUE;\r
+        __GLeeLink_GL_INGR_interlace_read();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_stencil_wrap", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_stencil_wrap = GL_TRUE;\r
+        __GLeeLink_GL_EXT_stencil_wrap();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_422_pixels", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_422_pixels = GL_TRUE;\r
+        __GLeeLink_GL_EXT_422_pixels();\r
+    }\r
+    if (__GLeeCheckExtension("GL_NV_texgen_reflection", &extensionNames) )\r
+    {\r
+        _GLEE_NV_texgen_reflection = GL_TRUE;\r
+        __GLeeLink_GL_NV_texgen_reflection();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_texture_cube_map", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_texture_cube_map = GL_TRUE;\r
+        __GLeeLink_GL_EXT_texture_cube_map();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SUN_convolution_border_modes", &extensionNames) )\r
+    {\r
+        _GLEE_SUN_convolution_border_modes = GL_TRUE;\r
+        __GLeeLink_GL_SUN_convolution_border_modes();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_texture_env_add", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_texture_env_add = GL_TRUE;\r
+        __GLeeLink_GL_EXT_texture_env_add();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_texture_lod_bias", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_texture_lod_bias = GL_TRUE;\r
+        __GLeeLink_GL_EXT_texture_lod_bias();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_texture_filter_anisotropic", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_texture_filter_anisotropic = GL_TRUE;\r
+        __GLeeLink_GL_EXT_texture_filter_anisotropic();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_vertex_weighting", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_vertex_weighting = GL_TRUE;\r
+        __GLeeLink_GL_EXT_vertex_weighting();\r
+    }\r
+    if (__GLeeCheckExtension("GL_NV_light_max_exponent", &extensionNames) )\r
+    {\r
+        _GLEE_NV_light_max_exponent = GL_TRUE;\r
+        __GLeeLink_GL_NV_light_max_exponent();\r
+    }\r
+    if (__GLeeCheckExtension("GL_NV_vertex_array_range", &extensionNames) )\r
+    {\r
+        _GLEE_NV_vertex_array_range = GL_TRUE;\r
+        __GLeeLink_GL_NV_vertex_array_range();\r
+    }\r
+    if (__GLeeCheckExtension("GL_NV_register_combiners", &extensionNames) )\r
+    {\r
+        _GLEE_NV_register_combiners = GL_TRUE;\r
+        __GLeeLink_GL_NV_register_combiners();\r
+    }\r
+    if (__GLeeCheckExtension("GL_NV_fog_distance", &extensionNames) )\r
+    {\r
+        _GLEE_NV_fog_distance = GL_TRUE;\r
+        __GLeeLink_GL_NV_fog_distance();\r
+    }\r
+    if (__GLeeCheckExtension("GL_NV_texgen_emboss", &extensionNames) )\r
+    {\r
+        _GLEE_NV_texgen_emboss = GL_TRUE;\r
+        __GLeeLink_GL_NV_texgen_emboss();\r
+    }\r
+    if (__GLeeCheckExtension("GL_NV_blend_square", &extensionNames) )\r
+    {\r
+        _GLEE_NV_blend_square = GL_TRUE;\r
+        __GLeeLink_GL_NV_blend_square();\r
+    }\r
+    if (__GLeeCheckExtension("GL_NV_texture_env_combine4", &extensionNames) )\r
+    {\r
+        _GLEE_NV_texture_env_combine4 = GL_TRUE;\r
+        __GLeeLink_GL_NV_texture_env_combine4();\r
+    }\r
+    if (__GLeeCheckExtension("GL_MESA_resize_buffers", &extensionNames) )\r
+    {\r
+        _GLEE_MESA_resize_buffers = GL_TRUE;\r
+        __GLeeLink_GL_MESA_resize_buffers();\r
+    }\r
+    if (__GLeeCheckExtension("GL_MESA_window_pos", &extensionNames) )\r
+    {\r
+        _GLEE_MESA_window_pos = GL_TRUE;\r
+        __GLeeLink_GL_MESA_window_pos();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_texture_compression_s3tc", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_texture_compression_s3tc = GL_TRUE;\r
+        __GLeeLink_GL_EXT_texture_compression_s3tc();\r
+    }\r
+    if (__GLeeCheckExtension("GL_IBM_cull_vertex", &extensionNames) )\r
+    {\r
+        _GLEE_IBM_cull_vertex = GL_TRUE;\r
+        __GLeeLink_GL_IBM_cull_vertex();\r
+    }\r
+    if (__GLeeCheckExtension("GL_IBM_multimode_draw_arrays", &extensionNames) )\r
+    {\r
+        _GLEE_IBM_multimode_draw_arrays = GL_TRUE;\r
+        __GLeeLink_GL_IBM_multimode_draw_arrays();\r
+    }\r
+    if (__GLeeCheckExtension("GL_IBM_vertex_array_lists", &extensionNames) )\r
+    {\r
+        _GLEE_IBM_vertex_array_lists = GL_TRUE;\r
+        __GLeeLink_GL_IBM_vertex_array_lists();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SGIX_subsample", &extensionNames) )\r
+    {\r
+        _GLEE_SGIX_subsample = GL_TRUE;\r
+        __GLeeLink_GL_SGIX_subsample();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SGIX_ycrcb_subsample", &extensionNames) )\r
+    {\r
+        _GLEE_SGIX_ycrcb_subsample = GL_TRUE;\r
+        __GLeeLink_GL_SGIX_ycrcb_subsample();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SGIX_ycrcba", &extensionNames) )\r
+    {\r
+        _GLEE_SGIX_ycrcba = GL_TRUE;\r
+        __GLeeLink_GL_SGIX_ycrcba();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SGI_depth_pass_instrument", &extensionNames) )\r
+    {\r
+        _GLEE_SGI_depth_pass_instrument = GL_TRUE;\r
+        __GLeeLink_GL_SGI_depth_pass_instrument();\r
+    }\r
+    if (__GLeeCheckExtension("GL_3DFX_texture_compression_FXT1", &extensionNames) )\r
+    {\r
+        _GLEE_3DFX_texture_compression_FXT1 = GL_TRUE;\r
+        __GLeeLink_GL_3DFX_texture_compression_FXT1();\r
+    }\r
+    if (__GLeeCheckExtension("GL_3DFX_multisample", &extensionNames) )\r
+    {\r
+        _GLEE_3DFX_multisample = GL_TRUE;\r
+        __GLeeLink_GL_3DFX_multisample();\r
+    }\r
+    if (__GLeeCheckExtension("GL_3DFX_tbuffer", &extensionNames) )\r
+    {\r
+        _GLEE_3DFX_tbuffer = GL_TRUE;\r
+        __GLeeLink_GL_3DFX_tbuffer();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_multisample", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_multisample = GL_TRUE;\r
+        __GLeeLink_GL_EXT_multisample();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SGIX_vertex_preclip", &extensionNames) )\r
+    {\r
+        _GLEE_SGIX_vertex_preclip = GL_TRUE;\r
+        __GLeeLink_GL_SGIX_vertex_preclip();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SGIX_convolution_accuracy", &extensionNames) )\r
+    {\r
+        _GLEE_SGIX_convolution_accuracy = GL_TRUE;\r
+        __GLeeLink_GL_SGIX_convolution_accuracy();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SGIX_resample", &extensionNames) )\r
+    {\r
+        _GLEE_SGIX_resample = GL_TRUE;\r
+        __GLeeLink_GL_SGIX_resample();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SGIS_point_line_texgen", &extensionNames) )\r
+    {\r
+        _GLEE_SGIS_point_line_texgen = GL_TRUE;\r
+        __GLeeLink_GL_SGIS_point_line_texgen();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SGIS_texture_color_mask", &extensionNames) )\r
+    {\r
+        _GLEE_SGIS_texture_color_mask = GL_TRUE;\r
+        __GLeeLink_GL_SGIS_texture_color_mask();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_texture_env_dot3", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_texture_env_dot3 = GL_TRUE;\r
+        __GLeeLink_GL_EXT_texture_env_dot3();\r
+    }\r
+    if (__GLeeCheckExtension("GL_ATI_texture_mirror_once", &extensionNames) )\r
+    {\r
+        _GLEE_ATI_texture_mirror_once = GL_TRUE;\r
+        __GLeeLink_GL_ATI_texture_mirror_once();\r
+    }\r
+    if (__GLeeCheckExtension("GL_NV_fence", &extensionNames) )\r
+    {\r
+        _GLEE_NV_fence = GL_TRUE;\r
+        __GLeeLink_GL_NV_fence();\r
+    }\r
+    if (__GLeeCheckExtension("GL_IBM_texture_mirrored_repeat", &extensionNames) )\r
+    {\r
+        _GLEE_IBM_texture_mirrored_repeat = GL_TRUE;\r
+        __GLeeLink_GL_IBM_texture_mirrored_repeat();\r
+    }\r
+    if (__GLeeCheckExtension("GL_NV_evaluators", &extensionNames) )\r
+    {\r
+        _GLEE_NV_evaluators = GL_TRUE;\r
+        __GLeeLink_GL_NV_evaluators();\r
+    }\r
+    if (__GLeeCheckExtension("GL_NV_packed_depth_stencil", &extensionNames) )\r
+    {\r
+        _GLEE_NV_packed_depth_stencil = GL_TRUE;\r
+        __GLeeLink_GL_NV_packed_depth_stencil();\r
+    }\r
+    if (__GLeeCheckExtension("GL_NV_register_combiners2", &extensionNames) )\r
+    {\r
+        _GLEE_NV_register_combiners2 = GL_TRUE;\r
+        __GLeeLink_GL_NV_register_combiners2();\r
+    }\r
+    if (__GLeeCheckExtension("GL_NV_texture_compression_vtc", &extensionNames) )\r
+    {\r
+        _GLEE_NV_texture_compression_vtc = GL_TRUE;\r
+        __GLeeLink_GL_NV_texture_compression_vtc();\r
+    }\r
+    if (__GLeeCheckExtension("GL_NV_texture_rectangle", &extensionNames) )\r
+    {\r
+        _GLEE_NV_texture_rectangle = GL_TRUE;\r
+        __GLeeLink_GL_NV_texture_rectangle();\r
+    }\r
+    if (__GLeeCheckExtension("GL_NV_texture_shader", &extensionNames) )\r
+    {\r
+        _GLEE_NV_texture_shader = GL_TRUE;\r
+        __GLeeLink_GL_NV_texture_shader();\r
+    }\r
+    if (__GLeeCheckExtension("GL_NV_texture_shader2", &extensionNames) )\r
+    {\r
+        _GLEE_NV_texture_shader2 = GL_TRUE;\r
+        __GLeeLink_GL_NV_texture_shader2();\r
+    }\r
+    if (__GLeeCheckExtension("GL_NV_vertex_array_range2", &extensionNames) )\r
+    {\r
+        _GLEE_NV_vertex_array_range2 = GL_TRUE;\r
+        __GLeeLink_GL_NV_vertex_array_range2();\r
+    }\r
+    if (__GLeeCheckExtension("GL_NV_vertex_program", &extensionNames) )\r
+    {\r
+        _GLEE_NV_vertex_program = GL_TRUE;\r
+        __GLeeLink_GL_NV_vertex_program();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SGIX_texture_coordinate_clamp", &extensionNames) )\r
+    {\r
+        _GLEE_SGIX_texture_coordinate_clamp = GL_TRUE;\r
+        __GLeeLink_GL_SGIX_texture_coordinate_clamp();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SGIX_scalebias_hint", &extensionNames) )\r
+    {\r
+        _GLEE_SGIX_scalebias_hint = GL_TRUE;\r
+        __GLeeLink_GL_SGIX_scalebias_hint();\r
+    }\r
+    if (__GLeeCheckExtension("GL_OML_interlace", &extensionNames) )\r
+    {\r
+        _GLEE_OML_interlace = GL_TRUE;\r
+        __GLeeLink_GL_OML_interlace();\r
+    }\r
+    if (__GLeeCheckExtension("GL_OML_subsample", &extensionNames) )\r
+    {\r
+        _GLEE_OML_subsample = GL_TRUE;\r
+        __GLeeLink_GL_OML_subsample();\r
+    }\r
+    if (__GLeeCheckExtension("GL_OML_resample", &extensionNames) )\r
+    {\r
+        _GLEE_OML_resample = GL_TRUE;\r
+        __GLeeLink_GL_OML_resample();\r
+    }\r
+    if (__GLeeCheckExtension("GL_NV_copy_depth_to_color", &extensionNames) )\r
+    {\r
+        _GLEE_NV_copy_depth_to_color = GL_TRUE;\r
+        __GLeeLink_GL_NV_copy_depth_to_color();\r
+    }\r
+    if (__GLeeCheckExtension("GL_ATI_envmap_bumpmap", &extensionNames) )\r
+    {\r
+        _GLEE_ATI_envmap_bumpmap = GL_TRUE;\r
+        __GLeeLink_GL_ATI_envmap_bumpmap();\r
+    }\r
+    if (__GLeeCheckExtension("GL_ATI_fragment_shader", &extensionNames) )\r
+    {\r
+        _GLEE_ATI_fragment_shader = GL_TRUE;\r
+        __GLeeLink_GL_ATI_fragment_shader();\r
+    }\r
+    if (__GLeeCheckExtension("GL_ATI_pn_triangles", &extensionNames) )\r
+    {\r
+        _GLEE_ATI_pn_triangles = GL_TRUE;\r
+        __GLeeLink_GL_ATI_pn_triangles();\r
+    }\r
+    if (__GLeeCheckExtension("GL_ATI_vertex_array_object", &extensionNames) )\r
+    {\r
+        _GLEE_ATI_vertex_array_object = GL_TRUE;\r
+        __GLeeLink_GL_ATI_vertex_array_object();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_vertex_shader", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_vertex_shader = GL_TRUE;\r
+        __GLeeLink_GL_EXT_vertex_shader();\r
+    }\r
+    if (__GLeeCheckExtension("GL_ATI_vertex_streams", &extensionNames) )\r
+    {\r
+        _GLEE_ATI_vertex_streams = GL_TRUE;\r
+        __GLeeLink_GL_ATI_vertex_streams();\r
+    }\r
+    if (__GLeeCheckExtension("GL_ATI_element_array", &extensionNames) )\r
+    {\r
+        _GLEE_ATI_element_array = GL_TRUE;\r
+        __GLeeLink_GL_ATI_element_array();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SUN_mesh_array", &extensionNames) )\r
+    {\r
+        _GLEE_SUN_mesh_array = GL_TRUE;\r
+        __GLeeLink_GL_SUN_mesh_array();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SUN_slice_accum", &extensionNames) )\r
+    {\r
+        _GLEE_SUN_slice_accum = GL_TRUE;\r
+        __GLeeLink_GL_SUN_slice_accum();\r
+    }\r
+    if (__GLeeCheckExtension("GL_NV_multisample_filter_hint", &extensionNames) )\r
+    {\r
+        _GLEE_NV_multisample_filter_hint = GL_TRUE;\r
+        __GLeeLink_GL_NV_multisample_filter_hint();\r
+    }\r
+    if (__GLeeCheckExtension("GL_NV_depth_clamp", &extensionNames) )\r
+    {\r
+        _GLEE_NV_depth_clamp = GL_TRUE;\r
+        __GLeeLink_GL_NV_depth_clamp();\r
+    }\r
+    if (__GLeeCheckExtension("GL_NV_occlusion_query", &extensionNames) )\r
+    {\r
+        _GLEE_NV_occlusion_query = GL_TRUE;\r
+        __GLeeLink_GL_NV_occlusion_query();\r
+    }\r
+    if (__GLeeCheckExtension("GL_NV_point_sprite", &extensionNames) )\r
+    {\r
+        _GLEE_NV_point_sprite = GL_TRUE;\r
+        __GLeeLink_GL_NV_point_sprite();\r
+    }\r
+    if (__GLeeCheckExtension("GL_NV_texture_shader3", &extensionNames) )\r
+    {\r
+        _GLEE_NV_texture_shader3 = GL_TRUE;\r
+        __GLeeLink_GL_NV_texture_shader3();\r
+    }\r
+    if (__GLeeCheckExtension("GL_NV_vertex_program1_1", &extensionNames) )\r
+    {\r
+        _GLEE_NV_vertex_program1_1 = GL_TRUE;\r
+        __GLeeLink_GL_NV_vertex_program1_1();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_shadow_funcs", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_shadow_funcs = GL_TRUE;\r
+        __GLeeLink_GL_EXT_shadow_funcs();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_stencil_two_side", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_stencil_two_side = GL_TRUE;\r
+        __GLeeLink_GL_EXT_stencil_two_side();\r
+    }\r
+    if (__GLeeCheckExtension("GL_ATI_text_fragment_shader", &extensionNames) )\r
+    {\r
+        _GLEE_ATI_text_fragment_shader = GL_TRUE;\r
+        __GLeeLink_GL_ATI_text_fragment_shader();\r
+    }\r
+    if (__GLeeCheckExtension("GL_APPLE_client_storage", &extensionNames) )\r
+    {\r
+        _GLEE_APPLE_client_storage = GL_TRUE;\r
+        __GLeeLink_GL_APPLE_client_storage();\r
+    }\r
+    if (__GLeeCheckExtension("GL_APPLE_element_array", &extensionNames) )\r
+    {\r
+        _GLEE_APPLE_element_array = GL_TRUE;\r
+        __GLeeLink_GL_APPLE_element_array();\r
+    }\r
+    if (__GLeeCheckExtension("GL_APPLE_fence", &extensionNames) )\r
+    {\r
+        _GLEE_APPLE_fence = GL_TRUE;\r
+        __GLeeLink_GL_APPLE_fence();\r
+    }\r
+    if (__GLeeCheckExtension("GL_APPLE_vertex_array_object", &extensionNames) )\r
+    {\r
+        _GLEE_APPLE_vertex_array_object = GL_TRUE;\r
+        __GLeeLink_GL_APPLE_vertex_array_object();\r
+    }\r
+    if (__GLeeCheckExtension("GL_APPLE_vertex_array_range", &extensionNames) )\r
+    {\r
+        _GLEE_APPLE_vertex_array_range = GL_TRUE;\r
+        __GLeeLink_GL_APPLE_vertex_array_range();\r
+    }\r
+    if (__GLeeCheckExtension("GL_APPLE_ycbcr_422", &extensionNames) )\r
+    {\r
+        _GLEE_APPLE_ycbcr_422 = GL_TRUE;\r
+        __GLeeLink_GL_APPLE_ycbcr_422();\r
+    }\r
+    if (__GLeeCheckExtension("GL_S3_s3tc", &extensionNames) )\r
+    {\r
+        _GLEE_S3_s3tc = GL_TRUE;\r
+        __GLeeLink_GL_S3_s3tc();\r
+    }\r
+    if (__GLeeCheckExtension("GL_ATI_draw_buffers", &extensionNames) )\r
+    {\r
+        _GLEE_ATI_draw_buffers = GL_TRUE;\r
+        __GLeeLink_GL_ATI_draw_buffers();\r
+    }\r
+    if (__GLeeCheckExtension("GL_ATI_pixel_format_float", &extensionNames) )\r
+    {\r
+        _GLEE_ATI_pixel_format_float = GL_TRUE;\r
+        __GLeeLink_GL_ATI_pixel_format_float();\r
+    }\r
+    if (__GLeeCheckExtension("GL_ATI_texture_env_combine3", &extensionNames) )\r
+    {\r
+        _GLEE_ATI_texture_env_combine3 = GL_TRUE;\r
+        __GLeeLink_GL_ATI_texture_env_combine3();\r
+    }\r
+    if (__GLeeCheckExtension("GL_ATI_texture_float", &extensionNames) )\r
+    {\r
+        _GLEE_ATI_texture_float = GL_TRUE;\r
+        __GLeeLink_GL_ATI_texture_float();\r
+    }\r
+    if (__GLeeCheckExtension("GL_NV_float_buffer", &extensionNames) )\r
+    {\r
+        _GLEE_NV_float_buffer = GL_TRUE;\r
+        __GLeeLink_GL_NV_float_buffer();\r
+    }\r
+    if (__GLeeCheckExtension("GL_NV_fragment_program", &extensionNames) )\r
+    {\r
+        _GLEE_NV_fragment_program = GL_TRUE;\r
+        __GLeeLink_GL_NV_fragment_program();\r
+    }\r
+    if (__GLeeCheckExtension("GL_NV_half_float", &extensionNames) )\r
+    {\r
+        _GLEE_NV_half_float = GL_TRUE;\r
+        __GLeeLink_GL_NV_half_float();\r
+    }\r
+    if (__GLeeCheckExtension("GL_NV_pixel_data_range", &extensionNames) )\r
+    {\r
+        _GLEE_NV_pixel_data_range = GL_TRUE;\r
+        __GLeeLink_GL_NV_pixel_data_range();\r
+    }\r
+    if (__GLeeCheckExtension("GL_NV_primitive_restart", &extensionNames) )\r
+    {\r
+        _GLEE_NV_primitive_restart = GL_TRUE;\r
+        __GLeeLink_GL_NV_primitive_restart();\r
+    }\r
+    if (__GLeeCheckExtension("GL_NV_texture_expand_normal", &extensionNames) )\r
+    {\r
+        _GLEE_NV_texture_expand_normal = GL_TRUE;\r
+        __GLeeLink_GL_NV_texture_expand_normal();\r
+    }\r
+    if (__GLeeCheckExtension("GL_NV_vertex_program2", &extensionNames) )\r
+    {\r
+        _GLEE_NV_vertex_program2 = GL_TRUE;\r
+        __GLeeLink_GL_NV_vertex_program2();\r
+    }\r
+    if (__GLeeCheckExtension("GL_ATI_map_object_buffer", &extensionNames) )\r
+    {\r
+        _GLEE_ATI_map_object_buffer = GL_TRUE;\r
+        __GLeeLink_GL_ATI_map_object_buffer();\r
+    }\r
+    if (__GLeeCheckExtension("GL_ATI_separate_stencil", &extensionNames) )\r
+    {\r
+        _GLEE_ATI_separate_stencil = GL_TRUE;\r
+        __GLeeLink_GL_ATI_separate_stencil();\r
+    }\r
+    if (__GLeeCheckExtension("GL_ATI_vertex_attrib_array_object", &extensionNames) )\r
+    {\r
+        _GLEE_ATI_vertex_attrib_array_object = GL_TRUE;\r
+        __GLeeLink_GL_ATI_vertex_attrib_array_object();\r
+    }\r
+    if (__GLeeCheckExtension("GL_OES_read_format", &extensionNames) )\r
+    {\r
+        _GLEE_OES_read_format = GL_TRUE;\r
+        __GLeeLink_GL_OES_read_format();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_depth_bounds_test", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_depth_bounds_test = GL_TRUE;\r
+        __GLeeLink_GL_EXT_depth_bounds_test();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_texture_mirror_clamp", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_texture_mirror_clamp = GL_TRUE;\r
+        __GLeeLink_GL_EXT_texture_mirror_clamp();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_blend_equation_separate", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_blend_equation_separate = GL_TRUE;\r
+        __GLeeLink_GL_EXT_blend_equation_separate();\r
+    }\r
+    if (__GLeeCheckExtension("GL_MESA_pack_invert", &extensionNames) )\r
+    {\r
+        _GLEE_MESA_pack_invert = GL_TRUE;\r
+        __GLeeLink_GL_MESA_pack_invert();\r
+    }\r
+    if (__GLeeCheckExtension("GL_MESA_ycbcr_texture", &extensionNames) )\r
+    {\r
+        _GLEE_MESA_ycbcr_texture = GL_TRUE;\r
+        __GLeeLink_GL_MESA_ycbcr_texture();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_pixel_buffer_object", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_pixel_buffer_object = GL_TRUE;\r
+        __GLeeLink_GL_EXT_pixel_buffer_object();\r
+    }\r
+    if (__GLeeCheckExtension("GL_NV_fragment_program_option", &extensionNames) )\r
+    {\r
+        _GLEE_NV_fragment_program_option = GL_TRUE;\r
+        __GLeeLink_GL_NV_fragment_program_option();\r
+    }\r
+    if (__GLeeCheckExtension("GL_NV_fragment_program2", &extensionNames) )\r
+    {\r
+        _GLEE_NV_fragment_program2 = GL_TRUE;\r
+        __GLeeLink_GL_NV_fragment_program2();\r
+    }\r
+    if (__GLeeCheckExtension("GL_NV_vertex_program2_option", &extensionNames) )\r
+    {\r
+        _GLEE_NV_vertex_program2_option = GL_TRUE;\r
+        __GLeeLink_GL_NV_vertex_program2_option();\r
+    }\r
+    if (__GLeeCheckExtension("GL_NV_vertex_program3", &extensionNames) )\r
+    {\r
+        _GLEE_NV_vertex_program3 = GL_TRUE;\r
+        __GLeeLink_GL_NV_vertex_program3();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_framebuffer_object", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_framebuffer_object = GL_TRUE;\r
+        __GLeeLink_GL_EXT_framebuffer_object();\r
+    }\r
+    if (__GLeeCheckExtension("GL_GREMEDY_string_marker", &extensionNames) )\r
+    {\r
+        _GLEE_GREMEDY_string_marker = GL_TRUE;\r
+        __GLeeLink_GL_GREMEDY_string_marker();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_packed_depth_stencil", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_packed_depth_stencil = GL_TRUE;\r
+        __GLeeLink_GL_EXT_packed_depth_stencil();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_stencil_clear_tag", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_stencil_clear_tag = GL_TRUE;\r
+        __GLeeLink_GL_EXT_stencil_clear_tag();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_texture_sRGB", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_texture_sRGB = GL_TRUE;\r
+        __GLeeLink_GL_EXT_texture_sRGB();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_framebuffer_blit", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_framebuffer_blit = GL_TRUE;\r
+        __GLeeLink_GL_EXT_framebuffer_blit();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_framebuffer_multisample", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_framebuffer_multisample = GL_TRUE;\r
+        __GLeeLink_GL_EXT_framebuffer_multisample();\r
+    }\r
+    if (__GLeeCheckExtension("GL_MESAX_texture_stack", &extensionNames) )\r
+    {\r
+        _GLEE_MESAX_texture_stack = GL_TRUE;\r
+        __GLeeLink_GL_MESAX_texture_stack();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_timer_query", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_timer_query = GL_TRUE;\r
+        __GLeeLink_GL_EXT_timer_query();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_gpu_program_parameters", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_gpu_program_parameters = GL_TRUE;\r
+        __GLeeLink_GL_EXT_gpu_program_parameters();\r
+    }\r
+    if (__GLeeCheckExtension("GL_APPLE_flush_buffer_range", &extensionNames) )\r
+    {\r
+        _GLEE_APPLE_flush_buffer_range = GL_TRUE;\r
+        __GLeeLink_GL_APPLE_flush_buffer_range();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_gpu_shader4", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_gpu_shader4 = GL_TRUE;\r
+        __GLeeLink_GL_EXT_gpu_shader4();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_draw_instanced", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_draw_instanced = GL_TRUE;\r
+        __GLeeLink_GL_EXT_draw_instanced();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_packed_float", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_packed_float = GL_TRUE;\r
+        __GLeeLink_GL_EXT_packed_float();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_texture_array", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_texture_array = GL_TRUE;\r
+        __GLeeLink_GL_EXT_texture_array();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_texture_buffer_object", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_texture_buffer_object = GL_TRUE;\r
+        __GLeeLink_GL_EXT_texture_buffer_object();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_texture_compression_latc", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_texture_compression_latc = GL_TRUE;\r
+        __GLeeLink_GL_EXT_texture_compression_latc();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_texture_compression_rgtc", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_texture_compression_rgtc = GL_TRUE;\r
+        __GLeeLink_GL_EXT_texture_compression_rgtc();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_texture_shared_exponent", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_texture_shared_exponent = GL_TRUE;\r
+        __GLeeLink_GL_EXT_texture_shared_exponent();\r
+    }\r
+    if (__GLeeCheckExtension("GL_NV_depth_buffer_float", &extensionNames) )\r
+    {\r
+        _GLEE_NV_depth_buffer_float = GL_TRUE;\r
+        __GLeeLink_GL_NV_depth_buffer_float();\r
+    }\r
+    if (__GLeeCheckExtension("GL_NV_framebuffer_multisample_coverage", &extensionNames) )\r
+    {\r
+        _GLEE_NV_framebuffer_multisample_coverage = GL_TRUE;\r
+        __GLeeLink_GL_NV_framebuffer_multisample_coverage();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_framebuffer_sRGB", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_framebuffer_sRGB = GL_TRUE;\r
+        __GLeeLink_GL_EXT_framebuffer_sRGB();\r
+    }\r
+    if (__GLeeCheckExtension("GL_NV_geometry_shader4", &extensionNames) )\r
+    {\r
+        _GLEE_NV_geometry_shader4 = GL_TRUE;\r
+        __GLeeLink_GL_NV_geometry_shader4();\r
+    }\r
+    if (__GLeeCheckExtension("GL_NV_parameter_buffer_object", &extensionNames) )\r
+    {\r
+        _GLEE_NV_parameter_buffer_object = GL_TRUE;\r
+        __GLeeLink_GL_NV_parameter_buffer_object();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_draw_buffers2", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_draw_buffers2 = GL_TRUE;\r
+        __GLeeLink_GL_EXT_draw_buffers2();\r
+    }\r
+    if (__GLeeCheckExtension("GL_NV_transform_feedback", &extensionNames) )\r
+    {\r
+        _GLEE_NV_transform_feedback = GL_TRUE;\r
+        __GLeeLink_GL_NV_transform_feedback();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_bindable_uniform", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_bindable_uniform = GL_TRUE;\r
+        __GLeeLink_GL_EXT_bindable_uniform();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_texture_integer", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_texture_integer = GL_TRUE;\r
+        __GLeeLink_GL_EXT_texture_integer();\r
+    }\r
+    if (__GLeeCheckExtension("GL_GREMEDY_frame_terminator", &extensionNames) )\r
+    {\r
+        _GLEE_GREMEDY_frame_terminator = GL_TRUE;\r
+        __GLeeLink_GL_GREMEDY_frame_terminator();\r
+    }\r
+    if (__GLeeCheckExtension("GL_NV_conditional_render", &extensionNames) )\r
+    {\r
+        _GLEE_NV_conditional_render = GL_TRUE;\r
+        __GLeeLink_GL_NV_conditional_render();\r
+    }\r
+    if (__GLeeCheckExtension("GL_NV_present_video", &extensionNames) )\r
+    {\r
+        _GLEE_NV_present_video = GL_TRUE;\r
+        __GLeeLink_GL_NV_present_video();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_transform_feedback", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_transform_feedback = GL_TRUE;\r
+        __GLeeLink_GL_EXT_transform_feedback();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_direct_state_access", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_direct_state_access = GL_TRUE;\r
+        __GLeeLink_GL_EXT_direct_state_access();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_vertex_array_bgra", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_vertex_array_bgra = GL_TRUE;\r
+        __GLeeLink_GL_EXT_vertex_array_bgra();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_texture_swizzle", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_texture_swizzle = GL_TRUE;\r
+        __GLeeLink_GL_EXT_texture_swizzle();\r
+    }\r
+    if (__GLeeCheckExtension("GL_NV_explicit_multisample", &extensionNames) )\r
+    {\r
+        _GLEE_NV_explicit_multisample = GL_TRUE;\r
+        __GLeeLink_GL_NV_explicit_multisample();\r
+    }\r
+    if (__GLeeCheckExtension("GL_NV_transform_feedback2", &extensionNames) )\r
+    {\r
+        _GLEE_NV_transform_feedback2 = GL_TRUE;\r
+        __GLeeLink_GL_NV_transform_feedback2();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SGIX_texture_select", &extensionNames) )\r
+    {\r
+        _GLEE_SGIX_texture_select = GL_TRUE;\r
+        __GLeeLink_GL_SGIX_texture_select();\r
+    }\r
+    if (__GLeeCheckExtension("GL_INGR_blend_func_separate", &extensionNames) )\r
+    {\r
+        _GLEE_INGR_blend_func_separate = GL_TRUE;\r
+        __GLeeLink_GL_INGR_blend_func_separate();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SGIX_depth_pass_instrument", &extensionNames) )\r
+    {\r
+        _GLEE_SGIX_depth_pass_instrument = GL_TRUE;\r
+        __GLeeLink_GL_SGIX_depth_pass_instrument();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SGIX_igloo_interface", &extensionNames) )\r
+    {\r
+        _GLEE_SGIX_igloo_interface = GL_TRUE;\r
+        __GLeeLink_GL_SGIX_igloo_interface();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_fragment_lighting", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_fragment_lighting = GL_TRUE;\r
+        __GLeeLink_GL_EXT_fragment_lighting();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_geometry_shader4", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_geometry_shader4 = GL_TRUE;\r
+        __GLeeLink_GL_EXT_geometry_shader4();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_scene_marker", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_scene_marker = GL_TRUE;\r
+        __GLeeLink_GL_EXT_scene_marker();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_texture_compression_dxt1", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_texture_compression_dxt1 = GL_TRUE;\r
+        __GLeeLink_GL_EXT_texture_compression_dxt1();\r
+    }\r
+    if (__GLeeCheckExtension("GL_EXT_texture_env", &extensionNames) )\r
+    {\r
+        _GLEE_EXT_texture_env = GL_TRUE;\r
+        __GLeeLink_GL_EXT_texture_env();\r
+    }\r
+    if (__GLeeCheckExtension("GL_IBM_static_data", &extensionNames) )\r
+    {\r
+        _GLEE_IBM_static_data = GL_TRUE;\r
+        __GLeeLink_GL_IBM_static_data();\r
+    }\r
+    if (__GLeeCheckExtension("GL_NV_gpu_program4", &extensionNames) )\r
+    {\r
+        _GLEE_NV_gpu_program4 = GL_TRUE;\r
+        __GLeeLink_GL_NV_gpu_program4();\r
+    }\r
+    if (__GLeeCheckExtension("GL_OES_byte_coordinates", &extensionNames) )\r
+    {\r
+        _GLEE_OES_byte_coordinates = GL_TRUE;\r
+        __GLeeLink_GL_OES_byte_coordinates();\r
+    }\r
+    if (__GLeeCheckExtension("GL_OES_compressed_paletted_texture", &extensionNames) )\r
+    {\r
+        _GLEE_OES_compressed_paletted_texture = GL_TRUE;\r
+        __GLeeLink_GL_OES_compressed_paletted_texture();\r
+    }\r
+    if (__GLeeCheckExtension("GL_OES_single_precision", &extensionNames) )\r
+    {\r
+        _GLEE_OES_single_precision = GL_TRUE;\r
+        __GLeeLink_GL_OES_single_precision();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SGIX_pixel_texture_bits", &extensionNames) )\r
+    {\r
+        _GLEE_SGIX_pixel_texture_bits = GL_TRUE;\r
+        __GLeeLink_GL_SGIX_pixel_texture_bits();\r
+    }\r
+    if (__GLeeCheckExtension("GL_SGIX_texture_range", &extensionNames) )\r
+    {\r
+        _GLEE_SGIX_texture_range = GL_TRUE;\r
+        __GLeeLink_GL_SGIX_texture_range();\r
+    }\r
+#ifdef WIN32\r
+    if (__GLeeCheckExtension("WGL_ARB_buffer_region", &extensionNames) )\r
+    {\r
+        _GLEE_WGL_ARB_buffer_region = GL_TRUE;\r
+        __GLeeLink_WGL_ARB_buffer_region();\r
+    }\r
+    if (__GLeeCheckExtension("WGL_ARB_multisample", &extensionNames) )\r
+    {\r
+        _GLEE_WGL_ARB_multisample = GL_TRUE;\r
+        __GLeeLink_WGL_ARB_multisample();\r
+    }\r
+    if (__GLeeCheckExtension("WGL_ARB_extensions_string", &extensionNames) )\r
+    {\r
+        _GLEE_WGL_ARB_extensions_string = GL_TRUE;\r
+        __GLeeLink_WGL_ARB_extensions_string();\r
+    }\r
+    if (__GLeeCheckExtension("WGL_ARB_pixel_format", &extensionNames) )\r
+    {\r
+        _GLEE_WGL_ARB_pixel_format = GL_TRUE;\r
+        __GLeeLink_WGL_ARB_pixel_format();\r
+    }\r
+    if (__GLeeCheckExtension("WGL_ARB_make_current_read", &extensionNames) )\r
+    {\r
+        _GLEE_WGL_ARB_make_current_read = GL_TRUE;\r
+        __GLeeLink_WGL_ARB_make_current_read();\r
+    }\r
+    if (__GLeeCheckExtension("WGL_ARB_pbuffer", &extensionNames) )\r
+    {\r
+        _GLEE_WGL_ARB_pbuffer = GL_TRUE;\r
+        __GLeeLink_WGL_ARB_pbuffer();\r
+    }\r
+    if (__GLeeCheckExtension("WGL_ARB_render_texture", &extensionNames) )\r
+    {\r
+        _GLEE_WGL_ARB_render_texture = GL_TRUE;\r
+        __GLeeLink_WGL_ARB_render_texture();\r
+    }\r
+    if (__GLeeCheckExtension("WGL_ARB_pixel_format_float", &extensionNames) )\r
+    {\r
+        _GLEE_WGL_ARB_pixel_format_float = GL_TRUE;\r
+        __GLeeLink_WGL_ARB_pixel_format_float();\r
+    }\r
+    if (__GLeeCheckExtension("WGL_ARB_create_context", &extensionNames) )\r
+    {\r
+        _GLEE_WGL_ARB_create_context = GL_TRUE;\r
+        __GLeeLink_WGL_ARB_create_context();\r
+    }\r
+    if (__GLeeCheckExtension("WGL_EXT_make_current_read", &extensionNames) )\r
+    {\r
+        _GLEE_WGL_EXT_make_current_read = GL_TRUE;\r
+        __GLeeLink_WGL_EXT_make_current_read();\r
+    }\r
+    if (__GLeeCheckExtension("WGL_EXT_pixel_format", &extensionNames) )\r
+    {\r
+        _GLEE_WGL_EXT_pixel_format = GL_TRUE;\r
+        __GLeeLink_WGL_EXT_pixel_format();\r
+    }\r
+    if (__GLeeCheckExtension("WGL_EXT_pbuffer", &extensionNames) )\r
+    {\r
+        _GLEE_WGL_EXT_pbuffer = GL_TRUE;\r
+        __GLeeLink_WGL_EXT_pbuffer();\r
+    }\r
+    if (__GLeeCheckExtension("WGL_EXT_depth_float", &extensionNames) )\r
+    {\r
+        _GLEE_WGL_EXT_depth_float = GL_TRUE;\r
+        __GLeeLink_WGL_EXT_depth_float();\r
+    }\r
+    if (__GLeeCheckExtension("WGL_3DFX_multisample", &extensionNames) )\r
+    {\r
+        _GLEE_WGL_3DFX_multisample = GL_TRUE;\r
+        __GLeeLink_WGL_3DFX_multisample();\r
+    }\r
+    if (__GLeeCheckExtension("WGL_EXT_multisample", &extensionNames) )\r
+    {\r
+        _GLEE_WGL_EXT_multisample = GL_TRUE;\r
+        __GLeeLink_WGL_EXT_multisample();\r
+    }\r
+    if (__GLeeCheckExtension("WGL_I3D_digital_video_control", &extensionNames) )\r
+    {\r
+        _GLEE_WGL_I3D_digital_video_control = GL_TRUE;\r
+        __GLeeLink_WGL_I3D_digital_video_control();\r
+    }\r
+    if (__GLeeCheckExtension("WGL_I3D_gamma", &extensionNames) )\r
+    {\r
+        _GLEE_WGL_I3D_gamma = GL_TRUE;\r
+        __GLeeLink_WGL_I3D_gamma();\r
+    }\r
+    if (__GLeeCheckExtension("WGL_I3D_genlock", &extensionNames) )\r
+    {\r
+        _GLEE_WGL_I3D_genlock = GL_TRUE;\r
+        __GLeeLink_WGL_I3D_genlock();\r
+    }\r
+    if (__GLeeCheckExtension("WGL_I3D_image_buffer", &extensionNames) )\r
+    {\r
+        _GLEE_WGL_I3D_image_buffer = GL_TRUE;\r
+        __GLeeLink_WGL_I3D_image_buffer();\r
+    }\r
+    if (__GLeeCheckExtension("WGL_I3D_swap_frame_lock", &extensionNames) )\r
+    {\r
+        _GLEE_WGL_I3D_swap_frame_lock = GL_TRUE;\r
+        __GLeeLink_WGL_I3D_swap_frame_lock();\r
+    }\r
+    if (__GLeeCheckExtension("WGL_NV_render_depth_texture", &extensionNames) )\r
+    {\r
+        _GLEE_WGL_NV_render_depth_texture = GL_TRUE;\r
+        __GLeeLink_WGL_NV_render_depth_texture();\r
+    }\r
+    if (__GLeeCheckExtension("WGL_NV_render_texture_rectangle", &extensionNames) )\r
+    {\r
+        _GLEE_WGL_NV_render_texture_rectangle = GL_TRUE;\r
+        __GLeeLink_WGL_NV_render_texture_rectangle();\r
+    }\r
+    if (__GLeeCheckExtension("WGL_ATI_pixel_format_float", &extensionNames) )\r
+    {\r
+        _GLEE_WGL_ATI_pixel_format_float = GL_TRUE;\r
+        __GLeeLink_WGL_ATI_pixel_format_float();\r
+    }\r
+    if (__GLeeCheckExtension("WGL_NV_float_buffer", &extensionNames) )\r
+    {\r
+        _GLEE_WGL_NV_float_buffer = GL_TRUE;\r
+        __GLeeLink_WGL_NV_float_buffer();\r
+    }\r
+    if (__GLeeCheckExtension("WGL_3DL_stereo_control", &extensionNames) )\r
+    {\r
+        _GLEE_WGL_3DL_stereo_control = GL_TRUE;\r
+        __GLeeLink_WGL_3DL_stereo_control();\r
+    }\r
+    if (__GLeeCheckExtension("WGL_EXT_pixel_format_packed_float", &extensionNames) )\r
+    {\r
+        _GLEE_WGL_EXT_pixel_format_packed_float = GL_TRUE;\r
+        __GLeeLink_WGL_EXT_pixel_format_packed_float();\r
+    }\r
+    if (__GLeeCheckExtension("WGL_EXT_framebuffer_sRGB", &extensionNames) )\r
+    {\r
+        _GLEE_WGL_EXT_framebuffer_sRGB = GL_TRUE;\r
+        __GLeeLink_WGL_EXT_framebuffer_sRGB();\r
+    }\r
+    if (__GLeeCheckExtension("WGL_NV_present_video", &extensionNames) )\r
+    {\r
+        _GLEE_WGL_NV_present_video = GL_TRUE;\r
+        __GLeeLink_WGL_NV_present_video();\r
+    }\r
+    if (__GLeeCheckExtension("WGL_NV_swap_group", &extensionNames) )\r
+    {\r
+        _GLEE_WGL_NV_swap_group = GL_TRUE;\r
+        __GLeeLink_WGL_NV_swap_group();\r
+    }\r
+    if (__GLeeCheckExtension("WGL_NV_gpu_affinity", &extensionNames) )\r
+    {\r
+        _GLEE_WGL_NV_gpu_affinity = GL_TRUE;\r
+        __GLeeLink_WGL_NV_gpu_affinity();\r
+    }\r
+    if (__GLeeCheckExtension("WGL_EXT_display_color_table", &extensionNames) )\r
+    {\r
+        _GLEE_WGL_EXT_display_color_table = GL_TRUE;\r
+        __GLeeLink_WGL_EXT_display_color_table();\r
+    }\r
+    if (__GLeeCheckExtension("WGL_EXT_extensions_string", &extensionNames) )\r
+    {\r
+        _GLEE_WGL_EXT_extensions_string = GL_TRUE;\r
+        __GLeeLink_WGL_EXT_extensions_string();\r
+    }\r
+    if (__GLeeCheckExtension("WGL_EXT_swap_control", &extensionNames) )\r
+    {\r
+        _GLEE_WGL_EXT_swap_control = GL_TRUE;\r
+        __GLeeLink_WGL_EXT_swap_control();\r
+    }\r
+    if (__GLeeCheckExtension("WGL_NV_vertex_array_range", &extensionNames) )\r
+    {\r
+        _GLEE_WGL_NV_vertex_array_range = GL_TRUE;\r
+        __GLeeLink_WGL_NV_vertex_array_range();\r
+    }\r
+    if (__GLeeCheckExtension("WGL_OML_sync_control", &extensionNames) )\r
+    {\r
+        _GLEE_WGL_OML_sync_control = GL_TRUE;\r
+        __GLeeLink_WGL_OML_sync_control();\r
+    }\r
+    if (__GLeeCheckExtension("WGL_I3D_swap_frame_usage", &extensionNames) )\r
+    {\r
+        _GLEE_WGL_I3D_swap_frame_usage = GL_TRUE;\r
+        __GLeeLink_WGL_I3D_swap_frame_usage();\r
+    }\r
+    if (__GLeeCheckExtension("WGL_NV_video_output", &extensionNames) )\r
+    {\r
+        _GLEE_WGL_NV_video_output = GL_TRUE;\r
+        __GLeeLink_WGL_NV_video_output();\r
+    }\r
+#elif defined(__APPLE__) || defined(__APPLE_CC__)\r
+#else /* GLX */\r
+    if (__GLeeCheckExtension("GLX_VERSION_1_3", &extensionNames) )\r
+    {\r
+        _GLEE_GLX_VERSION_1_3 = GL_TRUE;\r
+        __GLeeLink_GLX_VERSION_1_3();\r
+    }\r
+    if (__GLeeCheckExtension("GLX_VERSION_1_4", &extensionNames) )\r
+    {\r
+        _GLEE_GLX_VERSION_1_4 = GL_TRUE;\r
+        __GLeeLink_GLX_VERSION_1_4();\r
+    }\r
+    if (__GLeeCheckExtension("GLX_ARB_multisample", &extensionNames) )\r
+    {\r
+        _GLEE_GLX_ARB_multisample = GL_TRUE;\r
+        __GLeeLink_GLX_ARB_multisample();\r
+    }\r
+    if (__GLeeCheckExtension("GLX_ARB_fbconfig_float", &extensionNames) )\r
+    {\r
+        _GLEE_GLX_ARB_fbconfig_float = GL_TRUE;\r
+        __GLeeLink_GLX_ARB_fbconfig_float();\r
+    }\r
+    if (__GLeeCheckExtension("GLX_ARB_create_context", &extensionNames) )\r
+    {\r
+        _GLEE_GLX_ARB_create_context = GL_TRUE;\r
+        __GLeeLink_GLX_ARB_create_context();\r
+    }\r
+    if (__GLeeCheckExtension("GLX_SGIS_multisample", &extensionNames) )\r
+    {\r
+        _GLEE_GLX_SGIS_multisample = GL_TRUE;\r
+        __GLeeLink_GLX_SGIS_multisample();\r
+    }\r
+    if (__GLeeCheckExtension("GLX_EXT_visual_info", &extensionNames) )\r
+    {\r
+        _GLEE_GLX_EXT_visual_info = GL_TRUE;\r
+        __GLeeLink_GLX_EXT_visual_info();\r
+    }\r
+    if (__GLeeCheckExtension("GLX_SGI_swap_control", &extensionNames) )\r
+    {\r
+        _GLEE_GLX_SGI_swap_control = GL_TRUE;\r
+        __GLeeLink_GLX_SGI_swap_control();\r
+    }\r
+    if (__GLeeCheckExtension("GLX_SGI_video_sync", &extensionNames) )\r
+    {\r
+        _GLEE_GLX_SGI_video_sync = GL_TRUE;\r
+        __GLeeLink_GLX_SGI_video_sync();\r
+    }\r
+    if (__GLeeCheckExtension("GLX_SGI_make_current_read", &extensionNames) )\r
+    {\r
+        _GLEE_GLX_SGI_make_current_read = GL_TRUE;\r
+        __GLeeLink_GLX_SGI_make_current_read();\r
+    }\r
+    if (__GLeeCheckExtension("GLX_EXT_visual_rating", &extensionNames) )\r
+    {\r
+        _GLEE_GLX_EXT_visual_rating = GL_TRUE;\r
+        __GLeeLink_GLX_EXT_visual_rating();\r
+    }\r
+    if (__GLeeCheckExtension("GLX_EXT_import_context", &extensionNames) )\r
+    {\r
+        _GLEE_GLX_EXT_import_context = GL_TRUE;\r
+        __GLeeLink_GLX_EXT_import_context();\r
+    }\r
+    if (__GLeeCheckExtension("GLX_SGIX_fbconfig", &extensionNames) )\r
+    {\r
+        _GLEE_GLX_SGIX_fbconfig = GL_TRUE;\r
+        __GLeeLink_GLX_SGIX_fbconfig();\r
+    }\r
+    if (__GLeeCheckExtension("GLX_SGIX_pbuffer", &extensionNames) )\r
+    {\r
+        _GLEE_GLX_SGIX_pbuffer = GL_TRUE;\r
+        __GLeeLink_GLX_SGIX_pbuffer();\r
+    }\r
+    if (__GLeeCheckExtension("GLX_SGI_cushion", &extensionNames) )\r
+    {\r
+        _GLEE_GLX_SGI_cushion = GL_TRUE;\r
+        __GLeeLink_GLX_SGI_cushion();\r
+    }\r
+    if (__GLeeCheckExtension("GLX_SGIX_video_resize", &extensionNames) )\r
+    {\r
+        _GLEE_GLX_SGIX_video_resize = GL_TRUE;\r
+        __GLeeLink_GLX_SGIX_video_resize();\r
+    }\r
+    if (__GLeeCheckExtension("GLX_SGIX_swap_group", &extensionNames) )\r
+    {\r
+        _GLEE_GLX_SGIX_swap_group = GL_TRUE;\r
+        __GLeeLink_GLX_SGIX_swap_group();\r
+    }\r
+    if (__GLeeCheckExtension("GLX_SGIX_swap_barrier", &extensionNames) )\r
+    {\r
+        _GLEE_GLX_SGIX_swap_barrier = GL_TRUE;\r
+        __GLeeLink_GLX_SGIX_swap_barrier();\r
+    }\r
+    if (__GLeeCheckExtension("GLX_SGIS_blended_overlay", &extensionNames) )\r
+    {\r
+        _GLEE_GLX_SGIS_blended_overlay = GL_TRUE;\r
+        __GLeeLink_GLX_SGIS_blended_overlay();\r
+    }\r
+    if (__GLeeCheckExtension("GLX_SGIS_shared_multisample", &extensionNames) )\r
+    {\r
+        _GLEE_GLX_SGIS_shared_multisample = GL_TRUE;\r
+        __GLeeLink_GLX_SGIS_shared_multisample();\r
+    }\r
+    if (__GLeeCheckExtension("GLX_SUN_get_transparent_index", &extensionNames) )\r
+    {\r
+        _GLEE_GLX_SUN_get_transparent_index = GL_TRUE;\r
+        __GLeeLink_GLX_SUN_get_transparent_index();\r
+    }\r
+    if (__GLeeCheckExtension("GLX_3DFX_multisample", &extensionNames) )\r
+    {\r
+        _GLEE_GLX_3DFX_multisample = GL_TRUE;\r
+        __GLeeLink_GLX_3DFX_multisample();\r
+    }\r
+    if (__GLeeCheckExtension("GLX_MESA_copy_sub_buffer", &extensionNames) )\r
+    {\r
+        _GLEE_GLX_MESA_copy_sub_buffer = GL_TRUE;\r
+        __GLeeLink_GLX_MESA_copy_sub_buffer();\r
+    }\r
+    if (__GLeeCheckExtension("GLX_MESA_pixmap_colormap", &extensionNames) )\r
+    {\r
+        _GLEE_GLX_MESA_pixmap_colormap = GL_TRUE;\r
+        __GLeeLink_GLX_MESA_pixmap_colormap();\r
+    }\r
+    if (__GLeeCheckExtension("GLX_MESA_release_buffers", &extensionNames) )\r
+    {\r
+        _GLEE_GLX_MESA_release_buffers = GL_TRUE;\r
+        __GLeeLink_GLX_MESA_release_buffers();\r
+    }\r
+    if (__GLeeCheckExtension("GLX_MESA_set_3dfx_mode", &extensionNames) )\r
+    {\r
+        _GLEE_GLX_MESA_set_3dfx_mode = GL_TRUE;\r
+        __GLeeLink_GLX_MESA_set_3dfx_mode();\r
+    }\r
+    if (__GLeeCheckExtension("GLX_SGIX_visual_select_group", &extensionNames) )\r
+    {\r
+        _GLEE_GLX_SGIX_visual_select_group = GL_TRUE;\r
+        __GLeeLink_GLX_SGIX_visual_select_group();\r
+    }\r
+    if (__GLeeCheckExtension("GLX_OML_swap_method", &extensionNames) )\r
+    {\r
+        _GLEE_GLX_OML_swap_method = GL_TRUE;\r
+        __GLeeLink_GLX_OML_swap_method();\r
+    }\r
+    if (__GLeeCheckExtension("GLX_OML_sync_control", &extensionNames) )\r
+    {\r
+        _GLEE_GLX_OML_sync_control = GL_TRUE;\r
+        __GLeeLink_GLX_OML_sync_control();\r
+    }\r
+    if (__GLeeCheckExtension("GLX_NV_float_buffer", &extensionNames) )\r
+    {\r
+        _GLEE_GLX_NV_float_buffer = GL_TRUE;\r
+        __GLeeLink_GLX_NV_float_buffer();\r
+    }\r
+    if (__GLeeCheckExtension("GLX_SGIX_hyperpipe", &extensionNames) )\r
+    {\r
+        _GLEE_GLX_SGIX_hyperpipe = GL_TRUE;\r
+        __GLeeLink_GLX_SGIX_hyperpipe();\r
+    }\r
+    if (__GLeeCheckExtension("GLX_MESA_agp_offset", &extensionNames) )\r
+    {\r
+        _GLEE_GLX_MESA_agp_offset = GL_TRUE;\r
+        __GLeeLink_GLX_MESA_agp_offset();\r
+    }\r
+    if (__GLeeCheckExtension("GLX_EXT_fbconfig_packed_float", &extensionNames) )\r
+    {\r
+        _GLEE_GLX_EXT_fbconfig_packed_float = GL_TRUE;\r
+        __GLeeLink_GLX_EXT_fbconfig_packed_float();\r
+    }\r
+    if (__GLeeCheckExtension("GLX_EXT_framebuffer_sRGB", &extensionNames) )\r
+    {\r
+        _GLEE_GLX_EXT_framebuffer_sRGB = GL_TRUE;\r
+        __GLeeLink_GLX_EXT_framebuffer_sRGB();\r
+    }\r
+    if (__GLeeCheckExtension("GLX_EXT_texture_from_pixmap", &extensionNames) )\r
+    {\r
+        _GLEE_GLX_EXT_texture_from_pixmap = GL_TRUE;\r
+        __GLeeLink_GLX_EXT_texture_from_pixmap();\r
+    }\r
+    if (__GLeeCheckExtension("GLX_NV_present_video", &extensionNames) )\r
+    {\r
+        _GLEE_GLX_NV_present_video = GL_TRUE;\r
+        __GLeeLink_GLX_NV_present_video();\r
+    }\r
+    if (__GLeeCheckExtension("GLX_NV_video_out", &extensionNames) )\r
+    {\r
+        _GLEE_GLX_NV_video_out = GL_TRUE;\r
+        __GLeeLink_GLX_NV_video_out();\r
+    }\r
+    if (__GLeeCheckExtension("GLX_NV_swap_group", &extensionNames) )\r
+    {\r
+        _GLEE_GLX_NV_swap_group = GL_TRUE;\r
+        __GLeeLink_GLX_NV_swap_group();\r
+    }\r
+    if (__GLeeCheckExtension("GLX_EXT_scene_marker", &extensionNames) )\r
+    {\r
+        _GLEE_GLX_EXT_scene_marker = GL_TRUE;\r
+        __GLeeLink_GLX_EXT_scene_marker();\r
+    }\r
+    if (__GLeeCheckExtension("GLX_NV_video_output", &extensionNames) )\r
+    {\r
+        _GLEE_GLX_NV_video_output = GL_TRUE;\r
+        __GLeeLink_GLX_NV_video_output();\r
+    }\r
+#endif /* end GLX */\r
+\r
+    __GLeeExtList_clean(&extensionNames);\r
+    return GL_TRUE;\r
+}\r
diff --git a/GLee5_4/GLee.h b/GLee5_4/GLee.h
new file mode 100644 (file)
index 0000000..c88dbc9
--- /dev/null
@@ -0,0 +1,17647 @@
+/***************************************************************************\r
+*\r
+* GLee.h \r
+* GLee (OpenGL Easy Extension library)        \r
+* Version : 5.4\r
+*\r
+* Copyright (c)2009  Ben Woodhouse  All rights reserved.\r
+*\r
+* Redistribution and use in source and binary forms, with or without\r
+* modification, are permitted provided that the following conditions are \r
+* met:\r
+* 1. Redistributions of source code must retain the above copyright\r
+* notice, this list of conditions and the following disclaimer as\r
+* the first lines of this file unmodified.\r
+* 2. Redistributions in binary form must reproduce the above copyright\r
+* notice, this list of conditions and the following disclaimer in the\r
+* documentation and/or other materials provided with the distribution.\r
+*\r
+* THIS SOFTWARE IS PROVIDED BY BEN WOODHOUSE ``AS IS'' AND ANY EXPRESS OR\r
+* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\r
+* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
+* IN NO EVENT SHALL BEN WOODHOUSE BE LIABLE FOR ANY DIRECT, INDIRECT,\r
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\r
+* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\r
+* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+\r
+* Web: http://elf-stone.com/glee.php\r
+*\r
+* [This file was automatically generated by GLeeGen 7.0\r
+*\r
+***************************************************************************/\r
+\r
+#ifndef __glee_h_\r
+#define __glee_h_\r
+\r
+#ifdef __gl_h_\r
+       #error gl.h included before glee.h\r
+#endif\r
+\r
+#ifdef __glext_h_\r
+       #error glext.h included before glee.h\r
+#endif\r
+\r
+#ifdef __wglext_h_\r
+       #error wglext.h included before glee.h\r
+#endif\r
+\r
+#ifdef __glxext_h_\r
+       #error glxext.h included before glee.h\r
+#endif\r
+\r
+#ifdef WIN32\r
+       #define WIN32_LEAN_AND_MEAN\r
+       #include <windows.h>\r
+       #include <GL/gl.h>\r
+#elif defined(__APPLE__) || defined(__APPLE_CC__)\r
+    #define GL_GLEXT_LEGACY\r
+       #include <OpenGL/gl.h>\r
+#else // GLX\r
+       #define __glext_h_  /* prevent glext.h from being included  */\r
+       #define __glxext_h_ /* prevent glxext.h from being included */\r
+       #define GLX_GLXEXT_PROTOTYPES\r
+       #include <GL/gl.h>\r
+       #include <GL/glx.h>\r
+#endif\r
+\r
+#ifndef APIENTRY\r
+       #define APIENTRY\r
+#endif\r
+\r
+#ifndef APIENTRYP\r
+       #define APIENTRYP APIENTRY *\r
+#endif\r
+\r
+#define GLEE_EXTERN extern\r
+\r
+#ifdef __cplusplus \r
+       extern "C" {            /* begin C linkage */\r
+#endif\r
+\r
+#define GLEE_LINK_FAIL 0\r
+#define GLEE_LINK_PARTIAL 1\r
+#define GLEE_LINK_COMPLETE 2\r
+\r
+/* Extension querying variables */\r
+\r
+GLEE_EXTERN GLboolean _GLEE_VERSION_1_2;\r
+GLEE_EXTERN GLboolean _GLEE_ARB_imaging;\r
+GLEE_EXTERN GLboolean _GLEE_VERSION_1_3;\r
+GLEE_EXTERN GLboolean _GLEE_VERSION_1_4;\r
+GLEE_EXTERN GLboolean _GLEE_VERSION_1_5;\r
+GLEE_EXTERN GLboolean _GLEE_VERSION_2_0;\r
+GLEE_EXTERN GLboolean _GLEE_VERSION_2_1;\r
+GLEE_EXTERN GLboolean _GLEE_VERSION_3_0;\r
+GLEE_EXTERN GLboolean _GLEE_ARB_multitexture;\r
+GLEE_EXTERN GLboolean _GLEE_ARB_transpose_matrix;\r
+GLEE_EXTERN GLboolean _GLEE_ARB_multisample;\r
+GLEE_EXTERN GLboolean _GLEE_ARB_texture_env_add;\r
+GLEE_EXTERN GLboolean _GLEE_ARB_texture_cube_map;\r
+GLEE_EXTERN GLboolean _GLEE_ARB_texture_compression;\r
+GLEE_EXTERN GLboolean _GLEE_ARB_texture_border_clamp;\r
+GLEE_EXTERN GLboolean _GLEE_ARB_point_parameters;\r
+GLEE_EXTERN GLboolean _GLEE_ARB_vertex_blend;\r
+GLEE_EXTERN GLboolean _GLEE_ARB_matrix_palette;\r
+GLEE_EXTERN GLboolean _GLEE_ARB_texture_env_combine;\r
+GLEE_EXTERN GLboolean _GLEE_ARB_texture_env_crossbar;\r
+GLEE_EXTERN GLboolean _GLEE_ARB_texture_env_dot3;\r
+GLEE_EXTERN GLboolean _GLEE_ARB_texture_mirrored_repeat;\r
+GLEE_EXTERN GLboolean _GLEE_ARB_depth_texture;\r
+GLEE_EXTERN GLboolean _GLEE_ARB_shadow;\r
+GLEE_EXTERN GLboolean _GLEE_ARB_shadow_ambient;\r
+GLEE_EXTERN GLboolean _GLEE_ARB_window_pos;\r
+GLEE_EXTERN GLboolean _GLEE_ARB_vertex_program;\r
+GLEE_EXTERN GLboolean _GLEE_ARB_fragment_program;\r
+GLEE_EXTERN GLboolean _GLEE_ARB_vertex_buffer_object;\r
+GLEE_EXTERN GLboolean _GLEE_ARB_occlusion_query;\r
+GLEE_EXTERN GLboolean _GLEE_ARB_shader_objects;\r
+GLEE_EXTERN GLboolean _GLEE_ARB_vertex_shader;\r
+GLEE_EXTERN GLboolean _GLEE_ARB_fragment_shader;\r
+GLEE_EXTERN GLboolean _GLEE_ARB_shading_language_100;\r
+GLEE_EXTERN GLboolean _GLEE_ARB_texture_non_power_of_two;\r
+GLEE_EXTERN GLboolean _GLEE_ARB_point_sprite;\r
+GLEE_EXTERN GLboolean _GLEE_ARB_fragment_program_shadow;\r
+GLEE_EXTERN GLboolean _GLEE_ARB_draw_buffers;\r
+GLEE_EXTERN GLboolean _GLEE_ARB_texture_rectangle;\r
+GLEE_EXTERN GLboolean _GLEE_ARB_color_buffer_float;\r
+GLEE_EXTERN GLboolean _GLEE_ARB_half_float_pixel;\r
+GLEE_EXTERN GLboolean _GLEE_ARB_texture_float;\r
+GLEE_EXTERN GLboolean _GLEE_ARB_pixel_buffer_object;\r
+GLEE_EXTERN GLboolean _GLEE_ARB_depth_buffer_float;\r
+GLEE_EXTERN GLboolean _GLEE_ARB_draw_instanced;\r
+GLEE_EXTERN GLboolean _GLEE_ARB_framebuffer_object;\r
+GLEE_EXTERN GLboolean _GLEE_ARB_framebuffer_sRGB;\r
+GLEE_EXTERN GLboolean _GLEE_ARB_geometry_shader4;\r
+GLEE_EXTERN GLboolean _GLEE_ARB_half_float_vertex;\r
+GLEE_EXTERN GLboolean _GLEE_ARB_instanced_arrays;\r
+GLEE_EXTERN GLboolean _GLEE_ARB_map_buffer_range;\r
+GLEE_EXTERN GLboolean _GLEE_ARB_texture_buffer_object;\r
+GLEE_EXTERN GLboolean _GLEE_ARB_texture_compression_rgtc;\r
+GLEE_EXTERN GLboolean _GLEE_ARB_texture_rg;\r
+GLEE_EXTERN GLboolean _GLEE_ARB_vertex_array_object;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_abgr;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_blend_color;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_polygon_offset;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_texture;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_texture3D;\r
+GLEE_EXTERN GLboolean _GLEE_SGIS_texture_filter4;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_subtexture;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_copy_texture;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_histogram;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_convolution;\r
+GLEE_EXTERN GLboolean _GLEE_SGI_color_matrix;\r
+GLEE_EXTERN GLboolean _GLEE_SGI_color_table;\r
+GLEE_EXTERN GLboolean _GLEE_SGIS_pixel_texture;\r
+GLEE_EXTERN GLboolean _GLEE_SGIX_pixel_texture;\r
+GLEE_EXTERN GLboolean _GLEE_SGIS_texture4D;\r
+GLEE_EXTERN GLboolean _GLEE_SGI_texture_color_table;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_cmyka;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_texture_object;\r
+GLEE_EXTERN GLboolean _GLEE_SGIS_detail_texture;\r
+GLEE_EXTERN GLboolean _GLEE_SGIS_sharpen_texture;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_packed_pixels;\r
+GLEE_EXTERN GLboolean _GLEE_SGIS_texture_lod;\r
+GLEE_EXTERN GLboolean _GLEE_SGIS_multisample;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_rescale_normal;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_vertex_array;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_misc_attribute;\r
+GLEE_EXTERN GLboolean _GLEE_SGIS_generate_mipmap;\r
+GLEE_EXTERN GLboolean _GLEE_SGIX_clipmap;\r
+GLEE_EXTERN GLboolean _GLEE_SGIX_shadow;\r
+GLEE_EXTERN GLboolean _GLEE_SGIS_texture_edge_clamp;\r
+GLEE_EXTERN GLboolean _GLEE_SGIS_texture_border_clamp;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_blend_minmax;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_blend_subtract;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_blend_logic_op;\r
+GLEE_EXTERN GLboolean _GLEE_SGIX_interlace;\r
+GLEE_EXTERN GLboolean _GLEE_SGIX_pixel_tiles;\r
+GLEE_EXTERN GLboolean _GLEE_SGIS_texture_select;\r
+GLEE_EXTERN GLboolean _GLEE_SGIX_sprite;\r
+GLEE_EXTERN GLboolean _GLEE_SGIX_texture_multi_buffer;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_point_parameters;\r
+GLEE_EXTERN GLboolean _GLEE_SGIS_point_parameters;\r
+GLEE_EXTERN GLboolean _GLEE_SGIX_instruments;\r
+GLEE_EXTERN GLboolean _GLEE_SGIX_texture_scale_bias;\r
+GLEE_EXTERN GLboolean _GLEE_SGIX_framezoom;\r
+GLEE_EXTERN GLboolean _GLEE_SGIX_tag_sample_buffer;\r
+GLEE_EXTERN GLboolean _GLEE_FfdMaskSGIX;\r
+GLEE_EXTERN GLboolean _GLEE_SGIX_polynomial_ffd;\r
+GLEE_EXTERN GLboolean _GLEE_SGIX_reference_plane;\r
+GLEE_EXTERN GLboolean _GLEE_SGIX_flush_raster;\r
+GLEE_EXTERN GLboolean _GLEE_SGIX_depth_texture;\r
+GLEE_EXTERN GLboolean _GLEE_SGIS_fog_function;\r
+GLEE_EXTERN GLboolean _GLEE_SGIX_fog_offset;\r
+GLEE_EXTERN GLboolean _GLEE_HP_image_transform;\r
+GLEE_EXTERN GLboolean _GLEE_HP_convolution_border_modes;\r
+GLEE_EXTERN GLboolean _GLEE_INGR_palette_buffer;\r
+GLEE_EXTERN GLboolean _GLEE_SGIX_texture_add_env;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_color_subtable;\r
+GLEE_EXTERN GLboolean _GLEE_PGI_vertex_hints;\r
+GLEE_EXTERN GLboolean _GLEE_PGI_misc_hints;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_paletted_texture;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_clip_volume_hint;\r
+GLEE_EXTERN GLboolean _GLEE_SGIX_list_priority;\r
+GLEE_EXTERN GLboolean _GLEE_SGIX_ir_instrument1;\r
+GLEE_EXTERN GLboolean _GLEE_SGIX_calligraphic_fragment;\r
+GLEE_EXTERN GLboolean _GLEE_SGIX_texture_lod_bias;\r
+GLEE_EXTERN GLboolean _GLEE_SGIX_shadow_ambient;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_index_texture;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_index_material;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_index_func;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_index_array_formats;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_compiled_vertex_array;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_cull_vertex;\r
+GLEE_EXTERN GLboolean _GLEE_SGIX_ycrcb;\r
+GLEE_EXTERN GLboolean _GLEE_SGIX_fragment_lighting;\r
+GLEE_EXTERN GLboolean _GLEE_IBM_rasterpos_clip;\r
+GLEE_EXTERN GLboolean _GLEE_HP_texture_lighting;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_draw_range_elements;\r
+GLEE_EXTERN GLboolean _GLEE_WIN_phong_shading;\r
+GLEE_EXTERN GLboolean _GLEE_WIN_specular_fog;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_light_texture;\r
+GLEE_EXTERN GLboolean _GLEE_SGIX_blend_alpha_minmax;\r
+GLEE_EXTERN GLboolean _GLEE_SGIX_impact_pixel_texture;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_bgra;\r
+GLEE_EXTERN GLboolean _GLEE_SGIX_async;\r
+GLEE_EXTERN GLboolean _GLEE_SGIX_async_pixel;\r
+GLEE_EXTERN GLboolean _GLEE_SGIX_async_histogram;\r
+GLEE_EXTERN GLboolean _GLEE_INTEL_texture_scissor;\r
+GLEE_EXTERN GLboolean _GLEE_INTEL_parallel_arrays;\r
+GLEE_EXTERN GLboolean _GLEE_HP_occlusion_test;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_pixel_transform;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_pixel_transform_color_table;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_shared_texture_palette;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_separate_specular_color;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_secondary_color;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_texture_perturb_normal;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_multi_draw_arrays;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_fog_coord;\r
+GLEE_EXTERN GLboolean _GLEE_REND_screen_coordinates;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_coordinate_frame;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_texture_env_combine;\r
+GLEE_EXTERN GLboolean _GLEE_APPLE_specular_vector;\r
+GLEE_EXTERN GLboolean _GLEE_APPLE_transform_hint;\r
+GLEE_EXTERN GLboolean _GLEE_SGIX_fog_scale;\r
+GLEE_EXTERN GLboolean _GLEE_SUNX_constant_data;\r
+GLEE_EXTERN GLboolean _GLEE_SUN_global_alpha;\r
+GLEE_EXTERN GLboolean _GLEE_SUN_triangle_list;\r
+GLEE_EXTERN GLboolean _GLEE_SUN_vertex;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_blend_func_separate;\r
+GLEE_EXTERN GLboolean _GLEE_INGR_color_clamp;\r
+GLEE_EXTERN GLboolean _GLEE_INGR_interlace_read;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_stencil_wrap;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_422_pixels;\r
+GLEE_EXTERN GLboolean _GLEE_NV_texgen_reflection;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_texture_cube_map;\r
+GLEE_EXTERN GLboolean _GLEE_SUN_convolution_border_modes;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_texture_env_add;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_texture_lod_bias;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_texture_filter_anisotropic;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_vertex_weighting;\r
+GLEE_EXTERN GLboolean _GLEE_NV_light_max_exponent;\r
+GLEE_EXTERN GLboolean _GLEE_NV_vertex_array_range;\r
+GLEE_EXTERN GLboolean _GLEE_NV_register_combiners;\r
+GLEE_EXTERN GLboolean _GLEE_NV_fog_distance;\r
+GLEE_EXTERN GLboolean _GLEE_NV_texgen_emboss;\r
+GLEE_EXTERN GLboolean _GLEE_NV_blend_square;\r
+GLEE_EXTERN GLboolean _GLEE_NV_texture_env_combine4;\r
+GLEE_EXTERN GLboolean _GLEE_MESA_resize_buffers;\r
+GLEE_EXTERN GLboolean _GLEE_MESA_window_pos;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_texture_compression_s3tc;\r
+GLEE_EXTERN GLboolean _GLEE_IBM_cull_vertex;\r
+GLEE_EXTERN GLboolean _GLEE_IBM_multimode_draw_arrays;\r
+GLEE_EXTERN GLboolean _GLEE_IBM_vertex_array_lists;\r
+GLEE_EXTERN GLboolean _GLEE_SGIX_subsample;\r
+GLEE_EXTERN GLboolean _GLEE_SGIX_ycrcb_subsample;\r
+GLEE_EXTERN GLboolean _GLEE_SGIX_ycrcba;\r
+GLEE_EXTERN GLboolean _GLEE_SGI_depth_pass_instrument;\r
+GLEE_EXTERN GLboolean _GLEE_3DFX_texture_compression_FXT1;\r
+GLEE_EXTERN GLboolean _GLEE_3DFX_multisample;\r
+GLEE_EXTERN GLboolean _GLEE_3DFX_tbuffer;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_multisample;\r
+GLEE_EXTERN GLboolean _GLEE_SGIX_vertex_preclip;\r
+GLEE_EXTERN GLboolean _GLEE_SGIX_convolution_accuracy;\r
+GLEE_EXTERN GLboolean _GLEE_SGIX_resample;\r
+GLEE_EXTERN GLboolean _GLEE_SGIS_point_line_texgen;\r
+GLEE_EXTERN GLboolean _GLEE_SGIS_texture_color_mask;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_texture_env_dot3;\r
+GLEE_EXTERN GLboolean _GLEE_ATI_texture_mirror_once;\r
+GLEE_EXTERN GLboolean _GLEE_NV_fence;\r
+GLEE_EXTERN GLboolean _GLEE_IBM_texture_mirrored_repeat;\r
+GLEE_EXTERN GLboolean _GLEE_NV_evaluators;\r
+GLEE_EXTERN GLboolean _GLEE_NV_packed_depth_stencil;\r
+GLEE_EXTERN GLboolean _GLEE_NV_register_combiners2;\r
+GLEE_EXTERN GLboolean _GLEE_NV_texture_compression_vtc;\r
+GLEE_EXTERN GLboolean _GLEE_NV_texture_rectangle;\r
+GLEE_EXTERN GLboolean _GLEE_NV_texture_shader;\r
+GLEE_EXTERN GLboolean _GLEE_NV_texture_shader2;\r
+GLEE_EXTERN GLboolean _GLEE_NV_vertex_array_range2;\r
+GLEE_EXTERN GLboolean _GLEE_NV_vertex_program;\r
+GLEE_EXTERN GLboolean _GLEE_SGIX_texture_coordinate_clamp;\r
+GLEE_EXTERN GLboolean _GLEE_SGIX_scalebias_hint;\r
+GLEE_EXTERN GLboolean _GLEE_OML_interlace;\r
+GLEE_EXTERN GLboolean _GLEE_OML_subsample;\r
+GLEE_EXTERN GLboolean _GLEE_OML_resample;\r
+GLEE_EXTERN GLboolean _GLEE_NV_copy_depth_to_color;\r
+GLEE_EXTERN GLboolean _GLEE_ATI_envmap_bumpmap;\r
+GLEE_EXTERN GLboolean _GLEE_ATI_fragment_shader;\r
+GLEE_EXTERN GLboolean _GLEE_ATI_pn_triangles;\r
+GLEE_EXTERN GLboolean _GLEE_ATI_vertex_array_object;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_vertex_shader;\r
+GLEE_EXTERN GLboolean _GLEE_ATI_vertex_streams;\r
+GLEE_EXTERN GLboolean _GLEE_ATI_element_array;\r
+GLEE_EXTERN GLboolean _GLEE_SUN_mesh_array;\r
+GLEE_EXTERN GLboolean _GLEE_SUN_slice_accum;\r
+GLEE_EXTERN GLboolean _GLEE_NV_multisample_filter_hint;\r
+GLEE_EXTERN GLboolean _GLEE_NV_depth_clamp;\r
+GLEE_EXTERN GLboolean _GLEE_NV_occlusion_query;\r
+GLEE_EXTERN GLboolean _GLEE_NV_point_sprite;\r
+GLEE_EXTERN GLboolean _GLEE_NV_texture_shader3;\r
+GLEE_EXTERN GLboolean _GLEE_NV_vertex_program1_1;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_shadow_funcs;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_stencil_two_side;\r
+GLEE_EXTERN GLboolean _GLEE_ATI_text_fragment_shader;\r
+GLEE_EXTERN GLboolean _GLEE_APPLE_client_storage;\r
+GLEE_EXTERN GLboolean _GLEE_APPLE_element_array;\r
+GLEE_EXTERN GLboolean _GLEE_APPLE_fence;\r
+GLEE_EXTERN GLboolean _GLEE_APPLE_vertex_array_object;\r
+GLEE_EXTERN GLboolean _GLEE_APPLE_vertex_array_range;\r
+GLEE_EXTERN GLboolean _GLEE_APPLE_ycbcr_422;\r
+GLEE_EXTERN GLboolean _GLEE_S3_s3tc;\r
+GLEE_EXTERN GLboolean _GLEE_ATI_draw_buffers;\r
+GLEE_EXTERN GLboolean _GLEE_ATI_pixel_format_float;\r
+GLEE_EXTERN GLboolean _GLEE_ATI_texture_env_combine3;\r
+GLEE_EXTERN GLboolean _GLEE_ATI_texture_float;\r
+GLEE_EXTERN GLboolean _GLEE_NV_float_buffer;\r
+GLEE_EXTERN GLboolean _GLEE_NV_fragment_program;\r
+GLEE_EXTERN GLboolean _GLEE_NV_half_float;\r
+GLEE_EXTERN GLboolean _GLEE_NV_pixel_data_range;\r
+GLEE_EXTERN GLboolean _GLEE_NV_primitive_restart;\r
+GLEE_EXTERN GLboolean _GLEE_NV_texture_expand_normal;\r
+GLEE_EXTERN GLboolean _GLEE_NV_vertex_program2;\r
+GLEE_EXTERN GLboolean _GLEE_ATI_map_object_buffer;\r
+GLEE_EXTERN GLboolean _GLEE_ATI_separate_stencil;\r
+GLEE_EXTERN GLboolean _GLEE_ATI_vertex_attrib_array_object;\r
+GLEE_EXTERN GLboolean _GLEE_OES_read_format;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_depth_bounds_test;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_texture_mirror_clamp;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_blend_equation_separate;\r
+GLEE_EXTERN GLboolean _GLEE_MESA_pack_invert;\r
+GLEE_EXTERN GLboolean _GLEE_MESA_ycbcr_texture;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_pixel_buffer_object;\r
+GLEE_EXTERN GLboolean _GLEE_NV_fragment_program_option;\r
+GLEE_EXTERN GLboolean _GLEE_NV_fragment_program2;\r
+GLEE_EXTERN GLboolean _GLEE_NV_vertex_program2_option;\r
+GLEE_EXTERN GLboolean _GLEE_NV_vertex_program3;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_framebuffer_object;\r
+GLEE_EXTERN GLboolean _GLEE_GREMEDY_string_marker;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_packed_depth_stencil;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_stencil_clear_tag;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_texture_sRGB;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_framebuffer_blit;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_framebuffer_multisample;\r
+GLEE_EXTERN GLboolean _GLEE_MESAX_texture_stack;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_timer_query;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_gpu_program_parameters;\r
+GLEE_EXTERN GLboolean _GLEE_APPLE_flush_buffer_range;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_gpu_shader4;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_draw_instanced;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_packed_float;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_texture_array;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_texture_buffer_object;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_texture_compression_latc;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_texture_compression_rgtc;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_texture_shared_exponent;\r
+GLEE_EXTERN GLboolean _GLEE_NV_depth_buffer_float;\r
+GLEE_EXTERN GLboolean _GLEE_NV_framebuffer_multisample_coverage;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_framebuffer_sRGB;\r
+GLEE_EXTERN GLboolean _GLEE_NV_geometry_shader4;\r
+GLEE_EXTERN GLboolean _GLEE_NV_parameter_buffer_object;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_draw_buffers2;\r
+GLEE_EXTERN GLboolean _GLEE_NV_transform_feedback;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_bindable_uniform;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_texture_integer;\r
+GLEE_EXTERN GLboolean _GLEE_GREMEDY_frame_terminator;\r
+GLEE_EXTERN GLboolean _GLEE_NV_conditional_render;\r
+GLEE_EXTERN GLboolean _GLEE_NV_present_video;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_transform_feedback;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_direct_state_access;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_vertex_array_bgra;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_texture_swizzle;\r
+GLEE_EXTERN GLboolean _GLEE_NV_explicit_multisample;\r
+GLEE_EXTERN GLboolean _GLEE_NV_transform_feedback2;\r
+GLEE_EXTERN GLboolean _GLEE_SGIX_texture_select;\r
+GLEE_EXTERN GLboolean _GLEE_INGR_blend_func_separate;\r
+GLEE_EXTERN GLboolean _GLEE_SGIX_depth_pass_instrument;\r
+GLEE_EXTERN GLboolean _GLEE_SGIX_igloo_interface;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_fragment_lighting;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_geometry_shader4;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_scene_marker;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_texture_compression_dxt1;\r
+GLEE_EXTERN GLboolean _GLEE_EXT_texture_env;\r
+GLEE_EXTERN GLboolean _GLEE_IBM_static_data;\r
+GLEE_EXTERN GLboolean _GLEE_NV_gpu_program4;\r
+GLEE_EXTERN GLboolean _GLEE_OES_byte_coordinates;\r
+GLEE_EXTERN GLboolean _GLEE_OES_compressed_paletted_texture;\r
+GLEE_EXTERN GLboolean _GLEE_OES_single_precision;\r
+GLEE_EXTERN GLboolean _GLEE_SGIX_pixel_texture_bits;\r
+GLEE_EXTERN GLboolean _GLEE_SGIX_texture_range;\r
+\r
+/* Aliases for extension querying variables */\r
+\r
+#define GLEE_VERSION_1_2     GLeeEnabled(&_GLEE_VERSION_1_2)\r
+#define GLEE_ARB_imaging     GLeeEnabled(&_GLEE_ARB_imaging)\r
+#define GLEE_VERSION_1_3     GLeeEnabled(&_GLEE_VERSION_1_3)\r
+#define GLEE_VERSION_1_4     GLeeEnabled(&_GLEE_VERSION_1_4)\r
+#define GLEE_VERSION_1_5     GLeeEnabled(&_GLEE_VERSION_1_5)\r
+#define GLEE_VERSION_2_0     GLeeEnabled(&_GLEE_VERSION_2_0)\r
+#define GLEE_VERSION_2_1     GLeeEnabled(&_GLEE_VERSION_2_1)\r
+#define GLEE_VERSION_3_0     GLeeEnabled(&_GLEE_VERSION_3_0)\r
+#define GLEE_ARB_multitexture     GLeeEnabled(&_GLEE_ARB_multitexture)\r
+#define GLEE_ARB_transpose_matrix     GLeeEnabled(&_GLEE_ARB_transpose_matrix)\r
+#define GLEE_ARB_multisample     GLeeEnabled(&_GLEE_ARB_multisample)\r
+#define GLEE_ARB_texture_env_add     GLeeEnabled(&_GLEE_ARB_texture_env_add)\r
+#define GLEE_ARB_texture_cube_map     GLeeEnabled(&_GLEE_ARB_texture_cube_map)\r
+#define GLEE_ARB_texture_compression     GLeeEnabled(&_GLEE_ARB_texture_compression)\r
+#define GLEE_ARB_texture_border_clamp     GLeeEnabled(&_GLEE_ARB_texture_border_clamp)\r
+#define GLEE_ARB_point_parameters     GLeeEnabled(&_GLEE_ARB_point_parameters)\r
+#define GLEE_ARB_vertex_blend     GLeeEnabled(&_GLEE_ARB_vertex_blend)\r
+#define GLEE_ARB_matrix_palette     GLeeEnabled(&_GLEE_ARB_matrix_palette)\r
+#define GLEE_ARB_texture_env_combine     GLeeEnabled(&_GLEE_ARB_texture_env_combine)\r
+#define GLEE_ARB_texture_env_crossbar     GLeeEnabled(&_GLEE_ARB_texture_env_crossbar)\r
+#define GLEE_ARB_texture_env_dot3     GLeeEnabled(&_GLEE_ARB_texture_env_dot3)\r
+#define GLEE_ARB_texture_mirrored_repeat     GLeeEnabled(&_GLEE_ARB_texture_mirrored_repeat)\r
+#define GLEE_ARB_depth_texture     GLeeEnabled(&_GLEE_ARB_depth_texture)\r
+#define GLEE_ARB_shadow     GLeeEnabled(&_GLEE_ARB_shadow)\r
+#define GLEE_ARB_shadow_ambient     GLeeEnabled(&_GLEE_ARB_shadow_ambient)\r
+#define GLEE_ARB_window_pos     GLeeEnabled(&_GLEE_ARB_window_pos)\r
+#define GLEE_ARB_vertex_program     GLeeEnabled(&_GLEE_ARB_vertex_program)\r
+#define GLEE_ARB_fragment_program     GLeeEnabled(&_GLEE_ARB_fragment_program)\r
+#define GLEE_ARB_vertex_buffer_object     GLeeEnabled(&_GLEE_ARB_vertex_buffer_object)\r
+#define GLEE_ARB_occlusion_query     GLeeEnabled(&_GLEE_ARB_occlusion_query)\r
+#define GLEE_ARB_shader_objects     GLeeEnabled(&_GLEE_ARB_shader_objects)\r
+#define GLEE_ARB_vertex_shader     GLeeEnabled(&_GLEE_ARB_vertex_shader)\r
+#define GLEE_ARB_fragment_shader     GLeeEnabled(&_GLEE_ARB_fragment_shader)\r
+#define GLEE_ARB_shading_language_100     GLeeEnabled(&_GLEE_ARB_shading_language_100)\r
+#define GLEE_ARB_texture_non_power_of_two     GLeeEnabled(&_GLEE_ARB_texture_non_power_of_two)\r
+#define GLEE_ARB_point_sprite     GLeeEnabled(&_GLEE_ARB_point_sprite)\r
+#define GLEE_ARB_fragment_program_shadow     GLeeEnabled(&_GLEE_ARB_fragment_program_shadow)\r
+#define GLEE_ARB_draw_buffers     GLeeEnabled(&_GLEE_ARB_draw_buffers)\r
+#define GLEE_ARB_texture_rectangle     GLeeEnabled(&_GLEE_ARB_texture_rectangle)\r
+#define GLEE_ARB_color_buffer_float     GLeeEnabled(&_GLEE_ARB_color_buffer_float)\r
+#define GLEE_ARB_half_float_pixel     GLeeEnabled(&_GLEE_ARB_half_float_pixel)\r
+#define GLEE_ARB_texture_float     GLeeEnabled(&_GLEE_ARB_texture_float)\r
+#define GLEE_ARB_pixel_buffer_object     GLeeEnabled(&_GLEE_ARB_pixel_buffer_object)\r
+#define GLEE_ARB_depth_buffer_float     GLeeEnabled(&_GLEE_ARB_depth_buffer_float)\r
+#define GLEE_ARB_draw_instanced     GLeeEnabled(&_GLEE_ARB_draw_instanced)\r
+#define GLEE_ARB_framebuffer_object     GLeeEnabled(&_GLEE_ARB_framebuffer_object)\r
+#define GLEE_ARB_framebuffer_sRGB     GLeeEnabled(&_GLEE_ARB_framebuffer_sRGB)\r
+#define GLEE_ARB_geometry_shader4     GLeeEnabled(&_GLEE_ARB_geometry_shader4)\r
+#define GLEE_ARB_half_float_vertex     GLeeEnabled(&_GLEE_ARB_half_float_vertex)\r
+#define GLEE_ARB_instanced_arrays     GLeeEnabled(&_GLEE_ARB_instanced_arrays)\r
+#define GLEE_ARB_map_buffer_range     GLeeEnabled(&_GLEE_ARB_map_buffer_range)\r
+#define GLEE_ARB_texture_buffer_object     GLeeEnabled(&_GLEE_ARB_texture_buffer_object)\r
+#define GLEE_ARB_texture_compression_rgtc     GLeeEnabled(&_GLEE_ARB_texture_compression_rgtc)\r
+#define GLEE_ARB_texture_rg     GLeeEnabled(&_GLEE_ARB_texture_rg)\r
+#define GLEE_ARB_vertex_array_object     GLeeEnabled(&_GLEE_ARB_vertex_array_object)\r
+#define GLEE_EXT_abgr     GLeeEnabled(&_GLEE_EXT_abgr)\r
+#define GLEE_EXT_blend_color     GLeeEnabled(&_GLEE_EXT_blend_color)\r
+#define GLEE_EXT_polygon_offset     GLeeEnabled(&_GLEE_EXT_polygon_offset)\r
+#define GLEE_EXT_texture     GLeeEnabled(&_GLEE_EXT_texture)\r
+#define GLEE_EXT_texture3D     GLeeEnabled(&_GLEE_EXT_texture3D)\r
+#define GLEE_SGIS_texture_filter4     GLeeEnabled(&_GLEE_SGIS_texture_filter4)\r
+#define GLEE_EXT_subtexture     GLeeEnabled(&_GLEE_EXT_subtexture)\r
+#define GLEE_EXT_copy_texture     GLeeEnabled(&_GLEE_EXT_copy_texture)\r
+#define GLEE_EXT_histogram     GLeeEnabled(&_GLEE_EXT_histogram)\r
+#define GLEE_EXT_convolution     GLeeEnabled(&_GLEE_EXT_convolution)\r
+#define GLEE_SGI_color_matrix     GLeeEnabled(&_GLEE_SGI_color_matrix)\r
+#define GLEE_SGI_color_table     GLeeEnabled(&_GLEE_SGI_color_table)\r
+#define GLEE_SGIS_pixel_texture     GLeeEnabled(&_GLEE_SGIS_pixel_texture)\r
+#define GLEE_SGIX_pixel_texture     GLeeEnabled(&_GLEE_SGIX_pixel_texture)\r
+#define GLEE_SGIS_texture4D     GLeeEnabled(&_GLEE_SGIS_texture4D)\r
+#define GLEE_SGI_texture_color_table     GLeeEnabled(&_GLEE_SGI_texture_color_table)\r
+#define GLEE_EXT_cmyka     GLeeEnabled(&_GLEE_EXT_cmyka)\r
+#define GLEE_EXT_texture_object     GLeeEnabled(&_GLEE_EXT_texture_object)\r
+#define GLEE_SGIS_detail_texture     GLeeEnabled(&_GLEE_SGIS_detail_texture)\r
+#define GLEE_SGIS_sharpen_texture     GLeeEnabled(&_GLEE_SGIS_sharpen_texture)\r
+#define GLEE_EXT_packed_pixels     GLeeEnabled(&_GLEE_EXT_packed_pixels)\r
+#define GLEE_SGIS_texture_lod     GLeeEnabled(&_GLEE_SGIS_texture_lod)\r
+#define GLEE_SGIS_multisample     GLeeEnabled(&_GLEE_SGIS_multisample)\r
+#define GLEE_EXT_rescale_normal     GLeeEnabled(&_GLEE_EXT_rescale_normal)\r
+#define GLEE_EXT_vertex_array     GLeeEnabled(&_GLEE_EXT_vertex_array)\r
+#define GLEE_EXT_misc_attribute     GLeeEnabled(&_GLEE_EXT_misc_attribute)\r
+#define GLEE_SGIS_generate_mipmap     GLeeEnabled(&_GLEE_SGIS_generate_mipmap)\r
+#define GLEE_SGIX_clipmap     GLeeEnabled(&_GLEE_SGIX_clipmap)\r
+#define GLEE_SGIX_shadow     GLeeEnabled(&_GLEE_SGIX_shadow)\r
+#define GLEE_SGIS_texture_edge_clamp     GLeeEnabled(&_GLEE_SGIS_texture_edge_clamp)\r
+#define GLEE_SGIS_texture_border_clamp     GLeeEnabled(&_GLEE_SGIS_texture_border_clamp)\r
+#define GLEE_EXT_blend_minmax     GLeeEnabled(&_GLEE_EXT_blend_minmax)\r
+#define GLEE_EXT_blend_subtract     GLeeEnabled(&_GLEE_EXT_blend_subtract)\r
+#define GLEE_EXT_blend_logic_op     GLeeEnabled(&_GLEE_EXT_blend_logic_op)\r
+#define GLEE_SGIX_interlace     GLeeEnabled(&_GLEE_SGIX_interlace)\r
+#define GLEE_SGIX_pixel_tiles     GLeeEnabled(&_GLEE_SGIX_pixel_tiles)\r
+#define GLEE_SGIS_texture_select     GLeeEnabled(&_GLEE_SGIS_texture_select)\r
+#define GLEE_SGIX_sprite     GLeeEnabled(&_GLEE_SGIX_sprite)\r
+#define GLEE_SGIX_texture_multi_buffer     GLeeEnabled(&_GLEE_SGIX_texture_multi_buffer)\r
+#define GLEE_EXT_point_parameters     GLeeEnabled(&_GLEE_EXT_point_parameters)\r
+#define GLEE_SGIS_point_parameters     GLeeEnabled(&_GLEE_SGIS_point_parameters)\r
+#define GLEE_SGIX_instruments     GLeeEnabled(&_GLEE_SGIX_instruments)\r
+#define GLEE_SGIX_texture_scale_bias     GLeeEnabled(&_GLEE_SGIX_texture_scale_bias)\r
+#define GLEE_SGIX_framezoom     GLeeEnabled(&_GLEE_SGIX_framezoom)\r
+#define GLEE_SGIX_tag_sample_buffer     GLeeEnabled(&_GLEE_SGIX_tag_sample_buffer)\r
+#define GLEE_FfdMaskSGIX     GLeeEnabled(&_GLEE_FfdMaskSGIX)\r
+#define GLEE_SGIX_polynomial_ffd     GLeeEnabled(&_GLEE_SGIX_polynomial_ffd)\r
+#define GLEE_SGIX_reference_plane     GLeeEnabled(&_GLEE_SGIX_reference_plane)\r
+#define GLEE_SGIX_flush_raster     GLeeEnabled(&_GLEE_SGIX_flush_raster)\r
+#define GLEE_SGIX_depth_texture     GLeeEnabled(&_GLEE_SGIX_depth_texture)\r
+#define GLEE_SGIS_fog_function     GLeeEnabled(&_GLEE_SGIS_fog_function)\r
+#define GLEE_SGIX_fog_offset     GLeeEnabled(&_GLEE_SGIX_fog_offset)\r
+#define GLEE_HP_image_transform     GLeeEnabled(&_GLEE_HP_image_transform)\r
+#define GLEE_HP_convolution_border_modes     GLeeEnabled(&_GLEE_HP_convolution_border_modes)\r
+#define GLEE_INGR_palette_buffer     GLeeEnabled(&_GLEE_INGR_palette_buffer)\r
+#define GLEE_SGIX_texture_add_env     GLeeEnabled(&_GLEE_SGIX_texture_add_env)\r
+#define GLEE_EXT_color_subtable     GLeeEnabled(&_GLEE_EXT_color_subtable)\r
+#define GLEE_PGI_vertex_hints     GLeeEnabled(&_GLEE_PGI_vertex_hints)\r
+#define GLEE_PGI_misc_hints     GLeeEnabled(&_GLEE_PGI_misc_hints)\r
+#define GLEE_EXT_paletted_texture     GLeeEnabled(&_GLEE_EXT_paletted_texture)\r
+#define GLEE_EXT_clip_volume_hint     GLeeEnabled(&_GLEE_EXT_clip_volume_hint)\r
+#define GLEE_SGIX_list_priority     GLeeEnabled(&_GLEE_SGIX_list_priority)\r
+#define GLEE_SGIX_ir_instrument1     GLeeEnabled(&_GLEE_SGIX_ir_instrument1)\r
+#define GLEE_SGIX_calligraphic_fragment     GLeeEnabled(&_GLEE_SGIX_calligraphic_fragment)\r
+#define GLEE_SGIX_texture_lod_bias     GLeeEnabled(&_GLEE_SGIX_texture_lod_bias)\r
+#define GLEE_SGIX_shadow_ambient     GLeeEnabled(&_GLEE_SGIX_shadow_ambient)\r
+#define GLEE_EXT_index_texture     GLeeEnabled(&_GLEE_EXT_index_texture)\r
+#define GLEE_EXT_index_material     GLeeEnabled(&_GLEE_EXT_index_material)\r
+#define GLEE_EXT_index_func     GLeeEnabled(&_GLEE_EXT_index_func)\r
+#define GLEE_EXT_index_array_formats     GLeeEnabled(&_GLEE_EXT_index_array_formats)\r
+#define GLEE_EXT_compiled_vertex_array     GLeeEnabled(&_GLEE_EXT_compiled_vertex_array)\r
+#define GLEE_EXT_cull_vertex     GLeeEnabled(&_GLEE_EXT_cull_vertex)\r
+#define GLEE_SGIX_ycrcb     GLeeEnabled(&_GLEE_SGIX_ycrcb)\r
+#define GLEE_SGIX_fragment_lighting     GLeeEnabled(&_GLEE_SGIX_fragment_lighting)\r
+#define GLEE_IBM_rasterpos_clip     GLeeEnabled(&_GLEE_IBM_rasterpos_clip)\r
+#define GLEE_HP_texture_lighting     GLeeEnabled(&_GLEE_HP_texture_lighting)\r
+#define GLEE_EXT_draw_range_elements     GLeeEnabled(&_GLEE_EXT_draw_range_elements)\r
+#define GLEE_WIN_phong_shading     GLeeEnabled(&_GLEE_WIN_phong_shading)\r
+#define GLEE_WIN_specular_fog     GLeeEnabled(&_GLEE_WIN_specular_fog)\r
+#define GLEE_EXT_light_texture     GLeeEnabled(&_GLEE_EXT_light_texture)\r
+#define GLEE_SGIX_blend_alpha_minmax     GLeeEnabled(&_GLEE_SGIX_blend_alpha_minmax)\r
+#define GLEE_SGIX_impact_pixel_texture     GLeeEnabled(&_GLEE_SGIX_impact_pixel_texture)\r
+#define GLEE_EXT_bgra     GLeeEnabled(&_GLEE_EXT_bgra)\r
+#define GLEE_SGIX_async     GLeeEnabled(&_GLEE_SGIX_async)\r
+#define GLEE_SGIX_async_pixel     GLeeEnabled(&_GLEE_SGIX_async_pixel)\r
+#define GLEE_SGIX_async_histogram     GLeeEnabled(&_GLEE_SGIX_async_histogram)\r
+#define GLEE_INTEL_texture_scissor     GLeeEnabled(&_GLEE_INTEL_texture_scissor)\r
+#define GLEE_INTEL_parallel_arrays     GLeeEnabled(&_GLEE_INTEL_parallel_arrays)\r
+#define GLEE_HP_occlusion_test     GLeeEnabled(&_GLEE_HP_occlusion_test)\r
+#define GLEE_EXT_pixel_transform     GLeeEnabled(&_GLEE_EXT_pixel_transform)\r
+#define GLEE_EXT_pixel_transform_color_table     GLeeEnabled(&_GLEE_EXT_pixel_transform_color_table)\r
+#define GLEE_EXT_shared_texture_palette     GLeeEnabled(&_GLEE_EXT_shared_texture_palette)\r
+#define GLEE_EXT_separate_specular_color     GLeeEnabled(&_GLEE_EXT_separate_specular_color)\r
+#define GLEE_EXT_secondary_color     GLeeEnabled(&_GLEE_EXT_secondary_color)\r
+#define GLEE_EXT_texture_perturb_normal     GLeeEnabled(&_GLEE_EXT_texture_perturb_normal)\r
+#define GLEE_EXT_multi_draw_arrays     GLeeEnabled(&_GLEE_EXT_multi_draw_arrays)\r
+#define GLEE_EXT_fog_coord     GLeeEnabled(&_GLEE_EXT_fog_coord)\r
+#define GLEE_REND_screen_coordinates     GLeeEnabled(&_GLEE_REND_screen_coordinates)\r
+#define GLEE_EXT_coordinate_frame     GLeeEnabled(&_GLEE_EXT_coordinate_frame)\r
+#define GLEE_EXT_texture_env_combine     GLeeEnabled(&_GLEE_EXT_texture_env_combine)\r
+#define GLEE_APPLE_specular_vector     GLeeEnabled(&_GLEE_APPLE_specular_vector)\r
+#define GLEE_APPLE_transform_hint     GLeeEnabled(&_GLEE_APPLE_transform_hint)\r
+#define GLEE_SGIX_fog_scale     GLeeEnabled(&_GLEE_SGIX_fog_scale)\r
+#define GLEE_SUNX_constant_data     GLeeEnabled(&_GLEE_SUNX_constant_data)\r
+#define GLEE_SUN_global_alpha     GLeeEnabled(&_GLEE_SUN_global_alpha)\r
+#define GLEE_SUN_triangle_list     GLeeEnabled(&_GLEE_SUN_triangle_list)\r
+#define GLEE_SUN_vertex     GLeeEnabled(&_GLEE_SUN_vertex)\r
+#define GLEE_EXT_blend_func_separate     GLeeEnabled(&_GLEE_EXT_blend_func_separate)\r
+#define GLEE_INGR_color_clamp     GLeeEnabled(&_GLEE_INGR_color_clamp)\r
+#define GLEE_INGR_interlace_read     GLeeEnabled(&_GLEE_INGR_interlace_read)\r
+#define GLEE_EXT_stencil_wrap     GLeeEnabled(&_GLEE_EXT_stencil_wrap)\r
+#define GLEE_EXT_422_pixels     GLeeEnabled(&_GLEE_EXT_422_pixels)\r
+#define GLEE_NV_texgen_reflection     GLeeEnabled(&_GLEE_NV_texgen_reflection)\r
+#define GLEE_EXT_texture_cube_map     GLeeEnabled(&_GLEE_EXT_texture_cube_map)\r
+#define GLEE_SUN_convolution_border_modes     GLeeEnabled(&_GLEE_SUN_convolution_border_modes)\r
+#define GLEE_EXT_texture_env_add     GLeeEnabled(&_GLEE_EXT_texture_env_add)\r
+#define GLEE_EXT_texture_lod_bias     GLeeEnabled(&_GLEE_EXT_texture_lod_bias)\r
+#define GLEE_EXT_texture_filter_anisotropic     GLeeEnabled(&_GLEE_EXT_texture_filter_anisotropic)\r
+#define GLEE_EXT_vertex_weighting     GLeeEnabled(&_GLEE_EXT_vertex_weighting)\r
+#define GLEE_NV_light_max_exponent     GLeeEnabled(&_GLEE_NV_light_max_exponent)\r
+#define GLEE_NV_vertex_array_range     GLeeEnabled(&_GLEE_NV_vertex_array_range)\r
+#define GLEE_NV_register_combiners     GLeeEnabled(&_GLEE_NV_register_combiners)\r
+#define GLEE_NV_fog_distance     GLeeEnabled(&_GLEE_NV_fog_distance)\r
+#define GLEE_NV_texgen_emboss     GLeeEnabled(&_GLEE_NV_texgen_emboss)\r
+#define GLEE_NV_blend_square     GLeeEnabled(&_GLEE_NV_blend_square)\r
+#define GLEE_NV_texture_env_combine4     GLeeEnabled(&_GLEE_NV_texture_env_combine4)\r
+#define GLEE_MESA_resize_buffers     GLeeEnabled(&_GLEE_MESA_resize_buffers)\r
+#define GLEE_MESA_window_pos     GLeeEnabled(&_GLEE_MESA_window_pos)\r
+#define GLEE_EXT_texture_compression_s3tc     GLeeEnabled(&_GLEE_EXT_texture_compression_s3tc)\r
+#define GLEE_IBM_cull_vertex     GLeeEnabled(&_GLEE_IBM_cull_vertex)\r
+#define GLEE_IBM_multimode_draw_arrays     GLeeEnabled(&_GLEE_IBM_multimode_draw_arrays)\r
+#define GLEE_IBM_vertex_array_lists     GLeeEnabled(&_GLEE_IBM_vertex_array_lists)\r
+#define GLEE_SGIX_subsample     GLeeEnabled(&_GLEE_SGIX_subsample)\r
+#define GLEE_SGIX_ycrcb_subsample     GLeeEnabled(&_GLEE_SGIX_ycrcb_subsample)\r
+#define GLEE_SGIX_ycrcba     GLeeEnabled(&_GLEE_SGIX_ycrcba)\r
+#define GLEE_SGI_depth_pass_instrument     GLeeEnabled(&_GLEE_SGI_depth_pass_instrument)\r
+#define GLEE_3DFX_texture_compression_FXT1     GLeeEnabled(&_GLEE_3DFX_texture_compression_FXT1)\r
+#define GLEE_3DFX_multisample     GLeeEnabled(&_GLEE_3DFX_multisample)\r
+#define GLEE_3DFX_tbuffer     GLeeEnabled(&_GLEE_3DFX_tbuffer)\r
+#define GLEE_EXT_multisample     GLeeEnabled(&_GLEE_EXT_multisample)\r
+#define GLEE_SGIX_vertex_preclip     GLeeEnabled(&_GLEE_SGIX_vertex_preclip)\r
+#define GLEE_SGIX_convolution_accuracy     GLeeEnabled(&_GLEE_SGIX_convolution_accuracy)\r
+#define GLEE_SGIX_resample     GLeeEnabled(&_GLEE_SGIX_resample)\r
+#define GLEE_SGIS_point_line_texgen     GLeeEnabled(&_GLEE_SGIS_point_line_texgen)\r
+#define GLEE_SGIS_texture_color_mask     GLeeEnabled(&_GLEE_SGIS_texture_color_mask)\r
+#define GLEE_EXT_texture_env_dot3     GLeeEnabled(&_GLEE_EXT_texture_env_dot3)\r
+#define GLEE_ATI_texture_mirror_once     GLeeEnabled(&_GLEE_ATI_texture_mirror_once)\r
+#define GLEE_NV_fence     GLeeEnabled(&_GLEE_NV_fence)\r
+#define GLEE_IBM_texture_mirrored_repeat     GLeeEnabled(&_GLEE_IBM_texture_mirrored_repeat)\r
+#define GLEE_NV_evaluators     GLeeEnabled(&_GLEE_NV_evaluators)\r
+#define GLEE_NV_packed_depth_stencil     GLeeEnabled(&_GLEE_NV_packed_depth_stencil)\r
+#define GLEE_NV_register_combiners2     GLeeEnabled(&_GLEE_NV_register_combiners2)\r
+#define GLEE_NV_texture_compression_vtc     GLeeEnabled(&_GLEE_NV_texture_compression_vtc)\r
+#define GLEE_NV_texture_rectangle     GLeeEnabled(&_GLEE_NV_texture_rectangle)\r
+#define GLEE_NV_texture_shader     GLeeEnabled(&_GLEE_NV_texture_shader)\r
+#define GLEE_NV_texture_shader2     GLeeEnabled(&_GLEE_NV_texture_shader2)\r
+#define GLEE_NV_vertex_array_range2     GLeeEnabled(&_GLEE_NV_vertex_array_range2)\r
+#define GLEE_NV_vertex_program     GLeeEnabled(&_GLEE_NV_vertex_program)\r
+#define GLEE_SGIX_texture_coordinate_clamp     GLeeEnabled(&_GLEE_SGIX_texture_coordinate_clamp)\r
+#define GLEE_SGIX_scalebias_hint     GLeeEnabled(&_GLEE_SGIX_scalebias_hint)\r
+#define GLEE_OML_interlace     GLeeEnabled(&_GLEE_OML_interlace)\r
+#define GLEE_OML_subsample     GLeeEnabled(&_GLEE_OML_subsample)\r
+#define GLEE_OML_resample     GLeeEnabled(&_GLEE_OML_resample)\r
+#define GLEE_NV_copy_depth_to_color     GLeeEnabled(&_GLEE_NV_copy_depth_to_color)\r
+#define GLEE_ATI_envmap_bumpmap     GLeeEnabled(&_GLEE_ATI_envmap_bumpmap)\r
+#define GLEE_ATI_fragment_shader     GLeeEnabled(&_GLEE_ATI_fragment_shader)\r
+#define GLEE_ATI_pn_triangles     GLeeEnabled(&_GLEE_ATI_pn_triangles)\r
+#define GLEE_ATI_vertex_array_object     GLeeEnabled(&_GLEE_ATI_vertex_array_object)\r
+#define GLEE_EXT_vertex_shader     GLeeEnabled(&_GLEE_EXT_vertex_shader)\r
+#define GLEE_ATI_vertex_streams     GLeeEnabled(&_GLEE_ATI_vertex_streams)\r
+#define GLEE_ATI_element_array     GLeeEnabled(&_GLEE_ATI_element_array)\r
+#define GLEE_SUN_mesh_array     GLeeEnabled(&_GLEE_SUN_mesh_array)\r
+#define GLEE_SUN_slice_accum     GLeeEnabled(&_GLEE_SUN_slice_accum)\r
+#define GLEE_NV_multisample_filter_hint     GLeeEnabled(&_GLEE_NV_multisample_filter_hint)\r
+#define GLEE_NV_depth_clamp     GLeeEnabled(&_GLEE_NV_depth_clamp)\r
+#define GLEE_NV_occlusion_query     GLeeEnabled(&_GLEE_NV_occlusion_query)\r
+#define GLEE_NV_point_sprite     GLeeEnabled(&_GLEE_NV_point_sprite)\r
+#define GLEE_NV_texture_shader3     GLeeEnabled(&_GLEE_NV_texture_shader3)\r
+#define GLEE_NV_vertex_program1_1     GLeeEnabled(&_GLEE_NV_vertex_program1_1)\r
+#define GLEE_EXT_shadow_funcs     GLeeEnabled(&_GLEE_EXT_shadow_funcs)\r
+#define GLEE_EXT_stencil_two_side     GLeeEnabled(&_GLEE_EXT_stencil_two_side)\r
+#define GLEE_ATI_text_fragment_shader     GLeeEnabled(&_GLEE_ATI_text_fragment_shader)\r
+#define GLEE_APPLE_client_storage     GLeeEnabled(&_GLEE_APPLE_client_storage)\r
+#define GLEE_APPLE_element_array     GLeeEnabled(&_GLEE_APPLE_element_array)\r
+#define GLEE_APPLE_fence     GLeeEnabled(&_GLEE_APPLE_fence)\r
+#define GLEE_APPLE_vertex_array_object     GLeeEnabled(&_GLEE_APPLE_vertex_array_object)\r
+#define GLEE_APPLE_vertex_array_range     GLeeEnabled(&_GLEE_APPLE_vertex_array_range)\r
+#define GLEE_APPLE_ycbcr_422     GLeeEnabled(&_GLEE_APPLE_ycbcr_422)\r
+#define GLEE_S3_s3tc     GLeeEnabled(&_GLEE_S3_s3tc)\r
+#define GLEE_ATI_draw_buffers     GLeeEnabled(&_GLEE_ATI_draw_buffers)\r
+#define GLEE_ATI_pixel_format_float     GLeeEnabled(&_GLEE_ATI_pixel_format_float)\r
+#define GLEE_ATI_texture_env_combine3     GLeeEnabled(&_GLEE_ATI_texture_env_combine3)\r
+#define GLEE_ATI_texture_float     GLeeEnabled(&_GLEE_ATI_texture_float)\r
+#define GLEE_NV_float_buffer     GLeeEnabled(&_GLEE_NV_float_buffer)\r
+#define GLEE_NV_fragment_program     GLeeEnabled(&_GLEE_NV_fragment_program)\r
+#define GLEE_NV_half_float     GLeeEnabled(&_GLEE_NV_half_float)\r
+#define GLEE_NV_pixel_data_range     GLeeEnabled(&_GLEE_NV_pixel_data_range)\r
+#define GLEE_NV_primitive_restart     GLeeEnabled(&_GLEE_NV_primitive_restart)\r
+#define GLEE_NV_texture_expand_normal     GLeeEnabled(&_GLEE_NV_texture_expand_normal)\r
+#define GLEE_NV_vertex_program2     GLeeEnabled(&_GLEE_NV_vertex_program2)\r
+#define GLEE_ATI_map_object_buffer     GLeeEnabled(&_GLEE_ATI_map_object_buffer)\r
+#define GLEE_ATI_separate_stencil     GLeeEnabled(&_GLEE_ATI_separate_stencil)\r
+#define GLEE_ATI_vertex_attrib_array_object     GLeeEnabled(&_GLEE_ATI_vertex_attrib_array_object)\r
+#define GLEE_OES_read_format     GLeeEnabled(&_GLEE_OES_read_format)\r
+#define GLEE_EXT_depth_bounds_test     GLeeEnabled(&_GLEE_EXT_depth_bounds_test)\r
+#define GLEE_EXT_texture_mirror_clamp     GLeeEnabled(&_GLEE_EXT_texture_mirror_clamp)\r
+#define GLEE_EXT_blend_equation_separate     GLeeEnabled(&_GLEE_EXT_blend_equation_separate)\r
+#define GLEE_MESA_pack_invert     GLeeEnabled(&_GLEE_MESA_pack_invert)\r
+#define GLEE_MESA_ycbcr_texture     GLeeEnabled(&_GLEE_MESA_ycbcr_texture)\r
+#define GLEE_EXT_pixel_buffer_object     GLeeEnabled(&_GLEE_EXT_pixel_buffer_object)\r
+#define GLEE_NV_fragment_program_option     GLeeEnabled(&_GLEE_NV_fragment_program_option)\r
+#define GLEE_NV_fragment_program2     GLeeEnabled(&_GLEE_NV_fragment_program2)\r
+#define GLEE_NV_vertex_program2_option     GLeeEnabled(&_GLEE_NV_vertex_program2_option)\r
+#define GLEE_NV_vertex_program3     GLeeEnabled(&_GLEE_NV_vertex_program3)\r
+#define GLEE_EXT_framebuffer_object     GLeeEnabled(&_GLEE_EXT_framebuffer_object)\r
+#define GLEE_GREMEDY_string_marker     GLeeEnabled(&_GLEE_GREMEDY_string_marker)\r
+#define GLEE_EXT_packed_depth_stencil     GLeeEnabled(&_GLEE_EXT_packed_depth_stencil)\r
+#define GLEE_EXT_stencil_clear_tag     GLeeEnabled(&_GLEE_EXT_stencil_clear_tag)\r
+#define GLEE_EXT_texture_sRGB     GLeeEnabled(&_GLEE_EXT_texture_sRGB)\r
+#define GLEE_EXT_framebuffer_blit     GLeeEnabled(&_GLEE_EXT_framebuffer_blit)\r
+#define GLEE_EXT_framebuffer_multisample     GLeeEnabled(&_GLEE_EXT_framebuffer_multisample)\r
+#define GLEE_MESAX_texture_stack     GLeeEnabled(&_GLEE_MESAX_texture_stack)\r
+#define GLEE_EXT_timer_query     GLeeEnabled(&_GLEE_EXT_timer_query)\r
+#define GLEE_EXT_gpu_program_parameters     GLeeEnabled(&_GLEE_EXT_gpu_program_parameters)\r
+#define GLEE_APPLE_flush_buffer_range     GLeeEnabled(&_GLEE_APPLE_flush_buffer_range)\r
+#define GLEE_EXT_gpu_shader4     GLeeEnabled(&_GLEE_EXT_gpu_shader4)\r
+#define GLEE_EXT_draw_instanced     GLeeEnabled(&_GLEE_EXT_draw_instanced)\r
+#define GLEE_EXT_packed_float     GLeeEnabled(&_GLEE_EXT_packed_float)\r
+#define GLEE_EXT_texture_array     GLeeEnabled(&_GLEE_EXT_texture_array)\r
+#define GLEE_EXT_texture_buffer_object     GLeeEnabled(&_GLEE_EXT_texture_buffer_object)\r
+#define GLEE_EXT_texture_compression_latc     GLeeEnabled(&_GLEE_EXT_texture_compression_latc)\r
+#define GLEE_EXT_texture_compression_rgtc     GLeeEnabled(&_GLEE_EXT_texture_compression_rgtc)\r
+#define GLEE_EXT_texture_shared_exponent     GLeeEnabled(&_GLEE_EXT_texture_shared_exponent)\r
+#define GLEE_NV_depth_buffer_float     GLeeEnabled(&_GLEE_NV_depth_buffer_float)\r
+#define GLEE_NV_framebuffer_multisample_coverage     GLeeEnabled(&_GLEE_NV_framebuffer_multisample_coverage)\r
+#define GLEE_EXT_framebuffer_sRGB     GLeeEnabled(&_GLEE_EXT_framebuffer_sRGB)\r
+#define GLEE_NV_geometry_shader4     GLeeEnabled(&_GLEE_NV_geometry_shader4)\r
+#define GLEE_NV_parameter_buffer_object     GLeeEnabled(&_GLEE_NV_parameter_buffer_object)\r
+#define GLEE_EXT_draw_buffers2     GLeeEnabled(&_GLEE_EXT_draw_buffers2)\r
+#define GLEE_NV_transform_feedback     GLeeEnabled(&_GLEE_NV_transform_feedback)\r
+#define GLEE_EXT_bindable_uniform     GLeeEnabled(&_GLEE_EXT_bindable_uniform)\r
+#define GLEE_EXT_texture_integer     GLeeEnabled(&_GLEE_EXT_texture_integer)\r
+#define GLEE_GREMEDY_frame_terminator     GLeeEnabled(&_GLEE_GREMEDY_frame_terminator)\r
+#define GLEE_NV_conditional_render     GLeeEnabled(&_GLEE_NV_conditional_render)\r
+#define GLEE_NV_present_video     GLeeEnabled(&_GLEE_NV_present_video)\r
+#define GLEE_EXT_transform_feedback     GLeeEnabled(&_GLEE_EXT_transform_feedback)\r
+#define GLEE_EXT_direct_state_access     GLeeEnabled(&_GLEE_EXT_direct_state_access)\r
+#define GLEE_EXT_vertex_array_bgra     GLeeEnabled(&_GLEE_EXT_vertex_array_bgra)\r
+#define GLEE_EXT_texture_swizzle     GLeeEnabled(&_GLEE_EXT_texture_swizzle)\r
+#define GLEE_NV_explicit_multisample     GLeeEnabled(&_GLEE_NV_explicit_multisample)\r
+#define GLEE_NV_transform_feedback2     GLeeEnabled(&_GLEE_NV_transform_feedback2)\r
+#define GLEE_SGIX_texture_select     GLeeEnabled(&_GLEE_SGIX_texture_select)\r
+#define GLEE_INGR_blend_func_separate     GLeeEnabled(&_GLEE_INGR_blend_func_separate)\r
+#define GLEE_SGIX_depth_pass_instrument     GLeeEnabled(&_GLEE_SGIX_depth_pass_instrument)\r
+#define GLEE_SGIX_igloo_interface     GLeeEnabled(&_GLEE_SGIX_igloo_interface)\r
+#define GLEE_EXT_fragment_lighting     GLeeEnabled(&_GLEE_EXT_fragment_lighting)\r
+#define GLEE_EXT_geometry_shader4     GLeeEnabled(&_GLEE_EXT_geometry_shader4)\r
+#define GLEE_EXT_scene_marker     GLeeEnabled(&_GLEE_EXT_scene_marker)\r
+#define GLEE_EXT_texture_compression_dxt1     GLeeEnabled(&_GLEE_EXT_texture_compression_dxt1)\r
+#define GLEE_EXT_texture_env     GLeeEnabled(&_GLEE_EXT_texture_env)\r
+#define GLEE_IBM_static_data     GLeeEnabled(&_GLEE_IBM_static_data)\r
+#define GLEE_NV_gpu_program4     GLeeEnabled(&_GLEE_NV_gpu_program4)\r
+#define GLEE_OES_byte_coordinates     GLeeEnabled(&_GLEE_OES_byte_coordinates)\r
+#define GLEE_OES_compressed_paletted_texture     GLeeEnabled(&_GLEE_OES_compressed_paletted_texture)\r
+#define GLEE_OES_single_precision     GLeeEnabled(&_GLEE_OES_single_precision)\r
+#define GLEE_SGIX_pixel_texture_bits     GLeeEnabled(&_GLEE_SGIX_pixel_texture_bits)\r
+#define GLEE_SGIX_texture_range     GLeeEnabled(&_GLEE_SGIX_texture_range)\r
+\r
+\r
+/*****************************************************************\r
+ * Additional types needed for extensions\r
+ *****************************************************************/\r
+\r
+/* Used for GLSL shader text */\r
+#ifndef GL_VERSION_2_0\r
+       typedef char GLchar; \r
+#endif\r
+\r
+#include <stddef.h>\r
+\r
+#ifndef GL_VERSION_1_5\r
+       typedef ptrdiff_t GLintptr;\r
+       typedef ptrdiff_t GLsizeiptr;\r
+#endif\r
+\r
+#ifndef GL_NV_half_float\r
+       typedef unsigned short GLhalfNV;\r
+#endif\r
+\r
+#ifndef GL_ARB_vertex_buffer_object\r
+       typedef ptrdiff_t GLintptrARB;\r
+       typedef ptrdiff_t GLsizeiptrARB;\r
+#endif\r
+\r
+#ifndef GL_ARB_shader_objects\r
+       typedef int GLhandleARB;\r
+       typedef char GLcharARB;\r
+#endif\r
+\r
+#ifndef GL_EXT_timer_query\r
+       typedef signed long long GLint64EXT;\r
+       typedef unsigned long long GLuint64EXT;\r
+#endif\r
+\r
+/* Platform-specific */\r
+\r
+#ifdef WIN32    \r
+\r
+       /* WGL */\r
+\r
+       #ifndef WGL_ARB_pbuffer\r
+           DECLARE_HANDLE(HPBUFFERARB);\r
+       #endif\r
+       \r
+       #ifndef WGL_EXT_pbuffer\r
+           DECLARE_HANDLE(HPBUFFEREXT);\r
+       #endif\r
+       \r
+    #ifndef WGL_NV_video_output\r
+        DECLARE_HANDLE(HPVIDEODEV);\r
+    #endif\r
+    \r
+    #ifndef WGL_NV_present_video\r
+        DECLARE_HANDLE(HVIDEOOUTPUTDEVICENV);\r
+    #endif    \r
+\r
+    #ifndef WGL_NV_gpu_affinity\r
+        DECLARE_HANDLE(HPGPUNV);\r
+        DECLARE_HANDLE(HGPUNV);\r
+\r
+        typedef struct _GPU_DEVICE {\r
+            DWORD  cb;\r
+            CHAR   DeviceName[32];\r
+            CHAR   DeviceString[128];\r
+            DWORD  Flags;\r
+            RECT   rcVirtualScreen;\r
+        } GPU_DEVICE, *PGPU_DEVICE;\r
+    #endif\r
+       \r
+#elif defined(__APPLE__) || defined(__APPLE_CC__)\r
+\r
+       /* Mac OS X */\r
+\r
+#else          \r
+\r
+       /* GLX */\r
+\r
+       typedef void (*__GLXextFuncPtr)(void);\r
+\r
+       #ifndef GLX_ARB_get_proc_address \r
+       #define GLX_ARB_get_proc_address 1\r
+           extern __GLXextFuncPtr glXGetProcAddressARB (const GLubyte *);\r
+           extern void ( * glXGetProcAddressARB (const GLubyte *procName))(void);\r
+           typedef __GLXextFuncPtr ( * PFNGLXGETPROCADDRESSARBPROC) (const GLubyte *procName);\r
+       #endif\r
+\r
+       #ifndef GLX_SGIX_fbconfig\r
+           typedef XID GLXFBConfigIDSGIX;\r
+           typedef struct __GLXFBConfigRec *GLXFBConfigSGIX;\r
+       #endif\r
+\r
+       #ifndef GLX_SGIX_pbuffer\r
+       typedef XID GLXPbufferSGIX;\r
+       typedef struct {\r
+               int type;\r
+               unsigned long serial;\r
+               Bool send_event;\r
+               Display *display;\r
+               GLXDrawable drawable;\r
+               int event_type;           \r
+               int draw_type;            \r
+               unsigned int mask;        \r
+               int x, y;\r
+               int width, height;\r
+               int count;\r
+       } GLXBufferClobberEventSGIX;\r
+       #endif\r
+\r
+       #ifndef GLX_SGIX_hyperpipe\r
+               #define _GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX 80\r
+               typedef struct \r
+               {\r
+                       char  pipeName[_GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX];\r
+                       int  networkId;\r
+               } GLXHyperpipeNetworkSGIX;\r
+\r
+               typedef struct \r
+               {\r
+                       char pipeName[_GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX];\r
+                       int channel;\r
+                       unsigned int participationType;\r
+                       int timeSlice;\r
+               } GLXHyperpipeConfigSGIX;\r
+\r
+               typedef struct \r
+               {\r
+                       char pipeName[_GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX];\r
+                       int srcXOrigin;\r
+                       int srcYOrigin;\r
+                       int srcWidth;\r
+                       int srcHeight;\r
+                       int destXOrigin;\r
+                       int destYOrigin;\r
+                       int destWidth;\r
+                       int destHeight;\r
+               } GLXPipeRect;\r
+\r
+               typedef struct \r
+               {\r
+                       char pipeName[_GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX];\r
+                       int XOrigin; \r
+                       int YOrigin;\r
+                       int maxHeight;\r
+                       int maxWidth;\r
+               } GLXPipeRectLimits;\r
+       #endif \r
+       \r
+       #ifndef GLX_NV_video_output\r
+    typedef unsigned int GLXVideoDeviceNV;\r
+    #endif // GLX_NV_video_output\r
+       \r
+#endif /* end platform specific */\r
+\r
+\r
+\r
+/* GL_VERSION_1_2 */\r
+\r
+#ifndef GL_VERSION_1_2\r
+#define GL_VERSION_1_2 1\r
+#define __GLEE_GL_VERSION_1_2 1\r
+/* Constants */\r
+#define GL_UNSIGNED_BYTE_3_3_2                             0x8032\r
+#define GL_UNSIGNED_SHORT_4_4_4_4                          0x8033\r
+#define GL_UNSIGNED_SHORT_5_5_5_1                          0x8034\r
+#define GL_UNSIGNED_INT_8_8_8_8                            0x8035\r
+#define GL_UNSIGNED_INT_10_10_10_2                         0x8036\r
+#define GL_RESCALE_NORMAL                                  0x803A\r
+#define GL_TEXTURE_BINDING_3D                              0x806A\r
+#define GL_PACK_SKIP_IMAGES                                0x806B\r
+#define GL_PACK_IMAGE_HEIGHT                               0x806C\r
+#define GL_UNPACK_SKIP_IMAGES                              0x806D\r
+#define GL_UNPACK_IMAGE_HEIGHT                             0x806E\r
+#define GL_TEXTURE_3D                                      0x806F\r
+#define GL_PROXY_TEXTURE_3D                                0x8070\r
+#define GL_TEXTURE_DEPTH                                   0x8071\r
+#define GL_TEXTURE_WRAP_R                                  0x8072\r
+#define GL_MAX_3D_TEXTURE_SIZE                             0x8073\r
+#define GL_UNSIGNED_BYTE_2_3_3_REV                         0x8362\r
+#define GL_UNSIGNED_SHORT_5_6_5                            0x8363\r
+#define GL_UNSIGNED_SHORT_5_6_5_REV                        0x8364\r
+#define GL_UNSIGNED_SHORT_4_4_4_4_REV                      0x8365\r
+#define GL_UNSIGNED_SHORT_1_5_5_5_REV                      0x8366\r
+#define GL_UNSIGNED_INT_8_8_8_8_REV                        0x8367\r
+#define GL_UNSIGNED_INT_2_10_10_10_REV                     0x8368\r
+#define GL_BGR                                             0x80E0\r
+#define GL_BGRA                                            0x80E1\r
+#define GL_MAX_ELEMENTS_VERTICES                           0x80E8\r
+#define GL_MAX_ELEMENTS_INDICES                            0x80E9\r
+#define GL_CLAMP_TO_EDGE                                   0x812F\r
+#define GL_TEXTURE_MIN_LOD                                 0x813A\r
+#define GL_TEXTURE_MAX_LOD                                 0x813B\r
+#define GL_TEXTURE_BASE_LEVEL                              0x813C\r
+#define GL_TEXTURE_MAX_LEVEL                               0x813D\r
+#define GL_LIGHT_MODEL_COLOR_CONTROL                       0x81F8\r
+#define GL_SINGLE_COLOR                                    0x81F9\r
+#define GL_SEPARATE_SPECULAR_COLOR                         0x81FA\r
+#define GL_SMOOTH_POINT_SIZE_RANGE                         0x0B12\r
+#define GL_SMOOTH_POINT_SIZE_GRANULARITY                   0x0B13\r
+#define GL_SMOOTH_LINE_WIDTH_RANGE                         0x0B22\r
+#define GL_SMOOTH_LINE_WIDTH_GRANULARITY                   0x0B23\r
+#define GL_ALIASED_POINT_SIZE_RANGE                        0x846D\r
+#define GL_ALIASED_LINE_WIDTH_RANGE                        0x846E\r
+#ifndef GLEE_H_DEFINED_glBlendColor\r
+#define GLEE_H_DEFINED_glBlendColor\r
+  typedef void (APIENTRYP GLEEPFNGLBLENDCOLORPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);\r
+  GLEE_EXTERN GLEEPFNGLBLENDCOLORPROC GLeeFuncPtr_glBlendColor;\r
+  #define glBlendColor GLeeFuncPtr_glBlendColor\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glBlendEquation\r
+#define GLEE_H_DEFINED_glBlendEquation\r
+  typedef void (APIENTRYP GLEEPFNGLBLENDEQUATIONPROC) (GLenum mode);\r
+  GLEE_EXTERN GLEEPFNGLBLENDEQUATIONPROC GLeeFuncPtr_glBlendEquation;\r
+  #define glBlendEquation GLeeFuncPtr_glBlendEquation\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glDrawRangeElements\r
+#define GLEE_H_DEFINED_glDrawRangeElements\r
+  typedef void (APIENTRYP GLEEPFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid * indices);\r
+  GLEE_EXTERN GLEEPFNGLDRAWRANGEELEMENTSPROC GLeeFuncPtr_glDrawRangeElements;\r
+  #define glDrawRangeElements GLeeFuncPtr_glDrawRangeElements\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glColorTable\r
+#define GLEE_H_DEFINED_glColorTable\r
+  typedef void (APIENTRYP GLEEPFNGLCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid * table);\r
+  GLEE_EXTERN GLEEPFNGLCOLORTABLEPROC GLeeFuncPtr_glColorTable;\r
+  #define glColorTable GLeeFuncPtr_glColorTable\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glColorTableParameterfv\r
+#define GLEE_H_DEFINED_glColorTableParameterfv\r
+  typedef void (APIENTRYP GLEEPFNGLCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLCOLORTABLEPARAMETERFVPROC GLeeFuncPtr_glColorTableParameterfv;\r
+  #define glColorTableParameterfv GLeeFuncPtr_glColorTableParameterfv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glColorTableParameteriv\r
+#define GLEE_H_DEFINED_glColorTableParameteriv\r
+  typedef void (APIENTRYP GLEEPFNGLCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLCOLORTABLEPARAMETERIVPROC GLeeFuncPtr_glColorTableParameteriv;\r
+  #define glColorTableParameteriv GLeeFuncPtr_glColorTableParameteriv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glCopyColorTable\r
+#define GLEE_H_DEFINED_glCopyColorTable\r
+  typedef void (APIENTRYP GLEEPFNGLCOPYCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);\r
+  GLEE_EXTERN GLEEPFNGLCOPYCOLORTABLEPROC GLeeFuncPtr_glCopyColorTable;\r
+  #define glCopyColorTable GLeeFuncPtr_glCopyColorTable\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetColorTable\r
+#define GLEE_H_DEFINED_glGetColorTable\r
+  typedef void (APIENTRYP GLEEPFNGLGETCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, GLvoid * table);\r
+  GLEE_EXTERN GLEEPFNGLGETCOLORTABLEPROC GLeeFuncPtr_glGetColorTable;\r
+  #define glGetColorTable GLeeFuncPtr_glGetColorTable\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetColorTableParameterfv\r
+#define GLEE_H_DEFINED_glGetColorTableParameterfv\r
+  typedef void (APIENTRYP GLEEPFNGLGETCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLGETCOLORTABLEPARAMETERFVPROC GLeeFuncPtr_glGetColorTableParameterfv;\r
+  #define glGetColorTableParameterfv GLeeFuncPtr_glGetColorTableParameterfv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetColorTableParameteriv\r
+#define GLEE_H_DEFINED_glGetColorTableParameteriv\r
+  typedef void (APIENTRYP GLEEPFNGLGETCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETCOLORTABLEPARAMETERIVPROC GLeeFuncPtr_glGetColorTableParameteriv;\r
+  #define glGetColorTableParameteriv GLeeFuncPtr_glGetColorTableParameteriv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glColorSubTable\r
+#define GLEE_H_DEFINED_glColorSubTable\r
+  typedef void (APIENTRYP GLEEPFNGLCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid * data);\r
+  GLEE_EXTERN GLEEPFNGLCOLORSUBTABLEPROC GLeeFuncPtr_glColorSubTable;\r
+  #define glColorSubTable GLeeFuncPtr_glColorSubTable\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glCopyColorSubTable\r
+#define GLEE_H_DEFINED_glCopyColorSubTable\r
+  typedef void (APIENTRYP GLEEPFNGLCOPYCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width);\r
+  GLEE_EXTERN GLEEPFNGLCOPYCOLORSUBTABLEPROC GLeeFuncPtr_glCopyColorSubTable;\r
+  #define glCopyColorSubTable GLeeFuncPtr_glCopyColorSubTable\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glConvolutionFilter1D\r
+#define GLEE_H_DEFINED_glConvolutionFilter1D\r
+  typedef void (APIENTRYP GLEEPFNGLCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid * image);\r
+  GLEE_EXTERN GLEEPFNGLCONVOLUTIONFILTER1DPROC GLeeFuncPtr_glConvolutionFilter1D;\r
+  #define glConvolutionFilter1D GLeeFuncPtr_glConvolutionFilter1D\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glConvolutionFilter2D\r
+#define GLEE_H_DEFINED_glConvolutionFilter2D\r
+  typedef void (APIENTRYP GLEEPFNGLCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * image);\r
+  GLEE_EXTERN GLEEPFNGLCONVOLUTIONFILTER2DPROC GLeeFuncPtr_glConvolutionFilter2D;\r
+  #define glConvolutionFilter2D GLeeFuncPtr_glConvolutionFilter2D\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glConvolutionParameterf\r
+#define GLEE_H_DEFINED_glConvolutionParameterf\r
+  typedef void (APIENTRYP GLEEPFNGLCONVOLUTIONPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat params);\r
+  GLEE_EXTERN GLEEPFNGLCONVOLUTIONPARAMETERFPROC GLeeFuncPtr_glConvolutionParameterf;\r
+  #define glConvolutionParameterf GLeeFuncPtr_glConvolutionParameterf\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glConvolutionParameterfv\r
+#define GLEE_H_DEFINED_glConvolutionParameterfv\r
+  typedef void (APIENTRYP GLEEPFNGLCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLCONVOLUTIONPARAMETERFVPROC GLeeFuncPtr_glConvolutionParameterfv;\r
+  #define glConvolutionParameterfv GLeeFuncPtr_glConvolutionParameterfv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glConvolutionParameteri\r
+#define GLEE_H_DEFINED_glConvolutionParameteri\r
+  typedef void (APIENTRYP GLEEPFNGLCONVOLUTIONPARAMETERIPROC) (GLenum target, GLenum pname, GLint params);\r
+  GLEE_EXTERN GLEEPFNGLCONVOLUTIONPARAMETERIPROC GLeeFuncPtr_glConvolutionParameteri;\r
+  #define glConvolutionParameteri GLeeFuncPtr_glConvolutionParameteri\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glConvolutionParameteriv\r
+#define GLEE_H_DEFINED_glConvolutionParameteriv\r
+  typedef void (APIENTRYP GLEEPFNGLCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLCONVOLUTIONPARAMETERIVPROC GLeeFuncPtr_glConvolutionParameteriv;\r
+  #define glConvolutionParameteriv GLeeFuncPtr_glConvolutionParameteriv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glCopyConvolutionFilter1D\r
+#define GLEE_H_DEFINED_glCopyConvolutionFilter1D\r
+  typedef void (APIENTRYP GLEEPFNGLCOPYCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);\r
+  GLEE_EXTERN GLEEPFNGLCOPYCONVOLUTIONFILTER1DPROC GLeeFuncPtr_glCopyConvolutionFilter1D;\r
+  #define glCopyConvolutionFilter1D GLeeFuncPtr_glCopyConvolutionFilter1D\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glCopyConvolutionFilter2D\r
+#define GLEE_H_DEFINED_glCopyConvolutionFilter2D\r
+  typedef void (APIENTRYP GLEEPFNGLCOPYCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height);\r
+  GLEE_EXTERN GLEEPFNGLCOPYCONVOLUTIONFILTER2DPROC GLeeFuncPtr_glCopyConvolutionFilter2D;\r
+  #define glCopyConvolutionFilter2D GLeeFuncPtr_glCopyConvolutionFilter2D\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetConvolutionFilter\r
+#define GLEE_H_DEFINED_glGetConvolutionFilter\r
+  typedef void (APIENTRYP GLEEPFNGLGETCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid * image);\r
+  GLEE_EXTERN GLEEPFNGLGETCONVOLUTIONFILTERPROC GLeeFuncPtr_glGetConvolutionFilter;\r
+  #define glGetConvolutionFilter GLeeFuncPtr_glGetConvolutionFilter\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetConvolutionParameterfv\r
+#define GLEE_H_DEFINED_glGetConvolutionParameterfv\r
+  typedef void (APIENTRYP GLEEPFNGLGETCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLGETCONVOLUTIONPARAMETERFVPROC GLeeFuncPtr_glGetConvolutionParameterfv;\r
+  #define glGetConvolutionParameterfv GLeeFuncPtr_glGetConvolutionParameterfv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetConvolutionParameteriv\r
+#define GLEE_H_DEFINED_glGetConvolutionParameteriv\r
+  typedef void (APIENTRYP GLEEPFNGLGETCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETCONVOLUTIONPARAMETERIVPROC GLeeFuncPtr_glGetConvolutionParameteriv;\r
+  #define glGetConvolutionParameteriv GLeeFuncPtr_glGetConvolutionParameteriv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetSeparableFilter\r
+#define GLEE_H_DEFINED_glGetSeparableFilter\r
+  typedef void (APIENTRYP GLEEPFNGLGETSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid * row, GLvoid * column, GLvoid * span);\r
+  GLEE_EXTERN GLEEPFNGLGETSEPARABLEFILTERPROC GLeeFuncPtr_glGetSeparableFilter;\r
+  #define glGetSeparableFilter GLeeFuncPtr_glGetSeparableFilter\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glSeparableFilter2D\r
+#define GLEE_H_DEFINED_glSeparableFilter2D\r
+  typedef void (APIENTRYP GLEEPFNGLSEPARABLEFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * row, const GLvoid * column);\r
+  GLEE_EXTERN GLEEPFNGLSEPARABLEFILTER2DPROC GLeeFuncPtr_glSeparableFilter2D;\r
+  #define glSeparableFilter2D GLeeFuncPtr_glSeparableFilter2D\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetHistogram\r
+#define GLEE_H_DEFINED_glGetHistogram\r
+  typedef void (APIENTRYP GLEEPFNGLGETHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid * values);\r
+  GLEE_EXTERN GLEEPFNGLGETHISTOGRAMPROC GLeeFuncPtr_glGetHistogram;\r
+  #define glGetHistogram GLeeFuncPtr_glGetHistogram\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetHistogramParameterfv\r
+#define GLEE_H_DEFINED_glGetHistogramParameterfv\r
+  typedef void (APIENTRYP GLEEPFNGLGETHISTOGRAMPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLGETHISTOGRAMPARAMETERFVPROC GLeeFuncPtr_glGetHistogramParameterfv;\r
+  #define glGetHistogramParameterfv GLeeFuncPtr_glGetHistogramParameterfv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetHistogramParameteriv\r
+#define GLEE_H_DEFINED_glGetHistogramParameteriv\r
+  typedef void (APIENTRYP GLEEPFNGLGETHISTOGRAMPARAMETERIVPROC) (GLenum target, GLenum pname, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETHISTOGRAMPARAMETERIVPROC GLeeFuncPtr_glGetHistogramParameteriv;\r
+  #define glGetHistogramParameteriv GLeeFuncPtr_glGetHistogramParameteriv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetMinmax\r
+#define GLEE_H_DEFINED_glGetMinmax\r
+  typedef void (APIENTRYP GLEEPFNGLGETMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid * values);\r
+  GLEE_EXTERN GLEEPFNGLGETMINMAXPROC GLeeFuncPtr_glGetMinmax;\r
+  #define glGetMinmax GLeeFuncPtr_glGetMinmax\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetMinmaxParameterfv\r
+#define GLEE_H_DEFINED_glGetMinmaxParameterfv\r
+  typedef void (APIENTRYP GLEEPFNGLGETMINMAXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLGETMINMAXPARAMETERFVPROC GLeeFuncPtr_glGetMinmaxParameterfv;\r
+  #define glGetMinmaxParameterfv GLeeFuncPtr_glGetMinmaxParameterfv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetMinmaxParameteriv\r
+#define GLEE_H_DEFINED_glGetMinmaxParameteriv\r
+  typedef void (APIENTRYP GLEEPFNGLGETMINMAXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETMINMAXPARAMETERIVPROC GLeeFuncPtr_glGetMinmaxParameteriv;\r
+  #define glGetMinmaxParameteriv GLeeFuncPtr_glGetMinmaxParameteriv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glHistogram\r
+#define GLEE_H_DEFINED_glHistogram\r
+  typedef void (APIENTRYP GLEEPFNGLHISTOGRAMPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink);\r
+  GLEE_EXTERN GLEEPFNGLHISTOGRAMPROC GLeeFuncPtr_glHistogram;\r
+  #define glHistogram GLeeFuncPtr_glHistogram\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMinmax\r
+#define GLEE_H_DEFINED_glMinmax\r
+  typedef void (APIENTRYP GLEEPFNGLMINMAXPROC) (GLenum target, GLenum internalformat, GLboolean sink);\r
+  GLEE_EXTERN GLEEPFNGLMINMAXPROC GLeeFuncPtr_glMinmax;\r
+  #define glMinmax GLeeFuncPtr_glMinmax\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glResetHistogram\r
+#define GLEE_H_DEFINED_glResetHistogram\r
+  typedef void (APIENTRYP GLEEPFNGLRESETHISTOGRAMPROC) (GLenum target);\r
+  GLEE_EXTERN GLEEPFNGLRESETHISTOGRAMPROC GLeeFuncPtr_glResetHistogram;\r
+  #define glResetHistogram GLeeFuncPtr_glResetHistogram\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glResetMinmax\r
+#define GLEE_H_DEFINED_glResetMinmax\r
+  typedef void (APIENTRYP GLEEPFNGLRESETMINMAXPROC) (GLenum target);\r
+  GLEE_EXTERN GLEEPFNGLRESETMINMAXPROC GLeeFuncPtr_glResetMinmax;\r
+  #define glResetMinmax GLeeFuncPtr_glResetMinmax\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTexImage3D\r
+#define GLEE_H_DEFINED_glTexImage3D\r
+  typedef void (APIENTRYP GLEEPFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid * pixels);\r
+  GLEE_EXTERN GLEEPFNGLTEXIMAGE3DPROC GLeeFuncPtr_glTexImage3D;\r
+  #define glTexImage3D GLeeFuncPtr_glTexImage3D\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTexSubImage3D\r
+#define GLEE_H_DEFINED_glTexSubImage3D\r
+  typedef void (APIENTRYP GLEEPFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid * pixels);\r
+  GLEE_EXTERN GLEEPFNGLTEXSUBIMAGE3DPROC GLeeFuncPtr_glTexSubImage3D;\r
+  #define glTexSubImage3D GLeeFuncPtr_glTexSubImage3D\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glCopyTexSubImage3D\r
+#define GLEE_H_DEFINED_glCopyTexSubImage3D\r
+  typedef void (APIENTRYP GLEEPFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);\r
+  GLEE_EXTERN GLEEPFNGLCOPYTEXSUBIMAGE3DPROC GLeeFuncPtr_glCopyTexSubImage3D;\r
+  #define glCopyTexSubImage3D GLeeFuncPtr_glCopyTexSubImage3D\r
+#endif\r
+#endif \r
+\r
+/* GL_ARB_imaging */\r
+\r
+#ifndef GL_ARB_imaging\r
+#define GL_ARB_imaging 1\r
+#define __GLEE_GL_ARB_imaging 1\r
+/* Constants */\r
+#define GL_CONSTANT_COLOR                                  0x8001\r
+#define GL_ONE_MINUS_CONSTANT_COLOR                        0x8002\r
+#define GL_CONSTANT_ALPHA                                  0x8003\r
+#define GL_ONE_MINUS_CONSTANT_ALPHA                        0x8004\r
+#define GL_BLEND_COLOR                                     0x8005\r
+#define GL_FUNC_ADD                                        0x8006\r
+#define GL_MIN                                             0x8007\r
+#define GL_MAX                                             0x8008\r
+#define GL_BLEND_EQUATION                                  0x8009\r
+#define GL_FUNC_SUBTRACT                                   0x800A\r
+#define GL_FUNC_REVERSE_SUBTRACT                           0x800B\r
+#define GL_CONVOLUTION_1D                                  0x8010\r
+#define GL_CONVOLUTION_2D                                  0x8011\r
+#define GL_SEPARABLE_2D                                    0x8012\r
+#define GL_CONVOLUTION_BORDER_MODE                         0x8013\r
+#define GL_CONVOLUTION_FILTER_SCALE                        0x8014\r
+#define GL_CONVOLUTION_FILTER_BIAS                         0x8015\r
+#define GL_REDUCE                                          0x8016\r
+#define GL_CONVOLUTION_FORMAT                              0x8017\r
+#define GL_CONVOLUTION_WIDTH                               0x8018\r
+#define GL_CONVOLUTION_HEIGHT                              0x8019\r
+#define GL_MAX_CONVOLUTION_WIDTH                           0x801A\r
+#define GL_MAX_CONVOLUTION_HEIGHT                          0x801B\r
+#define GL_POST_CONVOLUTION_RED_SCALE                      0x801C\r
+#define GL_POST_CONVOLUTION_GREEN_SCALE                    0x801D\r
+#define GL_POST_CONVOLUTION_BLUE_SCALE                     0x801E\r
+#define GL_POST_CONVOLUTION_ALPHA_SCALE                    0x801F\r
+#define GL_POST_CONVOLUTION_RED_BIAS                       0x8020\r
+#define GL_POST_CONVOLUTION_GREEN_BIAS                     0x8021\r
+#define GL_POST_CONVOLUTION_BLUE_BIAS                      0x8022\r
+#define GL_POST_CONVOLUTION_ALPHA_BIAS                     0x8023\r
+#define GL_HISTOGRAM                                       0x8024\r
+#define GL_PROXY_HISTOGRAM                                 0x8025\r
+#define GL_HISTOGRAM_WIDTH                                 0x8026\r
+#define GL_HISTOGRAM_FORMAT                                0x8027\r
+#define GL_HISTOGRAM_RED_SIZE                              0x8028\r
+#define GL_HISTOGRAM_GREEN_SIZE                            0x8029\r
+#define GL_HISTOGRAM_BLUE_SIZE                             0x802A\r
+#define GL_HISTOGRAM_ALPHA_SIZE                            0x802B\r
+#define GL_HISTOGRAM_LUMINANCE_SIZE                        0x802C\r
+#define GL_HISTOGRAM_SINK                                  0x802D\r
+#define GL_MINMAX                                          0x802E\r
+#define GL_MINMAX_FORMAT                                   0x802F\r
+#define GL_MINMAX_SINK                                     0x8030\r
+#define GL_TABLE_TOO_LARGE                                 0x8031\r
+#define GL_COLOR_MATRIX                                    0x80B1\r
+#define GL_COLOR_MATRIX_STACK_DEPTH                        0x80B2\r
+#define GL_MAX_COLOR_MATRIX_STACK_DEPTH                    0x80B3\r
+#define GL_POST_COLOR_MATRIX_RED_SCALE                     0x80B4\r
+#define GL_POST_COLOR_MATRIX_GREEN_SCALE                   0x80B5\r
+#define GL_POST_COLOR_MATRIX_BLUE_SCALE                    0x80B6\r
+#define GL_POST_COLOR_MATRIX_ALPHA_SCALE                   0x80B7\r
+#define GL_POST_COLOR_MATRIX_RED_BIAS                      0x80B8\r
+#define GL_POST_COLOR_MATRIX_GREEN_BIAS                    0x80B9\r
+#define GL_POST_COLOR_MATRIX_BLUE_BIAS                     0x80BA\r
+#define GL_POST_COLOR_MATRIX_ALPHA_BIAS                    0x80BB\r
+#define GL_COLOR_TABLE                                     0x80D0\r
+#define GL_POST_CONVOLUTION_COLOR_TABLE                    0x80D1\r
+#define GL_POST_COLOR_MATRIX_COLOR_TABLE                   0x80D2\r
+#define GL_PROXY_COLOR_TABLE                               0x80D3\r
+#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE              0x80D4\r
+#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE             0x80D5\r
+#define GL_COLOR_TABLE_SCALE                               0x80D6\r
+#define GL_COLOR_TABLE_BIAS                                0x80D7\r
+#define GL_COLOR_TABLE_FORMAT                              0x80D8\r
+#define GL_COLOR_TABLE_WIDTH                               0x80D9\r
+#define GL_COLOR_TABLE_RED_SIZE                            0x80DA\r
+#define GL_COLOR_TABLE_GREEN_SIZE                          0x80DB\r
+#define GL_COLOR_TABLE_BLUE_SIZE                           0x80DC\r
+#define GL_COLOR_TABLE_ALPHA_SIZE                          0x80DD\r
+#define GL_COLOR_TABLE_LUMINANCE_SIZE                      0x80DE\r
+#define GL_COLOR_TABLE_INTENSITY_SIZE                      0x80DF\r
+#define GL_CONSTANT_BORDER                                 0x8151\r
+#define GL_REPLICATE_BORDER                                0x8153\r
+#define GL_CONVOLUTION_BORDER_COLOR                        0x8154\r
+#endif \r
+\r
+/* GL_VERSION_1_3 */\r
+\r
+#ifndef GL_VERSION_1_3\r
+#define GL_VERSION_1_3 1\r
+#define __GLEE_GL_VERSION_1_3 1\r
+/* Constants */\r
+#define GL_TEXTURE0                                        0x84C0\r
+#define GL_TEXTURE1                                        0x84C1\r
+#define GL_TEXTURE2                                        0x84C2\r
+#define GL_TEXTURE3                                        0x84C3\r
+#define GL_TEXTURE4                                        0x84C4\r
+#define GL_TEXTURE5                                        0x84C5\r
+#define GL_TEXTURE6                                        0x84C6\r
+#define GL_TEXTURE7                                        0x84C7\r
+#define GL_TEXTURE8                                        0x84C8\r
+#define GL_TEXTURE9                                        0x84C9\r
+#define GL_TEXTURE10                                       0x84CA\r
+#define GL_TEXTURE11                                       0x84CB\r
+#define GL_TEXTURE12                                       0x84CC\r
+#define GL_TEXTURE13                                       0x84CD\r
+#define GL_TEXTURE14                                       0x84CE\r
+#define GL_TEXTURE15                                       0x84CF\r
+#define GL_TEXTURE16                                       0x84D0\r
+#define GL_TEXTURE17                                       0x84D1\r
+#define GL_TEXTURE18                                       0x84D2\r
+#define GL_TEXTURE19                                       0x84D3\r
+#define GL_TEXTURE20                                       0x84D4\r
+#define GL_TEXTURE21                                       0x84D5\r
+#define GL_TEXTURE22                                       0x84D6\r
+#define GL_TEXTURE23                                       0x84D7\r
+#define GL_TEXTURE24                                       0x84D8\r
+#define GL_TEXTURE25                                       0x84D9\r
+#define GL_TEXTURE26                                       0x84DA\r
+#define GL_TEXTURE27                                       0x84DB\r
+#define GL_TEXTURE28                                       0x84DC\r
+#define GL_TEXTURE29                                       0x84DD\r
+#define GL_TEXTURE30                                       0x84DE\r
+#define GL_TEXTURE31                                       0x84DF\r
+#define GL_ACTIVE_TEXTURE                                  0x84E0\r
+#define GL_CLIENT_ACTIVE_TEXTURE                           0x84E1\r
+#define GL_MAX_TEXTURE_UNITS                               0x84E2\r
+#define GL_TRANSPOSE_MODELVIEW_MATRIX                      0x84E3\r
+#define GL_TRANSPOSE_PROJECTION_MATRIX                     0x84E4\r
+#define GL_TRANSPOSE_TEXTURE_MATRIX                        0x84E5\r
+#define GL_TRANSPOSE_COLOR_MATRIX                          0x84E6\r
+#define GL_MULTISAMPLE                                     0x809D\r
+#define GL_SAMPLE_ALPHA_TO_COVERAGE                        0x809E\r
+#define GL_SAMPLE_ALPHA_TO_ONE                             0x809F\r
+#define GL_SAMPLE_COVERAGE                                 0x80A0\r
+#define GL_SAMPLE_BUFFERS                                  0x80A8\r
+#define GL_SAMPLES                                         0x80A9\r
+#define GL_SAMPLE_COVERAGE_VALUE                           0x80AA\r
+#define GL_SAMPLE_COVERAGE_INVERT                          0x80AB\r
+#define GL_MULTISAMPLE_BIT                                 0x20000000\r
+#define GL_NORMAL_MAP                                      0x8511\r
+#define GL_REFLECTION_MAP                                  0x8512\r
+#define GL_TEXTURE_CUBE_MAP                                0x8513\r
+#define GL_TEXTURE_BINDING_CUBE_MAP                        0x8514\r
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_X                     0x8515\r
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X                     0x8516\r
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y                     0x8517\r
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y                     0x8518\r
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z                     0x8519\r
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z                     0x851A\r
+#define GL_PROXY_TEXTURE_CUBE_MAP                          0x851B\r
+#define GL_MAX_CUBE_MAP_TEXTURE_SIZE                       0x851C\r
+#define GL_COMPRESSED_ALPHA                                0x84E9\r
+#define GL_COMPRESSED_LUMINANCE                            0x84EA\r
+#define GL_COMPRESSED_LUMINANCE_ALPHA                      0x84EB\r
+#define GL_COMPRESSED_INTENSITY                            0x84EC\r
+#define GL_COMPRESSED_RGB                                  0x84ED\r
+#define GL_COMPRESSED_RGBA                                 0x84EE\r
+#define GL_TEXTURE_COMPRESSION_HINT                        0x84EF\r
+#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE                   0x86A0\r
+#define GL_TEXTURE_COMPRESSED                              0x86A1\r
+#define GL_NUM_COMPRESSED_TEXTURE_FORMATS                  0x86A2\r
+#define GL_COMPRESSED_TEXTURE_FORMATS                      0x86A3\r
+#define GL_CLAMP_TO_BORDER                                 0x812D\r
+#define GL_COMBINE                                         0x8570\r
+#define GL_COMBINE_RGB                                     0x8571\r
+#define GL_COMBINE_ALPHA                                   0x8572\r
+#define GL_SOURCE0_RGB                                     0x8580\r
+#define GL_SOURCE1_RGB                                     0x8581\r
+#define GL_SOURCE2_RGB                                     0x8582\r
+#define GL_SOURCE0_ALPHA                                   0x8588\r
+#define GL_SOURCE1_ALPHA                                   0x8589\r
+#define GL_SOURCE2_ALPHA                                   0x858A\r
+#define GL_OPERAND0_RGB                                    0x8590\r
+#define GL_OPERAND1_RGB                                    0x8591\r
+#define GL_OPERAND2_RGB                                    0x8592\r
+#define GL_OPERAND0_ALPHA                                  0x8598\r
+#define GL_OPERAND1_ALPHA                                  0x8599\r
+#define GL_OPERAND2_ALPHA                                  0x859A\r
+#define GL_RGB_SCALE                                       0x8573\r
+#define GL_ADD_SIGNED                                      0x8574\r
+#define GL_INTERPOLATE                                     0x8575\r
+#define GL_SUBTRACT                                        0x84E7\r
+#define GL_CONSTANT                                        0x8576\r
+#define GL_PRIMARY_COLOR                                   0x8577\r
+#define GL_PREVIOUS                                        0x8578\r
+#define GL_DOT3_RGB                                        0x86AE\r
+#define GL_DOT3_RGBA                                       0x86AF\r
+#ifndef GLEE_H_DEFINED_glActiveTexture\r
+#define GLEE_H_DEFINED_glActiveTexture\r
+  typedef void (APIENTRYP GLEEPFNGLACTIVETEXTUREPROC) (GLenum texture);\r
+  GLEE_EXTERN GLEEPFNGLACTIVETEXTUREPROC GLeeFuncPtr_glActiveTexture;\r
+  #define glActiveTexture GLeeFuncPtr_glActiveTexture\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glClientActiveTexture\r
+#define GLEE_H_DEFINED_glClientActiveTexture\r
+  typedef void (APIENTRYP GLEEPFNGLCLIENTACTIVETEXTUREPROC) (GLenum texture);\r
+  GLEE_EXTERN GLEEPFNGLCLIENTACTIVETEXTUREPROC GLeeFuncPtr_glClientActiveTexture;\r
+  #define glClientActiveTexture GLeeFuncPtr_glClientActiveTexture\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord1d\r
+#define GLEE_H_DEFINED_glMultiTexCoord1d\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD1DPROC) (GLenum target, GLdouble s);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD1DPROC GLeeFuncPtr_glMultiTexCoord1d;\r
+  #define glMultiTexCoord1d GLeeFuncPtr_glMultiTexCoord1d\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord1dv\r
+#define GLEE_H_DEFINED_glMultiTexCoord1dv\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD1DVPROC) (GLenum target, const GLdouble * v);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD1DVPROC GLeeFuncPtr_glMultiTexCoord1dv;\r
+  #define glMultiTexCoord1dv GLeeFuncPtr_glMultiTexCoord1dv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord1f\r
+#define GLEE_H_DEFINED_glMultiTexCoord1f\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD1FPROC) (GLenum target, GLfloat s);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD1FPROC GLeeFuncPtr_glMultiTexCoord1f;\r
+  #define glMultiTexCoord1f GLeeFuncPtr_glMultiTexCoord1f\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord1fv\r
+#define GLEE_H_DEFINED_glMultiTexCoord1fv\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD1FVPROC) (GLenum target, const GLfloat * v);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD1FVPROC GLeeFuncPtr_glMultiTexCoord1fv;\r
+  #define glMultiTexCoord1fv GLeeFuncPtr_glMultiTexCoord1fv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord1i\r
+#define GLEE_H_DEFINED_glMultiTexCoord1i\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD1IPROC) (GLenum target, GLint s);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD1IPROC GLeeFuncPtr_glMultiTexCoord1i;\r
+  #define glMultiTexCoord1i GLeeFuncPtr_glMultiTexCoord1i\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord1iv\r
+#define GLEE_H_DEFINED_glMultiTexCoord1iv\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD1IVPROC) (GLenum target, const GLint * v);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD1IVPROC GLeeFuncPtr_glMultiTexCoord1iv;\r
+  #define glMultiTexCoord1iv GLeeFuncPtr_glMultiTexCoord1iv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord1s\r
+#define GLEE_H_DEFINED_glMultiTexCoord1s\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD1SPROC) (GLenum target, GLshort s);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD1SPROC GLeeFuncPtr_glMultiTexCoord1s;\r
+  #define glMultiTexCoord1s GLeeFuncPtr_glMultiTexCoord1s\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord1sv\r
+#define GLEE_H_DEFINED_glMultiTexCoord1sv\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD1SVPROC) (GLenum target, const GLshort * v);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD1SVPROC GLeeFuncPtr_glMultiTexCoord1sv;\r
+  #define glMultiTexCoord1sv GLeeFuncPtr_glMultiTexCoord1sv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord2d\r
+#define GLEE_H_DEFINED_glMultiTexCoord2d\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD2DPROC) (GLenum target, GLdouble s, GLdouble t);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD2DPROC GLeeFuncPtr_glMultiTexCoord2d;\r
+  #define glMultiTexCoord2d GLeeFuncPtr_glMultiTexCoord2d\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord2dv\r
+#define GLEE_H_DEFINED_glMultiTexCoord2dv\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD2DVPROC) (GLenum target, const GLdouble * v);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD2DVPROC GLeeFuncPtr_glMultiTexCoord2dv;\r
+  #define glMultiTexCoord2dv GLeeFuncPtr_glMultiTexCoord2dv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord2f\r
+#define GLEE_H_DEFINED_glMultiTexCoord2f\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD2FPROC) (GLenum target, GLfloat s, GLfloat t);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD2FPROC GLeeFuncPtr_glMultiTexCoord2f;\r
+  #define glMultiTexCoord2f GLeeFuncPtr_glMultiTexCoord2f\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord2fv\r
+#define GLEE_H_DEFINED_glMultiTexCoord2fv\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD2FVPROC) (GLenum target, const GLfloat * v);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD2FVPROC GLeeFuncPtr_glMultiTexCoord2fv;\r
+  #define glMultiTexCoord2fv GLeeFuncPtr_glMultiTexCoord2fv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord2i\r
+#define GLEE_H_DEFINED_glMultiTexCoord2i\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD2IPROC) (GLenum target, GLint s, GLint t);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD2IPROC GLeeFuncPtr_glMultiTexCoord2i;\r
+  #define glMultiTexCoord2i GLeeFuncPtr_glMultiTexCoord2i\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord2iv\r
+#define GLEE_H_DEFINED_glMultiTexCoord2iv\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD2IVPROC) (GLenum target, const GLint * v);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD2IVPROC GLeeFuncPtr_glMultiTexCoord2iv;\r
+  #define glMultiTexCoord2iv GLeeFuncPtr_glMultiTexCoord2iv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord2s\r
+#define GLEE_H_DEFINED_glMultiTexCoord2s\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD2SPROC) (GLenum target, GLshort s, GLshort t);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD2SPROC GLeeFuncPtr_glMultiTexCoord2s;\r
+  #define glMultiTexCoord2s GLeeFuncPtr_glMultiTexCoord2s\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord2sv\r
+#define GLEE_H_DEFINED_glMultiTexCoord2sv\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD2SVPROC) (GLenum target, const GLshort * v);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD2SVPROC GLeeFuncPtr_glMultiTexCoord2sv;\r
+  #define glMultiTexCoord2sv GLeeFuncPtr_glMultiTexCoord2sv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord3d\r
+#define GLEE_H_DEFINED_glMultiTexCoord3d\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD3DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD3DPROC GLeeFuncPtr_glMultiTexCoord3d;\r
+  #define glMultiTexCoord3d GLeeFuncPtr_glMultiTexCoord3d\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord3dv\r
+#define GLEE_H_DEFINED_glMultiTexCoord3dv\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD3DVPROC) (GLenum target, const GLdouble * v);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD3DVPROC GLeeFuncPtr_glMultiTexCoord3dv;\r
+  #define glMultiTexCoord3dv GLeeFuncPtr_glMultiTexCoord3dv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord3f\r
+#define GLEE_H_DEFINED_glMultiTexCoord3f\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD3FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD3FPROC GLeeFuncPtr_glMultiTexCoord3f;\r
+  #define glMultiTexCoord3f GLeeFuncPtr_glMultiTexCoord3f\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord3fv\r
+#define GLEE_H_DEFINED_glMultiTexCoord3fv\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD3FVPROC) (GLenum target, const GLfloat * v);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD3FVPROC GLeeFuncPtr_glMultiTexCoord3fv;\r
+  #define glMultiTexCoord3fv GLeeFuncPtr_glMultiTexCoord3fv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord3i\r
+#define GLEE_H_DEFINED_glMultiTexCoord3i\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD3IPROC) (GLenum target, GLint s, GLint t, GLint r);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD3IPROC GLeeFuncPtr_glMultiTexCoord3i;\r
+  #define glMultiTexCoord3i GLeeFuncPtr_glMultiTexCoord3i\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord3iv\r
+#define GLEE_H_DEFINED_glMultiTexCoord3iv\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD3IVPROC) (GLenum target, const GLint * v);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD3IVPROC GLeeFuncPtr_glMultiTexCoord3iv;\r
+  #define glMultiTexCoord3iv GLeeFuncPtr_glMultiTexCoord3iv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord3s\r
+#define GLEE_H_DEFINED_glMultiTexCoord3s\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD3SPROC) (GLenum target, GLshort s, GLshort t, GLshort r);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD3SPROC GLeeFuncPtr_glMultiTexCoord3s;\r
+  #define glMultiTexCoord3s GLeeFuncPtr_glMultiTexCoord3s\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord3sv\r
+#define GLEE_H_DEFINED_glMultiTexCoord3sv\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD3SVPROC) (GLenum target, const GLshort * v);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD3SVPROC GLeeFuncPtr_glMultiTexCoord3sv;\r
+  #define glMultiTexCoord3sv GLeeFuncPtr_glMultiTexCoord3sv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord4d\r
+#define GLEE_H_DEFINED_glMultiTexCoord4d\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD4DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD4DPROC GLeeFuncPtr_glMultiTexCoord4d;\r
+  #define glMultiTexCoord4d GLeeFuncPtr_glMultiTexCoord4d\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord4dv\r
+#define GLEE_H_DEFINED_glMultiTexCoord4dv\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD4DVPROC) (GLenum target, const GLdouble * v);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD4DVPROC GLeeFuncPtr_glMultiTexCoord4dv;\r
+  #define glMultiTexCoord4dv GLeeFuncPtr_glMultiTexCoord4dv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord4f\r
+#define GLEE_H_DEFINED_glMultiTexCoord4f\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD4FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD4FPROC GLeeFuncPtr_glMultiTexCoord4f;\r
+  #define glMultiTexCoord4f GLeeFuncPtr_glMultiTexCoord4f\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord4fv\r
+#define GLEE_H_DEFINED_glMultiTexCoord4fv\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD4FVPROC) (GLenum target, const GLfloat * v);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD4FVPROC GLeeFuncPtr_glMultiTexCoord4fv;\r
+  #define glMultiTexCoord4fv GLeeFuncPtr_glMultiTexCoord4fv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord4i\r
+#define GLEE_H_DEFINED_glMultiTexCoord4i\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD4IPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD4IPROC GLeeFuncPtr_glMultiTexCoord4i;\r
+  #define glMultiTexCoord4i GLeeFuncPtr_glMultiTexCoord4i\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord4iv\r
+#define GLEE_H_DEFINED_glMultiTexCoord4iv\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD4IVPROC) (GLenum target, const GLint * v);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD4IVPROC GLeeFuncPtr_glMultiTexCoord4iv;\r
+  #define glMultiTexCoord4iv GLeeFuncPtr_glMultiTexCoord4iv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord4s\r
+#define GLEE_H_DEFINED_glMultiTexCoord4s\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD4SPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD4SPROC GLeeFuncPtr_glMultiTexCoord4s;\r
+  #define glMultiTexCoord4s GLeeFuncPtr_glMultiTexCoord4s\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord4sv\r
+#define GLEE_H_DEFINED_glMultiTexCoord4sv\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD4SVPROC) (GLenum target, const GLshort * v);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD4SVPROC GLeeFuncPtr_glMultiTexCoord4sv;\r
+  #define glMultiTexCoord4sv GLeeFuncPtr_glMultiTexCoord4sv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glLoadTransposeMatrixf\r
+#define GLEE_H_DEFINED_glLoadTransposeMatrixf\r
+  typedef void (APIENTRYP GLEEPFNGLLOADTRANSPOSEMATRIXFPROC) (const GLfloat * m);\r
+  GLEE_EXTERN GLEEPFNGLLOADTRANSPOSEMATRIXFPROC GLeeFuncPtr_glLoadTransposeMatrixf;\r
+  #define glLoadTransposeMatrixf GLeeFuncPtr_glLoadTransposeMatrixf\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glLoadTransposeMatrixd\r
+#define GLEE_H_DEFINED_glLoadTransposeMatrixd\r
+  typedef void (APIENTRYP GLEEPFNGLLOADTRANSPOSEMATRIXDPROC) (const GLdouble * m);\r
+  GLEE_EXTERN GLEEPFNGLLOADTRANSPOSEMATRIXDPROC GLeeFuncPtr_glLoadTransposeMatrixd;\r
+  #define glLoadTransposeMatrixd GLeeFuncPtr_glLoadTransposeMatrixd\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultTransposeMatrixf\r
+#define GLEE_H_DEFINED_glMultTransposeMatrixf\r
+  typedef void (APIENTRYP GLEEPFNGLMULTTRANSPOSEMATRIXFPROC) (const GLfloat * m);\r
+  GLEE_EXTERN GLEEPFNGLMULTTRANSPOSEMATRIXFPROC GLeeFuncPtr_glMultTransposeMatrixf;\r
+  #define glMultTransposeMatrixf GLeeFuncPtr_glMultTransposeMatrixf\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultTransposeMatrixd\r
+#define GLEE_H_DEFINED_glMultTransposeMatrixd\r
+  typedef void (APIENTRYP GLEEPFNGLMULTTRANSPOSEMATRIXDPROC) (const GLdouble * m);\r
+  GLEE_EXTERN GLEEPFNGLMULTTRANSPOSEMATRIXDPROC GLeeFuncPtr_glMultTransposeMatrixd;\r
+  #define glMultTransposeMatrixd GLeeFuncPtr_glMultTransposeMatrixd\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glSampleCoverage\r
+#define GLEE_H_DEFINED_glSampleCoverage\r
+  typedef void (APIENTRYP GLEEPFNGLSAMPLECOVERAGEPROC) (GLclampf value, GLboolean invert);\r
+  GLEE_EXTERN GLEEPFNGLSAMPLECOVERAGEPROC GLeeFuncPtr_glSampleCoverage;\r
+  #define glSampleCoverage GLeeFuncPtr_glSampleCoverage\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glCompressedTexImage3D\r
+#define GLEE_H_DEFINED_glCompressedTexImage3D\r
+  typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid * data);\r
+  GLEE_EXTERN GLEEPFNGLCOMPRESSEDTEXIMAGE3DPROC GLeeFuncPtr_glCompressedTexImage3D;\r
+  #define glCompressedTexImage3D GLeeFuncPtr_glCompressedTexImage3D\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glCompressedTexImage2D\r
+#define GLEE_H_DEFINED_glCompressedTexImage2D\r
+  typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid * data);\r
+  GLEE_EXTERN GLEEPFNGLCOMPRESSEDTEXIMAGE2DPROC GLeeFuncPtr_glCompressedTexImage2D;\r
+  #define glCompressedTexImage2D GLeeFuncPtr_glCompressedTexImage2D\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glCompressedTexImage1D\r
+#define GLEE_H_DEFINED_glCompressedTexImage1D\r
+  typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid * data);\r
+  GLEE_EXTERN GLEEPFNGLCOMPRESSEDTEXIMAGE1DPROC GLeeFuncPtr_glCompressedTexImage1D;\r
+  #define glCompressedTexImage1D GLeeFuncPtr_glCompressedTexImage1D\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glCompressedTexSubImage3D\r
+#define GLEE_H_DEFINED_glCompressedTexSubImage3D\r
+  typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid * data);\r
+  GLEE_EXTERN GLEEPFNGLCOMPRESSEDTEXSUBIMAGE3DPROC GLeeFuncPtr_glCompressedTexSubImage3D;\r
+  #define glCompressedTexSubImage3D GLeeFuncPtr_glCompressedTexSubImage3D\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glCompressedTexSubImage2D\r
+#define GLEE_H_DEFINED_glCompressedTexSubImage2D\r
+  typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid * data);\r
+  GLEE_EXTERN GLEEPFNGLCOMPRESSEDTEXSUBIMAGE2DPROC GLeeFuncPtr_glCompressedTexSubImage2D;\r
+  #define glCompressedTexSubImage2D GLeeFuncPtr_glCompressedTexSubImage2D\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glCompressedTexSubImage1D\r
+#define GLEE_H_DEFINED_glCompressedTexSubImage1D\r
+  typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid * data);\r
+  GLEE_EXTERN GLEEPFNGLCOMPRESSEDTEXSUBIMAGE1DPROC GLeeFuncPtr_glCompressedTexSubImage1D;\r
+  #define glCompressedTexSubImage1D GLeeFuncPtr_glCompressedTexSubImage1D\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetCompressedTexImage\r
+#define GLEE_H_DEFINED_glGetCompressedTexImage\r
+  typedef void (APIENTRYP GLEEPFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint level, GLvoid * img);\r
+  GLEE_EXTERN GLEEPFNGLGETCOMPRESSEDTEXIMAGEPROC GLeeFuncPtr_glGetCompressedTexImage;\r
+  #define glGetCompressedTexImage GLeeFuncPtr_glGetCompressedTexImage\r
+#endif\r
+#endif \r
+\r
+/* GL_VERSION_1_4 */\r
+\r
+#ifndef GL_VERSION_1_4\r
+#define GL_VERSION_1_4 1\r
+#define __GLEE_GL_VERSION_1_4 1\r
+/* Constants */\r
+#define GL_BLEND_DST_RGB                                   0x80C8\r
+#define GL_BLEND_SRC_RGB                                   0x80C9\r
+#define GL_BLEND_DST_ALPHA                                 0x80CA\r
+#define GL_BLEND_SRC_ALPHA                                 0x80CB\r
+#define GL_POINT_SIZE_MIN                                  0x8126\r
+#define GL_POINT_SIZE_MAX                                  0x8127\r
+#define GL_POINT_FADE_THRESHOLD_SIZE                       0x8128\r
+#define GL_POINT_DISTANCE_ATTENUATION                      0x8129\r
+#define GL_GENERATE_MIPMAP                                 0x8191\r
+#define GL_GENERATE_MIPMAP_HINT                            0x8192\r
+#define GL_DEPTH_COMPONENT16                               0x81A5\r
+#define GL_DEPTH_COMPONENT24                               0x81A6\r
+#define GL_DEPTH_COMPONENT32                               0x81A7\r
+#define GL_MIRRORED_REPEAT                                 0x8370\r
+#define GL_FOG_COORDINATE_SOURCE                           0x8450\r
+#define GL_FOG_COORDINATE                                  0x8451\r
+#define GL_FRAGMENT_DEPTH                                  0x8452\r
+#define GL_CURRENT_FOG_COORDINATE                          0x8453\r
+#define GL_FOG_COORDINATE_ARRAY_TYPE                       0x8454\r
+#define GL_FOG_COORDINATE_ARRAY_STRIDE                     0x8455\r
+#define GL_FOG_COORDINATE_ARRAY_POINTER                    0x8456\r
+#define GL_FOG_COORDINATE_ARRAY                            0x8457\r
+#define GL_COLOR_SUM                                       0x8458\r
+#define GL_CURRENT_SECONDARY_COLOR                         0x8459\r
+#define GL_SECONDARY_COLOR_ARRAY_SIZE                      0x845A\r
+#define GL_SECONDARY_COLOR_ARRAY_TYPE                      0x845B\r
+#define GL_SECONDARY_COLOR_ARRAY_STRIDE                    0x845C\r
+#define GL_SECONDARY_COLOR_ARRAY_POINTER                   0x845D\r
+#define GL_SECONDARY_COLOR_ARRAY                           0x845E\r
+#define GL_MAX_TEXTURE_LOD_BIAS                            0x84FD\r
+#define GL_TEXTURE_FILTER_CONTROL                          0x8500\r
+#define GL_TEXTURE_LOD_BIAS                                0x8501\r
+#define GL_INCR_WRAP                                       0x8507\r
+#define GL_DECR_WRAP                                       0x8508\r
+#define GL_TEXTURE_DEPTH_SIZE                              0x884A\r
+#define GL_DEPTH_TEXTURE_MODE                              0x884B\r
+#define GL_TEXTURE_COMPARE_MODE                            0x884C\r
+#define GL_TEXTURE_COMPARE_FUNC                            0x884D\r
+#define GL_COMPARE_R_TO_TEXTURE                            0x884E\r
+#ifndef GLEE_H_DEFINED_glBlendFuncSeparate\r
+#define GLEE_H_DEFINED_glBlendFuncSeparate\r
+  typedef void (APIENTRYP GLEEPFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);\r
+  GLEE_EXTERN GLEEPFNGLBLENDFUNCSEPARATEPROC GLeeFuncPtr_glBlendFuncSeparate;\r
+  #define glBlendFuncSeparate GLeeFuncPtr_glBlendFuncSeparate\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFogCoordf\r
+#define GLEE_H_DEFINED_glFogCoordf\r
+  typedef void (APIENTRYP GLEEPFNGLFOGCOORDFPROC) (GLfloat coord);\r
+  GLEE_EXTERN GLEEPFNGLFOGCOORDFPROC GLeeFuncPtr_glFogCoordf;\r
+  #define glFogCoordf GLeeFuncPtr_glFogCoordf\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFogCoordfv\r
+#define GLEE_H_DEFINED_glFogCoordfv\r
+  typedef void (APIENTRYP GLEEPFNGLFOGCOORDFVPROC) (const GLfloat * coord);\r
+  GLEE_EXTERN GLEEPFNGLFOGCOORDFVPROC GLeeFuncPtr_glFogCoordfv;\r
+  #define glFogCoordfv GLeeFuncPtr_glFogCoordfv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFogCoordd\r
+#define GLEE_H_DEFINED_glFogCoordd\r
+  typedef void (APIENTRYP GLEEPFNGLFOGCOORDDPROC) (GLdouble coord);\r
+  GLEE_EXTERN GLEEPFNGLFOGCOORDDPROC GLeeFuncPtr_glFogCoordd;\r
+  #define glFogCoordd GLeeFuncPtr_glFogCoordd\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFogCoorddv\r
+#define GLEE_H_DEFINED_glFogCoorddv\r
+  typedef void (APIENTRYP GLEEPFNGLFOGCOORDDVPROC) (const GLdouble * coord);\r
+  GLEE_EXTERN GLEEPFNGLFOGCOORDDVPROC GLeeFuncPtr_glFogCoorddv;\r
+  #define glFogCoorddv GLeeFuncPtr_glFogCoorddv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFogCoordPointer\r
+#define GLEE_H_DEFINED_glFogCoordPointer\r
+  typedef void (APIENTRYP GLEEPFNGLFOGCOORDPOINTERPROC) (GLenum type, GLsizei stride, const GLvoid * pointer);\r
+  GLEE_EXTERN GLEEPFNGLFOGCOORDPOINTERPROC GLeeFuncPtr_glFogCoordPointer;\r
+  #define glFogCoordPointer GLeeFuncPtr_glFogCoordPointer\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiDrawArrays\r
+#define GLEE_H_DEFINED_glMultiDrawArrays\r
+  typedef void (APIENTRYP GLEEPFNGLMULTIDRAWARRAYSPROC) (GLenum mode, GLint * first, GLsizei * count, GLsizei primcount);\r
+  GLEE_EXTERN GLEEPFNGLMULTIDRAWARRAYSPROC GLeeFuncPtr_glMultiDrawArrays;\r
+  #define glMultiDrawArrays GLeeFuncPtr_glMultiDrawArrays\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiDrawElements\r
+#define GLEE_H_DEFINED_glMultiDrawElements\r
+  typedef void (APIENTRYP GLEEPFNGLMULTIDRAWELEMENTSPROC) (GLenum mode, const GLsizei * count, GLenum type, const GLvoid* * indices, GLsizei primcount);\r
+  GLEE_EXTERN GLEEPFNGLMULTIDRAWELEMENTSPROC GLeeFuncPtr_glMultiDrawElements;\r
+  #define glMultiDrawElements GLeeFuncPtr_glMultiDrawElements\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glPointParameterf\r
+#define GLEE_H_DEFINED_glPointParameterf\r
+  typedef void (APIENTRYP GLEEPFNGLPOINTPARAMETERFPROC) (GLenum pname, GLfloat param);\r
+  GLEE_EXTERN GLEEPFNGLPOINTPARAMETERFPROC GLeeFuncPtr_glPointParameterf;\r
+  #define glPointParameterf GLeeFuncPtr_glPointParameterf\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glPointParameterfv\r
+#define GLEE_H_DEFINED_glPointParameterfv\r
+  typedef void (APIENTRYP GLEEPFNGLPOINTPARAMETERFVPROC) (GLenum pname, const GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLPOINTPARAMETERFVPROC GLeeFuncPtr_glPointParameterfv;\r
+  #define glPointParameterfv GLeeFuncPtr_glPointParameterfv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glPointParameteri\r
+#define GLEE_H_DEFINED_glPointParameteri\r
+  typedef void (APIENTRYP GLEEPFNGLPOINTPARAMETERIPROC) (GLenum pname, GLint param);\r
+  GLEE_EXTERN GLEEPFNGLPOINTPARAMETERIPROC GLeeFuncPtr_glPointParameteri;\r
+  #define glPointParameteri GLeeFuncPtr_glPointParameteri\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glPointParameteriv\r
+#define GLEE_H_DEFINED_glPointParameteriv\r
+  typedef void (APIENTRYP GLEEPFNGLPOINTPARAMETERIVPROC) (GLenum pname, const GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLPOINTPARAMETERIVPROC GLeeFuncPtr_glPointParameteriv;\r
+  #define glPointParameteriv GLeeFuncPtr_glPointParameteriv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glSecondaryColor3b\r
+#define GLEE_H_DEFINED_glSecondaryColor3b\r
+  typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3BPROC) (GLbyte red, GLbyte green, GLbyte blue);\r
+  GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3BPROC GLeeFuncPtr_glSecondaryColor3b;\r
+  #define glSecondaryColor3b GLeeFuncPtr_glSecondaryColor3b\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glSecondaryColor3bv\r
+#define GLEE_H_DEFINED_glSecondaryColor3bv\r
+  typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3BVPROC) (const GLbyte * v);\r
+  GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3BVPROC GLeeFuncPtr_glSecondaryColor3bv;\r
+  #define glSecondaryColor3bv GLeeFuncPtr_glSecondaryColor3bv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glSecondaryColor3d\r
+#define GLEE_H_DEFINED_glSecondaryColor3d\r
+  typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3DPROC) (GLdouble red, GLdouble green, GLdouble blue);\r
+  GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3DPROC GLeeFuncPtr_glSecondaryColor3d;\r
+  #define glSecondaryColor3d GLeeFuncPtr_glSecondaryColor3d\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glSecondaryColor3dv\r
+#define GLEE_H_DEFINED_glSecondaryColor3dv\r
+  typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3DVPROC) (const GLdouble * v);\r
+  GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3DVPROC GLeeFuncPtr_glSecondaryColor3dv;\r
+  #define glSecondaryColor3dv GLeeFuncPtr_glSecondaryColor3dv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glSecondaryColor3f\r
+#define GLEE_H_DEFINED_glSecondaryColor3f\r
+  typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3FPROC) (GLfloat red, GLfloat green, GLfloat blue);\r
+  GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3FPROC GLeeFuncPtr_glSecondaryColor3f;\r
+  #define glSecondaryColor3f GLeeFuncPtr_glSecondaryColor3f\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glSecondaryColor3fv\r
+#define GLEE_H_DEFINED_glSecondaryColor3fv\r
+  typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3FVPROC) (const GLfloat * v);\r
+  GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3FVPROC GLeeFuncPtr_glSecondaryColor3fv;\r
+  #define glSecondaryColor3fv GLeeFuncPtr_glSecondaryColor3fv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glSecondaryColor3i\r
+#define GLEE_H_DEFINED_glSecondaryColor3i\r
+  typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3IPROC) (GLint red, GLint green, GLint blue);\r
+  GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3IPROC GLeeFuncPtr_glSecondaryColor3i;\r
+  #define glSecondaryColor3i GLeeFuncPtr_glSecondaryColor3i\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glSecondaryColor3iv\r
+#define GLEE_H_DEFINED_glSecondaryColor3iv\r
+  typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3IVPROC) (const GLint * v);\r
+  GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3IVPROC GLeeFuncPtr_glSecondaryColor3iv;\r
+  #define glSecondaryColor3iv GLeeFuncPtr_glSecondaryColor3iv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glSecondaryColor3s\r
+#define GLEE_H_DEFINED_glSecondaryColor3s\r
+  typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3SPROC) (GLshort red, GLshort green, GLshort blue);\r
+  GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3SPROC GLeeFuncPtr_glSecondaryColor3s;\r
+  #define glSecondaryColor3s GLeeFuncPtr_glSecondaryColor3s\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glSecondaryColor3sv\r
+#define GLEE_H_DEFINED_glSecondaryColor3sv\r
+  typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3SVPROC) (const GLshort * v);\r
+  GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3SVPROC GLeeFuncPtr_glSecondaryColor3sv;\r
+  #define glSecondaryColor3sv GLeeFuncPtr_glSecondaryColor3sv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glSecondaryColor3ub\r
+#define GLEE_H_DEFINED_glSecondaryColor3ub\r
+  typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3UBPROC) (GLubyte red, GLubyte green, GLubyte blue);\r
+  GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3UBPROC GLeeFuncPtr_glSecondaryColor3ub;\r
+  #define glSecondaryColor3ub GLeeFuncPtr_glSecondaryColor3ub\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glSecondaryColor3ubv\r
+#define GLEE_H_DEFINED_glSecondaryColor3ubv\r
+  typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3UBVPROC) (const GLubyte * v);\r
+  GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3UBVPROC GLeeFuncPtr_glSecondaryColor3ubv;\r
+  #define glSecondaryColor3ubv GLeeFuncPtr_glSecondaryColor3ubv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glSecondaryColor3ui\r
+#define GLEE_H_DEFINED_glSecondaryColor3ui\r
+  typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3UIPROC) (GLuint red, GLuint green, GLuint blue);\r
+  GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3UIPROC GLeeFuncPtr_glSecondaryColor3ui;\r
+  #define glSecondaryColor3ui GLeeFuncPtr_glSecondaryColor3ui\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glSecondaryColor3uiv\r
+#define GLEE_H_DEFINED_glSecondaryColor3uiv\r
+  typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3UIVPROC) (const GLuint * v);\r
+  GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3UIVPROC GLeeFuncPtr_glSecondaryColor3uiv;\r
+  #define glSecondaryColor3uiv GLeeFuncPtr_glSecondaryColor3uiv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glSecondaryColor3us\r
+#define GLEE_H_DEFINED_glSecondaryColor3us\r
+  typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3USPROC) (GLushort red, GLushort green, GLushort blue);\r
+  GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3USPROC GLeeFuncPtr_glSecondaryColor3us;\r
+  #define glSecondaryColor3us GLeeFuncPtr_glSecondaryColor3us\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glSecondaryColor3usv\r
+#define GLEE_H_DEFINED_glSecondaryColor3usv\r
+  typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3USVPROC) (const GLushort * v);\r
+  GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3USVPROC GLeeFuncPtr_glSecondaryColor3usv;\r
+  #define glSecondaryColor3usv GLeeFuncPtr_glSecondaryColor3usv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glSecondaryColorPointer\r
+#define GLEE_H_DEFINED_glSecondaryColorPointer\r
+  typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLORPOINTERPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid * pointer);\r
+  GLEE_EXTERN GLEEPFNGLSECONDARYCOLORPOINTERPROC GLeeFuncPtr_glSecondaryColorPointer;\r
+  #define glSecondaryColorPointer GLeeFuncPtr_glSecondaryColorPointer\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glWindowPos2d\r
+#define GLEE_H_DEFINED_glWindowPos2d\r
+  typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2DPROC) (GLdouble x, GLdouble y);\r
+  GLEE_EXTERN GLEEPFNGLWINDOWPOS2DPROC GLeeFuncPtr_glWindowPos2d;\r
+  #define glWindowPos2d GLeeFuncPtr_glWindowPos2d\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glWindowPos2dv\r
+#define GLEE_H_DEFINED_glWindowPos2dv\r
+  typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2DVPROC) (const GLdouble * v);\r
+  GLEE_EXTERN GLEEPFNGLWINDOWPOS2DVPROC GLeeFuncPtr_glWindowPos2dv;\r
+  #define glWindowPos2dv GLeeFuncPtr_glWindowPos2dv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glWindowPos2f\r
+#define GLEE_H_DEFINED_glWindowPos2f\r
+  typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2FPROC) (GLfloat x, GLfloat y);\r
+  GLEE_EXTERN GLEEPFNGLWINDOWPOS2FPROC GLeeFuncPtr_glWindowPos2f;\r
+  #define glWindowPos2f GLeeFuncPtr_glWindowPos2f\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glWindowPos2fv\r
+#define GLEE_H_DEFINED_glWindowPos2fv\r
+  typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2FVPROC) (const GLfloat * v);\r
+  GLEE_EXTERN GLEEPFNGLWINDOWPOS2FVPROC GLeeFuncPtr_glWindowPos2fv;\r
+  #define glWindowPos2fv GLeeFuncPtr_glWindowPos2fv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glWindowPos2i\r
+#define GLEE_H_DEFINED_glWindowPos2i\r
+  typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2IPROC) (GLint x, GLint y);\r
+  GLEE_EXTERN GLEEPFNGLWINDOWPOS2IPROC GLeeFuncPtr_glWindowPos2i;\r
+  #define glWindowPos2i GLeeFuncPtr_glWindowPos2i\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glWindowPos2iv\r
+#define GLEE_H_DEFINED_glWindowPos2iv\r
+  typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2IVPROC) (const GLint * v);\r
+  GLEE_EXTERN GLEEPFNGLWINDOWPOS2IVPROC GLeeFuncPtr_glWindowPos2iv;\r
+  #define glWindowPos2iv GLeeFuncPtr_glWindowPos2iv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glWindowPos2s\r
+#define GLEE_H_DEFINED_glWindowPos2s\r
+  typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2SPROC) (GLshort x, GLshort y);\r
+  GLEE_EXTERN GLEEPFNGLWINDOWPOS2SPROC GLeeFuncPtr_glWindowPos2s;\r
+  #define glWindowPos2s GLeeFuncPtr_glWindowPos2s\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glWindowPos2sv\r
+#define GLEE_H_DEFINED_glWindowPos2sv\r
+  typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2SVPROC) (const GLshort * v);\r
+  GLEE_EXTERN GLEEPFNGLWINDOWPOS2SVPROC GLeeFuncPtr_glWindowPos2sv;\r
+  #define glWindowPos2sv GLeeFuncPtr_glWindowPos2sv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glWindowPos3d\r
+#define GLEE_H_DEFINED_glWindowPos3d\r
+  typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3DPROC) (GLdouble x, GLdouble y, GLdouble z);\r
+  GLEE_EXTERN GLEEPFNGLWINDOWPOS3DPROC GLeeFuncPtr_glWindowPos3d;\r
+  #define glWindowPos3d GLeeFuncPtr_glWindowPos3d\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glWindowPos3dv\r
+#define GLEE_H_DEFINED_glWindowPos3dv\r
+  typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3DVPROC) (const GLdouble * v);\r
+  GLEE_EXTERN GLEEPFNGLWINDOWPOS3DVPROC GLeeFuncPtr_glWindowPos3dv;\r
+  #define glWindowPos3dv GLeeFuncPtr_glWindowPos3dv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glWindowPos3f\r
+#define GLEE_H_DEFINED_glWindowPos3f\r
+  typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3FPROC) (GLfloat x, GLfloat y, GLfloat z);\r
+  GLEE_EXTERN GLEEPFNGLWINDOWPOS3FPROC GLeeFuncPtr_glWindowPos3f;\r
+  #define glWindowPos3f GLeeFuncPtr_glWindowPos3f\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glWindowPos3fv\r
+#define GLEE_H_DEFINED_glWindowPos3fv\r
+  typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3FVPROC) (const GLfloat * v);\r
+  GLEE_EXTERN GLEEPFNGLWINDOWPOS3FVPROC GLeeFuncPtr_glWindowPos3fv;\r
+  #define glWindowPos3fv GLeeFuncPtr_glWindowPos3fv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glWindowPos3i\r
+#define GLEE_H_DEFINED_glWindowPos3i\r
+  typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3IPROC) (GLint x, GLint y, GLint z);\r
+  GLEE_EXTERN GLEEPFNGLWINDOWPOS3IPROC GLeeFuncPtr_glWindowPos3i;\r
+  #define glWindowPos3i GLeeFuncPtr_glWindowPos3i\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glWindowPos3iv\r
+#define GLEE_H_DEFINED_glWindowPos3iv\r
+  typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3IVPROC) (const GLint * v);\r
+  GLEE_EXTERN GLEEPFNGLWINDOWPOS3IVPROC GLeeFuncPtr_glWindowPos3iv;\r
+  #define glWindowPos3iv GLeeFuncPtr_glWindowPos3iv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glWindowPos3s\r
+#define GLEE_H_DEFINED_glWindowPos3s\r
+  typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3SPROC) (GLshort x, GLshort y, GLshort z);\r
+  GLEE_EXTERN GLEEPFNGLWINDOWPOS3SPROC GLeeFuncPtr_glWindowPos3s;\r
+  #define glWindowPos3s GLeeFuncPtr_glWindowPos3s\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glWindowPos3sv\r
+#define GLEE_H_DEFINED_glWindowPos3sv\r
+  typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3SVPROC) (const GLshort * v);\r
+  GLEE_EXTERN GLEEPFNGLWINDOWPOS3SVPROC GLeeFuncPtr_glWindowPos3sv;\r
+  #define glWindowPos3sv GLeeFuncPtr_glWindowPos3sv\r
+#endif\r
+#endif \r
+\r
+/* GL_VERSION_1_5 */\r
+\r
+#ifndef GL_VERSION_1_5\r
+#define GL_VERSION_1_5 1\r
+#define __GLEE_GL_VERSION_1_5 1\r
+/* Constants */\r
+#define GL_BUFFER_SIZE                                     0x8764\r
+#define GL_BUFFER_USAGE                                    0x8765\r
+#define GL_QUERY_COUNTER_BITS                              0x8864\r
+#define GL_CURRENT_QUERY                                   0x8865\r
+#define GL_QUERY_RESULT                                    0x8866\r
+#define GL_QUERY_RESULT_AVAILABLE                          0x8867\r
+#define GL_ARRAY_BUFFER                                    0x8892\r
+#define GL_ELEMENT_ARRAY_BUFFER                            0x8893\r
+#define GL_ARRAY_BUFFER_BINDING                            0x8894\r
+#define GL_ELEMENT_ARRAY_BUFFER_BINDING                    0x8895\r
+#define GL_VERTEX_ARRAY_BUFFER_BINDING                     0x8896\r
+#define GL_NORMAL_ARRAY_BUFFER_BINDING                     0x8897\r
+#define GL_COLOR_ARRAY_BUFFER_BINDING                      0x8898\r
+#define GL_INDEX_ARRAY_BUFFER_BINDING                      0x8899\r
+#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING              0x889A\r
+#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING                  0x889B\r
+#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING            0x889C\r
+#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING             0x889D\r
+#define GL_WEIGHT_ARRAY_BUFFER_BINDING                     0x889E\r
+#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING              0x889F\r
+#define GL_READ_ONLY                                       0x88B8\r
+#define GL_WRITE_ONLY                                      0x88B9\r
+#define GL_READ_WRITE                                      0x88BA\r
+#define GL_BUFFER_ACCESS                                   0x88BB\r
+#define GL_BUFFER_MAPPED                                   0x88BC\r
+#define GL_BUFFER_MAP_POINTER                              0x88BD\r
+#define GL_STREAM_DRAW                                     0x88E0\r
+#define GL_STREAM_READ                                     0x88E1\r
+#define GL_STREAM_COPY                                     0x88E2\r
+#define GL_STATIC_DRAW                                     0x88E4\r
+#define GL_STATIC_READ                                     0x88E5\r
+#define GL_STATIC_COPY                                     0x88E6\r
+#define GL_DYNAMIC_DRAW                                    0x88E8\r
+#define GL_DYNAMIC_READ                                    0x88E9\r
+#define GL_DYNAMIC_COPY                                    0x88EA\r
+#define GL_SAMPLES_PASSED                                  0x8914\r
+#define GL_FOG_COORD_SRC                                   GL_FOG_COORDINATE_SOURCE\r
+#define GL_FOG_COORD                                       GL_FOG_COORDINATE\r
+#define GL_CURRENT_FOG_COORD                               GL_CURRENT_FOG_COORDINATE\r
+#define GL_FOG_COORD_ARRAY_TYPE                            GL_FOG_COORDINATE_ARRAY_TYPE\r
+#define GL_FOG_COORD_ARRAY_STRIDE                          GL_FOG_COORDINATE_ARRAY_STRIDE\r
+#define GL_FOG_COORD_ARRAY_POINTER                         GL_FOG_COORDINATE_ARRAY_POINTER\r
+#define GL_FOG_COORD_ARRAY                                 GL_FOG_COORDINATE_ARRAY\r
+#define GL_FOG_COORD_ARRAY_BUFFER_BINDING                  GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING\r
+#define GL_SRC0_RGB                                        GL_SOURCE0_RGB\r
+#define GL_SRC1_RGB                                        GL_SOURCE1_RGB\r
+#define GL_SRC2_RGB                                        GL_SOURCE2_RGB\r
+#define GL_SRC0_ALPHA                                      GL_SOURCE0_ALPHA\r
+#define GL_SRC1_ALPHA                                      GL_SOURCE1_ALPHA\r
+#define GL_SRC2_ALPHA                                      GL_SOURCE2_ALPHA\r
+#ifndef GLEE_H_DEFINED_glGenQueries\r
+#define GLEE_H_DEFINED_glGenQueries\r
+  typedef void (APIENTRYP GLEEPFNGLGENQUERIESPROC) (GLsizei n, GLuint * ids);\r
+  GLEE_EXTERN GLEEPFNGLGENQUERIESPROC GLeeFuncPtr_glGenQueries;\r
+  #define glGenQueries GLeeFuncPtr_glGenQueries\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glDeleteQueries\r
+#define GLEE_H_DEFINED_glDeleteQueries\r
+  typedef void (APIENTRYP GLEEPFNGLDELETEQUERIESPROC) (GLsizei n, const GLuint * ids);\r
+  GLEE_EXTERN GLEEPFNGLDELETEQUERIESPROC GLeeFuncPtr_glDeleteQueries;\r
+  #define glDeleteQueries GLeeFuncPtr_glDeleteQueries\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glIsQuery\r
+#define GLEE_H_DEFINED_glIsQuery\r
+  typedef GLboolean (APIENTRYP GLEEPFNGLISQUERYPROC) (GLuint id);\r
+  GLEE_EXTERN GLEEPFNGLISQUERYPROC GLeeFuncPtr_glIsQuery;\r
+  #define glIsQuery GLeeFuncPtr_glIsQuery\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glBeginQuery\r
+#define GLEE_H_DEFINED_glBeginQuery\r
+  typedef void (APIENTRYP GLEEPFNGLBEGINQUERYPROC) (GLenum target, GLuint id);\r
+  GLEE_EXTERN GLEEPFNGLBEGINQUERYPROC GLeeFuncPtr_glBeginQuery;\r
+  #define glBeginQuery GLeeFuncPtr_glBeginQuery\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glEndQuery\r
+#define GLEE_H_DEFINED_glEndQuery\r
+  typedef void (APIENTRYP GLEEPFNGLENDQUERYPROC) (GLenum target);\r
+  GLEE_EXTERN GLEEPFNGLENDQUERYPROC GLeeFuncPtr_glEndQuery;\r
+  #define glEndQuery GLeeFuncPtr_glEndQuery\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetQueryiv\r
+#define GLEE_H_DEFINED_glGetQueryiv\r
+  typedef void (APIENTRYP GLEEPFNGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETQUERYIVPROC GLeeFuncPtr_glGetQueryiv;\r
+  #define glGetQueryiv GLeeFuncPtr_glGetQueryiv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetQueryObjectiv\r
+#define GLEE_H_DEFINED_glGetQueryObjectiv\r
+  typedef void (APIENTRYP GLEEPFNGLGETQUERYOBJECTIVPROC) (GLuint id, GLenum pname, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETQUERYOBJECTIVPROC GLeeFuncPtr_glGetQueryObjectiv;\r
+  #define glGetQueryObjectiv GLeeFuncPtr_glGetQueryObjectiv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetQueryObjectuiv\r
+#define GLEE_H_DEFINED_glGetQueryObjectuiv\r
+  typedef void (APIENTRYP GLEEPFNGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETQUERYOBJECTUIVPROC GLeeFuncPtr_glGetQueryObjectuiv;\r
+  #define glGetQueryObjectuiv GLeeFuncPtr_glGetQueryObjectuiv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glBindBuffer\r
+#define GLEE_H_DEFINED_glBindBuffer\r
+  typedef void (APIENTRYP GLEEPFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer);\r
+  GLEE_EXTERN GLEEPFNGLBINDBUFFERPROC GLeeFuncPtr_glBindBuffer;\r
+  #define glBindBuffer GLeeFuncPtr_glBindBuffer\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glDeleteBuffers\r
+#define GLEE_H_DEFINED_glDeleteBuffers\r
+  typedef void (APIENTRYP GLEEPFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint * buffers);\r
+  GLEE_EXTERN GLEEPFNGLDELETEBUFFERSPROC GLeeFuncPtr_glDeleteBuffers;\r
+  #define glDeleteBuffers GLeeFuncPtr_glDeleteBuffers\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGenBuffers\r
+#define GLEE_H_DEFINED_glGenBuffers\r
+  typedef void (APIENTRYP GLEEPFNGLGENBUFFERSPROC) (GLsizei n, GLuint * buffers);\r
+  GLEE_EXTERN GLEEPFNGLGENBUFFERSPROC GLeeFuncPtr_glGenBuffers;\r
+  #define glGenBuffers GLeeFuncPtr_glGenBuffers\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glIsBuffer\r
+#define GLEE_H_DEFINED_glIsBuffer\r
+  typedef GLboolean (APIENTRYP GLEEPFNGLISBUFFERPROC) (GLuint buffer);\r
+  GLEE_EXTERN GLEEPFNGLISBUFFERPROC GLeeFuncPtr_glIsBuffer;\r
+  #define glIsBuffer GLeeFuncPtr_glIsBuffer\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glBufferData\r
+#define GLEE_H_DEFINED_glBufferData\r
+  typedef void (APIENTRYP GLEEPFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const GLvoid * data, GLenum usage);\r
+  GLEE_EXTERN GLEEPFNGLBUFFERDATAPROC GLeeFuncPtr_glBufferData;\r
+  #define glBufferData GLeeFuncPtr_glBufferData\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glBufferSubData\r
+#define GLEE_H_DEFINED_glBufferSubData\r
+  typedef void (APIENTRYP GLEEPFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid * data);\r
+  GLEE_EXTERN GLEEPFNGLBUFFERSUBDATAPROC GLeeFuncPtr_glBufferSubData;\r
+  #define glBufferSubData GLeeFuncPtr_glBufferSubData\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetBufferSubData\r
+#define GLEE_H_DEFINED_glGetBufferSubData\r
+  typedef void (APIENTRYP GLEEPFNGLGETBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLvoid * data);\r
+  GLEE_EXTERN GLEEPFNGLGETBUFFERSUBDATAPROC GLeeFuncPtr_glGetBufferSubData;\r
+  #define glGetBufferSubData GLeeFuncPtr_glGetBufferSubData\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMapBuffer\r
+#define GLEE_H_DEFINED_glMapBuffer\r
+  typedef GLvoid* (APIENTRYP GLEEPFNGLMAPBUFFERPROC) (GLenum target, GLenum access);\r
+  GLEE_EXTERN GLEEPFNGLMAPBUFFERPROC GLeeFuncPtr_glMapBuffer;\r
+  #define glMapBuffer GLeeFuncPtr_glMapBuffer\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUnmapBuffer\r
+#define GLEE_H_DEFINED_glUnmapBuffer\r
+  typedef GLboolean (APIENTRYP GLEEPFNGLUNMAPBUFFERPROC) (GLenum target);\r
+  GLEE_EXTERN GLEEPFNGLUNMAPBUFFERPROC GLeeFuncPtr_glUnmapBuffer;\r
+  #define glUnmapBuffer GLeeFuncPtr_glUnmapBuffer\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetBufferParameteriv\r
+#define GLEE_H_DEFINED_glGetBufferParameteriv\r
+  typedef void (APIENTRYP GLEEPFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETBUFFERPARAMETERIVPROC GLeeFuncPtr_glGetBufferParameteriv;\r
+  #define glGetBufferParameteriv GLeeFuncPtr_glGetBufferParameteriv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetBufferPointerv\r
+#define GLEE_H_DEFINED_glGetBufferPointerv\r
+  typedef void (APIENTRYP GLEEPFNGLGETBUFFERPOINTERVPROC) (GLenum target, GLenum pname, GLvoid* * params);\r
+  GLEE_EXTERN GLEEPFNGLGETBUFFERPOINTERVPROC GLeeFuncPtr_glGetBufferPointerv;\r
+  #define glGetBufferPointerv GLeeFuncPtr_glGetBufferPointerv\r
+#endif\r
+#endif \r
+\r
+/* GL_VERSION_2_0 */\r
+\r
+#ifndef GL_VERSION_2_0\r
+#define GL_VERSION_2_0 1\r
+#define __GLEE_GL_VERSION_2_0 1\r
+/* Constants */\r
+#define GL_BLEND_EQUATION_RGB                              GL_BLEND_EQUATION\r
+#define GL_VERTEX_ATTRIB_ARRAY_ENABLED                     0x8622\r
+#define GL_VERTEX_ATTRIB_ARRAY_SIZE                        0x8623\r
+#define GL_VERTEX_ATTRIB_ARRAY_STRIDE                      0x8624\r
+#define GL_VERTEX_ATTRIB_ARRAY_TYPE                        0x8625\r
+#define GL_CURRENT_VERTEX_ATTRIB                           0x8626\r
+#define GL_VERTEX_PROGRAM_POINT_SIZE                       0x8642\r
+#define GL_VERTEX_PROGRAM_TWO_SIDE                         0x8643\r
+#define GL_VERTEX_ATTRIB_ARRAY_POINTER                     0x8645\r
+#define GL_STENCIL_BACK_FUNC                               0x8800\r
+#define GL_STENCIL_BACK_FAIL                               0x8801\r
+#define GL_STENCIL_BACK_PASS_DEPTH_FAIL                    0x8802\r
+#define GL_STENCIL_BACK_PASS_DEPTH_PASS                    0x8803\r
+#define GL_MAX_DRAW_BUFFERS                                0x8824\r
+#define GL_DRAW_BUFFER0                                    0x8825\r
+#define GL_DRAW_BUFFER1                                    0x8826\r
+#define GL_DRAW_BUFFER2                                    0x8827\r
+#define GL_DRAW_BUFFER3                                    0x8828\r
+#define GL_DRAW_BUFFER4                                    0x8829\r
+#define GL_DRAW_BUFFER5                                    0x882A\r
+#define GL_DRAW_BUFFER6                                    0x882B\r
+#define GL_DRAW_BUFFER7                                    0x882C\r
+#define GL_DRAW_BUFFER8                                    0x882D\r
+#define GL_DRAW_BUFFER9                                    0x882E\r
+#define GL_DRAW_BUFFER10                                   0x882F\r
+#define GL_DRAW_BUFFER11                                   0x8830\r
+#define GL_DRAW_BUFFER12                                   0x8831\r
+#define GL_DRAW_BUFFER13                                   0x8832\r
+#define GL_DRAW_BUFFER14                                   0x8833\r
+#define GL_DRAW_BUFFER15                                   0x8834\r
+#define GL_BLEND_EQUATION_ALPHA                            0x883D\r
+#define GL_POINT_SPRITE                                    0x8861\r
+#define GL_COORD_REPLACE                                   0x8862\r
+#define GL_MAX_VERTEX_ATTRIBS                              0x8869\r
+#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED                  0x886A\r
+#define GL_MAX_TEXTURE_COORDS                              0x8871\r
+#define GL_MAX_TEXTURE_IMAGE_UNITS                         0x8872\r
+#define GL_FRAGMENT_SHADER                                 0x8B30\r
+#define GL_VERTEX_SHADER                                   0x8B31\r
+#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS                 0x8B49\r
+#define GL_MAX_VERTEX_UNIFORM_COMPONENTS                   0x8B4A\r
+#define GL_MAX_VARYING_FLOATS                              0x8B4B\r
+#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS                  0x8B4C\r
+#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS                0x8B4D\r
+#define GL_SHADER_TYPE                                     0x8B4F\r
+#define GL_FLOAT_VEC2                                      0x8B50\r
+#define GL_FLOAT_VEC3                                      0x8B51\r
+#define GL_FLOAT_VEC4                                      0x8B52\r
+#define GL_INT_VEC2                                        0x8B53\r
+#define GL_INT_VEC3                                        0x8B54\r
+#define GL_INT_VEC4                                        0x8B55\r
+#define GL_BOOL                                            0x8B56\r
+#define GL_BOOL_VEC2                                       0x8B57\r
+#define GL_BOOL_VEC3                                       0x8B58\r
+#define GL_BOOL_VEC4                                       0x8B59\r
+#define GL_FLOAT_MAT2                                      0x8B5A\r
+#define GL_FLOAT_MAT3                                      0x8B5B\r
+#define GL_FLOAT_MAT4                                      0x8B5C\r
+#define GL_SAMPLER_1D                                      0x8B5D\r
+#define GL_SAMPLER_2D                                      0x8B5E\r
+#define GL_SAMPLER_3D                                      0x8B5F\r
+#define GL_SAMPLER_CUBE                                    0x8B60\r
+#define GL_SAMPLER_1D_SHADOW                               0x8B61\r
+#define GL_SAMPLER_2D_SHADOW                               0x8B62\r
+#define GL_DELETE_STATUS                                   0x8B80\r
+#define GL_COMPILE_STATUS                                  0x8B81\r
+#define GL_LINK_STATUS                                     0x8B82\r
+#define GL_VALIDATE_STATUS                                 0x8B83\r
+#define GL_INFO_LOG_LENGTH                                 0x8B84\r
+#define GL_ATTACHED_SHADERS                                0x8B85\r
+#define GL_ACTIVE_UNIFORMS                                 0x8B86\r
+#define GL_ACTIVE_UNIFORM_MAX_LENGTH                       0x8B87\r
+#define GL_SHADER_SOURCE_LENGTH                            0x8B88\r
+#define GL_ACTIVE_ATTRIBUTES                               0x8B89\r
+#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH                     0x8B8A\r
+#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT                 0x8B8B\r
+#define GL_SHADING_LANGUAGE_VERSION                        0x8B8C\r
+#define GL_CURRENT_PROGRAM                                 0x8B8D\r
+#define GL_POINT_SPRITE_COORD_ORIGIN                       0x8CA0\r
+#define GL_LOWER_LEFT                                      0x8CA1\r
+#define GL_UPPER_LEFT                                      0x8CA2\r
+#define GL_STENCIL_BACK_REF                                0x8CA3\r
+#define GL_STENCIL_BACK_VALUE_MASK                         0x8CA4\r
+#define GL_STENCIL_BACK_WRITEMASK                          0x8CA5\r
+#ifndef GLEE_H_DEFINED_glBlendEquationSeparate\r
+#define GLEE_H_DEFINED_glBlendEquationSeparate\r
+  typedef void (APIENTRYP GLEEPFNGLBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha);\r
+  GLEE_EXTERN GLEEPFNGLBLENDEQUATIONSEPARATEPROC GLeeFuncPtr_glBlendEquationSeparate;\r
+  #define glBlendEquationSeparate GLeeFuncPtr_glBlendEquationSeparate\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glDrawBuffers\r
+#define GLEE_H_DEFINED_glDrawBuffers\r
+  typedef void (APIENTRYP GLEEPFNGLDRAWBUFFERSPROC) (GLsizei n, const GLenum * bufs);\r
+  GLEE_EXTERN GLEEPFNGLDRAWBUFFERSPROC GLeeFuncPtr_glDrawBuffers;\r
+  #define glDrawBuffers GLeeFuncPtr_glDrawBuffers\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glStencilOpSeparate\r
+#define GLEE_H_DEFINED_glStencilOpSeparate\r
+  typedef void (APIENTRYP GLEEPFNGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);\r
+  GLEE_EXTERN GLEEPFNGLSTENCILOPSEPARATEPROC GLeeFuncPtr_glStencilOpSeparate;\r
+  #define glStencilOpSeparate GLeeFuncPtr_glStencilOpSeparate\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glStencilFuncSeparate\r
+#define GLEE_H_DEFINED_glStencilFuncSeparate\r
+  typedef void (APIENTRYP GLEEPFNGLSTENCILFUNCSEPARATEPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask);\r
+  GLEE_EXTERN GLEEPFNGLSTENCILFUNCSEPARATEPROC GLeeFuncPtr_glStencilFuncSeparate;\r
+  #define glStencilFuncSeparate GLeeFuncPtr_glStencilFuncSeparate\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glStencilMaskSeparate\r
+#define GLEE_H_DEFINED_glStencilMaskSeparate\r
+  typedef void (APIENTRYP GLEEPFNGLSTENCILMASKSEPARATEPROC) (GLenum face, GLuint mask);\r
+  GLEE_EXTERN GLEEPFNGLSTENCILMASKSEPARATEPROC GLeeFuncPtr_glStencilMaskSeparate;\r
+  #define glStencilMaskSeparate GLeeFuncPtr_glStencilMaskSeparate\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glAttachShader\r
+#define GLEE_H_DEFINED_glAttachShader\r
+  typedef void (APIENTRYP GLEEPFNGLATTACHSHADERPROC) (GLuint program, GLuint shader);\r
+  GLEE_EXTERN GLEEPFNGLATTACHSHADERPROC GLeeFuncPtr_glAttachShader;\r
+  #define glAttachShader GLeeFuncPtr_glAttachShader\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glBindAttribLocation\r
+#define GLEE_H_DEFINED_glBindAttribLocation\r
+  typedef void (APIENTRYP GLEEPFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar * name);\r
+  GLEE_EXTERN GLEEPFNGLBINDATTRIBLOCATIONPROC GLeeFuncPtr_glBindAttribLocation;\r
+  #define glBindAttribLocation GLeeFuncPtr_glBindAttribLocation\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glCompileShader\r
+#define GLEE_H_DEFINED_glCompileShader\r
+  typedef void (APIENTRYP GLEEPFNGLCOMPILESHADERPROC) (GLuint shader);\r
+  GLEE_EXTERN GLEEPFNGLCOMPILESHADERPROC GLeeFuncPtr_glCompileShader;\r
+  #define glCompileShader GLeeFuncPtr_glCompileShader\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glCreateProgram\r
+#define GLEE_H_DEFINED_glCreateProgram\r
+  typedef GLuint (APIENTRYP GLEEPFNGLCREATEPROGRAMPROC) ();\r
+  GLEE_EXTERN GLEEPFNGLCREATEPROGRAMPROC GLeeFuncPtr_glCreateProgram;\r
+  #define glCreateProgram GLeeFuncPtr_glCreateProgram\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glCreateShader\r
+#define GLEE_H_DEFINED_glCreateShader\r
+  typedef GLuint (APIENTRYP GLEEPFNGLCREATESHADERPROC) (GLenum type);\r
+  GLEE_EXTERN GLEEPFNGLCREATESHADERPROC GLeeFuncPtr_glCreateShader;\r
+  #define glCreateShader GLeeFuncPtr_glCreateShader\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glDeleteProgram\r
+#define GLEE_H_DEFINED_glDeleteProgram\r
+  typedef void (APIENTRYP GLEEPFNGLDELETEPROGRAMPROC) (GLuint program);\r
+  GLEE_EXTERN GLEEPFNGLDELETEPROGRAMPROC GLeeFuncPtr_glDeleteProgram;\r
+  #define glDeleteProgram GLeeFuncPtr_glDeleteProgram\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glDeleteShader\r
+#define GLEE_H_DEFINED_glDeleteShader\r
+  typedef void (APIENTRYP GLEEPFNGLDELETESHADERPROC) (GLuint shader);\r
+  GLEE_EXTERN GLEEPFNGLDELETESHADERPROC GLeeFuncPtr_glDeleteShader;\r
+  #define glDeleteShader GLeeFuncPtr_glDeleteShader\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glDetachShader\r
+#define GLEE_H_DEFINED_glDetachShader\r
+  typedef void (APIENTRYP GLEEPFNGLDETACHSHADERPROC) (GLuint program, GLuint shader);\r
+  GLEE_EXTERN GLEEPFNGLDETACHSHADERPROC GLeeFuncPtr_glDetachShader;\r
+  #define glDetachShader GLeeFuncPtr_glDetachShader\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glDisableVertexAttribArray\r
+#define GLEE_H_DEFINED_glDisableVertexAttribArray\r
+  typedef void (APIENTRYP GLEEPFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint index);\r
+  GLEE_EXTERN GLEEPFNGLDISABLEVERTEXATTRIBARRAYPROC GLeeFuncPtr_glDisableVertexAttribArray;\r
+  #define glDisableVertexAttribArray GLeeFuncPtr_glDisableVertexAttribArray\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glEnableVertexAttribArray\r
+#define GLEE_H_DEFINED_glEnableVertexAttribArray\r
+  typedef void (APIENTRYP GLEEPFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index);\r
+  GLEE_EXTERN GLEEPFNGLENABLEVERTEXATTRIBARRAYPROC GLeeFuncPtr_glEnableVertexAttribArray;\r
+  #define glEnableVertexAttribArray GLeeFuncPtr_glEnableVertexAttribArray\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetActiveAttrib\r
+#define GLEE_H_DEFINED_glGetActiveAttrib\r
+  typedef void (APIENTRYP GLEEPFNGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLint * size, GLenum * type, GLchar * name);\r
+  GLEE_EXTERN GLEEPFNGLGETACTIVEATTRIBPROC GLeeFuncPtr_glGetActiveAttrib;\r
+  #define glGetActiveAttrib GLeeFuncPtr_glGetActiveAttrib\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetActiveUniform\r
+#define GLEE_H_DEFINED_glGetActiveUniform\r
+  typedef void (APIENTRYP GLEEPFNGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLint * size, GLenum * type, GLchar * name);\r
+  GLEE_EXTERN GLEEPFNGLGETACTIVEUNIFORMPROC GLeeFuncPtr_glGetActiveUniform;\r
+  #define glGetActiveUniform GLeeFuncPtr_glGetActiveUniform\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetAttachedShaders\r
+#define GLEE_H_DEFINED_glGetAttachedShaders\r
+  typedef void (APIENTRYP GLEEPFNGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei * count, GLuint * obj);\r
+  GLEE_EXTERN GLEEPFNGLGETATTACHEDSHADERSPROC GLeeFuncPtr_glGetAttachedShaders;\r
+  #define glGetAttachedShaders GLeeFuncPtr_glGetAttachedShaders\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetAttribLocation\r
+#define GLEE_H_DEFINED_glGetAttribLocation\r
+  typedef GLint (APIENTRYP GLEEPFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar * name);\r
+  GLEE_EXTERN GLEEPFNGLGETATTRIBLOCATIONPROC GLeeFuncPtr_glGetAttribLocation;\r
+  #define glGetAttribLocation GLeeFuncPtr_glGetAttribLocation\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetProgramiv\r
+#define GLEE_H_DEFINED_glGetProgramiv\r
+  typedef void (APIENTRYP GLEEPFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETPROGRAMIVPROC GLeeFuncPtr_glGetProgramiv;\r
+  #define glGetProgramiv GLeeFuncPtr_glGetProgramiv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetProgramInfoLog\r
+#define GLEE_H_DEFINED_glGetProgramInfoLog\r
+  typedef void (APIENTRYP GLEEPFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei * length, GLchar * infoLog);\r
+  GLEE_EXTERN GLEEPFNGLGETPROGRAMINFOLOGPROC GLeeFuncPtr_glGetProgramInfoLog;\r
+  #define glGetProgramInfoLog GLeeFuncPtr_glGetProgramInfoLog\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetShaderiv\r
+#define GLEE_H_DEFINED_glGetShaderiv\r
+  typedef void (APIENTRYP GLEEPFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETSHADERIVPROC GLeeFuncPtr_glGetShaderiv;\r
+  #define glGetShaderiv GLeeFuncPtr_glGetShaderiv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetShaderInfoLog\r
+#define GLEE_H_DEFINED_glGetShaderInfoLog\r
+  typedef void (APIENTRYP GLEEPFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei * length, GLchar * infoLog);\r
+  GLEE_EXTERN GLEEPFNGLGETSHADERINFOLOGPROC GLeeFuncPtr_glGetShaderInfoLog;\r
+  #define glGetShaderInfoLog GLeeFuncPtr_glGetShaderInfoLog\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetShaderSource\r
+#define GLEE_H_DEFINED_glGetShaderSource\r
+  typedef void (APIENTRYP GLEEPFNGLGETSHADERSOURCEPROC) (GLuint shader, GLsizei bufSize, GLsizei * length, GLchar * source);\r
+  GLEE_EXTERN GLEEPFNGLGETSHADERSOURCEPROC GLeeFuncPtr_glGetShaderSource;\r
+  #define glGetShaderSource GLeeFuncPtr_glGetShaderSource\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetUniformLocation\r
+#define GLEE_H_DEFINED_glGetUniformLocation\r
+  typedef GLint (APIENTRYP GLEEPFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar * name);\r
+  GLEE_EXTERN GLEEPFNGLGETUNIFORMLOCATIONPROC GLeeFuncPtr_glGetUniformLocation;\r
+  #define glGetUniformLocation GLeeFuncPtr_glGetUniformLocation\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetUniformfv\r
+#define GLEE_H_DEFINED_glGetUniformfv\r
+  typedef void (APIENTRYP GLEEPFNGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLGETUNIFORMFVPROC GLeeFuncPtr_glGetUniformfv;\r
+  #define glGetUniformfv GLeeFuncPtr_glGetUniformfv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetUniformiv\r
+#define GLEE_H_DEFINED_glGetUniformiv\r
+  typedef void (APIENTRYP GLEEPFNGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETUNIFORMIVPROC GLeeFuncPtr_glGetUniformiv;\r
+  #define glGetUniformiv GLeeFuncPtr_glGetUniformiv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetVertexAttribdv\r
+#define GLEE_H_DEFINED_glGetVertexAttribdv\r
+  typedef void (APIENTRYP GLEEPFNGLGETVERTEXATTRIBDVPROC) (GLuint index, GLenum pname, GLdouble * params);\r
+  GLEE_EXTERN GLEEPFNGLGETVERTEXATTRIBDVPROC GLeeFuncPtr_glGetVertexAttribdv;\r
+  #define glGetVertexAttribdv GLeeFuncPtr_glGetVertexAttribdv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetVertexAttribfv\r
+#define GLEE_H_DEFINED_glGetVertexAttribfv\r
+  typedef void (APIENTRYP GLEEPFNGLGETVERTEXATTRIBFVPROC) (GLuint index, GLenum pname, GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLGETVERTEXATTRIBFVPROC GLeeFuncPtr_glGetVertexAttribfv;\r
+  #define glGetVertexAttribfv GLeeFuncPtr_glGetVertexAttribfv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetVertexAttribiv\r
+#define GLEE_H_DEFINED_glGetVertexAttribiv\r
+  typedef void (APIENTRYP GLEEPFNGLGETVERTEXATTRIBIVPROC) (GLuint index, GLenum pname, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETVERTEXATTRIBIVPROC GLeeFuncPtr_glGetVertexAttribiv;\r
+  #define glGetVertexAttribiv GLeeFuncPtr_glGetVertexAttribiv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetVertexAttribPointerv\r
+#define GLEE_H_DEFINED_glGetVertexAttribPointerv\r
+  typedef void (APIENTRYP GLEEPFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint index, GLenum pname, GLvoid* * pointer);\r
+  GLEE_EXTERN GLEEPFNGLGETVERTEXATTRIBPOINTERVPROC GLeeFuncPtr_glGetVertexAttribPointerv;\r
+  #define glGetVertexAttribPointerv GLeeFuncPtr_glGetVertexAttribPointerv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glIsProgram\r
+#define GLEE_H_DEFINED_glIsProgram\r
+  typedef GLboolean (APIENTRYP GLEEPFNGLISPROGRAMPROC) (GLuint program);\r
+  GLEE_EXTERN GLEEPFNGLISPROGRAMPROC GLeeFuncPtr_glIsProgram;\r
+  #define glIsProgram GLeeFuncPtr_glIsProgram\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glIsShader\r
+#define GLEE_H_DEFINED_glIsShader\r
+  typedef GLboolean (APIENTRYP GLEEPFNGLISSHADERPROC) (GLuint shader);\r
+  GLEE_EXTERN GLEEPFNGLISSHADERPROC GLeeFuncPtr_glIsShader;\r
+  #define glIsShader GLeeFuncPtr_glIsShader\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glLinkProgram\r
+#define GLEE_H_DEFINED_glLinkProgram\r
+  typedef void (APIENTRYP GLEEPFNGLLINKPROGRAMPROC) (GLuint program);\r
+  GLEE_EXTERN GLEEPFNGLLINKPROGRAMPROC GLeeFuncPtr_glLinkProgram;\r
+  #define glLinkProgram GLeeFuncPtr_glLinkProgram\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glShaderSource\r
+#define GLEE_H_DEFINED_glShaderSource\r
+  typedef void (APIENTRYP GLEEPFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar* * string, const GLint * length);\r
+  GLEE_EXTERN GLEEPFNGLSHADERSOURCEPROC GLeeFuncPtr_glShaderSource;\r
+  #define glShaderSource GLeeFuncPtr_glShaderSource\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUseProgram\r
+#define GLEE_H_DEFINED_glUseProgram\r
+  typedef void (APIENTRYP GLEEPFNGLUSEPROGRAMPROC) (GLuint program);\r
+  GLEE_EXTERN GLEEPFNGLUSEPROGRAMPROC GLeeFuncPtr_glUseProgram;\r
+  #define glUseProgram GLeeFuncPtr_glUseProgram\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUniform1f\r
+#define GLEE_H_DEFINED_glUniform1f\r
+  typedef void (APIENTRYP GLEEPFNGLUNIFORM1FPROC) (GLint location, GLfloat v0);\r
+  GLEE_EXTERN GLEEPFNGLUNIFORM1FPROC GLeeFuncPtr_glUniform1f;\r
+  #define glUniform1f GLeeFuncPtr_glUniform1f\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUniform2f\r
+#define GLEE_H_DEFINED_glUniform2f\r
+  typedef void (APIENTRYP GLEEPFNGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1);\r
+  GLEE_EXTERN GLEEPFNGLUNIFORM2FPROC GLeeFuncPtr_glUniform2f;\r
+  #define glUniform2f GLeeFuncPtr_glUniform2f\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUniform3f\r
+#define GLEE_H_DEFINED_glUniform3f\r
+  typedef void (APIENTRYP GLEEPFNGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2);\r
+  GLEE_EXTERN GLEEPFNGLUNIFORM3FPROC GLeeFuncPtr_glUniform3f;\r
+  #define glUniform3f GLeeFuncPtr_glUniform3f\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUniform4f\r
+#define GLEE_H_DEFINED_glUniform4f\r
+  typedef void (APIENTRYP GLEEPFNGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);\r
+  GLEE_EXTERN GLEEPFNGLUNIFORM4FPROC GLeeFuncPtr_glUniform4f;\r
+  #define glUniform4f GLeeFuncPtr_glUniform4f\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUniform1i\r
+#define GLEE_H_DEFINED_glUniform1i\r
+  typedef void (APIENTRYP GLEEPFNGLUNIFORM1IPROC) (GLint location, GLint v0);\r
+  GLEE_EXTERN GLEEPFNGLUNIFORM1IPROC GLeeFuncPtr_glUniform1i;\r
+  #define glUniform1i GLeeFuncPtr_glUniform1i\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUniform2i\r
+#define GLEE_H_DEFINED_glUniform2i\r
+  typedef void (APIENTRYP GLEEPFNGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1);\r
+  GLEE_EXTERN GLEEPFNGLUNIFORM2IPROC GLeeFuncPtr_glUniform2i;\r
+  #define glUniform2i GLeeFuncPtr_glUniform2i\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUniform3i\r
+#define GLEE_H_DEFINED_glUniform3i\r
+  typedef void (APIENTRYP GLEEPFNGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2);\r
+  GLEE_EXTERN GLEEPFNGLUNIFORM3IPROC GLeeFuncPtr_glUniform3i;\r
+  #define glUniform3i GLeeFuncPtr_glUniform3i\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUniform4i\r
+#define GLEE_H_DEFINED_glUniform4i\r
+  typedef void (APIENTRYP GLEEPFNGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3);\r
+  GLEE_EXTERN GLEEPFNGLUNIFORM4IPROC GLeeFuncPtr_glUniform4i;\r
+  #define glUniform4i GLeeFuncPtr_glUniform4i\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUniform1fv\r
+#define GLEE_H_DEFINED_glUniform1fv\r
+  typedef void (APIENTRYP GLEEPFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat * value);\r
+  GLEE_EXTERN GLEEPFNGLUNIFORM1FVPROC GLeeFuncPtr_glUniform1fv;\r
+  #define glUniform1fv GLeeFuncPtr_glUniform1fv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUniform2fv\r
+#define GLEE_H_DEFINED_glUniform2fv\r
+  typedef void (APIENTRYP GLEEPFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat * value);\r
+  GLEE_EXTERN GLEEPFNGLUNIFORM2FVPROC GLeeFuncPtr_glUniform2fv;\r
+  #define glUniform2fv GLeeFuncPtr_glUniform2fv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUniform3fv\r
+#define GLEE_H_DEFINED_glUniform3fv\r
+  typedef void (APIENTRYP GLEEPFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat * value);\r
+  GLEE_EXTERN GLEEPFNGLUNIFORM3FVPROC GLeeFuncPtr_glUniform3fv;\r
+  #define glUniform3fv GLeeFuncPtr_glUniform3fv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUniform4fv\r
+#define GLEE_H_DEFINED_glUniform4fv\r
+  typedef void (APIENTRYP GLEEPFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat * value);\r
+  GLEE_EXTERN GLEEPFNGLUNIFORM4FVPROC GLeeFuncPtr_glUniform4fv;\r
+  #define glUniform4fv GLeeFuncPtr_glUniform4fv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUniform1iv\r
+#define GLEE_H_DEFINED_glUniform1iv\r
+  typedef void (APIENTRYP GLEEPFNGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint * value);\r
+  GLEE_EXTERN GLEEPFNGLUNIFORM1IVPROC GLeeFuncPtr_glUniform1iv;\r
+  #define glUniform1iv GLeeFuncPtr_glUniform1iv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUniform2iv\r
+#define GLEE_H_DEFINED_glUniform2iv\r
+  typedef void (APIENTRYP GLEEPFNGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint * value);\r
+  GLEE_EXTERN GLEEPFNGLUNIFORM2IVPROC GLeeFuncPtr_glUniform2iv;\r
+  #define glUniform2iv GLeeFuncPtr_glUniform2iv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUniform3iv\r
+#define GLEE_H_DEFINED_glUniform3iv\r
+  typedef void (APIENTRYP GLEEPFNGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint * value);\r
+  GLEE_EXTERN GLEEPFNGLUNIFORM3IVPROC GLeeFuncPtr_glUniform3iv;\r
+  #define glUniform3iv GLeeFuncPtr_glUniform3iv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUniform4iv\r
+#define GLEE_H_DEFINED_glUniform4iv\r
+  typedef void (APIENTRYP GLEEPFNGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint * value);\r
+  GLEE_EXTERN GLEEPFNGLUNIFORM4IVPROC GLeeFuncPtr_glUniform4iv;\r
+  #define glUniform4iv GLeeFuncPtr_glUniform4iv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUniformMatrix2fv\r
+#define GLEE_H_DEFINED_glUniformMatrix2fv\r
+  typedef void (APIENTRYP GLEEPFNGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);\r
+  GLEE_EXTERN GLEEPFNGLUNIFORMMATRIX2FVPROC GLeeFuncPtr_glUniformMatrix2fv;\r
+  #define glUniformMatrix2fv GLeeFuncPtr_glUniformMatrix2fv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUniformMatrix3fv\r
+#define GLEE_H_DEFINED_glUniformMatrix3fv\r
+  typedef void (APIENTRYP GLEEPFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);\r
+  GLEE_EXTERN GLEEPFNGLUNIFORMMATRIX3FVPROC GLeeFuncPtr_glUniformMatrix3fv;\r
+  #define glUniformMatrix3fv GLeeFuncPtr_glUniformMatrix3fv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUniformMatrix4fv\r
+#define GLEE_H_DEFINED_glUniformMatrix4fv\r
+  typedef void (APIENTRYP GLEEPFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);\r
+  GLEE_EXTERN GLEEPFNGLUNIFORMMATRIX4FVPROC GLeeFuncPtr_glUniformMatrix4fv;\r
+  #define glUniformMatrix4fv GLeeFuncPtr_glUniformMatrix4fv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glValidateProgram\r
+#define GLEE_H_DEFINED_glValidateProgram\r
+  typedef void (APIENTRYP GLEEPFNGLVALIDATEPROGRAMPROC) (GLuint program);\r
+  GLEE_EXTERN GLEEPFNGLVALIDATEPROGRAMPROC GLeeFuncPtr_glValidateProgram;\r
+  #define glValidateProgram GLeeFuncPtr_glValidateProgram\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib1d\r
+#define GLEE_H_DEFINED_glVertexAttrib1d\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB1DPROC) (GLuint index, GLdouble x);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB1DPROC GLeeFuncPtr_glVertexAttrib1d;\r
+  #define glVertexAttrib1d GLeeFuncPtr_glVertexAttrib1d\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib1dv\r
+#define GLEE_H_DEFINED_glVertexAttrib1dv\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB1DVPROC) (GLuint index, const GLdouble * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB1DVPROC GLeeFuncPtr_glVertexAttrib1dv;\r
+  #define glVertexAttrib1dv GLeeFuncPtr_glVertexAttrib1dv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib1f\r
+#define GLEE_H_DEFINED_glVertexAttrib1f\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB1FPROC GLeeFuncPtr_glVertexAttrib1f;\r
+  #define glVertexAttrib1f GLeeFuncPtr_glVertexAttrib1f\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib1fv\r
+#define GLEE_H_DEFINED_glVertexAttrib1fv\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB1FVPROC GLeeFuncPtr_glVertexAttrib1fv;\r
+  #define glVertexAttrib1fv GLeeFuncPtr_glVertexAttrib1fv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib1s\r
+#define GLEE_H_DEFINED_glVertexAttrib1s\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB1SPROC) (GLuint index, GLshort x);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB1SPROC GLeeFuncPtr_glVertexAttrib1s;\r
+  #define glVertexAttrib1s GLeeFuncPtr_glVertexAttrib1s\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib1sv\r
+#define GLEE_H_DEFINED_glVertexAttrib1sv\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB1SVPROC) (GLuint index, const GLshort * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB1SVPROC GLeeFuncPtr_glVertexAttrib1sv;\r
+  #define glVertexAttrib1sv GLeeFuncPtr_glVertexAttrib1sv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib2d\r
+#define GLEE_H_DEFINED_glVertexAttrib2d\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB2DPROC) (GLuint index, GLdouble x, GLdouble y);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB2DPROC GLeeFuncPtr_glVertexAttrib2d;\r
+  #define glVertexAttrib2d GLeeFuncPtr_glVertexAttrib2d\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib2dv\r
+#define GLEE_H_DEFINED_glVertexAttrib2dv\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB2DVPROC) (GLuint index, const GLdouble * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB2DVPROC GLeeFuncPtr_glVertexAttrib2dv;\r
+  #define glVertexAttrib2dv GLeeFuncPtr_glVertexAttrib2dv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib2f\r
+#define GLEE_H_DEFINED_glVertexAttrib2f\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB2FPROC GLeeFuncPtr_glVertexAttrib2f;\r
+  #define glVertexAttrib2f GLeeFuncPtr_glVertexAttrib2f\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib2fv\r
+#define GLEE_H_DEFINED_glVertexAttrib2fv\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB2FVPROC GLeeFuncPtr_glVertexAttrib2fv;\r
+  #define glVertexAttrib2fv GLeeFuncPtr_glVertexAttrib2fv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib2s\r
+#define GLEE_H_DEFINED_glVertexAttrib2s\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB2SPROC) (GLuint index, GLshort x, GLshort y);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB2SPROC GLeeFuncPtr_glVertexAttrib2s;\r
+  #define glVertexAttrib2s GLeeFuncPtr_glVertexAttrib2s\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib2sv\r
+#define GLEE_H_DEFINED_glVertexAttrib2sv\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB2SVPROC) (GLuint index, const GLshort * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB2SVPROC GLeeFuncPtr_glVertexAttrib2sv;\r
+  #define glVertexAttrib2sv GLeeFuncPtr_glVertexAttrib2sv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib3d\r
+#define GLEE_H_DEFINED_glVertexAttrib3d\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB3DPROC GLeeFuncPtr_glVertexAttrib3d;\r
+  #define glVertexAttrib3d GLeeFuncPtr_glVertexAttrib3d\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib3dv\r
+#define GLEE_H_DEFINED_glVertexAttrib3dv\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB3DVPROC) (GLuint index, const GLdouble * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB3DVPROC GLeeFuncPtr_glVertexAttrib3dv;\r
+  #define glVertexAttrib3dv GLeeFuncPtr_glVertexAttrib3dv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib3f\r
+#define GLEE_H_DEFINED_glVertexAttrib3f\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB3FPROC GLeeFuncPtr_glVertexAttrib3f;\r
+  #define glVertexAttrib3f GLeeFuncPtr_glVertexAttrib3f\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib3fv\r
+#define GLEE_H_DEFINED_glVertexAttrib3fv\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB3FVPROC GLeeFuncPtr_glVertexAttrib3fv;\r
+  #define glVertexAttrib3fv GLeeFuncPtr_glVertexAttrib3fv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib3s\r
+#define GLEE_H_DEFINED_glVertexAttrib3s\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB3SPROC) (GLuint index, GLshort x, GLshort y, GLshort z);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB3SPROC GLeeFuncPtr_glVertexAttrib3s;\r
+  #define glVertexAttrib3s GLeeFuncPtr_glVertexAttrib3s\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib3sv\r
+#define GLEE_H_DEFINED_glVertexAttrib3sv\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB3SVPROC) (GLuint index, const GLshort * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB3SVPROC GLeeFuncPtr_glVertexAttrib3sv;\r
+  #define glVertexAttrib3sv GLeeFuncPtr_glVertexAttrib3sv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib4Nbv\r
+#define GLEE_H_DEFINED_glVertexAttrib4Nbv\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4NBVPROC) (GLuint index, const GLbyte * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4NBVPROC GLeeFuncPtr_glVertexAttrib4Nbv;\r
+  #define glVertexAttrib4Nbv GLeeFuncPtr_glVertexAttrib4Nbv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib4Niv\r
+#define GLEE_H_DEFINED_glVertexAttrib4Niv\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4NIVPROC) (GLuint index, const GLint * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4NIVPROC GLeeFuncPtr_glVertexAttrib4Niv;\r
+  #define glVertexAttrib4Niv GLeeFuncPtr_glVertexAttrib4Niv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib4Nsv\r
+#define GLEE_H_DEFINED_glVertexAttrib4Nsv\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4NSVPROC) (GLuint index, const GLshort * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4NSVPROC GLeeFuncPtr_glVertexAttrib4Nsv;\r
+  #define glVertexAttrib4Nsv GLeeFuncPtr_glVertexAttrib4Nsv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib4Nub\r
+#define GLEE_H_DEFINED_glVertexAttrib4Nub\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4NUBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4NUBPROC GLeeFuncPtr_glVertexAttrib4Nub;\r
+  #define glVertexAttrib4Nub GLeeFuncPtr_glVertexAttrib4Nub\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib4Nubv\r
+#define GLEE_H_DEFINED_glVertexAttrib4Nubv\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4NUBVPROC) (GLuint index, const GLubyte * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4NUBVPROC GLeeFuncPtr_glVertexAttrib4Nubv;\r
+  #define glVertexAttrib4Nubv GLeeFuncPtr_glVertexAttrib4Nubv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib4Nuiv\r
+#define GLEE_H_DEFINED_glVertexAttrib4Nuiv\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4NUIVPROC) (GLuint index, const GLuint * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4NUIVPROC GLeeFuncPtr_glVertexAttrib4Nuiv;\r
+  #define glVertexAttrib4Nuiv GLeeFuncPtr_glVertexAttrib4Nuiv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib4Nusv\r
+#define GLEE_H_DEFINED_glVertexAttrib4Nusv\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4NUSVPROC) (GLuint index, const GLushort * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4NUSVPROC GLeeFuncPtr_glVertexAttrib4Nusv;\r
+  #define glVertexAttrib4Nusv GLeeFuncPtr_glVertexAttrib4Nusv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib4bv\r
+#define GLEE_H_DEFINED_glVertexAttrib4bv\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4BVPROC) (GLuint index, const GLbyte * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4BVPROC GLeeFuncPtr_glVertexAttrib4bv;\r
+  #define glVertexAttrib4bv GLeeFuncPtr_glVertexAttrib4bv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib4d\r
+#define GLEE_H_DEFINED_glVertexAttrib4d\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4DPROC GLeeFuncPtr_glVertexAttrib4d;\r
+  #define glVertexAttrib4d GLeeFuncPtr_glVertexAttrib4d\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib4dv\r
+#define GLEE_H_DEFINED_glVertexAttrib4dv\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4DVPROC) (GLuint index, const GLdouble * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4DVPROC GLeeFuncPtr_glVertexAttrib4dv;\r
+  #define glVertexAttrib4dv GLeeFuncPtr_glVertexAttrib4dv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib4f\r
+#define GLEE_H_DEFINED_glVertexAttrib4f\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4FPROC GLeeFuncPtr_glVertexAttrib4f;\r
+  #define glVertexAttrib4f GLeeFuncPtr_glVertexAttrib4f\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib4fv\r
+#define GLEE_H_DEFINED_glVertexAttrib4fv\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4FVPROC GLeeFuncPtr_glVertexAttrib4fv;\r
+  #define glVertexAttrib4fv GLeeFuncPtr_glVertexAttrib4fv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib4iv\r
+#define GLEE_H_DEFINED_glVertexAttrib4iv\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4IVPROC) (GLuint index, const GLint * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4IVPROC GLeeFuncPtr_glVertexAttrib4iv;\r
+  #define glVertexAttrib4iv GLeeFuncPtr_glVertexAttrib4iv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib4s\r
+#define GLEE_H_DEFINED_glVertexAttrib4s\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4SPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4SPROC GLeeFuncPtr_glVertexAttrib4s;\r
+  #define glVertexAttrib4s GLeeFuncPtr_glVertexAttrib4s\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib4sv\r
+#define GLEE_H_DEFINED_glVertexAttrib4sv\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4SVPROC) (GLuint index, const GLshort * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4SVPROC GLeeFuncPtr_glVertexAttrib4sv;\r
+  #define glVertexAttrib4sv GLeeFuncPtr_glVertexAttrib4sv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib4ubv\r
+#define GLEE_H_DEFINED_glVertexAttrib4ubv\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4UBVPROC) (GLuint index, const GLubyte * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4UBVPROC GLeeFuncPtr_glVertexAttrib4ubv;\r
+  #define glVertexAttrib4ubv GLeeFuncPtr_glVertexAttrib4ubv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib4uiv\r
+#define GLEE_H_DEFINED_glVertexAttrib4uiv\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4UIVPROC) (GLuint index, const GLuint * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4UIVPROC GLeeFuncPtr_glVertexAttrib4uiv;\r
+  #define glVertexAttrib4uiv GLeeFuncPtr_glVertexAttrib4uiv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib4usv\r
+#define GLEE_H_DEFINED_glVertexAttrib4usv\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4USVPROC) (GLuint index, const GLushort * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4USVPROC GLeeFuncPtr_glVertexAttrib4usv;\r
+  #define glVertexAttrib4usv GLeeFuncPtr_glVertexAttrib4usv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttribPointer\r
+#define GLEE_H_DEFINED_glVertexAttribPointer\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid * pointer);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIBPOINTERPROC GLeeFuncPtr_glVertexAttribPointer;\r
+  #define glVertexAttribPointer GLeeFuncPtr_glVertexAttribPointer\r
+#endif\r
+#endif \r
+\r
+/* GL_VERSION_2_1 */\r
+\r
+#ifndef GL_VERSION_2_1\r
+#define GL_VERSION_2_1 1\r
+#define __GLEE_GL_VERSION_2_1 1\r
+/* Constants */\r
+#define GL_CURRENT_RASTER_SECONDARY_COLOR                  0x845F\r
+#define GL_PIXEL_PACK_BUFFER                               0x88EB\r
+#define GL_PIXEL_UNPACK_BUFFER                             0x88EC\r
+#define GL_PIXEL_PACK_BUFFER_BINDING                       0x88ED\r
+#define GL_PIXEL_UNPACK_BUFFER_BINDING                     0x88EF\r
+#define GL_FLOAT_MAT2x3                                    0x8B65\r
+#define GL_FLOAT_MAT2x4                                    0x8B66\r
+#define GL_FLOAT_MAT3x2                                    0x8B67\r
+#define GL_FLOAT_MAT3x4                                    0x8B68\r
+#define GL_FLOAT_MAT4x2                                    0x8B69\r
+#define GL_FLOAT_MAT4x3                                    0x8B6A\r
+#define GL_SRGB                                            0x8C40\r
+#define GL_SRGB8                                           0x8C41\r
+#define GL_SRGB_ALPHA                                      0x8C42\r
+#define GL_SRGB8_ALPHA8                                    0x8C43\r
+#define GL_SLUMINANCE_ALPHA                                0x8C44\r
+#define GL_SLUMINANCE8_ALPHA8                              0x8C45\r
+#define GL_SLUMINANCE                                      0x8C46\r
+#define GL_SLUMINANCE8                                     0x8C47\r
+#define GL_COMPRESSED_SRGB                                 0x8C48\r
+#define GL_COMPRESSED_SRGB_ALPHA                           0x8C49\r
+#define GL_COMPRESSED_SLUMINANCE                           0x8C4A\r
+#define GL_COMPRESSED_SLUMINANCE_ALPHA                     0x8C4B\r
+#ifndef GLEE_H_DEFINED_glUniformMatrix2x3fv\r
+#define GLEE_H_DEFINED_glUniformMatrix2x3fv\r
+  typedef void (APIENTRYP GLEEPFNGLUNIFORMMATRIX2X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);\r
+  GLEE_EXTERN GLEEPFNGLUNIFORMMATRIX2X3FVPROC GLeeFuncPtr_glUniformMatrix2x3fv;\r
+  #define glUniformMatrix2x3fv GLeeFuncPtr_glUniformMatrix2x3fv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUniformMatrix3x2fv\r
+#define GLEE_H_DEFINED_glUniformMatrix3x2fv\r
+  typedef void (APIENTRYP GLEEPFNGLUNIFORMMATRIX3X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);\r
+  GLEE_EXTERN GLEEPFNGLUNIFORMMATRIX3X2FVPROC GLeeFuncPtr_glUniformMatrix3x2fv;\r
+  #define glUniformMatrix3x2fv GLeeFuncPtr_glUniformMatrix3x2fv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUniformMatrix2x4fv\r
+#define GLEE_H_DEFINED_glUniformMatrix2x4fv\r
+  typedef void (APIENTRYP GLEEPFNGLUNIFORMMATRIX2X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);\r
+  GLEE_EXTERN GLEEPFNGLUNIFORMMATRIX2X4FVPROC GLeeFuncPtr_glUniformMatrix2x4fv;\r
+  #define glUniformMatrix2x4fv GLeeFuncPtr_glUniformMatrix2x4fv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUniformMatrix4x2fv\r
+#define GLEE_H_DEFINED_glUniformMatrix4x2fv\r
+  typedef void (APIENTRYP GLEEPFNGLUNIFORMMATRIX4X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);\r
+  GLEE_EXTERN GLEEPFNGLUNIFORMMATRIX4X2FVPROC GLeeFuncPtr_glUniformMatrix4x2fv;\r
+  #define glUniformMatrix4x2fv GLeeFuncPtr_glUniformMatrix4x2fv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUniformMatrix3x4fv\r
+#define GLEE_H_DEFINED_glUniformMatrix3x4fv\r
+  typedef void (APIENTRYP GLEEPFNGLUNIFORMMATRIX3X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);\r
+  GLEE_EXTERN GLEEPFNGLUNIFORMMATRIX3X4FVPROC GLeeFuncPtr_glUniformMatrix3x4fv;\r
+  #define glUniformMatrix3x4fv GLeeFuncPtr_glUniformMatrix3x4fv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUniformMatrix4x3fv\r
+#define GLEE_H_DEFINED_glUniformMatrix4x3fv\r
+  typedef void (APIENTRYP GLEEPFNGLUNIFORMMATRIX4X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);\r
+  GLEE_EXTERN GLEEPFNGLUNIFORMMATRIX4X3FVPROC GLeeFuncPtr_glUniformMatrix4x3fv;\r
+  #define glUniformMatrix4x3fv GLeeFuncPtr_glUniformMatrix4x3fv\r
+#endif\r
+#endif \r
+\r
+/* GL_VERSION_3_0 */\r
+\r
+#ifndef GL_VERSION_3_0\r
+#define GL_VERSION_3_0 1\r
+#define __GLEE_GL_VERSION_3_0 1\r
+/* Constants */\r
+#define GL_COMPARE_REF_TO_TEXTURE                          GL_COMPARE_R_TO_TEXTURE_ARB\r
+#define GL_CLIP_DISTANCE0                                  GL_CLIP_PLANE0\r
+#define GL_CLIP_DISTANCE1                                  GL_CLIP_PLANE1\r
+#define GL_CLIP_DISTANCE2                                  GL_CLIP_PLANE2\r
+#define GL_CLIP_DISTANCE3                                  GL_CLIP_PLANE3\r
+#define GL_CLIP_DISTANCE4                                  GL_CLIP_PLANE4\r
+#define GL_CLIP_DISTANCE5                                  GL_CLIP_PLANE5\r
+#define GL_MAX_CLIP_DISTANCES                              GL_MAX_CLIP_PLANES\r
+#define GL_MAJOR_VERSION                                   0x821B\r
+#define GL_MINOR_VERSION                                   0x821C\r
+#define GL_NUM_EXTENSIONS                                  0x821D\r
+#define GL_CONTEXT_FLAGS                                   0x821E\r
+#define GL_DEPTH_BUFFER                                    0x8223\r
+#define GL_STENCIL_BUFFER                                  0x8224\r
+#define GL_COMPRESSED_RED                                  0x8225\r
+#define GL_COMPRESSED_RG                                   0x8226\r
+#define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT             0x0001\r
+#define GL_RGBA32F                                         0x8814\r
+#define GL_RGB32F                                          0x8815\r
+#define GL_RGBA16F                                         0x881A\r
+#define GL_RGB16F                                          0x881B\r
+#define GL_VERTEX_ATTRIB_ARRAY_INTEGER                     0x88FD\r
+#define GL_MAX_ARRAY_TEXTURE_LAYERS                        0x88FF\r
+#define GL_MIN_PROGRAM_TEXEL_OFFSET                        0x8904\r
+#define GL_MAX_PROGRAM_TEXEL_OFFSET                        0x8905\r
+#define GL_CLAMP_VERTEX_COLOR                              0x891A\r
+#define GL_CLAMP_FRAGMENT_COLOR                            0x891B\r
+#define GL_CLAMP_READ_COLOR                                0x891C\r
+#define GL_FIXED_ONLY                                      0x891D\r
+#define GL_MAX_VARYING_COMPONENTS                          GL_MAX_VARYING_FLOATS\r
+#define GL_TEXTURE_RED_TYPE                                0x8C10\r
+#define GL_TEXTURE_GREEN_TYPE                              0x8C11\r
+#define GL_TEXTURE_BLUE_TYPE                               0x8C12\r
+#define GL_TEXTURE_ALPHA_TYPE                              0x8C13\r
+#define GL_TEXTURE_LUMINANCE_TYPE                          0x8C14\r
+#define GL_TEXTURE_INTENSITY_TYPE                          0x8C15\r
+#define GL_TEXTURE_DEPTH_TYPE                              0x8C16\r
+#define GL_UNSIGNED_NORMALIZED                             0x8C17\r
+#define GL_TEXTURE_1D_ARRAY                                0x8C18\r
+#define GL_PROXY_TEXTURE_1D_ARRAY                          0x8C19\r
+#define GL_TEXTURE_2D_ARRAY                                0x8C1A\r
+#define GL_PROXY_TEXTURE_2D_ARRAY                          0x8C1B\r
+#define GL_TEXTURE_BINDING_1D_ARRAY                        0x8C1C\r
+#define GL_TEXTURE_BINDING_2D_ARRAY                        0x8C1D\r
+#define GL_R11F_G11F_B10F                                  0x8C3A\r
+#define GL_UNSIGNED_INT_10F_11F_11F_REV                    0x8C3B\r
+#define GL_RGB9_E5                                         0x8C3D\r
+#define GL_UNSIGNED_INT_5_9_9_9_REV                        0x8C3E\r
+#define GL_TEXTURE_SHARED_SIZE                             0x8C3F\r
+#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH           0x8C76\r
+#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE                  0x8C7F\r
+#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS      0x8C80\r
+#define GL_TRANSFORM_FEEDBACK_VARYINGS                     0x8C83\r
+#define GL_TRANSFORM_FEEDBACK_BUFFER_START                 0x8C84\r
+#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE                  0x8C85\r
+#define GL_PRIMITIVES_GENERATED                            0x8C87\r
+#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN           0x8C88\r
+#define GL_RASTERIZER_DISCARD                              0x8C89\r
+#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS   0x8C8A\r
+#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS         0x8C8B\r
+#define GL_INTERLEAVED_ATTRIBS                             0x8C8C\r
+#define GL_SEPARATE_ATTRIBS                                0x8C8D\r
+#define GL_TRANSFORM_FEEDBACK_BUFFER                       0x8C8E\r
+#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING               0x8C8F\r
+#define GL_RGBA32UI                                        0x8D70\r
+#define GL_RGB32UI                                         0x8D71\r
+#define GL_RGBA16UI                                        0x8D76\r
+#define GL_RGB16UI                                         0x8D77\r
+#define GL_RGBA8UI                                         0x8D7C\r
+#define GL_RGB8UI                                          0x8D7D\r
+#define GL_RGBA32I                                         0x8D82\r
+#define GL_RGB32I                                          0x8D83\r
+#define GL_RGBA16I                                         0x8D88\r
+#define GL_RGB16I                                          0x8D89\r
+#define GL_RGBA8I                                          0x8D8E\r
+#define GL_RGB8I                                           0x8D8F\r
+#define GL_RED_INTEGER                                     0x8D94\r
+#define GL_GREEN_INTEGER                                   0x8D95\r
+#define GL_BLUE_INTEGER                                    0x8D96\r
+#define GL_ALPHA_INTEGER                                   0x8D97\r
+#define GL_RGB_INTEGER                                     0x8D98\r
+#define GL_RGBA_INTEGER                                    0x8D99\r
+#define GL_BGR_INTEGER                                     0x8D9A\r
+#define GL_BGRA_INTEGER                                    0x8D9B\r
+#define GL_SAMPLER_1D_ARRAY                                0x8DC0\r
+#define GL_SAMPLER_2D_ARRAY                                0x8DC1\r
+#define GL_SAMPLER_1D_ARRAY_SHADOW                         0x8DC3\r
+#define GL_SAMPLER_2D_ARRAY_SHADOW                         0x8DC4\r
+#define GL_SAMPLER_CUBE_SHADOW                             0x8DC5\r
+#define GL_UNSIGNED_INT_VEC2                               0x8DC6\r
+#define GL_UNSIGNED_INT_VEC3                               0x8DC7\r
+#define GL_UNSIGNED_INT_VEC4                               0x8DC8\r
+#define GL_INT_SAMPLER_1D                                  0x8DC9\r
+#define GL_INT_SAMPLER_2D                                  0x8DCA\r
+#define GL_INT_SAMPLER_3D                                  0x8DCB\r
+#define GL_INT_SAMPLER_CUBE                                0x8DCC\r
+#define GL_INT_SAMPLER_1D_ARRAY                            0x8DCE\r
+#define GL_INT_SAMPLER_2D_ARRAY                            0x8DCF\r
+#define GL_UNSIGNED_INT_SAMPLER_1D                         0x8DD1\r
+#define GL_UNSIGNED_INT_SAMPLER_2D                         0x8DD2\r
+#define GL_UNSIGNED_INT_SAMPLER_3D                         0x8DD3\r
+#define GL_UNSIGNED_INT_SAMPLER_CUBE                       0x8DD4\r
+#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY                   0x8DD6\r
+#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY                   0x8DD7\r
+#define GL_QUERY_WAIT                                      0x8E13\r
+#define GL_QUERY_NO_WAIT                                   0x8E14\r
+#define GL_QUERY_BY_REGION_WAIT                            0x8E15\r
+#define GL_QUERY_BY_REGION_NO_WAIT                         0x8E16\r
+#ifndef GLEE_H_DEFINED_glColorMaski\r
+#define GLEE_H_DEFINED_glColorMaski\r
+  typedef void (APIENTRYP GLEEPFNGLCOLORMASKIPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);\r
+  GLEE_EXTERN GLEEPFNGLCOLORMASKIPROC GLeeFuncPtr_glColorMaski;\r
+  #define glColorMaski GLeeFuncPtr_glColorMaski\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetBooleani_v\r
+#define GLEE_H_DEFINED_glGetBooleani_v\r
+  typedef void (APIENTRYP GLEEPFNGLGETBOOLEANI_VPROC) (GLenum target, GLuint index, GLboolean * data);\r
+  GLEE_EXTERN GLEEPFNGLGETBOOLEANI_VPROC GLeeFuncPtr_glGetBooleani_v;\r
+  #define glGetBooleani_v GLeeFuncPtr_glGetBooleani_v\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetIntegeri_v\r
+#define GLEE_H_DEFINED_glGetIntegeri_v\r
+  typedef void (APIENTRYP GLEEPFNGLGETINTEGERI_VPROC) (GLenum target, GLuint index, GLint * data);\r
+  GLEE_EXTERN GLEEPFNGLGETINTEGERI_VPROC GLeeFuncPtr_glGetIntegeri_v;\r
+  #define glGetIntegeri_v GLeeFuncPtr_glGetIntegeri_v\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glEnablei\r
+#define GLEE_H_DEFINED_glEnablei\r
+  typedef void (APIENTRYP GLEEPFNGLENABLEIPROC) (GLenum target, GLuint index);\r
+  GLEE_EXTERN GLEEPFNGLENABLEIPROC GLeeFuncPtr_glEnablei;\r
+  #define glEnablei GLeeFuncPtr_glEnablei\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glDisablei\r
+#define GLEE_H_DEFINED_glDisablei\r
+  typedef void (APIENTRYP GLEEPFNGLDISABLEIPROC) (GLenum target, GLuint index);\r
+  GLEE_EXTERN GLEEPFNGLDISABLEIPROC GLeeFuncPtr_glDisablei;\r
+  #define glDisablei GLeeFuncPtr_glDisablei\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glIsEnabledi\r
+#define GLEE_H_DEFINED_glIsEnabledi\r
+  typedef GLboolean (APIENTRYP GLEEPFNGLISENABLEDIPROC) (GLenum target, GLuint index);\r
+  GLEE_EXTERN GLEEPFNGLISENABLEDIPROC GLeeFuncPtr_glIsEnabledi;\r
+  #define glIsEnabledi GLeeFuncPtr_glIsEnabledi\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glBeginTransformFeedback\r
+#define GLEE_H_DEFINED_glBeginTransformFeedback\r
+  typedef void (APIENTRYP GLEEPFNGLBEGINTRANSFORMFEEDBACKPROC) (GLenum primitiveMode);\r
+  GLEE_EXTERN GLEEPFNGLBEGINTRANSFORMFEEDBACKPROC GLeeFuncPtr_glBeginTransformFeedback;\r
+  #define glBeginTransformFeedback GLeeFuncPtr_glBeginTransformFeedback\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glEndTransformFeedback\r
+#define GLEE_H_DEFINED_glEndTransformFeedback\r
+  typedef void (APIENTRYP GLEEPFNGLENDTRANSFORMFEEDBACKPROC) ();\r
+  GLEE_EXTERN GLEEPFNGLENDTRANSFORMFEEDBACKPROC GLeeFuncPtr_glEndTransformFeedback;\r
+  #define glEndTransformFeedback GLeeFuncPtr_glEndTransformFeedback\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glBindBufferRange\r
+#define GLEE_H_DEFINED_glBindBufferRange\r
+  typedef void (APIENTRYP GLEEPFNGLBINDBUFFERRANGEPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);\r
+  GLEE_EXTERN GLEEPFNGLBINDBUFFERRANGEPROC GLeeFuncPtr_glBindBufferRange;\r
+  #define glBindBufferRange GLeeFuncPtr_glBindBufferRange\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glBindBufferBase\r
+#define GLEE_H_DEFINED_glBindBufferBase\r
+  typedef void (APIENTRYP GLEEPFNGLBINDBUFFERBASEPROC) (GLenum target, GLuint index, GLuint buffer);\r
+  GLEE_EXTERN GLEEPFNGLBINDBUFFERBASEPROC GLeeFuncPtr_glBindBufferBase;\r
+  #define glBindBufferBase GLeeFuncPtr_glBindBufferBase\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTransformFeedbackVaryings\r
+#define GLEE_H_DEFINED_glTransformFeedbackVaryings\r
+  typedef void (APIENTRYP GLEEPFNGLTRANSFORMFEEDBACKVARYINGSPROC) (GLuint program, GLsizei count, const GLint * locations, GLenum bufferMode);\r
+  GLEE_EXTERN GLEEPFNGLTRANSFORMFEEDBACKVARYINGSPROC GLeeFuncPtr_glTransformFeedbackVaryings;\r
+  #define glTransformFeedbackVaryings GLeeFuncPtr_glTransformFeedbackVaryings\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetTransformFeedbackVarying\r
+#define GLEE_H_DEFINED_glGetTransformFeedbackVarying\r
+  typedef void (APIENTRYP GLEEPFNGLGETTRANSFORMFEEDBACKVARYINGPROC) (GLuint program, GLuint index, GLint * location);\r
+  GLEE_EXTERN GLEEPFNGLGETTRANSFORMFEEDBACKVARYINGPROC GLeeFuncPtr_glGetTransformFeedbackVarying;\r
+  #define glGetTransformFeedbackVarying GLeeFuncPtr_glGetTransformFeedbackVarying\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glClampColor\r
+#define GLEE_H_DEFINED_glClampColor\r
+  typedef void (APIENTRYP GLEEPFNGLCLAMPCOLORPROC) (GLenum target, GLenum clamp);\r
+  GLEE_EXTERN GLEEPFNGLCLAMPCOLORPROC GLeeFuncPtr_glClampColor;\r
+  #define glClampColor GLeeFuncPtr_glClampColor\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glBeginConditionalRender\r
+#define GLEE_H_DEFINED_glBeginConditionalRender\r
+  typedef void (APIENTRYP GLEEPFNGLBEGINCONDITIONALRENDERPROC) (GLuint id, GLenum mode);\r
+  GLEE_EXTERN GLEEPFNGLBEGINCONDITIONALRENDERPROC GLeeFuncPtr_glBeginConditionalRender;\r
+  #define glBeginConditionalRender GLeeFuncPtr_glBeginConditionalRender\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glEndConditionalRender\r
+#define GLEE_H_DEFINED_glEndConditionalRender\r
+  typedef void (APIENTRYP GLEEPFNGLENDCONDITIONALRENDERPROC) ();\r
+  GLEE_EXTERN GLEEPFNGLENDCONDITIONALRENDERPROC GLeeFuncPtr_glEndConditionalRender;\r
+  #define glEndConditionalRender GLeeFuncPtr_glEndConditionalRender\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttribI1i\r
+#define GLEE_H_DEFINED_glVertexAttribI1i\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBI1IPROC) (GLuint index, GLint x);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI1IPROC GLeeFuncPtr_glVertexAttribI1i;\r
+  #define glVertexAttribI1i GLeeFuncPtr_glVertexAttribI1i\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttribI2i\r
+#define GLEE_H_DEFINED_glVertexAttribI2i\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBI2IPROC) (GLuint index, GLint x, GLint y);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI2IPROC GLeeFuncPtr_glVertexAttribI2i;\r
+  #define glVertexAttribI2i GLeeFuncPtr_glVertexAttribI2i\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttribI3i\r
+#define GLEE_H_DEFINED_glVertexAttribI3i\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBI3IPROC) (GLuint index, GLint x, GLint y, GLint z);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI3IPROC GLeeFuncPtr_glVertexAttribI3i;\r
+  #define glVertexAttribI3i GLeeFuncPtr_glVertexAttribI3i\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttribI4i\r
+#define GLEE_H_DEFINED_glVertexAttribI4i\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBI4IPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI4IPROC GLeeFuncPtr_glVertexAttribI4i;\r
+  #define glVertexAttribI4i GLeeFuncPtr_glVertexAttribI4i\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttribI1ui\r
+#define GLEE_H_DEFINED_glVertexAttribI1ui\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBI1UIPROC) (GLuint index, GLuint x);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI1UIPROC GLeeFuncPtr_glVertexAttribI1ui;\r
+  #define glVertexAttribI1ui GLeeFuncPtr_glVertexAttribI1ui\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttribI2ui\r
+#define GLEE_H_DEFINED_glVertexAttribI2ui\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBI2UIPROC) (GLuint index, GLuint x, GLuint y);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI2UIPROC GLeeFuncPtr_glVertexAttribI2ui;\r
+  #define glVertexAttribI2ui GLeeFuncPtr_glVertexAttribI2ui\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttribI3ui\r
+#define GLEE_H_DEFINED_glVertexAttribI3ui\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBI3UIPROC) (GLuint index, GLuint x, GLuint y, GLuint z);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI3UIPROC GLeeFuncPtr_glVertexAttribI3ui;\r
+  #define glVertexAttribI3ui GLeeFuncPtr_glVertexAttribI3ui\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttribI4ui\r
+#define GLEE_H_DEFINED_glVertexAttribI4ui\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBI4UIPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI4UIPROC GLeeFuncPtr_glVertexAttribI4ui;\r
+  #define glVertexAttribI4ui GLeeFuncPtr_glVertexAttribI4ui\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttribI1iv\r
+#define GLEE_H_DEFINED_glVertexAttribI1iv\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBI1IVPROC) (GLuint index, const GLint * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI1IVPROC GLeeFuncPtr_glVertexAttribI1iv;\r
+  #define glVertexAttribI1iv GLeeFuncPtr_glVertexAttribI1iv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttribI2iv\r
+#define GLEE_H_DEFINED_glVertexAttribI2iv\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBI2IVPROC) (GLuint index, const GLint * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI2IVPROC GLeeFuncPtr_glVertexAttribI2iv;\r
+  #define glVertexAttribI2iv GLeeFuncPtr_glVertexAttribI2iv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttribI3iv\r
+#define GLEE_H_DEFINED_glVertexAttribI3iv\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBI3IVPROC) (GLuint index, const GLint * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI3IVPROC GLeeFuncPtr_glVertexAttribI3iv;\r
+  #define glVertexAttribI3iv GLeeFuncPtr_glVertexAttribI3iv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttribI4iv\r
+#define GLEE_H_DEFINED_glVertexAttribI4iv\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBI4IVPROC) (GLuint index, const GLint * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI4IVPROC GLeeFuncPtr_glVertexAttribI4iv;\r
+  #define glVertexAttribI4iv GLeeFuncPtr_glVertexAttribI4iv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttribI1uiv\r
+#define GLEE_H_DEFINED_glVertexAttribI1uiv\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBI1UIVPROC) (GLuint index, const GLuint * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI1UIVPROC GLeeFuncPtr_glVertexAttribI1uiv;\r
+  #define glVertexAttribI1uiv GLeeFuncPtr_glVertexAttribI1uiv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttribI2uiv\r
+#define GLEE_H_DEFINED_glVertexAttribI2uiv\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBI2UIVPROC) (GLuint index, const GLuint * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI2UIVPROC GLeeFuncPtr_glVertexAttribI2uiv;\r
+  #define glVertexAttribI2uiv GLeeFuncPtr_glVertexAttribI2uiv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttribI3uiv\r
+#define GLEE_H_DEFINED_glVertexAttribI3uiv\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBI3UIVPROC) (GLuint index, const GLuint * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI3UIVPROC GLeeFuncPtr_glVertexAttribI3uiv;\r
+  #define glVertexAttribI3uiv GLeeFuncPtr_glVertexAttribI3uiv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttribI4uiv\r
+#define GLEE_H_DEFINED_glVertexAttribI4uiv\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBI4UIVPROC) (GLuint index, const GLuint * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI4UIVPROC GLeeFuncPtr_glVertexAttribI4uiv;\r
+  #define glVertexAttribI4uiv GLeeFuncPtr_glVertexAttribI4uiv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttribI4bv\r
+#define GLEE_H_DEFINED_glVertexAttribI4bv\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBI4BVPROC) (GLuint index, const GLbyte * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI4BVPROC GLeeFuncPtr_glVertexAttribI4bv;\r
+  #define glVertexAttribI4bv GLeeFuncPtr_glVertexAttribI4bv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttribI4sv\r
+#define GLEE_H_DEFINED_glVertexAttribI4sv\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBI4SVPROC) (GLuint index, const GLshort * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI4SVPROC GLeeFuncPtr_glVertexAttribI4sv;\r
+  #define glVertexAttribI4sv GLeeFuncPtr_glVertexAttribI4sv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttribI4ubv\r
+#define GLEE_H_DEFINED_glVertexAttribI4ubv\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBI4UBVPROC) (GLuint index, const GLubyte * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI4UBVPROC GLeeFuncPtr_glVertexAttribI4ubv;\r
+  #define glVertexAttribI4ubv GLeeFuncPtr_glVertexAttribI4ubv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttribI4usv\r
+#define GLEE_H_DEFINED_glVertexAttribI4usv\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBI4USVPROC) (GLuint index, const GLushort * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI4USVPROC GLeeFuncPtr_glVertexAttribI4usv;\r
+  #define glVertexAttribI4usv GLeeFuncPtr_glVertexAttribI4usv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttribIPointer\r
+#define GLEE_H_DEFINED_glVertexAttribIPointer\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBIPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid * pointer);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIBIPOINTERPROC GLeeFuncPtr_glVertexAttribIPointer;\r
+  #define glVertexAttribIPointer GLeeFuncPtr_glVertexAttribIPointer\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetVertexAttribIiv\r
+#define GLEE_H_DEFINED_glGetVertexAttribIiv\r
+  typedef void (APIENTRYP GLEEPFNGLGETVERTEXATTRIBIIVPROC) (GLuint index, GLenum pname, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETVERTEXATTRIBIIVPROC GLeeFuncPtr_glGetVertexAttribIiv;\r
+  #define glGetVertexAttribIiv GLeeFuncPtr_glGetVertexAttribIiv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetVertexAttribIuiv\r
+#define GLEE_H_DEFINED_glGetVertexAttribIuiv\r
+  typedef void (APIENTRYP GLEEPFNGLGETVERTEXATTRIBIUIVPROC) (GLuint index, GLenum pname, GLuint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETVERTEXATTRIBIUIVPROC GLeeFuncPtr_glGetVertexAttribIuiv;\r
+  #define glGetVertexAttribIuiv GLeeFuncPtr_glGetVertexAttribIuiv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetUniformuiv\r
+#define GLEE_H_DEFINED_glGetUniformuiv\r
+  typedef void (APIENTRYP GLEEPFNGLGETUNIFORMUIVPROC) (GLuint program, GLint location, GLuint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETUNIFORMUIVPROC GLeeFuncPtr_glGetUniformuiv;\r
+  #define glGetUniformuiv GLeeFuncPtr_glGetUniformuiv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glBindFragDataLocation\r
+#define GLEE_H_DEFINED_glBindFragDataLocation\r
+  typedef void (APIENTRYP GLEEPFNGLBINDFRAGDATALOCATIONPROC) (GLuint program, GLuint color, const GLchar * name);\r
+  GLEE_EXTERN GLEEPFNGLBINDFRAGDATALOCATIONPROC GLeeFuncPtr_glBindFragDataLocation;\r
+  #define glBindFragDataLocation GLeeFuncPtr_glBindFragDataLocation\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetFragDataLocation\r
+#define GLEE_H_DEFINED_glGetFragDataLocation\r
+  typedef GLint (APIENTRYP GLEEPFNGLGETFRAGDATALOCATIONPROC) (GLuint program, const GLchar * name);\r
+  GLEE_EXTERN GLEEPFNGLGETFRAGDATALOCATIONPROC GLeeFuncPtr_glGetFragDataLocation;\r
+  #define glGetFragDataLocation GLeeFuncPtr_glGetFragDataLocation\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUniform1ui\r
+#define GLEE_H_DEFINED_glUniform1ui\r
+  typedef void (APIENTRYP GLEEPFNGLUNIFORM1UIPROC) (GLint location, GLuint v0);\r
+  GLEE_EXTERN GLEEPFNGLUNIFORM1UIPROC GLeeFuncPtr_glUniform1ui;\r
+  #define glUniform1ui GLeeFuncPtr_glUniform1ui\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUniform2ui\r
+#define GLEE_H_DEFINED_glUniform2ui\r
+  typedef void (APIENTRYP GLEEPFNGLUNIFORM2UIPROC) (GLint location, GLuint v0, GLuint v1);\r
+  GLEE_EXTERN GLEEPFNGLUNIFORM2UIPROC GLeeFuncPtr_glUniform2ui;\r
+  #define glUniform2ui GLeeFuncPtr_glUniform2ui\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUniform3ui\r
+#define GLEE_H_DEFINED_glUniform3ui\r
+  typedef void (APIENTRYP GLEEPFNGLUNIFORM3UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2);\r
+  GLEE_EXTERN GLEEPFNGLUNIFORM3UIPROC GLeeFuncPtr_glUniform3ui;\r
+  #define glUniform3ui GLeeFuncPtr_glUniform3ui\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUniform4ui\r
+#define GLEE_H_DEFINED_glUniform4ui\r
+  typedef void (APIENTRYP GLEEPFNGLUNIFORM4UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);\r
+  GLEE_EXTERN GLEEPFNGLUNIFORM4UIPROC GLeeFuncPtr_glUniform4ui;\r
+  #define glUniform4ui GLeeFuncPtr_glUniform4ui\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUniform1uiv\r
+#define GLEE_H_DEFINED_glUniform1uiv\r
+  typedef void (APIENTRYP GLEEPFNGLUNIFORM1UIVPROC) (GLint location, GLsizei count, const GLuint * value);\r
+  GLEE_EXTERN GLEEPFNGLUNIFORM1UIVPROC GLeeFuncPtr_glUniform1uiv;\r
+  #define glUniform1uiv GLeeFuncPtr_glUniform1uiv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUniform2uiv\r
+#define GLEE_H_DEFINED_glUniform2uiv\r
+  typedef void (APIENTRYP GLEEPFNGLUNIFORM2UIVPROC) (GLint location, GLsizei count, const GLuint * value);\r
+  GLEE_EXTERN GLEEPFNGLUNIFORM2UIVPROC GLeeFuncPtr_glUniform2uiv;\r
+  #define glUniform2uiv GLeeFuncPtr_glUniform2uiv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUniform3uiv\r
+#define GLEE_H_DEFINED_glUniform3uiv\r
+  typedef void (APIENTRYP GLEEPFNGLUNIFORM3UIVPROC) (GLint location, GLsizei count, const GLuint * value);\r
+  GLEE_EXTERN GLEEPFNGLUNIFORM3UIVPROC GLeeFuncPtr_glUniform3uiv;\r
+  #define glUniform3uiv GLeeFuncPtr_glUniform3uiv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUniform4uiv\r
+#define GLEE_H_DEFINED_glUniform4uiv\r
+  typedef void (APIENTRYP GLEEPFNGLUNIFORM4UIVPROC) (GLint location, GLsizei count, const GLuint * value);\r
+  GLEE_EXTERN GLEEPFNGLUNIFORM4UIVPROC GLeeFuncPtr_glUniform4uiv;\r
+  #define glUniform4uiv GLeeFuncPtr_glUniform4uiv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTexParameterIiv\r
+#define GLEE_H_DEFINED_glTexParameterIiv\r
+  typedef void (APIENTRYP GLEEPFNGLTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, const GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLTEXPARAMETERIIVPROC GLeeFuncPtr_glTexParameterIiv;\r
+  #define glTexParameterIiv GLeeFuncPtr_glTexParameterIiv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTexParameterIuiv\r
+#define GLEE_H_DEFINED_glTexParameterIuiv\r
+  typedef void (APIENTRYP GLEEPFNGLTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, const GLuint * params);\r
+  GLEE_EXTERN GLEEPFNGLTEXPARAMETERIUIVPROC GLeeFuncPtr_glTexParameterIuiv;\r
+  #define glTexParameterIuiv GLeeFuncPtr_glTexParameterIuiv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetTexParameterIiv\r
+#define GLEE_H_DEFINED_glGetTexParameterIiv\r
+  typedef void (APIENTRYP GLEEPFNGLGETTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETTEXPARAMETERIIVPROC GLeeFuncPtr_glGetTexParameterIiv;\r
+  #define glGetTexParameterIiv GLeeFuncPtr_glGetTexParameterIiv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetTexParameterIuiv\r
+#define GLEE_H_DEFINED_glGetTexParameterIuiv\r
+  typedef void (APIENTRYP GLEEPFNGLGETTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, GLuint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETTEXPARAMETERIUIVPROC GLeeFuncPtr_glGetTexParameterIuiv;\r
+  #define glGetTexParameterIuiv GLeeFuncPtr_glGetTexParameterIuiv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glClearBufferiv\r
+#define GLEE_H_DEFINED_glClearBufferiv\r
+  typedef void (APIENTRYP GLEEPFNGLCLEARBUFFERIVPROC) (GLenum buffer, GLint drawbuffer, const GLint * value);\r
+  GLEE_EXTERN GLEEPFNGLCLEARBUFFERIVPROC GLeeFuncPtr_glClearBufferiv;\r
+  #define glClearBufferiv GLeeFuncPtr_glClearBufferiv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glClearBufferuiv\r
+#define GLEE_H_DEFINED_glClearBufferuiv\r
+  typedef void (APIENTRYP GLEEPFNGLCLEARBUFFERUIVPROC) (GLenum buffer, GLint drawbuffer, const GLuint * value);\r
+  GLEE_EXTERN GLEEPFNGLCLEARBUFFERUIVPROC GLeeFuncPtr_glClearBufferuiv;\r
+  #define glClearBufferuiv GLeeFuncPtr_glClearBufferuiv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glClearBufferfv\r
+#define GLEE_H_DEFINED_glClearBufferfv\r
+  typedef void (APIENTRYP GLEEPFNGLCLEARBUFFERFVPROC) (GLenum buffer, GLint drawbuffer, const GLfloat * value);\r
+  GLEE_EXTERN GLEEPFNGLCLEARBUFFERFVPROC GLeeFuncPtr_glClearBufferfv;\r
+  #define glClearBufferfv GLeeFuncPtr_glClearBufferfv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glClearBufferfi\r
+#define GLEE_H_DEFINED_glClearBufferfi\r
+  typedef void (APIENTRYP GLEEPFNGLCLEARBUFFERFIPROC) (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);\r
+  GLEE_EXTERN GLEEPFNGLCLEARBUFFERFIPROC GLeeFuncPtr_glClearBufferfi;\r
+  #define glClearBufferfi GLeeFuncPtr_glClearBufferfi\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetStringi\r
+#define GLEE_H_DEFINED_glGetStringi\r
+  typedef const GLubyte * (APIENTRYP GLEEPFNGLGETSTRINGIPROC) (GLenum name, GLuint index);\r
+  GLEE_EXTERN GLEEPFNGLGETSTRINGIPROC GLeeFuncPtr_glGetStringi;\r
+  #define glGetStringi GLeeFuncPtr_glGetStringi\r
+#endif\r
+#endif \r
+\r
+/* GL_ARB_multitexture */\r
+\r
+#ifndef GL_ARB_multitexture\r
+#define GL_ARB_multitexture 1\r
+#define __GLEE_GL_ARB_multitexture 1\r
+/* Constants */\r
+#define GL_TEXTURE0_ARB                                    0x84C0\r
+#define GL_TEXTURE1_ARB                                    0x84C1\r
+#define GL_TEXTURE2_ARB                                    0x84C2\r
+#define GL_TEXTURE3_ARB                                    0x84C3\r
+#define GL_TEXTURE4_ARB                                    0x84C4\r
+#define GL_TEXTURE5_ARB                                    0x84C5\r
+#define GL_TEXTURE6_ARB                                    0x84C6\r
+#define GL_TEXTURE7_ARB                                    0x84C7\r
+#define GL_TEXTURE8_ARB                                    0x84C8\r
+#define GL_TEXTURE9_ARB                                    0x84C9\r
+#define GL_TEXTURE10_ARB                                   0x84CA\r
+#define GL_TEXTURE11_ARB                                   0x84CB\r
+#define GL_TEXTURE12_ARB                                   0x84CC\r
+#define GL_TEXTURE13_ARB                                   0x84CD\r
+#define GL_TEXTURE14_ARB                                   0x84CE\r
+#define GL_TEXTURE15_ARB                                   0x84CF\r
+#define GL_TEXTURE16_ARB                                   0x84D0\r
+#define GL_TEXTURE17_ARB                                   0x84D1\r
+#define GL_TEXTURE18_ARB                                   0x84D2\r
+#define GL_TEXTURE19_ARB                                   0x84D3\r
+#define GL_TEXTURE20_ARB                                   0x84D4\r
+#define GL_TEXTURE21_ARB                                   0x84D5\r
+#define GL_TEXTURE22_ARB                                   0x84D6\r
+#define GL_TEXTURE23_ARB                                   0x84D7\r
+#define GL_TEXTURE24_ARB                                   0x84D8\r
+#define GL_TEXTURE25_ARB                                   0x84D9\r
+#define GL_TEXTURE26_ARB                                   0x84DA\r
+#define GL_TEXTURE27_ARB                                   0x84DB\r
+#define GL_TEXTURE28_ARB                                   0x84DC\r
+#define GL_TEXTURE29_ARB                                   0x84DD\r
+#define GL_TEXTURE30_ARB                                   0x84DE\r
+#define GL_TEXTURE31_ARB                                   0x84DF\r
+#define GL_ACTIVE_TEXTURE_ARB                              0x84E0\r
+#define GL_CLIENT_ACTIVE_TEXTURE_ARB                       0x84E1\r
+#define GL_MAX_TEXTURE_UNITS_ARB                           0x84E2\r
+#ifndef GLEE_H_DEFINED_glActiveTextureARB\r
+#define GLEE_H_DEFINED_glActiveTextureARB\r
+  typedef void (APIENTRYP GLEEPFNGLACTIVETEXTUREARBPROC) (GLenum texture);\r
+  GLEE_EXTERN GLEEPFNGLACTIVETEXTUREARBPROC GLeeFuncPtr_glActiveTextureARB;\r
+  #define glActiveTextureARB GLeeFuncPtr_glActiveTextureARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glClientActiveTextureARB\r
+#define GLEE_H_DEFINED_glClientActiveTextureARB\r
+  typedef void (APIENTRYP GLEEPFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture);\r
+  GLEE_EXTERN GLEEPFNGLCLIENTACTIVETEXTUREARBPROC GLeeFuncPtr_glClientActiveTextureARB;\r
+  #define glClientActiveTextureARB GLeeFuncPtr_glClientActiveTextureARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord1dARB\r
+#define GLEE_H_DEFINED_glMultiTexCoord1dARB\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD1DARBPROC GLeeFuncPtr_glMultiTexCoord1dARB;\r
+  #define glMultiTexCoord1dARB GLeeFuncPtr_glMultiTexCoord1dARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord1dvARB\r
+#define GLEE_H_DEFINED_glMultiTexCoord1dvARB\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD1DVARBPROC) (GLenum target, const GLdouble * v);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD1DVARBPROC GLeeFuncPtr_glMultiTexCoord1dvARB;\r
+  #define glMultiTexCoord1dvARB GLeeFuncPtr_glMultiTexCoord1dvARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord1fARB\r
+#define GLEE_H_DEFINED_glMultiTexCoord1fARB\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD1FARBPROC GLeeFuncPtr_glMultiTexCoord1fARB;\r
+  #define glMultiTexCoord1fARB GLeeFuncPtr_glMultiTexCoord1fARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord1fvARB\r
+#define GLEE_H_DEFINED_glMultiTexCoord1fvARB\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat * v);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD1FVARBPROC GLeeFuncPtr_glMultiTexCoord1fvARB;\r
+  #define glMultiTexCoord1fvARB GLeeFuncPtr_glMultiTexCoord1fvARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord1iARB\r
+#define GLEE_H_DEFINED_glMultiTexCoord1iARB\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD1IARBPROC) (GLenum target, GLint s);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD1IARBPROC GLeeFuncPtr_glMultiTexCoord1iARB;\r
+  #define glMultiTexCoord1iARB GLeeFuncPtr_glMultiTexCoord1iARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord1ivARB\r
+#define GLEE_H_DEFINED_glMultiTexCoord1ivARB\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD1IVARBPROC) (GLenum target, const GLint * v);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD1IVARBPROC GLeeFuncPtr_glMultiTexCoord1ivARB;\r
+  #define glMultiTexCoord1ivARB GLeeFuncPtr_glMultiTexCoord1ivARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord1sARB\r
+#define GLEE_H_DEFINED_glMultiTexCoord1sARB\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD1SARBPROC) (GLenum target, GLshort s);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD1SARBPROC GLeeFuncPtr_glMultiTexCoord1sARB;\r
+  #define glMultiTexCoord1sARB GLeeFuncPtr_glMultiTexCoord1sARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord1svARB\r
+#define GLEE_H_DEFINED_glMultiTexCoord1svARB\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD1SVARBPROC) (GLenum target, const GLshort * v);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD1SVARBPROC GLeeFuncPtr_glMultiTexCoord1svARB;\r
+  #define glMultiTexCoord1svARB GLeeFuncPtr_glMultiTexCoord1svARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord2dARB\r
+#define GLEE_H_DEFINED_glMultiTexCoord2dARB\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD2DARBPROC) (GLenum target, GLdouble s, GLdouble t);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD2DARBPROC GLeeFuncPtr_glMultiTexCoord2dARB;\r
+  #define glMultiTexCoord2dARB GLeeFuncPtr_glMultiTexCoord2dARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord2dvARB\r
+#define GLEE_H_DEFINED_glMultiTexCoord2dvARB\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD2DVARBPROC) (GLenum target, const GLdouble * v);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD2DVARBPROC GLeeFuncPtr_glMultiTexCoord2dvARB;\r
+  #define glMultiTexCoord2dvARB GLeeFuncPtr_glMultiTexCoord2dvARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord2fARB\r
+#define GLEE_H_DEFINED_glMultiTexCoord2fARB\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD2FARBPROC GLeeFuncPtr_glMultiTexCoord2fARB;\r
+  #define glMultiTexCoord2fARB GLeeFuncPtr_glMultiTexCoord2fARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord2fvARB\r
+#define GLEE_H_DEFINED_glMultiTexCoord2fvARB\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat * v);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD2FVARBPROC GLeeFuncPtr_glMultiTexCoord2fvARB;\r
+  #define glMultiTexCoord2fvARB GLeeFuncPtr_glMultiTexCoord2fvARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord2iARB\r
+#define GLEE_H_DEFINED_glMultiTexCoord2iARB\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD2IARBPROC) (GLenum target, GLint s, GLint t);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD2IARBPROC GLeeFuncPtr_glMultiTexCoord2iARB;\r
+  #define glMultiTexCoord2iARB GLeeFuncPtr_glMultiTexCoord2iARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord2ivARB\r
+#define GLEE_H_DEFINED_glMultiTexCoord2ivARB\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD2IVARBPROC) (GLenum target, const GLint * v);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD2IVARBPROC GLeeFuncPtr_glMultiTexCoord2ivARB;\r
+  #define glMultiTexCoord2ivARB GLeeFuncPtr_glMultiTexCoord2ivARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord2sARB\r
+#define GLEE_H_DEFINED_glMultiTexCoord2sARB\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD2SARBPROC) (GLenum target, GLshort s, GLshort t);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD2SARBPROC GLeeFuncPtr_glMultiTexCoord2sARB;\r
+  #define glMultiTexCoord2sARB GLeeFuncPtr_glMultiTexCoord2sARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord2svARB\r
+#define GLEE_H_DEFINED_glMultiTexCoord2svARB\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort * v);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD2SVARBPROC GLeeFuncPtr_glMultiTexCoord2svARB;\r
+  #define glMultiTexCoord2svARB GLeeFuncPtr_glMultiTexCoord2svARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord3dARB\r
+#define GLEE_H_DEFINED_glMultiTexCoord3dARB\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD3DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD3DARBPROC GLeeFuncPtr_glMultiTexCoord3dARB;\r
+  #define glMultiTexCoord3dARB GLeeFuncPtr_glMultiTexCoord3dARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord3dvARB\r
+#define GLEE_H_DEFINED_glMultiTexCoord3dvARB\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD3DVARBPROC) (GLenum target, const GLdouble * v);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD3DVARBPROC GLeeFuncPtr_glMultiTexCoord3dvARB;\r
+  #define glMultiTexCoord3dvARB GLeeFuncPtr_glMultiTexCoord3dvARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord3fARB\r
+#define GLEE_H_DEFINED_glMultiTexCoord3fARB\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD3FARBPROC GLeeFuncPtr_glMultiTexCoord3fARB;\r
+  #define glMultiTexCoord3fARB GLeeFuncPtr_glMultiTexCoord3fARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord3fvARB\r
+#define GLEE_H_DEFINED_glMultiTexCoord3fvARB\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat * v);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD3FVARBPROC GLeeFuncPtr_glMultiTexCoord3fvARB;\r
+  #define glMultiTexCoord3fvARB GLeeFuncPtr_glMultiTexCoord3fvARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord3iARB\r
+#define GLEE_H_DEFINED_glMultiTexCoord3iARB\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD3IARBPROC) (GLenum target, GLint s, GLint t, GLint r);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD3IARBPROC GLeeFuncPtr_glMultiTexCoord3iARB;\r
+  #define glMultiTexCoord3iARB GLeeFuncPtr_glMultiTexCoord3iARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord3ivARB\r
+#define GLEE_H_DEFINED_glMultiTexCoord3ivARB\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD3IVARBPROC) (GLenum target, const GLint * v);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD3IVARBPROC GLeeFuncPtr_glMultiTexCoord3ivARB;\r
+  #define glMultiTexCoord3ivARB GLeeFuncPtr_glMultiTexCoord3ivARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord3sARB\r
+#define GLEE_H_DEFINED_glMultiTexCoord3sARB\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD3SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD3SARBPROC GLeeFuncPtr_glMultiTexCoord3sARB;\r
+  #define glMultiTexCoord3sARB GLeeFuncPtr_glMultiTexCoord3sARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord3svARB\r
+#define GLEE_H_DEFINED_glMultiTexCoord3svARB\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD3SVARBPROC) (GLenum target, const GLshort * v);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD3SVARBPROC GLeeFuncPtr_glMultiTexCoord3svARB;\r
+  #define glMultiTexCoord3svARB GLeeFuncPtr_glMultiTexCoord3svARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord4dARB\r
+#define GLEE_H_DEFINED_glMultiTexCoord4dARB\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD4DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD4DARBPROC GLeeFuncPtr_glMultiTexCoord4dARB;\r
+  #define glMultiTexCoord4dARB GLeeFuncPtr_glMultiTexCoord4dARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord4dvARB\r
+#define GLEE_H_DEFINED_glMultiTexCoord4dvARB\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD4DVARBPROC) (GLenum target, const GLdouble * v);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD4DVARBPROC GLeeFuncPtr_glMultiTexCoord4dvARB;\r
+  #define glMultiTexCoord4dvARB GLeeFuncPtr_glMultiTexCoord4dvARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord4fARB\r
+#define GLEE_H_DEFINED_glMultiTexCoord4fARB\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD4FARBPROC GLeeFuncPtr_glMultiTexCoord4fARB;\r
+  #define glMultiTexCoord4fARB GLeeFuncPtr_glMultiTexCoord4fARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord4fvARB\r
+#define GLEE_H_DEFINED_glMultiTexCoord4fvARB\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat * v);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD4FVARBPROC GLeeFuncPtr_glMultiTexCoord4fvARB;\r
+  #define glMultiTexCoord4fvARB GLeeFuncPtr_glMultiTexCoord4fvARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord4iARB\r
+#define GLEE_H_DEFINED_glMultiTexCoord4iARB\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD4IARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD4IARBPROC GLeeFuncPtr_glMultiTexCoord4iARB;\r
+  #define glMultiTexCoord4iARB GLeeFuncPtr_glMultiTexCoord4iARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord4ivARB\r
+#define GLEE_H_DEFINED_glMultiTexCoord4ivARB\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD4IVARBPROC) (GLenum target, const GLint * v);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD4IVARBPROC GLeeFuncPtr_glMultiTexCoord4ivARB;\r
+  #define glMultiTexCoord4ivARB GLeeFuncPtr_glMultiTexCoord4ivARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord4sARB\r
+#define GLEE_H_DEFINED_glMultiTexCoord4sARB\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD4SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD4SARBPROC GLeeFuncPtr_glMultiTexCoord4sARB;\r
+  #define glMultiTexCoord4sARB GLeeFuncPtr_glMultiTexCoord4sARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord4svARB\r
+#define GLEE_H_DEFINED_glMultiTexCoord4svARB\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort * v);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD4SVARBPROC GLeeFuncPtr_glMultiTexCoord4svARB;\r
+  #define glMultiTexCoord4svARB GLeeFuncPtr_glMultiTexCoord4svARB\r
+#endif\r
+#endif \r
+\r
+/* GL_ARB_transpose_matrix */\r
+\r
+#ifndef GL_ARB_transpose_matrix\r
+#define GL_ARB_transpose_matrix 1\r
+#define __GLEE_GL_ARB_transpose_matrix 1\r
+/* Constants */\r
+#define GL_TRANSPOSE_MODELVIEW_MATRIX_ARB                  0x84E3\r
+#define GL_TRANSPOSE_PROJECTION_MATRIX_ARB                 0x84E4\r
+#define GL_TRANSPOSE_TEXTURE_MATRIX_ARB                    0x84E5\r
+#define GL_TRANSPOSE_COLOR_MATRIX_ARB                      0x84E6\r
+#ifndef GLEE_H_DEFINED_glLoadTransposeMatrixfARB\r
+#define GLEE_H_DEFINED_glLoadTransposeMatrixfARB\r
+  typedef void (APIENTRYP GLEEPFNGLLOADTRANSPOSEMATRIXFARBPROC) (const GLfloat * m);\r
+  GLEE_EXTERN GLEEPFNGLLOADTRANSPOSEMATRIXFARBPROC GLeeFuncPtr_glLoadTransposeMatrixfARB;\r
+  #define glLoadTransposeMatrixfARB GLeeFuncPtr_glLoadTransposeMatrixfARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glLoadTransposeMatrixdARB\r
+#define GLEE_H_DEFINED_glLoadTransposeMatrixdARB\r
+  typedef void (APIENTRYP GLEEPFNGLLOADTRANSPOSEMATRIXDARBPROC) (const GLdouble * m);\r
+  GLEE_EXTERN GLEEPFNGLLOADTRANSPOSEMATRIXDARBPROC GLeeFuncPtr_glLoadTransposeMatrixdARB;\r
+  #define glLoadTransposeMatrixdARB GLeeFuncPtr_glLoadTransposeMatrixdARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultTransposeMatrixfARB\r
+#define GLEE_H_DEFINED_glMultTransposeMatrixfARB\r
+  typedef void (APIENTRYP GLEEPFNGLMULTTRANSPOSEMATRIXFARBPROC) (const GLfloat * m);\r
+  GLEE_EXTERN GLEEPFNGLMULTTRANSPOSEMATRIXFARBPROC GLeeFuncPtr_glMultTransposeMatrixfARB;\r
+  #define glMultTransposeMatrixfARB GLeeFuncPtr_glMultTransposeMatrixfARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultTransposeMatrixdARB\r
+#define GLEE_H_DEFINED_glMultTransposeMatrixdARB\r
+  typedef void (APIENTRYP GLEEPFNGLMULTTRANSPOSEMATRIXDARBPROC) (const GLdouble * m);\r
+  GLEE_EXTERN GLEEPFNGLMULTTRANSPOSEMATRIXDARBPROC GLeeFuncPtr_glMultTransposeMatrixdARB;\r
+  #define glMultTransposeMatrixdARB GLeeFuncPtr_glMultTransposeMatrixdARB\r
+#endif\r
+#endif \r
+\r
+/* GL_ARB_multisample */\r
+\r
+#ifndef GL_ARB_multisample\r
+#define GL_ARB_multisample 1\r
+#define __GLEE_GL_ARB_multisample 1\r
+/* Constants */\r
+#define GL_MULTISAMPLE_ARB                                 0x809D\r
+#define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB                    0x809E\r
+#define GL_SAMPLE_ALPHA_TO_ONE_ARB                         0x809F\r
+#define GL_SAMPLE_COVERAGE_ARB                             0x80A0\r
+#define GL_SAMPLE_BUFFERS_ARB                              0x80A8\r
+#define GL_SAMPLES_ARB                                     0x80A9\r
+#define GL_SAMPLE_COVERAGE_VALUE_ARB                       0x80AA\r
+#define GL_SAMPLE_COVERAGE_INVERT_ARB                      0x80AB\r
+#define GL_MULTISAMPLE_BIT_ARB                             0x20000000\r
+#ifndef GLEE_H_DEFINED_glSampleCoverageARB\r
+#define GLEE_H_DEFINED_glSampleCoverageARB\r
+  typedef void (APIENTRYP GLEEPFNGLSAMPLECOVERAGEARBPROC) (GLclampf value, GLboolean invert);\r
+  GLEE_EXTERN GLEEPFNGLSAMPLECOVERAGEARBPROC GLeeFuncPtr_glSampleCoverageARB;\r
+  #define glSampleCoverageARB GLeeFuncPtr_glSampleCoverageARB\r
+#endif\r
+#endif \r
+\r
+/* GL_ARB_texture_env_add */\r
+\r
+#ifndef GL_ARB_texture_env_add\r
+#define GL_ARB_texture_env_add 1\r
+#define __GLEE_GL_ARB_texture_env_add 1\r
+/* Constants */\r
+#endif \r
+\r
+/* GL_ARB_texture_cube_map */\r
+\r
+#ifndef GL_ARB_texture_cube_map\r
+#define GL_ARB_texture_cube_map 1\r
+#define __GLEE_GL_ARB_texture_cube_map 1\r
+/* Constants */\r
+#define GL_NORMAL_MAP_ARB                                  0x8511\r
+#define GL_REFLECTION_MAP_ARB                              0x8512\r
+#define GL_TEXTURE_CUBE_MAP_ARB                            0x8513\r
+#define GL_TEXTURE_BINDING_CUBE_MAP_ARB                    0x8514\r
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB                 0x8515\r
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB                 0x8516\r
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB                 0x8517\r
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB                 0x8518\r
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB                 0x8519\r
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB                 0x851A\r
+#define GL_PROXY_TEXTURE_CUBE_MAP_ARB                      0x851B\r
+#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB                   0x851C\r
+#endif \r
+\r
+/* GL_ARB_texture_compression */\r
+\r
+#ifndef GL_ARB_texture_compression\r
+#define GL_ARB_texture_compression 1\r
+#define __GLEE_GL_ARB_texture_compression 1\r
+/* Constants */\r
+#define GL_COMPRESSED_ALPHA_ARB                            0x84E9\r
+#define GL_COMPRESSED_LUMINANCE_ARB                        0x84EA\r
+#define GL_COMPRESSED_LUMINANCE_ALPHA_ARB                  0x84EB\r
+#define GL_COMPRESSED_INTENSITY_ARB                        0x84EC\r
+#define GL_COMPRESSED_RGB_ARB                              0x84ED\r
+#define GL_COMPRESSED_RGBA_ARB                             0x84EE\r
+#define GL_TEXTURE_COMPRESSION_HINT_ARB                    0x84EF\r
+#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB               0x86A0\r
+#define GL_TEXTURE_COMPRESSED_ARB                          0x86A1\r
+#define GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB              0x86A2\r
+#define GL_COMPRESSED_TEXTURE_FORMATS_ARB                  0x86A3\r
+#ifndef GLEE_H_DEFINED_glCompressedTexImage3DARB\r
+#define GLEE_H_DEFINED_glCompressedTexImage3DARB\r
+  typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDTEXIMAGE3DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid * data);\r
+  GLEE_EXTERN GLEEPFNGLCOMPRESSEDTEXIMAGE3DARBPROC GLeeFuncPtr_glCompressedTexImage3DARB;\r
+  #define glCompressedTexImage3DARB GLeeFuncPtr_glCompressedTexImage3DARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glCompressedTexImage2DARB\r
+#define GLEE_H_DEFINED_glCompressedTexImage2DARB\r
+  typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDTEXIMAGE2DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid * data);\r
+  GLEE_EXTERN GLEEPFNGLCOMPRESSEDTEXIMAGE2DARBPROC GLeeFuncPtr_glCompressedTexImage2DARB;\r
+  #define glCompressedTexImage2DARB GLeeFuncPtr_glCompressedTexImage2DARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glCompressedTexImage1DARB\r
+#define GLEE_H_DEFINED_glCompressedTexImage1DARB\r
+  typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDTEXIMAGE1DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid * data);\r
+  GLEE_EXTERN GLEEPFNGLCOMPRESSEDTEXIMAGE1DARBPROC GLeeFuncPtr_glCompressedTexImage1DARB;\r
+  #define glCompressedTexImage1DARB GLeeFuncPtr_glCompressedTexImage1DARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glCompressedTexSubImage3DARB\r
+#define GLEE_H_DEFINED_glCompressedTexSubImage3DARB\r
+  typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid * data);\r
+  GLEE_EXTERN GLEEPFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC GLeeFuncPtr_glCompressedTexSubImage3DARB;\r
+  #define glCompressedTexSubImage3DARB GLeeFuncPtr_glCompressedTexSubImage3DARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glCompressedTexSubImage2DARB\r
+#define GLEE_H_DEFINED_glCompressedTexSubImage2DARB\r
+  typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid * data);\r
+  GLEE_EXTERN GLEEPFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC GLeeFuncPtr_glCompressedTexSubImage2DARB;\r
+  #define glCompressedTexSubImage2DARB GLeeFuncPtr_glCompressedTexSubImage2DARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glCompressedTexSubImage1DARB\r
+#define GLEE_H_DEFINED_glCompressedTexSubImage1DARB\r
+  typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid * data);\r
+  GLEE_EXTERN GLEEPFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC GLeeFuncPtr_glCompressedTexSubImage1DARB;\r
+  #define glCompressedTexSubImage1DARB GLeeFuncPtr_glCompressedTexSubImage1DARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetCompressedTexImageARB\r
+#define GLEE_H_DEFINED_glGetCompressedTexImageARB\r
+  typedef void (APIENTRYP GLEEPFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint level, GLvoid * img);\r
+  GLEE_EXTERN GLEEPFNGLGETCOMPRESSEDTEXIMAGEARBPROC GLeeFuncPtr_glGetCompressedTexImageARB;\r
+  #define glGetCompressedTexImageARB GLeeFuncPtr_glGetCompressedTexImageARB\r
+#endif\r
+#endif \r
+\r
+/* GL_ARB_texture_border_clamp */\r
+\r
+#ifndef GL_ARB_texture_border_clamp\r
+#define GL_ARB_texture_border_clamp 1\r
+#define __GLEE_GL_ARB_texture_border_clamp 1\r
+/* Constants */\r
+#define GL_CLAMP_TO_BORDER_ARB                             0x812D\r
+#endif \r
+\r
+/* GL_ARB_point_parameters */\r
+\r
+#ifndef GL_ARB_point_parameters\r
+#define GL_ARB_point_parameters 1\r
+#define __GLEE_GL_ARB_point_parameters 1\r
+/* Constants */\r
+#define GL_POINT_SIZE_MIN_ARB                              0x8126\r
+#define GL_POINT_SIZE_MAX_ARB                              0x8127\r
+#define GL_POINT_FADE_THRESHOLD_SIZE_ARB                   0x8128\r
+#define GL_POINT_DISTANCE_ATTENUATION_ARB                  0x8129\r
+#ifndef GLEE_H_DEFINED_glPointParameterfARB\r
+#define GLEE_H_DEFINED_glPointParameterfARB\r
+  typedef void (APIENTRYP GLEEPFNGLPOINTPARAMETERFARBPROC) (GLenum pname, GLfloat param);\r
+  GLEE_EXTERN GLEEPFNGLPOINTPARAMETERFARBPROC GLeeFuncPtr_glPointParameterfARB;\r
+  #define glPointParameterfARB GLeeFuncPtr_glPointParameterfARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glPointParameterfvARB\r
+#define GLEE_H_DEFINED_glPointParameterfvARB\r
+  typedef void (APIENTRYP GLEEPFNGLPOINTPARAMETERFVARBPROC) (GLenum pname, const GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLPOINTPARAMETERFVARBPROC GLeeFuncPtr_glPointParameterfvARB;\r
+  #define glPointParameterfvARB GLeeFuncPtr_glPointParameterfvARB\r
+#endif\r
+#endif \r
+\r
+/* GL_ARB_vertex_blend */\r
+\r
+#ifndef GL_ARB_vertex_blend\r
+#define GL_ARB_vertex_blend 1\r
+#define __GLEE_GL_ARB_vertex_blend 1\r
+/* Constants */\r
+#define GL_MAX_VERTEX_UNITS_ARB                            0x86A4\r
+#define GL_ACTIVE_VERTEX_UNITS_ARB                         0x86A5\r
+#define GL_WEIGHT_SUM_UNITY_ARB                            0x86A6\r
+#define GL_VERTEX_BLEND_ARB                                0x86A7\r
+#define GL_CURRENT_WEIGHT_ARB                              0x86A8\r
+#define GL_WEIGHT_ARRAY_TYPE_ARB                           0x86A9\r
+#define GL_WEIGHT_ARRAY_STRIDE_ARB                         0x86AA\r
+#define GL_WEIGHT_ARRAY_SIZE_ARB                           0x86AB\r
+#define GL_WEIGHT_ARRAY_POINTER_ARB                        0x86AC\r
+#define GL_WEIGHT_ARRAY_ARB                                0x86AD\r
+#define GL_MODELVIEW0_ARB                                  0x1700\r
+#define GL_MODELVIEW1_ARB                                  0x850A\r
+#define GL_MODELVIEW2_ARB                                  0x8722\r
+#define GL_MODELVIEW3_ARB                                  0x8723\r
+#define GL_MODELVIEW4_ARB                                  0x8724\r
+#define GL_MODELVIEW5_ARB                                  0x8725\r
+#define GL_MODELVIEW6_ARB                                  0x8726\r
+#define GL_MODELVIEW7_ARB                                  0x8727\r
+#define GL_MODELVIEW8_ARB                                  0x8728\r
+#define GL_MODELVIEW9_ARB                                  0x8729\r
+#define GL_MODELVIEW10_ARB                                 0x872A\r
+#define GL_MODELVIEW11_ARB                                 0x872B\r
+#define GL_MODELVIEW12_ARB                                 0x872C\r
+#define GL_MODELVIEW13_ARB                                 0x872D\r
+#define GL_MODELVIEW14_ARB                                 0x872E\r
+#define GL_MODELVIEW15_ARB                                 0x872F\r
+#define GL_MODELVIEW16_ARB                                 0x8730\r
+#define GL_MODELVIEW17_ARB                                 0x8731\r
+#define GL_MODELVIEW18_ARB                                 0x8732\r
+#define GL_MODELVIEW19_ARB                                 0x8733\r
+#define GL_MODELVIEW20_ARB                                 0x8734\r
+#define GL_MODELVIEW21_ARB                                 0x8735\r
+#define GL_MODELVIEW22_ARB                                 0x8736\r
+#define GL_MODELVIEW23_ARB                                 0x8737\r
+#define GL_MODELVIEW24_ARB                                 0x8738\r
+#define GL_MODELVIEW25_ARB                                 0x8739\r
+#define GL_MODELVIEW26_ARB                                 0x873A\r
+#define GL_MODELVIEW27_ARB                                 0x873B\r
+#define GL_MODELVIEW28_ARB                                 0x873C\r
+#define GL_MODELVIEW29_ARB                                 0x873D\r
+#define GL_MODELVIEW30_ARB                                 0x873E\r
+#define GL_MODELVIEW31_ARB                                 0x873F\r
+#ifndef GLEE_H_DEFINED_glWeightbvARB\r
+#define GLEE_H_DEFINED_glWeightbvARB\r
+  typedef void (APIENTRYP GLEEPFNGLWEIGHTBVARBPROC) (GLint size, const GLbyte * weights);\r
+  GLEE_EXTERN GLEEPFNGLWEIGHTBVARBPROC GLeeFuncPtr_glWeightbvARB;\r
+  #define glWeightbvARB GLeeFuncPtr_glWeightbvARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glWeightsvARB\r
+#define GLEE_H_DEFINED_glWeightsvARB\r
+  typedef void (APIENTRYP GLEEPFNGLWEIGHTSVARBPROC) (GLint size, const GLshort * weights);\r
+  GLEE_EXTERN GLEEPFNGLWEIGHTSVARBPROC GLeeFuncPtr_glWeightsvARB;\r
+  #define glWeightsvARB GLeeFuncPtr_glWeightsvARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glWeightivARB\r
+#define GLEE_H_DEFINED_glWeightivARB\r
+  typedef void (APIENTRYP GLEEPFNGLWEIGHTIVARBPROC) (GLint size, const GLint * weights);\r
+  GLEE_EXTERN GLEEPFNGLWEIGHTIVARBPROC GLeeFuncPtr_glWeightivARB;\r
+  #define glWeightivARB GLeeFuncPtr_glWeightivARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glWeightfvARB\r
+#define GLEE_H_DEFINED_glWeightfvARB\r
+  typedef void (APIENTRYP GLEEPFNGLWEIGHTFVARBPROC) (GLint size, const GLfloat * weights);\r
+  GLEE_EXTERN GLEEPFNGLWEIGHTFVARBPROC GLeeFuncPtr_glWeightfvARB;\r
+  #define glWeightfvARB GLeeFuncPtr_glWeightfvARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glWeightdvARB\r
+#define GLEE_H_DEFINED_glWeightdvARB\r
+  typedef void (APIENTRYP GLEEPFNGLWEIGHTDVARBPROC) (GLint size, const GLdouble * weights);\r
+  GLEE_EXTERN GLEEPFNGLWEIGHTDVARBPROC GLeeFuncPtr_glWeightdvARB;\r
+  #define glWeightdvARB GLeeFuncPtr_glWeightdvARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glWeightubvARB\r
+#define GLEE_H_DEFINED_glWeightubvARB\r
+  typedef void (APIENTRYP GLEEPFNGLWEIGHTUBVARBPROC) (GLint size, const GLubyte * weights);\r
+  GLEE_EXTERN GLEEPFNGLWEIGHTUBVARBPROC GLeeFuncPtr_glWeightubvARB;\r
+  #define glWeightubvARB GLeeFuncPtr_glWeightubvARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glWeightusvARB\r
+#define GLEE_H_DEFINED_glWeightusvARB\r
+  typedef void (APIENTRYP GLEEPFNGLWEIGHTUSVARBPROC) (GLint size, const GLushort * weights);\r
+  GLEE_EXTERN GLEEPFNGLWEIGHTUSVARBPROC GLeeFuncPtr_glWeightusvARB;\r
+  #define glWeightusvARB GLeeFuncPtr_glWeightusvARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glWeightuivARB\r
+#define GLEE_H_DEFINED_glWeightuivARB\r
+  typedef void (APIENTRYP GLEEPFNGLWEIGHTUIVARBPROC) (GLint size, const GLuint * weights);\r
+  GLEE_EXTERN GLEEPFNGLWEIGHTUIVARBPROC GLeeFuncPtr_glWeightuivARB;\r
+  #define glWeightuivARB GLeeFuncPtr_glWeightuivARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glWeightPointerARB\r
+#define GLEE_H_DEFINED_glWeightPointerARB\r
+  typedef void (APIENTRYP GLEEPFNGLWEIGHTPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid * pointer);\r
+  GLEE_EXTERN GLEEPFNGLWEIGHTPOINTERARBPROC GLeeFuncPtr_glWeightPointerARB;\r
+  #define glWeightPointerARB GLeeFuncPtr_glWeightPointerARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexBlendARB\r
+#define GLEE_H_DEFINED_glVertexBlendARB\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXBLENDARBPROC) (GLint count);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXBLENDARBPROC GLeeFuncPtr_glVertexBlendARB;\r
+  #define glVertexBlendARB GLeeFuncPtr_glVertexBlendARB\r
+#endif\r
+#endif \r
+\r
+/* GL_ARB_matrix_palette */\r
+\r
+#ifndef GL_ARB_matrix_palette\r
+#define GL_ARB_matrix_palette 1\r
+#define __GLEE_GL_ARB_matrix_palette 1\r
+/* Constants */\r
+#define GL_MATRIX_PALETTE_ARB                              0x8840\r
+#define GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB              0x8841\r
+#define GL_MAX_PALETTE_MATRICES_ARB                        0x8842\r
+#define GL_CURRENT_PALETTE_MATRIX_ARB                      0x8843\r
+#define GL_MATRIX_INDEX_ARRAY_ARB                          0x8844\r
+#define GL_CURRENT_MATRIX_INDEX_ARB                        0x8845\r
+#define GL_MATRIX_INDEX_ARRAY_SIZE_ARB                     0x8846\r
+#define GL_MATRIX_INDEX_ARRAY_TYPE_ARB                     0x8847\r
+#define GL_MATRIX_INDEX_ARRAY_STRIDE_ARB                   0x8848\r
+#define GL_MATRIX_INDEX_ARRAY_POINTER_ARB                  0x8849\r
+#ifndef GLEE_H_DEFINED_glCurrentPaletteMatrixARB\r
+#define GLEE_H_DEFINED_glCurrentPaletteMatrixARB\r
+  typedef void (APIENTRYP GLEEPFNGLCURRENTPALETTEMATRIXARBPROC) (GLint index);\r
+  GLEE_EXTERN GLEEPFNGLCURRENTPALETTEMATRIXARBPROC GLeeFuncPtr_glCurrentPaletteMatrixARB;\r
+  #define glCurrentPaletteMatrixARB GLeeFuncPtr_glCurrentPaletteMatrixARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMatrixIndexubvARB\r
+#define GLEE_H_DEFINED_glMatrixIndexubvARB\r
+  typedef void (APIENTRYP GLEEPFNGLMATRIXINDEXUBVARBPROC) (GLint size, const GLubyte * indices);\r
+  GLEE_EXTERN GLEEPFNGLMATRIXINDEXUBVARBPROC GLeeFuncPtr_glMatrixIndexubvARB;\r
+  #define glMatrixIndexubvARB GLeeFuncPtr_glMatrixIndexubvARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMatrixIndexusvARB\r
+#define GLEE_H_DEFINED_glMatrixIndexusvARB\r
+  typedef void (APIENTRYP GLEEPFNGLMATRIXINDEXUSVARBPROC) (GLint size, const GLushort * indices);\r
+  GLEE_EXTERN GLEEPFNGLMATRIXINDEXUSVARBPROC GLeeFuncPtr_glMatrixIndexusvARB;\r
+  #define glMatrixIndexusvARB GLeeFuncPtr_glMatrixIndexusvARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMatrixIndexuivARB\r
+#define GLEE_H_DEFINED_glMatrixIndexuivARB\r
+  typedef void (APIENTRYP GLEEPFNGLMATRIXINDEXUIVARBPROC) (GLint size, const GLuint * indices);\r
+  GLEE_EXTERN GLEEPFNGLMATRIXINDEXUIVARBPROC GLeeFuncPtr_glMatrixIndexuivARB;\r
+  #define glMatrixIndexuivARB GLeeFuncPtr_glMatrixIndexuivARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMatrixIndexPointerARB\r
+#define GLEE_H_DEFINED_glMatrixIndexPointerARB\r
+  typedef void (APIENTRYP GLEEPFNGLMATRIXINDEXPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid * pointer);\r
+  GLEE_EXTERN GLEEPFNGLMATRIXINDEXPOINTERARBPROC GLeeFuncPtr_glMatrixIndexPointerARB;\r
+  #define glMatrixIndexPointerARB GLeeFuncPtr_glMatrixIndexPointerARB\r
+#endif\r
+#endif \r
+\r
+/* GL_ARB_texture_env_combine */\r
+\r
+#ifndef GL_ARB_texture_env_combine\r
+#define GL_ARB_texture_env_combine 1\r
+#define __GLEE_GL_ARB_texture_env_combine 1\r
+/* Constants */\r
+#define GL_COMBINE_ARB                                     0x8570\r
+#define GL_COMBINE_RGB_ARB                                 0x8571\r
+#define GL_COMBINE_ALPHA_ARB                               0x8572\r
+#define GL_SOURCE0_RGB_ARB                                 0x8580\r
+#define GL_SOURCE1_RGB_ARB                                 0x8581\r
+#define GL_SOURCE2_RGB_ARB                                 0x8582\r
+#define GL_SOURCE0_ALPHA_ARB                               0x8588\r
+#define GL_SOURCE1_ALPHA_ARB                               0x8589\r
+#define GL_SOURCE2_ALPHA_ARB                               0x858A\r
+#define GL_OPERAND0_RGB_ARB                                0x8590\r
+#define GL_OPERAND1_RGB_ARB                                0x8591\r
+#define GL_OPERAND2_RGB_ARB                                0x8592\r
+#define GL_OPERAND0_ALPHA_ARB                              0x8598\r
+#define GL_OPERAND1_ALPHA_ARB                              0x8599\r
+#define GL_OPERAND2_ALPHA_ARB                              0x859A\r
+#define GL_RGB_SCALE_ARB                                   0x8573\r
+#define GL_ADD_SIGNED_ARB                                  0x8574\r
+#define GL_INTERPOLATE_ARB                                 0x8575\r
+#define GL_SUBTRACT_ARB                                    0x84E7\r
+#define GL_CONSTANT_ARB                                    0x8576\r
+#define GL_PRIMARY_COLOR_ARB                               0x8577\r
+#define GL_PREVIOUS_ARB                                    0x8578\r
+#endif \r
+\r
+/* GL_ARB_texture_env_crossbar */\r
+\r
+#ifndef GL_ARB_texture_env_crossbar\r
+#define GL_ARB_texture_env_crossbar 1\r
+#define __GLEE_GL_ARB_texture_env_crossbar 1\r
+/* Constants */\r
+#endif \r
+\r
+/* GL_ARB_texture_env_dot3 */\r
+\r
+#ifndef GL_ARB_texture_env_dot3\r
+#define GL_ARB_texture_env_dot3 1\r
+#define __GLEE_GL_ARB_texture_env_dot3 1\r
+/* Constants */\r
+#define GL_DOT3_RGB_ARB                                    0x86AE\r
+#define GL_DOT3_RGBA_ARB                                   0x86AF\r
+#endif \r
+\r
+/* GL_ARB_texture_mirrored_repeat */\r
+\r
+#ifndef GL_ARB_texture_mirrored_repeat\r
+#define GL_ARB_texture_mirrored_repeat 1\r
+#define __GLEE_GL_ARB_texture_mirrored_repeat 1\r
+/* Constants */\r
+#define GL_MIRRORED_REPEAT_ARB                             0x8370\r
+#endif \r
+\r
+/* GL_ARB_depth_texture */\r
+\r
+#ifndef GL_ARB_depth_texture\r
+#define GL_ARB_depth_texture 1\r
+#define __GLEE_GL_ARB_depth_texture 1\r
+/* Constants */\r
+#define GL_DEPTH_COMPONENT16_ARB                           0x81A5\r
+#define GL_DEPTH_COMPONENT24_ARB                           0x81A6\r
+#define GL_DEPTH_COMPONENT32_ARB                           0x81A7\r
+#define GL_TEXTURE_DEPTH_SIZE_ARB                          0x884A\r
+#define GL_DEPTH_TEXTURE_MODE_ARB                          0x884B\r
+#endif \r
+\r
+/* GL_ARB_shadow */\r
+\r
+#ifndef GL_ARB_shadow\r
+#define GL_ARB_shadow 1\r
+#define __GLEE_GL_ARB_shadow 1\r
+/* Constants */\r
+#define GL_TEXTURE_COMPARE_MODE_ARB                        0x884C\r
+#define GL_TEXTURE_COMPARE_FUNC_ARB                        0x884D\r
+#define GL_COMPARE_R_TO_TEXTURE_ARB                        0x884E\r
+#endif \r
+\r
+/* GL_ARB_shadow_ambient */\r
+\r
+#ifndef GL_ARB_shadow_ambient\r
+#define GL_ARB_shadow_ambient 1\r
+#define __GLEE_GL_ARB_shadow_ambient 1\r
+/* Constants */\r
+#define GL_TEXTURE_COMPARE_FAIL_VALUE_ARB                  0x80BF\r
+#endif \r
+\r
+/* GL_ARB_window_pos */\r
+\r
+#ifndef GL_ARB_window_pos\r
+#define GL_ARB_window_pos 1\r
+#define __GLEE_GL_ARB_window_pos 1\r
+/* Constants */\r
+#ifndef GLEE_H_DEFINED_glWindowPos2dARB\r
+#define GLEE_H_DEFINED_glWindowPos2dARB\r
+  typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2DARBPROC) (GLdouble x, GLdouble y);\r
+  GLEE_EXTERN GLEEPFNGLWINDOWPOS2DARBPROC GLeeFuncPtr_glWindowPos2dARB;\r
+  #define glWindowPos2dARB GLeeFuncPtr_glWindowPos2dARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glWindowPos2dvARB\r
+#define GLEE_H_DEFINED_glWindowPos2dvARB\r
+  typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2DVARBPROC) (const GLdouble * v);\r
+  GLEE_EXTERN GLEEPFNGLWINDOWPOS2DVARBPROC GLeeFuncPtr_glWindowPos2dvARB;\r
+  #define glWindowPos2dvARB GLeeFuncPtr_glWindowPos2dvARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glWindowPos2fARB\r
+#define GLEE_H_DEFINED_glWindowPos2fARB\r
+  typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2FARBPROC) (GLfloat x, GLfloat y);\r
+  GLEE_EXTERN GLEEPFNGLWINDOWPOS2FARBPROC GLeeFuncPtr_glWindowPos2fARB;\r
+  #define glWindowPos2fARB GLeeFuncPtr_glWindowPos2fARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glWindowPos2fvARB\r
+#define GLEE_H_DEFINED_glWindowPos2fvARB\r
+  typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2FVARBPROC) (const GLfloat * v);\r
+  GLEE_EXTERN GLEEPFNGLWINDOWPOS2FVARBPROC GLeeFuncPtr_glWindowPos2fvARB;\r
+  #define glWindowPos2fvARB GLeeFuncPtr_glWindowPos2fvARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glWindowPos2iARB\r
+#define GLEE_H_DEFINED_glWindowPos2iARB\r
+  typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2IARBPROC) (GLint x, GLint y);\r
+  GLEE_EXTERN GLEEPFNGLWINDOWPOS2IARBPROC GLeeFuncPtr_glWindowPos2iARB;\r
+  #define glWindowPos2iARB GLeeFuncPtr_glWindowPos2iARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glWindowPos2ivARB\r
+#define GLEE_H_DEFINED_glWindowPos2ivARB\r
+  typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2IVARBPROC) (const GLint * v);\r
+  GLEE_EXTERN GLEEPFNGLWINDOWPOS2IVARBPROC GLeeFuncPtr_glWindowPos2ivARB;\r
+  #define glWindowPos2ivARB GLeeFuncPtr_glWindowPos2ivARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glWindowPos2sARB\r
+#define GLEE_H_DEFINED_glWindowPos2sARB\r
+  typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2SARBPROC) (GLshort x, GLshort y);\r
+  GLEE_EXTERN GLEEPFNGLWINDOWPOS2SARBPROC GLeeFuncPtr_glWindowPos2sARB;\r
+  #define glWindowPos2sARB GLeeFuncPtr_glWindowPos2sARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glWindowPos2svARB\r
+#define GLEE_H_DEFINED_glWindowPos2svARB\r
+  typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2SVARBPROC) (const GLshort * v);\r
+  GLEE_EXTERN GLEEPFNGLWINDOWPOS2SVARBPROC GLeeFuncPtr_glWindowPos2svARB;\r
+  #define glWindowPos2svARB GLeeFuncPtr_glWindowPos2svARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glWindowPos3dARB\r
+#define GLEE_H_DEFINED_glWindowPos3dARB\r
+  typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3DARBPROC) (GLdouble x, GLdouble y, GLdouble z);\r
+  GLEE_EXTERN GLEEPFNGLWINDOWPOS3DARBPROC GLeeFuncPtr_glWindowPos3dARB;\r
+  #define glWindowPos3dARB GLeeFuncPtr_glWindowPos3dARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glWindowPos3dvARB\r
+#define GLEE_H_DEFINED_glWindowPos3dvARB\r
+  typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3DVARBPROC) (const GLdouble * v);\r
+  GLEE_EXTERN GLEEPFNGLWINDOWPOS3DVARBPROC GLeeFuncPtr_glWindowPos3dvARB;\r
+  #define glWindowPos3dvARB GLeeFuncPtr_glWindowPos3dvARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glWindowPos3fARB\r
+#define GLEE_H_DEFINED_glWindowPos3fARB\r
+  typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3FARBPROC) (GLfloat x, GLfloat y, GLfloat z);\r
+  GLEE_EXTERN GLEEPFNGLWINDOWPOS3FARBPROC GLeeFuncPtr_glWindowPos3fARB;\r
+  #define glWindowPos3fARB GLeeFuncPtr_glWindowPos3fARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glWindowPos3fvARB\r
+#define GLEE_H_DEFINED_glWindowPos3fvARB\r
+  typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3FVARBPROC) (const GLfloat * v);\r
+  GLEE_EXTERN GLEEPFNGLWINDOWPOS3FVARBPROC GLeeFuncPtr_glWindowPos3fvARB;\r
+  #define glWindowPos3fvARB GLeeFuncPtr_glWindowPos3fvARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glWindowPos3iARB\r
+#define GLEE_H_DEFINED_glWindowPos3iARB\r
+  typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3IARBPROC) (GLint x, GLint y, GLint z);\r
+  GLEE_EXTERN GLEEPFNGLWINDOWPOS3IARBPROC GLeeFuncPtr_glWindowPos3iARB;\r
+  #define glWindowPos3iARB GLeeFuncPtr_glWindowPos3iARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glWindowPos3ivARB\r
+#define GLEE_H_DEFINED_glWindowPos3ivARB\r
+  typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3IVARBPROC) (const GLint * v);\r
+  GLEE_EXTERN GLEEPFNGLWINDOWPOS3IVARBPROC GLeeFuncPtr_glWindowPos3ivARB;\r
+  #define glWindowPos3ivARB GLeeFuncPtr_glWindowPos3ivARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glWindowPos3sARB\r
+#define GLEE_H_DEFINED_glWindowPos3sARB\r
+  typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3SARBPROC) (GLshort x, GLshort y, GLshort z);\r
+  GLEE_EXTERN GLEEPFNGLWINDOWPOS3SARBPROC GLeeFuncPtr_glWindowPos3sARB;\r
+  #define glWindowPos3sARB GLeeFuncPtr_glWindowPos3sARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glWindowPos3svARB\r
+#define GLEE_H_DEFINED_glWindowPos3svARB\r
+  typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3SVARBPROC) (const GLshort * v);\r
+  GLEE_EXTERN GLEEPFNGLWINDOWPOS3SVARBPROC GLeeFuncPtr_glWindowPos3svARB;\r
+  #define glWindowPos3svARB GLeeFuncPtr_glWindowPos3svARB\r
+#endif\r
+#endif \r
+\r
+/* GL_ARB_vertex_program */\r
+\r
+#ifndef GL_ARB_vertex_program\r
+#define GL_ARB_vertex_program 1\r
+#define __GLEE_GL_ARB_vertex_program 1\r
+/* Constants */\r
+#define GL_COLOR_SUM_ARB                                   0x8458\r
+#define GL_VERTEX_PROGRAM_ARB                              0x8620\r
+#define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB                 0x8622\r
+#define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB                    0x8623\r
+#define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB                  0x8624\r
+#define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB                    0x8625\r
+#define GL_CURRENT_VERTEX_ATTRIB_ARB                       0x8626\r
+#define GL_PROGRAM_LENGTH_ARB                              0x8627\r
+#define GL_PROGRAM_STRING_ARB                              0x8628\r
+#define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB              0x862E\r
+#define GL_MAX_PROGRAM_MATRICES_ARB                        0x862F\r
+#define GL_CURRENT_MATRIX_STACK_DEPTH_ARB                  0x8640\r
+#define GL_CURRENT_MATRIX_ARB                              0x8641\r
+#define GL_VERTEX_PROGRAM_POINT_SIZE_ARB                   0x8642\r
+#define GL_VERTEX_PROGRAM_TWO_SIDE_ARB                     0x8643\r
+#define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB                 0x8645\r
+#define GL_PROGRAM_ERROR_POSITION_ARB                      0x864B\r
+#define GL_PROGRAM_BINDING_ARB                             0x8677\r
+#define GL_MAX_VERTEX_ATTRIBS_ARB                          0x8869\r
+#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB              0x886A\r
+#define GL_PROGRAM_ERROR_STRING_ARB                        0x8874\r
+#define GL_PROGRAM_FORMAT_ASCII_ARB                        0x8875\r
+#define GL_PROGRAM_FORMAT_ARB                              0x8876\r
+#define GL_PROGRAM_INSTRUCTIONS_ARB                        0x88A0\r
+#define GL_MAX_PROGRAM_INSTRUCTIONS_ARB                    0x88A1\r
+#define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB                 0x88A2\r
+#define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB             0x88A3\r
+#define GL_PROGRAM_TEMPORARIES_ARB                         0x88A4\r
+#define GL_MAX_PROGRAM_TEMPORARIES_ARB                     0x88A5\r
+#define GL_PROGRAM_NATIVE_TEMPORARIES_ARB                  0x88A6\r
+#define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB              0x88A7\r
+#define GL_PROGRAM_PARAMETERS_ARB                          0x88A8\r
+#define GL_MAX_PROGRAM_PARAMETERS_ARB                      0x88A9\r
+#define GL_PROGRAM_NATIVE_PARAMETERS_ARB                   0x88AA\r
+#define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB               0x88AB\r
+#define GL_PROGRAM_ATTRIBS_ARB                             0x88AC\r
+#define GL_MAX_PROGRAM_ATTRIBS_ARB                         0x88AD\r
+#define GL_PROGRAM_NATIVE_ATTRIBS_ARB                      0x88AE\r
+#define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB                  0x88AF\r
+#define GL_PROGRAM_ADDRESS_REGISTERS_ARB                   0x88B0\r
+#define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB               0x88B1\r
+#define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB            0x88B2\r
+#define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB        0x88B3\r
+#define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB                0x88B4\r
+#define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB                  0x88B5\r
+#define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB                 0x88B6\r
+#define GL_TRANSPOSE_CURRENT_MATRIX_ARB                    0x88B7\r
+#define GL_MATRIX0_ARB                                     0x88C0\r
+#define GL_MATRIX1_ARB                                     0x88C1\r
+#define GL_MATRIX2_ARB                                     0x88C2\r
+#define GL_MATRIX3_ARB                                     0x88C3\r
+#define GL_MATRIX4_ARB                                     0x88C4\r
+#define GL_MATRIX5_ARB                                     0x88C5\r
+#define GL_MATRIX6_ARB                                     0x88C6\r
+#define GL_MATRIX7_ARB                                     0x88C7\r
+#define GL_MATRIX8_ARB                                     0x88C8\r
+#define GL_MATRIX9_ARB                                     0x88C9\r
+#define GL_MATRIX10_ARB                                    0x88CA\r
+#define GL_MATRIX11_ARB                                    0x88CB\r
+#define GL_MATRIX12_ARB                                    0x88CC\r
+#define GL_MATRIX13_ARB                                    0x88CD\r
+#define GL_MATRIX14_ARB                                    0x88CE\r
+#define GL_MATRIX15_ARB                                    0x88CF\r
+#define GL_MATRIX16_ARB                                    0x88D0\r
+#define GL_MATRIX17_ARB                                    0x88D1\r
+#define GL_MATRIX18_ARB                                    0x88D2\r
+#define GL_MATRIX19_ARB                                    0x88D3\r
+#define GL_MATRIX20_ARB                                    0x88D4\r
+#define GL_MATRIX21_ARB                                    0x88D5\r
+#define GL_MATRIX22_ARB                                    0x88D6\r
+#define GL_MATRIX23_ARB                                    0x88D7\r
+#define GL_MATRIX24_ARB                                    0x88D8\r
+#define GL_MATRIX25_ARB                                    0x88D9\r
+#define GL_MATRIX26_ARB                                    0x88DA\r
+#define GL_MATRIX27_ARB                                    0x88DB\r
+#define GL_MATRIX28_ARB                                    0x88DC\r
+#define GL_MATRIX29_ARB                                    0x88DD\r
+#define GL_MATRIX30_ARB                                    0x88DE\r
+#define GL_MATRIX31_ARB                                    0x88DF\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib1dARB\r
+#define GLEE_H_DEFINED_glVertexAttrib1dARB\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB1DARBPROC) (GLuint index, GLdouble x);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB1DARBPROC GLeeFuncPtr_glVertexAttrib1dARB;\r
+  #define glVertexAttrib1dARB GLeeFuncPtr_glVertexAttrib1dARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib1dvARB\r
+#define GLEE_H_DEFINED_glVertexAttrib1dvARB\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB1DVARBPROC) (GLuint index, const GLdouble * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB1DVARBPROC GLeeFuncPtr_glVertexAttrib1dvARB;\r
+  #define glVertexAttrib1dvARB GLeeFuncPtr_glVertexAttrib1dvARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib1fARB\r
+#define GLEE_H_DEFINED_glVertexAttrib1fARB\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB1FARBPROC) (GLuint index, GLfloat x);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB1FARBPROC GLeeFuncPtr_glVertexAttrib1fARB;\r
+  #define glVertexAttrib1fARB GLeeFuncPtr_glVertexAttrib1fARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib1fvARB\r
+#define GLEE_H_DEFINED_glVertexAttrib1fvARB\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB1FVARBPROC) (GLuint index, const GLfloat * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB1FVARBPROC GLeeFuncPtr_glVertexAttrib1fvARB;\r
+  #define glVertexAttrib1fvARB GLeeFuncPtr_glVertexAttrib1fvARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib1sARB\r
+#define GLEE_H_DEFINED_glVertexAttrib1sARB\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB1SARBPROC) (GLuint index, GLshort x);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB1SARBPROC GLeeFuncPtr_glVertexAttrib1sARB;\r
+  #define glVertexAttrib1sARB GLeeFuncPtr_glVertexAttrib1sARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib1svARB\r
+#define GLEE_H_DEFINED_glVertexAttrib1svARB\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB1SVARBPROC) (GLuint index, const GLshort * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB1SVARBPROC GLeeFuncPtr_glVertexAttrib1svARB;\r
+  #define glVertexAttrib1svARB GLeeFuncPtr_glVertexAttrib1svARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib2dARB\r
+#define GLEE_H_DEFINED_glVertexAttrib2dARB\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB2DARBPROC) (GLuint index, GLdouble x, GLdouble y);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB2DARBPROC GLeeFuncPtr_glVertexAttrib2dARB;\r
+  #define glVertexAttrib2dARB GLeeFuncPtr_glVertexAttrib2dARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib2dvARB\r
+#define GLEE_H_DEFINED_glVertexAttrib2dvARB\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB2DVARBPROC) (GLuint index, const GLdouble * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB2DVARBPROC GLeeFuncPtr_glVertexAttrib2dvARB;\r
+  #define glVertexAttrib2dvARB GLeeFuncPtr_glVertexAttrib2dvARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib2fARB\r
+#define GLEE_H_DEFINED_glVertexAttrib2fARB\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB2FARBPROC) (GLuint index, GLfloat x, GLfloat y);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB2FARBPROC GLeeFuncPtr_glVertexAttrib2fARB;\r
+  #define glVertexAttrib2fARB GLeeFuncPtr_glVertexAttrib2fARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib2fvARB\r
+#define GLEE_H_DEFINED_glVertexAttrib2fvARB\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB2FVARBPROC) (GLuint index, const GLfloat * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB2FVARBPROC GLeeFuncPtr_glVertexAttrib2fvARB;\r
+  #define glVertexAttrib2fvARB GLeeFuncPtr_glVertexAttrib2fvARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib2sARB\r
+#define GLEE_H_DEFINED_glVertexAttrib2sARB\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB2SARBPROC) (GLuint index, GLshort x, GLshort y);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB2SARBPROC GLeeFuncPtr_glVertexAttrib2sARB;\r
+  #define glVertexAttrib2sARB GLeeFuncPtr_glVertexAttrib2sARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib2svARB\r
+#define GLEE_H_DEFINED_glVertexAttrib2svARB\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB2SVARBPROC) (GLuint index, const GLshort * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB2SVARBPROC GLeeFuncPtr_glVertexAttrib2svARB;\r
+  #define glVertexAttrib2svARB GLeeFuncPtr_glVertexAttrib2svARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib3dARB\r
+#define GLEE_H_DEFINED_glVertexAttrib3dARB\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB3DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB3DARBPROC GLeeFuncPtr_glVertexAttrib3dARB;\r
+  #define glVertexAttrib3dARB GLeeFuncPtr_glVertexAttrib3dARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib3dvARB\r
+#define GLEE_H_DEFINED_glVertexAttrib3dvARB\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB3DVARBPROC) (GLuint index, const GLdouble * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB3DVARBPROC GLeeFuncPtr_glVertexAttrib3dvARB;\r
+  #define glVertexAttrib3dvARB GLeeFuncPtr_glVertexAttrib3dvARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib3fARB\r
+#define GLEE_H_DEFINED_glVertexAttrib3fARB\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB3FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB3FARBPROC GLeeFuncPtr_glVertexAttrib3fARB;\r
+  #define glVertexAttrib3fARB GLeeFuncPtr_glVertexAttrib3fARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib3fvARB\r
+#define GLEE_H_DEFINED_glVertexAttrib3fvARB\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB3FVARBPROC) (GLuint index, const GLfloat * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB3FVARBPROC GLeeFuncPtr_glVertexAttrib3fvARB;\r
+  #define glVertexAttrib3fvARB GLeeFuncPtr_glVertexAttrib3fvARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib3sARB\r
+#define GLEE_H_DEFINED_glVertexAttrib3sARB\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB3SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB3SARBPROC GLeeFuncPtr_glVertexAttrib3sARB;\r
+  #define glVertexAttrib3sARB GLeeFuncPtr_glVertexAttrib3sARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib3svARB\r
+#define GLEE_H_DEFINED_glVertexAttrib3svARB\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB3SVARBPROC) (GLuint index, const GLshort * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB3SVARBPROC GLeeFuncPtr_glVertexAttrib3svARB;\r
+  #define glVertexAttrib3svARB GLeeFuncPtr_glVertexAttrib3svARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib4NbvARB\r
+#define GLEE_H_DEFINED_glVertexAttrib4NbvARB\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4NBVARBPROC) (GLuint index, const GLbyte * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4NBVARBPROC GLeeFuncPtr_glVertexAttrib4NbvARB;\r
+  #define glVertexAttrib4NbvARB GLeeFuncPtr_glVertexAttrib4NbvARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib4NivARB\r
+#define GLEE_H_DEFINED_glVertexAttrib4NivARB\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4NIVARBPROC) (GLuint index, const GLint * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4NIVARBPROC GLeeFuncPtr_glVertexAttrib4NivARB;\r
+  #define glVertexAttrib4NivARB GLeeFuncPtr_glVertexAttrib4NivARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib4NsvARB\r
+#define GLEE_H_DEFINED_glVertexAttrib4NsvARB\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4NSVARBPROC) (GLuint index, const GLshort * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4NSVARBPROC GLeeFuncPtr_glVertexAttrib4NsvARB;\r
+  #define glVertexAttrib4NsvARB GLeeFuncPtr_glVertexAttrib4NsvARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib4NubARB\r
+#define GLEE_H_DEFINED_glVertexAttrib4NubARB\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4NUBARBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4NUBARBPROC GLeeFuncPtr_glVertexAttrib4NubARB;\r
+  #define glVertexAttrib4NubARB GLeeFuncPtr_glVertexAttrib4NubARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib4NubvARB\r
+#define GLEE_H_DEFINED_glVertexAttrib4NubvARB\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4NUBVARBPROC) (GLuint index, const GLubyte * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4NUBVARBPROC GLeeFuncPtr_glVertexAttrib4NubvARB;\r
+  #define glVertexAttrib4NubvARB GLeeFuncPtr_glVertexAttrib4NubvARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib4NuivARB\r
+#define GLEE_H_DEFINED_glVertexAttrib4NuivARB\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4NUIVARBPROC) (GLuint index, const GLuint * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4NUIVARBPROC GLeeFuncPtr_glVertexAttrib4NuivARB;\r
+  #define glVertexAttrib4NuivARB GLeeFuncPtr_glVertexAttrib4NuivARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib4NusvARB\r
+#define GLEE_H_DEFINED_glVertexAttrib4NusvARB\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4NUSVARBPROC) (GLuint index, const GLushort * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4NUSVARBPROC GLeeFuncPtr_glVertexAttrib4NusvARB;\r
+  #define glVertexAttrib4NusvARB GLeeFuncPtr_glVertexAttrib4NusvARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib4bvARB\r
+#define GLEE_H_DEFINED_glVertexAttrib4bvARB\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4BVARBPROC) (GLuint index, const GLbyte * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4BVARBPROC GLeeFuncPtr_glVertexAttrib4bvARB;\r
+  #define glVertexAttrib4bvARB GLeeFuncPtr_glVertexAttrib4bvARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib4dARB\r
+#define GLEE_H_DEFINED_glVertexAttrib4dARB\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4DARBPROC GLeeFuncPtr_glVertexAttrib4dARB;\r
+  #define glVertexAttrib4dARB GLeeFuncPtr_glVertexAttrib4dARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib4dvARB\r
+#define GLEE_H_DEFINED_glVertexAttrib4dvARB\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4DVARBPROC) (GLuint index, const GLdouble * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4DVARBPROC GLeeFuncPtr_glVertexAttrib4dvARB;\r
+  #define glVertexAttrib4dvARB GLeeFuncPtr_glVertexAttrib4dvARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib4fARB\r
+#define GLEE_H_DEFINED_glVertexAttrib4fARB\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4FARBPROC GLeeFuncPtr_glVertexAttrib4fARB;\r
+  #define glVertexAttrib4fARB GLeeFuncPtr_glVertexAttrib4fARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib4fvARB\r
+#define GLEE_H_DEFINED_glVertexAttrib4fvARB\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4FVARBPROC) (GLuint index, const GLfloat * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4FVARBPROC GLeeFuncPtr_glVertexAttrib4fvARB;\r
+  #define glVertexAttrib4fvARB GLeeFuncPtr_glVertexAttrib4fvARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib4ivARB\r
+#define GLEE_H_DEFINED_glVertexAttrib4ivARB\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4IVARBPROC) (GLuint index, const GLint * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4IVARBPROC GLeeFuncPtr_glVertexAttrib4ivARB;\r
+  #define glVertexAttrib4ivARB GLeeFuncPtr_glVertexAttrib4ivARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib4sARB\r
+#define GLEE_H_DEFINED_glVertexAttrib4sARB\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4SARBPROC GLeeFuncPtr_glVertexAttrib4sARB;\r
+  #define glVertexAttrib4sARB GLeeFuncPtr_glVertexAttrib4sARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib4svARB\r
+#define GLEE_H_DEFINED_glVertexAttrib4svARB\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4SVARBPROC) (GLuint index, const GLshort * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4SVARBPROC GLeeFuncPtr_glVertexAttrib4svARB;\r
+  #define glVertexAttrib4svARB GLeeFuncPtr_glVertexAttrib4svARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib4ubvARB\r
+#define GLEE_H_DEFINED_glVertexAttrib4ubvARB\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4UBVARBPROC) (GLuint index, const GLubyte * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4UBVARBPROC GLeeFuncPtr_glVertexAttrib4ubvARB;\r
+  #define glVertexAttrib4ubvARB GLeeFuncPtr_glVertexAttrib4ubvARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib4uivARB\r
+#define GLEE_H_DEFINED_glVertexAttrib4uivARB\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4UIVARBPROC) (GLuint index, const GLuint * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4UIVARBPROC GLeeFuncPtr_glVertexAttrib4uivARB;\r
+  #define glVertexAttrib4uivARB GLeeFuncPtr_glVertexAttrib4uivARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib4usvARB\r
+#define GLEE_H_DEFINED_glVertexAttrib4usvARB\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4USVARBPROC) (GLuint index, const GLushort * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4USVARBPROC GLeeFuncPtr_glVertexAttrib4usvARB;\r
+  #define glVertexAttrib4usvARB GLeeFuncPtr_glVertexAttrib4usvARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttribPointerARB\r
+#define GLEE_H_DEFINED_glVertexAttribPointerARB\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBPOINTERARBPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid * pointer);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIBPOINTERARBPROC GLeeFuncPtr_glVertexAttribPointerARB;\r
+  #define glVertexAttribPointerARB GLeeFuncPtr_glVertexAttribPointerARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glEnableVertexAttribArrayARB\r
+#define GLEE_H_DEFINED_glEnableVertexAttribArrayARB\r
+  typedef void (APIENTRYP GLEEPFNGLENABLEVERTEXATTRIBARRAYARBPROC) (GLuint index);\r
+  GLEE_EXTERN GLEEPFNGLENABLEVERTEXATTRIBARRAYARBPROC GLeeFuncPtr_glEnableVertexAttribArrayARB;\r
+  #define glEnableVertexAttribArrayARB GLeeFuncPtr_glEnableVertexAttribArrayARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glDisableVertexAttribArrayARB\r
+#define GLEE_H_DEFINED_glDisableVertexAttribArrayARB\r
+  typedef void (APIENTRYP GLEEPFNGLDISABLEVERTEXATTRIBARRAYARBPROC) (GLuint index);\r
+  GLEE_EXTERN GLEEPFNGLDISABLEVERTEXATTRIBARRAYARBPROC GLeeFuncPtr_glDisableVertexAttribArrayARB;\r
+  #define glDisableVertexAttribArrayARB GLeeFuncPtr_glDisableVertexAttribArrayARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramStringARB\r
+#define GLEE_H_DEFINED_glProgramStringARB\r
+  typedef void (APIENTRYP GLEEPFNGLPROGRAMSTRINGARBPROC) (GLenum target, GLenum format, GLsizei len, const GLvoid * string);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMSTRINGARBPROC GLeeFuncPtr_glProgramStringARB;\r
+  #define glProgramStringARB GLeeFuncPtr_glProgramStringARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glBindProgramARB\r
+#define GLEE_H_DEFINED_glBindProgramARB\r
+  typedef void (APIENTRYP GLEEPFNGLBINDPROGRAMARBPROC) (GLenum target, GLuint program);\r
+  GLEE_EXTERN GLEEPFNGLBINDPROGRAMARBPROC GLeeFuncPtr_glBindProgramARB;\r
+  #define glBindProgramARB GLeeFuncPtr_glBindProgramARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glDeleteProgramsARB\r
+#define GLEE_H_DEFINED_glDeleteProgramsARB\r
+  typedef void (APIENTRYP GLEEPFNGLDELETEPROGRAMSARBPROC) (GLsizei n, const GLuint * programs);\r
+  GLEE_EXTERN GLEEPFNGLDELETEPROGRAMSARBPROC GLeeFuncPtr_glDeleteProgramsARB;\r
+  #define glDeleteProgramsARB GLeeFuncPtr_glDeleteProgramsARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGenProgramsARB\r
+#define GLEE_H_DEFINED_glGenProgramsARB\r
+  typedef void (APIENTRYP GLEEPFNGLGENPROGRAMSARBPROC) (GLsizei n, GLuint * programs);\r
+  GLEE_EXTERN GLEEPFNGLGENPROGRAMSARBPROC GLeeFuncPtr_glGenProgramsARB;\r
+  #define glGenProgramsARB GLeeFuncPtr_glGenProgramsARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramEnvParameter4dARB\r
+#define GLEE_H_DEFINED_glProgramEnvParameter4dARB\r
+  typedef void (APIENTRYP GLEEPFNGLPROGRAMENVPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMENVPARAMETER4DARBPROC GLeeFuncPtr_glProgramEnvParameter4dARB;\r
+  #define glProgramEnvParameter4dARB GLeeFuncPtr_glProgramEnvParameter4dARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramEnvParameter4dvARB\r
+#define GLEE_H_DEFINED_glProgramEnvParameter4dvARB\r
+  typedef void (APIENTRYP GLEEPFNGLPROGRAMENVPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble * params);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMENVPARAMETER4DVARBPROC GLeeFuncPtr_glProgramEnvParameter4dvARB;\r
+  #define glProgramEnvParameter4dvARB GLeeFuncPtr_glProgramEnvParameter4dvARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramEnvParameter4fARB\r
+#define GLEE_H_DEFINED_glProgramEnvParameter4fARB\r
+  typedef void (APIENTRYP GLEEPFNGLPROGRAMENVPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMENVPARAMETER4FARBPROC GLeeFuncPtr_glProgramEnvParameter4fARB;\r
+  #define glProgramEnvParameter4fARB GLeeFuncPtr_glProgramEnvParameter4fARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramEnvParameter4fvARB\r
+#define GLEE_H_DEFINED_glProgramEnvParameter4fvARB\r
+  typedef void (APIENTRYP GLEEPFNGLPROGRAMENVPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMENVPARAMETER4FVARBPROC GLeeFuncPtr_glProgramEnvParameter4fvARB;\r
+  #define glProgramEnvParameter4fvARB GLeeFuncPtr_glProgramEnvParameter4fvARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramLocalParameter4dARB\r
+#define GLEE_H_DEFINED_glProgramLocalParameter4dARB\r
+  typedef void (APIENTRYP GLEEPFNGLPROGRAMLOCALPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMLOCALPARAMETER4DARBPROC GLeeFuncPtr_glProgramLocalParameter4dARB;\r
+  #define glProgramLocalParameter4dARB GLeeFuncPtr_glProgramLocalParameter4dARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramLocalParameter4dvARB\r
+#define GLEE_H_DEFINED_glProgramLocalParameter4dvARB\r
+  typedef void (APIENTRYP GLEEPFNGLPROGRAMLOCALPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble * params);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMLOCALPARAMETER4DVARBPROC GLeeFuncPtr_glProgramLocalParameter4dvARB;\r
+  #define glProgramLocalParameter4dvARB GLeeFuncPtr_glProgramLocalParameter4dvARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramLocalParameter4fARB\r
+#define GLEE_H_DEFINED_glProgramLocalParameter4fARB\r
+  typedef void (APIENTRYP GLEEPFNGLPROGRAMLOCALPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMLOCALPARAMETER4FARBPROC GLeeFuncPtr_glProgramLocalParameter4fARB;\r
+  #define glProgramLocalParameter4fARB GLeeFuncPtr_glProgramLocalParameter4fARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramLocalParameter4fvARB\r
+#define GLEE_H_DEFINED_glProgramLocalParameter4fvARB\r
+  typedef void (APIENTRYP GLEEPFNGLPROGRAMLOCALPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMLOCALPARAMETER4FVARBPROC GLeeFuncPtr_glProgramLocalParameter4fvARB;\r
+  #define glProgramLocalParameter4fvARB GLeeFuncPtr_glProgramLocalParameter4fvARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetProgramEnvParameterdvARB\r
+#define GLEE_H_DEFINED_glGetProgramEnvParameterdvARB\r
+  typedef void (APIENTRYP GLEEPFNGLGETPROGRAMENVPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble * params);\r
+  GLEE_EXTERN GLEEPFNGLGETPROGRAMENVPARAMETERDVARBPROC GLeeFuncPtr_glGetProgramEnvParameterdvARB;\r
+  #define glGetProgramEnvParameterdvARB GLeeFuncPtr_glGetProgramEnvParameterdvARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetProgramEnvParameterfvARB\r
+#define GLEE_H_DEFINED_glGetProgramEnvParameterfvARB\r
+  typedef void (APIENTRYP GLEEPFNGLGETPROGRAMENVPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLGETPROGRAMENVPARAMETERFVARBPROC GLeeFuncPtr_glGetProgramEnvParameterfvARB;\r
+  #define glGetProgramEnvParameterfvARB GLeeFuncPtr_glGetProgramEnvParameterfvARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetProgramLocalParameterdvARB\r
+#define GLEE_H_DEFINED_glGetProgramLocalParameterdvARB\r
+  typedef void (APIENTRYP GLEEPFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble * params);\r
+  GLEE_EXTERN GLEEPFNGLGETPROGRAMLOCALPARAMETERDVARBPROC GLeeFuncPtr_glGetProgramLocalParameterdvARB;\r
+  #define glGetProgramLocalParameterdvARB GLeeFuncPtr_glGetProgramLocalParameterdvARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetProgramLocalParameterfvARB\r
+#define GLEE_H_DEFINED_glGetProgramLocalParameterfvARB\r
+  typedef void (APIENTRYP GLEEPFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLGETPROGRAMLOCALPARAMETERFVARBPROC GLeeFuncPtr_glGetProgramLocalParameterfvARB;\r
+  #define glGetProgramLocalParameterfvARB GLeeFuncPtr_glGetProgramLocalParameterfvARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetProgramivARB\r
+#define GLEE_H_DEFINED_glGetProgramivARB\r
+  typedef void (APIENTRYP GLEEPFNGLGETPROGRAMIVARBPROC) (GLenum target, GLenum pname, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETPROGRAMIVARBPROC GLeeFuncPtr_glGetProgramivARB;\r
+  #define glGetProgramivARB GLeeFuncPtr_glGetProgramivARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetProgramStringARB\r
+#define GLEE_H_DEFINED_glGetProgramStringARB\r
+  typedef void (APIENTRYP GLEEPFNGLGETPROGRAMSTRINGARBPROC) (GLenum target, GLenum pname, GLvoid * string);\r
+  GLEE_EXTERN GLEEPFNGLGETPROGRAMSTRINGARBPROC GLeeFuncPtr_glGetProgramStringARB;\r
+  #define glGetProgramStringARB GLeeFuncPtr_glGetProgramStringARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetVertexAttribdvARB\r
+#define GLEE_H_DEFINED_glGetVertexAttribdvARB\r
+  typedef void (APIENTRYP GLEEPFNGLGETVERTEXATTRIBDVARBPROC) (GLuint index, GLenum pname, GLdouble * params);\r
+  GLEE_EXTERN GLEEPFNGLGETVERTEXATTRIBDVARBPROC GLeeFuncPtr_glGetVertexAttribdvARB;\r
+  #define glGetVertexAttribdvARB GLeeFuncPtr_glGetVertexAttribdvARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetVertexAttribfvARB\r
+#define GLEE_H_DEFINED_glGetVertexAttribfvARB\r
+  typedef void (APIENTRYP GLEEPFNGLGETVERTEXATTRIBFVARBPROC) (GLuint index, GLenum pname, GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLGETVERTEXATTRIBFVARBPROC GLeeFuncPtr_glGetVertexAttribfvARB;\r
+  #define glGetVertexAttribfvARB GLeeFuncPtr_glGetVertexAttribfvARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetVertexAttribivARB\r
+#define GLEE_H_DEFINED_glGetVertexAttribivARB\r
+  typedef void (APIENTRYP GLEEPFNGLGETVERTEXATTRIBIVARBPROC) (GLuint index, GLenum pname, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETVERTEXATTRIBIVARBPROC GLeeFuncPtr_glGetVertexAttribivARB;\r
+  #define glGetVertexAttribivARB GLeeFuncPtr_glGetVertexAttribivARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetVertexAttribPointervARB\r
+#define GLEE_H_DEFINED_glGetVertexAttribPointervARB\r
+  typedef void (APIENTRYP GLEEPFNGLGETVERTEXATTRIBPOINTERVARBPROC) (GLuint index, GLenum pname, GLvoid* * pointer);\r
+  GLEE_EXTERN GLEEPFNGLGETVERTEXATTRIBPOINTERVARBPROC GLeeFuncPtr_glGetVertexAttribPointervARB;\r
+  #define glGetVertexAttribPointervARB GLeeFuncPtr_glGetVertexAttribPointervARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glIsProgramARB\r
+#define GLEE_H_DEFINED_glIsProgramARB\r
+  typedef GLboolean (APIENTRYP GLEEPFNGLISPROGRAMARBPROC) (GLuint program);\r
+  GLEE_EXTERN GLEEPFNGLISPROGRAMARBPROC GLeeFuncPtr_glIsProgramARB;\r
+  #define glIsProgramARB GLeeFuncPtr_glIsProgramARB\r
+#endif\r
+#endif \r
+\r
+/* GL_ARB_fragment_program */\r
+\r
+#ifndef GL_ARB_fragment_program\r
+#define GL_ARB_fragment_program 1\r
+#define __GLEE_GL_ARB_fragment_program 1\r
+/* Constants */\r
+#define GL_FRAGMENT_PROGRAM_ARB                            0x8804\r
+#define GL_PROGRAM_ALU_INSTRUCTIONS_ARB                    0x8805\r
+#define GL_PROGRAM_TEX_INSTRUCTIONS_ARB                    0x8806\r
+#define GL_PROGRAM_TEX_INDIRECTIONS_ARB                    0x8807\r
+#define GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB             0x8808\r
+#define GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB             0x8809\r
+#define GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB             0x880A\r
+#define GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB                0x880B\r
+#define GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB                0x880C\r
+#define GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB                0x880D\r
+#define GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB         0x880E\r
+#define GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB         0x880F\r
+#define GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB         0x8810\r
+#define GL_MAX_TEXTURE_COORDS_ARB                          0x8871\r
+#define GL_MAX_TEXTURE_IMAGE_UNITS_ARB                     0x8872\r
+#endif \r
+\r
+/* GL_ARB_vertex_buffer_object */\r
+\r
+#ifndef GL_ARB_vertex_buffer_object\r
+#define GL_ARB_vertex_buffer_object 1\r
+#define __GLEE_GL_ARB_vertex_buffer_object 1\r
+/* Constants */\r
+#define GL_BUFFER_SIZE_ARB                                 0x8764\r
+#define GL_BUFFER_USAGE_ARB                                0x8765\r
+#define GL_ARRAY_BUFFER_ARB                                0x8892\r
+#define GL_ELEMENT_ARRAY_BUFFER_ARB                        0x8893\r
+#define GL_ARRAY_BUFFER_BINDING_ARB                        0x8894\r
+#define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB                0x8895\r
+#define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB                 0x8896\r
+#define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB                 0x8897\r
+#define GL_COLOR_ARRAY_BUFFER_BINDING_ARB                  0x8898\r
+#define GL_INDEX_ARRAY_BUFFER_BINDING_ARB                  0x8899\r
+#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB          0x889A\r
+#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB              0x889B\r
+#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB        0x889C\r
+#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB         0x889D\r
+#define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB                 0x889E\r
+#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB          0x889F\r
+#define GL_READ_ONLY_ARB                                   0x88B8\r
+#define GL_WRITE_ONLY_ARB                                  0x88B9\r
+#define GL_READ_WRITE_ARB                                  0x88BA\r
+#define GL_BUFFER_ACCESS_ARB                               0x88BB\r
+#define GL_BUFFER_MAPPED_ARB                               0x88BC\r
+#define GL_BUFFER_MAP_POINTER_ARB                          0x88BD\r
+#define GL_STREAM_DRAW_ARB                                 0x88E0\r
+#define GL_STREAM_READ_ARB                                 0x88E1\r
+#define GL_STREAM_COPY_ARB                                 0x88E2\r
+#define GL_STATIC_DRAW_ARB                                 0x88E4\r
+#define GL_STATIC_READ_ARB                                 0x88E5\r
+#define GL_STATIC_COPY_ARB                                 0x88E6\r
+#define GL_DYNAMIC_DRAW_ARB                                0x88E8\r
+#define GL_DYNAMIC_READ_ARB                                0x88E9\r
+#define GL_DYNAMIC_COPY_ARB                                0x88EA\r
+#ifndef GLEE_H_DEFINED_glBindBufferARB\r
+#define GLEE_H_DEFINED_glBindBufferARB\r
+  typedef void (APIENTRYP GLEEPFNGLBINDBUFFERARBPROC) (GLenum target, GLuint buffer);\r
+  GLEE_EXTERN GLEEPFNGLBINDBUFFERARBPROC GLeeFuncPtr_glBindBufferARB;\r
+  #define glBindBufferARB GLeeFuncPtr_glBindBufferARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glDeleteBuffersARB\r
+#define GLEE_H_DEFINED_glDeleteBuffersARB\r
+  typedef void (APIENTRYP GLEEPFNGLDELETEBUFFERSARBPROC) (GLsizei n, const GLuint * buffers);\r
+  GLEE_EXTERN GLEEPFNGLDELETEBUFFERSARBPROC GLeeFuncPtr_glDeleteBuffersARB;\r
+  #define glDeleteBuffersARB GLeeFuncPtr_glDeleteBuffersARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGenBuffersARB\r
+#define GLEE_H_DEFINED_glGenBuffersARB\r
+  typedef void (APIENTRYP GLEEPFNGLGENBUFFERSARBPROC) (GLsizei n, GLuint * buffers);\r
+  GLEE_EXTERN GLEEPFNGLGENBUFFERSARBPROC GLeeFuncPtr_glGenBuffersARB;\r
+  #define glGenBuffersARB GLeeFuncPtr_glGenBuffersARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glIsBufferARB\r
+#define GLEE_H_DEFINED_glIsBufferARB\r
+  typedef GLboolean (APIENTRYP GLEEPFNGLISBUFFERARBPROC) (GLuint buffer);\r
+  GLEE_EXTERN GLEEPFNGLISBUFFERARBPROC GLeeFuncPtr_glIsBufferARB;\r
+  #define glIsBufferARB GLeeFuncPtr_glIsBufferARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glBufferDataARB\r
+#define GLEE_H_DEFINED_glBufferDataARB\r
+  typedef void (APIENTRYP GLEEPFNGLBUFFERDATAARBPROC) (GLenum target, GLsizeiptrARB size, const GLvoid * data, GLenum usage);\r
+  GLEE_EXTERN GLEEPFNGLBUFFERDATAARBPROC GLeeFuncPtr_glBufferDataARB;\r
+  #define glBufferDataARB GLeeFuncPtr_glBufferDataARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glBufferSubDataARB\r
+#define GLEE_H_DEFINED_glBufferSubDataARB\r
+  typedef void (APIENTRYP GLEEPFNGLBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid * data);\r
+  GLEE_EXTERN GLEEPFNGLBUFFERSUBDATAARBPROC GLeeFuncPtr_glBufferSubDataARB;\r
+  #define glBufferSubDataARB GLeeFuncPtr_glBufferSubDataARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetBufferSubDataARB\r
+#define GLEE_H_DEFINED_glGetBufferSubDataARB\r
+  typedef void (APIENTRYP GLEEPFNGLGETBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, GLvoid * data);\r
+  GLEE_EXTERN GLEEPFNGLGETBUFFERSUBDATAARBPROC GLeeFuncPtr_glGetBufferSubDataARB;\r
+  #define glGetBufferSubDataARB GLeeFuncPtr_glGetBufferSubDataARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMapBufferARB\r
+#define GLEE_H_DEFINED_glMapBufferARB\r
+  typedef GLvoid* (APIENTRYP GLEEPFNGLMAPBUFFERARBPROC) (GLenum target, GLenum access);\r
+  GLEE_EXTERN GLEEPFNGLMAPBUFFERARBPROC GLeeFuncPtr_glMapBufferARB;\r
+  #define glMapBufferARB GLeeFuncPtr_glMapBufferARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUnmapBufferARB\r
+#define GLEE_H_DEFINED_glUnmapBufferARB\r
+  typedef GLboolean (APIENTRYP GLEEPFNGLUNMAPBUFFERARBPROC) (GLenum target);\r
+  GLEE_EXTERN GLEEPFNGLUNMAPBUFFERARBPROC GLeeFuncPtr_glUnmapBufferARB;\r
+  #define glUnmapBufferARB GLeeFuncPtr_glUnmapBufferARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetBufferParameterivARB\r
+#define GLEE_H_DEFINED_glGetBufferParameterivARB\r
+  typedef void (APIENTRYP GLEEPFNGLGETBUFFERPARAMETERIVARBPROC) (GLenum target, GLenum pname, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETBUFFERPARAMETERIVARBPROC GLeeFuncPtr_glGetBufferParameterivARB;\r
+  #define glGetBufferParameterivARB GLeeFuncPtr_glGetBufferParameterivARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetBufferPointervARB\r
+#define GLEE_H_DEFINED_glGetBufferPointervARB\r
+  typedef void (APIENTRYP GLEEPFNGLGETBUFFERPOINTERVARBPROC) (GLenum target, GLenum pname, GLvoid* * params);\r
+  GLEE_EXTERN GLEEPFNGLGETBUFFERPOINTERVARBPROC GLeeFuncPtr_glGetBufferPointervARB;\r
+  #define glGetBufferPointervARB GLeeFuncPtr_glGetBufferPointervARB\r
+#endif\r
+#endif \r
+\r
+/* GL_ARB_occlusion_query */\r
+\r
+#ifndef GL_ARB_occlusion_query\r
+#define GL_ARB_occlusion_query 1\r
+#define __GLEE_GL_ARB_occlusion_query 1\r
+/* Constants */\r
+#define GL_QUERY_COUNTER_BITS_ARB                          0x8864\r
+#define GL_CURRENT_QUERY_ARB                               0x8865\r
+#define GL_QUERY_RESULT_ARB                                0x8866\r
+#define GL_QUERY_RESULT_AVAILABLE_ARB                      0x8867\r
+#define GL_SAMPLES_PASSED_ARB                              0x8914\r
+#ifndef GLEE_H_DEFINED_glGenQueriesARB\r
+#define GLEE_H_DEFINED_glGenQueriesARB\r
+  typedef void (APIENTRYP GLEEPFNGLGENQUERIESARBPROC) (GLsizei n, GLuint * ids);\r
+  GLEE_EXTERN GLEEPFNGLGENQUERIESARBPROC GLeeFuncPtr_glGenQueriesARB;\r
+  #define glGenQueriesARB GLeeFuncPtr_glGenQueriesARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glDeleteQueriesARB\r
+#define GLEE_H_DEFINED_glDeleteQueriesARB\r
+  typedef void (APIENTRYP GLEEPFNGLDELETEQUERIESARBPROC) (GLsizei n, const GLuint * ids);\r
+  GLEE_EXTERN GLEEPFNGLDELETEQUERIESARBPROC GLeeFuncPtr_glDeleteQueriesARB;\r
+  #define glDeleteQueriesARB GLeeFuncPtr_glDeleteQueriesARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glIsQueryARB\r
+#define GLEE_H_DEFINED_glIsQueryARB\r
+  typedef GLboolean (APIENTRYP GLEEPFNGLISQUERYARBPROC) (GLuint id);\r
+  GLEE_EXTERN GLEEPFNGLISQUERYARBPROC GLeeFuncPtr_glIsQueryARB;\r
+  #define glIsQueryARB GLeeFuncPtr_glIsQueryARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glBeginQueryARB\r
+#define GLEE_H_DEFINED_glBeginQueryARB\r
+  typedef void (APIENTRYP GLEEPFNGLBEGINQUERYARBPROC) (GLenum target, GLuint id);\r
+  GLEE_EXTERN GLEEPFNGLBEGINQUERYARBPROC GLeeFuncPtr_glBeginQueryARB;\r
+  #define glBeginQueryARB GLeeFuncPtr_glBeginQueryARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glEndQueryARB\r
+#define GLEE_H_DEFINED_glEndQueryARB\r
+  typedef void (APIENTRYP GLEEPFNGLENDQUERYARBPROC) (GLenum target);\r
+  GLEE_EXTERN GLEEPFNGLENDQUERYARBPROC GLeeFuncPtr_glEndQueryARB;\r
+  #define glEndQueryARB GLeeFuncPtr_glEndQueryARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetQueryivARB\r
+#define GLEE_H_DEFINED_glGetQueryivARB\r
+  typedef void (APIENTRYP GLEEPFNGLGETQUERYIVARBPROC) (GLenum target, GLenum pname, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETQUERYIVARBPROC GLeeFuncPtr_glGetQueryivARB;\r
+  #define glGetQueryivARB GLeeFuncPtr_glGetQueryivARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetQueryObjectivARB\r
+#define GLEE_H_DEFINED_glGetQueryObjectivARB\r
+  typedef void (APIENTRYP GLEEPFNGLGETQUERYOBJECTIVARBPROC) (GLuint id, GLenum pname, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETQUERYOBJECTIVARBPROC GLeeFuncPtr_glGetQueryObjectivARB;\r
+  #define glGetQueryObjectivARB GLeeFuncPtr_glGetQueryObjectivARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetQueryObjectuivARB\r
+#define GLEE_H_DEFINED_glGetQueryObjectuivARB\r
+  typedef void (APIENTRYP GLEEPFNGLGETQUERYOBJECTUIVARBPROC) (GLuint id, GLenum pname, GLuint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETQUERYOBJECTUIVARBPROC GLeeFuncPtr_glGetQueryObjectuivARB;\r
+  #define glGetQueryObjectuivARB GLeeFuncPtr_glGetQueryObjectuivARB\r
+#endif\r
+#endif \r
+\r
+/* GL_ARB_shader_objects */\r
+\r
+#ifndef GL_ARB_shader_objects\r
+#define GL_ARB_shader_objects 1\r
+#define __GLEE_GL_ARB_shader_objects 1\r
+/* Constants */\r
+#define GL_PROGRAM_OBJECT_ARB                              0x8B40\r
+#define GL_SHADER_OBJECT_ARB                               0x8B48\r
+#define GL_OBJECT_TYPE_ARB                                 0x8B4E\r
+#define GL_OBJECT_SUBTYPE_ARB                              0x8B4F\r
+#define GL_FLOAT_VEC2_ARB                                  0x8B50\r
+#define GL_FLOAT_VEC3_ARB                                  0x8B51\r
+#define GL_FLOAT_VEC4_ARB                                  0x8B52\r
+#define GL_INT_VEC2_ARB                                    0x8B53\r
+#define GL_INT_VEC3_ARB                                    0x8B54\r
+#define GL_INT_VEC4_ARB                                    0x8B55\r
+#define GL_BOOL_ARB                                        0x8B56\r
+#define GL_BOOL_VEC2_ARB                                   0x8B57\r
+#define GL_BOOL_VEC3_ARB                                   0x8B58\r
+#define GL_BOOL_VEC4_ARB                                   0x8B59\r
+#define GL_FLOAT_MAT2_ARB                                  0x8B5A\r
+#define GL_FLOAT_MAT3_ARB                                  0x8B5B\r
+#define GL_FLOAT_MAT4_ARB                                  0x8B5C\r
+#define GL_SAMPLER_1D_ARB                                  0x8B5D\r
+#define GL_SAMPLER_2D_ARB                                  0x8B5E\r
+#define GL_SAMPLER_3D_ARB                                  0x8B5F\r
+#define GL_SAMPLER_CUBE_ARB                                0x8B60\r
+#define GL_SAMPLER_1D_SHADOW_ARB                           0x8B61\r
+#define GL_SAMPLER_2D_SHADOW_ARB                           0x8B62\r
+#define GL_SAMPLER_2D_RECT_ARB                             0x8B63\r
+#define GL_SAMPLER_2D_RECT_SHADOW_ARB                      0x8B64\r
+#define GL_OBJECT_DELETE_STATUS_ARB                        0x8B80\r
+#define GL_OBJECT_COMPILE_STATUS_ARB                       0x8B81\r
+#define GL_OBJECT_LINK_STATUS_ARB                          0x8B82\r
+#define GL_OBJECT_VALIDATE_STATUS_ARB                      0x8B83\r
+#define GL_OBJECT_INFO_LOG_LENGTH_ARB                      0x8B84\r
+#define GL_OBJECT_ATTACHED_OBJECTS_ARB                     0x8B85\r
+#define GL_OBJECT_ACTIVE_UNIFORMS_ARB                      0x8B86\r
+#define GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB            0x8B87\r
+#define GL_OBJECT_SHADER_SOURCE_LENGTH_ARB                 0x8B88\r
+#ifndef GLEE_H_DEFINED_glDeleteObjectARB\r
+#define GLEE_H_DEFINED_glDeleteObjectARB\r
+  typedef void (APIENTRYP GLEEPFNGLDELETEOBJECTARBPROC) (GLhandleARB obj);\r
+  GLEE_EXTERN GLEEPFNGLDELETEOBJECTARBPROC GLeeFuncPtr_glDeleteObjectARB;\r
+  #define glDeleteObjectARB GLeeFuncPtr_glDeleteObjectARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetHandleARB\r
+#define GLEE_H_DEFINED_glGetHandleARB\r
+  typedef GLhandleARB (APIENTRYP GLEEPFNGLGETHANDLEARBPROC) (GLenum pname);\r
+  GLEE_EXTERN GLEEPFNGLGETHANDLEARBPROC GLeeFuncPtr_glGetHandleARB;\r
+  #define glGetHandleARB GLeeFuncPtr_glGetHandleARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glDetachObjectARB\r
+#define GLEE_H_DEFINED_glDetachObjectARB\r
+  typedef void (APIENTRYP GLEEPFNGLDETACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB attachedObj);\r
+  GLEE_EXTERN GLEEPFNGLDETACHOBJECTARBPROC GLeeFuncPtr_glDetachObjectARB;\r
+  #define glDetachObjectARB GLeeFuncPtr_glDetachObjectARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glCreateShaderObjectARB\r
+#define GLEE_H_DEFINED_glCreateShaderObjectARB\r
+  typedef GLhandleARB (APIENTRYP GLEEPFNGLCREATESHADEROBJECTARBPROC) (GLenum shaderType);\r
+  GLEE_EXTERN GLEEPFNGLCREATESHADEROBJECTARBPROC GLeeFuncPtr_glCreateShaderObjectARB;\r
+  #define glCreateShaderObjectARB GLeeFuncPtr_glCreateShaderObjectARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glShaderSourceARB\r
+#define GLEE_H_DEFINED_glShaderSourceARB\r
+  typedef void (APIENTRYP GLEEPFNGLSHADERSOURCEARBPROC) (GLhandleARB shaderObj, GLsizei count, const GLcharARB* * string, const GLint * length);\r
+  GLEE_EXTERN GLEEPFNGLSHADERSOURCEARBPROC GLeeFuncPtr_glShaderSourceARB;\r
+  #define glShaderSourceARB GLeeFuncPtr_glShaderSourceARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glCompileShaderARB\r
+#define GLEE_H_DEFINED_glCompileShaderARB\r
+  typedef void (APIENTRYP GLEEPFNGLCOMPILESHADERARBPROC) (GLhandleARB shaderObj);\r
+  GLEE_EXTERN GLEEPFNGLCOMPILESHADERARBPROC GLeeFuncPtr_glCompileShaderARB;\r
+  #define glCompileShaderARB GLeeFuncPtr_glCompileShaderARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glCreateProgramObjectARB\r
+#define GLEE_H_DEFINED_glCreateProgramObjectARB\r
+  typedef GLhandleARB (APIENTRYP GLEEPFNGLCREATEPROGRAMOBJECTARBPROC) ();\r
+  GLEE_EXTERN GLEEPFNGLCREATEPROGRAMOBJECTARBPROC GLeeFuncPtr_glCreateProgramObjectARB;\r
+  #define glCreateProgramObjectARB GLeeFuncPtr_glCreateProgramObjectARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glAttachObjectARB\r
+#define GLEE_H_DEFINED_glAttachObjectARB\r
+  typedef void (APIENTRYP GLEEPFNGLATTACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB obj);\r
+  GLEE_EXTERN GLEEPFNGLATTACHOBJECTARBPROC GLeeFuncPtr_glAttachObjectARB;\r
+  #define glAttachObjectARB GLeeFuncPtr_glAttachObjectARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glLinkProgramARB\r
+#define GLEE_H_DEFINED_glLinkProgramARB\r
+  typedef void (APIENTRYP GLEEPFNGLLINKPROGRAMARBPROC) (GLhandleARB programObj);\r
+  GLEE_EXTERN GLEEPFNGLLINKPROGRAMARBPROC GLeeFuncPtr_glLinkProgramARB;\r
+  #define glLinkProgramARB GLeeFuncPtr_glLinkProgramARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUseProgramObjectARB\r
+#define GLEE_H_DEFINED_glUseProgramObjectARB\r
+  typedef void (APIENTRYP GLEEPFNGLUSEPROGRAMOBJECTARBPROC) (GLhandleARB programObj);\r
+  GLEE_EXTERN GLEEPFNGLUSEPROGRAMOBJECTARBPROC GLeeFuncPtr_glUseProgramObjectARB;\r
+  #define glUseProgramObjectARB GLeeFuncPtr_glUseProgramObjectARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glValidateProgramARB\r
+#define GLEE_H_DEFINED_glValidateProgramARB\r
+  typedef void (APIENTRYP GLEEPFNGLVALIDATEPROGRAMARBPROC) (GLhandleARB programObj);\r
+  GLEE_EXTERN GLEEPFNGLVALIDATEPROGRAMARBPROC GLeeFuncPtr_glValidateProgramARB;\r
+  #define glValidateProgramARB GLeeFuncPtr_glValidateProgramARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUniform1fARB\r
+#define GLEE_H_DEFINED_glUniform1fARB\r
+  typedef void (APIENTRYP GLEEPFNGLUNIFORM1FARBPROC) (GLint location, GLfloat v0);\r
+  GLEE_EXTERN GLEEPFNGLUNIFORM1FARBPROC GLeeFuncPtr_glUniform1fARB;\r
+  #define glUniform1fARB GLeeFuncPtr_glUniform1fARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUniform2fARB\r
+#define GLEE_H_DEFINED_glUniform2fARB\r
+  typedef void (APIENTRYP GLEEPFNGLUNIFORM2FARBPROC) (GLint location, GLfloat v0, GLfloat v1);\r
+  GLEE_EXTERN GLEEPFNGLUNIFORM2FARBPROC GLeeFuncPtr_glUniform2fARB;\r
+  #define glUniform2fARB GLeeFuncPtr_glUniform2fARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUniform3fARB\r
+#define GLEE_H_DEFINED_glUniform3fARB\r
+  typedef void (APIENTRYP GLEEPFNGLUNIFORM3FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2);\r
+  GLEE_EXTERN GLEEPFNGLUNIFORM3FARBPROC GLeeFuncPtr_glUniform3fARB;\r
+  #define glUniform3fARB GLeeFuncPtr_glUniform3fARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUniform4fARB\r
+#define GLEE_H_DEFINED_glUniform4fARB\r
+  typedef void (APIENTRYP GLEEPFNGLUNIFORM4FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);\r
+  GLEE_EXTERN GLEEPFNGLUNIFORM4FARBPROC GLeeFuncPtr_glUniform4fARB;\r
+  #define glUniform4fARB GLeeFuncPtr_glUniform4fARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUniform1iARB\r
+#define GLEE_H_DEFINED_glUniform1iARB\r
+  typedef void (APIENTRYP GLEEPFNGLUNIFORM1IARBPROC) (GLint location, GLint v0);\r
+  GLEE_EXTERN GLEEPFNGLUNIFORM1IARBPROC GLeeFuncPtr_glUniform1iARB;\r
+  #define glUniform1iARB GLeeFuncPtr_glUniform1iARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUniform2iARB\r
+#define GLEE_H_DEFINED_glUniform2iARB\r
+  typedef void (APIENTRYP GLEEPFNGLUNIFORM2IARBPROC) (GLint location, GLint v0, GLint v1);\r
+  GLEE_EXTERN GLEEPFNGLUNIFORM2IARBPROC GLeeFuncPtr_glUniform2iARB;\r
+  #define glUniform2iARB GLeeFuncPtr_glUniform2iARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUniform3iARB\r
+#define GLEE_H_DEFINED_glUniform3iARB\r
+  typedef void (APIENTRYP GLEEPFNGLUNIFORM3IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2);\r
+  GLEE_EXTERN GLEEPFNGLUNIFORM3IARBPROC GLeeFuncPtr_glUniform3iARB;\r
+  #define glUniform3iARB GLeeFuncPtr_glUniform3iARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUniform4iARB\r
+#define GLEE_H_DEFINED_glUniform4iARB\r
+  typedef void (APIENTRYP GLEEPFNGLUNIFORM4IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3);\r
+  GLEE_EXTERN GLEEPFNGLUNIFORM4IARBPROC GLeeFuncPtr_glUniform4iARB;\r
+  #define glUniform4iARB GLeeFuncPtr_glUniform4iARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUniform1fvARB\r
+#define GLEE_H_DEFINED_glUniform1fvARB\r
+  typedef void (APIENTRYP GLEEPFNGLUNIFORM1FVARBPROC) (GLint location, GLsizei count, const GLfloat * value);\r
+  GLEE_EXTERN GLEEPFNGLUNIFORM1FVARBPROC GLeeFuncPtr_glUniform1fvARB;\r
+  #define glUniform1fvARB GLeeFuncPtr_glUniform1fvARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUniform2fvARB\r
+#define GLEE_H_DEFINED_glUniform2fvARB\r
+  typedef void (APIENTRYP GLEEPFNGLUNIFORM2FVARBPROC) (GLint location, GLsizei count, const GLfloat * value);\r
+  GLEE_EXTERN GLEEPFNGLUNIFORM2FVARBPROC GLeeFuncPtr_glUniform2fvARB;\r
+  #define glUniform2fvARB GLeeFuncPtr_glUniform2fvARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUniform3fvARB\r
+#define GLEE_H_DEFINED_glUniform3fvARB\r
+  typedef void (APIENTRYP GLEEPFNGLUNIFORM3FVARBPROC) (GLint location, GLsizei count, const GLfloat * value);\r
+  GLEE_EXTERN GLEEPFNGLUNIFORM3FVARBPROC GLeeFuncPtr_glUniform3fvARB;\r
+  #define glUniform3fvARB GLeeFuncPtr_glUniform3fvARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUniform4fvARB\r
+#define GLEE_H_DEFINED_glUniform4fvARB\r
+  typedef void (APIENTRYP GLEEPFNGLUNIFORM4FVARBPROC) (GLint location, GLsizei count, const GLfloat * value);\r
+  GLEE_EXTERN GLEEPFNGLUNIFORM4FVARBPROC GLeeFuncPtr_glUniform4fvARB;\r
+  #define glUniform4fvARB GLeeFuncPtr_glUniform4fvARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUniform1ivARB\r
+#define GLEE_H_DEFINED_glUniform1ivARB\r
+  typedef void (APIENTRYP GLEEPFNGLUNIFORM1IVARBPROC) (GLint location, GLsizei count, const GLint * value);\r
+  GLEE_EXTERN GLEEPFNGLUNIFORM1IVARBPROC GLeeFuncPtr_glUniform1ivARB;\r
+  #define glUniform1ivARB GLeeFuncPtr_glUniform1ivARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUniform2ivARB\r
+#define GLEE_H_DEFINED_glUniform2ivARB\r
+  typedef void (APIENTRYP GLEEPFNGLUNIFORM2IVARBPROC) (GLint location, GLsizei count, const GLint * value);\r
+  GLEE_EXTERN GLEEPFNGLUNIFORM2IVARBPROC GLeeFuncPtr_glUniform2ivARB;\r
+  #define glUniform2ivARB GLeeFuncPtr_glUniform2ivARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUniform3ivARB\r
+#define GLEE_H_DEFINED_glUniform3ivARB\r
+  typedef void (APIENTRYP GLEEPFNGLUNIFORM3IVARBPROC) (GLint location, GLsizei count, const GLint * value);\r
+  GLEE_EXTERN GLEEPFNGLUNIFORM3IVARBPROC GLeeFuncPtr_glUniform3ivARB;\r
+  #define glUniform3ivARB GLeeFuncPtr_glUniform3ivARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUniform4ivARB\r
+#define GLEE_H_DEFINED_glUniform4ivARB\r
+  typedef void (APIENTRYP GLEEPFNGLUNIFORM4IVARBPROC) (GLint location, GLsizei count, const GLint * value);\r
+  GLEE_EXTERN GLEEPFNGLUNIFORM4IVARBPROC GLeeFuncPtr_glUniform4ivARB;\r
+  #define glUniform4ivARB GLeeFuncPtr_glUniform4ivARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUniformMatrix2fvARB\r
+#define GLEE_H_DEFINED_glUniformMatrix2fvARB\r
+  typedef void (APIENTRYP GLEEPFNGLUNIFORMMATRIX2FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);\r
+  GLEE_EXTERN GLEEPFNGLUNIFORMMATRIX2FVARBPROC GLeeFuncPtr_glUniformMatrix2fvARB;\r
+  #define glUniformMatrix2fvARB GLeeFuncPtr_glUniformMatrix2fvARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUniformMatrix3fvARB\r
+#define GLEE_H_DEFINED_glUniformMatrix3fvARB\r
+  typedef void (APIENTRYP GLEEPFNGLUNIFORMMATRIX3FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);\r
+  GLEE_EXTERN GLEEPFNGLUNIFORMMATRIX3FVARBPROC GLeeFuncPtr_glUniformMatrix3fvARB;\r
+  #define glUniformMatrix3fvARB GLeeFuncPtr_glUniformMatrix3fvARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUniformMatrix4fvARB\r
+#define GLEE_H_DEFINED_glUniformMatrix4fvARB\r
+  typedef void (APIENTRYP GLEEPFNGLUNIFORMMATRIX4FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);\r
+  GLEE_EXTERN GLEEPFNGLUNIFORMMATRIX4FVARBPROC GLeeFuncPtr_glUniformMatrix4fvARB;\r
+  #define glUniformMatrix4fvARB GLeeFuncPtr_glUniformMatrix4fvARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetObjectParameterfvARB\r
+#define GLEE_H_DEFINED_glGetObjectParameterfvARB\r
+  typedef void (APIENTRYP GLEEPFNGLGETOBJECTPARAMETERFVARBPROC) (GLhandleARB obj, GLenum pname, GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLGETOBJECTPARAMETERFVARBPROC GLeeFuncPtr_glGetObjectParameterfvARB;\r
+  #define glGetObjectParameterfvARB GLeeFuncPtr_glGetObjectParameterfvARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetObjectParameterivARB\r
+#define GLEE_H_DEFINED_glGetObjectParameterivARB\r
+  typedef void (APIENTRYP GLEEPFNGLGETOBJECTPARAMETERIVARBPROC) (GLhandleARB obj, GLenum pname, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETOBJECTPARAMETERIVARBPROC GLeeFuncPtr_glGetObjectParameterivARB;\r
+  #define glGetObjectParameterivARB GLeeFuncPtr_glGetObjectParameterivARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetInfoLogARB\r
+#define GLEE_H_DEFINED_glGetInfoLogARB\r
+  typedef void (APIENTRYP GLEEPFNGLGETINFOLOGARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei * length, GLcharARB * infoLog);\r
+  GLEE_EXTERN GLEEPFNGLGETINFOLOGARBPROC GLeeFuncPtr_glGetInfoLogARB;\r
+  #define glGetInfoLogARB GLeeFuncPtr_glGetInfoLogARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetAttachedObjectsARB\r
+#define GLEE_H_DEFINED_glGetAttachedObjectsARB\r
+  typedef void (APIENTRYP GLEEPFNGLGETATTACHEDOBJECTSARBPROC) (GLhandleARB containerObj, GLsizei maxCount, GLsizei * count, GLhandleARB * obj);\r
+  GLEE_EXTERN GLEEPFNGLGETATTACHEDOBJECTSARBPROC GLeeFuncPtr_glGetAttachedObjectsARB;\r
+  #define glGetAttachedObjectsARB GLeeFuncPtr_glGetAttachedObjectsARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetUniformLocationARB\r
+#define GLEE_H_DEFINED_glGetUniformLocationARB\r
+  typedef GLint (APIENTRYP GLEEPFNGLGETUNIFORMLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB * name);\r
+  GLEE_EXTERN GLEEPFNGLGETUNIFORMLOCATIONARBPROC GLeeFuncPtr_glGetUniformLocationARB;\r
+  #define glGetUniformLocationARB GLeeFuncPtr_glGetUniformLocationARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetActiveUniformARB\r
+#define GLEE_H_DEFINED_glGetActiveUniformARB\r
+  typedef void (APIENTRYP GLEEPFNGLGETACTIVEUNIFORMARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei * length, GLint * size, GLenum * type, GLcharARB * name);\r
+  GLEE_EXTERN GLEEPFNGLGETACTIVEUNIFORMARBPROC GLeeFuncPtr_glGetActiveUniformARB;\r
+  #define glGetActiveUniformARB GLeeFuncPtr_glGetActiveUniformARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetUniformfvARB\r
+#define GLEE_H_DEFINED_glGetUniformfvARB\r
+  typedef void (APIENTRYP GLEEPFNGLGETUNIFORMFVARBPROC) (GLhandleARB programObj, GLint location, GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLGETUNIFORMFVARBPROC GLeeFuncPtr_glGetUniformfvARB;\r
+  #define glGetUniformfvARB GLeeFuncPtr_glGetUniformfvARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetUniformivARB\r
+#define GLEE_H_DEFINED_glGetUniformivARB\r
+  typedef void (APIENTRYP GLEEPFNGLGETUNIFORMIVARBPROC) (GLhandleARB programObj, GLint location, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETUNIFORMIVARBPROC GLeeFuncPtr_glGetUniformivARB;\r
+  #define glGetUniformivARB GLeeFuncPtr_glGetUniformivARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetShaderSourceARB\r
+#define GLEE_H_DEFINED_glGetShaderSourceARB\r
+  typedef void (APIENTRYP GLEEPFNGLGETSHADERSOURCEARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei * length, GLcharARB * source);\r
+  GLEE_EXTERN GLEEPFNGLGETSHADERSOURCEARBPROC GLeeFuncPtr_glGetShaderSourceARB;\r
+  #define glGetShaderSourceARB GLeeFuncPtr_glGetShaderSourceARB\r
+#endif\r
+#endif \r
+\r
+/* GL_ARB_vertex_shader */\r
+\r
+#ifndef GL_ARB_vertex_shader\r
+#define GL_ARB_vertex_shader 1\r
+#define __GLEE_GL_ARB_vertex_shader 1\r
+/* Constants */\r
+#define GL_VERTEX_SHADER_ARB                               0x8B31\r
+#define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB               0x8B4A\r
+#define GL_MAX_VARYING_FLOATS_ARB                          0x8B4B\r
+#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB              0x8B4C\r
+#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB            0x8B4D\r
+#define GL_OBJECT_ACTIVE_ATTRIBUTES_ARB                    0x8B89\r
+#define GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB          0x8B8A\r
+#ifndef GLEE_H_DEFINED_glBindAttribLocationARB\r
+#define GLEE_H_DEFINED_glBindAttribLocationARB\r
+  typedef void (APIENTRYP GLEEPFNGLBINDATTRIBLOCATIONARBPROC) (GLhandleARB programObj, GLuint index, const GLcharARB * name);\r
+  GLEE_EXTERN GLEEPFNGLBINDATTRIBLOCATIONARBPROC GLeeFuncPtr_glBindAttribLocationARB;\r
+  #define glBindAttribLocationARB GLeeFuncPtr_glBindAttribLocationARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetActiveAttribARB\r
+#define GLEE_H_DEFINED_glGetActiveAttribARB\r
+  typedef void (APIENTRYP GLEEPFNGLGETACTIVEATTRIBARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei * length, GLint * size, GLenum * type, GLcharARB * name);\r
+  GLEE_EXTERN GLEEPFNGLGETACTIVEATTRIBARBPROC GLeeFuncPtr_glGetActiveAttribARB;\r
+  #define glGetActiveAttribARB GLeeFuncPtr_glGetActiveAttribARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetAttribLocationARB\r
+#define GLEE_H_DEFINED_glGetAttribLocationARB\r
+  typedef GLint (APIENTRYP GLEEPFNGLGETATTRIBLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB * name);\r
+  GLEE_EXTERN GLEEPFNGLGETATTRIBLOCATIONARBPROC GLeeFuncPtr_glGetAttribLocationARB;\r
+  #define glGetAttribLocationARB GLeeFuncPtr_glGetAttribLocationARB\r
+#endif\r
+#endif \r
+\r
+/* GL_ARB_fragment_shader */\r
+\r
+#ifndef GL_ARB_fragment_shader\r
+#define GL_ARB_fragment_shader 1\r
+#define __GLEE_GL_ARB_fragment_shader 1\r
+/* Constants */\r
+#define GL_FRAGMENT_SHADER_ARB                             0x8B30\r
+#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB             0x8B49\r
+#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB             0x8B8B\r
+#endif \r
+\r
+/* GL_ARB_shading_language_100 */\r
+\r
+#ifndef GL_ARB_shading_language_100\r
+#define GL_ARB_shading_language_100 1\r
+#define __GLEE_GL_ARB_shading_language_100 1\r
+/* Constants */\r
+#define GL_SHADING_LANGUAGE_VERSION_ARB                    0x8B8C\r
+#endif \r
+\r
+/* GL_ARB_texture_non_power_of_two */\r
+\r
+#ifndef GL_ARB_texture_non_power_of_two\r
+#define GL_ARB_texture_non_power_of_two 1\r
+#define __GLEE_GL_ARB_texture_non_power_of_two 1\r
+/* Constants */\r
+#endif \r
+\r
+/* GL_ARB_point_sprite */\r
+\r
+#ifndef GL_ARB_point_sprite\r
+#define GL_ARB_point_sprite 1\r
+#define __GLEE_GL_ARB_point_sprite 1\r
+/* Constants */\r
+#define GL_POINT_SPRITE_ARB                                0x8861\r
+#define GL_COORD_REPLACE_ARB                               0x8862\r
+#endif \r
+\r
+/* GL_ARB_fragment_program_shadow */\r
+\r
+#ifndef GL_ARB_fragment_program_shadow\r
+#define GL_ARB_fragment_program_shadow 1\r
+#define __GLEE_GL_ARB_fragment_program_shadow 1\r
+/* Constants */\r
+#endif \r
+\r
+/* GL_ARB_draw_buffers */\r
+\r
+#ifndef GL_ARB_draw_buffers\r
+#define GL_ARB_draw_buffers 1\r
+#define __GLEE_GL_ARB_draw_buffers 1\r
+/* Constants */\r
+#define GL_MAX_DRAW_BUFFERS_ARB                            0x8824\r
+#define GL_DRAW_BUFFER0_ARB                                0x8825\r
+#define GL_DRAW_BUFFER1_ARB                                0x8826\r
+#define GL_DRAW_BUFFER2_ARB                                0x8827\r
+#define GL_DRAW_BUFFER3_ARB                                0x8828\r
+#define GL_DRAW_BUFFER4_ARB                                0x8829\r
+#define GL_DRAW_BUFFER5_ARB                                0x882A\r
+#define GL_DRAW_BUFFER6_ARB                                0x882B\r
+#define GL_DRAW_BUFFER7_ARB                                0x882C\r
+#define GL_DRAW_BUFFER8_ARB                                0x882D\r
+#define GL_DRAW_BUFFER9_ARB                                0x882E\r
+#define GL_DRAW_BUFFER10_ARB                               0x882F\r
+#define GL_DRAW_BUFFER11_ARB                               0x8830\r
+#define GL_DRAW_BUFFER12_ARB                               0x8831\r
+#define GL_DRAW_BUFFER13_ARB                               0x8832\r
+#define GL_DRAW_BUFFER14_ARB                               0x8833\r
+#define GL_DRAW_BUFFER15_ARB                               0x8834\r
+#ifndef GLEE_H_DEFINED_glDrawBuffersARB\r
+#define GLEE_H_DEFINED_glDrawBuffersARB\r
+  typedef void (APIENTRYP GLEEPFNGLDRAWBUFFERSARBPROC) (GLsizei n, const GLenum * bufs);\r
+  GLEE_EXTERN GLEEPFNGLDRAWBUFFERSARBPROC GLeeFuncPtr_glDrawBuffersARB;\r
+  #define glDrawBuffersARB GLeeFuncPtr_glDrawBuffersARB\r
+#endif\r
+#endif \r
+\r
+/* GL_ARB_texture_rectangle */\r
+\r
+#ifndef GL_ARB_texture_rectangle\r
+#define GL_ARB_texture_rectangle 1\r
+#define __GLEE_GL_ARB_texture_rectangle 1\r
+/* Constants */\r
+#define GL_TEXTURE_RECTANGLE_ARB                           0x84F5\r
+#define GL_TEXTURE_BINDING_RECTANGLE_ARB                   0x84F6\r
+#define GL_PROXY_TEXTURE_RECTANGLE_ARB                     0x84F7\r
+#define GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB                  0x84F8\r
+#endif \r
+\r
+/* GL_ARB_color_buffer_float */\r
+\r
+#ifndef GL_ARB_color_buffer_float\r
+#define GL_ARB_color_buffer_float 1\r
+#define __GLEE_GL_ARB_color_buffer_float 1\r
+/* Constants */\r
+#define GL_RGBA_FLOAT_MODE_ARB                             0x8820\r
+#define GL_CLAMP_VERTEX_COLOR_ARB                          0x891A\r
+#define GL_CLAMP_FRAGMENT_COLOR_ARB                        0x891B\r
+#define GL_CLAMP_READ_COLOR_ARB                            0x891C\r
+#define GL_FIXED_ONLY_ARB                                  0x891D\r
+#ifndef GLEE_H_DEFINED_glClampColorARB\r
+#define GLEE_H_DEFINED_glClampColorARB\r
+  typedef void (APIENTRYP GLEEPFNGLCLAMPCOLORARBPROC) (GLenum target, GLenum clamp);\r
+  GLEE_EXTERN GLEEPFNGLCLAMPCOLORARBPROC GLeeFuncPtr_glClampColorARB;\r
+  #define glClampColorARB GLeeFuncPtr_glClampColorARB\r
+#endif\r
+#endif \r
+\r
+/* GL_ARB_half_float_pixel */\r
+\r
+#ifndef GL_ARB_half_float_pixel\r
+#define GL_ARB_half_float_pixel 1\r
+#define __GLEE_GL_ARB_half_float_pixel 1\r
+/* Constants */\r
+#define GL_HALF_FLOAT_ARB                                  0x140B\r
+#endif \r
+\r
+/* GL_ARB_texture_float */\r
+\r
+#ifndef GL_ARB_texture_float\r
+#define GL_ARB_texture_float 1\r
+#define __GLEE_GL_ARB_texture_float 1\r
+/* Constants */\r
+#define GL_TEXTURE_RED_TYPE_ARB                            0x8C10\r
+#define GL_TEXTURE_GREEN_TYPE_ARB                          0x8C11\r
+#define GL_TEXTURE_BLUE_TYPE_ARB                           0x8C12\r
+#define GL_TEXTURE_ALPHA_TYPE_ARB                          0x8C13\r
+#define GL_TEXTURE_LUMINANCE_TYPE_ARB                      0x8C14\r
+#define GL_TEXTURE_INTENSITY_TYPE_ARB                      0x8C15\r
+#define GL_TEXTURE_DEPTH_TYPE_ARB                          0x8C16\r
+#define GL_UNSIGNED_NORMALIZED_ARB                         0x8C17\r
+#define GL_RGBA32F_ARB                                     0x8814\r
+#define GL_RGB32F_ARB                                      0x8815\r
+#define GL_ALPHA32F_ARB                                    0x8816\r
+#define GL_INTENSITY32F_ARB                                0x8817\r
+#define GL_LUMINANCE32F_ARB                                0x8818\r
+#define GL_LUMINANCE_ALPHA32F_ARB                          0x8819\r
+#define GL_RGBA16F_ARB                                     0x881A\r
+#define GL_RGB16F_ARB                                      0x881B\r
+#define GL_ALPHA16F_ARB                                    0x881C\r
+#define GL_INTENSITY16F_ARB                                0x881D\r
+#define GL_LUMINANCE16F_ARB                                0x881E\r
+#define GL_LUMINANCE_ALPHA16F_ARB                          0x881F\r
+#endif \r
+\r
+/* GL_ARB_pixel_buffer_object */\r
+\r
+#ifndef GL_ARB_pixel_buffer_object\r
+#define GL_ARB_pixel_buffer_object 1\r
+#define __GLEE_GL_ARB_pixel_buffer_object 1\r
+/* Constants */\r
+#define GL_PIXEL_PACK_BUFFER_ARB                           0x88EB\r
+#define GL_PIXEL_UNPACK_BUFFER_ARB                         0x88EC\r
+#define GL_PIXEL_PACK_BUFFER_BINDING_ARB                   0x88ED\r
+#define GL_PIXEL_UNPACK_BUFFER_BINDING_ARB                 0x88EF\r
+#endif \r
+\r
+/* GL_ARB_depth_buffer_float */\r
+\r
+#ifndef GL_ARB_depth_buffer_float\r
+#define GL_ARB_depth_buffer_float 1\r
+#define __GLEE_GL_ARB_depth_buffer_float 1\r
+/* Constants */\r
+#define GL_DEPTH_COMPONENT32F                              0x8CAC\r
+#define GL_DEPTH32F_STENCIL8                               0x8CAD\r
+#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV                  0x8DAD\r
+#endif \r
+\r
+/* GL_ARB_draw_instanced */\r
+\r
+#ifndef GL_ARB_draw_instanced\r
+#define GL_ARB_draw_instanced 1\r
+#define __GLEE_GL_ARB_draw_instanced 1\r
+/* Constants */\r
+#ifndef GLEE_H_DEFINED_glDrawArraysInstancedARB\r
+#define GLEE_H_DEFINED_glDrawArraysInstancedARB\r
+  typedef void (APIENTRYP GLEEPFNGLDRAWARRAYSINSTANCEDARBPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount);\r
+  GLEE_EXTERN GLEEPFNGLDRAWARRAYSINSTANCEDARBPROC GLeeFuncPtr_glDrawArraysInstancedARB;\r
+  #define glDrawArraysInstancedARB GLeeFuncPtr_glDrawArraysInstancedARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glDrawElementsInstancedARB\r
+#define GLEE_H_DEFINED_glDrawElementsInstancedARB\r
+  typedef void (APIENTRYP GLEEPFNGLDRAWELEMENTSINSTANCEDARBPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid * indices, GLsizei primcount);\r
+  GLEE_EXTERN GLEEPFNGLDRAWELEMENTSINSTANCEDARBPROC GLeeFuncPtr_glDrawElementsInstancedARB;\r
+  #define glDrawElementsInstancedARB GLeeFuncPtr_glDrawElementsInstancedARB\r
+#endif\r
+#endif \r
+\r
+/* GL_ARB_framebuffer_object */\r
+\r
+#ifndef GL_ARB_framebuffer_object\r
+#define GL_ARB_framebuffer_object 1\r
+#define __GLEE_GL_ARB_framebuffer_object 1\r
+/* Constants */\r
+#define GL_INVALID_FRAMEBUFFER_OPERATION                   0x0506\r
+#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING           0x8210\r
+#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE           0x8211\r
+#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE                 0x8212\r
+#define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE               0x8213\r
+#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE                0x8214\r
+#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE               0x8215\r
+#define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE               0x8216\r
+#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE             0x8217\r
+#define GL_FRAMEBUFFER_DEFAULT                             0x8218\r
+#define GL_FRAMEBUFFER_UNDEFINED                           0x8219\r
+#define GL_DEPTH_STENCIL_ATTACHMENT                        0x821A\r
+#define GL_INDEX                                           0x8222\r
+#define GL_MAX_RENDERBUFFER_SIZE                           0x84E8\r
+#define GL_DEPTH_STENCIL                                   0x84F9\r
+#define GL_UNSIGNED_INT_24_8                               0x84FA\r
+#define GL_DEPTH24_STENCIL8                                0x88F0\r
+#define GL_TEXTURE_STENCIL_SIZE                            0x88F1\r
+#define GL_FRAMEBUFFER_BINDING                             0x8CA6\r
+#define GL_DRAW_FRAMEBUFFER_BINDING                        GL_FRAMEBUFFER_BINDING\r
+#define GL_RENDERBUFFER_BINDING                            0x8CA7\r
+#define GL_READ_FRAMEBUFFER                                0x8CA8\r
+#define GL_DRAW_FRAMEBUFFER                                0x8CA9\r
+#define GL_READ_FRAMEBUFFER_BINDING                        0x8CAA\r
+#define GL_RENDERBUFFER_SAMPLES                            0x8CAB\r
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE              0x8CD0\r
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME              0x8CD1\r
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL            0x8CD2\r
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE    0x8CD3\r
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER            0x8CD4\r
+#define GL_FRAMEBUFFER_COMPLETE                            0x8CD5\r
+#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT               0x8CD6\r
+#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT       0x8CD7\r
+#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER              0x8CDB\r
+#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER              0x8CDC\r
+#define GL_FRAMEBUFFER_UNSUPPORTED                         0x8CDD\r
+#define GL_MAX_COLOR_ATTACHMENTS                           0x8CDF\r
+#define GL_COLOR_ATTACHMENT0                               0x8CE0\r
+#define GL_COLOR_ATTACHMENT1                               0x8CE1\r
+#define GL_COLOR_ATTACHMENT2                               0x8CE2\r
+#define GL_COLOR_ATTACHMENT3                               0x8CE3\r
+#define GL_COLOR_ATTACHMENT4                               0x8CE4\r
+#define GL_COLOR_ATTACHMENT5                               0x8CE5\r
+#define GL_COLOR_ATTACHMENT6                               0x8CE6\r
+#define GL_COLOR_ATTACHMENT7                               0x8CE7\r
+#define GL_COLOR_ATTACHMENT8                               0x8CE8\r
+#define GL_COLOR_ATTACHMENT9                               0x8CE9\r
+#define GL_COLOR_ATTACHMENT10                              0x8CEA\r
+#define GL_COLOR_ATTACHMENT11                              0x8CEB\r
+#define GL_COLOR_ATTACHMENT12                              0x8CEC\r
+#define GL_COLOR_ATTACHMENT13                              0x8CED\r
+#define GL_COLOR_ATTACHMENT14                              0x8CEE\r
+#define GL_COLOR_ATTACHMENT15                              0x8CEF\r
+#define GL_DEPTH_ATTACHMENT                                0x8D00\r
+#define GL_STENCIL_ATTACHMENT                              0x8D20\r
+#define GL_FRAMEBUFFER                                     0x8D40\r
+#define GL_RENDERBUFFER                                    0x8D41\r
+#define GL_RENDERBUFFER_WIDTH                              0x8D42\r
+#define GL_RENDERBUFFER_HEIGHT                             0x8D43\r
+#define GL_RENDERBUFFER_INTERNAL_FORMAT                    0x8D44\r
+#define GL_STENCIL_INDEX1                                  0x8D46\r
+#define GL_STENCIL_INDEX4                                  0x8D47\r
+#define GL_STENCIL_INDEX8                                  0x8D48\r
+#define GL_STENCIL_INDEX16                                 0x8D49\r
+#define GL_RENDERBUFFER_RED_SIZE                           0x8D50\r
+#define GL_RENDERBUFFER_GREEN_SIZE                         0x8D51\r
+#define GL_RENDERBUFFER_BLUE_SIZE                          0x8D52\r
+#define GL_RENDERBUFFER_ALPHA_SIZE                         0x8D53\r
+#define GL_RENDERBUFFER_DEPTH_SIZE                         0x8D54\r
+#define GL_RENDERBUFFER_STENCIL_SIZE                       0x8D55\r
+#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE              0x8D56\r
+#define GL_MAX_SAMPLES                                     0x8D57\r
+#ifndef GLEE_H_DEFINED_glIsRenderbuffer\r
+#define GLEE_H_DEFINED_glIsRenderbuffer\r
+  typedef GLboolean (APIENTRYP GLEEPFNGLISRENDERBUFFERPROC) (GLuint renderbuffer);\r
+  GLEE_EXTERN GLEEPFNGLISRENDERBUFFERPROC GLeeFuncPtr_glIsRenderbuffer;\r
+  #define glIsRenderbuffer GLeeFuncPtr_glIsRenderbuffer\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glBindRenderbuffer\r
+#define GLEE_H_DEFINED_glBindRenderbuffer\r
+  typedef void (APIENTRYP GLEEPFNGLBINDRENDERBUFFERPROC) (GLenum target, GLuint renderbuffer);\r
+  GLEE_EXTERN GLEEPFNGLBINDRENDERBUFFERPROC GLeeFuncPtr_glBindRenderbuffer;\r
+  #define glBindRenderbuffer GLeeFuncPtr_glBindRenderbuffer\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glDeleteRenderbuffers\r
+#define GLEE_H_DEFINED_glDeleteRenderbuffers\r
+  typedef void (APIENTRYP GLEEPFNGLDELETERENDERBUFFERSPROC) (GLsizei n, const GLuint * renderbuffers);\r
+  GLEE_EXTERN GLEEPFNGLDELETERENDERBUFFERSPROC GLeeFuncPtr_glDeleteRenderbuffers;\r
+  #define glDeleteRenderbuffers GLeeFuncPtr_glDeleteRenderbuffers\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGenRenderbuffers\r
+#define GLEE_H_DEFINED_glGenRenderbuffers\r
+  typedef void (APIENTRYP GLEEPFNGLGENRENDERBUFFERSPROC) (GLsizei n, GLuint * renderbuffers);\r
+  GLEE_EXTERN GLEEPFNGLGENRENDERBUFFERSPROC GLeeFuncPtr_glGenRenderbuffers;\r
+  #define glGenRenderbuffers GLeeFuncPtr_glGenRenderbuffers\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glRenderbufferStorage\r
+#define GLEE_H_DEFINED_glRenderbufferStorage\r
+  typedef void (APIENTRYP GLEEPFNGLRENDERBUFFERSTORAGEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height);\r
+  GLEE_EXTERN GLEEPFNGLRENDERBUFFERSTORAGEPROC GLeeFuncPtr_glRenderbufferStorage;\r
+  #define glRenderbufferStorage GLeeFuncPtr_glRenderbufferStorage\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetRenderbufferParameteriv\r
+#define GLEE_H_DEFINED_glGetRenderbufferParameteriv\r
+  typedef void (APIENTRYP GLEEPFNGLGETRENDERBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETRENDERBUFFERPARAMETERIVPROC GLeeFuncPtr_glGetRenderbufferParameteriv;\r
+  #define glGetRenderbufferParameteriv GLeeFuncPtr_glGetRenderbufferParameteriv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glIsFramebuffer\r
+#define GLEE_H_DEFINED_glIsFramebuffer\r
+  typedef GLboolean (APIENTRYP GLEEPFNGLISFRAMEBUFFERPROC) (GLuint framebuffer);\r
+  GLEE_EXTERN GLEEPFNGLISFRAMEBUFFERPROC GLeeFuncPtr_glIsFramebuffer;\r
+  #define glIsFramebuffer GLeeFuncPtr_glIsFramebuffer\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glBindFramebuffer\r
+#define GLEE_H_DEFINED_glBindFramebuffer\r
+  typedef void (APIENTRYP GLEEPFNGLBINDFRAMEBUFFERPROC) (GLenum target, GLuint framebuffer);\r
+  GLEE_EXTERN GLEEPFNGLBINDFRAMEBUFFERPROC GLeeFuncPtr_glBindFramebuffer;\r
+  #define glBindFramebuffer GLeeFuncPtr_glBindFramebuffer\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glDeleteFramebuffers\r
+#define GLEE_H_DEFINED_glDeleteFramebuffers\r
+  typedef void (APIENTRYP GLEEPFNGLDELETEFRAMEBUFFERSPROC) (GLsizei n, const GLuint * framebuffers);\r
+  GLEE_EXTERN GLEEPFNGLDELETEFRAMEBUFFERSPROC GLeeFuncPtr_glDeleteFramebuffers;\r
+  #define glDeleteFramebuffers GLeeFuncPtr_glDeleteFramebuffers\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGenFramebuffers\r
+#define GLEE_H_DEFINED_glGenFramebuffers\r
+  typedef void (APIENTRYP GLEEPFNGLGENFRAMEBUFFERSPROC) (GLsizei n, GLuint * framebuffers);\r
+  GLEE_EXTERN GLEEPFNGLGENFRAMEBUFFERSPROC GLeeFuncPtr_glGenFramebuffers;\r
+  #define glGenFramebuffers GLeeFuncPtr_glGenFramebuffers\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glCheckFramebufferStatus\r
+#define GLEE_H_DEFINED_glCheckFramebufferStatus\r
+  typedef GLenum (APIENTRYP GLEEPFNGLCHECKFRAMEBUFFERSTATUSPROC) (GLenum target);\r
+  GLEE_EXTERN GLEEPFNGLCHECKFRAMEBUFFERSTATUSPROC GLeeFuncPtr_glCheckFramebufferStatus;\r
+  #define glCheckFramebufferStatus GLeeFuncPtr_glCheckFramebufferStatus\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFramebufferTexture1D\r
+#define GLEE_H_DEFINED_glFramebufferTexture1D\r
+  typedef void (APIENTRYP GLEEPFNGLFRAMEBUFFERTEXTURE1DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);\r
+  GLEE_EXTERN GLEEPFNGLFRAMEBUFFERTEXTURE1DPROC GLeeFuncPtr_glFramebufferTexture1D;\r
+  #define glFramebufferTexture1D GLeeFuncPtr_glFramebufferTexture1D\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFramebufferTexture2D\r
+#define GLEE_H_DEFINED_glFramebufferTexture2D\r
+  typedef void (APIENTRYP GLEEPFNGLFRAMEBUFFERTEXTURE2DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);\r
+  GLEE_EXTERN GLEEPFNGLFRAMEBUFFERTEXTURE2DPROC GLeeFuncPtr_glFramebufferTexture2D;\r
+  #define glFramebufferTexture2D GLeeFuncPtr_glFramebufferTexture2D\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFramebufferTexture3D\r
+#define GLEE_H_DEFINED_glFramebufferTexture3D\r
+  typedef void (APIENTRYP GLEEPFNGLFRAMEBUFFERTEXTURE3DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);\r
+  GLEE_EXTERN GLEEPFNGLFRAMEBUFFERTEXTURE3DPROC GLeeFuncPtr_glFramebufferTexture3D;\r
+  #define glFramebufferTexture3D GLeeFuncPtr_glFramebufferTexture3D\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFramebufferRenderbuffer\r
+#define GLEE_H_DEFINED_glFramebufferRenderbuffer\r
+  typedef void (APIENTRYP GLEEPFNGLFRAMEBUFFERRENDERBUFFERPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);\r
+  GLEE_EXTERN GLEEPFNGLFRAMEBUFFERRENDERBUFFERPROC GLeeFuncPtr_glFramebufferRenderbuffer;\r
+  #define glFramebufferRenderbuffer GLeeFuncPtr_glFramebufferRenderbuffer\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetFramebufferAttachmentParameteriv\r
+#define GLEE_H_DEFINED_glGetFramebufferAttachmentParameteriv\r
+  typedef void (APIENTRYP GLEEPFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLenum target, GLenum attachment, GLenum pname, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC GLeeFuncPtr_glGetFramebufferAttachmentParameteriv;\r
+  #define glGetFramebufferAttachmentParameteriv GLeeFuncPtr_glGetFramebufferAttachmentParameteriv\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGenerateMipmap\r
+#define GLEE_H_DEFINED_glGenerateMipmap\r
+  typedef void (APIENTRYP GLEEPFNGLGENERATEMIPMAPPROC) (GLenum target);\r
+  GLEE_EXTERN GLEEPFNGLGENERATEMIPMAPPROC GLeeFuncPtr_glGenerateMipmap;\r
+  #define glGenerateMipmap GLeeFuncPtr_glGenerateMipmap\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glBlitFramebuffer\r
+#define GLEE_H_DEFINED_glBlitFramebuffer\r
+  typedef void (APIENTRYP GLEEPFNGLBLITFRAMEBUFFERPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);\r
+  GLEE_EXTERN GLEEPFNGLBLITFRAMEBUFFERPROC GLeeFuncPtr_glBlitFramebuffer;\r
+  #define glBlitFramebuffer GLeeFuncPtr_glBlitFramebuffer\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glRenderbufferStorageMultisample\r
+#define GLEE_H_DEFINED_glRenderbufferStorageMultisample\r
+  typedef void (APIENTRYP GLEEPFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);\r
+  GLEE_EXTERN GLEEPFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC GLeeFuncPtr_glRenderbufferStorageMultisample;\r
+  #define glRenderbufferStorageMultisample GLeeFuncPtr_glRenderbufferStorageMultisample\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFramebufferTextureLayer\r
+#define GLEE_H_DEFINED_glFramebufferTextureLayer\r
+  typedef void (APIENTRYP GLEEPFNGLFRAMEBUFFERTEXTURELAYERPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);\r
+  GLEE_EXTERN GLEEPFNGLFRAMEBUFFERTEXTURELAYERPROC GLeeFuncPtr_glFramebufferTextureLayer;\r
+  #define glFramebufferTextureLayer GLeeFuncPtr_glFramebufferTextureLayer\r
+#endif\r
+#endif \r
+\r
+/* GL_ARB_framebuffer_sRGB */\r
+\r
+#ifndef GL_ARB_framebuffer_sRGB\r
+#define GL_ARB_framebuffer_sRGB 1\r
+#define __GLEE_GL_ARB_framebuffer_sRGB 1\r
+/* Constants */\r
+#define GL_FRAMEBUFFER_SRGB                                0x8DB9\r
+#endif \r
+\r
+/* GL_ARB_geometry_shader4 */\r
+\r
+#ifndef GL_ARB_geometry_shader4\r
+#define GL_ARB_geometry_shader4 1\r
+#define __GLEE_GL_ARB_geometry_shader4 1\r
+/* Constants */\r
+#define GL_LINES_ADJACENCY_ARB                             0x000A\r
+#define GL_LINE_STRIP_ADJACENCY_ARB                        0x000B\r
+#define GL_TRIANGLES_ADJACENCY_ARB                         0x000C\r
+#define GL_TRIANGLE_STRIP_ADJACENCY_ARB                    0x000D\r
+#define GL_PROGRAM_POINT_SIZE_ARB                          0x8642\r
+#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB            0x8C29\r
+#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_ARB              0x8DA7\r
+#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB        0x8DA8\r
+#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB          0x8DA9\r
+#define GL_GEOMETRY_SHADER_ARB                             0x8DD9\r
+#define GL_GEOMETRY_VERTICES_OUT_ARB                       0x8DDA\r
+#define GL_GEOMETRY_INPUT_TYPE_ARB                         0x8DDB\r
+#define GL_GEOMETRY_OUTPUT_TYPE_ARB                        0x8DDC\r
+#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB             0x8DDD\r
+#define GL_MAX_VERTEX_VARYING_COMPONENTS_ARB               0x8DDE\r
+#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB             0x8DDF\r
+#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB                0x8DE0\r
+#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB        0x8DE1\r
+#ifndef GLEE_H_DEFINED_glProgramParameteriARB\r
+#define GLEE_H_DEFINED_glProgramParameteriARB\r
+  typedef void (APIENTRYP GLEEPFNGLPROGRAMPARAMETERIARBPROC) (GLuint program, GLenum pname, GLint value);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMPARAMETERIARBPROC GLeeFuncPtr_glProgramParameteriARB;\r
+  #define glProgramParameteriARB GLeeFuncPtr_glProgramParameteriARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFramebufferTextureARB\r
+#define GLEE_H_DEFINED_glFramebufferTextureARB\r
+  typedef void (APIENTRYP GLEEPFNGLFRAMEBUFFERTEXTUREARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level);\r
+  GLEE_EXTERN GLEEPFNGLFRAMEBUFFERTEXTUREARBPROC GLeeFuncPtr_glFramebufferTextureARB;\r
+  #define glFramebufferTextureARB GLeeFuncPtr_glFramebufferTextureARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFramebufferTextureLayerARB\r
+#define GLEE_H_DEFINED_glFramebufferTextureLayerARB\r
+  typedef void (APIENTRYP GLEEPFNGLFRAMEBUFFERTEXTURELAYERARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);\r
+  GLEE_EXTERN GLEEPFNGLFRAMEBUFFERTEXTURELAYERARBPROC GLeeFuncPtr_glFramebufferTextureLayerARB;\r
+  #define glFramebufferTextureLayerARB GLeeFuncPtr_glFramebufferTextureLayerARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFramebufferTextureFaceARB\r
+#define GLEE_H_DEFINED_glFramebufferTextureFaceARB\r
+  typedef void (APIENTRYP GLEEPFNGLFRAMEBUFFERTEXTUREFACEARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face);\r
+  GLEE_EXTERN GLEEPFNGLFRAMEBUFFERTEXTUREFACEARBPROC GLeeFuncPtr_glFramebufferTextureFaceARB;\r
+  #define glFramebufferTextureFaceARB GLeeFuncPtr_glFramebufferTextureFaceARB\r
+#endif\r
+#endif \r
+\r
+/* GL_ARB_half_float_vertex */\r
+\r
+#ifndef GL_ARB_half_float_vertex\r
+#define GL_ARB_half_float_vertex 1\r
+#define __GLEE_GL_ARB_half_float_vertex 1\r
+/* Constants */\r
+#define GL_HALF_FLOAT                                      0x140B\r
+#endif \r
+\r
+/* GL_ARB_instanced_arrays */\r
+\r
+#ifndef GL_ARB_instanced_arrays\r
+#define GL_ARB_instanced_arrays 1\r
+#define __GLEE_GL_ARB_instanced_arrays 1\r
+/* Constants */\r
+#ifndef GLEE_H_DEFINED_glVertexAttribDivisor\r
+#define GLEE_H_DEFINED_glVertexAttribDivisor\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBDIVISORPROC) (GLuint index, GLuint divisor);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIBDIVISORPROC GLeeFuncPtr_glVertexAttribDivisor;\r
+  #define glVertexAttribDivisor GLeeFuncPtr_glVertexAttribDivisor\r
+#endif\r
+#endif \r
+\r
+/* GL_ARB_map_buffer_range */\r
+\r
+#ifndef GL_ARB_map_buffer_range\r
+#define GL_ARB_map_buffer_range 1\r
+#define __GLEE_GL_ARB_map_buffer_range 1\r
+/* Constants */\r
+#define GL_MAP_READ_BIT                                    0x0001\r
+#define GL_MAP_WRITE_BIT                                   0x0002\r
+#define GL_MAP_INVALIDATE_RANGE_BIT                        0x0004\r
+#define GL_MAP_INVALIDATE_BUFFER_BIT                       0x0008\r
+#define GL_MAP_FLUSH_EXPLICIT_BIT                          0x0010\r
+#define GL_MAP_UNSYNCHRONIZED_BIT                          0x0020\r
+#ifndef GLEE_H_DEFINED_glMapBufferRange\r
+#define GLEE_H_DEFINED_glMapBufferRange\r
+  typedef void (APIENTRYP GLEEPFNGLMAPBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);\r
+  GLEE_EXTERN GLEEPFNGLMAPBUFFERRANGEPROC GLeeFuncPtr_glMapBufferRange;\r
+  #define glMapBufferRange GLeeFuncPtr_glMapBufferRange\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFlushMappedBufferRange\r
+#define GLEE_H_DEFINED_glFlushMappedBufferRange\r
+  typedef void (APIENTRYP GLEEPFNGLFLUSHMAPPEDBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length);\r
+  GLEE_EXTERN GLEEPFNGLFLUSHMAPPEDBUFFERRANGEPROC GLeeFuncPtr_glFlushMappedBufferRange;\r
+  #define glFlushMappedBufferRange GLeeFuncPtr_glFlushMappedBufferRange\r
+#endif\r
+#endif \r
+\r
+/* GL_ARB_texture_buffer_object */\r
+\r
+#ifndef GL_ARB_texture_buffer_object\r
+#define GL_ARB_texture_buffer_object 1\r
+#define __GLEE_GL_ARB_texture_buffer_object 1\r
+/* Constants */\r
+#define GL_TEXTURE_BUFFER_ARB                              0x8C2A\r
+#define GL_MAX_TEXTURE_BUFFER_SIZE_ARB                     0x8C2B\r
+#define GL_TEXTURE_BINDING_BUFFER_ARB                      0x8C2C\r
+#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_ARB           0x8C2D\r
+#define GL_TEXTURE_BUFFER_FORMAT_ARB                       0x8C2E\r
+#ifndef GLEE_H_DEFINED_glTexBufferARB\r
+#define GLEE_H_DEFINED_glTexBufferARB\r
+  typedef void (APIENTRYP GLEEPFNGLTEXBUFFERARBPROC) (GLenum target, GLenum internalformat, GLuint buffer);\r
+  GLEE_EXTERN GLEEPFNGLTEXBUFFERARBPROC GLeeFuncPtr_glTexBufferARB;\r
+  #define glTexBufferARB GLeeFuncPtr_glTexBufferARB\r
+#endif\r
+#endif \r
+\r
+/* GL_ARB_texture_compression_rgtc */\r
+\r
+#ifndef GL_ARB_texture_compression_rgtc\r
+#define GL_ARB_texture_compression_rgtc 1\r
+#define __GLEE_GL_ARB_texture_compression_rgtc 1\r
+/* Constants */\r
+#define GL_COMPRESSED_RED_RGTC1                            0x8DBB\r
+#define GL_COMPRESSED_SIGNED_RED_RGTC1                     0x8DBC\r
+#define GL_COMPRESSED_RG_RGTC2                             0x8DBD\r
+#define GL_COMPRESSED_SIGNED_RG_RGTC2                      0x8DBE\r
+#endif \r
+\r
+/* GL_ARB_texture_rg */\r
+\r
+#ifndef GL_ARB_texture_rg\r
+#define GL_ARB_texture_rg 1\r
+#define __GLEE_GL_ARB_texture_rg 1\r
+/* Constants */\r
+#define GL_RG                                              0x8227\r
+#define GL_RG_INTEGER                                      0x8228\r
+#define GL_R8                                              0x8229\r
+#define GL_R16                                             0x822A\r
+#define GL_RG8                                             0x822B\r
+#define GL_RG16                                            0x822C\r
+#define GL_R16F                                            0x822D\r
+#define GL_R32F                                            0x822E\r
+#define GL_RG16F                                           0x822F\r
+#define GL_RG32F                                           0x8230\r
+#define GL_R8I                                             0x8231\r
+#define GL_R8UI                                            0x8232\r
+#define GL_R16I                                            0x8233\r
+#define GL_R16UI                                           0x8234\r
+#define GL_R32I                                            0x8235\r
+#define GL_R32UI                                           0x8236\r
+#define GL_RG8I                                            0x8237\r
+#define GL_RG8UI                                           0x8238\r
+#define GL_RG16I                                           0x8239\r
+#define GL_RG16UI                                          0x823A\r
+#define GL_RG32I                                           0x823B\r
+#define GL_RG32UI                                          0x823C\r
+#endif \r
+\r
+/* GL_ARB_vertex_array_object */\r
+\r
+#ifndef GL_ARB_vertex_array_object\r
+#define GL_ARB_vertex_array_object 1\r
+#define __GLEE_GL_ARB_vertex_array_object 1\r
+/* Constants */\r
+#define GL_VERTEX_ARRAY_BINDING                            0x85B5\r
+#ifndef GLEE_H_DEFINED_glBindVertexArray\r
+#define GLEE_H_DEFINED_glBindVertexArray\r
+  typedef void (APIENTRYP GLEEPFNGLBINDVERTEXARRAYPROC) (GLuint array);\r
+  GLEE_EXTERN GLEEPFNGLBINDVERTEXARRAYPROC GLeeFuncPtr_glBindVertexArray;\r
+  #define glBindVertexArray GLeeFuncPtr_glBindVertexArray\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glDeleteVertexArrays\r
+#define GLEE_H_DEFINED_glDeleteVertexArrays\r
+  typedef void (APIENTRYP GLEEPFNGLDELETEVERTEXARRAYSPROC) (GLsizei n, const GLuint * arrays);\r
+  GLEE_EXTERN GLEEPFNGLDELETEVERTEXARRAYSPROC GLeeFuncPtr_glDeleteVertexArrays;\r
+  #define glDeleteVertexArrays GLeeFuncPtr_glDeleteVertexArrays\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGenVertexArrays\r
+#define GLEE_H_DEFINED_glGenVertexArrays\r
+  typedef void (APIENTRYP GLEEPFNGLGENVERTEXARRAYSPROC) (GLsizei n, GLuint * arrays);\r
+  GLEE_EXTERN GLEEPFNGLGENVERTEXARRAYSPROC GLeeFuncPtr_glGenVertexArrays;\r
+  #define glGenVertexArrays GLeeFuncPtr_glGenVertexArrays\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glIsVertexArray\r
+#define GLEE_H_DEFINED_glIsVertexArray\r
+  typedef GLboolean (APIENTRYP GLEEPFNGLISVERTEXARRAYPROC) (GLuint array);\r
+  GLEE_EXTERN GLEEPFNGLISVERTEXARRAYPROC GLeeFuncPtr_glIsVertexArray;\r
+  #define glIsVertexArray GLeeFuncPtr_glIsVertexArray\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_abgr */\r
+\r
+#ifndef GL_EXT_abgr\r
+#define GL_EXT_abgr 1\r
+#define __GLEE_GL_EXT_abgr 1\r
+/* Constants */\r
+#define GL_ABGR_EXT                                        0x8000\r
+#endif \r
+\r
+/* GL_EXT_blend_color */\r
+\r
+#ifndef GL_EXT_blend_color\r
+#define GL_EXT_blend_color 1\r
+#define __GLEE_GL_EXT_blend_color 1\r
+/* Constants */\r
+#define GL_CONSTANT_COLOR_EXT                              0x8001\r
+#define GL_ONE_MINUS_CONSTANT_COLOR_EXT                    0x8002\r
+#define GL_CONSTANT_ALPHA_EXT                              0x8003\r
+#define GL_ONE_MINUS_CONSTANT_ALPHA_EXT                    0x8004\r
+#define GL_BLEND_COLOR_EXT                                 0x8005\r
+#ifndef GLEE_H_DEFINED_glBlendColorEXT\r
+#define GLEE_H_DEFINED_glBlendColorEXT\r
+  typedef void (APIENTRYP GLEEPFNGLBLENDCOLOREXTPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);\r
+  GLEE_EXTERN GLEEPFNGLBLENDCOLOREXTPROC GLeeFuncPtr_glBlendColorEXT;\r
+  #define glBlendColorEXT GLeeFuncPtr_glBlendColorEXT\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_polygon_offset */\r
+\r
+#ifndef GL_EXT_polygon_offset\r
+#define GL_EXT_polygon_offset 1\r
+#define __GLEE_GL_EXT_polygon_offset 1\r
+/* Constants */\r
+#define GL_POLYGON_OFFSET_EXT                              0x8037\r
+#define GL_POLYGON_OFFSET_FACTOR_EXT                       0x8038\r
+#define GL_POLYGON_OFFSET_BIAS_EXT                         0x8039\r
+#ifndef GLEE_H_DEFINED_glPolygonOffsetEXT\r
+#define GLEE_H_DEFINED_glPolygonOffsetEXT\r
+  typedef void (APIENTRYP GLEEPFNGLPOLYGONOFFSETEXTPROC) (GLfloat factor, GLfloat bias);\r
+  GLEE_EXTERN GLEEPFNGLPOLYGONOFFSETEXTPROC GLeeFuncPtr_glPolygonOffsetEXT;\r
+  #define glPolygonOffsetEXT GLeeFuncPtr_glPolygonOffsetEXT\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_texture */\r
+\r
+#ifndef GL_EXT_texture\r
+#define GL_EXT_texture 1\r
+#define __GLEE_GL_EXT_texture 1\r
+/* Constants */\r
+#define GL_ALPHA4_EXT                                      0x803B\r
+#define GL_ALPHA8_EXT                                      0x803C\r
+#define GL_ALPHA12_EXT                                     0x803D\r
+#define GL_ALPHA16_EXT                                     0x803E\r
+#define GL_LUMINANCE4_EXT                                  0x803F\r
+#define GL_LUMINANCE8_EXT                                  0x8040\r
+#define GL_LUMINANCE12_EXT                                 0x8041\r
+#define GL_LUMINANCE16_EXT                                 0x8042\r
+#define GL_LUMINANCE4_ALPHA4_EXT                           0x8043\r
+#define GL_LUMINANCE6_ALPHA2_EXT                           0x8044\r
+#define GL_LUMINANCE8_ALPHA8_EXT                           0x8045\r
+#define GL_LUMINANCE12_ALPHA4_EXT                          0x8046\r
+#define GL_LUMINANCE12_ALPHA12_EXT                         0x8047\r
+#define GL_LUMINANCE16_ALPHA16_EXT                         0x8048\r
+#define GL_INTENSITY_EXT                                   0x8049\r
+#define GL_INTENSITY4_EXT                                  0x804A\r
+#define GL_INTENSITY8_EXT                                  0x804B\r
+#define GL_INTENSITY12_EXT                                 0x804C\r
+#define GL_INTENSITY16_EXT                                 0x804D\r
+#define GL_RGB2_EXT                                        0x804E\r
+#define GL_RGB4_EXT                                        0x804F\r
+#define GL_RGB5_EXT                                        0x8050\r
+#define GL_RGB8_EXT                                        0x8051\r
+#define GL_RGB10_EXT                                       0x8052\r
+#define GL_RGB12_EXT                                       0x8053\r
+#define GL_RGB16_EXT                                       0x8054\r
+#define GL_RGBA2_EXT                                       0x8055\r
+#define GL_RGBA4_EXT                                       0x8056\r
+#define GL_RGB5_A1_EXT                                     0x8057\r
+#define GL_RGBA8_EXT                                       0x8058\r
+#define GL_RGB10_A2_EXT                                    0x8059\r
+#define GL_RGBA12_EXT                                      0x805A\r
+#define GL_RGBA16_EXT                                      0x805B\r
+#define GL_TEXTURE_RED_SIZE_EXT                            0x805C\r
+#define GL_TEXTURE_GREEN_SIZE_EXT                          0x805D\r
+#define GL_TEXTURE_BLUE_SIZE_EXT                           0x805E\r
+#define GL_TEXTURE_ALPHA_SIZE_EXT                          0x805F\r
+#define GL_TEXTURE_LUMINANCE_SIZE_EXT                      0x8060\r
+#define GL_TEXTURE_INTENSITY_SIZE_EXT                      0x8061\r
+#define GL_REPLACE_EXT                                     0x8062\r
+#define GL_PROXY_TEXTURE_1D_EXT                            0x8063\r
+#define GL_PROXY_TEXTURE_2D_EXT                            0x8064\r
+#define GL_TEXTURE_TOO_LARGE_EXT                           0x8065\r
+#endif \r
+\r
+/* GL_EXT_texture3D */\r
+\r
+#ifndef GL_EXT_texture3D\r
+#define GL_EXT_texture3D 1\r
+#define __GLEE_GL_EXT_texture3D 1\r
+/* Constants */\r
+#define GL_PACK_SKIP_IMAGES_EXT                            0x806B\r
+#define GL_PACK_IMAGE_HEIGHT_EXT                           0x806C\r
+#define GL_UNPACK_SKIP_IMAGES_EXT                          0x806D\r
+#define GL_UNPACK_IMAGE_HEIGHT_EXT                         0x806E\r
+#define GL_TEXTURE_3D_EXT                                  0x806F\r
+#define GL_PROXY_TEXTURE_3D_EXT                            0x8070\r
+#define GL_TEXTURE_DEPTH_EXT                               0x8071\r
+#define GL_TEXTURE_WRAP_R_EXT                              0x8072\r
+#define GL_MAX_3D_TEXTURE_SIZE_EXT                         0x8073\r
+#ifndef GLEE_H_DEFINED_glTexImage3DEXT\r
+#define GLEE_H_DEFINED_glTexImage3DEXT\r
+  typedef void (APIENTRYP GLEEPFNGLTEXIMAGE3DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid * pixels);\r
+  GLEE_EXTERN GLEEPFNGLTEXIMAGE3DEXTPROC GLeeFuncPtr_glTexImage3DEXT;\r
+  #define glTexImage3DEXT GLeeFuncPtr_glTexImage3DEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTexSubImage3DEXT\r
+#define GLEE_H_DEFINED_glTexSubImage3DEXT\r
+  typedef void (APIENTRYP GLEEPFNGLTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid * pixels);\r
+  GLEE_EXTERN GLEEPFNGLTEXSUBIMAGE3DEXTPROC GLeeFuncPtr_glTexSubImage3DEXT;\r
+  #define glTexSubImage3DEXT GLeeFuncPtr_glTexSubImage3DEXT\r
+#endif\r
+#endif \r
+\r
+/* GL_SGIS_texture_filter4 */\r
+\r
+#ifndef GL_SGIS_texture_filter4\r
+#define GL_SGIS_texture_filter4 1\r
+#define __GLEE_GL_SGIS_texture_filter4 1\r
+/* Constants */\r
+#define GL_FILTER4_SGIS                                    0x8146\r
+#define GL_TEXTURE_FILTER4_SIZE_SGIS                       0x8147\r
+#ifndef GLEE_H_DEFINED_glGetTexFilterFuncSGIS\r
+#define GLEE_H_DEFINED_glGetTexFilterFuncSGIS\r
+  typedef void (APIENTRYP GLEEPFNGLGETTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLfloat * weights);\r
+  GLEE_EXTERN GLEEPFNGLGETTEXFILTERFUNCSGISPROC GLeeFuncPtr_glGetTexFilterFuncSGIS;\r
+  #define glGetTexFilterFuncSGIS GLeeFuncPtr_glGetTexFilterFuncSGIS\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTexFilterFuncSGIS\r
+#define GLEE_H_DEFINED_glTexFilterFuncSGIS\r
+  typedef void (APIENTRYP GLEEPFNGLTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLsizei n, const GLfloat * weights);\r
+  GLEE_EXTERN GLEEPFNGLTEXFILTERFUNCSGISPROC GLeeFuncPtr_glTexFilterFuncSGIS;\r
+  #define glTexFilterFuncSGIS GLeeFuncPtr_glTexFilterFuncSGIS\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_subtexture */\r
+\r
+#ifndef GL_EXT_subtexture\r
+#define GL_EXT_subtexture 1\r
+#define __GLEE_GL_EXT_subtexture 1\r
+/* Constants */\r
+#ifndef GLEE_H_DEFINED_glTexSubImage1DEXT\r
+#define GLEE_H_DEFINED_glTexSubImage1DEXT\r
+  typedef void (APIENTRYP GLEEPFNGLTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid * pixels);\r
+  GLEE_EXTERN GLEEPFNGLTEXSUBIMAGE1DEXTPROC GLeeFuncPtr_glTexSubImage1DEXT;\r
+  #define glTexSubImage1DEXT GLeeFuncPtr_glTexSubImage1DEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTexSubImage2DEXT\r
+#define GLEE_H_DEFINED_glTexSubImage2DEXT\r
+  typedef void (APIENTRYP GLEEPFNGLTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * pixels);\r
+  GLEE_EXTERN GLEEPFNGLTEXSUBIMAGE2DEXTPROC GLeeFuncPtr_glTexSubImage2DEXT;\r
+  #define glTexSubImage2DEXT GLeeFuncPtr_glTexSubImage2DEXT\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_copy_texture */\r
+\r
+#ifndef GL_EXT_copy_texture\r
+#define GL_EXT_copy_texture 1\r
+#define __GLEE_GL_EXT_copy_texture 1\r
+/* Constants */\r
+#ifndef GLEE_H_DEFINED_glCopyTexImage1DEXT\r
+#define GLEE_H_DEFINED_glCopyTexImage1DEXT\r
+  typedef void (APIENTRYP GLEEPFNGLCOPYTEXIMAGE1DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);\r
+  GLEE_EXTERN GLEEPFNGLCOPYTEXIMAGE1DEXTPROC GLeeFuncPtr_glCopyTexImage1DEXT;\r
+  #define glCopyTexImage1DEXT GLeeFuncPtr_glCopyTexImage1DEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glCopyTexImage2DEXT\r
+#define GLEE_H_DEFINED_glCopyTexImage2DEXT\r
+  typedef void (APIENTRYP GLEEPFNGLCOPYTEXIMAGE2DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);\r
+  GLEE_EXTERN GLEEPFNGLCOPYTEXIMAGE2DEXTPROC GLeeFuncPtr_glCopyTexImage2DEXT;\r
+  #define glCopyTexImage2DEXT GLeeFuncPtr_glCopyTexImage2DEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glCopyTexSubImage1DEXT\r
+#define GLEE_H_DEFINED_glCopyTexSubImage1DEXT\r
+  typedef void (APIENTRYP GLEEPFNGLCOPYTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);\r
+  GLEE_EXTERN GLEEPFNGLCOPYTEXSUBIMAGE1DEXTPROC GLeeFuncPtr_glCopyTexSubImage1DEXT;\r
+  #define glCopyTexSubImage1DEXT GLeeFuncPtr_glCopyTexSubImage1DEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glCopyTexSubImage2DEXT\r
+#define GLEE_H_DEFINED_glCopyTexSubImage2DEXT\r
+  typedef void (APIENTRYP GLEEPFNGLCOPYTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);\r
+  GLEE_EXTERN GLEEPFNGLCOPYTEXSUBIMAGE2DEXTPROC GLeeFuncPtr_glCopyTexSubImage2DEXT;\r
+  #define glCopyTexSubImage2DEXT GLeeFuncPtr_glCopyTexSubImage2DEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glCopyTexSubImage3DEXT\r
+#define GLEE_H_DEFINED_glCopyTexSubImage3DEXT\r
+  typedef void (APIENTRYP GLEEPFNGLCOPYTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);\r
+  GLEE_EXTERN GLEEPFNGLCOPYTEXSUBIMAGE3DEXTPROC GLeeFuncPtr_glCopyTexSubImage3DEXT;\r
+  #define glCopyTexSubImage3DEXT GLeeFuncPtr_glCopyTexSubImage3DEXT\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_histogram */\r
+\r
+#ifndef GL_EXT_histogram\r
+#define GL_EXT_histogram 1\r
+#define __GLEE_GL_EXT_histogram 1\r
+/* Constants */\r
+#define GL_HISTOGRAM_EXT                                   0x8024\r
+#define GL_PROXY_HISTOGRAM_EXT                             0x8025\r
+#define GL_HISTOGRAM_WIDTH_EXT                             0x8026\r
+#define GL_HISTOGRAM_FORMAT_EXT                            0x8027\r
+#define GL_HISTOGRAM_RED_SIZE_EXT                          0x8028\r
+#define GL_HISTOGRAM_GREEN_SIZE_EXT                        0x8029\r
+#define GL_HISTOGRAM_BLUE_SIZE_EXT                         0x802A\r
+#define GL_HISTOGRAM_ALPHA_SIZE_EXT                        0x802B\r
+#define GL_HISTOGRAM_LUMINANCE_SIZE_EXT                    0x802C\r
+#define GL_HISTOGRAM_SINK_EXT                              0x802D\r
+#define GL_MINMAX_EXT                                      0x802E\r
+#define GL_MINMAX_FORMAT_EXT                               0x802F\r
+#define GL_MINMAX_SINK_EXT                                 0x8030\r
+#define GL_TABLE_TOO_LARGE_EXT                             0x8031\r
+#ifndef GLEE_H_DEFINED_glGetHistogramEXT\r
+#define GLEE_H_DEFINED_glGetHistogramEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETHISTOGRAMEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid * values);\r
+  GLEE_EXTERN GLEEPFNGLGETHISTOGRAMEXTPROC GLeeFuncPtr_glGetHistogramEXT;\r
+  #define glGetHistogramEXT GLeeFuncPtr_glGetHistogramEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetHistogramParameterfvEXT\r
+#define GLEE_H_DEFINED_glGetHistogramParameterfvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETHISTOGRAMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLGETHISTOGRAMPARAMETERFVEXTPROC GLeeFuncPtr_glGetHistogramParameterfvEXT;\r
+  #define glGetHistogramParameterfvEXT GLeeFuncPtr_glGetHistogramParameterfvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetHistogramParameterivEXT\r
+#define GLEE_H_DEFINED_glGetHistogramParameterivEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETHISTOGRAMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETHISTOGRAMPARAMETERIVEXTPROC GLeeFuncPtr_glGetHistogramParameterivEXT;\r
+  #define glGetHistogramParameterivEXT GLeeFuncPtr_glGetHistogramParameterivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetMinmaxEXT\r
+#define GLEE_H_DEFINED_glGetMinmaxEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETMINMAXEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid * values);\r
+  GLEE_EXTERN GLEEPFNGLGETMINMAXEXTPROC GLeeFuncPtr_glGetMinmaxEXT;\r
+  #define glGetMinmaxEXT GLeeFuncPtr_glGetMinmaxEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetMinmaxParameterfvEXT\r
+#define GLEE_H_DEFINED_glGetMinmaxParameterfvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETMINMAXPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLGETMINMAXPARAMETERFVEXTPROC GLeeFuncPtr_glGetMinmaxParameterfvEXT;\r
+  #define glGetMinmaxParameterfvEXT GLeeFuncPtr_glGetMinmaxParameterfvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetMinmaxParameterivEXT\r
+#define GLEE_H_DEFINED_glGetMinmaxParameterivEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETMINMAXPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETMINMAXPARAMETERIVEXTPROC GLeeFuncPtr_glGetMinmaxParameterivEXT;\r
+  #define glGetMinmaxParameterivEXT GLeeFuncPtr_glGetMinmaxParameterivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glHistogramEXT\r
+#define GLEE_H_DEFINED_glHistogramEXT\r
+  typedef void (APIENTRYP GLEEPFNGLHISTOGRAMEXTPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink);\r
+  GLEE_EXTERN GLEEPFNGLHISTOGRAMEXTPROC GLeeFuncPtr_glHistogramEXT;\r
+  #define glHistogramEXT GLeeFuncPtr_glHistogramEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMinmaxEXT\r
+#define GLEE_H_DEFINED_glMinmaxEXT\r
+  typedef void (APIENTRYP GLEEPFNGLMINMAXEXTPROC) (GLenum target, GLenum internalformat, GLboolean sink);\r
+  GLEE_EXTERN GLEEPFNGLMINMAXEXTPROC GLeeFuncPtr_glMinmaxEXT;\r
+  #define glMinmaxEXT GLeeFuncPtr_glMinmaxEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glResetHistogramEXT\r
+#define GLEE_H_DEFINED_glResetHistogramEXT\r
+  typedef void (APIENTRYP GLEEPFNGLRESETHISTOGRAMEXTPROC) (GLenum target);\r
+  GLEE_EXTERN GLEEPFNGLRESETHISTOGRAMEXTPROC GLeeFuncPtr_glResetHistogramEXT;\r
+  #define glResetHistogramEXT GLeeFuncPtr_glResetHistogramEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glResetMinmaxEXT\r
+#define GLEE_H_DEFINED_glResetMinmaxEXT\r
+  typedef void (APIENTRYP GLEEPFNGLRESETMINMAXEXTPROC) (GLenum target);\r
+  GLEE_EXTERN GLEEPFNGLRESETMINMAXEXTPROC GLeeFuncPtr_glResetMinmaxEXT;\r
+  #define glResetMinmaxEXT GLeeFuncPtr_glResetMinmaxEXT\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_convolution */\r
+\r
+#ifndef GL_EXT_convolution\r
+#define GL_EXT_convolution 1\r
+#define __GLEE_GL_EXT_convolution 1\r
+/* Constants */\r
+#define GL_CONVOLUTION_1D_EXT                              0x8010\r
+#define GL_CONVOLUTION_2D_EXT                              0x8011\r
+#define GL_SEPARABLE_2D_EXT                                0x8012\r
+#define GL_CONVOLUTION_BORDER_MODE_EXT                     0x8013\r
+#define GL_CONVOLUTION_FILTER_SCALE_EXT                    0x8014\r
+#define GL_CONVOLUTION_FILTER_BIAS_EXT                     0x8015\r
+#define GL_REDUCE_EXT                                      0x8016\r
+#define GL_CONVOLUTION_FORMAT_EXT                          0x8017\r
+#define GL_CONVOLUTION_WIDTH_EXT                           0x8018\r
+#define GL_CONVOLUTION_HEIGHT_EXT                          0x8019\r
+#define GL_MAX_CONVOLUTION_WIDTH_EXT                       0x801A\r
+#define GL_MAX_CONVOLUTION_HEIGHT_EXT                      0x801B\r
+#define GL_POST_CONVOLUTION_RED_SCALE_EXT                  0x801C\r
+#define GL_POST_CONVOLUTION_GREEN_SCALE_EXT                0x801D\r
+#define GL_POST_CONVOLUTION_BLUE_SCALE_EXT                 0x801E\r
+#define GL_POST_CONVOLUTION_ALPHA_SCALE_EXT                0x801F\r
+#define GL_POST_CONVOLUTION_RED_BIAS_EXT                   0x8020\r
+#define GL_POST_CONVOLUTION_GREEN_BIAS_EXT                 0x8021\r
+#define GL_POST_CONVOLUTION_BLUE_BIAS_EXT                  0x8022\r
+#define GL_POST_CONVOLUTION_ALPHA_BIAS_EXT                 0x8023\r
+#ifndef GLEE_H_DEFINED_glConvolutionFilter1DEXT\r
+#define GLEE_H_DEFINED_glConvolutionFilter1DEXT\r
+  typedef void (APIENTRYP GLEEPFNGLCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid * image);\r
+  GLEE_EXTERN GLEEPFNGLCONVOLUTIONFILTER1DEXTPROC GLeeFuncPtr_glConvolutionFilter1DEXT;\r
+  #define glConvolutionFilter1DEXT GLeeFuncPtr_glConvolutionFilter1DEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glConvolutionFilter2DEXT\r
+#define GLEE_H_DEFINED_glConvolutionFilter2DEXT\r
+  typedef void (APIENTRYP GLEEPFNGLCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * image);\r
+  GLEE_EXTERN GLEEPFNGLCONVOLUTIONFILTER2DEXTPROC GLeeFuncPtr_glConvolutionFilter2DEXT;\r
+  #define glConvolutionFilter2DEXT GLeeFuncPtr_glConvolutionFilter2DEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glConvolutionParameterfEXT\r
+#define GLEE_H_DEFINED_glConvolutionParameterfEXT\r
+  typedef void (APIENTRYP GLEEPFNGLCONVOLUTIONPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat params);\r
+  GLEE_EXTERN GLEEPFNGLCONVOLUTIONPARAMETERFEXTPROC GLeeFuncPtr_glConvolutionParameterfEXT;\r
+  #define glConvolutionParameterfEXT GLeeFuncPtr_glConvolutionParameterfEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glConvolutionParameterfvEXT\r
+#define GLEE_H_DEFINED_glConvolutionParameterfvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLCONVOLUTIONPARAMETERFVEXTPROC GLeeFuncPtr_glConvolutionParameterfvEXT;\r
+  #define glConvolutionParameterfvEXT GLeeFuncPtr_glConvolutionParameterfvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glConvolutionParameteriEXT\r
+#define GLEE_H_DEFINED_glConvolutionParameteriEXT\r
+  typedef void (APIENTRYP GLEEPFNGLCONVOLUTIONPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint params);\r
+  GLEE_EXTERN GLEEPFNGLCONVOLUTIONPARAMETERIEXTPROC GLeeFuncPtr_glConvolutionParameteriEXT;\r
+  #define glConvolutionParameteriEXT GLeeFuncPtr_glConvolutionParameteriEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glConvolutionParameterivEXT\r
+#define GLEE_H_DEFINED_glConvolutionParameterivEXT\r
+  typedef void (APIENTRYP GLEEPFNGLCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLCONVOLUTIONPARAMETERIVEXTPROC GLeeFuncPtr_glConvolutionParameterivEXT;\r
+  #define glConvolutionParameterivEXT GLeeFuncPtr_glConvolutionParameterivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glCopyConvolutionFilter1DEXT\r
+#define GLEE_H_DEFINED_glCopyConvolutionFilter1DEXT\r
+  typedef void (APIENTRYP GLEEPFNGLCOPYCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);\r
+  GLEE_EXTERN GLEEPFNGLCOPYCONVOLUTIONFILTER1DEXTPROC GLeeFuncPtr_glCopyConvolutionFilter1DEXT;\r
+  #define glCopyConvolutionFilter1DEXT GLeeFuncPtr_glCopyConvolutionFilter1DEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glCopyConvolutionFilter2DEXT\r
+#define GLEE_H_DEFINED_glCopyConvolutionFilter2DEXT\r
+  typedef void (APIENTRYP GLEEPFNGLCOPYCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height);\r
+  GLEE_EXTERN GLEEPFNGLCOPYCONVOLUTIONFILTER2DEXTPROC GLeeFuncPtr_glCopyConvolutionFilter2DEXT;\r
+  #define glCopyConvolutionFilter2DEXT GLeeFuncPtr_glCopyConvolutionFilter2DEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetConvolutionFilterEXT\r
+#define GLEE_H_DEFINED_glGetConvolutionFilterEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETCONVOLUTIONFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid * image);\r
+  GLEE_EXTERN GLEEPFNGLGETCONVOLUTIONFILTEREXTPROC GLeeFuncPtr_glGetConvolutionFilterEXT;\r
+  #define glGetConvolutionFilterEXT GLeeFuncPtr_glGetConvolutionFilterEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetConvolutionParameterfvEXT\r
+#define GLEE_H_DEFINED_glGetConvolutionParameterfvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLGETCONVOLUTIONPARAMETERFVEXTPROC GLeeFuncPtr_glGetConvolutionParameterfvEXT;\r
+  #define glGetConvolutionParameterfvEXT GLeeFuncPtr_glGetConvolutionParameterfvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetConvolutionParameterivEXT\r
+#define GLEE_H_DEFINED_glGetConvolutionParameterivEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETCONVOLUTIONPARAMETERIVEXTPROC GLeeFuncPtr_glGetConvolutionParameterivEXT;\r
+  #define glGetConvolutionParameterivEXT GLeeFuncPtr_glGetConvolutionParameterivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetSeparableFilterEXT\r
+#define GLEE_H_DEFINED_glGetSeparableFilterEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETSEPARABLEFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid * row, GLvoid * column, GLvoid * span);\r
+  GLEE_EXTERN GLEEPFNGLGETSEPARABLEFILTEREXTPROC GLeeFuncPtr_glGetSeparableFilterEXT;\r
+  #define glGetSeparableFilterEXT GLeeFuncPtr_glGetSeparableFilterEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glSeparableFilter2DEXT\r
+#define GLEE_H_DEFINED_glSeparableFilter2DEXT\r
+  typedef void (APIENTRYP GLEEPFNGLSEPARABLEFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * row, const GLvoid * column);\r
+  GLEE_EXTERN GLEEPFNGLSEPARABLEFILTER2DEXTPROC GLeeFuncPtr_glSeparableFilter2DEXT;\r
+  #define glSeparableFilter2DEXT GLeeFuncPtr_glSeparableFilter2DEXT\r
+#endif\r
+#endif \r
+\r
+/* GL_SGI_color_matrix */\r
+\r
+#ifndef GL_SGI_color_matrix\r
+#define GL_SGI_color_matrix 1\r
+#define __GLEE_GL_SGI_color_matrix 1\r
+/* Constants */\r
+#define GL_COLOR_MATRIX_SGI                                0x80B1\r
+#define GL_COLOR_MATRIX_STACK_DEPTH_SGI                    0x80B2\r
+#define GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI                0x80B3\r
+#define GL_POST_COLOR_MATRIX_RED_SCALE_SGI                 0x80B4\r
+#define GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI               0x80B5\r
+#define GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI                0x80B6\r
+#define GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI               0x80B7\r
+#define GL_POST_COLOR_MATRIX_RED_BIAS_SGI                  0x80B8\r
+#define GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI                0x80B9\r
+#define GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI                 0x80BA\r
+#define GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI                0x80BB\r
+#endif \r
+\r
+/* GL_SGI_color_table */\r
+\r
+#ifndef GL_SGI_color_table\r
+#define GL_SGI_color_table 1\r
+#define __GLEE_GL_SGI_color_table 1\r
+/* Constants */\r
+#define GL_COLOR_TABLE_SGI                                 0x80D0\r
+#define GL_POST_CONVOLUTION_COLOR_TABLE_SGI                0x80D1\r
+#define GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI               0x80D2\r
+#define GL_PROXY_COLOR_TABLE_SGI                           0x80D3\r
+#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE_SGI          0x80D4\r
+#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE_SGI         0x80D5\r
+#define GL_COLOR_TABLE_SCALE_SGI                           0x80D6\r
+#define GL_COLOR_TABLE_BIAS_SGI                            0x80D7\r
+#define GL_COLOR_TABLE_FORMAT_SGI                          0x80D8\r
+#define GL_COLOR_TABLE_WIDTH_SGI                           0x80D9\r
+#define GL_COLOR_TABLE_RED_SIZE_SGI                        0x80DA\r
+#define GL_COLOR_TABLE_GREEN_SIZE_SGI                      0x80DB\r
+#define GL_COLOR_TABLE_BLUE_SIZE_SGI                       0x80DC\r
+#define GL_COLOR_TABLE_ALPHA_SIZE_SGI                      0x80DD\r
+#define GL_COLOR_TABLE_LUMINANCE_SIZE_SGI                  0x80DE\r
+#define GL_COLOR_TABLE_INTENSITY_SIZE_SGI                  0x80DF\r
+#ifndef GLEE_H_DEFINED_glColorTableSGI\r
+#define GLEE_H_DEFINED_glColorTableSGI\r
+  typedef void (APIENTRYP GLEEPFNGLCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid * table);\r
+  GLEE_EXTERN GLEEPFNGLCOLORTABLESGIPROC GLeeFuncPtr_glColorTableSGI;\r
+  #define glColorTableSGI GLeeFuncPtr_glColorTableSGI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glColorTableParameterfvSGI\r
+#define GLEE_H_DEFINED_glColorTableParameterfvSGI\r
+  typedef void (APIENTRYP GLEEPFNGLCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, const GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLCOLORTABLEPARAMETERFVSGIPROC GLeeFuncPtr_glColorTableParameterfvSGI;\r
+  #define glColorTableParameterfvSGI GLeeFuncPtr_glColorTableParameterfvSGI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glColorTableParameterivSGI\r
+#define GLEE_H_DEFINED_glColorTableParameterivSGI\r
+  typedef void (APIENTRYP GLEEPFNGLCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, const GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLCOLORTABLEPARAMETERIVSGIPROC GLeeFuncPtr_glColorTableParameterivSGI;\r
+  #define glColorTableParameterivSGI GLeeFuncPtr_glColorTableParameterivSGI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glCopyColorTableSGI\r
+#define GLEE_H_DEFINED_glCopyColorTableSGI\r
+  typedef void (APIENTRYP GLEEPFNGLCOPYCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);\r
+  GLEE_EXTERN GLEEPFNGLCOPYCOLORTABLESGIPROC GLeeFuncPtr_glCopyColorTableSGI;\r
+  #define glCopyColorTableSGI GLeeFuncPtr_glCopyColorTableSGI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetColorTableSGI\r
+#define GLEE_H_DEFINED_glGetColorTableSGI\r
+  typedef void (APIENTRYP GLEEPFNGLGETCOLORTABLESGIPROC) (GLenum target, GLenum format, GLenum type, GLvoid * table);\r
+  GLEE_EXTERN GLEEPFNGLGETCOLORTABLESGIPROC GLeeFuncPtr_glGetColorTableSGI;\r
+  #define glGetColorTableSGI GLeeFuncPtr_glGetColorTableSGI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetColorTableParameterfvSGI\r
+#define GLEE_H_DEFINED_glGetColorTableParameterfvSGI\r
+  typedef void (APIENTRYP GLEEPFNGLGETCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLGETCOLORTABLEPARAMETERFVSGIPROC GLeeFuncPtr_glGetColorTableParameterfvSGI;\r
+  #define glGetColorTableParameterfvSGI GLeeFuncPtr_glGetColorTableParameterfvSGI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetColorTableParameterivSGI\r
+#define GLEE_H_DEFINED_glGetColorTableParameterivSGI\r
+  typedef void (APIENTRYP GLEEPFNGLGETCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETCOLORTABLEPARAMETERIVSGIPROC GLeeFuncPtr_glGetColorTableParameterivSGI;\r
+  #define glGetColorTableParameterivSGI GLeeFuncPtr_glGetColorTableParameterivSGI\r
+#endif\r
+#endif \r
+\r
+/* GL_SGIS_pixel_texture */\r
+\r
+#ifndef GL_SGIS_pixel_texture\r
+#define GL_SGIS_pixel_texture 1\r
+#define __GLEE_GL_SGIS_pixel_texture 1\r
+/* Constants */\r
+#define GL_PIXEL_TEXTURE_SGIS                              0x8353\r
+#define GL_PIXEL_FRAGMENT_RGB_SOURCE_SGIS                  0x8354\r
+#define GL_PIXEL_FRAGMENT_ALPHA_SOURCE_SGIS                0x8355\r
+#define GL_PIXEL_GROUP_COLOR_SGIS                          0x8356\r
+#ifndef GLEE_H_DEFINED_glPixelTexGenParameteriSGIS\r
+#define GLEE_H_DEFINED_glPixelTexGenParameteriSGIS\r
+  typedef void (APIENTRYP GLEEPFNGLPIXELTEXGENPARAMETERISGISPROC) (GLenum pname, GLint param);\r
+  GLEE_EXTERN GLEEPFNGLPIXELTEXGENPARAMETERISGISPROC GLeeFuncPtr_glPixelTexGenParameteriSGIS;\r
+  #define glPixelTexGenParameteriSGIS GLeeFuncPtr_glPixelTexGenParameteriSGIS\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glPixelTexGenParameterivSGIS\r
+#define GLEE_H_DEFINED_glPixelTexGenParameterivSGIS\r
+  typedef void (APIENTRYP GLEEPFNGLPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, const GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLPIXELTEXGENPARAMETERIVSGISPROC GLeeFuncPtr_glPixelTexGenParameterivSGIS;\r
+  #define glPixelTexGenParameterivSGIS GLeeFuncPtr_glPixelTexGenParameterivSGIS\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glPixelTexGenParameterfSGIS\r
+#define GLEE_H_DEFINED_glPixelTexGenParameterfSGIS\r
+  typedef void (APIENTRYP GLEEPFNGLPIXELTEXGENPARAMETERFSGISPROC) (GLenum pname, GLfloat param);\r
+  GLEE_EXTERN GLEEPFNGLPIXELTEXGENPARAMETERFSGISPROC GLeeFuncPtr_glPixelTexGenParameterfSGIS;\r
+  #define glPixelTexGenParameterfSGIS GLeeFuncPtr_glPixelTexGenParameterfSGIS\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glPixelTexGenParameterfvSGIS\r
+#define GLEE_H_DEFINED_glPixelTexGenParameterfvSGIS\r
+  typedef void (APIENTRYP GLEEPFNGLPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, const GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLPIXELTEXGENPARAMETERFVSGISPROC GLeeFuncPtr_glPixelTexGenParameterfvSGIS;\r
+  #define glPixelTexGenParameterfvSGIS GLeeFuncPtr_glPixelTexGenParameterfvSGIS\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetPixelTexGenParameterivSGIS\r
+#define GLEE_H_DEFINED_glGetPixelTexGenParameterivSGIS\r
+  typedef void (APIENTRYP GLEEPFNGLGETPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETPIXELTEXGENPARAMETERIVSGISPROC GLeeFuncPtr_glGetPixelTexGenParameterivSGIS;\r
+  #define glGetPixelTexGenParameterivSGIS GLeeFuncPtr_glGetPixelTexGenParameterivSGIS\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetPixelTexGenParameterfvSGIS\r
+#define GLEE_H_DEFINED_glGetPixelTexGenParameterfvSGIS\r
+  typedef void (APIENTRYP GLEEPFNGLGETPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLGETPIXELTEXGENPARAMETERFVSGISPROC GLeeFuncPtr_glGetPixelTexGenParameterfvSGIS;\r
+  #define glGetPixelTexGenParameterfvSGIS GLeeFuncPtr_glGetPixelTexGenParameterfvSGIS\r
+#endif\r
+#endif \r
+\r
+/* GL_SGIX_pixel_texture */\r
+\r
+#ifndef GL_SGIX_pixel_texture\r
+#define GL_SGIX_pixel_texture 1\r
+#define __GLEE_GL_SGIX_pixel_texture 1\r
+/* Constants */\r
+#define GL_PIXEL_TEX_GEN_SGIX                              0x8139\r
+#define GL_PIXEL_TEX_GEN_MODE_SGIX                         0x832B\r
+#ifndef GLEE_H_DEFINED_glPixelTexGenSGIX\r
+#define GLEE_H_DEFINED_glPixelTexGenSGIX\r
+  typedef void (APIENTRYP GLEEPFNGLPIXELTEXGENSGIXPROC) (GLenum mode);\r
+  GLEE_EXTERN GLEEPFNGLPIXELTEXGENSGIXPROC GLeeFuncPtr_glPixelTexGenSGIX;\r
+  #define glPixelTexGenSGIX GLeeFuncPtr_glPixelTexGenSGIX\r
+#endif\r
+#endif \r
+\r
+/* GL_SGIS_texture4D */\r
+\r
+#ifndef GL_SGIS_texture4D\r
+#define GL_SGIS_texture4D 1\r
+#define __GLEE_GL_SGIS_texture4D 1\r
+/* Constants */\r
+#define GL_PACK_SKIP_VOLUMES_SGIS                          0x8130\r
+#define GL_PACK_IMAGE_DEPTH_SGIS                           0x8131\r
+#define GL_UNPACK_SKIP_VOLUMES_SGIS                        0x8132\r
+#define GL_UNPACK_IMAGE_DEPTH_SGIS                         0x8133\r
+#define GL_TEXTURE_4D_SGIS                                 0x8134\r
+#define GL_PROXY_TEXTURE_4D_SGIS                           0x8135\r
+#define GL_TEXTURE_4DSIZE_SGIS                             0x8136\r
+#define GL_TEXTURE_WRAP_Q_SGIS                             0x8137\r
+#define GL_MAX_4D_TEXTURE_SIZE_SGIS                        0x8138\r
+#define GL_TEXTURE_4D_BINDING_SGIS                         0x814F\r
+#ifndef GLEE_H_DEFINED_glTexImage4DSGIS\r
+#define GLEE_H_DEFINED_glTexImage4DSGIS\r
+  typedef void (APIENTRYP GLEEPFNGLTEXIMAGE4DSGISPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLint border, GLenum format, GLenum type, const GLvoid * pixels);\r
+  GLEE_EXTERN GLEEPFNGLTEXIMAGE4DSGISPROC GLeeFuncPtr_glTexImage4DSGIS;\r
+  #define glTexImage4DSGIS GLeeFuncPtr_glTexImage4DSGIS\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTexSubImage4DSGIS\r
+#define GLEE_H_DEFINED_glTexSubImage4DSGIS\r
+  typedef void (APIENTRYP GLEEPFNGLTEXSUBIMAGE4DSGISPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLenum format, GLenum type, const GLvoid * pixels);\r
+  GLEE_EXTERN GLEEPFNGLTEXSUBIMAGE4DSGISPROC GLeeFuncPtr_glTexSubImage4DSGIS;\r
+  #define glTexSubImage4DSGIS GLeeFuncPtr_glTexSubImage4DSGIS\r
+#endif\r
+#endif \r
+\r
+/* GL_SGI_texture_color_table */\r
+\r
+#ifndef GL_SGI_texture_color_table\r
+#define GL_SGI_texture_color_table 1\r
+#define __GLEE_GL_SGI_texture_color_table 1\r
+/* Constants */\r
+#define GL_TEXTURE_COLOR_TABLE_SGI                         0x80BC\r
+#define GL_PROXY_TEXTURE_COLOR_TABLE_SGI                   0x80BD\r
+#endif \r
+\r
+/* GL_EXT_cmyka */\r
+\r
+#ifndef GL_EXT_cmyka\r
+#define GL_EXT_cmyka 1\r
+#define __GLEE_GL_EXT_cmyka 1\r
+/* Constants */\r
+#define GL_CMYK_EXT                                        0x800C\r
+#define GL_CMYKA_EXT                                       0x800D\r
+#define GL_PACK_CMYK_HINT_EXT                              0x800E\r
+#define GL_UNPACK_CMYK_HINT_EXT                            0x800F\r
+#endif \r
+\r
+/* GL_EXT_texture_object */\r
+\r
+#ifndef GL_EXT_texture_object\r
+#define GL_EXT_texture_object 1\r
+#define __GLEE_GL_EXT_texture_object 1\r
+/* Constants */\r
+#define GL_TEXTURE_PRIORITY_EXT                            0x8066\r
+#define GL_TEXTURE_RESIDENT_EXT                            0x8067\r
+#define GL_TEXTURE_1D_BINDING_EXT                          0x8068\r
+#define GL_TEXTURE_2D_BINDING_EXT                          0x8069\r
+#define GL_TEXTURE_3D_BINDING_EXT                          0x806A\r
+#ifndef GLEE_H_DEFINED_glAreTexturesResidentEXT\r
+#define GLEE_H_DEFINED_glAreTexturesResidentEXT\r
+  typedef GLboolean (APIENTRYP GLEEPFNGLARETEXTURESRESIDENTEXTPROC) (GLsizei n, const GLuint * textures, GLboolean * residences);\r
+  GLEE_EXTERN GLEEPFNGLARETEXTURESRESIDENTEXTPROC GLeeFuncPtr_glAreTexturesResidentEXT;\r
+  #define glAreTexturesResidentEXT GLeeFuncPtr_glAreTexturesResidentEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glBindTextureEXT\r
+#define GLEE_H_DEFINED_glBindTextureEXT\r
+  typedef void (APIENTRYP GLEEPFNGLBINDTEXTUREEXTPROC) (GLenum target, GLuint texture);\r
+  GLEE_EXTERN GLEEPFNGLBINDTEXTUREEXTPROC GLeeFuncPtr_glBindTextureEXT;\r
+  #define glBindTextureEXT GLeeFuncPtr_glBindTextureEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glDeleteTexturesEXT\r
+#define GLEE_H_DEFINED_glDeleteTexturesEXT\r
+  typedef void (APIENTRYP GLEEPFNGLDELETETEXTURESEXTPROC) (GLsizei n, const GLuint * textures);\r
+  GLEE_EXTERN GLEEPFNGLDELETETEXTURESEXTPROC GLeeFuncPtr_glDeleteTexturesEXT;\r
+  #define glDeleteTexturesEXT GLeeFuncPtr_glDeleteTexturesEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGenTexturesEXT\r
+#define GLEE_H_DEFINED_glGenTexturesEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGENTEXTURESEXTPROC) (GLsizei n, GLuint * textures);\r
+  GLEE_EXTERN GLEEPFNGLGENTEXTURESEXTPROC GLeeFuncPtr_glGenTexturesEXT;\r
+  #define glGenTexturesEXT GLeeFuncPtr_glGenTexturesEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glIsTextureEXT\r
+#define GLEE_H_DEFINED_glIsTextureEXT\r
+  typedef GLboolean (APIENTRYP GLEEPFNGLISTEXTUREEXTPROC) (GLuint texture);\r
+  GLEE_EXTERN GLEEPFNGLISTEXTUREEXTPROC GLeeFuncPtr_glIsTextureEXT;\r
+  #define glIsTextureEXT GLeeFuncPtr_glIsTextureEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glPrioritizeTexturesEXT\r
+#define GLEE_H_DEFINED_glPrioritizeTexturesEXT\r
+  typedef void (APIENTRYP GLEEPFNGLPRIORITIZETEXTURESEXTPROC) (GLsizei n, const GLuint * textures, const GLclampf * priorities);\r
+  GLEE_EXTERN GLEEPFNGLPRIORITIZETEXTURESEXTPROC GLeeFuncPtr_glPrioritizeTexturesEXT;\r
+  #define glPrioritizeTexturesEXT GLeeFuncPtr_glPrioritizeTexturesEXT\r
+#endif\r
+#endif \r
+\r
+/* GL_SGIS_detail_texture */\r
+\r
+#ifndef GL_SGIS_detail_texture\r
+#define GL_SGIS_detail_texture 1\r
+#define __GLEE_GL_SGIS_detail_texture 1\r
+/* Constants */\r
+#define GL_DETAIL_TEXTURE_2D_SGIS                          0x8095\r
+#define GL_DETAIL_TEXTURE_2D_BINDING_SGIS                  0x8096\r
+#define GL_LINEAR_DETAIL_SGIS                              0x8097\r
+#define GL_LINEAR_DETAIL_ALPHA_SGIS                        0x8098\r
+#define GL_LINEAR_DETAIL_COLOR_SGIS                        0x8099\r
+#define GL_DETAIL_TEXTURE_LEVEL_SGIS                       0x809A\r
+#define GL_DETAIL_TEXTURE_MODE_SGIS                        0x809B\r
+#define GL_DETAIL_TEXTURE_FUNC_POINTS_SGIS                 0x809C\r
+#ifndef GLEE_H_DEFINED_glDetailTexFuncSGIS\r
+#define GLEE_H_DEFINED_glDetailTexFuncSGIS\r
+  typedef void (APIENTRYP GLEEPFNGLDETAILTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat * points);\r
+  GLEE_EXTERN GLEEPFNGLDETAILTEXFUNCSGISPROC GLeeFuncPtr_glDetailTexFuncSGIS;\r
+  #define glDetailTexFuncSGIS GLeeFuncPtr_glDetailTexFuncSGIS\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetDetailTexFuncSGIS\r
+#define GLEE_H_DEFINED_glGetDetailTexFuncSGIS\r
+  typedef void (APIENTRYP GLEEPFNGLGETDETAILTEXFUNCSGISPROC) (GLenum target, GLfloat * points);\r
+  GLEE_EXTERN GLEEPFNGLGETDETAILTEXFUNCSGISPROC GLeeFuncPtr_glGetDetailTexFuncSGIS;\r
+  #define glGetDetailTexFuncSGIS GLeeFuncPtr_glGetDetailTexFuncSGIS\r
+#endif\r
+#endif \r
+\r
+/* GL_SGIS_sharpen_texture */\r
+\r
+#ifndef GL_SGIS_sharpen_texture\r
+#define GL_SGIS_sharpen_texture 1\r
+#define __GLEE_GL_SGIS_sharpen_texture 1\r
+/* Constants */\r
+#define GL_LINEAR_SHARPEN_SGIS                             0x80AD\r
+#define GL_LINEAR_SHARPEN_ALPHA_SGIS                       0x80AE\r
+#define GL_LINEAR_SHARPEN_COLOR_SGIS                       0x80AF\r
+#define GL_SHARPEN_TEXTURE_FUNC_POINTS_SGIS                0x80B0\r
+#ifndef GLEE_H_DEFINED_glSharpenTexFuncSGIS\r
+#define GLEE_H_DEFINED_glSharpenTexFuncSGIS\r
+  typedef void (APIENTRYP GLEEPFNGLSHARPENTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat * points);\r
+  GLEE_EXTERN GLEEPFNGLSHARPENTEXFUNCSGISPROC GLeeFuncPtr_glSharpenTexFuncSGIS;\r
+  #define glSharpenTexFuncSGIS GLeeFuncPtr_glSharpenTexFuncSGIS\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetSharpenTexFuncSGIS\r
+#define GLEE_H_DEFINED_glGetSharpenTexFuncSGIS\r
+  typedef void (APIENTRYP GLEEPFNGLGETSHARPENTEXFUNCSGISPROC) (GLenum target, GLfloat * points);\r
+  GLEE_EXTERN GLEEPFNGLGETSHARPENTEXFUNCSGISPROC GLeeFuncPtr_glGetSharpenTexFuncSGIS;\r
+  #define glGetSharpenTexFuncSGIS GLeeFuncPtr_glGetSharpenTexFuncSGIS\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_packed_pixels */\r
+\r
+#ifndef GL_EXT_packed_pixels\r
+#define GL_EXT_packed_pixels 1\r
+#define __GLEE_GL_EXT_packed_pixels 1\r
+/* Constants */\r
+#define GL_UNSIGNED_BYTE_3_3_2_EXT                         0x8032\r
+#define GL_UNSIGNED_SHORT_4_4_4_4_EXT                      0x8033\r
+#define GL_UNSIGNED_SHORT_5_5_5_1_EXT                      0x8034\r
+#define GL_UNSIGNED_INT_8_8_8_8_EXT                        0x8035\r
+#define GL_UNSIGNED_INT_10_10_10_2_EXT                     0x8036\r
+#endif \r
+\r
+/* GL_SGIS_texture_lod */\r
+\r
+#ifndef GL_SGIS_texture_lod\r
+#define GL_SGIS_texture_lod 1\r
+#define __GLEE_GL_SGIS_texture_lod 1\r
+/* Constants */\r
+#define GL_TEXTURE_MIN_LOD_SGIS                            0x813A\r
+#define GL_TEXTURE_MAX_LOD_SGIS                            0x813B\r
+#define GL_TEXTURE_BASE_LEVEL_SGIS                         0x813C\r
+#define GL_TEXTURE_MAX_LEVEL_SGIS                          0x813D\r
+#endif \r
+\r
+/* GL_SGIS_multisample */\r
+\r
+#ifndef GL_SGIS_multisample\r
+#define GL_SGIS_multisample 1\r
+#define __GLEE_GL_SGIS_multisample 1\r
+/* Constants */\r
+#define GL_MULTISAMPLE_SGIS                                0x809D\r
+#define GL_SAMPLE_ALPHA_TO_MASK_SGIS                       0x809E\r
+#define GL_SAMPLE_ALPHA_TO_ONE_SGIS                        0x809F\r
+#define GL_SAMPLE_MASK_SGIS                                0x80A0\r
+#define GL_1PASS_SGIS                                      0x80A1\r
+#define GL_2PASS_0_SGIS                                    0x80A2\r
+#define GL_2PASS_1_SGIS                                    0x80A3\r
+#define GL_4PASS_0_SGIS                                    0x80A4\r
+#define GL_4PASS_1_SGIS                                    0x80A5\r
+#define GL_4PASS_2_SGIS                                    0x80A6\r
+#define GL_4PASS_3_SGIS                                    0x80A7\r
+#define GL_SAMPLE_BUFFERS_SGIS                             0x80A8\r
+#define GL_SAMPLES_SGIS                                    0x80A9\r
+#define GL_SAMPLE_MASK_VALUE_SGIS                          0x80AA\r
+#define GL_SAMPLE_MASK_INVERT_SGIS                         0x80AB\r
+#define GL_SAMPLE_PATTERN_SGIS                             0x80AC\r
+#ifndef GLEE_H_DEFINED_glSampleMaskSGIS\r
+#define GLEE_H_DEFINED_glSampleMaskSGIS\r
+  typedef void (APIENTRYP GLEEPFNGLSAMPLEMASKSGISPROC) (GLclampf value, GLboolean invert);\r
+  GLEE_EXTERN GLEEPFNGLSAMPLEMASKSGISPROC GLeeFuncPtr_glSampleMaskSGIS;\r
+  #define glSampleMaskSGIS GLeeFuncPtr_glSampleMaskSGIS\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glSamplePatternSGIS\r
+#define GLEE_H_DEFINED_glSamplePatternSGIS\r
+  typedef void (APIENTRYP GLEEPFNGLSAMPLEPATTERNSGISPROC) (GLenum pattern);\r
+  GLEE_EXTERN GLEEPFNGLSAMPLEPATTERNSGISPROC GLeeFuncPtr_glSamplePatternSGIS;\r
+  #define glSamplePatternSGIS GLeeFuncPtr_glSamplePatternSGIS\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_rescale_normal */\r
+\r
+#ifndef GL_EXT_rescale_normal\r
+#define GL_EXT_rescale_normal 1\r
+#define __GLEE_GL_EXT_rescale_normal 1\r
+/* Constants */\r
+#define GL_RESCALE_NORMAL_EXT                              0x803A\r
+#endif \r
+\r
+/* GL_EXT_vertex_array */\r
+\r
+#ifndef GL_EXT_vertex_array\r
+#define GL_EXT_vertex_array 1\r
+#define __GLEE_GL_EXT_vertex_array 1\r
+/* Constants */\r
+#define GL_VERTEX_ARRAY_EXT                                0x8074\r
+#define GL_NORMAL_ARRAY_EXT                                0x8075\r
+#define GL_COLOR_ARRAY_EXT                                 0x8076\r
+#define GL_INDEX_ARRAY_EXT                                 0x8077\r
+#define GL_TEXTURE_COORD_ARRAY_EXT                         0x8078\r
+#define GL_EDGE_FLAG_ARRAY_EXT                             0x8079\r
+#define GL_VERTEX_ARRAY_SIZE_EXT                           0x807A\r
+#define GL_VERTEX_ARRAY_TYPE_EXT                           0x807B\r
+#define GL_VERTEX_ARRAY_STRIDE_EXT                         0x807C\r
+#define GL_VERTEX_ARRAY_COUNT_EXT                          0x807D\r
+#define GL_NORMAL_ARRAY_TYPE_EXT                           0x807E\r
+#define GL_NORMAL_ARRAY_STRIDE_EXT                         0x807F\r
+#define GL_NORMAL_ARRAY_COUNT_EXT                          0x8080\r
+#define GL_COLOR_ARRAY_SIZE_EXT                            0x8081\r
+#define GL_COLOR_ARRAY_TYPE_EXT                            0x8082\r
+#define GL_COLOR_ARRAY_STRIDE_EXT                          0x8083\r
+#define GL_COLOR_ARRAY_COUNT_EXT                           0x8084\r
+#define GL_INDEX_ARRAY_TYPE_EXT                            0x8085\r
+#define GL_INDEX_ARRAY_STRIDE_EXT                          0x8086\r
+#define GL_INDEX_ARRAY_COUNT_EXT                           0x8087\r
+#define GL_TEXTURE_COORD_ARRAY_SIZE_EXT                    0x8088\r
+#define GL_TEXTURE_COORD_ARRAY_TYPE_EXT                    0x8089\r
+#define GL_TEXTURE_COORD_ARRAY_STRIDE_EXT                  0x808A\r
+#define GL_TEXTURE_COORD_ARRAY_COUNT_EXT                   0x808B\r
+#define GL_EDGE_FLAG_ARRAY_STRIDE_EXT                      0x808C\r
+#define GL_EDGE_FLAG_ARRAY_COUNT_EXT                       0x808D\r
+#define GL_VERTEX_ARRAY_POINTER_EXT                        0x808E\r
+#define GL_NORMAL_ARRAY_POINTER_EXT                        0x808F\r
+#define GL_COLOR_ARRAY_POINTER_EXT                         0x8090\r
+#define GL_INDEX_ARRAY_POINTER_EXT                         0x8091\r
+#define GL_TEXTURE_COORD_ARRAY_POINTER_EXT                 0x8092\r
+#define GL_EDGE_FLAG_ARRAY_POINTER_EXT                     0x8093\r
+#ifndef GLEE_H_DEFINED_glArrayElementEXT\r
+#define GLEE_H_DEFINED_glArrayElementEXT\r
+  typedef void (APIENTRYP GLEEPFNGLARRAYELEMENTEXTPROC) (GLint i);\r
+  GLEE_EXTERN GLEEPFNGLARRAYELEMENTEXTPROC GLeeFuncPtr_glArrayElementEXT;\r
+  #define glArrayElementEXT GLeeFuncPtr_glArrayElementEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glColorPointerEXT\r
+#define GLEE_H_DEFINED_glColorPointerEXT\r
+  typedef void (APIENTRYP GLEEPFNGLCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid * pointer);\r
+  GLEE_EXTERN GLEEPFNGLCOLORPOINTEREXTPROC GLeeFuncPtr_glColorPointerEXT;\r
+  #define glColorPointerEXT GLeeFuncPtr_glColorPointerEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glDrawArraysEXT\r
+#define GLEE_H_DEFINED_glDrawArraysEXT\r
+  typedef void (APIENTRYP GLEEPFNGLDRAWARRAYSEXTPROC) (GLenum mode, GLint first, GLsizei count);\r
+  GLEE_EXTERN GLEEPFNGLDRAWARRAYSEXTPROC GLeeFuncPtr_glDrawArraysEXT;\r
+  #define glDrawArraysEXT GLeeFuncPtr_glDrawArraysEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glEdgeFlagPointerEXT\r
+#define GLEE_H_DEFINED_glEdgeFlagPointerEXT\r
+  typedef void (APIENTRYP GLEEPFNGLEDGEFLAGPOINTEREXTPROC) (GLsizei stride, GLsizei count, const GLboolean * pointer);\r
+  GLEE_EXTERN GLEEPFNGLEDGEFLAGPOINTEREXTPROC GLeeFuncPtr_glEdgeFlagPointerEXT;\r
+  #define glEdgeFlagPointerEXT GLeeFuncPtr_glEdgeFlagPointerEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetPointervEXT\r
+#define GLEE_H_DEFINED_glGetPointervEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETPOINTERVEXTPROC) (GLenum pname, GLvoid* * params);\r
+  GLEE_EXTERN GLEEPFNGLGETPOINTERVEXTPROC GLeeFuncPtr_glGetPointervEXT;\r
+  #define glGetPointervEXT GLeeFuncPtr_glGetPointervEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glIndexPointerEXT\r
+#define GLEE_H_DEFINED_glIndexPointerEXT\r
+  typedef void (APIENTRYP GLEEPFNGLINDEXPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const GLvoid * pointer);\r
+  GLEE_EXTERN GLEEPFNGLINDEXPOINTEREXTPROC GLeeFuncPtr_glIndexPointerEXT;\r
+  #define glIndexPointerEXT GLeeFuncPtr_glIndexPointerEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glNormalPointerEXT\r
+#define GLEE_H_DEFINED_glNormalPointerEXT\r
+  typedef void (APIENTRYP GLEEPFNGLNORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const GLvoid * pointer);\r
+  GLEE_EXTERN GLEEPFNGLNORMALPOINTEREXTPROC GLeeFuncPtr_glNormalPointerEXT;\r
+  #define glNormalPointerEXT GLeeFuncPtr_glNormalPointerEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTexCoordPointerEXT\r
+#define GLEE_H_DEFINED_glTexCoordPointerEXT\r
+  typedef void (APIENTRYP GLEEPFNGLTEXCOORDPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid * pointer);\r
+  GLEE_EXTERN GLEEPFNGLTEXCOORDPOINTEREXTPROC GLeeFuncPtr_glTexCoordPointerEXT;\r
+  #define glTexCoordPointerEXT GLeeFuncPtr_glTexCoordPointerEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexPointerEXT\r
+#define GLEE_H_DEFINED_glVertexPointerEXT\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid * pointer);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXPOINTEREXTPROC GLeeFuncPtr_glVertexPointerEXT;\r
+  #define glVertexPointerEXT GLeeFuncPtr_glVertexPointerEXT\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_misc_attribute */\r
+\r
+#ifndef GL_EXT_misc_attribute\r
+#define GL_EXT_misc_attribute 1\r
+#define __GLEE_GL_EXT_misc_attribute 1\r
+/* Constants */\r
+#endif \r
+\r
+/* GL_SGIS_generate_mipmap */\r
+\r
+#ifndef GL_SGIS_generate_mipmap\r
+#define GL_SGIS_generate_mipmap 1\r
+#define __GLEE_GL_SGIS_generate_mipmap 1\r
+/* Constants */\r
+#define GL_GENERATE_MIPMAP_SGIS                            0x8191\r
+#define GL_GENERATE_MIPMAP_HINT_SGIS                       0x8192\r
+#endif \r
+\r
+/* GL_SGIX_clipmap */\r
+\r
+#ifndef GL_SGIX_clipmap\r
+#define GL_SGIX_clipmap 1\r
+#define __GLEE_GL_SGIX_clipmap 1\r
+/* Constants */\r
+#define GL_LINEAR_CLIPMAP_LINEAR_SGIX                      0x8170\r
+#define GL_TEXTURE_CLIPMAP_CENTER_SGIX                     0x8171\r
+#define GL_TEXTURE_CLIPMAP_FRAME_SGIX                      0x8172\r
+#define GL_TEXTURE_CLIPMAP_OFFSET_SGIX                     0x8173\r
+#define GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX              0x8174\r
+#define GL_TEXTURE_CLIPMAP_LOD_OFFSET_SGIX                 0x8175\r
+#define GL_TEXTURE_CLIPMAP_DEPTH_SGIX                      0x8176\r
+#define GL_MAX_CLIPMAP_DEPTH_SGIX                          0x8177\r
+#define GL_MAX_CLIPMAP_VIRTUAL_DEPTH_SGIX                  0x8178\r
+#define GL_NEAREST_CLIPMAP_NEAREST_SGIX                    0x844D\r
+#define GL_NEAREST_CLIPMAP_LINEAR_SGIX                     0x844E\r
+#define GL_LINEAR_CLIPMAP_NEAREST_SGIX                     0x844F\r
+#endif \r
+\r
+/* GL_SGIX_shadow */\r
+\r
+#ifndef GL_SGIX_shadow\r
+#define GL_SGIX_shadow 1\r
+#define __GLEE_GL_SGIX_shadow 1\r
+/* Constants */\r
+#define GL_TEXTURE_COMPARE_SGIX                            0x819A\r
+#define GL_TEXTURE_COMPARE_OPERATOR_SGIX                   0x819B\r
+#define GL_TEXTURE_LEQUAL_R_SGIX                           0x819C\r
+#define GL_TEXTURE_GEQUAL_R_SGIX                           0x819D\r
+#endif \r
+\r
+/* GL_SGIS_texture_edge_clamp */\r
+\r
+#ifndef GL_SGIS_texture_edge_clamp\r
+#define GL_SGIS_texture_edge_clamp 1\r
+#define __GLEE_GL_SGIS_texture_edge_clamp 1\r
+/* Constants */\r
+#define GL_CLAMP_TO_EDGE_SGIS                              0x812F\r
+#endif \r
+\r
+/* GL_SGIS_texture_border_clamp */\r
+\r
+#ifndef GL_SGIS_texture_border_clamp\r
+#define GL_SGIS_texture_border_clamp 1\r
+#define __GLEE_GL_SGIS_texture_border_clamp 1\r
+/* Constants */\r
+#define GL_CLAMP_TO_BORDER_SGIS                            0x812D\r
+#endif \r
+\r
+/* GL_EXT_blend_minmax */\r
+\r
+#ifndef GL_EXT_blend_minmax\r
+#define GL_EXT_blend_minmax 1\r
+#define __GLEE_GL_EXT_blend_minmax 1\r
+/* Constants */\r
+#define GL_FUNC_ADD_EXT                                    0x8006\r
+#define GL_MIN_EXT                                         0x8007\r
+#define GL_MAX_EXT                                         0x8008\r
+#define GL_BLEND_EQUATION_EXT                              0x8009\r
+#ifndef GLEE_H_DEFINED_glBlendEquationEXT\r
+#define GLEE_H_DEFINED_glBlendEquationEXT\r
+  typedef void (APIENTRYP GLEEPFNGLBLENDEQUATIONEXTPROC) (GLenum mode);\r
+  GLEE_EXTERN GLEEPFNGLBLENDEQUATIONEXTPROC GLeeFuncPtr_glBlendEquationEXT;\r
+  #define glBlendEquationEXT GLeeFuncPtr_glBlendEquationEXT\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_blend_subtract */\r
+\r
+#ifndef GL_EXT_blend_subtract\r
+#define GL_EXT_blend_subtract 1\r
+#define __GLEE_GL_EXT_blend_subtract 1\r
+/* Constants */\r
+#define GL_FUNC_SUBTRACT_EXT                               0x800A\r
+#define GL_FUNC_REVERSE_SUBTRACT_EXT                       0x800B\r
+#endif \r
+\r
+/* GL_EXT_blend_logic_op */\r
+\r
+#ifndef GL_EXT_blend_logic_op\r
+#define GL_EXT_blend_logic_op 1\r
+#define __GLEE_GL_EXT_blend_logic_op 1\r
+/* Constants */\r
+#endif \r
+\r
+/* GL_SGIX_interlace */\r
+\r
+#ifndef GL_SGIX_interlace\r
+#define GL_SGIX_interlace 1\r
+#define __GLEE_GL_SGIX_interlace 1\r
+/* Constants */\r
+#define GL_INTERLACE_SGIX                                  0x8094\r
+#endif \r
+\r
+/* GL_SGIX_pixel_tiles */\r
+\r
+#ifndef GL_SGIX_pixel_tiles\r
+#define GL_SGIX_pixel_tiles 1\r
+#define __GLEE_GL_SGIX_pixel_tiles 1\r
+/* Constants */\r
+#define GL_PIXEL_TILE_BEST_ALIGNMENT_SGIX                  0x813E\r
+#define GL_PIXEL_TILE_CACHE_INCREMENT_SGIX                 0x813F\r
+#define GL_PIXEL_TILE_WIDTH_SGIX                           0x8140\r
+#define GL_PIXEL_TILE_HEIGHT_SGIX                          0x8141\r
+#define GL_PIXEL_TILE_GRID_WIDTH_SGIX                      0x8142\r
+#define GL_PIXEL_TILE_GRID_HEIGHT_SGIX                     0x8143\r
+#define GL_PIXEL_TILE_GRID_DEPTH_SGIX                      0x8144\r
+#define GL_PIXEL_TILE_CACHE_SIZE_SGIX                      0x8145\r
+#endif \r
+\r
+/* GL_SGIS_texture_select */\r
+\r
+#ifndef GL_SGIS_texture_select\r
+#define GL_SGIS_texture_select 1\r
+#define __GLEE_GL_SGIS_texture_select 1\r
+/* Constants */\r
+#define GL_DUAL_ALPHA4_SGIS                                0x8110\r
+#define GL_DUAL_ALPHA8_SGIS                                0x8111\r
+#define GL_DUAL_ALPHA12_SGIS                               0x8112\r
+#define GL_DUAL_ALPHA16_SGIS                               0x8113\r
+#define GL_DUAL_LUMINANCE4_SGIS                            0x8114\r
+#define GL_DUAL_LUMINANCE8_SGIS                            0x8115\r
+#define GL_DUAL_LUMINANCE12_SGIS                           0x8116\r
+#define GL_DUAL_LUMINANCE16_SGIS                           0x8117\r
+#define GL_DUAL_INTENSITY4_SGIS                            0x8118\r
+#define GL_DUAL_INTENSITY8_SGIS                            0x8119\r
+#define GL_DUAL_INTENSITY12_SGIS                           0x811A\r
+#define GL_DUAL_INTENSITY16_SGIS                           0x811B\r
+#define GL_DUAL_LUMINANCE_ALPHA4_SGIS                      0x811C\r
+#define GL_DUAL_LUMINANCE_ALPHA8_SGIS                      0x811D\r
+#define GL_QUAD_ALPHA4_SGIS                                0x811E\r
+#define GL_QUAD_ALPHA8_SGIS                                0x811F\r
+#define GL_QUAD_LUMINANCE4_SGIS                            0x8120\r
+#define GL_QUAD_LUMINANCE8_SGIS                            0x8121\r
+#define GL_QUAD_INTENSITY4_SGIS                            0x8122\r
+#define GL_QUAD_INTENSITY8_SGIS                            0x8123\r
+#define GL_DUAL_TEXTURE_SELECT_SGIS                        0x8124\r
+#define GL_QUAD_TEXTURE_SELECT_SGIS                        0x8125\r
+#endif \r
+\r
+/* GL_SGIX_sprite */\r
+\r
+#ifndef GL_SGIX_sprite\r
+#define GL_SGIX_sprite 1\r
+#define __GLEE_GL_SGIX_sprite 1\r
+/* Constants */\r
+#define GL_SPRITE_SGIX                                     0x8148\r
+#define GL_SPRITE_MODE_SGIX                                0x8149\r
+#define GL_SPRITE_AXIS_SGIX                                0x814A\r
+#define GL_SPRITE_TRANSLATION_SGIX                         0x814B\r
+#define GL_SPRITE_AXIAL_SGIX                               0x814C\r
+#define GL_SPRITE_OBJECT_ALIGNED_SGIX                      0x814D\r
+#define GL_SPRITE_EYE_ALIGNED_SGIX                         0x814E\r
+#ifndef GLEE_H_DEFINED_glSpriteParameterfSGIX\r
+#define GLEE_H_DEFINED_glSpriteParameterfSGIX\r
+  typedef void (APIENTRYP GLEEPFNGLSPRITEPARAMETERFSGIXPROC) (GLenum pname, GLfloat param);\r
+  GLEE_EXTERN GLEEPFNGLSPRITEPARAMETERFSGIXPROC GLeeFuncPtr_glSpriteParameterfSGIX;\r
+  #define glSpriteParameterfSGIX GLeeFuncPtr_glSpriteParameterfSGIX\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glSpriteParameterfvSGIX\r
+#define GLEE_H_DEFINED_glSpriteParameterfvSGIX\r
+  typedef void (APIENTRYP GLEEPFNGLSPRITEPARAMETERFVSGIXPROC) (GLenum pname, const GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLSPRITEPARAMETERFVSGIXPROC GLeeFuncPtr_glSpriteParameterfvSGIX;\r
+  #define glSpriteParameterfvSGIX GLeeFuncPtr_glSpriteParameterfvSGIX\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glSpriteParameteriSGIX\r
+#define GLEE_H_DEFINED_glSpriteParameteriSGIX\r
+  typedef void (APIENTRYP GLEEPFNGLSPRITEPARAMETERISGIXPROC) (GLenum pname, GLint param);\r
+  GLEE_EXTERN GLEEPFNGLSPRITEPARAMETERISGIXPROC GLeeFuncPtr_glSpriteParameteriSGIX;\r
+  #define glSpriteParameteriSGIX GLeeFuncPtr_glSpriteParameteriSGIX\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glSpriteParameterivSGIX\r
+#define GLEE_H_DEFINED_glSpriteParameterivSGIX\r
+  typedef void (APIENTRYP GLEEPFNGLSPRITEPARAMETERIVSGIXPROC) (GLenum pname, const GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLSPRITEPARAMETERIVSGIXPROC GLeeFuncPtr_glSpriteParameterivSGIX;\r
+  #define glSpriteParameterivSGIX GLeeFuncPtr_glSpriteParameterivSGIX\r
+#endif\r
+#endif \r
+\r
+/* GL_SGIX_texture_multi_buffer */\r
+\r
+#ifndef GL_SGIX_texture_multi_buffer\r
+#define GL_SGIX_texture_multi_buffer 1\r
+#define __GLEE_GL_SGIX_texture_multi_buffer 1\r
+/* Constants */\r
+#define GL_TEXTURE_MULTI_BUFFER_HINT_SGIX                  0x812E\r
+#endif \r
+\r
+/* GL_EXT_point_parameters */\r
+\r
+#ifndef GL_EXT_point_parameters\r
+#define GL_EXT_point_parameters 1\r
+#define __GLEE_GL_EXT_point_parameters 1\r
+/* Constants */\r
+#define GL_POINT_SIZE_MIN_EXT                              0x8126\r
+#define GL_POINT_SIZE_MAX_EXT                              0x8127\r
+#define GL_POINT_FADE_THRESHOLD_SIZE_EXT                   0x8128\r
+#define GL_DISTANCE_ATTENUATION_EXT                        0x8129\r
+#ifndef GLEE_H_DEFINED_glPointParameterfEXT\r
+#define GLEE_H_DEFINED_glPointParameterfEXT\r
+  typedef void (APIENTRYP GLEEPFNGLPOINTPARAMETERFEXTPROC) (GLenum pname, GLfloat param);\r
+  GLEE_EXTERN GLEEPFNGLPOINTPARAMETERFEXTPROC GLeeFuncPtr_glPointParameterfEXT;\r
+  #define glPointParameterfEXT GLeeFuncPtr_glPointParameterfEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glPointParameterfvEXT\r
+#define GLEE_H_DEFINED_glPointParameterfvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, const GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLPOINTPARAMETERFVEXTPROC GLeeFuncPtr_glPointParameterfvEXT;\r
+  #define glPointParameterfvEXT GLeeFuncPtr_glPointParameterfvEXT\r
+#endif\r
+#endif \r
+\r
+/* GL_SGIS_point_parameters */\r
+\r
+#ifndef GL_SGIS_point_parameters\r
+#define GL_SGIS_point_parameters 1\r
+#define __GLEE_GL_SGIS_point_parameters 1\r
+/* Constants */\r
+#define GL_POINT_SIZE_MIN_SGIS                             0x8126\r
+#define GL_POINT_SIZE_MAX_SGIS                             0x8127\r
+#define GL_POINT_FADE_THRESHOLD_SIZE_SGIS                  0x8128\r
+#define GL_DISTANCE_ATTENUATION_SGIS                       0x8129\r
+#ifndef GLEE_H_DEFINED_glPointParameterfSGIS\r
+#define GLEE_H_DEFINED_glPointParameterfSGIS\r
+  typedef void (APIENTRYP GLEEPFNGLPOINTPARAMETERFSGISPROC) (GLenum pname, GLfloat param);\r
+  GLEE_EXTERN GLEEPFNGLPOINTPARAMETERFSGISPROC GLeeFuncPtr_glPointParameterfSGIS;\r
+  #define glPointParameterfSGIS GLeeFuncPtr_glPointParameterfSGIS\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glPointParameterfvSGIS\r
+#define GLEE_H_DEFINED_glPointParameterfvSGIS\r
+  typedef void (APIENTRYP GLEEPFNGLPOINTPARAMETERFVSGISPROC) (GLenum pname, const GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLPOINTPARAMETERFVSGISPROC GLeeFuncPtr_glPointParameterfvSGIS;\r
+  #define glPointParameterfvSGIS GLeeFuncPtr_glPointParameterfvSGIS\r
+#endif\r
+#endif \r
+\r
+/* GL_SGIX_instruments */\r
+\r
+#ifndef GL_SGIX_instruments\r
+#define GL_SGIX_instruments 1\r
+#define __GLEE_GL_SGIX_instruments 1\r
+/* Constants */\r
+#define GL_INSTRUMENT_BUFFER_POINTER_SGIX                  0x8180\r
+#define GL_INSTRUMENT_MEASUREMENTS_SGIX                    0x8181\r
+#ifndef GLEE_H_DEFINED_glGetInstrumentsSGIX\r
+#define GLEE_H_DEFINED_glGetInstrumentsSGIX\r
+  typedef GLint (APIENTRYP GLEEPFNGLGETINSTRUMENTSSGIXPROC) ();\r
+  GLEE_EXTERN GLEEPFNGLGETINSTRUMENTSSGIXPROC GLeeFuncPtr_glGetInstrumentsSGIX;\r
+  #define glGetInstrumentsSGIX GLeeFuncPtr_glGetInstrumentsSGIX\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glInstrumentsBufferSGIX\r
+#define GLEE_H_DEFINED_glInstrumentsBufferSGIX\r
+  typedef void (APIENTRYP GLEEPFNGLINSTRUMENTSBUFFERSGIXPROC) (GLsizei size, GLint * buffer);\r
+  GLEE_EXTERN GLEEPFNGLINSTRUMENTSBUFFERSGIXPROC GLeeFuncPtr_glInstrumentsBufferSGIX;\r
+  #define glInstrumentsBufferSGIX GLeeFuncPtr_glInstrumentsBufferSGIX\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glPollInstrumentsSGIX\r
+#define GLEE_H_DEFINED_glPollInstrumentsSGIX\r
+  typedef GLint (APIENTRYP GLEEPFNGLPOLLINSTRUMENTSSGIXPROC) (GLint * marker_p);\r
+  GLEE_EXTERN GLEEPFNGLPOLLINSTRUMENTSSGIXPROC GLeeFuncPtr_glPollInstrumentsSGIX;\r
+  #define glPollInstrumentsSGIX GLeeFuncPtr_glPollInstrumentsSGIX\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glReadInstrumentsSGIX\r
+#define GLEE_H_DEFINED_glReadInstrumentsSGIX\r
+  typedef void (APIENTRYP GLEEPFNGLREADINSTRUMENTSSGIXPROC) (GLint marker);\r
+  GLEE_EXTERN GLEEPFNGLREADINSTRUMENTSSGIXPROC GLeeFuncPtr_glReadInstrumentsSGIX;\r
+  #define glReadInstrumentsSGIX GLeeFuncPtr_glReadInstrumentsSGIX\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glStartInstrumentsSGIX\r
+#define GLEE_H_DEFINED_glStartInstrumentsSGIX\r
+  typedef void (APIENTRYP GLEEPFNGLSTARTINSTRUMENTSSGIXPROC) ();\r
+  GLEE_EXTERN GLEEPFNGLSTARTINSTRUMENTSSGIXPROC GLeeFuncPtr_glStartInstrumentsSGIX;\r
+  #define glStartInstrumentsSGIX GLeeFuncPtr_glStartInstrumentsSGIX\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glStopInstrumentsSGIX\r
+#define GLEE_H_DEFINED_glStopInstrumentsSGIX\r
+  typedef void (APIENTRYP GLEEPFNGLSTOPINSTRUMENTSSGIXPROC) (GLint marker);\r
+  GLEE_EXTERN GLEEPFNGLSTOPINSTRUMENTSSGIXPROC GLeeFuncPtr_glStopInstrumentsSGIX;\r
+  #define glStopInstrumentsSGIX GLeeFuncPtr_glStopInstrumentsSGIX\r
+#endif\r
+#endif \r
+\r
+/* GL_SGIX_texture_scale_bias */\r
+\r
+#ifndef GL_SGIX_texture_scale_bias\r
+#define GL_SGIX_texture_scale_bias 1\r
+#define __GLEE_GL_SGIX_texture_scale_bias 1\r
+/* Constants */\r
+#define GL_POST_TEXTURE_FILTER_BIAS_SGIX                   0x8179\r
+#define GL_POST_TEXTURE_FILTER_SCALE_SGIX                  0x817A\r
+#define GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX             0x817B\r
+#define GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX            0x817C\r
+#endif \r
+\r
+/* GL_SGIX_framezoom */\r
+\r
+#ifndef GL_SGIX_framezoom\r
+#define GL_SGIX_framezoom 1\r
+#define __GLEE_GL_SGIX_framezoom 1\r
+/* Constants */\r
+#define GL_FRAMEZOOM_SGIX                                  0x818B\r
+#define GL_FRAMEZOOM_FACTOR_SGIX                           0x818C\r
+#define GL_MAX_FRAMEZOOM_FACTOR_SGIX                       0x818D\r
+#ifndef GLEE_H_DEFINED_glFrameZoomSGIX\r
+#define GLEE_H_DEFINED_glFrameZoomSGIX\r
+  typedef void (APIENTRYP GLEEPFNGLFRAMEZOOMSGIXPROC) (GLint factor);\r
+  GLEE_EXTERN GLEEPFNGLFRAMEZOOMSGIXPROC GLeeFuncPtr_glFrameZoomSGIX;\r
+  #define glFrameZoomSGIX GLeeFuncPtr_glFrameZoomSGIX\r
+#endif\r
+#endif \r
+\r
+/* GL_SGIX_tag_sample_buffer */\r
+\r
+#ifndef GL_SGIX_tag_sample_buffer\r
+#define GL_SGIX_tag_sample_buffer 1\r
+#define __GLEE_GL_SGIX_tag_sample_buffer 1\r
+/* Constants */\r
+#ifndef GLEE_H_DEFINED_glTagSampleBufferSGIX\r
+#define GLEE_H_DEFINED_glTagSampleBufferSGIX\r
+  typedef void (APIENTRYP GLEEPFNGLTAGSAMPLEBUFFERSGIXPROC) ();\r
+  GLEE_EXTERN GLEEPFNGLTAGSAMPLEBUFFERSGIXPROC GLeeFuncPtr_glTagSampleBufferSGIX;\r
+  #define glTagSampleBufferSGIX GLeeFuncPtr_glTagSampleBufferSGIX\r
+#endif\r
+#endif \r
+\r
+/* GL_FfdMaskSGIX */\r
+\r
+#ifndef GL_FfdMaskSGIX\r
+#define GL_FfdMaskSGIX 1\r
+#define __GLEE_GL_FfdMaskSGIX 1\r
+/* Constants */\r
+#define GL_TEXTURE_DEFORMATION_BIT_SGIX                    0x00000001\r
+#define GL_GEOMETRY_DEFORMATION_BIT_SGIX                   0x00000002\r
+#endif \r
+\r
+/* GL_SGIX_polynomial_ffd */\r
+\r
+#ifndef GL_SGIX_polynomial_ffd\r
+#define GL_SGIX_polynomial_ffd 1\r
+#define __GLEE_GL_SGIX_polynomial_ffd 1\r
+/* Constants */\r
+#define GL_GEOMETRY_DEFORMATION_SGIX                       0x8194\r
+#define GL_TEXTURE_DEFORMATION_SGIX                        0x8195\r
+#define GL_DEFORMATIONS_MASK_SGIX                          0x8196\r
+#define GL_MAX_DEFORMATION_ORDER_SGIX                      0x8197\r
+#ifndef GLEE_H_DEFINED_glDeformationMap3dSGIX\r
+#define GLEE_H_DEFINED_glDeformationMap3dSGIX\r
+  typedef void (APIENTRYP GLEEPFNGLDEFORMATIONMAP3DSGIXPROC) (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, GLdouble w1, GLdouble w2, GLint wstride, GLint worder, const GLdouble * points);\r
+  GLEE_EXTERN GLEEPFNGLDEFORMATIONMAP3DSGIXPROC GLeeFuncPtr_glDeformationMap3dSGIX;\r
+  #define glDeformationMap3dSGIX GLeeFuncPtr_glDeformationMap3dSGIX\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glDeformationMap3fSGIX\r
+#define GLEE_H_DEFINED_glDeformationMap3fSGIX\r
+  typedef void (APIENTRYP GLEEPFNGLDEFORMATIONMAP3FSGIXPROC) (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, GLfloat w1, GLfloat w2, GLint wstride, GLint worder, const GLfloat * points);\r
+  GLEE_EXTERN GLEEPFNGLDEFORMATIONMAP3FSGIXPROC GLeeFuncPtr_glDeformationMap3fSGIX;\r
+  #define glDeformationMap3fSGIX GLeeFuncPtr_glDeformationMap3fSGIX\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glDeformSGIX\r
+#define GLEE_H_DEFINED_glDeformSGIX\r
+  typedef void (APIENTRYP GLEEPFNGLDEFORMSGIXPROC) (GLbitfield mask);\r
+  GLEE_EXTERN GLEEPFNGLDEFORMSGIXPROC GLeeFuncPtr_glDeformSGIX;\r
+  #define glDeformSGIX GLeeFuncPtr_glDeformSGIX\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glLoadIdentityDeformationMapSGIX\r
+#define GLEE_H_DEFINED_glLoadIdentityDeformationMapSGIX\r
+  typedef void (APIENTRYP GLEEPFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC) (GLbitfield mask);\r
+  GLEE_EXTERN GLEEPFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC GLeeFuncPtr_glLoadIdentityDeformationMapSGIX;\r
+  #define glLoadIdentityDeformationMapSGIX GLeeFuncPtr_glLoadIdentityDeformationMapSGIX\r
+#endif\r
+#endif \r
+\r
+/* GL_SGIX_reference_plane */\r
+\r
+#ifndef GL_SGIX_reference_plane\r
+#define GL_SGIX_reference_plane 1\r
+#define __GLEE_GL_SGIX_reference_plane 1\r
+/* Constants */\r
+#define GL_REFERENCE_PLANE_SGIX                            0x817D\r
+#define GL_REFERENCE_PLANE_EQUATION_SGIX                   0x817E\r
+#ifndef GLEE_H_DEFINED_glReferencePlaneSGIX\r
+#define GLEE_H_DEFINED_glReferencePlaneSGIX\r
+  typedef void (APIENTRYP GLEEPFNGLREFERENCEPLANESGIXPROC) (const GLdouble * equation);\r
+  GLEE_EXTERN GLEEPFNGLREFERENCEPLANESGIXPROC GLeeFuncPtr_glReferencePlaneSGIX;\r
+  #define glReferencePlaneSGIX GLeeFuncPtr_glReferencePlaneSGIX\r
+#endif\r
+#endif \r
+\r
+/* GL_SGIX_flush_raster */\r
+\r
+#ifndef GL_SGIX_flush_raster\r
+#define GL_SGIX_flush_raster 1\r
+#define __GLEE_GL_SGIX_flush_raster 1\r
+/* Constants */\r
+#ifndef GLEE_H_DEFINED_glFlushRasterSGIX\r
+#define GLEE_H_DEFINED_glFlushRasterSGIX\r
+  typedef void (APIENTRYP GLEEPFNGLFLUSHRASTERSGIXPROC) ();\r
+  GLEE_EXTERN GLEEPFNGLFLUSHRASTERSGIXPROC GLeeFuncPtr_glFlushRasterSGIX;\r
+  #define glFlushRasterSGIX GLeeFuncPtr_glFlushRasterSGIX\r
+#endif\r
+#endif \r
+\r
+/* GL_SGIX_depth_texture */\r
+\r
+#ifndef GL_SGIX_depth_texture\r
+#define GL_SGIX_depth_texture 1\r
+#define __GLEE_GL_SGIX_depth_texture 1\r
+/* Constants */\r
+#define GL_DEPTH_COMPONENT16_SGIX                          0x81A5\r
+#define GL_DEPTH_COMPONENT24_SGIX                          0x81A6\r
+#define GL_DEPTH_COMPONENT32_SGIX                          0x81A7\r
+#endif \r
+\r
+/* GL_SGIS_fog_function */\r
+\r
+#ifndef GL_SGIS_fog_function\r
+#define GL_SGIS_fog_function 1\r
+#define __GLEE_GL_SGIS_fog_function 1\r
+/* Constants */\r
+#define GL_FOG_FUNC_SGIS                                   0x812A\r
+#define GL_FOG_FUNC_POINTS_SGIS                            0x812B\r
+#define GL_MAX_FOG_FUNC_POINTS_SGIS                        0x812C\r
+#ifndef GLEE_H_DEFINED_glFogFuncSGIS\r
+#define GLEE_H_DEFINED_glFogFuncSGIS\r
+  typedef void (APIENTRYP GLEEPFNGLFOGFUNCSGISPROC) (GLsizei n, const GLfloat * points);\r
+  GLEE_EXTERN GLEEPFNGLFOGFUNCSGISPROC GLeeFuncPtr_glFogFuncSGIS;\r
+  #define glFogFuncSGIS GLeeFuncPtr_glFogFuncSGIS\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetFogFuncSGIS\r
+#define GLEE_H_DEFINED_glGetFogFuncSGIS\r
+  typedef void (APIENTRYP GLEEPFNGLGETFOGFUNCSGISPROC) (GLfloat * points);\r
+  GLEE_EXTERN GLEEPFNGLGETFOGFUNCSGISPROC GLeeFuncPtr_glGetFogFuncSGIS;\r
+  #define glGetFogFuncSGIS GLeeFuncPtr_glGetFogFuncSGIS\r
+#endif\r
+#endif \r
+\r
+/* GL_SGIX_fog_offset */\r
+\r
+#ifndef GL_SGIX_fog_offset\r
+#define GL_SGIX_fog_offset 1\r
+#define __GLEE_GL_SGIX_fog_offset 1\r
+/* Constants */\r
+#define GL_FOG_OFFSET_SGIX                                 0x8198\r
+#define GL_FOG_OFFSET_VALUE_SGIX                           0x8199\r
+#endif \r
+\r
+/* GL_HP_image_transform */\r
+\r
+#ifndef GL_HP_image_transform\r
+#define GL_HP_image_transform 1\r
+#define __GLEE_GL_HP_image_transform 1\r
+/* Constants */\r
+#define GL_IMAGE_SCALE_X_HP                                0x8155\r
+#define GL_IMAGE_SCALE_Y_HP                                0x8156\r
+#define GL_IMAGE_TRANSLATE_X_HP                            0x8157\r
+#define GL_IMAGE_TRANSLATE_Y_HP                            0x8158\r
+#define GL_IMAGE_ROTATE_ANGLE_HP                           0x8159\r
+#define GL_IMAGE_ROTATE_ORIGIN_X_HP                        0x815A\r
+#define GL_IMAGE_ROTATE_ORIGIN_Y_HP                        0x815B\r
+#define GL_IMAGE_MAG_FILTER_HP                             0x815C\r
+#define GL_IMAGE_MIN_FILTER_HP                             0x815D\r
+#define GL_IMAGE_CUBIC_WEIGHT_HP                           0x815E\r
+#define GL_CUBIC_HP                                        0x815F\r
+#define GL_AVERAGE_HP                                      0x8160\r
+#define GL_IMAGE_TRANSFORM_2D_HP                           0x8161\r
+#define GL_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP             0x8162\r
+#define GL_PROXY_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP       0x8163\r
+#ifndef GLEE_H_DEFINED_glImageTransformParameteriHP\r
+#define GLEE_H_DEFINED_glImageTransformParameteriHP\r
+  typedef void (APIENTRYP GLEEPFNGLIMAGETRANSFORMPARAMETERIHPPROC) (GLenum target, GLenum pname, GLint param);\r
+  GLEE_EXTERN GLEEPFNGLIMAGETRANSFORMPARAMETERIHPPROC GLeeFuncPtr_glImageTransformParameteriHP;\r
+  #define glImageTransformParameteriHP GLeeFuncPtr_glImageTransformParameteriHP\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glImageTransformParameterfHP\r
+#define GLEE_H_DEFINED_glImageTransformParameterfHP\r
+  typedef void (APIENTRYP GLEEPFNGLIMAGETRANSFORMPARAMETERFHPPROC) (GLenum target, GLenum pname, GLfloat param);\r
+  GLEE_EXTERN GLEEPFNGLIMAGETRANSFORMPARAMETERFHPPROC GLeeFuncPtr_glImageTransformParameterfHP;\r
+  #define glImageTransformParameterfHP GLeeFuncPtr_glImageTransformParameterfHP\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glImageTransformParameterivHP\r
+#define GLEE_H_DEFINED_glImageTransformParameterivHP\r
+  typedef void (APIENTRYP GLEEPFNGLIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLIMAGETRANSFORMPARAMETERIVHPPROC GLeeFuncPtr_glImageTransformParameterivHP;\r
+  #define glImageTransformParameterivHP GLeeFuncPtr_glImageTransformParameterivHP\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glImageTransformParameterfvHP\r
+#define GLEE_H_DEFINED_glImageTransformParameterfvHP\r
+  typedef void (APIENTRYP GLEEPFNGLIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLIMAGETRANSFORMPARAMETERFVHPPROC GLeeFuncPtr_glImageTransformParameterfvHP;\r
+  #define glImageTransformParameterfvHP GLeeFuncPtr_glImageTransformParameterfvHP\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetImageTransformParameterivHP\r
+#define GLEE_H_DEFINED_glGetImageTransformParameterivHP\r
+  typedef void (APIENTRYP GLEEPFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC GLeeFuncPtr_glGetImageTransformParameterivHP;\r
+  #define glGetImageTransformParameterivHP GLeeFuncPtr_glGetImageTransformParameterivHP\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetImageTransformParameterfvHP\r
+#define GLEE_H_DEFINED_glGetImageTransformParameterfvHP\r
+  typedef void (APIENTRYP GLEEPFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC GLeeFuncPtr_glGetImageTransformParameterfvHP;\r
+  #define glGetImageTransformParameterfvHP GLeeFuncPtr_glGetImageTransformParameterfvHP\r
+#endif\r
+#endif \r
+\r
+/* GL_HP_convolution_border_modes */\r
+\r
+#ifndef GL_HP_convolution_border_modes\r
+#define GL_HP_convolution_border_modes 1\r
+#define __GLEE_GL_HP_convolution_border_modes 1\r
+/* Constants */\r
+#define GL_IGNORE_BORDER_HP                                0x8150\r
+#define GL_CONSTANT_BORDER_HP                              0x8151\r
+#define GL_REPLICATE_BORDER_HP                             0x8153\r
+#define GL_CONVOLUTION_BORDER_COLOR_HP                     0x8154\r
+#endif \r
+\r
+/* GL_INGR_palette_buffer */\r
+\r
+#ifndef GL_INGR_palette_buffer\r
+#define GL_INGR_palette_buffer 1\r
+#define __GLEE_GL_INGR_palette_buffer 1\r
+/* Constants */\r
+#endif \r
+\r
+/* GL_SGIX_texture_add_env */\r
+\r
+#ifndef GL_SGIX_texture_add_env\r
+#define GL_SGIX_texture_add_env 1\r
+#define __GLEE_GL_SGIX_texture_add_env 1\r
+/* Constants */\r
+#define GL_TEXTURE_ENV_BIAS_SGIX                           0x80BE\r
+#endif \r
+\r
+/* GL_EXT_color_subtable */\r
+\r
+#ifndef GL_EXT_color_subtable\r
+#define GL_EXT_color_subtable 1\r
+#define __GLEE_GL_EXT_color_subtable 1\r
+/* Constants */\r
+#ifndef GLEE_H_DEFINED_glColorSubTableEXT\r
+#define GLEE_H_DEFINED_glColorSubTableEXT\r
+  typedef void (APIENTRYP GLEEPFNGLCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid * data);\r
+  GLEE_EXTERN GLEEPFNGLCOLORSUBTABLEEXTPROC GLeeFuncPtr_glColorSubTableEXT;\r
+  #define glColorSubTableEXT GLeeFuncPtr_glColorSubTableEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glCopyColorSubTableEXT\r
+#define GLEE_H_DEFINED_glCopyColorSubTableEXT\r
+  typedef void (APIENTRYP GLEEPFNGLCOPYCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width);\r
+  GLEE_EXTERN GLEEPFNGLCOPYCOLORSUBTABLEEXTPROC GLeeFuncPtr_glCopyColorSubTableEXT;\r
+  #define glCopyColorSubTableEXT GLeeFuncPtr_glCopyColorSubTableEXT\r
+#endif\r
+#endif \r
+\r
+/* GL_PGI_vertex_hints */\r
+\r
+#ifndef GL_PGI_vertex_hints\r
+#define GL_PGI_vertex_hints 1\r
+#define __GLEE_GL_PGI_vertex_hints 1\r
+/* Constants */\r
+#define GL_VERTEX_DATA_HINT_PGI                            0x1A22A\r
+#define GL_VERTEX_CONSISTENT_HINT_PGI                      0x1A22B\r
+#define GL_MATERIAL_SIDE_HINT_PGI                          0x1A22C\r
+#define GL_MAX_VERTEX_HINT_PGI                             0x1A22D\r
+#define GL_COLOR3_BIT_PGI                                  0x00010000\r
+#define GL_COLOR4_BIT_PGI                                  0x00020000\r
+#define GL_EDGEFLAG_BIT_PGI                                0x00040000\r
+#define GL_INDEX_BIT_PGI                                   0x00080000\r
+#define GL_MAT_AMBIENT_BIT_PGI                             0x00100000\r
+#define GL_MAT_AMBIENT_AND_DIFFUSE_BIT_PGI                 0x00200000\r
+#define GL_MAT_DIFFUSE_BIT_PGI                             0x00400000\r
+#define GL_MAT_EMISSION_BIT_PGI                            0x00800000\r
+#define GL_MAT_COLOR_INDEXES_BIT_PGI                       0x01000000\r
+#define GL_MAT_SHININESS_BIT_PGI                           0x02000000\r
+#define GL_MAT_SPECULAR_BIT_PGI                            0x04000000\r
+#define GL_NORMAL_BIT_PGI                                  0x08000000\r
+#define GL_TEXCOORD1_BIT_PGI                               0x10000000\r
+#define GL_TEXCOORD2_BIT_PGI                               0x20000000\r
+#define GL_TEXCOORD3_BIT_PGI                               0x40000000\r
+#define GL_TEXCOORD4_BIT_PGI                               0x80000000\r
+#define GL_VERTEX23_BIT_PGI                                0x00000004\r
+#define GL_VERTEX4_BIT_PGI                                 0x00000008\r
+#endif \r
+\r
+/* GL_PGI_misc_hints */\r
+\r
+#ifndef GL_PGI_misc_hints\r
+#define GL_PGI_misc_hints 1\r
+#define __GLEE_GL_PGI_misc_hints 1\r
+/* Constants */\r
+#define GL_PREFER_DOUBLEBUFFER_HINT_PGI                    0x1A1F8\r
+#define GL_CONSERVE_MEMORY_HINT_PGI                        0x1A1FD\r
+#define GL_RECLAIM_MEMORY_HINT_PGI                         0x1A1FE\r
+#define GL_NATIVE_GRAPHICS_HANDLE_PGI                      0x1A202\r
+#define GL_NATIVE_GRAPHICS_BEGIN_HINT_PGI                  0x1A203\r
+#define GL_NATIVE_GRAPHICS_END_HINT_PGI                    0x1A204\r
+#define GL_ALWAYS_FAST_HINT_PGI                            0x1A20C\r
+#define GL_ALWAYS_SOFT_HINT_PGI                            0x1A20D\r
+#define GL_ALLOW_DRAW_OBJ_HINT_PGI                         0x1A20E\r
+#define GL_ALLOW_DRAW_WIN_HINT_PGI                         0x1A20F\r
+#define GL_ALLOW_DRAW_FRG_HINT_PGI                         0x1A210\r
+#define GL_ALLOW_DRAW_MEM_HINT_PGI                         0x1A211\r
+#define GL_STRICT_DEPTHFUNC_HINT_PGI                       0x1A216\r
+#define GL_STRICT_LIGHTING_HINT_PGI                        0x1A217\r
+#define GL_STRICT_SCISSOR_HINT_PGI                         0x1A218\r
+#define GL_FULL_STIPPLE_HINT_PGI                           0x1A219\r
+#define GL_CLIP_NEAR_HINT_PGI                              0x1A220\r
+#define GL_CLIP_FAR_HINT_PGI                               0x1A221\r
+#define GL_WIDE_LINE_HINT_PGI                              0x1A222\r
+#define GL_BACK_NORMALS_HINT_PGI                           0x1A223\r
+#ifndef GLEE_H_DEFINED_glHintPGI\r
+#define GLEE_H_DEFINED_glHintPGI\r
+  typedef void (APIENTRYP GLEEPFNGLHINTPGIPROC) (GLenum target, GLint mode);\r
+  GLEE_EXTERN GLEEPFNGLHINTPGIPROC GLeeFuncPtr_glHintPGI;\r
+  #define glHintPGI GLeeFuncPtr_glHintPGI\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_paletted_texture */\r
+\r
+#ifndef GL_EXT_paletted_texture\r
+#define GL_EXT_paletted_texture 1\r
+#define __GLEE_GL_EXT_paletted_texture 1\r
+/* Constants */\r
+#define GL_COLOR_INDEX1_EXT                                0x80E2\r
+#define GL_COLOR_INDEX2_EXT                                0x80E3\r
+#define GL_COLOR_INDEX4_EXT                                0x80E4\r
+#define GL_COLOR_INDEX8_EXT                                0x80E5\r
+#define GL_COLOR_INDEX12_EXT                               0x80E6\r
+#define GL_COLOR_INDEX16_EXT                               0x80E7\r
+#define GL_TEXTURE_INDEX_SIZE_EXT                          0x80ED\r
+#ifndef GLEE_H_DEFINED_glColorTableEXT\r
+#define GLEE_H_DEFINED_glColorTableEXT\r
+  typedef void (APIENTRYP GLEEPFNGLCOLORTABLEEXTPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const GLvoid * table);\r
+  GLEE_EXTERN GLEEPFNGLCOLORTABLEEXTPROC GLeeFuncPtr_glColorTableEXT;\r
+  #define glColorTableEXT GLeeFuncPtr_glColorTableEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetColorTableEXT\r
+#define GLEE_H_DEFINED_glGetColorTableEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETCOLORTABLEEXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid * data);\r
+  GLEE_EXTERN GLEEPFNGLGETCOLORTABLEEXTPROC GLeeFuncPtr_glGetColorTableEXT;\r
+  #define glGetColorTableEXT GLeeFuncPtr_glGetColorTableEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetColorTableParameterivEXT\r
+#define GLEE_H_DEFINED_glGetColorTableParameterivEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETCOLORTABLEPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETCOLORTABLEPARAMETERIVEXTPROC GLeeFuncPtr_glGetColorTableParameterivEXT;\r
+  #define glGetColorTableParameterivEXT GLeeFuncPtr_glGetColorTableParameterivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetColorTableParameterfvEXT\r
+#define GLEE_H_DEFINED_glGetColorTableParameterfvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETCOLORTABLEPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLGETCOLORTABLEPARAMETERFVEXTPROC GLeeFuncPtr_glGetColorTableParameterfvEXT;\r
+  #define glGetColorTableParameterfvEXT GLeeFuncPtr_glGetColorTableParameterfvEXT\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_clip_volume_hint */\r
+\r
+#ifndef GL_EXT_clip_volume_hint\r
+#define GL_EXT_clip_volume_hint 1\r
+#define __GLEE_GL_EXT_clip_volume_hint 1\r
+/* Constants */\r
+#define GL_CLIP_VOLUME_CLIPPING_HINT_EXT                   0x80F0\r
+#endif \r
+\r
+/* GL_SGIX_list_priority */\r
+\r
+#ifndef GL_SGIX_list_priority\r
+#define GL_SGIX_list_priority 1\r
+#define __GLEE_GL_SGIX_list_priority 1\r
+/* Constants */\r
+#define GL_LIST_PRIORITY_SGIX                              0x8182\r
+#ifndef GLEE_H_DEFINED_glGetListParameterfvSGIX\r
+#define GLEE_H_DEFINED_glGetListParameterfvSGIX\r
+  typedef void (APIENTRYP GLEEPFNGLGETLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLGETLISTPARAMETERFVSGIXPROC GLeeFuncPtr_glGetListParameterfvSGIX;\r
+  #define glGetListParameterfvSGIX GLeeFuncPtr_glGetListParameterfvSGIX\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetListParameterivSGIX\r
+#define GLEE_H_DEFINED_glGetListParameterivSGIX\r
+  typedef void (APIENTRYP GLEEPFNGLGETLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETLISTPARAMETERIVSGIXPROC GLeeFuncPtr_glGetListParameterivSGIX;\r
+  #define glGetListParameterivSGIX GLeeFuncPtr_glGetListParameterivSGIX\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glListParameterfSGIX\r
+#define GLEE_H_DEFINED_glListParameterfSGIX\r
+  typedef void (APIENTRYP GLEEPFNGLLISTPARAMETERFSGIXPROC) (GLuint list, GLenum pname, GLfloat param);\r
+  GLEE_EXTERN GLEEPFNGLLISTPARAMETERFSGIXPROC GLeeFuncPtr_glListParameterfSGIX;\r
+  #define glListParameterfSGIX GLeeFuncPtr_glListParameterfSGIX\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glListParameterfvSGIX\r
+#define GLEE_H_DEFINED_glListParameterfvSGIX\r
+  typedef void (APIENTRYP GLEEPFNGLLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, const GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLLISTPARAMETERFVSGIXPROC GLeeFuncPtr_glListParameterfvSGIX;\r
+  #define glListParameterfvSGIX GLeeFuncPtr_glListParameterfvSGIX\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glListParameteriSGIX\r
+#define GLEE_H_DEFINED_glListParameteriSGIX\r
+  typedef void (APIENTRYP GLEEPFNGLLISTPARAMETERISGIXPROC) (GLuint list, GLenum pname, GLint param);\r
+  GLEE_EXTERN GLEEPFNGLLISTPARAMETERISGIXPROC GLeeFuncPtr_glListParameteriSGIX;\r
+  #define glListParameteriSGIX GLeeFuncPtr_glListParameteriSGIX\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glListParameterivSGIX\r
+#define GLEE_H_DEFINED_glListParameterivSGIX\r
+  typedef void (APIENTRYP GLEEPFNGLLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, const GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLLISTPARAMETERIVSGIXPROC GLeeFuncPtr_glListParameterivSGIX;\r
+  #define glListParameterivSGIX GLeeFuncPtr_glListParameterivSGIX\r
+#endif\r
+#endif \r
+\r
+/* GL_SGIX_ir_instrument1 */\r
+\r
+#ifndef GL_SGIX_ir_instrument1\r
+#define GL_SGIX_ir_instrument1 1\r
+#define __GLEE_GL_SGIX_ir_instrument1 1\r
+/* Constants */\r
+#define GL_IR_INSTRUMENT1_SGIX                             0x817F\r
+#endif \r
+\r
+/* GL_SGIX_calligraphic_fragment */\r
+\r
+#ifndef GL_SGIX_calligraphic_fragment\r
+#define GL_SGIX_calligraphic_fragment 1\r
+#define __GLEE_GL_SGIX_calligraphic_fragment 1\r
+/* Constants */\r
+#define GL_CALLIGRAPHIC_FRAGMENT_SGIX                      0x8183\r
+#endif \r
+\r
+/* GL_SGIX_texture_lod_bias */\r
+\r
+#ifndef GL_SGIX_texture_lod_bias\r
+#define GL_SGIX_texture_lod_bias 1\r
+#define __GLEE_GL_SGIX_texture_lod_bias 1\r
+/* Constants */\r
+#define GL_TEXTURE_LOD_BIAS_S_SGIX                         0x818E\r
+#define GL_TEXTURE_LOD_BIAS_T_SGIX                         0x818F\r
+#define GL_TEXTURE_LOD_BIAS_R_SGIX                         0x8190\r
+#endif \r
+\r
+/* GL_SGIX_shadow_ambient */\r
+\r
+#ifndef GL_SGIX_shadow_ambient\r
+#define GL_SGIX_shadow_ambient 1\r
+#define __GLEE_GL_SGIX_shadow_ambient 1\r
+/* Constants */\r
+#define GL_SHADOW_AMBIENT_SGIX                             0x80BF\r
+#endif \r
+\r
+/* GL_EXT_index_texture */\r
+\r
+#ifndef GL_EXT_index_texture\r
+#define GL_EXT_index_texture 1\r
+#define __GLEE_GL_EXT_index_texture 1\r
+/* Constants */\r
+#endif \r
+\r
+/* GL_EXT_index_material */\r
+\r
+#ifndef GL_EXT_index_material\r
+#define GL_EXT_index_material 1\r
+#define __GLEE_GL_EXT_index_material 1\r
+/* Constants */\r
+#define GL_INDEX_MATERIAL_EXT                              0x81B8\r
+#define GL_INDEX_MATERIAL_PARAMETER_EXT                    0x81B9\r
+#define GL_INDEX_MATERIAL_FACE_EXT                         0x81BA\r
+#ifndef GLEE_H_DEFINED_glIndexMaterialEXT\r
+#define GLEE_H_DEFINED_glIndexMaterialEXT\r
+  typedef void (APIENTRYP GLEEPFNGLINDEXMATERIALEXTPROC) (GLenum face, GLenum mode);\r
+  GLEE_EXTERN GLEEPFNGLINDEXMATERIALEXTPROC GLeeFuncPtr_glIndexMaterialEXT;\r
+  #define glIndexMaterialEXT GLeeFuncPtr_glIndexMaterialEXT\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_index_func */\r
+\r
+#ifndef GL_EXT_index_func\r
+#define GL_EXT_index_func 1\r
+#define __GLEE_GL_EXT_index_func 1\r
+/* Constants */\r
+#define GL_INDEX_TEST_EXT                                  0x81B5\r
+#define GL_INDEX_TEST_FUNC_EXT                             0x81B6\r
+#define GL_INDEX_TEST_REF_EXT                              0x81B7\r
+#ifndef GLEE_H_DEFINED_glIndexFuncEXT\r
+#define GLEE_H_DEFINED_glIndexFuncEXT\r
+  typedef void (APIENTRYP GLEEPFNGLINDEXFUNCEXTPROC) (GLenum func, GLclampf ref);\r
+  GLEE_EXTERN GLEEPFNGLINDEXFUNCEXTPROC GLeeFuncPtr_glIndexFuncEXT;\r
+  #define glIndexFuncEXT GLeeFuncPtr_glIndexFuncEXT\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_index_array_formats */\r
+\r
+#ifndef GL_EXT_index_array_formats\r
+#define GL_EXT_index_array_formats 1\r
+#define __GLEE_GL_EXT_index_array_formats 1\r
+/* Constants */\r
+#define GL_IUI_V2F_EXT                                     0x81AD\r
+#define GL_IUI_V3F_EXT                                     0x81AE\r
+#define GL_IUI_N3F_V2F_EXT                                 0x81AF\r
+#define GL_IUI_N3F_V3F_EXT                                 0x81B0\r
+#define GL_T2F_IUI_V2F_EXT                                 0x81B1\r
+#define GL_T2F_IUI_V3F_EXT                                 0x81B2\r
+#define GL_T2F_IUI_N3F_V2F_EXT                             0x81B3\r
+#define GL_T2F_IUI_N3F_V3F_EXT                             0x81B4\r
+#endif \r
+\r
+/* GL_EXT_compiled_vertex_array */\r
+\r
+#ifndef GL_EXT_compiled_vertex_array\r
+#define GL_EXT_compiled_vertex_array 1\r
+#define __GLEE_GL_EXT_compiled_vertex_array 1\r
+/* Constants */\r
+#define GL_ARRAY_ELEMENT_LOCK_FIRST_EXT                    0x81A8\r
+#define GL_ARRAY_ELEMENT_LOCK_COUNT_EXT                    0x81A9\r
+#ifndef GLEE_H_DEFINED_glLockArraysEXT\r
+#define GLEE_H_DEFINED_glLockArraysEXT\r
+  typedef void (APIENTRYP GLEEPFNGLLOCKARRAYSEXTPROC) (GLint first, GLsizei count);\r
+  GLEE_EXTERN GLEEPFNGLLOCKARRAYSEXTPROC GLeeFuncPtr_glLockArraysEXT;\r
+  #define glLockArraysEXT GLeeFuncPtr_glLockArraysEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUnlockArraysEXT\r
+#define GLEE_H_DEFINED_glUnlockArraysEXT\r
+  typedef void (APIENTRYP GLEEPFNGLUNLOCKARRAYSEXTPROC) ();\r
+  GLEE_EXTERN GLEEPFNGLUNLOCKARRAYSEXTPROC GLeeFuncPtr_glUnlockArraysEXT;\r
+  #define glUnlockArraysEXT GLeeFuncPtr_glUnlockArraysEXT\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_cull_vertex */\r
+\r
+#ifndef GL_EXT_cull_vertex\r
+#define GL_EXT_cull_vertex 1\r
+#define __GLEE_GL_EXT_cull_vertex 1\r
+/* Constants */\r
+#define GL_CULL_VERTEX_EXT                                 0x81AA\r
+#define GL_CULL_VERTEX_EYE_POSITION_EXT                    0x81AB\r
+#define GL_CULL_VERTEX_OBJECT_POSITION_EXT                 0x81AC\r
+#ifndef GLEE_H_DEFINED_glCullParameterdvEXT\r
+#define GLEE_H_DEFINED_glCullParameterdvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLCULLPARAMETERDVEXTPROC) (GLenum pname, GLdouble * params);\r
+  GLEE_EXTERN GLEEPFNGLCULLPARAMETERDVEXTPROC GLeeFuncPtr_glCullParameterdvEXT;\r
+  #define glCullParameterdvEXT GLeeFuncPtr_glCullParameterdvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glCullParameterfvEXT\r
+#define GLEE_H_DEFINED_glCullParameterfvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLCULLPARAMETERFVEXTPROC) (GLenum pname, GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLCULLPARAMETERFVEXTPROC GLeeFuncPtr_glCullParameterfvEXT;\r
+  #define glCullParameterfvEXT GLeeFuncPtr_glCullParameterfvEXT\r
+#endif\r
+#endif \r
+\r
+/* GL_SGIX_ycrcb */\r
+\r
+#ifndef GL_SGIX_ycrcb\r
+#define GL_SGIX_ycrcb 1\r
+#define __GLEE_GL_SGIX_ycrcb 1\r
+/* Constants */\r
+#define GL_YCRCB_422_SGIX                                  0x81BB\r
+#define GL_YCRCB_444_SGIX                                  0x81BC\r
+#endif \r
+\r
+/* GL_SGIX_fragment_lighting */\r
+\r
+#ifndef GL_SGIX_fragment_lighting\r
+#define GL_SGIX_fragment_lighting 1\r
+#define __GLEE_GL_SGIX_fragment_lighting 1\r
+/* Constants */\r
+#define GL_FRAGMENT_LIGHTING_SGIX                          0x8400\r
+#define GL_FRAGMENT_COLOR_MATERIAL_SGIX                    0x8401\r
+#define GL_FRAGMENT_COLOR_MATERIAL_FACE_SGIX               0x8402\r
+#define GL_FRAGMENT_COLOR_MATERIAL_PARAMETER_SGIX          0x8403\r
+#define GL_MAX_FRAGMENT_LIGHTS_SGIX                        0x8404\r
+#define GL_MAX_ACTIVE_LIGHTS_SGIX                          0x8405\r
+#define GL_CURRENT_RASTER_NORMAL_SGIX                      0x8406\r
+#define GL_LIGHT_ENV_MODE_SGIX                             0x8407\r
+#define GL_FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_SGIX          0x8408\r
+#define GL_FRAGMENT_LIGHT_MODEL_TWO_SIDE_SGIX              0x8409\r
+#define GL_FRAGMENT_LIGHT_MODEL_AMBIENT_SGIX               0x840A\r
+#define GL_FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_SGIX  0x840B\r
+#define GL_FRAGMENT_LIGHT0_SGIX                            0x840C\r
+#define GL_FRAGMENT_LIGHT1_SGIX                            0x840D\r
+#define GL_FRAGMENT_LIGHT2_SGIX                            0x840E\r
+#define GL_FRAGMENT_LIGHT3_SGIX                            0x840F\r
+#define GL_FRAGMENT_LIGHT4_SGIX                            0x8410\r
+#define GL_FRAGMENT_LIGHT5_SGIX                            0x8411\r
+#define GL_FRAGMENT_LIGHT6_SGIX                            0x8412\r
+#define GL_FRAGMENT_LIGHT7_SGIX                            0x8413\r
+#ifndef GLEE_H_DEFINED_glFragmentColorMaterialSGIX\r
+#define GLEE_H_DEFINED_glFragmentColorMaterialSGIX\r
+  typedef void (APIENTRYP GLEEPFNGLFRAGMENTCOLORMATERIALSGIXPROC) (GLenum face, GLenum mode);\r
+  GLEE_EXTERN GLEEPFNGLFRAGMENTCOLORMATERIALSGIXPROC GLeeFuncPtr_glFragmentColorMaterialSGIX;\r
+  #define glFragmentColorMaterialSGIX GLeeFuncPtr_glFragmentColorMaterialSGIX\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFragmentLightfSGIX\r
+#define GLEE_H_DEFINED_glFragmentLightfSGIX\r
+  typedef void (APIENTRYP GLEEPFNGLFRAGMENTLIGHTFSGIXPROC) (GLenum light, GLenum pname, GLfloat param);\r
+  GLEE_EXTERN GLEEPFNGLFRAGMENTLIGHTFSGIXPROC GLeeFuncPtr_glFragmentLightfSGIX;\r
+  #define glFragmentLightfSGIX GLeeFuncPtr_glFragmentLightfSGIX\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFragmentLightfvSGIX\r
+#define GLEE_H_DEFINED_glFragmentLightfvSGIX\r
+  typedef void (APIENTRYP GLEEPFNGLFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, const GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLFRAGMENTLIGHTFVSGIXPROC GLeeFuncPtr_glFragmentLightfvSGIX;\r
+  #define glFragmentLightfvSGIX GLeeFuncPtr_glFragmentLightfvSGIX\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFragmentLightiSGIX\r
+#define GLEE_H_DEFINED_glFragmentLightiSGIX\r
+  typedef void (APIENTRYP GLEEPFNGLFRAGMENTLIGHTISGIXPROC) (GLenum light, GLenum pname, GLint param);\r
+  GLEE_EXTERN GLEEPFNGLFRAGMENTLIGHTISGIXPROC GLeeFuncPtr_glFragmentLightiSGIX;\r
+  #define glFragmentLightiSGIX GLeeFuncPtr_glFragmentLightiSGIX\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFragmentLightivSGIX\r
+#define GLEE_H_DEFINED_glFragmentLightivSGIX\r
+  typedef void (APIENTRYP GLEEPFNGLFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, const GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLFRAGMENTLIGHTIVSGIXPROC GLeeFuncPtr_glFragmentLightivSGIX;\r
+  #define glFragmentLightivSGIX GLeeFuncPtr_glFragmentLightivSGIX\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFragmentLightModelfSGIX\r
+#define GLEE_H_DEFINED_glFragmentLightModelfSGIX\r
+  typedef void (APIENTRYP GLEEPFNGLFRAGMENTLIGHTMODELFSGIXPROC) (GLenum pname, GLfloat param);\r
+  GLEE_EXTERN GLEEPFNGLFRAGMENTLIGHTMODELFSGIXPROC GLeeFuncPtr_glFragmentLightModelfSGIX;\r
+  #define glFragmentLightModelfSGIX GLeeFuncPtr_glFragmentLightModelfSGIX\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFragmentLightModelfvSGIX\r
+#define GLEE_H_DEFINED_glFragmentLightModelfvSGIX\r
+  typedef void (APIENTRYP GLEEPFNGLFRAGMENTLIGHTMODELFVSGIXPROC) (GLenum pname, const GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLFRAGMENTLIGHTMODELFVSGIXPROC GLeeFuncPtr_glFragmentLightModelfvSGIX;\r
+  #define glFragmentLightModelfvSGIX GLeeFuncPtr_glFragmentLightModelfvSGIX\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFragmentLightModeliSGIX\r
+#define GLEE_H_DEFINED_glFragmentLightModeliSGIX\r
+  typedef void (APIENTRYP GLEEPFNGLFRAGMENTLIGHTMODELISGIXPROC) (GLenum pname, GLint param);\r
+  GLEE_EXTERN GLEEPFNGLFRAGMENTLIGHTMODELISGIXPROC GLeeFuncPtr_glFragmentLightModeliSGIX;\r
+  #define glFragmentLightModeliSGIX GLeeFuncPtr_glFragmentLightModeliSGIX\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFragmentLightModelivSGIX\r
+#define GLEE_H_DEFINED_glFragmentLightModelivSGIX\r
+  typedef void (APIENTRYP GLEEPFNGLFRAGMENTLIGHTMODELIVSGIXPROC) (GLenum pname, const GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLFRAGMENTLIGHTMODELIVSGIXPROC GLeeFuncPtr_glFragmentLightModelivSGIX;\r
+  #define glFragmentLightModelivSGIX GLeeFuncPtr_glFragmentLightModelivSGIX\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFragmentMaterialfSGIX\r
+#define GLEE_H_DEFINED_glFragmentMaterialfSGIX\r
+  typedef void (APIENTRYP GLEEPFNGLFRAGMENTMATERIALFSGIXPROC) (GLenum face, GLenum pname, GLfloat param);\r
+  GLEE_EXTERN GLEEPFNGLFRAGMENTMATERIALFSGIXPROC GLeeFuncPtr_glFragmentMaterialfSGIX;\r
+  #define glFragmentMaterialfSGIX GLeeFuncPtr_glFragmentMaterialfSGIX\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFragmentMaterialfvSGIX\r
+#define GLEE_H_DEFINED_glFragmentMaterialfvSGIX\r
+  typedef void (APIENTRYP GLEEPFNGLFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLFRAGMENTMATERIALFVSGIXPROC GLeeFuncPtr_glFragmentMaterialfvSGIX;\r
+  #define glFragmentMaterialfvSGIX GLeeFuncPtr_glFragmentMaterialfvSGIX\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFragmentMaterialiSGIX\r
+#define GLEE_H_DEFINED_glFragmentMaterialiSGIX\r
+  typedef void (APIENTRYP GLEEPFNGLFRAGMENTMATERIALISGIXPROC) (GLenum face, GLenum pname, GLint param);\r
+  GLEE_EXTERN GLEEPFNGLFRAGMENTMATERIALISGIXPROC GLeeFuncPtr_glFragmentMaterialiSGIX;\r
+  #define glFragmentMaterialiSGIX GLeeFuncPtr_glFragmentMaterialiSGIX\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFragmentMaterialivSGIX\r
+#define GLEE_H_DEFINED_glFragmentMaterialivSGIX\r
+  typedef void (APIENTRYP GLEEPFNGLFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLFRAGMENTMATERIALIVSGIXPROC GLeeFuncPtr_glFragmentMaterialivSGIX;\r
+  #define glFragmentMaterialivSGIX GLeeFuncPtr_glFragmentMaterialivSGIX\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetFragmentLightfvSGIX\r
+#define GLEE_H_DEFINED_glGetFragmentLightfvSGIX\r
+  typedef void (APIENTRYP GLEEPFNGLGETFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLGETFRAGMENTLIGHTFVSGIXPROC GLeeFuncPtr_glGetFragmentLightfvSGIX;\r
+  #define glGetFragmentLightfvSGIX GLeeFuncPtr_glGetFragmentLightfvSGIX\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetFragmentLightivSGIX\r
+#define GLEE_H_DEFINED_glGetFragmentLightivSGIX\r
+  typedef void (APIENTRYP GLEEPFNGLGETFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETFRAGMENTLIGHTIVSGIXPROC GLeeFuncPtr_glGetFragmentLightivSGIX;\r
+  #define glGetFragmentLightivSGIX GLeeFuncPtr_glGetFragmentLightivSGIX\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetFragmentMaterialfvSGIX\r
+#define GLEE_H_DEFINED_glGetFragmentMaterialfvSGIX\r
+  typedef void (APIENTRYP GLEEPFNGLGETFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLGETFRAGMENTMATERIALFVSGIXPROC GLeeFuncPtr_glGetFragmentMaterialfvSGIX;\r
+  #define glGetFragmentMaterialfvSGIX GLeeFuncPtr_glGetFragmentMaterialfvSGIX\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetFragmentMaterialivSGIX\r
+#define GLEE_H_DEFINED_glGetFragmentMaterialivSGIX\r
+  typedef void (APIENTRYP GLEEPFNGLGETFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETFRAGMENTMATERIALIVSGIXPROC GLeeFuncPtr_glGetFragmentMaterialivSGIX;\r
+  #define glGetFragmentMaterialivSGIX GLeeFuncPtr_glGetFragmentMaterialivSGIX\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glLightEnviSGIX\r
+#define GLEE_H_DEFINED_glLightEnviSGIX\r
+  typedef void (APIENTRYP GLEEPFNGLLIGHTENVISGIXPROC) (GLenum pname, GLint param);\r
+  GLEE_EXTERN GLEEPFNGLLIGHTENVISGIXPROC GLeeFuncPtr_glLightEnviSGIX;\r
+  #define glLightEnviSGIX GLeeFuncPtr_glLightEnviSGIX\r
+#endif\r
+#endif \r
+\r
+/* GL_IBM_rasterpos_clip */\r
+\r
+#ifndef GL_IBM_rasterpos_clip\r
+#define GL_IBM_rasterpos_clip 1\r
+#define __GLEE_GL_IBM_rasterpos_clip 1\r
+/* Constants */\r
+#define GL_RASTER_POSITION_UNCLIPPED_IBM                   0x19262\r
+#endif \r
+\r
+/* GL_HP_texture_lighting */\r
+\r
+#ifndef GL_HP_texture_lighting\r
+#define GL_HP_texture_lighting 1\r
+#define __GLEE_GL_HP_texture_lighting 1\r
+/* Constants */\r
+#define GL_TEXTURE_LIGHTING_MODE_HP                        0x8167\r
+#define GL_TEXTURE_POST_SPECULAR_HP                        0x8168\r
+#define GL_TEXTURE_PRE_SPECULAR_HP                         0x8169\r
+#endif \r
+\r
+/* GL_EXT_draw_range_elements */\r
+\r
+#ifndef GL_EXT_draw_range_elements\r
+#define GL_EXT_draw_range_elements 1\r
+#define __GLEE_GL_EXT_draw_range_elements 1\r
+/* Constants */\r
+#define GL_MAX_ELEMENTS_VERTICES_EXT                       0x80E8\r
+#define GL_MAX_ELEMENTS_INDICES_EXT                        0x80E9\r
+#ifndef GLEE_H_DEFINED_glDrawRangeElementsEXT\r
+#define GLEE_H_DEFINED_glDrawRangeElementsEXT\r
+  typedef void (APIENTRYP GLEEPFNGLDRAWRANGEELEMENTSEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid * indices);\r
+  GLEE_EXTERN GLEEPFNGLDRAWRANGEELEMENTSEXTPROC GLeeFuncPtr_glDrawRangeElementsEXT;\r
+  #define glDrawRangeElementsEXT GLeeFuncPtr_glDrawRangeElementsEXT\r
+#endif\r
+#endif \r
+\r
+/* GL_WIN_phong_shading */\r
+\r
+#ifndef GL_WIN_phong_shading\r
+#define GL_WIN_phong_shading 1\r
+#define __GLEE_GL_WIN_phong_shading 1\r
+/* Constants */\r
+#define GL_PHONG_WIN                                       0x80EA\r
+#define GL_PHONG_HINT_WIN                                  0x80EB\r
+#endif \r
+\r
+/* GL_WIN_specular_fog */\r
+\r
+#ifndef GL_WIN_specular_fog\r
+#define GL_WIN_specular_fog 1\r
+#define __GLEE_GL_WIN_specular_fog 1\r
+/* Constants */\r
+#define GL_FOG_SPECULAR_TEXTURE_WIN                        0x80EC\r
+#endif \r
+\r
+/* GL_EXT_light_texture */\r
+\r
+#ifndef GL_EXT_light_texture\r
+#define GL_EXT_light_texture 1\r
+#define __GLEE_GL_EXT_light_texture 1\r
+/* Constants */\r
+#define GL_FRAGMENT_MATERIAL_EXT                           0x8349\r
+#define GL_FRAGMENT_NORMAL_EXT                             0x834A\r
+#define GL_FRAGMENT_COLOR_EXT                              0x834C\r
+#define GL_ATTENUATION_EXT                                 0x834D\r
+#define GL_SHADOW_ATTENUATION_EXT                          0x834E\r
+#define GL_TEXTURE_APPLICATION_MODE_EXT                    0x834F\r
+#define GL_TEXTURE_LIGHT_EXT                               0x8350\r
+#define GL_TEXTURE_MATERIAL_FACE_EXT                       0x8351\r
+#define GL_TEXTURE_MATERIAL_PARAMETER_EXT                  0x8352\r
+#ifndef GLEE_H_DEFINED_glApplyTextureEXT\r
+#define GLEE_H_DEFINED_glApplyTextureEXT\r
+  typedef void (APIENTRYP GLEEPFNGLAPPLYTEXTUREEXTPROC) (GLenum mode);\r
+  GLEE_EXTERN GLEEPFNGLAPPLYTEXTUREEXTPROC GLeeFuncPtr_glApplyTextureEXT;\r
+  #define glApplyTextureEXT GLeeFuncPtr_glApplyTextureEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTextureLightEXT\r
+#define GLEE_H_DEFINED_glTextureLightEXT\r
+  typedef void (APIENTRYP GLEEPFNGLTEXTURELIGHTEXTPROC) (GLenum pname);\r
+  GLEE_EXTERN GLEEPFNGLTEXTURELIGHTEXTPROC GLeeFuncPtr_glTextureLightEXT;\r
+  #define glTextureLightEXT GLeeFuncPtr_glTextureLightEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTextureMaterialEXT\r
+#define GLEE_H_DEFINED_glTextureMaterialEXT\r
+  typedef void (APIENTRYP GLEEPFNGLTEXTUREMATERIALEXTPROC) (GLenum face, GLenum mode);\r
+  GLEE_EXTERN GLEEPFNGLTEXTUREMATERIALEXTPROC GLeeFuncPtr_glTextureMaterialEXT;\r
+  #define glTextureMaterialEXT GLeeFuncPtr_glTextureMaterialEXT\r
+#endif\r
+#endif \r
+\r
+/* GL_SGIX_blend_alpha_minmax */\r
+\r
+#ifndef GL_SGIX_blend_alpha_minmax\r
+#define GL_SGIX_blend_alpha_minmax 1\r
+#define __GLEE_GL_SGIX_blend_alpha_minmax 1\r
+/* Constants */\r
+#define GL_ALPHA_MIN_SGIX                                  0x8320\r
+#define GL_ALPHA_MAX_SGIX                                  0x8321\r
+#endif \r
+\r
+/* GL_SGIX_impact_pixel_texture */\r
+\r
+#ifndef GL_SGIX_impact_pixel_texture\r
+#define GL_SGIX_impact_pixel_texture 1\r
+#define __GLEE_GL_SGIX_impact_pixel_texture 1\r
+/* Constants */\r
+#define GL_PIXEL_TEX_GEN_Q_CEILING_SGIX                    0x8184\r
+#define GL_PIXEL_TEX_GEN_Q_ROUND_SGIX                      0x8185\r
+#define GL_PIXEL_TEX_GEN_Q_FLOOR_SGIX                      0x8186\r
+#define GL_PIXEL_TEX_GEN_ALPHA_REPLACE_SGIX                0x8187\r
+#define GL_PIXEL_TEX_GEN_ALPHA_NO_REPLACE_SGIX             0x8188\r
+#define GL_PIXEL_TEX_GEN_ALPHA_LS_SGIX                     0x8189\r
+#define GL_PIXEL_TEX_GEN_ALPHA_MS_SGIX                     0x818A\r
+#endif \r
+\r
+/* GL_EXT_bgra */\r
+\r
+#ifndef GL_EXT_bgra\r
+#define GL_EXT_bgra 1\r
+#define __GLEE_GL_EXT_bgra 1\r
+/* Constants */\r
+#define GL_BGR_EXT                                         0x80E0\r
+#define GL_BGRA_EXT                                        0x80E1\r
+#endif \r
+\r
+/* GL_SGIX_async */\r
+\r
+#ifndef GL_SGIX_async\r
+#define GL_SGIX_async 1\r
+#define __GLEE_GL_SGIX_async 1\r
+/* Constants */\r
+#define GL_ASYNC_MARKER_SGIX                               0x8329\r
+#ifndef GLEE_H_DEFINED_glAsyncMarkerSGIX\r
+#define GLEE_H_DEFINED_glAsyncMarkerSGIX\r
+  typedef void (APIENTRYP GLEEPFNGLASYNCMARKERSGIXPROC) (GLuint marker);\r
+  GLEE_EXTERN GLEEPFNGLASYNCMARKERSGIXPROC GLeeFuncPtr_glAsyncMarkerSGIX;\r
+  #define glAsyncMarkerSGIX GLeeFuncPtr_glAsyncMarkerSGIX\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFinishAsyncSGIX\r
+#define GLEE_H_DEFINED_glFinishAsyncSGIX\r
+  typedef GLint (APIENTRYP GLEEPFNGLFINISHASYNCSGIXPROC) (GLuint * markerp);\r
+  GLEE_EXTERN GLEEPFNGLFINISHASYNCSGIXPROC GLeeFuncPtr_glFinishAsyncSGIX;\r
+  #define glFinishAsyncSGIX GLeeFuncPtr_glFinishAsyncSGIX\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glPollAsyncSGIX\r
+#define GLEE_H_DEFINED_glPollAsyncSGIX\r
+  typedef GLint (APIENTRYP GLEEPFNGLPOLLASYNCSGIXPROC) (GLuint * markerp);\r
+  GLEE_EXTERN GLEEPFNGLPOLLASYNCSGIXPROC GLeeFuncPtr_glPollAsyncSGIX;\r
+  #define glPollAsyncSGIX GLeeFuncPtr_glPollAsyncSGIX\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGenAsyncMarkersSGIX\r
+#define GLEE_H_DEFINED_glGenAsyncMarkersSGIX\r
+  typedef GLuint (APIENTRYP GLEEPFNGLGENASYNCMARKERSSGIXPROC) (GLsizei range);\r
+  GLEE_EXTERN GLEEPFNGLGENASYNCMARKERSSGIXPROC GLeeFuncPtr_glGenAsyncMarkersSGIX;\r
+  #define glGenAsyncMarkersSGIX GLeeFuncPtr_glGenAsyncMarkersSGIX\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glDeleteAsyncMarkersSGIX\r
+#define GLEE_H_DEFINED_glDeleteAsyncMarkersSGIX\r
+  typedef void (APIENTRYP GLEEPFNGLDELETEASYNCMARKERSSGIXPROC) (GLuint marker, GLsizei range);\r
+  GLEE_EXTERN GLEEPFNGLDELETEASYNCMARKERSSGIXPROC GLeeFuncPtr_glDeleteAsyncMarkersSGIX;\r
+  #define glDeleteAsyncMarkersSGIX GLeeFuncPtr_glDeleteAsyncMarkersSGIX\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glIsAsyncMarkerSGIX\r
+#define GLEE_H_DEFINED_glIsAsyncMarkerSGIX\r
+  typedef GLboolean (APIENTRYP GLEEPFNGLISASYNCMARKERSGIXPROC) (GLuint marker);\r
+  GLEE_EXTERN GLEEPFNGLISASYNCMARKERSGIXPROC GLeeFuncPtr_glIsAsyncMarkerSGIX;\r
+  #define glIsAsyncMarkerSGIX GLeeFuncPtr_glIsAsyncMarkerSGIX\r
+#endif\r
+#endif \r
+\r
+/* GL_SGIX_async_pixel */\r
+\r
+#ifndef GL_SGIX_async_pixel\r
+#define GL_SGIX_async_pixel 1\r
+#define __GLEE_GL_SGIX_async_pixel 1\r
+/* Constants */\r
+#define GL_ASYNC_TEX_IMAGE_SGIX                            0x835C\r
+#define GL_ASYNC_DRAW_PIXELS_SGIX                          0x835D\r
+#define GL_ASYNC_READ_PIXELS_SGIX                          0x835E\r
+#define GL_MAX_ASYNC_TEX_IMAGE_SGIX                        0x835F\r
+#define GL_MAX_ASYNC_DRAW_PIXELS_SGIX                      0x8360\r
+#define GL_MAX_ASYNC_READ_PIXELS_SGIX                      0x8361\r
+#endif \r
+\r
+/* GL_SGIX_async_histogram */\r
+\r
+#ifndef GL_SGIX_async_histogram\r
+#define GL_SGIX_async_histogram 1\r
+#define __GLEE_GL_SGIX_async_histogram 1\r
+/* Constants */\r
+#define GL_ASYNC_HISTOGRAM_SGIX                            0x832C\r
+#define GL_MAX_ASYNC_HISTOGRAM_SGIX                        0x832D\r
+#endif \r
+\r
+/* GL_INTEL_texture_scissor */\r
+\r
+#ifndef GL_INTEL_texture_scissor\r
+#define GL_INTEL_texture_scissor 1\r
+#define __GLEE_GL_INTEL_texture_scissor 1\r
+/* Constants */\r
+#endif \r
+\r
+/* GL_INTEL_parallel_arrays */\r
+\r
+#ifndef GL_INTEL_parallel_arrays\r
+#define GL_INTEL_parallel_arrays 1\r
+#define __GLEE_GL_INTEL_parallel_arrays 1\r
+/* Constants */\r
+#define GL_PARALLEL_ARRAYS_INTEL                           0x83F4\r
+#define GL_VERTEX_ARRAY_PARALLEL_POINTERS_INTEL            0x83F5\r
+#define GL_NORMAL_ARRAY_PARALLEL_POINTERS_INTEL            0x83F6\r
+#define GL_COLOR_ARRAY_PARALLEL_POINTERS_INTEL             0x83F7\r
+#define GL_TEXTURE_COORD_ARRAY_PARALLEL_POINTERS_INTEL     0x83F8\r
+#ifndef GLEE_H_DEFINED_glVertexPointervINTEL\r
+#define GLEE_H_DEFINED_glVertexPointervINTEL\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* * pointer);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXPOINTERVINTELPROC GLeeFuncPtr_glVertexPointervINTEL;\r
+  #define glVertexPointervINTEL GLeeFuncPtr_glVertexPointervINTEL\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glNormalPointervINTEL\r
+#define GLEE_H_DEFINED_glNormalPointervINTEL\r
+  typedef void (APIENTRYP GLEEPFNGLNORMALPOINTERVINTELPROC) (GLenum type, const GLvoid* * pointer);\r
+  GLEE_EXTERN GLEEPFNGLNORMALPOINTERVINTELPROC GLeeFuncPtr_glNormalPointervINTEL;\r
+  #define glNormalPointervINTEL GLeeFuncPtr_glNormalPointervINTEL\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glColorPointervINTEL\r
+#define GLEE_H_DEFINED_glColorPointervINTEL\r
+  typedef void (APIENTRYP GLEEPFNGLCOLORPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* * pointer);\r
+  GLEE_EXTERN GLEEPFNGLCOLORPOINTERVINTELPROC GLeeFuncPtr_glColorPointervINTEL;\r
+  #define glColorPointervINTEL GLeeFuncPtr_glColorPointervINTEL\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTexCoordPointervINTEL\r
+#define GLEE_H_DEFINED_glTexCoordPointervINTEL\r
+  typedef void (APIENTRYP GLEEPFNGLTEXCOORDPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* * pointer);\r
+  GLEE_EXTERN GLEEPFNGLTEXCOORDPOINTERVINTELPROC GLeeFuncPtr_glTexCoordPointervINTEL;\r
+  #define glTexCoordPointervINTEL GLeeFuncPtr_glTexCoordPointervINTEL\r
+#endif\r
+#endif \r
+\r
+/* GL_HP_occlusion_test */\r
+\r
+#ifndef GL_HP_occlusion_test\r
+#define GL_HP_occlusion_test 1\r
+#define __GLEE_GL_HP_occlusion_test 1\r
+/* Constants */\r
+#define GL_OCCLUSION_TEST_HP                               0x8165\r
+#define GL_OCCLUSION_TEST_RESULT_HP                        0x8166\r
+#endif \r
+\r
+/* GL_EXT_pixel_transform */\r
+\r
+#ifndef GL_EXT_pixel_transform\r
+#define GL_EXT_pixel_transform 1\r
+#define __GLEE_GL_EXT_pixel_transform 1\r
+/* Constants */\r
+#define GL_PIXEL_TRANSFORM_2D_EXT                          0x8330\r
+#define GL_PIXEL_MAG_FILTER_EXT                            0x8331\r
+#define GL_PIXEL_MIN_FILTER_EXT                            0x8332\r
+#define GL_PIXEL_CUBIC_WEIGHT_EXT                          0x8333\r
+#define GL_CUBIC_EXT                                       0x8334\r
+#define GL_AVERAGE_EXT                                     0x8335\r
+#define GL_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT              0x8336\r
+#define GL_MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT          0x8337\r
+#define GL_PIXEL_TRANSFORM_2D_MATRIX_EXT                   0x8338\r
+#ifndef GLEE_H_DEFINED_glPixelTransformParameteriEXT\r
+#define GLEE_H_DEFINED_glPixelTransformParameteriEXT\r
+  typedef void (APIENTRYP GLEEPFNGLPIXELTRANSFORMPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint param);\r
+  GLEE_EXTERN GLEEPFNGLPIXELTRANSFORMPARAMETERIEXTPROC GLeeFuncPtr_glPixelTransformParameteriEXT;\r
+  #define glPixelTransformParameteriEXT GLeeFuncPtr_glPixelTransformParameteriEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glPixelTransformParameterfEXT\r
+#define GLEE_H_DEFINED_glPixelTransformParameterfEXT\r
+  typedef void (APIENTRYP GLEEPFNGLPIXELTRANSFORMPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat param);\r
+  GLEE_EXTERN GLEEPFNGLPIXELTRANSFORMPARAMETERFEXTPROC GLeeFuncPtr_glPixelTransformParameterfEXT;\r
+  #define glPixelTransformParameterfEXT GLeeFuncPtr_glPixelTransformParameterfEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glPixelTransformParameterivEXT\r
+#define GLEE_H_DEFINED_glPixelTransformParameterivEXT\r
+  typedef void (APIENTRYP GLEEPFNGLPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLPIXELTRANSFORMPARAMETERIVEXTPROC GLeeFuncPtr_glPixelTransformParameterivEXT;\r
+  #define glPixelTransformParameterivEXT GLeeFuncPtr_glPixelTransformParameterivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glPixelTransformParameterfvEXT\r
+#define GLEE_H_DEFINED_glPixelTransformParameterfvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLPIXELTRANSFORMPARAMETERFVEXTPROC GLeeFuncPtr_glPixelTransformParameterfvEXT;\r
+  #define glPixelTransformParameterfvEXT GLeeFuncPtr_glPixelTransformParameterfvEXT\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_pixel_transform_color_table */\r
+\r
+#ifndef GL_EXT_pixel_transform_color_table\r
+#define GL_EXT_pixel_transform_color_table 1\r
+#define __GLEE_GL_EXT_pixel_transform_color_table 1\r
+/* Constants */\r
+#endif \r
+\r
+/* GL_EXT_shared_texture_palette */\r
+\r
+#ifndef GL_EXT_shared_texture_palette\r
+#define GL_EXT_shared_texture_palette 1\r
+#define __GLEE_GL_EXT_shared_texture_palette 1\r
+/* Constants */\r
+#define GL_SHARED_TEXTURE_PALETTE_EXT                      0x81FB\r
+#endif \r
+\r
+/* GL_EXT_separate_specular_color */\r
+\r
+#ifndef GL_EXT_separate_specular_color\r
+#define GL_EXT_separate_specular_color 1\r
+#define __GLEE_GL_EXT_separate_specular_color 1\r
+/* Constants */\r
+#define GL_LIGHT_MODEL_COLOR_CONTROL_EXT                   0x81F8\r
+#define GL_SINGLE_COLOR_EXT                                0x81F9\r
+#define GL_SEPARATE_SPECULAR_COLOR_EXT                     0x81FA\r
+#endif \r
+\r
+/* GL_EXT_secondary_color */\r
+\r
+#ifndef GL_EXT_secondary_color\r
+#define GL_EXT_secondary_color 1\r
+#define __GLEE_GL_EXT_secondary_color 1\r
+/* Constants */\r
+#define GL_COLOR_SUM_EXT                                   0x8458\r
+#define GL_CURRENT_SECONDARY_COLOR_EXT                     0x8459\r
+#define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT                  0x845A\r
+#define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT                  0x845B\r
+#define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT                0x845C\r
+#define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT               0x845D\r
+#define GL_SECONDARY_COLOR_ARRAY_EXT                       0x845E\r
+#ifndef GLEE_H_DEFINED_glSecondaryColor3bEXT\r
+#define GLEE_H_DEFINED_glSecondaryColor3bEXT\r
+  typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3BEXTPROC) (GLbyte red, GLbyte green, GLbyte blue);\r
+  GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3BEXTPROC GLeeFuncPtr_glSecondaryColor3bEXT;\r
+  #define glSecondaryColor3bEXT GLeeFuncPtr_glSecondaryColor3bEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glSecondaryColor3bvEXT\r
+#define GLEE_H_DEFINED_glSecondaryColor3bvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3BVEXTPROC) (const GLbyte * v);\r
+  GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3BVEXTPROC GLeeFuncPtr_glSecondaryColor3bvEXT;\r
+  #define glSecondaryColor3bvEXT GLeeFuncPtr_glSecondaryColor3bvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glSecondaryColor3dEXT\r
+#define GLEE_H_DEFINED_glSecondaryColor3dEXT\r
+  typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3DEXTPROC) (GLdouble red, GLdouble green, GLdouble blue);\r
+  GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3DEXTPROC GLeeFuncPtr_glSecondaryColor3dEXT;\r
+  #define glSecondaryColor3dEXT GLeeFuncPtr_glSecondaryColor3dEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glSecondaryColor3dvEXT\r
+#define GLEE_H_DEFINED_glSecondaryColor3dvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3DVEXTPROC) (const GLdouble * v);\r
+  GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3DVEXTPROC GLeeFuncPtr_glSecondaryColor3dvEXT;\r
+  #define glSecondaryColor3dvEXT GLeeFuncPtr_glSecondaryColor3dvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glSecondaryColor3fEXT\r
+#define GLEE_H_DEFINED_glSecondaryColor3fEXT\r
+  typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3FEXTPROC) (GLfloat red, GLfloat green, GLfloat blue);\r
+  GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3FEXTPROC GLeeFuncPtr_glSecondaryColor3fEXT;\r
+  #define glSecondaryColor3fEXT GLeeFuncPtr_glSecondaryColor3fEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glSecondaryColor3fvEXT\r
+#define GLEE_H_DEFINED_glSecondaryColor3fvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3FVEXTPROC) (const GLfloat * v);\r
+  GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3FVEXTPROC GLeeFuncPtr_glSecondaryColor3fvEXT;\r
+  #define glSecondaryColor3fvEXT GLeeFuncPtr_glSecondaryColor3fvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glSecondaryColor3iEXT\r
+#define GLEE_H_DEFINED_glSecondaryColor3iEXT\r
+  typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3IEXTPROC) (GLint red, GLint green, GLint blue);\r
+  GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3IEXTPROC GLeeFuncPtr_glSecondaryColor3iEXT;\r
+  #define glSecondaryColor3iEXT GLeeFuncPtr_glSecondaryColor3iEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glSecondaryColor3ivEXT\r
+#define GLEE_H_DEFINED_glSecondaryColor3ivEXT\r
+  typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3IVEXTPROC) (const GLint * v);\r
+  GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3IVEXTPROC GLeeFuncPtr_glSecondaryColor3ivEXT;\r
+  #define glSecondaryColor3ivEXT GLeeFuncPtr_glSecondaryColor3ivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glSecondaryColor3sEXT\r
+#define GLEE_H_DEFINED_glSecondaryColor3sEXT\r
+  typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3SEXTPROC) (GLshort red, GLshort green, GLshort blue);\r
+  GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3SEXTPROC GLeeFuncPtr_glSecondaryColor3sEXT;\r
+  #define glSecondaryColor3sEXT GLeeFuncPtr_glSecondaryColor3sEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glSecondaryColor3svEXT\r
+#define GLEE_H_DEFINED_glSecondaryColor3svEXT\r
+  typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3SVEXTPROC) (const GLshort * v);\r
+  GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3SVEXTPROC GLeeFuncPtr_glSecondaryColor3svEXT;\r
+  #define glSecondaryColor3svEXT GLeeFuncPtr_glSecondaryColor3svEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glSecondaryColor3ubEXT\r
+#define GLEE_H_DEFINED_glSecondaryColor3ubEXT\r
+  typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3UBEXTPROC) (GLubyte red, GLubyte green, GLubyte blue);\r
+  GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3UBEXTPROC GLeeFuncPtr_glSecondaryColor3ubEXT;\r
+  #define glSecondaryColor3ubEXT GLeeFuncPtr_glSecondaryColor3ubEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glSecondaryColor3ubvEXT\r
+#define GLEE_H_DEFINED_glSecondaryColor3ubvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3UBVEXTPROC) (const GLubyte * v);\r
+  GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3UBVEXTPROC GLeeFuncPtr_glSecondaryColor3ubvEXT;\r
+  #define glSecondaryColor3ubvEXT GLeeFuncPtr_glSecondaryColor3ubvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glSecondaryColor3uiEXT\r
+#define GLEE_H_DEFINED_glSecondaryColor3uiEXT\r
+  typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3UIEXTPROC) (GLuint red, GLuint green, GLuint blue);\r
+  GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3UIEXTPROC GLeeFuncPtr_glSecondaryColor3uiEXT;\r
+  #define glSecondaryColor3uiEXT GLeeFuncPtr_glSecondaryColor3uiEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glSecondaryColor3uivEXT\r
+#define GLEE_H_DEFINED_glSecondaryColor3uivEXT\r
+  typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3UIVEXTPROC) (const GLuint * v);\r
+  GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3UIVEXTPROC GLeeFuncPtr_glSecondaryColor3uivEXT;\r
+  #define glSecondaryColor3uivEXT GLeeFuncPtr_glSecondaryColor3uivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glSecondaryColor3usEXT\r
+#define GLEE_H_DEFINED_glSecondaryColor3usEXT\r
+  typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3USEXTPROC) (GLushort red, GLushort green, GLushort blue);\r
+  GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3USEXTPROC GLeeFuncPtr_glSecondaryColor3usEXT;\r
+  #define glSecondaryColor3usEXT GLeeFuncPtr_glSecondaryColor3usEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glSecondaryColor3usvEXT\r
+#define GLEE_H_DEFINED_glSecondaryColor3usvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3USVEXTPROC) (const GLushort * v);\r
+  GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3USVEXTPROC GLeeFuncPtr_glSecondaryColor3usvEXT;\r
+  #define glSecondaryColor3usvEXT GLeeFuncPtr_glSecondaryColor3usvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glSecondaryColorPointerEXT\r
+#define GLEE_H_DEFINED_glSecondaryColorPointerEXT\r
+  typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid * pointer);\r
+  GLEE_EXTERN GLEEPFNGLSECONDARYCOLORPOINTEREXTPROC GLeeFuncPtr_glSecondaryColorPointerEXT;\r
+  #define glSecondaryColorPointerEXT GLeeFuncPtr_glSecondaryColorPointerEXT\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_texture_perturb_normal */\r
+\r
+#ifndef GL_EXT_texture_perturb_normal\r
+#define GL_EXT_texture_perturb_normal 1\r
+#define __GLEE_GL_EXT_texture_perturb_normal 1\r
+/* Constants */\r
+#define GL_PERTURB_EXT                                     0x85AE\r
+#define GL_TEXTURE_NORMAL_EXT                              0x85AF\r
+#ifndef GLEE_H_DEFINED_glTextureNormalEXT\r
+#define GLEE_H_DEFINED_glTextureNormalEXT\r
+  typedef void (APIENTRYP GLEEPFNGLTEXTURENORMALEXTPROC) (GLenum mode);\r
+  GLEE_EXTERN GLEEPFNGLTEXTURENORMALEXTPROC GLeeFuncPtr_glTextureNormalEXT;\r
+  #define glTextureNormalEXT GLeeFuncPtr_glTextureNormalEXT\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_multi_draw_arrays */\r
+\r
+#ifndef GL_EXT_multi_draw_arrays\r
+#define GL_EXT_multi_draw_arrays 1\r
+#define __GLEE_GL_EXT_multi_draw_arrays 1\r
+/* Constants */\r
+#ifndef GLEE_H_DEFINED_glMultiDrawArraysEXT\r
+#define GLEE_H_DEFINED_glMultiDrawArraysEXT\r
+  typedef void (APIENTRYP GLEEPFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, GLint * first, GLsizei * count, GLsizei primcount);\r
+  GLEE_EXTERN GLEEPFNGLMULTIDRAWARRAYSEXTPROC GLeeFuncPtr_glMultiDrawArraysEXT;\r
+  #define glMultiDrawArraysEXT GLeeFuncPtr_glMultiDrawArraysEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiDrawElementsEXT\r
+#define GLEE_H_DEFINED_glMultiDrawElementsEXT\r
+  typedef void (APIENTRYP GLEEPFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, const GLsizei * count, GLenum type, const GLvoid* * indices, GLsizei primcount);\r
+  GLEE_EXTERN GLEEPFNGLMULTIDRAWELEMENTSEXTPROC GLeeFuncPtr_glMultiDrawElementsEXT;\r
+  #define glMultiDrawElementsEXT GLeeFuncPtr_glMultiDrawElementsEXT\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_fog_coord */\r
+\r
+#ifndef GL_EXT_fog_coord\r
+#define GL_EXT_fog_coord 1\r
+#define __GLEE_GL_EXT_fog_coord 1\r
+/* Constants */\r
+#define GL_FOG_COORDINATE_SOURCE_EXT                       0x8450\r
+#define GL_FOG_COORDINATE_EXT                              0x8451\r
+#define GL_FRAGMENT_DEPTH_EXT                              0x8452\r
+#define GL_CURRENT_FOG_COORDINATE_EXT                      0x8453\r
+#define GL_FOG_COORDINATE_ARRAY_TYPE_EXT                   0x8454\r
+#define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT                 0x8455\r
+#define GL_FOG_COORDINATE_ARRAY_POINTER_EXT                0x8456\r
+#define GL_FOG_COORDINATE_ARRAY_EXT                        0x8457\r
+#ifndef GLEE_H_DEFINED_glFogCoordfEXT\r
+#define GLEE_H_DEFINED_glFogCoordfEXT\r
+  typedef void (APIENTRYP GLEEPFNGLFOGCOORDFEXTPROC) (GLfloat coord);\r
+  GLEE_EXTERN GLEEPFNGLFOGCOORDFEXTPROC GLeeFuncPtr_glFogCoordfEXT;\r
+  #define glFogCoordfEXT GLeeFuncPtr_glFogCoordfEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFogCoordfvEXT\r
+#define GLEE_H_DEFINED_glFogCoordfvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLFOGCOORDFVEXTPROC) (const GLfloat * coord);\r
+  GLEE_EXTERN GLEEPFNGLFOGCOORDFVEXTPROC GLeeFuncPtr_glFogCoordfvEXT;\r
+  #define glFogCoordfvEXT GLeeFuncPtr_glFogCoordfvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFogCoorddEXT\r
+#define GLEE_H_DEFINED_glFogCoorddEXT\r
+  typedef void (APIENTRYP GLEEPFNGLFOGCOORDDEXTPROC) (GLdouble coord);\r
+  GLEE_EXTERN GLEEPFNGLFOGCOORDDEXTPROC GLeeFuncPtr_glFogCoorddEXT;\r
+  #define glFogCoorddEXT GLeeFuncPtr_glFogCoorddEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFogCoorddvEXT\r
+#define GLEE_H_DEFINED_glFogCoorddvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLFOGCOORDDVEXTPROC) (const GLdouble * coord);\r
+  GLEE_EXTERN GLEEPFNGLFOGCOORDDVEXTPROC GLeeFuncPtr_glFogCoorddvEXT;\r
+  #define glFogCoorddvEXT GLeeFuncPtr_glFogCoorddvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFogCoordPointerEXT\r
+#define GLEE_H_DEFINED_glFogCoordPointerEXT\r
+  typedef void (APIENTRYP GLEEPFNGLFOGCOORDPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid * pointer);\r
+  GLEE_EXTERN GLEEPFNGLFOGCOORDPOINTEREXTPROC GLeeFuncPtr_glFogCoordPointerEXT;\r
+  #define glFogCoordPointerEXT GLeeFuncPtr_glFogCoordPointerEXT\r
+#endif\r
+#endif \r
+\r
+/* GL_REND_screen_coordinates */\r
+\r
+#ifndef GL_REND_screen_coordinates\r
+#define GL_REND_screen_coordinates 1\r
+#define __GLEE_GL_REND_screen_coordinates 1\r
+/* Constants */\r
+#define GL_SCREEN_COORDINATES_REND                         0x8490\r
+#define GL_INVERTED_SCREEN_W_REND                          0x8491\r
+#endif \r
+\r
+/* GL_EXT_coordinate_frame */\r
+\r
+#ifndef GL_EXT_coordinate_frame\r
+#define GL_EXT_coordinate_frame 1\r
+#define __GLEE_GL_EXT_coordinate_frame 1\r
+/* Constants */\r
+#define GL_TANGENT_ARRAY_EXT                               0x8439\r
+#define GL_BINORMAL_ARRAY_EXT                              0x843A\r
+#define GL_CURRENT_TANGENT_EXT                             0x843B\r
+#define GL_CURRENT_BINORMAL_EXT                            0x843C\r
+#define GL_TANGENT_ARRAY_TYPE_EXT                          0x843E\r
+#define GL_TANGENT_ARRAY_STRIDE_EXT                        0x843F\r
+#define GL_BINORMAL_ARRAY_TYPE_EXT                         0x8440\r
+#define GL_BINORMAL_ARRAY_STRIDE_EXT                       0x8441\r
+#define GL_TANGENT_ARRAY_POINTER_EXT                       0x8442\r
+#define GL_BINORMAL_ARRAY_POINTER_EXT                      0x8443\r
+#define GL_MAP1_TANGENT_EXT                                0x8444\r
+#define GL_MAP2_TANGENT_EXT                                0x8445\r
+#define GL_MAP1_BINORMAL_EXT                               0x8446\r
+#define GL_MAP2_BINORMAL_EXT                               0x8447\r
+#ifndef GLEE_H_DEFINED_glTangent3bEXT\r
+#define GLEE_H_DEFINED_glTangent3bEXT\r
+  typedef void (APIENTRYP GLEEPFNGLTANGENT3BEXTPROC) (GLbyte tx, GLbyte ty, GLbyte tz);\r
+  GLEE_EXTERN GLEEPFNGLTANGENT3BEXTPROC GLeeFuncPtr_glTangent3bEXT;\r
+  #define glTangent3bEXT GLeeFuncPtr_glTangent3bEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTangent3bvEXT\r
+#define GLEE_H_DEFINED_glTangent3bvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLTANGENT3BVEXTPROC) (const GLbyte * v);\r
+  GLEE_EXTERN GLEEPFNGLTANGENT3BVEXTPROC GLeeFuncPtr_glTangent3bvEXT;\r
+  #define glTangent3bvEXT GLeeFuncPtr_glTangent3bvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTangent3dEXT\r
+#define GLEE_H_DEFINED_glTangent3dEXT\r
+  typedef void (APIENTRYP GLEEPFNGLTANGENT3DEXTPROC) (GLdouble tx, GLdouble ty, GLdouble tz);\r
+  GLEE_EXTERN GLEEPFNGLTANGENT3DEXTPROC GLeeFuncPtr_glTangent3dEXT;\r
+  #define glTangent3dEXT GLeeFuncPtr_glTangent3dEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTangent3dvEXT\r
+#define GLEE_H_DEFINED_glTangent3dvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLTANGENT3DVEXTPROC) (const GLdouble * v);\r
+  GLEE_EXTERN GLEEPFNGLTANGENT3DVEXTPROC GLeeFuncPtr_glTangent3dvEXT;\r
+  #define glTangent3dvEXT GLeeFuncPtr_glTangent3dvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTangent3fEXT\r
+#define GLEE_H_DEFINED_glTangent3fEXT\r
+  typedef void (APIENTRYP GLEEPFNGLTANGENT3FEXTPROC) (GLfloat tx, GLfloat ty, GLfloat tz);\r
+  GLEE_EXTERN GLEEPFNGLTANGENT3FEXTPROC GLeeFuncPtr_glTangent3fEXT;\r
+  #define glTangent3fEXT GLeeFuncPtr_glTangent3fEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTangent3fvEXT\r
+#define GLEE_H_DEFINED_glTangent3fvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLTANGENT3FVEXTPROC) (const GLfloat * v);\r
+  GLEE_EXTERN GLEEPFNGLTANGENT3FVEXTPROC GLeeFuncPtr_glTangent3fvEXT;\r
+  #define glTangent3fvEXT GLeeFuncPtr_glTangent3fvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTangent3iEXT\r
+#define GLEE_H_DEFINED_glTangent3iEXT\r
+  typedef void (APIENTRYP GLEEPFNGLTANGENT3IEXTPROC) (GLint tx, GLint ty, GLint tz);\r
+  GLEE_EXTERN GLEEPFNGLTANGENT3IEXTPROC GLeeFuncPtr_glTangent3iEXT;\r
+  #define glTangent3iEXT GLeeFuncPtr_glTangent3iEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTangent3ivEXT\r
+#define GLEE_H_DEFINED_glTangent3ivEXT\r
+  typedef void (APIENTRYP GLEEPFNGLTANGENT3IVEXTPROC) (const GLint * v);\r
+  GLEE_EXTERN GLEEPFNGLTANGENT3IVEXTPROC GLeeFuncPtr_glTangent3ivEXT;\r
+  #define glTangent3ivEXT GLeeFuncPtr_glTangent3ivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTangent3sEXT\r
+#define GLEE_H_DEFINED_glTangent3sEXT\r
+  typedef void (APIENTRYP GLEEPFNGLTANGENT3SEXTPROC) (GLshort tx, GLshort ty, GLshort tz);\r
+  GLEE_EXTERN GLEEPFNGLTANGENT3SEXTPROC GLeeFuncPtr_glTangent3sEXT;\r
+  #define glTangent3sEXT GLeeFuncPtr_glTangent3sEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTangent3svEXT\r
+#define GLEE_H_DEFINED_glTangent3svEXT\r
+  typedef void (APIENTRYP GLEEPFNGLTANGENT3SVEXTPROC) (const GLshort * v);\r
+  GLEE_EXTERN GLEEPFNGLTANGENT3SVEXTPROC GLeeFuncPtr_glTangent3svEXT;\r
+  #define glTangent3svEXT GLeeFuncPtr_glTangent3svEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glBinormal3bEXT\r
+#define GLEE_H_DEFINED_glBinormal3bEXT\r
+  typedef void (APIENTRYP GLEEPFNGLBINORMAL3BEXTPROC) (GLbyte bx, GLbyte by, GLbyte bz);\r
+  GLEE_EXTERN GLEEPFNGLBINORMAL3BEXTPROC GLeeFuncPtr_glBinormal3bEXT;\r
+  #define glBinormal3bEXT GLeeFuncPtr_glBinormal3bEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glBinormal3bvEXT\r
+#define GLEE_H_DEFINED_glBinormal3bvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLBINORMAL3BVEXTPROC) (const GLbyte * v);\r
+  GLEE_EXTERN GLEEPFNGLBINORMAL3BVEXTPROC GLeeFuncPtr_glBinormal3bvEXT;\r
+  #define glBinormal3bvEXT GLeeFuncPtr_glBinormal3bvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glBinormal3dEXT\r
+#define GLEE_H_DEFINED_glBinormal3dEXT\r
+  typedef void (APIENTRYP GLEEPFNGLBINORMAL3DEXTPROC) (GLdouble bx, GLdouble by, GLdouble bz);\r
+  GLEE_EXTERN GLEEPFNGLBINORMAL3DEXTPROC GLeeFuncPtr_glBinormal3dEXT;\r
+  #define glBinormal3dEXT GLeeFuncPtr_glBinormal3dEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glBinormal3dvEXT\r
+#define GLEE_H_DEFINED_glBinormal3dvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLBINORMAL3DVEXTPROC) (const GLdouble * v);\r
+  GLEE_EXTERN GLEEPFNGLBINORMAL3DVEXTPROC GLeeFuncPtr_glBinormal3dvEXT;\r
+  #define glBinormal3dvEXT GLeeFuncPtr_glBinormal3dvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glBinormal3fEXT\r
+#define GLEE_H_DEFINED_glBinormal3fEXT\r
+  typedef void (APIENTRYP GLEEPFNGLBINORMAL3FEXTPROC) (GLfloat bx, GLfloat by, GLfloat bz);\r
+  GLEE_EXTERN GLEEPFNGLBINORMAL3FEXTPROC GLeeFuncPtr_glBinormal3fEXT;\r
+  #define glBinormal3fEXT GLeeFuncPtr_glBinormal3fEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glBinormal3fvEXT\r
+#define GLEE_H_DEFINED_glBinormal3fvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLBINORMAL3FVEXTPROC) (const GLfloat * v);\r
+  GLEE_EXTERN GLEEPFNGLBINORMAL3FVEXTPROC GLeeFuncPtr_glBinormal3fvEXT;\r
+  #define glBinormal3fvEXT GLeeFuncPtr_glBinormal3fvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glBinormal3iEXT\r
+#define GLEE_H_DEFINED_glBinormal3iEXT\r
+  typedef void (APIENTRYP GLEEPFNGLBINORMAL3IEXTPROC) (GLint bx, GLint by, GLint bz);\r
+  GLEE_EXTERN GLEEPFNGLBINORMAL3IEXTPROC GLeeFuncPtr_glBinormal3iEXT;\r
+  #define glBinormal3iEXT GLeeFuncPtr_glBinormal3iEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glBinormal3ivEXT\r
+#define GLEE_H_DEFINED_glBinormal3ivEXT\r
+  typedef void (APIENTRYP GLEEPFNGLBINORMAL3IVEXTPROC) (const GLint * v);\r
+  GLEE_EXTERN GLEEPFNGLBINORMAL3IVEXTPROC GLeeFuncPtr_glBinormal3ivEXT;\r
+  #define glBinormal3ivEXT GLeeFuncPtr_glBinormal3ivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glBinormal3sEXT\r
+#define GLEE_H_DEFINED_glBinormal3sEXT\r
+  typedef void (APIENTRYP GLEEPFNGLBINORMAL3SEXTPROC) (GLshort bx, GLshort by, GLshort bz);\r
+  GLEE_EXTERN GLEEPFNGLBINORMAL3SEXTPROC GLeeFuncPtr_glBinormal3sEXT;\r
+  #define glBinormal3sEXT GLeeFuncPtr_glBinormal3sEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glBinormal3svEXT\r
+#define GLEE_H_DEFINED_glBinormal3svEXT\r
+  typedef void (APIENTRYP GLEEPFNGLBINORMAL3SVEXTPROC) (const GLshort * v);\r
+  GLEE_EXTERN GLEEPFNGLBINORMAL3SVEXTPROC GLeeFuncPtr_glBinormal3svEXT;\r
+  #define glBinormal3svEXT GLeeFuncPtr_glBinormal3svEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTangentPointerEXT\r
+#define GLEE_H_DEFINED_glTangentPointerEXT\r
+  typedef void (APIENTRYP GLEEPFNGLTANGENTPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid * pointer);\r
+  GLEE_EXTERN GLEEPFNGLTANGENTPOINTEREXTPROC GLeeFuncPtr_glTangentPointerEXT;\r
+  #define glTangentPointerEXT GLeeFuncPtr_glTangentPointerEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glBinormalPointerEXT\r
+#define GLEE_H_DEFINED_glBinormalPointerEXT\r
+  typedef void (APIENTRYP GLEEPFNGLBINORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid * pointer);\r
+  GLEE_EXTERN GLEEPFNGLBINORMALPOINTEREXTPROC GLeeFuncPtr_glBinormalPointerEXT;\r
+  #define glBinormalPointerEXT GLeeFuncPtr_glBinormalPointerEXT\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_texture_env_combine */\r
+\r
+#ifndef GL_EXT_texture_env_combine\r
+#define GL_EXT_texture_env_combine 1\r
+#define __GLEE_GL_EXT_texture_env_combine 1\r
+/* Constants */\r
+#define GL_COMBINE_EXT                                     0x8570\r
+#define GL_COMBINE_RGB_EXT                                 0x8571\r
+#define GL_COMBINE_ALPHA_EXT                               0x8572\r
+#define GL_RGB_SCALE_EXT                                   0x8573\r
+#define GL_ADD_SIGNED_EXT                                  0x8574\r
+#define GL_INTERPOLATE_EXT                                 0x8575\r
+#define GL_CONSTANT_EXT                                    0x8576\r
+#define GL_PRIMARY_COLOR_EXT                               0x8577\r
+#define GL_PREVIOUS_EXT                                    0x8578\r
+#define GL_SOURCE0_RGB_EXT                                 0x8580\r
+#define GL_SOURCE1_RGB_EXT                                 0x8581\r
+#define GL_SOURCE2_RGB_EXT                                 0x8582\r
+#define GL_SOURCE0_ALPHA_EXT                               0x8588\r
+#define GL_SOURCE1_ALPHA_EXT                               0x8589\r
+#define GL_SOURCE2_ALPHA_EXT                               0x858A\r
+#define GL_OPERAND0_RGB_EXT                                0x8590\r
+#define GL_OPERAND1_RGB_EXT                                0x8591\r
+#define GL_OPERAND2_RGB_EXT                                0x8592\r
+#define GL_OPERAND0_ALPHA_EXT                              0x8598\r
+#define GL_OPERAND1_ALPHA_EXT                              0x8599\r
+#define GL_OPERAND2_ALPHA_EXT                              0x859A\r
+#endif \r
+\r
+/* GL_APPLE_specular_vector */\r
+\r
+#ifndef GL_APPLE_specular_vector\r
+#define GL_APPLE_specular_vector 1\r
+#define __GLEE_GL_APPLE_specular_vector 1\r
+/* Constants */\r
+#define GL_LIGHT_MODEL_SPECULAR_VECTOR_APPLE               0x85B0\r
+#endif \r
+\r
+/* GL_APPLE_transform_hint */\r
+\r
+#ifndef GL_APPLE_transform_hint\r
+#define GL_APPLE_transform_hint 1\r
+#define __GLEE_GL_APPLE_transform_hint 1\r
+/* Constants */\r
+#define GL_TRANSFORM_HINT_APPLE                            0x85B1\r
+#endif \r
+\r
+/* GL_SGIX_fog_scale */\r
+\r
+#ifndef GL_SGIX_fog_scale\r
+#define GL_SGIX_fog_scale 1\r
+#define __GLEE_GL_SGIX_fog_scale 1\r
+/* Constants */\r
+#define GL_FOG_SCALE_SGIX                                  0x81FC\r
+#define GL_FOG_SCALE_VALUE_SGIX                            0x81FD\r
+#endif \r
+\r
+/* GL_SUNX_constant_data */\r
+\r
+#ifndef GL_SUNX_constant_data\r
+#define GL_SUNX_constant_data 1\r
+#define __GLEE_GL_SUNX_constant_data 1\r
+/* Constants */\r
+#define GL_UNPACK_CONSTANT_DATA_SUNX                       0x81D5\r
+#define GL_TEXTURE_CONSTANT_DATA_SUNX                      0x81D6\r
+#ifndef GLEE_H_DEFINED_glFinishTextureSUNX\r
+#define GLEE_H_DEFINED_glFinishTextureSUNX\r
+  typedef void (APIENTRYP GLEEPFNGLFINISHTEXTURESUNXPROC) ();\r
+  GLEE_EXTERN GLEEPFNGLFINISHTEXTURESUNXPROC GLeeFuncPtr_glFinishTextureSUNX;\r
+  #define glFinishTextureSUNX GLeeFuncPtr_glFinishTextureSUNX\r
+#endif\r
+#endif \r
+\r
+/* GL_SUN_global_alpha */\r
+\r
+#ifndef GL_SUN_global_alpha\r
+#define GL_SUN_global_alpha 1\r
+#define __GLEE_GL_SUN_global_alpha 1\r
+/* Constants */\r
+#define GL_GLOBAL_ALPHA_SUN                                0x81D9\r
+#define GL_GLOBAL_ALPHA_FACTOR_SUN                         0x81DA\r
+#ifndef GLEE_H_DEFINED_glGlobalAlphaFactorbSUN\r
+#define GLEE_H_DEFINED_glGlobalAlphaFactorbSUN\r
+  typedef void (APIENTRYP GLEEPFNGLGLOBALALPHAFACTORBSUNPROC) (GLbyte factor);\r
+  GLEE_EXTERN GLEEPFNGLGLOBALALPHAFACTORBSUNPROC GLeeFuncPtr_glGlobalAlphaFactorbSUN;\r
+  #define glGlobalAlphaFactorbSUN GLeeFuncPtr_glGlobalAlphaFactorbSUN\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGlobalAlphaFactorsSUN\r
+#define GLEE_H_DEFINED_glGlobalAlphaFactorsSUN\r
+  typedef void (APIENTRYP GLEEPFNGLGLOBALALPHAFACTORSSUNPROC) (GLshort factor);\r
+  GLEE_EXTERN GLEEPFNGLGLOBALALPHAFACTORSSUNPROC GLeeFuncPtr_glGlobalAlphaFactorsSUN;\r
+  #define glGlobalAlphaFactorsSUN GLeeFuncPtr_glGlobalAlphaFactorsSUN\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGlobalAlphaFactoriSUN\r
+#define GLEE_H_DEFINED_glGlobalAlphaFactoriSUN\r
+  typedef void (APIENTRYP GLEEPFNGLGLOBALALPHAFACTORISUNPROC) (GLint factor);\r
+  GLEE_EXTERN GLEEPFNGLGLOBALALPHAFACTORISUNPROC GLeeFuncPtr_glGlobalAlphaFactoriSUN;\r
+  #define glGlobalAlphaFactoriSUN GLeeFuncPtr_glGlobalAlphaFactoriSUN\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGlobalAlphaFactorfSUN\r
+#define GLEE_H_DEFINED_glGlobalAlphaFactorfSUN\r
+  typedef void (APIENTRYP GLEEPFNGLGLOBALALPHAFACTORFSUNPROC) (GLfloat factor);\r
+  GLEE_EXTERN GLEEPFNGLGLOBALALPHAFACTORFSUNPROC GLeeFuncPtr_glGlobalAlphaFactorfSUN;\r
+  #define glGlobalAlphaFactorfSUN GLeeFuncPtr_glGlobalAlphaFactorfSUN\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGlobalAlphaFactordSUN\r
+#define GLEE_H_DEFINED_glGlobalAlphaFactordSUN\r
+  typedef void (APIENTRYP GLEEPFNGLGLOBALALPHAFACTORDSUNPROC) (GLdouble factor);\r
+  GLEE_EXTERN GLEEPFNGLGLOBALALPHAFACTORDSUNPROC GLeeFuncPtr_glGlobalAlphaFactordSUN;\r
+  #define glGlobalAlphaFactordSUN GLeeFuncPtr_glGlobalAlphaFactordSUN\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGlobalAlphaFactorubSUN\r
+#define GLEE_H_DEFINED_glGlobalAlphaFactorubSUN\r
+  typedef void (APIENTRYP GLEEPFNGLGLOBALALPHAFACTORUBSUNPROC) (GLubyte factor);\r
+  GLEE_EXTERN GLEEPFNGLGLOBALALPHAFACTORUBSUNPROC GLeeFuncPtr_glGlobalAlphaFactorubSUN;\r
+  #define glGlobalAlphaFactorubSUN GLeeFuncPtr_glGlobalAlphaFactorubSUN\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGlobalAlphaFactorusSUN\r
+#define GLEE_H_DEFINED_glGlobalAlphaFactorusSUN\r
+  typedef void (APIENTRYP GLEEPFNGLGLOBALALPHAFACTORUSSUNPROC) (GLushort factor);\r
+  GLEE_EXTERN GLEEPFNGLGLOBALALPHAFACTORUSSUNPROC GLeeFuncPtr_glGlobalAlphaFactorusSUN;\r
+  #define glGlobalAlphaFactorusSUN GLeeFuncPtr_glGlobalAlphaFactorusSUN\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGlobalAlphaFactoruiSUN\r
+#define GLEE_H_DEFINED_glGlobalAlphaFactoruiSUN\r
+  typedef void (APIENTRYP GLEEPFNGLGLOBALALPHAFACTORUISUNPROC) (GLuint factor);\r
+  GLEE_EXTERN GLEEPFNGLGLOBALALPHAFACTORUISUNPROC GLeeFuncPtr_glGlobalAlphaFactoruiSUN;\r
+  #define glGlobalAlphaFactoruiSUN GLeeFuncPtr_glGlobalAlphaFactoruiSUN\r
+#endif\r
+#endif \r
+\r
+/* GL_SUN_triangle_list */\r
+\r
+#ifndef GL_SUN_triangle_list\r
+#define GL_SUN_triangle_list 1\r
+#define __GLEE_GL_SUN_triangle_list 1\r
+/* Constants */\r
+#define GL_RESTART_SUN                                     0x0001\r
+#define GL_REPLACE_MIDDLE_SUN                              0x0002\r
+#define GL_REPLACE_OLDEST_SUN                              0x0003\r
+#define GL_TRIANGLE_LIST_SUN                               0x81D7\r
+#define GL_REPLACEMENT_CODE_SUN                            0x81D8\r
+#define GL_REPLACEMENT_CODE_ARRAY_SUN                      0x85C0\r
+#define GL_REPLACEMENT_CODE_ARRAY_TYPE_SUN                 0x85C1\r
+#define GL_REPLACEMENT_CODE_ARRAY_STRIDE_SUN               0x85C2\r
+#define GL_REPLACEMENT_CODE_ARRAY_POINTER_SUN              0x85C3\r
+#define GL_R1UI_V3F_SUN                                    0x85C4\r
+#define GL_R1UI_C4UB_V3F_SUN                               0x85C5\r
+#define GL_R1UI_C3F_V3F_SUN                                0x85C6\r
+#define GL_R1UI_N3F_V3F_SUN                                0x85C7\r
+#define GL_R1UI_C4F_N3F_V3F_SUN                            0x85C8\r
+#define GL_R1UI_T2F_V3F_SUN                                0x85C9\r
+#define GL_R1UI_T2F_N3F_V3F_SUN                            0x85CA\r
+#define GL_R1UI_T2F_C4F_N3F_V3F_SUN                        0x85CB\r
+#ifndef GLEE_H_DEFINED_glReplacementCodeuiSUN\r
+#define GLEE_H_DEFINED_glReplacementCodeuiSUN\r
+  typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUISUNPROC) (GLuint code);\r
+  GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUISUNPROC GLeeFuncPtr_glReplacementCodeuiSUN;\r
+  #define glReplacementCodeuiSUN GLeeFuncPtr_glReplacementCodeuiSUN\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glReplacementCodeusSUN\r
+#define GLEE_H_DEFINED_glReplacementCodeusSUN\r
+  typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUSSUNPROC) (GLushort code);\r
+  GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUSSUNPROC GLeeFuncPtr_glReplacementCodeusSUN;\r
+  #define glReplacementCodeusSUN GLeeFuncPtr_glReplacementCodeusSUN\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glReplacementCodeubSUN\r
+#define GLEE_H_DEFINED_glReplacementCodeubSUN\r
+  typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUBSUNPROC) (GLubyte code);\r
+  GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUBSUNPROC GLeeFuncPtr_glReplacementCodeubSUN;\r
+  #define glReplacementCodeubSUN GLeeFuncPtr_glReplacementCodeubSUN\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glReplacementCodeuivSUN\r
+#define GLEE_H_DEFINED_glReplacementCodeuivSUN\r
+  typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUIVSUNPROC) (const GLuint * code);\r
+  GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUIVSUNPROC GLeeFuncPtr_glReplacementCodeuivSUN;\r
+  #define glReplacementCodeuivSUN GLeeFuncPtr_glReplacementCodeuivSUN\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glReplacementCodeusvSUN\r
+#define GLEE_H_DEFINED_glReplacementCodeusvSUN\r
+  typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUSVSUNPROC) (const GLushort * code);\r
+  GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUSVSUNPROC GLeeFuncPtr_glReplacementCodeusvSUN;\r
+  #define glReplacementCodeusvSUN GLeeFuncPtr_glReplacementCodeusvSUN\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glReplacementCodeubvSUN\r
+#define GLEE_H_DEFINED_glReplacementCodeubvSUN\r
+  typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUBVSUNPROC) (const GLubyte * code);\r
+  GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUBVSUNPROC GLeeFuncPtr_glReplacementCodeubvSUN;\r
+  #define glReplacementCodeubvSUN GLeeFuncPtr_glReplacementCodeubvSUN\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glReplacementCodePointerSUN\r
+#define GLEE_H_DEFINED_glReplacementCodePointerSUN\r
+  typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEPOINTERSUNPROC) (GLenum type, GLsizei stride, const GLvoid* * pointer);\r
+  GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEPOINTERSUNPROC GLeeFuncPtr_glReplacementCodePointerSUN;\r
+  #define glReplacementCodePointerSUN GLeeFuncPtr_glReplacementCodePointerSUN\r
+#endif\r
+#endif \r
+\r
+/* GL_SUN_vertex */\r
+\r
+#ifndef GL_SUN_vertex\r
+#define GL_SUN_vertex 1\r
+#define __GLEE_GL_SUN_vertex 1\r
+/* Constants */\r
+#ifndef GLEE_H_DEFINED_glColor4ubVertex2fSUN\r
+#define GLEE_H_DEFINED_glColor4ubVertex2fSUN\r
+  typedef void (APIENTRYP GLEEPFNGLCOLOR4UBVERTEX2FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y);\r
+  GLEE_EXTERN GLEEPFNGLCOLOR4UBVERTEX2FSUNPROC GLeeFuncPtr_glColor4ubVertex2fSUN;\r
+  #define glColor4ubVertex2fSUN GLeeFuncPtr_glColor4ubVertex2fSUN\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glColor4ubVertex2fvSUN\r
+#define GLEE_H_DEFINED_glColor4ubVertex2fvSUN\r
+  typedef void (APIENTRYP GLEEPFNGLCOLOR4UBVERTEX2FVSUNPROC) (const GLubyte * c, const GLfloat * v);\r
+  GLEE_EXTERN GLEEPFNGLCOLOR4UBVERTEX2FVSUNPROC GLeeFuncPtr_glColor4ubVertex2fvSUN;\r
+  #define glColor4ubVertex2fvSUN GLeeFuncPtr_glColor4ubVertex2fvSUN\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glColor4ubVertex3fSUN\r
+#define GLEE_H_DEFINED_glColor4ubVertex3fSUN\r
+  typedef void (APIENTRYP GLEEPFNGLCOLOR4UBVERTEX3FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z);\r
+  GLEE_EXTERN GLEEPFNGLCOLOR4UBVERTEX3FSUNPROC GLeeFuncPtr_glColor4ubVertex3fSUN;\r
+  #define glColor4ubVertex3fSUN GLeeFuncPtr_glColor4ubVertex3fSUN\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glColor4ubVertex3fvSUN\r
+#define GLEE_H_DEFINED_glColor4ubVertex3fvSUN\r
+  typedef void (APIENTRYP GLEEPFNGLCOLOR4UBVERTEX3FVSUNPROC) (const GLubyte * c, const GLfloat * v);\r
+  GLEE_EXTERN GLEEPFNGLCOLOR4UBVERTEX3FVSUNPROC GLeeFuncPtr_glColor4ubVertex3fvSUN;\r
+  #define glColor4ubVertex3fvSUN GLeeFuncPtr_glColor4ubVertex3fvSUN\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glColor3fVertex3fSUN\r
+#define GLEE_H_DEFINED_glColor3fVertex3fSUN\r
+  typedef void (APIENTRYP GLEEPFNGLCOLOR3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z);\r
+  GLEE_EXTERN GLEEPFNGLCOLOR3FVERTEX3FSUNPROC GLeeFuncPtr_glColor3fVertex3fSUN;\r
+  #define glColor3fVertex3fSUN GLeeFuncPtr_glColor3fVertex3fSUN\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glColor3fVertex3fvSUN\r
+#define GLEE_H_DEFINED_glColor3fVertex3fvSUN\r
+  typedef void (APIENTRYP GLEEPFNGLCOLOR3FVERTEX3FVSUNPROC) (const GLfloat * c, const GLfloat * v);\r
+  GLEE_EXTERN GLEEPFNGLCOLOR3FVERTEX3FVSUNPROC GLeeFuncPtr_glColor3fVertex3fvSUN;\r
+  #define glColor3fVertex3fvSUN GLeeFuncPtr_glColor3fVertex3fvSUN\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glNormal3fVertex3fSUN\r
+#define GLEE_H_DEFINED_glNormal3fVertex3fSUN\r
+  typedef void (APIENTRYP GLEEPFNGLNORMAL3FVERTEX3FSUNPROC) (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);\r
+  GLEE_EXTERN GLEEPFNGLNORMAL3FVERTEX3FSUNPROC GLeeFuncPtr_glNormal3fVertex3fSUN;\r
+  #define glNormal3fVertex3fSUN GLeeFuncPtr_glNormal3fVertex3fSUN\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glNormal3fVertex3fvSUN\r
+#define GLEE_H_DEFINED_glNormal3fVertex3fvSUN\r
+  typedef void (APIENTRYP GLEEPFNGLNORMAL3FVERTEX3FVSUNPROC) (const GLfloat * n, const GLfloat * v);\r
+  GLEE_EXTERN GLEEPFNGLNORMAL3FVERTEX3FVSUNPROC GLeeFuncPtr_glNormal3fVertex3fvSUN;\r
+  #define glNormal3fVertex3fvSUN GLeeFuncPtr_glNormal3fVertex3fvSUN\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glColor4fNormal3fVertex3fSUN\r
+#define GLEE_H_DEFINED_glColor4fNormal3fVertex3fSUN\r
+  typedef void (APIENTRYP GLEEPFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);\r
+  GLEE_EXTERN GLEEPFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC GLeeFuncPtr_glColor4fNormal3fVertex3fSUN;\r
+  #define glColor4fNormal3fVertex3fSUN GLeeFuncPtr_glColor4fNormal3fVertex3fSUN\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glColor4fNormal3fVertex3fvSUN\r
+#define GLEE_H_DEFINED_glColor4fNormal3fVertex3fvSUN\r
+  typedef void (APIENTRYP GLEEPFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat * c, const GLfloat * n, const GLfloat * v);\r
+  GLEE_EXTERN GLEEPFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC GLeeFuncPtr_glColor4fNormal3fVertex3fvSUN;\r
+  #define glColor4fNormal3fVertex3fvSUN GLeeFuncPtr_glColor4fNormal3fVertex3fvSUN\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTexCoord2fVertex3fSUN\r
+#define GLEE_H_DEFINED_glTexCoord2fVertex3fSUN\r
+  typedef void (APIENTRYP GLEEPFNGLTEXCOORD2FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z);\r
+  GLEE_EXTERN GLEEPFNGLTEXCOORD2FVERTEX3FSUNPROC GLeeFuncPtr_glTexCoord2fVertex3fSUN;\r
+  #define glTexCoord2fVertex3fSUN GLeeFuncPtr_glTexCoord2fVertex3fSUN\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTexCoord2fVertex3fvSUN\r
+#define GLEE_H_DEFINED_glTexCoord2fVertex3fvSUN\r
+  typedef void (APIENTRYP GLEEPFNGLTEXCOORD2FVERTEX3FVSUNPROC) (const GLfloat * tc, const GLfloat * v);\r
+  GLEE_EXTERN GLEEPFNGLTEXCOORD2FVERTEX3FVSUNPROC GLeeFuncPtr_glTexCoord2fVertex3fvSUN;\r
+  #define glTexCoord2fVertex3fvSUN GLeeFuncPtr_glTexCoord2fVertex3fvSUN\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTexCoord4fVertex4fSUN\r
+#define GLEE_H_DEFINED_glTexCoord4fVertex4fSUN\r
+  typedef void (APIENTRYP GLEEPFNGLTEXCOORD4FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w);\r
+  GLEE_EXTERN GLEEPFNGLTEXCOORD4FVERTEX4FSUNPROC GLeeFuncPtr_glTexCoord4fVertex4fSUN;\r
+  #define glTexCoord4fVertex4fSUN GLeeFuncPtr_glTexCoord4fVertex4fSUN\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTexCoord4fVertex4fvSUN\r
+#define GLEE_H_DEFINED_glTexCoord4fVertex4fvSUN\r
+  typedef void (APIENTRYP GLEEPFNGLTEXCOORD4FVERTEX4FVSUNPROC) (const GLfloat * tc, const GLfloat * v);\r
+  GLEE_EXTERN GLEEPFNGLTEXCOORD4FVERTEX4FVSUNPROC GLeeFuncPtr_glTexCoord4fVertex4fvSUN;\r
+  #define glTexCoord4fVertex4fvSUN GLeeFuncPtr_glTexCoord4fVertex4fvSUN\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTexCoord2fColor4ubVertex3fSUN\r
+#define GLEE_H_DEFINED_glTexCoord2fColor4ubVertex3fSUN\r
+  typedef void (APIENTRYP GLEEPFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z);\r
+  GLEE_EXTERN GLEEPFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC GLeeFuncPtr_glTexCoord2fColor4ubVertex3fSUN;\r
+  #define glTexCoord2fColor4ubVertex3fSUN GLeeFuncPtr_glTexCoord2fColor4ubVertex3fSUN\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTexCoord2fColor4ubVertex3fvSUN\r
+#define GLEE_H_DEFINED_glTexCoord2fColor4ubVertex3fvSUN\r
+  typedef void (APIENTRYP GLEEPFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC) (const GLfloat * tc, const GLubyte * c, const GLfloat * v);\r
+  GLEE_EXTERN GLEEPFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC GLeeFuncPtr_glTexCoord2fColor4ubVertex3fvSUN;\r
+  #define glTexCoord2fColor4ubVertex3fvSUN GLeeFuncPtr_glTexCoord2fColor4ubVertex3fvSUN\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTexCoord2fColor3fVertex3fSUN\r
+#define GLEE_H_DEFINED_glTexCoord2fColor3fVertex3fSUN\r
+  typedef void (APIENTRYP GLEEPFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z);\r
+  GLEE_EXTERN GLEEPFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC GLeeFuncPtr_glTexCoord2fColor3fVertex3fSUN;\r
+  #define glTexCoord2fColor3fVertex3fSUN GLeeFuncPtr_glTexCoord2fColor3fVertex3fSUN\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTexCoord2fColor3fVertex3fvSUN\r
+#define GLEE_H_DEFINED_glTexCoord2fColor3fVertex3fvSUN\r
+  typedef void (APIENTRYP GLEEPFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC) (const GLfloat * tc, const GLfloat * c, const GLfloat * v);\r
+  GLEE_EXTERN GLEEPFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC GLeeFuncPtr_glTexCoord2fColor3fVertex3fvSUN;\r
+  #define glTexCoord2fColor3fVertex3fvSUN GLeeFuncPtr_glTexCoord2fColor3fVertex3fvSUN\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTexCoord2fNormal3fVertex3fSUN\r
+#define GLEE_H_DEFINED_glTexCoord2fNormal3fVertex3fSUN\r
+  typedef void (APIENTRYP GLEEPFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);\r
+  GLEE_EXTERN GLEEPFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC GLeeFuncPtr_glTexCoord2fNormal3fVertex3fSUN;\r
+  #define glTexCoord2fNormal3fVertex3fSUN GLeeFuncPtr_glTexCoord2fNormal3fVertex3fSUN\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTexCoord2fNormal3fVertex3fvSUN\r
+#define GLEE_H_DEFINED_glTexCoord2fNormal3fVertex3fvSUN\r
+  typedef void (APIENTRYP GLEEPFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat * tc, const GLfloat * n, const GLfloat * v);\r
+  GLEE_EXTERN GLEEPFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC GLeeFuncPtr_glTexCoord2fNormal3fVertex3fvSUN;\r
+  #define glTexCoord2fNormal3fVertex3fvSUN GLeeFuncPtr_glTexCoord2fNormal3fVertex3fvSUN\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTexCoord2fColor4fNormal3fVertex3fSUN\r
+#define GLEE_H_DEFINED_glTexCoord2fColor4fNormal3fVertex3fSUN\r
+  typedef void (APIENTRYP GLEEPFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);\r
+  GLEE_EXTERN GLEEPFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC GLeeFuncPtr_glTexCoord2fColor4fNormal3fVertex3fSUN;\r
+  #define glTexCoord2fColor4fNormal3fVertex3fSUN GLeeFuncPtr_glTexCoord2fColor4fNormal3fVertex3fSUN\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTexCoord2fColor4fNormal3fVertex3fvSUN\r
+#define GLEE_H_DEFINED_glTexCoord2fColor4fNormal3fVertex3fvSUN\r
+  typedef void (APIENTRYP GLEEPFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat * tc, const GLfloat * c, const GLfloat * n, const GLfloat * v);\r
+  GLEE_EXTERN GLEEPFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC GLeeFuncPtr_glTexCoord2fColor4fNormal3fVertex3fvSUN;\r
+  #define glTexCoord2fColor4fNormal3fVertex3fvSUN GLeeFuncPtr_glTexCoord2fColor4fNormal3fVertex3fvSUN\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTexCoord4fColor4fNormal3fVertex4fSUN\r
+#define GLEE_H_DEFINED_glTexCoord4fColor4fNormal3fVertex4fSUN\r
+  typedef void (APIENTRYP GLEEPFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w);\r
+  GLEE_EXTERN GLEEPFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC GLeeFuncPtr_glTexCoord4fColor4fNormal3fVertex4fSUN;\r
+  #define glTexCoord4fColor4fNormal3fVertex4fSUN GLeeFuncPtr_glTexCoord4fColor4fNormal3fVertex4fSUN\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTexCoord4fColor4fNormal3fVertex4fvSUN\r
+#define GLEE_H_DEFINED_glTexCoord4fColor4fNormal3fVertex4fvSUN\r
+  typedef void (APIENTRYP GLEEPFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC) (const GLfloat * tc, const GLfloat * c, const GLfloat * n, const GLfloat * v);\r
+  GLEE_EXTERN GLEEPFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC GLeeFuncPtr_glTexCoord4fColor4fNormal3fVertex4fvSUN;\r
+  #define glTexCoord4fColor4fNormal3fVertex4fvSUN GLeeFuncPtr_glTexCoord4fColor4fNormal3fVertex4fvSUN\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glReplacementCodeuiVertex3fSUN\r
+#define GLEE_H_DEFINED_glReplacementCodeuiVertex3fSUN\r
+  typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC) (GLuint rc, GLfloat x, GLfloat y, GLfloat z);\r
+  GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC GLeeFuncPtr_glReplacementCodeuiVertex3fSUN;\r
+  #define glReplacementCodeuiVertex3fSUN GLeeFuncPtr_glReplacementCodeuiVertex3fSUN\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glReplacementCodeuiVertex3fvSUN\r
+#define GLEE_H_DEFINED_glReplacementCodeuiVertex3fvSUN\r
+  typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC) (const GLuint * rc, const GLfloat * v);\r
+  GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC GLeeFuncPtr_glReplacementCodeuiVertex3fvSUN;\r
+  #define glReplacementCodeuiVertex3fvSUN GLeeFuncPtr_glReplacementCodeuiVertex3fvSUN\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glReplacementCodeuiColor4ubVertex3fSUN\r
+#define GLEE_H_DEFINED_glReplacementCodeuiColor4ubVertex3fSUN\r
+  typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC) (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z);\r
+  GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC GLeeFuncPtr_glReplacementCodeuiColor4ubVertex3fSUN;\r
+  #define glReplacementCodeuiColor4ubVertex3fSUN GLeeFuncPtr_glReplacementCodeuiColor4ubVertex3fSUN\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glReplacementCodeuiColor4ubVertex3fvSUN\r
+#define GLEE_H_DEFINED_glReplacementCodeuiColor4ubVertex3fvSUN\r
+  typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC) (const GLuint * rc, const GLubyte * c, const GLfloat * v);\r
+  GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC GLeeFuncPtr_glReplacementCodeuiColor4ubVertex3fvSUN;\r
+  #define glReplacementCodeuiColor4ubVertex3fvSUN GLeeFuncPtr_glReplacementCodeuiColor4ubVertex3fvSUN\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glReplacementCodeuiColor3fVertex3fSUN\r
+#define GLEE_H_DEFINED_glReplacementCodeuiColor3fVertex3fSUN\r
+  typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z);\r
+  GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC GLeeFuncPtr_glReplacementCodeuiColor3fVertex3fSUN;\r
+  #define glReplacementCodeuiColor3fVertex3fSUN GLeeFuncPtr_glReplacementCodeuiColor3fVertex3fSUN\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glReplacementCodeuiColor3fVertex3fvSUN\r
+#define GLEE_H_DEFINED_glReplacementCodeuiColor3fVertex3fvSUN\r
+  typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC) (const GLuint * rc, const GLfloat * c, const GLfloat * v);\r
+  GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC GLeeFuncPtr_glReplacementCodeuiColor3fVertex3fvSUN;\r
+  #define glReplacementCodeuiColor3fVertex3fvSUN GLeeFuncPtr_glReplacementCodeuiColor3fVertex3fvSUN\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glReplacementCodeuiNormal3fVertex3fSUN\r
+#define GLEE_H_DEFINED_glReplacementCodeuiNormal3fVertex3fSUN\r
+  typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);\r
+  GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC GLeeFuncPtr_glReplacementCodeuiNormal3fVertex3fSUN;\r
+  #define glReplacementCodeuiNormal3fVertex3fSUN GLeeFuncPtr_glReplacementCodeuiNormal3fVertex3fSUN\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glReplacementCodeuiNormal3fVertex3fvSUN\r
+#define GLEE_H_DEFINED_glReplacementCodeuiNormal3fVertex3fvSUN\r
+  typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC) (const GLuint * rc, const GLfloat * n, const GLfloat * v);\r
+  GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC GLeeFuncPtr_glReplacementCodeuiNormal3fVertex3fvSUN;\r
+  #define glReplacementCodeuiNormal3fVertex3fvSUN GLeeFuncPtr_glReplacementCodeuiNormal3fVertex3fvSUN\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glReplacementCodeuiColor4fNormal3fVertex3fSUN\r
+#define GLEE_H_DEFINED_glReplacementCodeuiColor4fNormal3fVertex3fSUN\r
+  typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);\r
+  GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC GLeeFuncPtr_glReplacementCodeuiColor4fNormal3fVertex3fSUN;\r
+  #define glReplacementCodeuiColor4fNormal3fVertex3fSUN GLeeFuncPtr_glReplacementCodeuiColor4fNormal3fVertex3fSUN\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glReplacementCodeuiColor4fNormal3fVertex3fvSUN\r
+#define GLEE_H_DEFINED_glReplacementCodeuiColor4fNormal3fVertex3fvSUN\r
+  typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint * rc, const GLfloat * c, const GLfloat * n, const GLfloat * v);\r
+  GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC GLeeFuncPtr_glReplacementCodeuiColor4fNormal3fVertex3fvSUN;\r
+  #define glReplacementCodeuiColor4fNormal3fVertex3fvSUN GLeeFuncPtr_glReplacementCodeuiColor4fNormal3fVertex3fvSUN\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glReplacementCodeuiTexCoord2fVertex3fSUN\r
+#define GLEE_H_DEFINED_glReplacementCodeuiTexCoord2fVertex3fSUN\r
+  typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z);\r
+  GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC GLeeFuncPtr_glReplacementCodeuiTexCoord2fVertex3fSUN;\r
+  #define glReplacementCodeuiTexCoord2fVertex3fSUN GLeeFuncPtr_glReplacementCodeuiTexCoord2fVertex3fSUN\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glReplacementCodeuiTexCoord2fVertex3fvSUN\r
+#define GLEE_H_DEFINED_glReplacementCodeuiTexCoord2fVertex3fvSUN\r
+  typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC) (const GLuint * rc, const GLfloat * tc, const GLfloat * v);\r
+  GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC GLeeFuncPtr_glReplacementCodeuiTexCoord2fVertex3fvSUN;\r
+  #define glReplacementCodeuiTexCoord2fVertex3fvSUN GLeeFuncPtr_glReplacementCodeuiTexCoord2fVertex3fvSUN\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN\r
+#define GLEE_H_DEFINED_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN\r
+  typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);\r
+  GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC GLeeFuncPtr_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN;\r
+  #define glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN GLeeFuncPtr_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN\r
+#define GLEE_H_DEFINED_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN\r
+  typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLuint * rc, const GLfloat * tc, const GLfloat * n, const GLfloat * v);\r
+  GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC GLeeFuncPtr_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN;\r
+  #define glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN GLeeFuncPtr_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN\r
+#define GLEE_H_DEFINED_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN\r
+  typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z);\r
+  GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC GLeeFuncPtr_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN;\r
+  #define glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN GLeeFuncPtr_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN\r
+#define GLEE_H_DEFINED_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN\r
+  typedef void (APIENTRYP GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint * rc, const GLfloat * tc, const GLfloat * c, const GLfloat * n, const GLfloat * v);\r
+  GLEE_EXTERN GLEEPFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC GLeeFuncPtr_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN;\r
+  #define glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN GLeeFuncPtr_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_blend_func_separate */\r
+\r
+#ifndef GL_EXT_blend_func_separate\r
+#define GL_EXT_blend_func_separate 1\r
+#define __GLEE_GL_EXT_blend_func_separate 1\r
+/* Constants */\r
+#define GL_BLEND_DST_RGB_EXT                               0x80C8\r
+#define GL_BLEND_SRC_RGB_EXT                               0x80C9\r
+#define GL_BLEND_DST_ALPHA_EXT                             0x80CA\r
+#define GL_BLEND_SRC_ALPHA_EXT                             0x80CB\r
+#ifndef GLEE_H_DEFINED_glBlendFuncSeparateEXT\r
+#define GLEE_H_DEFINED_glBlendFuncSeparateEXT\r
+  typedef void (APIENTRYP GLEEPFNGLBLENDFUNCSEPARATEEXTPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);\r
+  GLEE_EXTERN GLEEPFNGLBLENDFUNCSEPARATEEXTPROC GLeeFuncPtr_glBlendFuncSeparateEXT;\r
+  #define glBlendFuncSeparateEXT GLeeFuncPtr_glBlendFuncSeparateEXT\r
+#endif\r
+#endif \r
+\r
+/* GL_INGR_color_clamp */\r
+\r
+#ifndef GL_INGR_color_clamp\r
+#define GL_INGR_color_clamp 1\r
+#define __GLEE_GL_INGR_color_clamp 1\r
+/* Constants */\r
+#define GL_RED_MIN_CLAMP_INGR                              0x8560\r
+#define GL_GREEN_MIN_CLAMP_INGR                            0x8561\r
+#define GL_BLUE_MIN_CLAMP_INGR                             0x8562\r
+#define GL_ALPHA_MIN_CLAMP_INGR                            0x8563\r
+#define GL_RED_MAX_CLAMP_INGR                              0x8564\r
+#define GL_GREEN_MAX_CLAMP_INGR                            0x8565\r
+#define GL_BLUE_MAX_CLAMP_INGR                             0x8566\r
+#define GL_ALPHA_MAX_CLAMP_INGR                            0x8567\r
+#endif \r
+\r
+/* GL_INGR_interlace_read */\r
+\r
+#ifndef GL_INGR_interlace_read\r
+#define GL_INGR_interlace_read 1\r
+#define __GLEE_GL_INGR_interlace_read 1\r
+/* Constants */\r
+#define GL_INTERLACE_READ_INGR                             0x8568\r
+#endif \r
+\r
+/* GL_EXT_stencil_wrap */\r
+\r
+#ifndef GL_EXT_stencil_wrap\r
+#define GL_EXT_stencil_wrap 1\r
+#define __GLEE_GL_EXT_stencil_wrap 1\r
+/* Constants */\r
+#define GL_INCR_WRAP_EXT                                   0x8507\r
+#define GL_DECR_WRAP_EXT                                   0x8508\r
+#endif \r
+\r
+/* GL_EXT_422_pixels */\r
+\r
+#ifndef GL_EXT_422_pixels\r
+#define GL_EXT_422_pixels 1\r
+#define __GLEE_GL_EXT_422_pixels 1\r
+/* Constants */\r
+#define GL_422_EXT                                         0x80CC\r
+#define GL_422_REV_EXT                                     0x80CD\r
+#define GL_422_AVERAGE_EXT                                 0x80CE\r
+#define GL_422_REV_AVERAGE_EXT                             0x80CF\r
+#endif \r
+\r
+/* GL_NV_texgen_reflection */\r
+\r
+#ifndef GL_NV_texgen_reflection\r
+#define GL_NV_texgen_reflection 1\r
+#define __GLEE_GL_NV_texgen_reflection 1\r
+/* Constants */\r
+#define GL_NORMAL_MAP_NV                                   0x8511\r
+#define GL_REFLECTION_MAP_NV                               0x8512\r
+#endif \r
+\r
+/* GL_EXT_texture_cube_map */\r
+\r
+#ifndef GL_EXT_texture_cube_map\r
+#define GL_EXT_texture_cube_map 1\r
+#define __GLEE_GL_EXT_texture_cube_map 1\r
+/* Constants */\r
+#define GL_NORMAL_MAP_EXT                                  0x8511\r
+#define GL_REFLECTION_MAP_EXT                              0x8512\r
+#define GL_TEXTURE_CUBE_MAP_EXT                            0x8513\r
+#define GL_TEXTURE_BINDING_CUBE_MAP_EXT                    0x8514\r
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT                 0x8515\r
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT                 0x8516\r
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT                 0x8517\r
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT                 0x8518\r
+#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT                 0x8519\r
+#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT                 0x851A\r
+#define GL_PROXY_TEXTURE_CUBE_MAP_EXT                      0x851B\r
+#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT                   0x851C\r
+#endif \r
+\r
+/* GL_SUN_convolution_border_modes */\r
+\r
+#ifndef GL_SUN_convolution_border_modes\r
+#define GL_SUN_convolution_border_modes 1\r
+#define __GLEE_GL_SUN_convolution_border_modes 1\r
+/* Constants */\r
+#define GL_WRAP_BORDER_SUN                                 0x81D4\r
+#endif \r
+\r
+/* GL_EXT_texture_env_add */\r
+\r
+#ifndef GL_EXT_texture_env_add\r
+#define GL_EXT_texture_env_add 1\r
+#define __GLEE_GL_EXT_texture_env_add 1\r
+/* Constants */\r
+#endif \r
+\r
+/* GL_EXT_texture_lod_bias */\r
+\r
+#ifndef GL_EXT_texture_lod_bias\r
+#define GL_EXT_texture_lod_bias 1\r
+#define __GLEE_GL_EXT_texture_lod_bias 1\r
+/* Constants */\r
+#define GL_MAX_TEXTURE_LOD_BIAS_EXT                        0x84FD\r
+#define GL_TEXTURE_FILTER_CONTROL_EXT                      0x8500\r
+#define GL_TEXTURE_LOD_BIAS_EXT                            0x8501\r
+#endif \r
+\r
+/* GL_EXT_texture_filter_anisotropic */\r
+\r
+#ifndef GL_EXT_texture_filter_anisotropic\r
+#define GL_EXT_texture_filter_anisotropic 1\r
+#define __GLEE_GL_EXT_texture_filter_anisotropic 1\r
+/* Constants */\r
+#define GL_TEXTURE_MAX_ANISOTROPY_EXT                      0x84FE\r
+#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT                  0x84FF\r
+#endif \r
+\r
+/* GL_EXT_vertex_weighting */\r
+\r
+#ifndef GL_EXT_vertex_weighting\r
+#define GL_EXT_vertex_weighting 1\r
+#define __GLEE_GL_EXT_vertex_weighting 1\r
+/* Constants */\r
+#define GL_MODELVIEW0_STACK_DEPTH_EXT                      GL_MODELVIEW_STACK_DEPTH\r
+#define GL_MODELVIEW1_STACK_DEPTH_EXT                      0x8502\r
+#define GL_MODELVIEW0_MATRIX_EXT                           GL_MODELVIEW_MATRIX\r
+#define GL_MODELVIEW1_MATRIX_EXT                           0x8506\r
+#define GL_VERTEX_WEIGHTING_EXT                            0x8509\r
+#define GL_MODELVIEW0_EXT                                  GL_MODELVIEW\r
+#define GL_MODELVIEW1_EXT                                  0x850A\r
+#define GL_CURRENT_VERTEX_WEIGHT_EXT                       0x850B\r
+#define GL_VERTEX_WEIGHT_ARRAY_EXT                         0x850C\r
+#define GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT                    0x850D\r
+#define GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT                    0x850E\r
+#define GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT                  0x850F\r
+#define GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT                 0x8510\r
+#ifndef GLEE_H_DEFINED_glVertexWeightfEXT\r
+#define GLEE_H_DEFINED_glVertexWeightfEXT\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXWEIGHTFEXTPROC) (GLfloat weight);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXWEIGHTFEXTPROC GLeeFuncPtr_glVertexWeightfEXT;\r
+  #define glVertexWeightfEXT GLeeFuncPtr_glVertexWeightfEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexWeightfvEXT\r
+#define GLEE_H_DEFINED_glVertexWeightfvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXWEIGHTFVEXTPROC) (const GLfloat * weight);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXWEIGHTFVEXTPROC GLeeFuncPtr_glVertexWeightfvEXT;\r
+  #define glVertexWeightfvEXT GLeeFuncPtr_glVertexWeightfvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexWeightPointerEXT\r
+#define GLEE_H_DEFINED_glVertexWeightPointerEXT\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXWEIGHTPOINTEREXTPROC) (GLsizei size, GLenum type, GLsizei stride, const GLvoid * pointer);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXWEIGHTPOINTEREXTPROC GLeeFuncPtr_glVertexWeightPointerEXT;\r
+  #define glVertexWeightPointerEXT GLeeFuncPtr_glVertexWeightPointerEXT\r
+#endif\r
+#endif \r
+\r
+/* GL_NV_light_max_exponent */\r
+\r
+#ifndef GL_NV_light_max_exponent\r
+#define GL_NV_light_max_exponent 1\r
+#define __GLEE_GL_NV_light_max_exponent 1\r
+/* Constants */\r
+#define GL_MAX_SHININESS_NV                                0x8504\r
+#define GL_MAX_SPOT_EXPONENT_NV                            0x8505\r
+#endif \r
+\r
+/* GL_NV_vertex_array_range */\r
+\r
+#ifndef GL_NV_vertex_array_range\r
+#define GL_NV_vertex_array_range 1\r
+#define __GLEE_GL_NV_vertex_array_range 1\r
+/* Constants */\r
+#define GL_VERTEX_ARRAY_RANGE_NV                           0x851D\r
+#define GL_VERTEX_ARRAY_RANGE_LENGTH_NV                    0x851E\r
+#define GL_VERTEX_ARRAY_RANGE_VALID_NV                     0x851F\r
+#define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV               0x8520\r
+#define GL_VERTEX_ARRAY_RANGE_POINTER_NV                   0x8521\r
+#ifndef GLEE_H_DEFINED_glFlushVertexArrayRangeNV\r
+#define GLEE_H_DEFINED_glFlushVertexArrayRangeNV\r
+  typedef void (APIENTRYP GLEEPFNGLFLUSHVERTEXARRAYRANGENVPROC) ();\r
+  GLEE_EXTERN GLEEPFNGLFLUSHVERTEXARRAYRANGENVPROC GLeeFuncPtr_glFlushVertexArrayRangeNV;\r
+  #define glFlushVertexArrayRangeNV GLeeFuncPtr_glFlushVertexArrayRangeNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexArrayRangeNV\r
+#define GLEE_H_DEFINED_glVertexArrayRangeNV\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXARRAYRANGENVPROC) (GLsizei length, const GLvoid * pointer);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXARRAYRANGENVPROC GLeeFuncPtr_glVertexArrayRangeNV;\r
+  #define glVertexArrayRangeNV GLeeFuncPtr_glVertexArrayRangeNV\r
+#endif\r
+#endif \r
+\r
+/* GL_NV_register_combiners */\r
+\r
+#ifndef GL_NV_register_combiners\r
+#define GL_NV_register_combiners 1\r
+#define __GLEE_GL_NV_register_combiners 1\r
+/* Constants */\r
+#define GL_REGISTER_COMBINERS_NV                           0x8522\r
+#define GL_VARIABLE_A_NV                                   0x8523\r
+#define GL_VARIABLE_B_NV                                   0x8524\r
+#define GL_VARIABLE_C_NV                                   0x8525\r
+#define GL_VARIABLE_D_NV                                   0x8526\r
+#define GL_VARIABLE_E_NV                                   0x8527\r
+#define GL_VARIABLE_F_NV                                   0x8528\r
+#define GL_VARIABLE_G_NV                                   0x8529\r
+#define GL_CONSTANT_COLOR0_NV                              0x852A\r
+#define GL_CONSTANT_COLOR1_NV                              0x852B\r
+#define GL_PRIMARY_COLOR_NV                                0x852C\r
+#define GL_SECONDARY_COLOR_NV                              0x852D\r
+#define GL_SPARE0_NV                                       0x852E\r
+#define GL_SPARE1_NV                                       0x852F\r
+#define GL_DISCARD_NV                                      0x8530\r
+#define GL_E_TIMES_F_NV                                    0x8531\r
+#define GL_SPARE0_PLUS_SECONDARY_COLOR_NV                  0x8532\r
+#define GL_UNSIGNED_IDENTITY_NV                            0x8536\r
+#define GL_UNSIGNED_INVERT_NV                              0x8537\r
+#define GL_EXPAND_NORMAL_NV                                0x8538\r
+#define GL_EXPAND_NEGATE_NV                                0x8539\r
+#define GL_HALF_BIAS_NORMAL_NV                             0x853A\r
+#define GL_HALF_BIAS_NEGATE_NV                             0x853B\r
+#define GL_SIGNED_IDENTITY_NV                              0x853C\r
+#define GL_SIGNED_NEGATE_NV                                0x853D\r
+#define GL_SCALE_BY_TWO_NV                                 0x853E\r
+#define GL_SCALE_BY_FOUR_NV                                0x853F\r
+#define GL_SCALE_BY_ONE_HALF_NV                            0x8540\r
+#define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV                    0x8541\r
+#define GL_COMBINER_INPUT_NV                               0x8542\r
+#define GL_COMBINER_MAPPING_NV                             0x8543\r
+#define GL_COMBINER_COMPONENT_USAGE_NV                     0x8544\r
+#define GL_COMBINER_AB_DOT_PRODUCT_NV                      0x8545\r
+#define GL_COMBINER_CD_DOT_PRODUCT_NV                      0x8546\r
+#define GL_COMBINER_MUX_SUM_NV                             0x8547\r
+#define GL_COMBINER_SCALE_NV                               0x8548\r
+#define GL_COMBINER_BIAS_NV                                0x8549\r
+#define GL_COMBINER_AB_OUTPUT_NV                           0x854A\r
+#define GL_COMBINER_CD_OUTPUT_NV                           0x854B\r
+#define GL_COMBINER_SUM_OUTPUT_NV                          0x854C\r
+#define GL_MAX_GENERAL_COMBINERS_NV                        0x854D\r
+#define GL_NUM_GENERAL_COMBINERS_NV                        0x854E\r
+#define GL_COLOR_SUM_CLAMP_NV                              0x854F\r
+#define GL_COMBINER0_NV                                    0x8550\r
+#define GL_COMBINER1_NV                                    0x8551\r
+#define GL_COMBINER2_NV                                    0x8552\r
+#define GL_COMBINER3_NV                                    0x8553\r
+#define GL_COMBINER4_NV                                    0x8554\r
+#define GL_COMBINER5_NV                                    0x8555\r
+#define GL_COMBINER6_NV                                    0x8556\r
+#define GL_COMBINER7_NV                                    0x8557\r
+#ifndef GLEE_H_DEFINED_glCombinerParameterfvNV\r
+#define GLEE_H_DEFINED_glCombinerParameterfvNV\r
+  typedef void (APIENTRYP GLEEPFNGLCOMBINERPARAMETERFVNVPROC) (GLenum pname, const GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLCOMBINERPARAMETERFVNVPROC GLeeFuncPtr_glCombinerParameterfvNV;\r
+  #define glCombinerParameterfvNV GLeeFuncPtr_glCombinerParameterfvNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glCombinerParameterfNV\r
+#define GLEE_H_DEFINED_glCombinerParameterfNV\r
+  typedef void (APIENTRYP GLEEPFNGLCOMBINERPARAMETERFNVPROC) (GLenum pname, GLfloat param);\r
+  GLEE_EXTERN GLEEPFNGLCOMBINERPARAMETERFNVPROC GLeeFuncPtr_glCombinerParameterfNV;\r
+  #define glCombinerParameterfNV GLeeFuncPtr_glCombinerParameterfNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glCombinerParameterivNV\r
+#define GLEE_H_DEFINED_glCombinerParameterivNV\r
+  typedef void (APIENTRYP GLEEPFNGLCOMBINERPARAMETERIVNVPROC) (GLenum pname, const GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLCOMBINERPARAMETERIVNVPROC GLeeFuncPtr_glCombinerParameterivNV;\r
+  #define glCombinerParameterivNV GLeeFuncPtr_glCombinerParameterivNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glCombinerParameteriNV\r
+#define GLEE_H_DEFINED_glCombinerParameteriNV\r
+  typedef void (APIENTRYP GLEEPFNGLCOMBINERPARAMETERINVPROC) (GLenum pname, GLint param);\r
+  GLEE_EXTERN GLEEPFNGLCOMBINERPARAMETERINVPROC GLeeFuncPtr_glCombinerParameteriNV;\r
+  #define glCombinerParameteriNV GLeeFuncPtr_glCombinerParameteriNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glCombinerInputNV\r
+#define GLEE_H_DEFINED_glCombinerInputNV\r
+  typedef void (APIENTRYP GLEEPFNGLCOMBINERINPUTNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage);\r
+  GLEE_EXTERN GLEEPFNGLCOMBINERINPUTNVPROC GLeeFuncPtr_glCombinerInputNV;\r
+  #define glCombinerInputNV GLeeFuncPtr_glCombinerInputNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glCombinerOutputNV\r
+#define GLEE_H_DEFINED_glCombinerOutputNV\r
+  typedef void (APIENTRYP GLEEPFNGLCOMBINEROUTPUTNVPROC) (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum);\r
+  GLEE_EXTERN GLEEPFNGLCOMBINEROUTPUTNVPROC GLeeFuncPtr_glCombinerOutputNV;\r
+  #define glCombinerOutputNV GLeeFuncPtr_glCombinerOutputNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFinalCombinerInputNV\r
+#define GLEE_H_DEFINED_glFinalCombinerInputNV\r
+  typedef void (APIENTRYP GLEEPFNGLFINALCOMBINERINPUTNVPROC) (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage);\r
+  GLEE_EXTERN GLEEPFNGLFINALCOMBINERINPUTNVPROC GLeeFuncPtr_glFinalCombinerInputNV;\r
+  #define glFinalCombinerInputNV GLeeFuncPtr_glFinalCombinerInputNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetCombinerInputParameterfvNV\r
+#define GLEE_H_DEFINED_glGetCombinerInputParameterfvNV\r
+  typedef void (APIENTRYP GLEEPFNGLGETCOMBINERINPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLGETCOMBINERINPUTPARAMETERFVNVPROC GLeeFuncPtr_glGetCombinerInputParameterfvNV;\r
+  #define glGetCombinerInputParameterfvNV GLeeFuncPtr_glGetCombinerInputParameterfvNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetCombinerInputParameterivNV\r
+#define GLEE_H_DEFINED_glGetCombinerInputParameterivNV\r
+  typedef void (APIENTRYP GLEEPFNGLGETCOMBINERINPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETCOMBINERINPUTPARAMETERIVNVPROC GLeeFuncPtr_glGetCombinerInputParameterivNV;\r
+  #define glGetCombinerInputParameterivNV GLeeFuncPtr_glGetCombinerInputParameterivNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetCombinerOutputParameterfvNV\r
+#define GLEE_H_DEFINED_glGetCombinerOutputParameterfvNV\r
+  typedef void (APIENTRYP GLEEPFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC GLeeFuncPtr_glGetCombinerOutputParameterfvNV;\r
+  #define glGetCombinerOutputParameterfvNV GLeeFuncPtr_glGetCombinerOutputParameterfvNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetCombinerOutputParameterivNV\r
+#define GLEE_H_DEFINED_glGetCombinerOutputParameterivNV\r
+  typedef void (APIENTRYP GLEEPFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC GLeeFuncPtr_glGetCombinerOutputParameterivNV;\r
+  #define glGetCombinerOutputParameterivNV GLeeFuncPtr_glGetCombinerOutputParameterivNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetFinalCombinerInputParameterfvNV\r
+#define GLEE_H_DEFINED_glGetFinalCombinerInputParameterfvNV\r
+  typedef void (APIENTRYP GLEEPFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC) (GLenum variable, GLenum pname, GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC GLeeFuncPtr_glGetFinalCombinerInputParameterfvNV;\r
+  #define glGetFinalCombinerInputParameterfvNV GLeeFuncPtr_glGetFinalCombinerInputParameterfvNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetFinalCombinerInputParameterivNV\r
+#define GLEE_H_DEFINED_glGetFinalCombinerInputParameterivNV\r
+  typedef void (APIENTRYP GLEEPFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC) (GLenum variable, GLenum pname, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC GLeeFuncPtr_glGetFinalCombinerInputParameterivNV;\r
+  #define glGetFinalCombinerInputParameterivNV GLeeFuncPtr_glGetFinalCombinerInputParameterivNV\r
+#endif\r
+#endif \r
+\r
+/* GL_NV_fog_distance */\r
+\r
+#ifndef GL_NV_fog_distance\r
+#define GL_NV_fog_distance 1\r
+#define __GLEE_GL_NV_fog_distance 1\r
+/* Constants */\r
+#define GL_FOG_DISTANCE_MODE_NV                            0x855A\r
+#define GL_EYE_RADIAL_NV                                   0x855B\r
+#define GL_EYE_PLANE_ABSOLUTE_NV                           0x855C\r
+#endif \r
+\r
+/* GL_NV_texgen_emboss */\r
+\r
+#ifndef GL_NV_texgen_emboss\r
+#define GL_NV_texgen_emboss 1\r
+#define __GLEE_GL_NV_texgen_emboss 1\r
+/* Constants */\r
+#define GL_EMBOSS_LIGHT_NV                                 0x855D\r
+#define GL_EMBOSS_CONSTANT_NV                              0x855E\r
+#define GL_EMBOSS_MAP_NV                                   0x855F\r
+#endif \r
+\r
+/* GL_NV_blend_square */\r
+\r
+#ifndef GL_NV_blend_square\r
+#define GL_NV_blend_square 1\r
+#define __GLEE_GL_NV_blend_square 1\r
+/* Constants */\r
+#endif \r
+\r
+/* GL_NV_texture_env_combine4 */\r
+\r
+#ifndef GL_NV_texture_env_combine4\r
+#define GL_NV_texture_env_combine4 1\r
+#define __GLEE_GL_NV_texture_env_combine4 1\r
+/* Constants */\r
+#define GL_COMBINE4_NV                                     0x8503\r
+#define GL_SOURCE3_RGB_NV                                  0x8583\r
+#define GL_SOURCE3_ALPHA_NV                                0x858B\r
+#define GL_OPERAND3_RGB_NV                                 0x8593\r
+#define GL_OPERAND3_ALPHA_NV                               0x859B\r
+#endif \r
+\r
+/* GL_MESA_resize_buffers */\r
+\r
+#ifndef GL_MESA_resize_buffers\r
+#define GL_MESA_resize_buffers 1\r
+#define __GLEE_GL_MESA_resize_buffers 1\r
+/* Constants */\r
+#ifndef GLEE_H_DEFINED_glResizeBuffersMESA\r
+#define GLEE_H_DEFINED_glResizeBuffersMESA\r
+  typedef void (APIENTRYP GLEEPFNGLRESIZEBUFFERSMESAPROC) ();\r
+  GLEE_EXTERN GLEEPFNGLRESIZEBUFFERSMESAPROC GLeeFuncPtr_glResizeBuffersMESA;\r
+  #define glResizeBuffersMESA GLeeFuncPtr_glResizeBuffersMESA\r
+#endif\r
+#endif \r
+\r
+/* GL_MESA_window_pos */\r
+\r
+#ifndef GL_MESA_window_pos\r
+#define GL_MESA_window_pos 1\r
+#define __GLEE_GL_MESA_window_pos 1\r
+/* Constants */\r
+#ifndef GLEE_H_DEFINED_glWindowPos2dMESA\r
+#define GLEE_H_DEFINED_glWindowPos2dMESA\r
+  typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2DMESAPROC) (GLdouble x, GLdouble y);\r
+  GLEE_EXTERN GLEEPFNGLWINDOWPOS2DMESAPROC GLeeFuncPtr_glWindowPos2dMESA;\r
+  #define glWindowPos2dMESA GLeeFuncPtr_glWindowPos2dMESA\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glWindowPos2dvMESA\r
+#define GLEE_H_DEFINED_glWindowPos2dvMESA\r
+  typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2DVMESAPROC) (const GLdouble * v);\r
+  GLEE_EXTERN GLEEPFNGLWINDOWPOS2DVMESAPROC GLeeFuncPtr_glWindowPos2dvMESA;\r
+  #define glWindowPos2dvMESA GLeeFuncPtr_glWindowPos2dvMESA\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glWindowPos2fMESA\r
+#define GLEE_H_DEFINED_glWindowPos2fMESA\r
+  typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2FMESAPROC) (GLfloat x, GLfloat y);\r
+  GLEE_EXTERN GLEEPFNGLWINDOWPOS2FMESAPROC GLeeFuncPtr_glWindowPos2fMESA;\r
+  #define glWindowPos2fMESA GLeeFuncPtr_glWindowPos2fMESA\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glWindowPos2fvMESA\r
+#define GLEE_H_DEFINED_glWindowPos2fvMESA\r
+  typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2FVMESAPROC) (const GLfloat * v);\r
+  GLEE_EXTERN GLEEPFNGLWINDOWPOS2FVMESAPROC GLeeFuncPtr_glWindowPos2fvMESA;\r
+  #define glWindowPos2fvMESA GLeeFuncPtr_glWindowPos2fvMESA\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glWindowPos2iMESA\r
+#define GLEE_H_DEFINED_glWindowPos2iMESA\r
+  typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2IMESAPROC) (GLint x, GLint y);\r
+  GLEE_EXTERN GLEEPFNGLWINDOWPOS2IMESAPROC GLeeFuncPtr_glWindowPos2iMESA;\r
+  #define glWindowPos2iMESA GLeeFuncPtr_glWindowPos2iMESA\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glWindowPos2ivMESA\r
+#define GLEE_H_DEFINED_glWindowPos2ivMESA\r
+  typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2IVMESAPROC) (const GLint * v);\r
+  GLEE_EXTERN GLEEPFNGLWINDOWPOS2IVMESAPROC GLeeFuncPtr_glWindowPos2ivMESA;\r
+  #define glWindowPos2ivMESA GLeeFuncPtr_glWindowPos2ivMESA\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glWindowPos2sMESA\r
+#define GLEE_H_DEFINED_glWindowPos2sMESA\r
+  typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2SMESAPROC) (GLshort x, GLshort y);\r
+  GLEE_EXTERN GLEEPFNGLWINDOWPOS2SMESAPROC GLeeFuncPtr_glWindowPos2sMESA;\r
+  #define glWindowPos2sMESA GLeeFuncPtr_glWindowPos2sMESA\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glWindowPos2svMESA\r
+#define GLEE_H_DEFINED_glWindowPos2svMESA\r
+  typedef void (APIENTRYP GLEEPFNGLWINDOWPOS2SVMESAPROC) (const GLshort * v);\r
+  GLEE_EXTERN GLEEPFNGLWINDOWPOS2SVMESAPROC GLeeFuncPtr_glWindowPos2svMESA;\r
+  #define glWindowPos2svMESA GLeeFuncPtr_glWindowPos2svMESA\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glWindowPos3dMESA\r
+#define GLEE_H_DEFINED_glWindowPos3dMESA\r
+  typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3DMESAPROC) (GLdouble x, GLdouble y, GLdouble z);\r
+  GLEE_EXTERN GLEEPFNGLWINDOWPOS3DMESAPROC GLeeFuncPtr_glWindowPos3dMESA;\r
+  #define glWindowPos3dMESA GLeeFuncPtr_glWindowPos3dMESA\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glWindowPos3dvMESA\r
+#define GLEE_H_DEFINED_glWindowPos3dvMESA\r
+  typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3DVMESAPROC) (const GLdouble * v);\r
+  GLEE_EXTERN GLEEPFNGLWINDOWPOS3DVMESAPROC GLeeFuncPtr_glWindowPos3dvMESA;\r
+  #define glWindowPos3dvMESA GLeeFuncPtr_glWindowPos3dvMESA\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glWindowPos3fMESA\r
+#define GLEE_H_DEFINED_glWindowPos3fMESA\r
+  typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3FMESAPROC) (GLfloat x, GLfloat y, GLfloat z);\r
+  GLEE_EXTERN GLEEPFNGLWINDOWPOS3FMESAPROC GLeeFuncPtr_glWindowPos3fMESA;\r
+  #define glWindowPos3fMESA GLeeFuncPtr_glWindowPos3fMESA\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glWindowPos3fvMESA\r
+#define GLEE_H_DEFINED_glWindowPos3fvMESA\r
+  typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3FVMESAPROC) (const GLfloat * v);\r
+  GLEE_EXTERN GLEEPFNGLWINDOWPOS3FVMESAPROC GLeeFuncPtr_glWindowPos3fvMESA;\r
+  #define glWindowPos3fvMESA GLeeFuncPtr_glWindowPos3fvMESA\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glWindowPos3iMESA\r
+#define GLEE_H_DEFINED_glWindowPos3iMESA\r
+  typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3IMESAPROC) (GLint x, GLint y, GLint z);\r
+  GLEE_EXTERN GLEEPFNGLWINDOWPOS3IMESAPROC GLeeFuncPtr_glWindowPos3iMESA;\r
+  #define glWindowPos3iMESA GLeeFuncPtr_glWindowPos3iMESA\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glWindowPos3ivMESA\r
+#define GLEE_H_DEFINED_glWindowPos3ivMESA\r
+  typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3IVMESAPROC) (const GLint * v);\r
+  GLEE_EXTERN GLEEPFNGLWINDOWPOS3IVMESAPROC GLeeFuncPtr_glWindowPos3ivMESA;\r
+  #define glWindowPos3ivMESA GLeeFuncPtr_glWindowPos3ivMESA\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glWindowPos3sMESA\r
+#define GLEE_H_DEFINED_glWindowPos3sMESA\r
+  typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3SMESAPROC) (GLshort x, GLshort y, GLshort z);\r
+  GLEE_EXTERN GLEEPFNGLWINDOWPOS3SMESAPROC GLeeFuncPtr_glWindowPos3sMESA;\r
+  #define glWindowPos3sMESA GLeeFuncPtr_glWindowPos3sMESA\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glWindowPos3svMESA\r
+#define GLEE_H_DEFINED_glWindowPos3svMESA\r
+  typedef void (APIENTRYP GLEEPFNGLWINDOWPOS3SVMESAPROC) (const GLshort * v);\r
+  GLEE_EXTERN GLEEPFNGLWINDOWPOS3SVMESAPROC GLeeFuncPtr_glWindowPos3svMESA;\r
+  #define glWindowPos3svMESA GLeeFuncPtr_glWindowPos3svMESA\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glWindowPos4dMESA\r
+#define GLEE_H_DEFINED_glWindowPos4dMESA\r
+  typedef void (APIENTRYP GLEEPFNGLWINDOWPOS4DMESAPROC) (GLdouble x, GLdouble y, GLdouble z, GLdouble w);\r
+  GLEE_EXTERN GLEEPFNGLWINDOWPOS4DMESAPROC GLeeFuncPtr_glWindowPos4dMESA;\r
+  #define glWindowPos4dMESA GLeeFuncPtr_glWindowPos4dMESA\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glWindowPos4dvMESA\r
+#define GLEE_H_DEFINED_glWindowPos4dvMESA\r
+  typedef void (APIENTRYP GLEEPFNGLWINDOWPOS4DVMESAPROC) (const GLdouble * v);\r
+  GLEE_EXTERN GLEEPFNGLWINDOWPOS4DVMESAPROC GLeeFuncPtr_glWindowPos4dvMESA;\r
+  #define glWindowPos4dvMESA GLeeFuncPtr_glWindowPos4dvMESA\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glWindowPos4fMESA\r
+#define GLEE_H_DEFINED_glWindowPos4fMESA\r
+  typedef void (APIENTRYP GLEEPFNGLWINDOWPOS4FMESAPROC) (GLfloat x, GLfloat y, GLfloat z, GLfloat w);\r
+  GLEE_EXTERN GLEEPFNGLWINDOWPOS4FMESAPROC GLeeFuncPtr_glWindowPos4fMESA;\r
+  #define glWindowPos4fMESA GLeeFuncPtr_glWindowPos4fMESA\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glWindowPos4fvMESA\r
+#define GLEE_H_DEFINED_glWindowPos4fvMESA\r
+  typedef void (APIENTRYP GLEEPFNGLWINDOWPOS4FVMESAPROC) (const GLfloat * v);\r
+  GLEE_EXTERN GLEEPFNGLWINDOWPOS4FVMESAPROC GLeeFuncPtr_glWindowPos4fvMESA;\r
+  #define glWindowPos4fvMESA GLeeFuncPtr_glWindowPos4fvMESA\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glWindowPos4iMESA\r
+#define GLEE_H_DEFINED_glWindowPos4iMESA\r
+  typedef void (APIENTRYP GLEEPFNGLWINDOWPOS4IMESAPROC) (GLint x, GLint y, GLint z, GLint w);\r
+  GLEE_EXTERN GLEEPFNGLWINDOWPOS4IMESAPROC GLeeFuncPtr_glWindowPos4iMESA;\r
+  #define glWindowPos4iMESA GLeeFuncPtr_glWindowPos4iMESA\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glWindowPos4ivMESA\r
+#define GLEE_H_DEFINED_glWindowPos4ivMESA\r
+  typedef void (APIENTRYP GLEEPFNGLWINDOWPOS4IVMESAPROC) (const GLint * v);\r
+  GLEE_EXTERN GLEEPFNGLWINDOWPOS4IVMESAPROC GLeeFuncPtr_glWindowPos4ivMESA;\r
+  #define glWindowPos4ivMESA GLeeFuncPtr_glWindowPos4ivMESA\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glWindowPos4sMESA\r
+#define GLEE_H_DEFINED_glWindowPos4sMESA\r
+  typedef void (APIENTRYP GLEEPFNGLWINDOWPOS4SMESAPROC) (GLshort x, GLshort y, GLshort z, GLshort w);\r
+  GLEE_EXTERN GLEEPFNGLWINDOWPOS4SMESAPROC GLeeFuncPtr_glWindowPos4sMESA;\r
+  #define glWindowPos4sMESA GLeeFuncPtr_glWindowPos4sMESA\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glWindowPos4svMESA\r
+#define GLEE_H_DEFINED_glWindowPos4svMESA\r
+  typedef void (APIENTRYP GLEEPFNGLWINDOWPOS4SVMESAPROC) (const GLshort * v);\r
+  GLEE_EXTERN GLEEPFNGLWINDOWPOS4SVMESAPROC GLeeFuncPtr_glWindowPos4svMESA;\r
+  #define glWindowPos4svMESA GLeeFuncPtr_glWindowPos4svMESA\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_texture_compression_s3tc */\r
+\r
+#ifndef GL_EXT_texture_compression_s3tc\r
+#define GL_EXT_texture_compression_s3tc 1\r
+#define __GLEE_GL_EXT_texture_compression_s3tc 1\r
+/* Constants */\r
+#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT                    0x83F0\r
+#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT                   0x83F1\r
+#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT                   0x83F2\r
+#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT                   0x83F3\r
+#endif \r
+\r
+/* GL_IBM_cull_vertex */\r
+\r
+#ifndef GL_IBM_cull_vertex\r
+#define GL_IBM_cull_vertex 1\r
+#define __GLEE_GL_IBM_cull_vertex 1\r
+/* Constants */\r
+#define GL_CULL_VERTEX_IBM                                 103050\r
+#endif \r
+\r
+/* GL_IBM_multimode_draw_arrays */\r
+\r
+#ifndef GL_IBM_multimode_draw_arrays\r
+#define GL_IBM_multimode_draw_arrays 1\r
+#define __GLEE_GL_IBM_multimode_draw_arrays 1\r
+/* Constants */\r
+#ifndef GLEE_H_DEFINED_glMultiModeDrawArraysIBM\r
+#define GLEE_H_DEFINED_glMultiModeDrawArraysIBM\r
+  typedef void (APIENTRYP GLEEPFNGLMULTIMODEDRAWARRAYSIBMPROC) (const GLenum * mode, const GLint * first, const GLsizei * count, GLsizei primcount, GLint modestride);\r
+  GLEE_EXTERN GLEEPFNGLMULTIMODEDRAWARRAYSIBMPROC GLeeFuncPtr_glMultiModeDrawArraysIBM;\r
+  #define glMultiModeDrawArraysIBM GLeeFuncPtr_glMultiModeDrawArraysIBM\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiModeDrawElementsIBM\r
+#define GLEE_H_DEFINED_glMultiModeDrawElementsIBM\r
+  typedef void (APIENTRYP GLEEPFNGLMULTIMODEDRAWELEMENTSIBMPROC) (const GLenum * mode, const GLsizei * count, GLenum type, const GLvoid* const * indices, GLsizei primcount, GLint modestride);\r
+  GLEE_EXTERN GLEEPFNGLMULTIMODEDRAWELEMENTSIBMPROC GLeeFuncPtr_glMultiModeDrawElementsIBM;\r
+  #define glMultiModeDrawElementsIBM GLeeFuncPtr_glMultiModeDrawElementsIBM\r
+#endif\r
+#endif \r
+\r
+/* GL_IBM_vertex_array_lists */\r
+\r
+#ifndef GL_IBM_vertex_array_lists\r
+#define GL_IBM_vertex_array_lists 1\r
+#define __GLEE_GL_IBM_vertex_array_lists 1\r
+/* Constants */\r
+#define GL_VERTEX_ARRAY_LIST_IBM                           103070\r
+#define GL_NORMAL_ARRAY_LIST_IBM                           103071\r
+#define GL_COLOR_ARRAY_LIST_IBM                            103072\r
+#define GL_INDEX_ARRAY_LIST_IBM                            103073\r
+#define GL_TEXTURE_COORD_ARRAY_LIST_IBM                    103074\r
+#define GL_EDGE_FLAG_ARRAY_LIST_IBM                        103075\r
+#define GL_FOG_COORDINATE_ARRAY_LIST_IBM                   103076\r
+#define GL_SECONDARY_COLOR_ARRAY_LIST_IBM                  103077\r
+#define GL_VERTEX_ARRAY_LIST_STRIDE_IBM                    103080\r
+#define GL_NORMAL_ARRAY_LIST_STRIDE_IBM                    103081\r
+#define GL_COLOR_ARRAY_LIST_STRIDE_IBM                     103082\r
+#define GL_INDEX_ARRAY_LIST_STRIDE_IBM                     103083\r
+#define GL_TEXTURE_COORD_ARRAY_LIST_STRIDE_IBM             103084\r
+#define GL_EDGE_FLAG_ARRAY_LIST_STRIDE_IBM                 103085\r
+#define GL_FOG_COORDINATE_ARRAY_LIST_STRIDE_IBM            103086\r
+#define GL_SECONDARY_COLOR_ARRAY_LIST_STRIDE_IBM           103087\r
+#ifndef GLEE_H_DEFINED_glColorPointerListIBM\r
+#define GLEE_H_DEFINED_glColorPointerListIBM\r
+  typedef void (APIENTRYP GLEEPFNGLCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* * pointer, GLint ptrstride);\r
+  GLEE_EXTERN GLEEPFNGLCOLORPOINTERLISTIBMPROC GLeeFuncPtr_glColorPointerListIBM;\r
+  #define glColorPointerListIBM GLeeFuncPtr_glColorPointerListIBM\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glSecondaryColorPointerListIBM\r
+#define GLEE_H_DEFINED_glSecondaryColorPointerListIBM\r
+  typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* * pointer, GLint ptrstride);\r
+  GLEE_EXTERN GLEEPFNGLSECONDARYCOLORPOINTERLISTIBMPROC GLeeFuncPtr_glSecondaryColorPointerListIBM;\r
+  #define glSecondaryColorPointerListIBM GLeeFuncPtr_glSecondaryColorPointerListIBM\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glEdgeFlagPointerListIBM\r
+#define GLEE_H_DEFINED_glEdgeFlagPointerListIBM\r
+  typedef void (APIENTRYP GLEEPFNGLEDGEFLAGPOINTERLISTIBMPROC) (GLint stride, const GLboolean* * pointer, GLint ptrstride);\r
+  GLEE_EXTERN GLEEPFNGLEDGEFLAGPOINTERLISTIBMPROC GLeeFuncPtr_glEdgeFlagPointerListIBM;\r
+  #define glEdgeFlagPointerListIBM GLeeFuncPtr_glEdgeFlagPointerListIBM\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFogCoordPointerListIBM\r
+#define GLEE_H_DEFINED_glFogCoordPointerListIBM\r
+  typedef void (APIENTRYP GLEEPFNGLFOGCOORDPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* * pointer, GLint ptrstride);\r
+  GLEE_EXTERN GLEEPFNGLFOGCOORDPOINTERLISTIBMPROC GLeeFuncPtr_glFogCoordPointerListIBM;\r
+  #define glFogCoordPointerListIBM GLeeFuncPtr_glFogCoordPointerListIBM\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glIndexPointerListIBM\r
+#define GLEE_H_DEFINED_glIndexPointerListIBM\r
+  typedef void (APIENTRYP GLEEPFNGLINDEXPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* * pointer, GLint ptrstride);\r
+  GLEE_EXTERN GLEEPFNGLINDEXPOINTERLISTIBMPROC GLeeFuncPtr_glIndexPointerListIBM;\r
+  #define glIndexPointerListIBM GLeeFuncPtr_glIndexPointerListIBM\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glNormalPointerListIBM\r
+#define GLEE_H_DEFINED_glNormalPointerListIBM\r
+  typedef void (APIENTRYP GLEEPFNGLNORMALPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* * pointer, GLint ptrstride);\r
+  GLEE_EXTERN GLEEPFNGLNORMALPOINTERLISTIBMPROC GLeeFuncPtr_glNormalPointerListIBM;\r
+  #define glNormalPointerListIBM GLeeFuncPtr_glNormalPointerListIBM\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTexCoordPointerListIBM\r
+#define GLEE_H_DEFINED_glTexCoordPointerListIBM\r
+  typedef void (APIENTRYP GLEEPFNGLTEXCOORDPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* * pointer, GLint ptrstride);\r
+  GLEE_EXTERN GLEEPFNGLTEXCOORDPOINTERLISTIBMPROC GLeeFuncPtr_glTexCoordPointerListIBM;\r
+  #define glTexCoordPointerListIBM GLeeFuncPtr_glTexCoordPointerListIBM\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexPointerListIBM\r
+#define GLEE_H_DEFINED_glVertexPointerListIBM\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* * pointer, GLint ptrstride);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXPOINTERLISTIBMPROC GLeeFuncPtr_glVertexPointerListIBM;\r
+  #define glVertexPointerListIBM GLeeFuncPtr_glVertexPointerListIBM\r
+#endif\r
+#endif \r
+\r
+/* GL_SGIX_subsample */\r
+\r
+#ifndef GL_SGIX_subsample\r
+#define GL_SGIX_subsample 1\r
+#define __GLEE_GL_SGIX_subsample 1\r
+/* Constants */\r
+#define GL_PACK_SUBSAMPLE_RATE_SGIX                        0x85A0\r
+#define GL_UNPACK_SUBSAMPLE_RATE_SGIX                      0x85A1\r
+#define GL_PIXEL_SUBSAMPLE_4444_SGIX                       0x85A2\r
+#define GL_PIXEL_SUBSAMPLE_2424_SGIX                       0x85A3\r
+#define GL_PIXEL_SUBSAMPLE_4242_SGIX                       0x85A4\r
+#endif \r
+\r
+/* GL_SGIX_ycrcb_subsample */\r
+\r
+#ifndef GL_SGIX_ycrcb_subsample\r
+#define GL_SGIX_ycrcb_subsample 1\r
+#define __GLEE_GL_SGIX_ycrcb_subsample 1\r
+/* Constants */\r
+#endif \r
+\r
+/* GL_SGIX_ycrcba */\r
+\r
+#ifndef GL_SGIX_ycrcba\r
+#define GL_SGIX_ycrcba 1\r
+#define __GLEE_GL_SGIX_ycrcba 1\r
+/* Constants */\r
+#define GL_YCRCB_SGIX                                      0x8318\r
+#define GL_YCRCBA_SGIX                                     0x8319\r
+#endif \r
+\r
+/* GL_SGI_depth_pass_instrument */\r
+\r
+#ifndef GL_SGI_depth_pass_instrument\r
+#define GL_SGI_depth_pass_instrument 1\r
+#define __GLEE_GL_SGI_depth_pass_instrument 1\r
+/* Constants */\r
+#define GL_DEPTH_PASS_INSTRUMENT_SGIX                      0x8310\r
+#define GL_DEPTH_PASS_INSTRUMENT_COUNTERS_SGIX             0x8311\r
+#define GL_DEPTH_PASS_INSTRUMENT_MAX_SGIX                  0x8312\r
+#endif \r
+\r
+/* GL_3DFX_texture_compression_FXT1 */\r
+\r
+#ifndef GL_3DFX_texture_compression_FXT1\r
+#define GL_3DFX_texture_compression_FXT1 1\r
+#define __GLEE_GL_3DFX_texture_compression_FXT1 1\r
+/* Constants */\r
+#define GL_COMPRESSED_RGB_FXT1_3DFX                        0x86B0\r
+#define GL_COMPRESSED_RGBA_FXT1_3DFX                       0x86B1\r
+#endif \r
+\r
+/* GL_3DFX_multisample */\r
+\r
+#ifndef GL_3DFX_multisample\r
+#define GL_3DFX_multisample 1\r
+#define __GLEE_GL_3DFX_multisample 1\r
+/* Constants */\r
+#define GL_MULTISAMPLE_3DFX                                0x86B2\r
+#define GL_SAMPLE_BUFFERS_3DFX                             0x86B3\r
+#define GL_SAMPLES_3DFX                                    0x86B4\r
+#define GL_MULTISAMPLE_BIT_3DFX                            0x20000000\r
+#endif \r
+\r
+/* GL_3DFX_tbuffer */\r
+\r
+#ifndef GL_3DFX_tbuffer\r
+#define GL_3DFX_tbuffer 1\r
+#define __GLEE_GL_3DFX_tbuffer 1\r
+/* Constants */\r
+#ifndef GLEE_H_DEFINED_glTbufferMask3DFX\r
+#define GLEE_H_DEFINED_glTbufferMask3DFX\r
+  typedef void (APIENTRYP GLEEPFNGLTBUFFERMASK3DFXPROC) (GLuint mask);\r
+  GLEE_EXTERN GLEEPFNGLTBUFFERMASK3DFXPROC GLeeFuncPtr_glTbufferMask3DFX;\r
+  #define glTbufferMask3DFX GLeeFuncPtr_glTbufferMask3DFX\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_multisample */\r
+\r
+#ifndef GL_EXT_multisample\r
+#define GL_EXT_multisample 1\r
+#define __GLEE_GL_EXT_multisample 1\r
+/* Constants */\r
+#define GL_MULTISAMPLE_EXT                                 0x809D\r
+#define GL_SAMPLE_ALPHA_TO_MASK_EXT                        0x809E\r
+#define GL_SAMPLE_ALPHA_TO_ONE_EXT                         0x809F\r
+#define GL_SAMPLE_MASK_EXT                                 0x80A0\r
+#define GL_1PASS_EXT                                       0x80A1\r
+#define GL_2PASS_0_EXT                                     0x80A2\r
+#define GL_2PASS_1_EXT                                     0x80A3\r
+#define GL_4PASS_0_EXT                                     0x80A4\r
+#define GL_4PASS_1_EXT                                     0x80A5\r
+#define GL_4PASS_2_EXT                                     0x80A6\r
+#define GL_4PASS_3_EXT                                     0x80A7\r
+#define GL_SAMPLE_BUFFERS_EXT                              0x80A8\r
+#define GL_SAMPLES_EXT                                     0x80A9\r
+#define GL_SAMPLE_MASK_VALUE_EXT                           0x80AA\r
+#define GL_SAMPLE_MASK_INVERT_EXT                          0x80AB\r
+#define GL_SAMPLE_PATTERN_EXT                              0x80AC\r
+#define GL_MULTISAMPLE_BIT_EXT                             0x20000000\r
+#ifndef GLEE_H_DEFINED_glSampleMaskEXT\r
+#define GLEE_H_DEFINED_glSampleMaskEXT\r
+  typedef void (APIENTRYP GLEEPFNGLSAMPLEMASKEXTPROC) (GLclampf value, GLboolean invert);\r
+  GLEE_EXTERN GLEEPFNGLSAMPLEMASKEXTPROC GLeeFuncPtr_glSampleMaskEXT;\r
+  #define glSampleMaskEXT GLeeFuncPtr_glSampleMaskEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glSamplePatternEXT\r
+#define GLEE_H_DEFINED_glSamplePatternEXT\r
+  typedef void (APIENTRYP GLEEPFNGLSAMPLEPATTERNEXTPROC) (GLenum pattern);\r
+  GLEE_EXTERN GLEEPFNGLSAMPLEPATTERNEXTPROC GLeeFuncPtr_glSamplePatternEXT;\r
+  #define glSamplePatternEXT GLeeFuncPtr_glSamplePatternEXT\r
+#endif\r
+#endif \r
+\r
+/* GL_SGIX_vertex_preclip */\r
+\r
+#ifndef GL_SGIX_vertex_preclip\r
+#define GL_SGIX_vertex_preclip 1\r
+#define __GLEE_GL_SGIX_vertex_preclip 1\r
+/* Constants */\r
+#define GL_VERTEX_PRECLIP_SGIX                             0x83EE\r
+#define GL_VERTEX_PRECLIP_HINT_SGIX                        0x83EF\r
+#endif \r
+\r
+/* GL_SGIX_convolution_accuracy */\r
+\r
+#ifndef GL_SGIX_convolution_accuracy\r
+#define GL_SGIX_convolution_accuracy 1\r
+#define __GLEE_GL_SGIX_convolution_accuracy 1\r
+/* Constants */\r
+#define GL_CONVOLUTION_HINT_SGIX                           0x8316\r
+#endif \r
+\r
+/* GL_SGIX_resample */\r
+\r
+#ifndef GL_SGIX_resample\r
+#define GL_SGIX_resample 1\r
+#define __GLEE_GL_SGIX_resample 1\r
+/* Constants */\r
+#define GL_PACK_RESAMPLE_SGIX                              0x842C\r
+#define GL_UNPACK_RESAMPLE_SGIX                            0x842D\r
+#define GL_RESAMPLE_REPLICATE_SGIX                         0x842E\r
+#define GL_RESAMPLE_ZERO_FILL_SGIX                         0x842F\r
+#define GL_RESAMPLE_DECIMATE_SGIX                          0x8430\r
+#endif \r
+\r
+/* GL_SGIS_point_line_texgen */\r
+\r
+#ifndef GL_SGIS_point_line_texgen\r
+#define GL_SGIS_point_line_texgen 1\r
+#define __GLEE_GL_SGIS_point_line_texgen 1\r
+/* Constants */\r
+#define GL_EYE_DISTANCE_TO_POINT_SGIS                      0x81F0\r
+#define GL_OBJECT_DISTANCE_TO_POINT_SGIS                   0x81F1\r
+#define GL_EYE_DISTANCE_TO_LINE_SGIS                       0x81F2\r
+#define GL_OBJECT_DISTANCE_TO_LINE_SGIS                    0x81F3\r
+#define GL_EYE_POINT_SGIS                                  0x81F4\r
+#define GL_OBJECT_POINT_SGIS                               0x81F5\r
+#define GL_EYE_LINE_SGIS                                   0x81F6\r
+#define GL_OBJECT_LINE_SGIS                                0x81F7\r
+#endif \r
+\r
+/* GL_SGIS_texture_color_mask */\r
+\r
+#ifndef GL_SGIS_texture_color_mask\r
+#define GL_SGIS_texture_color_mask 1\r
+#define __GLEE_GL_SGIS_texture_color_mask 1\r
+/* Constants */\r
+#define GL_TEXTURE_COLOR_WRITEMASK_SGIS                    0x81EF\r
+#ifndef GLEE_H_DEFINED_glTextureColorMaskSGIS\r
+#define GLEE_H_DEFINED_glTextureColorMaskSGIS\r
+  typedef void (APIENTRYP GLEEPFNGLTEXTURECOLORMASKSGISPROC) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);\r
+  GLEE_EXTERN GLEEPFNGLTEXTURECOLORMASKSGISPROC GLeeFuncPtr_glTextureColorMaskSGIS;\r
+  #define glTextureColorMaskSGIS GLeeFuncPtr_glTextureColorMaskSGIS\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_texture_env_dot3 */\r
+\r
+#ifndef GL_EXT_texture_env_dot3\r
+#define GL_EXT_texture_env_dot3 1\r
+#define __GLEE_GL_EXT_texture_env_dot3 1\r
+/* Constants */\r
+#define GL_DOT3_RGB_EXT                                    0x8740\r
+#define GL_DOT3_RGBA_EXT                                   0x8741\r
+#endif \r
+\r
+/* GL_ATI_texture_mirror_once */\r
+\r
+#ifndef GL_ATI_texture_mirror_once\r
+#define GL_ATI_texture_mirror_once 1\r
+#define __GLEE_GL_ATI_texture_mirror_once 1\r
+/* Constants */\r
+#define GL_MIRROR_CLAMP_ATI                                0x8742\r
+#define GL_MIRROR_CLAMP_TO_EDGE_ATI                        0x8743\r
+#endif \r
+\r
+/* GL_NV_fence */\r
+\r
+#ifndef GL_NV_fence\r
+#define GL_NV_fence 1\r
+#define __GLEE_GL_NV_fence 1\r
+/* Constants */\r
+#define GL_ALL_COMPLETED_NV                                0x84F2\r
+#define GL_FENCE_STATUS_NV                                 0x84F3\r
+#define GL_FENCE_CONDITION_NV                              0x84F4\r
+#ifndef GLEE_H_DEFINED_glDeleteFencesNV\r
+#define GLEE_H_DEFINED_glDeleteFencesNV\r
+  typedef void (APIENTRYP GLEEPFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint * fences);\r
+  GLEE_EXTERN GLEEPFNGLDELETEFENCESNVPROC GLeeFuncPtr_glDeleteFencesNV;\r
+  #define glDeleteFencesNV GLeeFuncPtr_glDeleteFencesNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGenFencesNV\r
+#define GLEE_H_DEFINED_glGenFencesNV\r
+  typedef void (APIENTRYP GLEEPFNGLGENFENCESNVPROC) (GLsizei n, GLuint * fences);\r
+  GLEE_EXTERN GLEEPFNGLGENFENCESNVPROC GLeeFuncPtr_glGenFencesNV;\r
+  #define glGenFencesNV GLeeFuncPtr_glGenFencesNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glIsFenceNV\r
+#define GLEE_H_DEFINED_glIsFenceNV\r
+  typedef GLboolean (APIENTRYP GLEEPFNGLISFENCENVPROC) (GLuint fence);\r
+  GLEE_EXTERN GLEEPFNGLISFENCENVPROC GLeeFuncPtr_glIsFenceNV;\r
+  #define glIsFenceNV GLeeFuncPtr_glIsFenceNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTestFenceNV\r
+#define GLEE_H_DEFINED_glTestFenceNV\r
+  typedef GLboolean (APIENTRYP GLEEPFNGLTESTFENCENVPROC) (GLuint fence);\r
+  GLEE_EXTERN GLEEPFNGLTESTFENCENVPROC GLeeFuncPtr_glTestFenceNV;\r
+  #define glTestFenceNV GLeeFuncPtr_glTestFenceNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetFenceivNV\r
+#define GLEE_H_DEFINED_glGetFenceivNV\r
+  typedef void (APIENTRYP GLEEPFNGLGETFENCEIVNVPROC) (GLuint fence, GLenum pname, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETFENCEIVNVPROC GLeeFuncPtr_glGetFenceivNV;\r
+  #define glGetFenceivNV GLeeFuncPtr_glGetFenceivNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFinishFenceNV\r
+#define GLEE_H_DEFINED_glFinishFenceNV\r
+  typedef void (APIENTRYP GLEEPFNGLFINISHFENCENVPROC) (GLuint fence);\r
+  GLEE_EXTERN GLEEPFNGLFINISHFENCENVPROC GLeeFuncPtr_glFinishFenceNV;\r
+  #define glFinishFenceNV GLeeFuncPtr_glFinishFenceNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glSetFenceNV\r
+#define GLEE_H_DEFINED_glSetFenceNV\r
+  typedef void (APIENTRYP GLEEPFNGLSETFENCENVPROC) (GLuint fence, GLenum condition);\r
+  GLEE_EXTERN GLEEPFNGLSETFENCENVPROC GLeeFuncPtr_glSetFenceNV;\r
+  #define glSetFenceNV GLeeFuncPtr_glSetFenceNV\r
+#endif\r
+#endif \r
+\r
+/* GL_IBM_texture_mirrored_repeat */\r
+\r
+#ifndef GL_IBM_texture_mirrored_repeat\r
+#define GL_IBM_texture_mirrored_repeat 1\r
+#define __GLEE_GL_IBM_texture_mirrored_repeat 1\r
+/* Constants */\r
+#define GL_MIRRORED_REPEAT_IBM                             0x8370\r
+#endif \r
+\r
+/* GL_NV_evaluators */\r
+\r
+#ifndef GL_NV_evaluators\r
+#define GL_NV_evaluators 1\r
+#define __GLEE_GL_NV_evaluators 1\r
+/* Constants */\r
+#define GL_EVAL_2D_NV                                      0x86C0\r
+#define GL_EVAL_TRIANGULAR_2D_NV                           0x86C1\r
+#define GL_MAP_TESSELLATION_NV                             0x86C2\r
+#define GL_MAP_ATTRIB_U_ORDER_NV                           0x86C3\r
+#define GL_MAP_ATTRIB_V_ORDER_NV                           0x86C4\r
+#define GL_EVAL_FRACTIONAL_TESSELLATION_NV                 0x86C5\r
+#define GL_EVAL_VERTEX_ATTRIB0_NV                          0x86C6\r
+#define GL_EVAL_VERTEX_ATTRIB1_NV                          0x86C7\r
+#define GL_EVAL_VERTEX_ATTRIB2_NV                          0x86C8\r
+#define GL_EVAL_VERTEX_ATTRIB3_NV                          0x86C9\r
+#define GL_EVAL_VERTEX_ATTRIB4_NV                          0x86CA\r
+#define GL_EVAL_VERTEX_ATTRIB5_NV                          0x86CB\r
+#define GL_EVAL_VERTEX_ATTRIB6_NV                          0x86CC\r
+#define GL_EVAL_VERTEX_ATTRIB7_NV                          0x86CD\r
+#define GL_EVAL_VERTEX_ATTRIB8_NV                          0x86CE\r
+#define GL_EVAL_VERTEX_ATTRIB9_NV                          0x86CF\r
+#define GL_EVAL_VERTEX_ATTRIB10_NV                         0x86D0\r
+#define GL_EVAL_VERTEX_ATTRIB11_NV                         0x86D1\r
+#define GL_EVAL_VERTEX_ATTRIB12_NV                         0x86D2\r
+#define GL_EVAL_VERTEX_ATTRIB13_NV                         0x86D3\r
+#define GL_EVAL_VERTEX_ATTRIB14_NV                         0x86D4\r
+#define GL_EVAL_VERTEX_ATTRIB15_NV                         0x86D5\r
+#define GL_MAX_MAP_TESSELLATION_NV                         0x86D6\r
+#define GL_MAX_RATIONAL_EVAL_ORDER_NV                      0x86D7\r
+#ifndef GLEE_H_DEFINED_glMapControlPointsNV\r
+#define GLEE_H_DEFINED_glMapControlPointsNV\r
+  typedef void (APIENTRYP GLEEPFNGLMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const GLvoid * points);\r
+  GLEE_EXTERN GLEEPFNGLMAPCONTROLPOINTSNVPROC GLeeFuncPtr_glMapControlPointsNV;\r
+  #define glMapControlPointsNV GLeeFuncPtr_glMapControlPointsNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMapParameterivNV\r
+#define GLEE_H_DEFINED_glMapParameterivNV\r
+  typedef void (APIENTRYP GLEEPFNGLMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, const GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLMAPPARAMETERIVNVPROC GLeeFuncPtr_glMapParameterivNV;\r
+  #define glMapParameterivNV GLeeFuncPtr_glMapParameterivNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMapParameterfvNV\r
+#define GLEE_H_DEFINED_glMapParameterfvNV\r
+  typedef void (APIENTRYP GLEEPFNGLMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, const GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLMAPPARAMETERFVNVPROC GLeeFuncPtr_glMapParameterfvNV;\r
+  #define glMapParameterfvNV GLeeFuncPtr_glMapParameterfvNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetMapControlPointsNV\r
+#define GLEE_H_DEFINED_glGetMapControlPointsNV\r
+  typedef void (APIENTRYP GLEEPFNGLGETMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, GLvoid * points);\r
+  GLEE_EXTERN GLEEPFNGLGETMAPCONTROLPOINTSNVPROC GLeeFuncPtr_glGetMapControlPointsNV;\r
+  #define glGetMapControlPointsNV GLeeFuncPtr_glGetMapControlPointsNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetMapParameterivNV\r
+#define GLEE_H_DEFINED_glGetMapParameterivNV\r
+  typedef void (APIENTRYP GLEEPFNGLGETMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETMAPPARAMETERIVNVPROC GLeeFuncPtr_glGetMapParameterivNV;\r
+  #define glGetMapParameterivNV GLeeFuncPtr_glGetMapParameterivNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetMapParameterfvNV\r
+#define GLEE_H_DEFINED_glGetMapParameterfvNV\r
+  typedef void (APIENTRYP GLEEPFNGLGETMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLGETMAPPARAMETERFVNVPROC GLeeFuncPtr_glGetMapParameterfvNV;\r
+  #define glGetMapParameterfvNV GLeeFuncPtr_glGetMapParameterfvNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetMapAttribParameterivNV\r
+#define GLEE_H_DEFINED_glGetMapAttribParameterivNV\r
+  typedef void (APIENTRYP GLEEPFNGLGETMAPATTRIBPARAMETERIVNVPROC) (GLenum target, GLuint index, GLenum pname, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETMAPATTRIBPARAMETERIVNVPROC GLeeFuncPtr_glGetMapAttribParameterivNV;\r
+  #define glGetMapAttribParameterivNV GLeeFuncPtr_glGetMapAttribParameterivNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetMapAttribParameterfvNV\r
+#define GLEE_H_DEFINED_glGetMapAttribParameterfvNV\r
+  typedef void (APIENTRYP GLEEPFNGLGETMAPATTRIBPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLGETMAPATTRIBPARAMETERFVNVPROC GLeeFuncPtr_glGetMapAttribParameterfvNV;\r
+  #define glGetMapAttribParameterfvNV GLeeFuncPtr_glGetMapAttribParameterfvNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glEvalMapsNV\r
+#define GLEE_H_DEFINED_glEvalMapsNV\r
+  typedef void (APIENTRYP GLEEPFNGLEVALMAPSNVPROC) (GLenum target, GLenum mode);\r
+  GLEE_EXTERN GLEEPFNGLEVALMAPSNVPROC GLeeFuncPtr_glEvalMapsNV;\r
+  #define glEvalMapsNV GLeeFuncPtr_glEvalMapsNV\r
+#endif\r
+#endif \r
+\r
+/* GL_NV_packed_depth_stencil */\r
+\r
+#ifndef GL_NV_packed_depth_stencil\r
+#define GL_NV_packed_depth_stencil 1\r
+#define __GLEE_GL_NV_packed_depth_stencil 1\r
+/* Constants */\r
+#define GL_DEPTH_STENCIL_NV                                0x84F9\r
+#define GL_UNSIGNED_INT_24_8_NV                            0x84FA\r
+#endif \r
+\r
+/* GL_NV_register_combiners2 */\r
+\r
+#ifndef GL_NV_register_combiners2\r
+#define GL_NV_register_combiners2 1\r
+#define __GLEE_GL_NV_register_combiners2 1\r
+/* Constants */\r
+#define GL_PER_STAGE_CONSTANTS_NV                          0x8535\r
+#ifndef GLEE_H_DEFINED_glCombinerStageParameterfvNV\r
+#define GLEE_H_DEFINED_glCombinerStageParameterfvNV\r
+  typedef void (APIENTRYP GLEEPFNGLCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, const GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLCOMBINERSTAGEPARAMETERFVNVPROC GLeeFuncPtr_glCombinerStageParameterfvNV;\r
+  #define glCombinerStageParameterfvNV GLeeFuncPtr_glCombinerStageParameterfvNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetCombinerStageParameterfvNV\r
+#define GLEE_H_DEFINED_glGetCombinerStageParameterfvNV\r
+  typedef void (APIENTRYP GLEEPFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC GLeeFuncPtr_glGetCombinerStageParameterfvNV;\r
+  #define glGetCombinerStageParameterfvNV GLeeFuncPtr_glGetCombinerStageParameterfvNV\r
+#endif\r
+#endif \r
+\r
+/* GL_NV_texture_compression_vtc */\r
+\r
+#ifndef GL_NV_texture_compression_vtc\r
+#define GL_NV_texture_compression_vtc 1\r
+#define __GLEE_GL_NV_texture_compression_vtc 1\r
+/* Constants */\r
+#endif \r
+\r
+/* GL_NV_texture_rectangle */\r
+\r
+#ifndef GL_NV_texture_rectangle\r
+#define GL_NV_texture_rectangle 1\r
+#define __GLEE_GL_NV_texture_rectangle 1\r
+/* Constants */\r
+#define GL_TEXTURE_RECTANGLE_NV                            0x84F5\r
+#define GL_TEXTURE_BINDING_RECTANGLE_NV                    0x84F6\r
+#define GL_PROXY_TEXTURE_RECTANGLE_NV                      0x84F7\r
+#define GL_MAX_RECTANGLE_TEXTURE_SIZE_NV                   0x84F8\r
+#endif \r
+\r
+/* GL_NV_texture_shader */\r
+\r
+#ifndef GL_NV_texture_shader\r
+#define GL_NV_texture_shader 1\r
+#define __GLEE_GL_NV_texture_shader 1\r
+/* Constants */\r
+#define GL_OFFSET_TEXTURE_RECTANGLE_NV                     0x864C\r
+#define GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV               0x864D\r
+#define GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV                0x864E\r
+#define GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV            0x86D9\r
+#define GL_UNSIGNED_INT_S8_S8_8_8_NV                       0x86DA\r
+#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV                   0x86DB\r
+#define GL_DSDT_MAG_INTENSITY_NV                           0x86DC\r
+#define GL_SHADER_CONSISTENT_NV                            0x86DD\r
+#define GL_TEXTURE_SHADER_NV                               0x86DE\r
+#define GL_SHADER_OPERATION_NV                             0x86DF\r
+#define GL_CULL_MODES_NV                                   0x86E0\r
+#define GL_OFFSET_TEXTURE_MATRIX_NV                        0x86E1\r
+#define GL_OFFSET_TEXTURE_SCALE_NV                         0x86E2\r
+#define GL_OFFSET_TEXTURE_BIAS_NV                          0x86E3\r
+#define GL_OFFSET_TEXTURE_2D_MATRIX_NV                     GL_OFFSET_TEXTURE_MATRIX_NV\r
+#define GL_OFFSET_TEXTURE_2D_SCALE_NV                      GL_OFFSET_TEXTURE_SCALE_NV\r
+#define GL_OFFSET_TEXTURE_2D_BIAS_NV                       GL_OFFSET_TEXTURE_BIAS_NV\r
+#define GL_PREVIOUS_TEXTURE_INPUT_NV                       0x86E4\r
+#define GL_CONST_EYE_NV                                    0x86E5\r
+#define GL_PASS_THROUGH_NV                                 0x86E6\r
+#define GL_CULL_FRAGMENT_NV                                0x86E7\r
+#define GL_OFFSET_TEXTURE_2D_NV                            0x86E8\r
+#define GL_DEPENDENT_AR_TEXTURE_2D_NV                      0x86E9\r
+#define GL_DEPENDENT_GB_TEXTURE_2D_NV                      0x86EA\r
+#define GL_DOT_PRODUCT_NV                                  0x86EC\r
+#define GL_DOT_PRODUCT_DEPTH_REPLACE_NV                    0x86ED\r
+#define GL_DOT_PRODUCT_TEXTURE_2D_NV                       0x86EE\r
+#define GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV                 0x86F0\r
+#define GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV                 0x86F1\r
+#define GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV                 0x86F2\r
+#define GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV       0x86F3\r
+#define GL_HILO_NV                                         0x86F4\r
+#define GL_DSDT_NV                                         0x86F5\r
+#define GL_DSDT_MAG_NV                                     0x86F6\r
+#define GL_DSDT_MAG_VIB_NV                                 0x86F7\r
+#define GL_HILO16_NV                                       0x86F8\r
+#define GL_SIGNED_HILO_NV                                  0x86F9\r
+#define GL_SIGNED_HILO16_NV                                0x86FA\r
+#define GL_SIGNED_RGBA_NV                                  0x86FB\r
+#define GL_SIGNED_RGBA8_NV                                 0x86FC\r
+#define GL_SIGNED_RGB_NV                                   0x86FE\r
+#define GL_SIGNED_RGB8_NV                                  0x86FF\r
+#define GL_SIGNED_LUMINANCE_NV                             0x8701\r
+#define GL_SIGNED_LUMINANCE8_NV                            0x8702\r
+#define GL_SIGNED_LUMINANCE_ALPHA_NV                       0x8703\r
+#define GL_SIGNED_LUMINANCE8_ALPHA8_NV                     0x8704\r
+#define GL_SIGNED_ALPHA_NV                                 0x8705\r
+#define GL_SIGNED_ALPHA8_NV                                0x8706\r
+#define GL_SIGNED_INTENSITY_NV                             0x8707\r
+#define GL_SIGNED_INTENSITY8_NV                            0x8708\r
+#define GL_DSDT8_NV                                        0x8709\r
+#define GL_DSDT8_MAG8_NV                                   0x870A\r
+#define GL_DSDT8_MAG8_INTENSITY8_NV                        0x870B\r
+#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV                    0x870C\r
+#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV                  0x870D\r
+#define GL_HI_SCALE_NV                                     0x870E\r
+#define GL_LO_SCALE_NV                                     0x870F\r
+#define GL_DS_SCALE_NV                                     0x8710\r
+#define GL_DT_SCALE_NV                                     0x8711\r
+#define GL_MAGNITUDE_SCALE_NV                              0x8712\r
+#define GL_VIBRANCE_SCALE_NV                               0x8713\r
+#define GL_HI_BIAS_NV                                      0x8714\r
+#define GL_LO_BIAS_NV                                      0x8715\r
+#define GL_DS_BIAS_NV                                      0x8716\r
+#define GL_DT_BIAS_NV                                      0x8717\r
+#define GL_MAGNITUDE_BIAS_NV                               0x8718\r
+#define GL_VIBRANCE_BIAS_NV                                0x8719\r
+#define GL_TEXTURE_BORDER_VALUES_NV                        0x871A\r
+#define GL_TEXTURE_HI_SIZE_NV                              0x871B\r
+#define GL_TEXTURE_LO_SIZE_NV                              0x871C\r
+#define GL_TEXTURE_DS_SIZE_NV                              0x871D\r
+#define GL_TEXTURE_DT_SIZE_NV                              0x871E\r
+#define GL_TEXTURE_MAG_SIZE_NV                             0x871F\r
+#endif \r
+\r
+/* GL_NV_texture_shader2 */\r
+\r
+#ifndef GL_NV_texture_shader2\r
+#define GL_NV_texture_shader2 1\r
+#define __GLEE_GL_NV_texture_shader2 1\r
+/* Constants */\r
+#define GL_DOT_PRODUCT_TEXTURE_3D_NV                       0x86EF\r
+#endif \r
+\r
+/* GL_NV_vertex_array_range2 */\r
+\r
+#ifndef GL_NV_vertex_array_range2\r
+#define GL_NV_vertex_array_range2 1\r
+#define __GLEE_GL_NV_vertex_array_range2 1\r
+/* Constants */\r
+#define GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV             0x8533\r
+#endif \r
+\r
+/* GL_NV_vertex_program */\r
+\r
+#ifndef GL_NV_vertex_program\r
+#define GL_NV_vertex_program 1\r
+#define __GLEE_GL_NV_vertex_program 1\r
+/* Constants */\r
+#define GL_VERTEX_PROGRAM_NV                               0x8620\r
+#define GL_VERTEX_STATE_PROGRAM_NV                         0x8621\r
+#define GL_ATTRIB_ARRAY_SIZE_NV                            0x8623\r
+#define GL_ATTRIB_ARRAY_STRIDE_NV                          0x8624\r
+#define GL_ATTRIB_ARRAY_TYPE_NV                            0x8625\r
+#define GL_CURRENT_ATTRIB_NV                               0x8626\r
+#define GL_PROGRAM_LENGTH_NV                               0x8627\r
+#define GL_PROGRAM_STRING_NV                               0x8628\r
+#define GL_MODELVIEW_PROJECTION_NV                         0x8629\r
+#define GL_IDENTITY_NV                                     0x862A\r
+#define GL_INVERSE_NV                                      0x862B\r
+#define GL_TRANSPOSE_NV                                    0x862C\r
+#define GL_INVERSE_TRANSPOSE_NV                            0x862D\r
+#define GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV                 0x862E\r
+#define GL_MAX_TRACK_MATRICES_NV                           0x862F\r
+#define GL_MATRIX0_NV                                      0x8630\r
+#define GL_MATRIX1_NV                                      0x8631\r
+#define GL_MATRIX2_NV                                      0x8632\r
+#define GL_MATRIX3_NV                                      0x8633\r
+#define GL_MATRIX4_NV                                      0x8634\r
+#define GL_MATRIX5_NV                                      0x8635\r
+#define GL_MATRIX6_NV                                      0x8636\r
+#define GL_MATRIX7_NV                                      0x8637\r
+#define GL_CURRENT_MATRIX_STACK_DEPTH_NV                   0x8640\r
+#define GL_CURRENT_MATRIX_NV                               0x8641\r
+#define GL_VERTEX_PROGRAM_POINT_SIZE_NV                    0x8642\r
+#define GL_VERTEX_PROGRAM_TWO_SIDE_NV                      0x8643\r
+#define GL_PROGRAM_PARAMETER_NV                            0x8644\r
+#define GL_ATTRIB_ARRAY_POINTER_NV                         0x8645\r
+#define GL_PROGRAM_TARGET_NV                               0x8646\r
+#define GL_PROGRAM_RESIDENT_NV                             0x8647\r
+#define GL_TRACK_MATRIX_NV                                 0x8648\r
+#define GL_TRACK_MATRIX_TRANSFORM_NV                       0x8649\r
+#define GL_VERTEX_PROGRAM_BINDING_NV                       0x864A\r
+#define GL_PROGRAM_ERROR_POSITION_NV                       0x864B\r
+#define GL_VERTEX_ATTRIB_ARRAY0_NV                         0x8650\r
+#define GL_VERTEX_ATTRIB_ARRAY1_NV                         0x8651\r
+#define GL_VERTEX_ATTRIB_ARRAY2_NV                         0x8652\r
+#define GL_VERTEX_ATTRIB_ARRAY3_NV                         0x8653\r
+#define GL_VERTEX_ATTRIB_ARRAY4_NV                         0x8654\r
+#define GL_VERTEX_ATTRIB_ARRAY5_NV                         0x8655\r
+#define GL_VERTEX_ATTRIB_ARRAY6_NV                         0x8656\r
+#define GL_VERTEX_ATTRIB_ARRAY7_NV                         0x8657\r
+#define GL_VERTEX_ATTRIB_ARRAY8_NV                         0x8658\r
+#define GL_VERTEX_ATTRIB_ARRAY9_NV                         0x8659\r
+#define GL_VERTEX_ATTRIB_ARRAY10_NV                        0x865A\r
+#define GL_VERTEX_ATTRIB_ARRAY11_NV                        0x865B\r
+#define GL_VERTEX_ATTRIB_ARRAY12_NV                        0x865C\r
+#define GL_VERTEX_ATTRIB_ARRAY13_NV                        0x865D\r
+#define GL_VERTEX_ATTRIB_ARRAY14_NV                        0x865E\r
+#define GL_VERTEX_ATTRIB_ARRAY15_NV                        0x865F\r
+#define GL_MAP1_VERTEX_ATTRIB0_4_NV                        0x8660\r
+#define GL_MAP1_VERTEX_ATTRIB1_4_NV                        0x8661\r
+#define GL_MAP1_VERTEX_ATTRIB2_4_NV                        0x8662\r
+#define GL_MAP1_VERTEX_ATTRIB3_4_NV                        0x8663\r
+#define GL_MAP1_VERTEX_ATTRIB4_4_NV                        0x8664\r
+#define GL_MAP1_VERTEX_ATTRIB5_4_NV                        0x8665\r
+#define GL_MAP1_VERTEX_ATTRIB6_4_NV                        0x8666\r
+#define GL_MAP1_VERTEX_ATTRIB7_4_NV                        0x8667\r
+#define GL_MAP1_VERTEX_ATTRIB8_4_NV                        0x8668\r
+#define GL_MAP1_VERTEX_ATTRIB9_4_NV                        0x8669\r
+#define GL_MAP1_VERTEX_ATTRIB10_4_NV                       0x866A\r
+#define GL_MAP1_VERTEX_ATTRIB11_4_NV                       0x866B\r
+#define GL_MAP1_VERTEX_ATTRIB12_4_NV                       0x866C\r
+#define GL_MAP1_VERTEX_ATTRIB13_4_NV                       0x866D\r
+#define GL_MAP1_VERTEX_ATTRIB14_4_NV                       0x866E\r
+#define GL_MAP1_VERTEX_ATTRIB15_4_NV                       0x866F\r
+#define GL_MAP2_VERTEX_ATTRIB0_4_NV                        0x8670\r
+#define GL_MAP2_VERTEX_ATTRIB1_4_NV                        0x8671\r
+#define GL_MAP2_VERTEX_ATTRIB2_4_NV                        0x8672\r
+#define GL_MAP2_VERTEX_ATTRIB3_4_NV                        0x8673\r
+#define GL_MAP2_VERTEX_ATTRIB4_4_NV                        0x8674\r
+#define GL_MAP2_VERTEX_ATTRIB5_4_NV                        0x8675\r
+#define GL_MAP2_VERTEX_ATTRIB6_4_NV                        0x8676\r
+#define GL_MAP2_VERTEX_ATTRIB7_4_NV                        0x8677\r
+#define GL_MAP2_VERTEX_ATTRIB8_4_NV                        0x8678\r
+#define GL_MAP2_VERTEX_ATTRIB9_4_NV                        0x8679\r
+#define GL_MAP2_VERTEX_ATTRIB10_4_NV                       0x867A\r
+#define GL_MAP2_VERTEX_ATTRIB11_4_NV                       0x867B\r
+#define GL_MAP2_VERTEX_ATTRIB12_4_NV                       0x867C\r
+#define GL_MAP2_VERTEX_ATTRIB13_4_NV                       0x867D\r
+#define GL_MAP2_VERTEX_ATTRIB14_4_NV                       0x867E\r
+#define GL_MAP2_VERTEX_ATTRIB15_4_NV                       0x867F\r
+#ifndef GLEE_H_DEFINED_glAreProgramsResidentNV\r
+#define GLEE_H_DEFINED_glAreProgramsResidentNV\r
+  typedef GLboolean (APIENTRYP GLEEPFNGLAREPROGRAMSRESIDENTNVPROC) (GLsizei n, const GLuint * programs, GLboolean * residences);\r
+  GLEE_EXTERN GLEEPFNGLAREPROGRAMSRESIDENTNVPROC GLeeFuncPtr_glAreProgramsResidentNV;\r
+  #define glAreProgramsResidentNV GLeeFuncPtr_glAreProgramsResidentNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glBindProgramNV\r
+#define GLEE_H_DEFINED_glBindProgramNV\r
+  typedef void (APIENTRYP GLEEPFNGLBINDPROGRAMNVPROC) (GLenum target, GLuint id);\r
+  GLEE_EXTERN GLEEPFNGLBINDPROGRAMNVPROC GLeeFuncPtr_glBindProgramNV;\r
+  #define glBindProgramNV GLeeFuncPtr_glBindProgramNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glDeleteProgramsNV\r
+#define GLEE_H_DEFINED_glDeleteProgramsNV\r
+  typedef void (APIENTRYP GLEEPFNGLDELETEPROGRAMSNVPROC) (GLsizei n, const GLuint * programs);\r
+  GLEE_EXTERN GLEEPFNGLDELETEPROGRAMSNVPROC GLeeFuncPtr_glDeleteProgramsNV;\r
+  #define glDeleteProgramsNV GLeeFuncPtr_glDeleteProgramsNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glExecuteProgramNV\r
+#define GLEE_H_DEFINED_glExecuteProgramNV\r
+  typedef void (APIENTRYP GLEEPFNGLEXECUTEPROGRAMNVPROC) (GLenum target, GLuint id, const GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLEXECUTEPROGRAMNVPROC GLeeFuncPtr_glExecuteProgramNV;\r
+  #define glExecuteProgramNV GLeeFuncPtr_glExecuteProgramNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGenProgramsNV\r
+#define GLEE_H_DEFINED_glGenProgramsNV\r
+  typedef void (APIENTRYP GLEEPFNGLGENPROGRAMSNVPROC) (GLsizei n, GLuint * programs);\r
+  GLEE_EXTERN GLEEPFNGLGENPROGRAMSNVPROC GLeeFuncPtr_glGenProgramsNV;\r
+  #define glGenProgramsNV GLeeFuncPtr_glGenProgramsNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetProgramParameterdvNV\r
+#define GLEE_H_DEFINED_glGetProgramParameterdvNV\r
+  typedef void (APIENTRYP GLEEPFNGLGETPROGRAMPARAMETERDVNVPROC) (GLenum target, GLuint index, GLenum pname, GLdouble * params);\r
+  GLEE_EXTERN GLEEPFNGLGETPROGRAMPARAMETERDVNVPROC GLeeFuncPtr_glGetProgramParameterdvNV;\r
+  #define glGetProgramParameterdvNV GLeeFuncPtr_glGetProgramParameterdvNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetProgramParameterfvNV\r
+#define GLEE_H_DEFINED_glGetProgramParameterfvNV\r
+  typedef void (APIENTRYP GLEEPFNGLGETPROGRAMPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLGETPROGRAMPARAMETERFVNVPROC GLeeFuncPtr_glGetProgramParameterfvNV;\r
+  #define glGetProgramParameterfvNV GLeeFuncPtr_glGetProgramParameterfvNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetProgramivNV\r
+#define GLEE_H_DEFINED_glGetProgramivNV\r
+  typedef void (APIENTRYP GLEEPFNGLGETPROGRAMIVNVPROC) (GLuint id, GLenum pname, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETPROGRAMIVNVPROC GLeeFuncPtr_glGetProgramivNV;\r
+  #define glGetProgramivNV GLeeFuncPtr_glGetProgramivNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetProgramStringNV\r
+#define GLEE_H_DEFINED_glGetProgramStringNV\r
+  typedef void (APIENTRYP GLEEPFNGLGETPROGRAMSTRINGNVPROC) (GLuint id, GLenum pname, GLubyte * program);\r
+  GLEE_EXTERN GLEEPFNGLGETPROGRAMSTRINGNVPROC GLeeFuncPtr_glGetProgramStringNV;\r
+  #define glGetProgramStringNV GLeeFuncPtr_glGetProgramStringNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetTrackMatrixivNV\r
+#define GLEE_H_DEFINED_glGetTrackMatrixivNV\r
+  typedef void (APIENTRYP GLEEPFNGLGETTRACKMATRIXIVNVPROC) (GLenum target, GLuint address, GLenum pname, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETTRACKMATRIXIVNVPROC GLeeFuncPtr_glGetTrackMatrixivNV;\r
+  #define glGetTrackMatrixivNV GLeeFuncPtr_glGetTrackMatrixivNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetVertexAttribdvNV\r
+#define GLEE_H_DEFINED_glGetVertexAttribdvNV\r
+  typedef void (APIENTRYP GLEEPFNGLGETVERTEXATTRIBDVNVPROC) (GLuint index, GLenum pname, GLdouble * params);\r
+  GLEE_EXTERN GLEEPFNGLGETVERTEXATTRIBDVNVPROC GLeeFuncPtr_glGetVertexAttribdvNV;\r
+  #define glGetVertexAttribdvNV GLeeFuncPtr_glGetVertexAttribdvNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetVertexAttribfvNV\r
+#define GLEE_H_DEFINED_glGetVertexAttribfvNV\r
+  typedef void (APIENTRYP GLEEPFNGLGETVERTEXATTRIBFVNVPROC) (GLuint index, GLenum pname, GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLGETVERTEXATTRIBFVNVPROC GLeeFuncPtr_glGetVertexAttribfvNV;\r
+  #define glGetVertexAttribfvNV GLeeFuncPtr_glGetVertexAttribfvNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetVertexAttribivNV\r
+#define GLEE_H_DEFINED_glGetVertexAttribivNV\r
+  typedef void (APIENTRYP GLEEPFNGLGETVERTEXATTRIBIVNVPROC) (GLuint index, GLenum pname, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETVERTEXATTRIBIVNVPROC GLeeFuncPtr_glGetVertexAttribivNV;\r
+  #define glGetVertexAttribivNV GLeeFuncPtr_glGetVertexAttribivNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetVertexAttribPointervNV\r
+#define GLEE_H_DEFINED_glGetVertexAttribPointervNV\r
+  typedef void (APIENTRYP GLEEPFNGLGETVERTEXATTRIBPOINTERVNVPROC) (GLuint index, GLenum pname, GLvoid* * pointer);\r
+  GLEE_EXTERN GLEEPFNGLGETVERTEXATTRIBPOINTERVNVPROC GLeeFuncPtr_glGetVertexAttribPointervNV;\r
+  #define glGetVertexAttribPointervNV GLeeFuncPtr_glGetVertexAttribPointervNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glIsProgramNV\r
+#define GLEE_H_DEFINED_glIsProgramNV\r
+  typedef GLboolean (APIENTRYP GLEEPFNGLISPROGRAMNVPROC) (GLuint id);\r
+  GLEE_EXTERN GLEEPFNGLISPROGRAMNVPROC GLeeFuncPtr_glIsProgramNV;\r
+  #define glIsProgramNV GLeeFuncPtr_glIsProgramNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glLoadProgramNV\r
+#define GLEE_H_DEFINED_glLoadProgramNV\r
+  typedef void (APIENTRYP GLEEPFNGLLOADPROGRAMNVPROC) (GLenum target, GLuint id, GLsizei len, const GLubyte * program);\r
+  GLEE_EXTERN GLEEPFNGLLOADPROGRAMNVPROC GLeeFuncPtr_glLoadProgramNV;\r
+  #define glLoadProgramNV GLeeFuncPtr_glLoadProgramNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramParameter4dNV\r
+#define GLEE_H_DEFINED_glProgramParameter4dNV\r
+  typedef void (APIENTRYP GLEEPFNGLPROGRAMPARAMETER4DNVPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMPARAMETER4DNVPROC GLeeFuncPtr_glProgramParameter4dNV;\r
+  #define glProgramParameter4dNV GLeeFuncPtr_glProgramParameter4dNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramParameter4dvNV\r
+#define GLEE_H_DEFINED_glProgramParameter4dvNV\r
+  typedef void (APIENTRYP GLEEPFNGLPROGRAMPARAMETER4DVNVPROC) (GLenum target, GLuint index, const GLdouble * v);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMPARAMETER4DVNVPROC GLeeFuncPtr_glProgramParameter4dvNV;\r
+  #define glProgramParameter4dvNV GLeeFuncPtr_glProgramParameter4dvNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramParameter4fNV\r
+#define GLEE_H_DEFINED_glProgramParameter4fNV\r
+  typedef void (APIENTRYP GLEEPFNGLPROGRAMPARAMETER4FNVPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMPARAMETER4FNVPROC GLeeFuncPtr_glProgramParameter4fNV;\r
+  #define glProgramParameter4fNV GLeeFuncPtr_glProgramParameter4fNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramParameter4fvNV\r
+#define GLEE_H_DEFINED_glProgramParameter4fvNV\r
+  typedef void (APIENTRYP GLEEPFNGLPROGRAMPARAMETER4FVNVPROC) (GLenum target, GLuint index, const GLfloat * v);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMPARAMETER4FVNVPROC GLeeFuncPtr_glProgramParameter4fvNV;\r
+  #define glProgramParameter4fvNV GLeeFuncPtr_glProgramParameter4fvNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramParameters4dvNV\r
+#define GLEE_H_DEFINED_glProgramParameters4dvNV\r
+  typedef void (APIENTRYP GLEEPFNGLPROGRAMPARAMETERS4DVNVPROC) (GLenum target, GLuint index, GLuint count, const GLdouble * v);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMPARAMETERS4DVNVPROC GLeeFuncPtr_glProgramParameters4dvNV;\r
+  #define glProgramParameters4dvNV GLeeFuncPtr_glProgramParameters4dvNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramParameters4fvNV\r
+#define GLEE_H_DEFINED_glProgramParameters4fvNV\r
+  typedef void (APIENTRYP GLEEPFNGLPROGRAMPARAMETERS4FVNVPROC) (GLenum target, GLuint index, GLuint count, const GLfloat * v);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMPARAMETERS4FVNVPROC GLeeFuncPtr_glProgramParameters4fvNV;\r
+  #define glProgramParameters4fvNV GLeeFuncPtr_glProgramParameters4fvNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glRequestResidentProgramsNV\r
+#define GLEE_H_DEFINED_glRequestResidentProgramsNV\r
+  typedef void (APIENTRYP GLEEPFNGLREQUESTRESIDENTPROGRAMSNVPROC) (GLsizei n, const GLuint * programs);\r
+  GLEE_EXTERN GLEEPFNGLREQUESTRESIDENTPROGRAMSNVPROC GLeeFuncPtr_glRequestResidentProgramsNV;\r
+  #define glRequestResidentProgramsNV GLeeFuncPtr_glRequestResidentProgramsNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTrackMatrixNV\r
+#define GLEE_H_DEFINED_glTrackMatrixNV\r
+  typedef void (APIENTRYP GLEEPFNGLTRACKMATRIXNVPROC) (GLenum target, GLuint address, GLenum matrix, GLenum transform);\r
+  GLEE_EXTERN GLEEPFNGLTRACKMATRIXNVPROC GLeeFuncPtr_glTrackMatrixNV;\r
+  #define glTrackMatrixNV GLeeFuncPtr_glTrackMatrixNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttribPointerNV\r
+#define GLEE_H_DEFINED_glVertexAttribPointerNV\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBPOINTERNVPROC) (GLuint index, GLint fsize, GLenum type, GLsizei stride, const GLvoid * pointer);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIBPOINTERNVPROC GLeeFuncPtr_glVertexAttribPointerNV;\r
+  #define glVertexAttribPointerNV GLeeFuncPtr_glVertexAttribPointerNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib1dNV\r
+#define GLEE_H_DEFINED_glVertexAttrib1dNV\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB1DNVPROC) (GLuint index, GLdouble x);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB1DNVPROC GLeeFuncPtr_glVertexAttrib1dNV;\r
+  #define glVertexAttrib1dNV GLeeFuncPtr_glVertexAttrib1dNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib1dvNV\r
+#define GLEE_H_DEFINED_glVertexAttrib1dvNV\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB1DVNVPROC) (GLuint index, const GLdouble * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB1DVNVPROC GLeeFuncPtr_glVertexAttrib1dvNV;\r
+  #define glVertexAttrib1dvNV GLeeFuncPtr_glVertexAttrib1dvNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib1fNV\r
+#define GLEE_H_DEFINED_glVertexAttrib1fNV\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB1FNVPROC) (GLuint index, GLfloat x);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB1FNVPROC GLeeFuncPtr_glVertexAttrib1fNV;\r
+  #define glVertexAttrib1fNV GLeeFuncPtr_glVertexAttrib1fNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib1fvNV\r
+#define GLEE_H_DEFINED_glVertexAttrib1fvNV\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB1FVNVPROC) (GLuint index, const GLfloat * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB1FVNVPROC GLeeFuncPtr_glVertexAttrib1fvNV;\r
+  #define glVertexAttrib1fvNV GLeeFuncPtr_glVertexAttrib1fvNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib1sNV\r
+#define GLEE_H_DEFINED_glVertexAttrib1sNV\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB1SNVPROC) (GLuint index, GLshort x);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB1SNVPROC GLeeFuncPtr_glVertexAttrib1sNV;\r
+  #define glVertexAttrib1sNV GLeeFuncPtr_glVertexAttrib1sNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib1svNV\r
+#define GLEE_H_DEFINED_glVertexAttrib1svNV\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB1SVNVPROC) (GLuint index, const GLshort * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB1SVNVPROC GLeeFuncPtr_glVertexAttrib1svNV;\r
+  #define glVertexAttrib1svNV GLeeFuncPtr_glVertexAttrib1svNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib2dNV\r
+#define GLEE_H_DEFINED_glVertexAttrib2dNV\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB2DNVPROC) (GLuint index, GLdouble x, GLdouble y);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB2DNVPROC GLeeFuncPtr_glVertexAttrib2dNV;\r
+  #define glVertexAttrib2dNV GLeeFuncPtr_glVertexAttrib2dNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib2dvNV\r
+#define GLEE_H_DEFINED_glVertexAttrib2dvNV\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB2DVNVPROC) (GLuint index, const GLdouble * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB2DVNVPROC GLeeFuncPtr_glVertexAttrib2dvNV;\r
+  #define glVertexAttrib2dvNV GLeeFuncPtr_glVertexAttrib2dvNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib2fNV\r
+#define GLEE_H_DEFINED_glVertexAttrib2fNV\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB2FNVPROC) (GLuint index, GLfloat x, GLfloat y);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB2FNVPROC GLeeFuncPtr_glVertexAttrib2fNV;\r
+  #define glVertexAttrib2fNV GLeeFuncPtr_glVertexAttrib2fNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib2fvNV\r
+#define GLEE_H_DEFINED_glVertexAttrib2fvNV\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB2FVNVPROC) (GLuint index, const GLfloat * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB2FVNVPROC GLeeFuncPtr_glVertexAttrib2fvNV;\r
+  #define glVertexAttrib2fvNV GLeeFuncPtr_glVertexAttrib2fvNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib2sNV\r
+#define GLEE_H_DEFINED_glVertexAttrib2sNV\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB2SNVPROC) (GLuint index, GLshort x, GLshort y);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB2SNVPROC GLeeFuncPtr_glVertexAttrib2sNV;\r
+  #define glVertexAttrib2sNV GLeeFuncPtr_glVertexAttrib2sNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib2svNV\r
+#define GLEE_H_DEFINED_glVertexAttrib2svNV\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB2SVNVPROC) (GLuint index, const GLshort * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB2SVNVPROC GLeeFuncPtr_glVertexAttrib2svNV;\r
+  #define glVertexAttrib2svNV GLeeFuncPtr_glVertexAttrib2svNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib3dNV\r
+#define GLEE_H_DEFINED_glVertexAttrib3dNV\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB3DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB3DNVPROC GLeeFuncPtr_glVertexAttrib3dNV;\r
+  #define glVertexAttrib3dNV GLeeFuncPtr_glVertexAttrib3dNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib3dvNV\r
+#define GLEE_H_DEFINED_glVertexAttrib3dvNV\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB3DVNVPROC) (GLuint index, const GLdouble * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB3DVNVPROC GLeeFuncPtr_glVertexAttrib3dvNV;\r
+  #define glVertexAttrib3dvNV GLeeFuncPtr_glVertexAttrib3dvNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib3fNV\r
+#define GLEE_H_DEFINED_glVertexAttrib3fNV\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB3FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB3FNVPROC GLeeFuncPtr_glVertexAttrib3fNV;\r
+  #define glVertexAttrib3fNV GLeeFuncPtr_glVertexAttrib3fNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib3fvNV\r
+#define GLEE_H_DEFINED_glVertexAttrib3fvNV\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB3FVNVPROC) (GLuint index, const GLfloat * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB3FVNVPROC GLeeFuncPtr_glVertexAttrib3fvNV;\r
+  #define glVertexAttrib3fvNV GLeeFuncPtr_glVertexAttrib3fvNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib3sNV\r
+#define GLEE_H_DEFINED_glVertexAttrib3sNV\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB3SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB3SNVPROC GLeeFuncPtr_glVertexAttrib3sNV;\r
+  #define glVertexAttrib3sNV GLeeFuncPtr_glVertexAttrib3sNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib3svNV\r
+#define GLEE_H_DEFINED_glVertexAttrib3svNV\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB3SVNVPROC) (GLuint index, const GLshort * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB3SVNVPROC GLeeFuncPtr_glVertexAttrib3svNV;\r
+  #define glVertexAttrib3svNV GLeeFuncPtr_glVertexAttrib3svNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib4dNV\r
+#define GLEE_H_DEFINED_glVertexAttrib4dNV\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4DNVPROC GLeeFuncPtr_glVertexAttrib4dNV;\r
+  #define glVertexAttrib4dNV GLeeFuncPtr_glVertexAttrib4dNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib4dvNV\r
+#define GLEE_H_DEFINED_glVertexAttrib4dvNV\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4DVNVPROC) (GLuint index, const GLdouble * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4DVNVPROC GLeeFuncPtr_glVertexAttrib4dvNV;\r
+  #define glVertexAttrib4dvNV GLeeFuncPtr_glVertexAttrib4dvNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib4fNV\r
+#define GLEE_H_DEFINED_glVertexAttrib4fNV\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4FNVPROC GLeeFuncPtr_glVertexAttrib4fNV;\r
+  #define glVertexAttrib4fNV GLeeFuncPtr_glVertexAttrib4fNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib4fvNV\r
+#define GLEE_H_DEFINED_glVertexAttrib4fvNV\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4FVNVPROC) (GLuint index, const GLfloat * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4FVNVPROC GLeeFuncPtr_glVertexAttrib4fvNV;\r
+  #define glVertexAttrib4fvNV GLeeFuncPtr_glVertexAttrib4fvNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib4sNV\r
+#define GLEE_H_DEFINED_glVertexAttrib4sNV\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4SNVPROC GLeeFuncPtr_glVertexAttrib4sNV;\r
+  #define glVertexAttrib4sNV GLeeFuncPtr_glVertexAttrib4sNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib4svNV\r
+#define GLEE_H_DEFINED_glVertexAttrib4svNV\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4SVNVPROC) (GLuint index, const GLshort * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4SVNVPROC GLeeFuncPtr_glVertexAttrib4svNV;\r
+  #define glVertexAttrib4svNV GLeeFuncPtr_glVertexAttrib4svNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib4ubNV\r
+#define GLEE_H_DEFINED_glVertexAttrib4ubNV\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4UBNVPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4UBNVPROC GLeeFuncPtr_glVertexAttrib4ubNV;\r
+  #define glVertexAttrib4ubNV GLeeFuncPtr_glVertexAttrib4ubNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib4ubvNV\r
+#define GLEE_H_DEFINED_glVertexAttrib4ubvNV\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4UBVNVPROC) (GLuint index, const GLubyte * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4UBVNVPROC GLeeFuncPtr_glVertexAttrib4ubvNV;\r
+  #define glVertexAttrib4ubvNV GLeeFuncPtr_glVertexAttrib4ubvNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttribs1dvNV\r
+#define GLEE_H_DEFINED_glVertexAttribs1dvNV\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBS1DVNVPROC) (GLuint index, GLsizei count, const GLdouble * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIBS1DVNVPROC GLeeFuncPtr_glVertexAttribs1dvNV;\r
+  #define glVertexAttribs1dvNV GLeeFuncPtr_glVertexAttribs1dvNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttribs1fvNV\r
+#define GLEE_H_DEFINED_glVertexAttribs1fvNV\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBS1FVNVPROC) (GLuint index, GLsizei count, const GLfloat * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIBS1FVNVPROC GLeeFuncPtr_glVertexAttribs1fvNV;\r
+  #define glVertexAttribs1fvNV GLeeFuncPtr_glVertexAttribs1fvNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttribs1svNV\r
+#define GLEE_H_DEFINED_glVertexAttribs1svNV\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBS1SVNVPROC) (GLuint index, GLsizei count, const GLshort * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIBS1SVNVPROC GLeeFuncPtr_glVertexAttribs1svNV;\r
+  #define glVertexAttribs1svNV GLeeFuncPtr_glVertexAttribs1svNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttribs2dvNV\r
+#define GLEE_H_DEFINED_glVertexAttribs2dvNV\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBS2DVNVPROC) (GLuint index, GLsizei count, const GLdouble * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIBS2DVNVPROC GLeeFuncPtr_glVertexAttribs2dvNV;\r
+  #define glVertexAttribs2dvNV GLeeFuncPtr_glVertexAttribs2dvNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttribs2fvNV\r
+#define GLEE_H_DEFINED_glVertexAttribs2fvNV\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBS2FVNVPROC) (GLuint index, GLsizei count, const GLfloat * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIBS2FVNVPROC GLeeFuncPtr_glVertexAttribs2fvNV;\r
+  #define glVertexAttribs2fvNV GLeeFuncPtr_glVertexAttribs2fvNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttribs2svNV\r
+#define GLEE_H_DEFINED_glVertexAttribs2svNV\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBS2SVNVPROC) (GLuint index, GLsizei count, const GLshort * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIBS2SVNVPROC GLeeFuncPtr_glVertexAttribs2svNV;\r
+  #define glVertexAttribs2svNV GLeeFuncPtr_glVertexAttribs2svNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttribs3dvNV\r
+#define GLEE_H_DEFINED_glVertexAttribs3dvNV\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBS3DVNVPROC) (GLuint index, GLsizei count, const GLdouble * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIBS3DVNVPROC GLeeFuncPtr_glVertexAttribs3dvNV;\r
+  #define glVertexAttribs3dvNV GLeeFuncPtr_glVertexAttribs3dvNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttribs3fvNV\r
+#define GLEE_H_DEFINED_glVertexAttribs3fvNV\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBS3FVNVPROC) (GLuint index, GLsizei count, const GLfloat * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIBS3FVNVPROC GLeeFuncPtr_glVertexAttribs3fvNV;\r
+  #define glVertexAttribs3fvNV GLeeFuncPtr_glVertexAttribs3fvNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttribs3svNV\r
+#define GLEE_H_DEFINED_glVertexAttribs3svNV\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBS3SVNVPROC) (GLuint index, GLsizei count, const GLshort * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIBS3SVNVPROC GLeeFuncPtr_glVertexAttribs3svNV;\r
+  #define glVertexAttribs3svNV GLeeFuncPtr_glVertexAttribs3svNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttribs4dvNV\r
+#define GLEE_H_DEFINED_glVertexAttribs4dvNV\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBS4DVNVPROC) (GLuint index, GLsizei count, const GLdouble * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIBS4DVNVPROC GLeeFuncPtr_glVertexAttribs4dvNV;\r
+  #define glVertexAttribs4dvNV GLeeFuncPtr_glVertexAttribs4dvNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttribs4fvNV\r
+#define GLEE_H_DEFINED_glVertexAttribs4fvNV\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBS4FVNVPROC) (GLuint index, GLsizei count, const GLfloat * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIBS4FVNVPROC GLeeFuncPtr_glVertexAttribs4fvNV;\r
+  #define glVertexAttribs4fvNV GLeeFuncPtr_glVertexAttribs4fvNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttribs4svNV\r
+#define GLEE_H_DEFINED_glVertexAttribs4svNV\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBS4SVNVPROC) (GLuint index, GLsizei count, const GLshort * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIBS4SVNVPROC GLeeFuncPtr_glVertexAttribs4svNV;\r
+  #define glVertexAttribs4svNV GLeeFuncPtr_glVertexAttribs4svNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttribs4ubvNV\r
+#define GLEE_H_DEFINED_glVertexAttribs4ubvNV\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBS4UBVNVPROC) (GLuint index, GLsizei count, const GLubyte * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIBS4UBVNVPROC GLeeFuncPtr_glVertexAttribs4ubvNV;\r
+  #define glVertexAttribs4ubvNV GLeeFuncPtr_glVertexAttribs4ubvNV\r
+#endif\r
+#endif \r
+\r
+/* GL_SGIX_texture_coordinate_clamp */\r
+\r
+#ifndef GL_SGIX_texture_coordinate_clamp\r
+#define GL_SGIX_texture_coordinate_clamp 1\r
+#define __GLEE_GL_SGIX_texture_coordinate_clamp 1\r
+/* Constants */\r
+#define GL_TEXTURE_MAX_CLAMP_S_SGIX                        0x8369\r
+#define GL_TEXTURE_MAX_CLAMP_T_SGIX                        0x836A\r
+#define GL_TEXTURE_MAX_CLAMP_R_SGIX                        0x836B\r
+#endif \r
+\r
+/* GL_SGIX_scalebias_hint */\r
+\r
+#ifndef GL_SGIX_scalebias_hint\r
+#define GL_SGIX_scalebias_hint 1\r
+#define __GLEE_GL_SGIX_scalebias_hint 1\r
+/* Constants */\r
+#define GL_SCALEBIAS_HINT_SGIX                             0x8322\r
+#endif \r
+\r
+/* GL_OML_interlace */\r
+\r
+#ifndef GL_OML_interlace\r
+#define GL_OML_interlace 1\r
+#define __GLEE_GL_OML_interlace 1\r
+/* Constants */\r
+#define GL_INTERLACE_OML                                   0x8980\r
+#define GL_INTERLACE_READ_OML                              0x8981\r
+#endif \r
+\r
+/* GL_OML_subsample */\r
+\r
+#ifndef GL_OML_subsample\r
+#define GL_OML_subsample 1\r
+#define __GLEE_GL_OML_subsample 1\r
+/* Constants */\r
+#define GL_FORMAT_SUBSAMPLE_24_24_OML                      0x8982\r
+#define GL_FORMAT_SUBSAMPLE_244_244_OML                    0x8983\r
+#endif \r
+\r
+/* GL_OML_resample */\r
+\r
+#ifndef GL_OML_resample\r
+#define GL_OML_resample 1\r
+#define __GLEE_GL_OML_resample 1\r
+/* Constants */\r
+#define GL_PACK_RESAMPLE_OML                               0x8984\r
+#define GL_UNPACK_RESAMPLE_OML                             0x8985\r
+#define GL_RESAMPLE_REPLICATE_OML                          0x8986\r
+#define GL_RESAMPLE_ZERO_FILL_OML                          0x8987\r
+#define GL_RESAMPLE_AVERAGE_OML                            0x8988\r
+#define GL_RESAMPLE_DECIMATE_OML                           0x8989\r
+#endif \r
+\r
+/* GL_NV_copy_depth_to_color */\r
+\r
+#ifndef GL_NV_copy_depth_to_color\r
+#define GL_NV_copy_depth_to_color 1\r
+#define __GLEE_GL_NV_copy_depth_to_color 1\r
+/* Constants */\r
+#define GL_DEPTH_STENCIL_TO_RGBA_NV                        0x886E\r
+#define GL_DEPTH_STENCIL_TO_BGRA_NV                        0x886F\r
+#endif \r
+\r
+/* GL_ATI_envmap_bumpmap */\r
+\r
+#ifndef GL_ATI_envmap_bumpmap\r
+#define GL_ATI_envmap_bumpmap 1\r
+#define __GLEE_GL_ATI_envmap_bumpmap 1\r
+/* Constants */\r
+#define GL_BUMP_ROT_MATRIX_ATI                             0x8775\r
+#define GL_BUMP_ROT_MATRIX_SIZE_ATI                        0x8776\r
+#define GL_BUMP_NUM_TEX_UNITS_ATI                          0x8777\r
+#define GL_BUMP_TEX_UNITS_ATI                              0x8778\r
+#define GL_DUDV_ATI                                        0x8779\r
+#define GL_DU8DV8_ATI                                      0x877A\r
+#define GL_BUMP_ENVMAP_ATI                                 0x877B\r
+#define GL_BUMP_TARGET_ATI                                 0x877C\r
+#ifndef GLEE_H_DEFINED_glTexBumpParameterivATI\r
+#define GLEE_H_DEFINED_glTexBumpParameterivATI\r
+  typedef void (APIENTRYP GLEEPFNGLTEXBUMPPARAMETERIVATIPROC) (GLenum pname, const GLint * param);\r
+  GLEE_EXTERN GLEEPFNGLTEXBUMPPARAMETERIVATIPROC GLeeFuncPtr_glTexBumpParameterivATI;\r
+  #define glTexBumpParameterivATI GLeeFuncPtr_glTexBumpParameterivATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTexBumpParameterfvATI\r
+#define GLEE_H_DEFINED_glTexBumpParameterfvATI\r
+  typedef void (APIENTRYP GLEEPFNGLTEXBUMPPARAMETERFVATIPROC) (GLenum pname, const GLfloat * param);\r
+  GLEE_EXTERN GLEEPFNGLTEXBUMPPARAMETERFVATIPROC GLeeFuncPtr_glTexBumpParameterfvATI;\r
+  #define glTexBumpParameterfvATI GLeeFuncPtr_glTexBumpParameterfvATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetTexBumpParameterivATI\r
+#define GLEE_H_DEFINED_glGetTexBumpParameterivATI\r
+  typedef void (APIENTRYP GLEEPFNGLGETTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint * param);\r
+  GLEE_EXTERN GLEEPFNGLGETTEXBUMPPARAMETERIVATIPROC GLeeFuncPtr_glGetTexBumpParameterivATI;\r
+  #define glGetTexBumpParameterivATI GLeeFuncPtr_glGetTexBumpParameterivATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetTexBumpParameterfvATI\r
+#define GLEE_H_DEFINED_glGetTexBumpParameterfvATI\r
+  typedef void (APIENTRYP GLEEPFNGLGETTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat * param);\r
+  GLEE_EXTERN GLEEPFNGLGETTEXBUMPPARAMETERFVATIPROC GLeeFuncPtr_glGetTexBumpParameterfvATI;\r
+  #define glGetTexBumpParameterfvATI GLeeFuncPtr_glGetTexBumpParameterfvATI\r
+#endif\r
+#endif \r
+\r
+/* GL_ATI_fragment_shader */\r
+\r
+#ifndef GL_ATI_fragment_shader\r
+#define GL_ATI_fragment_shader 1\r
+#define __GLEE_GL_ATI_fragment_shader 1\r
+/* Constants */\r
+#define GL_FRAGMENT_SHADER_ATI                             0x8920\r
+#define GL_REG_0_ATI                                       0x8921\r
+#define GL_REG_1_ATI                                       0x8922\r
+#define GL_REG_2_ATI                                       0x8923\r
+#define GL_REG_3_ATI                                       0x8924\r
+#define GL_REG_4_ATI                                       0x8925\r
+#define GL_REG_5_ATI                                       0x8926\r
+#define GL_REG_6_ATI                                       0x8927\r
+#define GL_REG_7_ATI                                       0x8928\r
+#define GL_REG_8_ATI                                       0x8929\r
+#define GL_REG_9_ATI                                       0x892A\r
+#define GL_REG_10_ATI                                      0x892B\r
+#define GL_REG_11_ATI                                      0x892C\r
+#define GL_REG_12_ATI                                      0x892D\r
+#define GL_REG_13_ATI                                      0x892E\r
+#define GL_REG_14_ATI                                      0x892F\r
+#define GL_REG_15_ATI                                      0x8930\r
+#define GL_REG_16_ATI                                      0x8931\r
+#define GL_REG_17_ATI                                      0x8932\r
+#define GL_REG_18_ATI                                      0x8933\r
+#define GL_REG_19_ATI                                      0x8934\r
+#define GL_REG_20_ATI                                      0x8935\r
+#define GL_REG_21_ATI                                      0x8936\r
+#define GL_REG_22_ATI                                      0x8937\r
+#define GL_REG_23_ATI                                      0x8938\r
+#define GL_REG_24_ATI                                      0x8939\r
+#define GL_REG_25_ATI                                      0x893A\r
+#define GL_REG_26_ATI                                      0x893B\r
+#define GL_REG_27_ATI                                      0x893C\r
+#define GL_REG_28_ATI                                      0x893D\r
+#define GL_REG_29_ATI                                      0x893E\r
+#define GL_REG_30_ATI                                      0x893F\r
+#define GL_REG_31_ATI                                      0x8940\r
+#define GL_CON_0_ATI                                       0x8941\r
+#define GL_CON_1_ATI                                       0x8942\r
+#define GL_CON_2_ATI                                       0x8943\r
+#define GL_CON_3_ATI                                       0x8944\r
+#define GL_CON_4_ATI                                       0x8945\r
+#define GL_CON_5_ATI                                       0x8946\r
+#define GL_CON_6_ATI                                       0x8947\r
+#define GL_CON_7_ATI                                       0x8948\r
+#define GL_CON_8_ATI                                       0x8949\r
+#define GL_CON_9_ATI                                       0x894A\r
+#define GL_CON_10_ATI                                      0x894B\r
+#define GL_CON_11_ATI                                      0x894C\r
+#define GL_CON_12_ATI                                      0x894D\r
+#define GL_CON_13_ATI                                      0x894E\r
+#define GL_CON_14_ATI                                      0x894F\r
+#define GL_CON_15_ATI                                      0x8950\r
+#define GL_CON_16_ATI                                      0x8951\r
+#define GL_CON_17_ATI                                      0x8952\r
+#define GL_CON_18_ATI                                      0x8953\r
+#define GL_CON_19_ATI                                      0x8954\r
+#define GL_CON_20_ATI                                      0x8955\r
+#define GL_CON_21_ATI                                      0x8956\r
+#define GL_CON_22_ATI                                      0x8957\r
+#define GL_CON_23_ATI                                      0x8958\r
+#define GL_CON_24_ATI                                      0x8959\r
+#define GL_CON_25_ATI                                      0x895A\r
+#define GL_CON_26_ATI                                      0x895B\r
+#define GL_CON_27_ATI                                      0x895C\r
+#define GL_CON_28_ATI                                      0x895D\r
+#define GL_CON_29_ATI                                      0x895E\r
+#define GL_CON_30_ATI                                      0x895F\r
+#define GL_CON_31_ATI                                      0x8960\r
+#define GL_MOV_ATI                                         0x8961\r
+#define GL_ADD_ATI                                         0x8963\r
+#define GL_MUL_ATI                                         0x8964\r
+#define GL_SUB_ATI                                         0x8965\r
+#define GL_DOT3_ATI                                        0x8966\r
+#define GL_DOT4_ATI                                        0x8967\r
+#define GL_MAD_ATI                                         0x8968\r
+#define GL_LERP_ATI                                        0x8969\r
+#define GL_CND_ATI                                         0x896A\r
+#define GL_CND0_ATI                                        0x896B\r
+#define GL_DOT2_ADD_ATI                                    0x896C\r
+#define GL_SECONDARY_INTERPOLATOR_ATI                      0x896D\r
+#define GL_NUM_FRAGMENT_REGISTERS_ATI                      0x896E\r
+#define GL_NUM_FRAGMENT_CONSTANTS_ATI                      0x896F\r
+#define GL_NUM_PASSES_ATI                                  0x8970\r
+#define GL_NUM_INSTRUCTIONS_PER_PASS_ATI                   0x8971\r
+#define GL_NUM_INSTRUCTIONS_TOTAL_ATI                      0x8972\r
+#define GL_NUM_INPUT_INTERPOLATOR_COMPONENTS_ATI           0x8973\r
+#define GL_NUM_LOOPBACK_COMPONENTS_ATI                     0x8974\r
+#define GL_COLOR_ALPHA_PAIRING_ATI                         0x8975\r
+#define GL_SWIZZLE_STR_ATI                                 0x8976\r
+#define GL_SWIZZLE_STQ_ATI                                 0x8977\r
+#define GL_SWIZZLE_STR_DR_ATI                              0x8978\r
+#define GL_SWIZZLE_STQ_DQ_ATI                              0x8979\r
+#define GL_SWIZZLE_STRQ_ATI                                0x897A\r
+#define GL_SWIZZLE_STRQ_DQ_ATI                             0x897B\r
+#define GL_RED_BIT_ATI                                     0x00000001\r
+#define GL_GREEN_BIT_ATI                                   0x00000002\r
+#define GL_BLUE_BIT_ATI                                    0x00000004\r
+#define GL_2X_BIT_ATI                                      0x00000001\r
+#define GL_4X_BIT_ATI                                      0x00000002\r
+#define GL_8X_BIT_ATI                                      0x00000004\r
+#define GL_HALF_BIT_ATI                                    0x00000008\r
+#define GL_QUARTER_BIT_ATI                                 0x00000010\r
+#define GL_EIGHTH_BIT_ATI                                  0x00000020\r
+#define GL_SATURATE_BIT_ATI                                0x00000040\r
+#define GL_COMP_BIT_ATI                                    0x00000002\r
+#define GL_NEGATE_BIT_ATI                                  0x00000004\r
+#define GL_BIAS_BIT_ATI                                    0x00000008\r
+#ifndef GLEE_H_DEFINED_glGenFragmentShadersATI\r
+#define GLEE_H_DEFINED_glGenFragmentShadersATI\r
+  typedef GLuint (APIENTRYP GLEEPFNGLGENFRAGMENTSHADERSATIPROC) (GLuint range);\r
+  GLEE_EXTERN GLEEPFNGLGENFRAGMENTSHADERSATIPROC GLeeFuncPtr_glGenFragmentShadersATI;\r
+  #define glGenFragmentShadersATI GLeeFuncPtr_glGenFragmentShadersATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glBindFragmentShaderATI\r
+#define GLEE_H_DEFINED_glBindFragmentShaderATI\r
+  typedef void (APIENTRYP GLEEPFNGLBINDFRAGMENTSHADERATIPROC) (GLuint id);\r
+  GLEE_EXTERN GLEEPFNGLBINDFRAGMENTSHADERATIPROC GLeeFuncPtr_glBindFragmentShaderATI;\r
+  #define glBindFragmentShaderATI GLeeFuncPtr_glBindFragmentShaderATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glDeleteFragmentShaderATI\r
+#define GLEE_H_DEFINED_glDeleteFragmentShaderATI\r
+  typedef void (APIENTRYP GLEEPFNGLDELETEFRAGMENTSHADERATIPROC) (GLuint id);\r
+  GLEE_EXTERN GLEEPFNGLDELETEFRAGMENTSHADERATIPROC GLeeFuncPtr_glDeleteFragmentShaderATI;\r
+  #define glDeleteFragmentShaderATI GLeeFuncPtr_glDeleteFragmentShaderATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glBeginFragmentShaderATI\r
+#define GLEE_H_DEFINED_glBeginFragmentShaderATI\r
+  typedef void (APIENTRYP GLEEPFNGLBEGINFRAGMENTSHADERATIPROC) ();\r
+  GLEE_EXTERN GLEEPFNGLBEGINFRAGMENTSHADERATIPROC GLeeFuncPtr_glBeginFragmentShaderATI;\r
+  #define glBeginFragmentShaderATI GLeeFuncPtr_glBeginFragmentShaderATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glEndFragmentShaderATI\r
+#define GLEE_H_DEFINED_glEndFragmentShaderATI\r
+  typedef void (APIENTRYP GLEEPFNGLENDFRAGMENTSHADERATIPROC) ();\r
+  GLEE_EXTERN GLEEPFNGLENDFRAGMENTSHADERATIPROC GLeeFuncPtr_glEndFragmentShaderATI;\r
+  #define glEndFragmentShaderATI GLeeFuncPtr_glEndFragmentShaderATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glPassTexCoordATI\r
+#define GLEE_H_DEFINED_glPassTexCoordATI\r
+  typedef void (APIENTRYP GLEEPFNGLPASSTEXCOORDATIPROC) (GLuint dst, GLuint coord, GLenum swizzle);\r
+  GLEE_EXTERN GLEEPFNGLPASSTEXCOORDATIPROC GLeeFuncPtr_glPassTexCoordATI;\r
+  #define glPassTexCoordATI GLeeFuncPtr_glPassTexCoordATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glSampleMapATI\r
+#define GLEE_H_DEFINED_glSampleMapATI\r
+  typedef void (APIENTRYP GLEEPFNGLSAMPLEMAPATIPROC) (GLuint dst, GLuint interp, GLenum swizzle);\r
+  GLEE_EXTERN GLEEPFNGLSAMPLEMAPATIPROC GLeeFuncPtr_glSampleMapATI;\r
+  #define glSampleMapATI GLeeFuncPtr_glSampleMapATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glColorFragmentOp1ATI\r
+#define GLEE_H_DEFINED_glColorFragmentOp1ATI\r
+  typedef void (APIENTRYP GLEEPFNGLCOLORFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod);\r
+  GLEE_EXTERN GLEEPFNGLCOLORFRAGMENTOP1ATIPROC GLeeFuncPtr_glColorFragmentOp1ATI;\r
+  #define glColorFragmentOp1ATI GLeeFuncPtr_glColorFragmentOp1ATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glColorFragmentOp2ATI\r
+#define GLEE_H_DEFINED_glColorFragmentOp2ATI\r
+  typedef void (APIENTRYP GLEEPFNGLCOLORFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod);\r
+  GLEE_EXTERN GLEEPFNGLCOLORFRAGMENTOP2ATIPROC GLeeFuncPtr_glColorFragmentOp2ATI;\r
+  #define glColorFragmentOp2ATI GLeeFuncPtr_glColorFragmentOp2ATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glColorFragmentOp3ATI\r
+#define GLEE_H_DEFINED_glColorFragmentOp3ATI\r
+  typedef void (APIENTRYP GLEEPFNGLCOLORFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod);\r
+  GLEE_EXTERN GLEEPFNGLCOLORFRAGMENTOP3ATIPROC GLeeFuncPtr_glColorFragmentOp3ATI;\r
+  #define glColorFragmentOp3ATI GLeeFuncPtr_glColorFragmentOp3ATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glAlphaFragmentOp1ATI\r
+#define GLEE_H_DEFINED_glAlphaFragmentOp1ATI\r
+  typedef void (APIENTRYP GLEEPFNGLALPHAFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod);\r
+  GLEE_EXTERN GLEEPFNGLALPHAFRAGMENTOP1ATIPROC GLeeFuncPtr_glAlphaFragmentOp1ATI;\r
+  #define glAlphaFragmentOp1ATI GLeeFuncPtr_glAlphaFragmentOp1ATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glAlphaFragmentOp2ATI\r
+#define GLEE_H_DEFINED_glAlphaFragmentOp2ATI\r
+  typedef void (APIENTRYP GLEEPFNGLALPHAFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod);\r
+  GLEE_EXTERN GLEEPFNGLALPHAFRAGMENTOP2ATIPROC GLeeFuncPtr_glAlphaFragmentOp2ATI;\r
+  #define glAlphaFragmentOp2ATI GLeeFuncPtr_glAlphaFragmentOp2ATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glAlphaFragmentOp3ATI\r
+#define GLEE_H_DEFINED_glAlphaFragmentOp3ATI\r
+  typedef void (APIENTRYP GLEEPFNGLALPHAFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod);\r
+  GLEE_EXTERN GLEEPFNGLALPHAFRAGMENTOP3ATIPROC GLeeFuncPtr_glAlphaFragmentOp3ATI;\r
+  #define glAlphaFragmentOp3ATI GLeeFuncPtr_glAlphaFragmentOp3ATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glSetFragmentShaderConstantATI\r
+#define GLEE_H_DEFINED_glSetFragmentShaderConstantATI\r
+  typedef void (APIENTRYP GLEEPFNGLSETFRAGMENTSHADERCONSTANTATIPROC) (GLuint dst, const GLfloat * value);\r
+  GLEE_EXTERN GLEEPFNGLSETFRAGMENTSHADERCONSTANTATIPROC GLeeFuncPtr_glSetFragmentShaderConstantATI;\r
+  #define glSetFragmentShaderConstantATI GLeeFuncPtr_glSetFragmentShaderConstantATI\r
+#endif\r
+#endif \r
+\r
+/* GL_ATI_pn_triangles */\r
+\r
+#ifndef GL_ATI_pn_triangles\r
+#define GL_ATI_pn_triangles 1\r
+#define __GLEE_GL_ATI_pn_triangles 1\r
+/* Constants */\r
+#define GL_PN_TRIANGLES_ATI                                0x87F0\r
+#define GL_MAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI          0x87F1\r
+#define GL_PN_TRIANGLES_POINT_MODE_ATI                     0x87F2\r
+#define GL_PN_TRIANGLES_NORMAL_MODE_ATI                    0x87F3\r
+#define GL_PN_TRIANGLES_TESSELATION_LEVEL_ATI              0x87F4\r
+#define GL_PN_TRIANGLES_POINT_MODE_LINEAR_ATI              0x87F5\r
+#define GL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI               0x87F6\r
+#define GL_PN_TRIANGLES_NORMAL_MODE_LINEAR_ATI             0x87F7\r
+#define GL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI          0x87F8\r
+#ifndef GLEE_H_DEFINED_glPNTrianglesiATI\r
+#define GLEE_H_DEFINED_glPNTrianglesiATI\r
+  typedef void (APIENTRYP GLEEPFNGLPNTRIANGLESIATIPROC) (GLenum pname, GLint param);\r
+  GLEE_EXTERN GLEEPFNGLPNTRIANGLESIATIPROC GLeeFuncPtr_glPNTrianglesiATI;\r
+  #define glPNTrianglesiATI GLeeFuncPtr_glPNTrianglesiATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glPNTrianglesfATI\r
+#define GLEE_H_DEFINED_glPNTrianglesfATI\r
+  typedef void (APIENTRYP GLEEPFNGLPNTRIANGLESFATIPROC) (GLenum pname, GLfloat param);\r
+  GLEE_EXTERN GLEEPFNGLPNTRIANGLESFATIPROC GLeeFuncPtr_glPNTrianglesfATI;\r
+  #define glPNTrianglesfATI GLeeFuncPtr_glPNTrianglesfATI\r
+#endif\r
+#endif \r
+\r
+/* GL_ATI_vertex_array_object */\r
+\r
+#ifndef GL_ATI_vertex_array_object\r
+#define GL_ATI_vertex_array_object 1\r
+#define __GLEE_GL_ATI_vertex_array_object 1\r
+/* Constants */\r
+#define GL_STATIC_ATI                                      0x8760\r
+#define GL_DYNAMIC_ATI                                     0x8761\r
+#define GL_PRESERVE_ATI                                    0x8762\r
+#define GL_DISCARD_ATI                                     0x8763\r
+#define GL_OBJECT_BUFFER_SIZE_ATI                          0x8764\r
+#define GL_OBJECT_BUFFER_USAGE_ATI                         0x8765\r
+#define GL_ARRAY_OBJECT_BUFFER_ATI                         0x8766\r
+#define GL_ARRAY_OBJECT_OFFSET_ATI                         0x8767\r
+#ifndef GLEE_H_DEFINED_glNewObjectBufferATI\r
+#define GLEE_H_DEFINED_glNewObjectBufferATI\r
+  typedef GLuint (APIENTRYP GLEEPFNGLNEWOBJECTBUFFERATIPROC) (GLsizei size, const GLvoid * pointer, GLenum usage);\r
+  GLEE_EXTERN GLEEPFNGLNEWOBJECTBUFFERATIPROC GLeeFuncPtr_glNewObjectBufferATI;\r
+  #define glNewObjectBufferATI GLeeFuncPtr_glNewObjectBufferATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glIsObjectBufferATI\r
+#define GLEE_H_DEFINED_glIsObjectBufferATI\r
+  typedef GLboolean (APIENTRYP GLEEPFNGLISOBJECTBUFFERATIPROC) (GLuint buffer);\r
+  GLEE_EXTERN GLEEPFNGLISOBJECTBUFFERATIPROC GLeeFuncPtr_glIsObjectBufferATI;\r
+  #define glIsObjectBufferATI GLeeFuncPtr_glIsObjectBufferATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUpdateObjectBufferATI\r
+#define GLEE_H_DEFINED_glUpdateObjectBufferATI\r
+  typedef void (APIENTRYP GLEEPFNGLUPDATEOBJECTBUFFERATIPROC) (GLuint buffer, GLuint offset, GLsizei size, const GLvoid * pointer, GLenum preserve);\r
+  GLEE_EXTERN GLEEPFNGLUPDATEOBJECTBUFFERATIPROC GLeeFuncPtr_glUpdateObjectBufferATI;\r
+  #define glUpdateObjectBufferATI GLeeFuncPtr_glUpdateObjectBufferATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetObjectBufferfvATI\r
+#define GLEE_H_DEFINED_glGetObjectBufferfvATI\r
+  typedef void (APIENTRYP GLEEPFNGLGETOBJECTBUFFERFVATIPROC) (GLuint buffer, GLenum pname, GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLGETOBJECTBUFFERFVATIPROC GLeeFuncPtr_glGetObjectBufferfvATI;\r
+  #define glGetObjectBufferfvATI GLeeFuncPtr_glGetObjectBufferfvATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetObjectBufferivATI\r
+#define GLEE_H_DEFINED_glGetObjectBufferivATI\r
+  typedef void (APIENTRYP GLEEPFNGLGETOBJECTBUFFERIVATIPROC) (GLuint buffer, GLenum pname, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETOBJECTBUFFERIVATIPROC GLeeFuncPtr_glGetObjectBufferivATI;\r
+  #define glGetObjectBufferivATI GLeeFuncPtr_glGetObjectBufferivATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFreeObjectBufferATI\r
+#define GLEE_H_DEFINED_glFreeObjectBufferATI\r
+  typedef void (APIENTRYP GLEEPFNGLFREEOBJECTBUFFERATIPROC) (GLuint buffer);\r
+  GLEE_EXTERN GLEEPFNGLFREEOBJECTBUFFERATIPROC GLeeFuncPtr_glFreeObjectBufferATI;\r
+  #define glFreeObjectBufferATI GLeeFuncPtr_glFreeObjectBufferATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glArrayObjectATI\r
+#define GLEE_H_DEFINED_glArrayObjectATI\r
+  typedef void (APIENTRYP GLEEPFNGLARRAYOBJECTATIPROC) (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset);\r
+  GLEE_EXTERN GLEEPFNGLARRAYOBJECTATIPROC GLeeFuncPtr_glArrayObjectATI;\r
+  #define glArrayObjectATI GLeeFuncPtr_glArrayObjectATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetArrayObjectfvATI\r
+#define GLEE_H_DEFINED_glGetArrayObjectfvATI\r
+  typedef void (APIENTRYP GLEEPFNGLGETARRAYOBJECTFVATIPROC) (GLenum array, GLenum pname, GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLGETARRAYOBJECTFVATIPROC GLeeFuncPtr_glGetArrayObjectfvATI;\r
+  #define glGetArrayObjectfvATI GLeeFuncPtr_glGetArrayObjectfvATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetArrayObjectivATI\r
+#define GLEE_H_DEFINED_glGetArrayObjectivATI\r
+  typedef void (APIENTRYP GLEEPFNGLGETARRAYOBJECTIVATIPROC) (GLenum array, GLenum pname, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETARRAYOBJECTIVATIPROC GLeeFuncPtr_glGetArrayObjectivATI;\r
+  #define glGetArrayObjectivATI GLeeFuncPtr_glGetArrayObjectivATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVariantArrayObjectATI\r
+#define GLEE_H_DEFINED_glVariantArrayObjectATI\r
+  typedef void (APIENTRYP GLEEPFNGLVARIANTARRAYOBJECTATIPROC) (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset);\r
+  GLEE_EXTERN GLEEPFNGLVARIANTARRAYOBJECTATIPROC GLeeFuncPtr_glVariantArrayObjectATI;\r
+  #define glVariantArrayObjectATI GLeeFuncPtr_glVariantArrayObjectATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetVariantArrayObjectfvATI\r
+#define GLEE_H_DEFINED_glGetVariantArrayObjectfvATI\r
+  typedef void (APIENTRYP GLEEPFNGLGETVARIANTARRAYOBJECTFVATIPROC) (GLuint id, GLenum pname, GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLGETVARIANTARRAYOBJECTFVATIPROC GLeeFuncPtr_glGetVariantArrayObjectfvATI;\r
+  #define glGetVariantArrayObjectfvATI GLeeFuncPtr_glGetVariantArrayObjectfvATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetVariantArrayObjectivATI\r
+#define GLEE_H_DEFINED_glGetVariantArrayObjectivATI\r
+  typedef void (APIENTRYP GLEEPFNGLGETVARIANTARRAYOBJECTIVATIPROC) (GLuint id, GLenum pname, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETVARIANTARRAYOBJECTIVATIPROC GLeeFuncPtr_glGetVariantArrayObjectivATI;\r
+  #define glGetVariantArrayObjectivATI GLeeFuncPtr_glGetVariantArrayObjectivATI\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_vertex_shader */\r
+\r
+#ifndef GL_EXT_vertex_shader\r
+#define GL_EXT_vertex_shader 1\r
+#define __GLEE_GL_EXT_vertex_shader 1\r
+/* Constants */\r
+#define GL_VERTEX_SHADER_EXT                               0x8780\r
+#define GL_VERTEX_SHADER_BINDING_EXT                       0x8781\r
+#define GL_OP_INDEX_EXT                                    0x8782\r
+#define GL_OP_NEGATE_EXT                                   0x8783\r
+#define GL_OP_DOT3_EXT                                     0x8784\r
+#define GL_OP_DOT4_EXT                                     0x8785\r
+#define GL_OP_MUL_EXT                                      0x8786\r
+#define GL_OP_ADD_EXT                                      0x8787\r
+#define GL_OP_MADD_EXT                                     0x8788\r
+#define GL_OP_FRAC_EXT                                     0x8789\r
+#define GL_OP_MAX_EXT                                      0x878A\r
+#define GL_OP_MIN_EXT                                      0x878B\r
+#define GL_OP_SET_GE_EXT                                   0x878C\r
+#define GL_OP_SET_LT_EXT                                   0x878D\r
+#define GL_OP_CLAMP_EXT                                    0x878E\r
+#define GL_OP_FLOOR_EXT                                    0x878F\r
+#define GL_OP_ROUND_EXT                                    0x8790\r
+#define GL_OP_EXP_BASE_2_EXT                               0x8791\r
+#define GL_OP_LOG_BASE_2_EXT                               0x8792\r
+#define GL_OP_POWER_EXT                                    0x8793\r
+#define GL_OP_RECIP_EXT                                    0x8794\r
+#define GL_OP_RECIP_SQRT_EXT                               0x8795\r
+#define GL_OP_SUB_EXT                                      0x8796\r
+#define GL_OP_CROSS_PRODUCT_EXT                            0x8797\r
+#define GL_OP_MULTIPLY_MATRIX_EXT                          0x8798\r
+#define GL_OP_MOV_EXT                                      0x8799\r
+#define GL_OUTPUT_VERTEX_EXT                               0x879A\r
+#define GL_OUTPUT_COLOR0_EXT                               0x879B\r
+#define GL_OUTPUT_COLOR1_EXT                               0x879C\r
+#define GL_OUTPUT_TEXTURE_COORD0_EXT                       0x879D\r
+#define GL_OUTPUT_TEXTURE_COORD1_EXT                       0x879E\r
+#define GL_OUTPUT_TEXTURE_COORD2_EXT                       0x879F\r
+#define GL_OUTPUT_TEXTURE_COORD3_EXT                       0x87A0\r
+#define GL_OUTPUT_TEXTURE_COORD4_EXT                       0x87A1\r
+#define GL_OUTPUT_TEXTURE_COORD5_EXT                       0x87A2\r
+#define GL_OUTPUT_TEXTURE_COORD6_EXT                       0x87A3\r
+#define GL_OUTPUT_TEXTURE_COORD7_EXT                       0x87A4\r
+#define GL_OUTPUT_TEXTURE_COORD8_EXT                       0x87A5\r
+#define GL_OUTPUT_TEXTURE_COORD9_EXT                       0x87A6\r
+#define GL_OUTPUT_TEXTURE_COORD10_EXT                      0x87A7\r
+#define GL_OUTPUT_TEXTURE_COORD11_EXT                      0x87A8\r
+#define GL_OUTPUT_TEXTURE_COORD12_EXT                      0x87A9\r
+#define GL_OUTPUT_TEXTURE_COORD13_EXT                      0x87AA\r
+#define GL_OUTPUT_TEXTURE_COORD14_EXT                      0x87AB\r
+#define GL_OUTPUT_TEXTURE_COORD15_EXT                      0x87AC\r
+#define GL_OUTPUT_TEXTURE_COORD16_EXT                      0x87AD\r
+#define GL_OUTPUT_TEXTURE_COORD17_EXT                      0x87AE\r
+#define GL_OUTPUT_TEXTURE_COORD18_EXT                      0x87AF\r
+#define GL_OUTPUT_TEXTURE_COORD19_EXT                      0x87B0\r
+#define GL_OUTPUT_TEXTURE_COORD20_EXT                      0x87B1\r
+#define GL_OUTPUT_TEXTURE_COORD21_EXT                      0x87B2\r
+#define GL_OUTPUT_TEXTURE_COORD22_EXT                      0x87B3\r
+#define GL_OUTPUT_TEXTURE_COORD23_EXT                      0x87B4\r
+#define GL_OUTPUT_TEXTURE_COORD24_EXT                      0x87B5\r
+#define GL_OUTPUT_TEXTURE_COORD25_EXT                      0x87B6\r
+#define GL_OUTPUT_TEXTURE_COORD26_EXT                      0x87B7\r
+#define GL_OUTPUT_TEXTURE_COORD27_EXT                      0x87B8\r
+#define GL_OUTPUT_TEXTURE_COORD28_EXT                      0x87B9\r
+#define GL_OUTPUT_TEXTURE_COORD29_EXT                      0x87BA\r
+#define GL_OUTPUT_TEXTURE_COORD30_EXT                      0x87BB\r
+#define GL_OUTPUT_TEXTURE_COORD31_EXT                      0x87BC\r
+#define GL_OUTPUT_FOG_EXT                                  0x87BD\r
+#define GL_SCALAR_EXT                                      0x87BE\r
+#define GL_VECTOR_EXT                                      0x87BF\r
+#define GL_MATRIX_EXT                                      0x87C0\r
+#define GL_VARIANT_EXT                                     0x87C1\r
+#define GL_INVARIANT_EXT                                   0x87C2\r
+#define GL_LOCAL_CONSTANT_EXT                              0x87C3\r
+#define GL_LOCAL_EXT                                       0x87C4\r
+#define GL_MAX_VERTEX_SHADER_INSTRUCTIONS_EXT              0x87C5\r
+#define GL_MAX_VERTEX_SHADER_VARIANTS_EXT                  0x87C6\r
+#define GL_MAX_VERTEX_SHADER_INVARIANTS_EXT                0x87C7\r
+#define GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT           0x87C8\r
+#define GL_MAX_VERTEX_SHADER_LOCALS_EXT                    0x87C9\r
+#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT    0x87CA\r
+#define GL_MAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT        0x87CB\r
+#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87CC\r
+#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT      0x87CD\r
+#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT          0x87CE\r
+#define GL_VERTEX_SHADER_INSTRUCTIONS_EXT                  0x87CF\r
+#define GL_VERTEX_SHADER_VARIANTS_EXT                      0x87D0\r
+#define GL_VERTEX_SHADER_INVARIANTS_EXT                    0x87D1\r
+#define GL_VERTEX_SHADER_LOCAL_CONSTANTS_EXT               0x87D2\r
+#define GL_VERTEX_SHADER_LOCALS_EXT                        0x87D3\r
+#define GL_VERTEX_SHADER_OPTIMIZED_EXT                     0x87D4\r
+#define GL_X_EXT                                           0x87D5\r
+#define GL_Y_EXT                                           0x87D6\r
+#define GL_Z_EXT                                           0x87D7\r
+#define GL_W_EXT                                           0x87D8\r
+#define GL_NEGATIVE_X_EXT                                  0x87D9\r
+#define GL_NEGATIVE_Y_EXT                                  0x87DA\r
+#define GL_NEGATIVE_Z_EXT                                  0x87DB\r
+#define GL_NEGATIVE_W_EXT                                  0x87DC\r
+#define GL_ZERO_EXT                                        0x87DD\r
+#define GL_ONE_EXT                                         0x87DE\r
+#define GL_NEGATIVE_ONE_EXT                                0x87DF\r
+#define GL_NORMALIZED_RANGE_EXT                            0x87E0\r
+#define GL_FULL_RANGE_EXT                                  0x87E1\r
+#define GL_CURRENT_VERTEX_EXT                              0x87E2\r
+#define GL_MVP_MATRIX_EXT                                  0x87E3\r
+#define GL_VARIANT_VALUE_EXT                               0x87E4\r
+#define GL_VARIANT_DATATYPE_EXT                            0x87E5\r
+#define GL_VARIANT_ARRAY_STRIDE_EXT                        0x87E6\r
+#define GL_VARIANT_ARRAY_TYPE_EXT                          0x87E7\r
+#define GL_VARIANT_ARRAY_EXT                               0x87E8\r
+#define GL_VARIANT_ARRAY_POINTER_EXT                       0x87E9\r
+#define GL_INVARIANT_VALUE_EXT                             0x87EA\r
+#define GL_INVARIANT_DATATYPE_EXT                          0x87EB\r
+#define GL_LOCAL_CONSTANT_VALUE_EXT                        0x87EC\r
+#define GL_LOCAL_CONSTANT_DATATYPE_EXT                     0x87ED\r
+#ifndef GLEE_H_DEFINED_glBeginVertexShaderEXT\r
+#define GLEE_H_DEFINED_glBeginVertexShaderEXT\r
+  typedef void (APIENTRYP GLEEPFNGLBEGINVERTEXSHADEREXTPROC) ();\r
+  GLEE_EXTERN GLEEPFNGLBEGINVERTEXSHADEREXTPROC GLeeFuncPtr_glBeginVertexShaderEXT;\r
+  #define glBeginVertexShaderEXT GLeeFuncPtr_glBeginVertexShaderEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glEndVertexShaderEXT\r
+#define GLEE_H_DEFINED_glEndVertexShaderEXT\r
+  typedef void (APIENTRYP GLEEPFNGLENDVERTEXSHADEREXTPROC) ();\r
+  GLEE_EXTERN GLEEPFNGLENDVERTEXSHADEREXTPROC GLeeFuncPtr_glEndVertexShaderEXT;\r
+  #define glEndVertexShaderEXT GLeeFuncPtr_glEndVertexShaderEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glBindVertexShaderEXT\r
+#define GLEE_H_DEFINED_glBindVertexShaderEXT\r
+  typedef void (APIENTRYP GLEEPFNGLBINDVERTEXSHADEREXTPROC) (GLuint id);\r
+  GLEE_EXTERN GLEEPFNGLBINDVERTEXSHADEREXTPROC GLeeFuncPtr_glBindVertexShaderEXT;\r
+  #define glBindVertexShaderEXT GLeeFuncPtr_glBindVertexShaderEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGenVertexShadersEXT\r
+#define GLEE_H_DEFINED_glGenVertexShadersEXT\r
+  typedef GLuint (APIENTRYP GLEEPFNGLGENVERTEXSHADERSEXTPROC) (GLuint range);\r
+  GLEE_EXTERN GLEEPFNGLGENVERTEXSHADERSEXTPROC GLeeFuncPtr_glGenVertexShadersEXT;\r
+  #define glGenVertexShadersEXT GLeeFuncPtr_glGenVertexShadersEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glDeleteVertexShaderEXT\r
+#define GLEE_H_DEFINED_glDeleteVertexShaderEXT\r
+  typedef void (APIENTRYP GLEEPFNGLDELETEVERTEXSHADEREXTPROC) (GLuint id);\r
+  GLEE_EXTERN GLEEPFNGLDELETEVERTEXSHADEREXTPROC GLeeFuncPtr_glDeleteVertexShaderEXT;\r
+  #define glDeleteVertexShaderEXT GLeeFuncPtr_glDeleteVertexShaderEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glShaderOp1EXT\r
+#define GLEE_H_DEFINED_glShaderOp1EXT\r
+  typedef void (APIENTRYP GLEEPFNGLSHADEROP1EXTPROC) (GLenum op, GLuint res, GLuint arg1);\r
+  GLEE_EXTERN GLEEPFNGLSHADEROP1EXTPROC GLeeFuncPtr_glShaderOp1EXT;\r
+  #define glShaderOp1EXT GLeeFuncPtr_glShaderOp1EXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glShaderOp2EXT\r
+#define GLEE_H_DEFINED_glShaderOp2EXT\r
+  typedef void (APIENTRYP GLEEPFNGLSHADEROP2EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2);\r
+  GLEE_EXTERN GLEEPFNGLSHADEROP2EXTPROC GLeeFuncPtr_glShaderOp2EXT;\r
+  #define glShaderOp2EXT GLeeFuncPtr_glShaderOp2EXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glShaderOp3EXT\r
+#define GLEE_H_DEFINED_glShaderOp3EXT\r
+  typedef void (APIENTRYP GLEEPFNGLSHADEROP3EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3);\r
+  GLEE_EXTERN GLEEPFNGLSHADEROP3EXTPROC GLeeFuncPtr_glShaderOp3EXT;\r
+  #define glShaderOp3EXT GLeeFuncPtr_glShaderOp3EXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glSwizzleEXT\r
+#define GLEE_H_DEFINED_glSwizzleEXT\r
+  typedef void (APIENTRYP GLEEPFNGLSWIZZLEEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW);\r
+  GLEE_EXTERN GLEEPFNGLSWIZZLEEXTPROC GLeeFuncPtr_glSwizzleEXT;\r
+  #define glSwizzleEXT GLeeFuncPtr_glSwizzleEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glWriteMaskEXT\r
+#define GLEE_H_DEFINED_glWriteMaskEXT\r
+  typedef void (APIENTRYP GLEEPFNGLWRITEMASKEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW);\r
+  GLEE_EXTERN GLEEPFNGLWRITEMASKEXTPROC GLeeFuncPtr_glWriteMaskEXT;\r
+  #define glWriteMaskEXT GLeeFuncPtr_glWriteMaskEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glInsertComponentEXT\r
+#define GLEE_H_DEFINED_glInsertComponentEXT\r
+  typedef void (APIENTRYP GLEEPFNGLINSERTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num);\r
+  GLEE_EXTERN GLEEPFNGLINSERTCOMPONENTEXTPROC GLeeFuncPtr_glInsertComponentEXT;\r
+  #define glInsertComponentEXT GLeeFuncPtr_glInsertComponentEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glExtractComponentEXT\r
+#define GLEE_H_DEFINED_glExtractComponentEXT\r
+  typedef void (APIENTRYP GLEEPFNGLEXTRACTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num);\r
+  GLEE_EXTERN GLEEPFNGLEXTRACTCOMPONENTEXTPROC GLeeFuncPtr_glExtractComponentEXT;\r
+  #define glExtractComponentEXT GLeeFuncPtr_glExtractComponentEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGenSymbolsEXT\r
+#define GLEE_H_DEFINED_glGenSymbolsEXT\r
+  typedef GLuint (APIENTRYP GLEEPFNGLGENSYMBOLSEXTPROC) (GLenum datatype, GLenum storagetype, GLenum range, GLuint components);\r
+  GLEE_EXTERN GLEEPFNGLGENSYMBOLSEXTPROC GLeeFuncPtr_glGenSymbolsEXT;\r
+  #define glGenSymbolsEXT GLeeFuncPtr_glGenSymbolsEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glSetInvariantEXT\r
+#define GLEE_H_DEFINED_glSetInvariantEXT\r
+  typedef void (APIENTRYP GLEEPFNGLSETINVARIANTEXTPROC) (GLuint id, GLenum type, const GLvoid * addr);\r
+  GLEE_EXTERN GLEEPFNGLSETINVARIANTEXTPROC GLeeFuncPtr_glSetInvariantEXT;\r
+  #define glSetInvariantEXT GLeeFuncPtr_glSetInvariantEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glSetLocalConstantEXT\r
+#define GLEE_H_DEFINED_glSetLocalConstantEXT\r
+  typedef void (APIENTRYP GLEEPFNGLSETLOCALCONSTANTEXTPROC) (GLuint id, GLenum type, const GLvoid * addr);\r
+  GLEE_EXTERN GLEEPFNGLSETLOCALCONSTANTEXTPROC GLeeFuncPtr_glSetLocalConstantEXT;\r
+  #define glSetLocalConstantEXT GLeeFuncPtr_glSetLocalConstantEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVariantbvEXT\r
+#define GLEE_H_DEFINED_glVariantbvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLVARIANTBVEXTPROC) (GLuint id, const GLbyte * addr);\r
+  GLEE_EXTERN GLEEPFNGLVARIANTBVEXTPROC GLeeFuncPtr_glVariantbvEXT;\r
+  #define glVariantbvEXT GLeeFuncPtr_glVariantbvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVariantsvEXT\r
+#define GLEE_H_DEFINED_glVariantsvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLVARIANTSVEXTPROC) (GLuint id, const GLshort * addr);\r
+  GLEE_EXTERN GLEEPFNGLVARIANTSVEXTPROC GLeeFuncPtr_glVariantsvEXT;\r
+  #define glVariantsvEXT GLeeFuncPtr_glVariantsvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVariantivEXT\r
+#define GLEE_H_DEFINED_glVariantivEXT\r
+  typedef void (APIENTRYP GLEEPFNGLVARIANTIVEXTPROC) (GLuint id, const GLint * addr);\r
+  GLEE_EXTERN GLEEPFNGLVARIANTIVEXTPROC GLeeFuncPtr_glVariantivEXT;\r
+  #define glVariantivEXT GLeeFuncPtr_glVariantivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVariantfvEXT\r
+#define GLEE_H_DEFINED_glVariantfvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLVARIANTFVEXTPROC) (GLuint id, const GLfloat * addr);\r
+  GLEE_EXTERN GLEEPFNGLVARIANTFVEXTPROC GLeeFuncPtr_glVariantfvEXT;\r
+  #define glVariantfvEXT GLeeFuncPtr_glVariantfvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVariantdvEXT\r
+#define GLEE_H_DEFINED_glVariantdvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLVARIANTDVEXTPROC) (GLuint id, const GLdouble * addr);\r
+  GLEE_EXTERN GLEEPFNGLVARIANTDVEXTPROC GLeeFuncPtr_glVariantdvEXT;\r
+  #define glVariantdvEXT GLeeFuncPtr_glVariantdvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVariantubvEXT\r
+#define GLEE_H_DEFINED_glVariantubvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLVARIANTUBVEXTPROC) (GLuint id, const GLubyte * addr);\r
+  GLEE_EXTERN GLEEPFNGLVARIANTUBVEXTPROC GLeeFuncPtr_glVariantubvEXT;\r
+  #define glVariantubvEXT GLeeFuncPtr_glVariantubvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVariantusvEXT\r
+#define GLEE_H_DEFINED_glVariantusvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLVARIANTUSVEXTPROC) (GLuint id, const GLushort * addr);\r
+  GLEE_EXTERN GLEEPFNGLVARIANTUSVEXTPROC GLeeFuncPtr_glVariantusvEXT;\r
+  #define glVariantusvEXT GLeeFuncPtr_glVariantusvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVariantuivEXT\r
+#define GLEE_H_DEFINED_glVariantuivEXT\r
+  typedef void (APIENTRYP GLEEPFNGLVARIANTUIVEXTPROC) (GLuint id, const GLuint * addr);\r
+  GLEE_EXTERN GLEEPFNGLVARIANTUIVEXTPROC GLeeFuncPtr_glVariantuivEXT;\r
+  #define glVariantuivEXT GLeeFuncPtr_glVariantuivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVariantPointerEXT\r
+#define GLEE_H_DEFINED_glVariantPointerEXT\r
+  typedef void (APIENTRYP GLEEPFNGLVARIANTPOINTEREXTPROC) (GLuint id, GLenum type, GLuint stride, const GLvoid * addr);\r
+  GLEE_EXTERN GLEEPFNGLVARIANTPOINTEREXTPROC GLeeFuncPtr_glVariantPointerEXT;\r
+  #define glVariantPointerEXT GLeeFuncPtr_glVariantPointerEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glEnableVariantClientStateEXT\r
+#define GLEE_H_DEFINED_glEnableVariantClientStateEXT\r
+  typedef void (APIENTRYP GLEEPFNGLENABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id);\r
+  GLEE_EXTERN GLEEPFNGLENABLEVARIANTCLIENTSTATEEXTPROC GLeeFuncPtr_glEnableVariantClientStateEXT;\r
+  #define glEnableVariantClientStateEXT GLeeFuncPtr_glEnableVariantClientStateEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glDisableVariantClientStateEXT\r
+#define GLEE_H_DEFINED_glDisableVariantClientStateEXT\r
+  typedef void (APIENTRYP GLEEPFNGLDISABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id);\r
+  GLEE_EXTERN GLEEPFNGLDISABLEVARIANTCLIENTSTATEEXTPROC GLeeFuncPtr_glDisableVariantClientStateEXT;\r
+  #define glDisableVariantClientStateEXT GLeeFuncPtr_glDisableVariantClientStateEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glBindLightParameterEXT\r
+#define GLEE_H_DEFINED_glBindLightParameterEXT\r
+  typedef GLuint (APIENTRYP GLEEPFNGLBINDLIGHTPARAMETEREXTPROC) (GLenum light, GLenum value);\r
+  GLEE_EXTERN GLEEPFNGLBINDLIGHTPARAMETEREXTPROC GLeeFuncPtr_glBindLightParameterEXT;\r
+  #define glBindLightParameterEXT GLeeFuncPtr_glBindLightParameterEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glBindMaterialParameterEXT\r
+#define GLEE_H_DEFINED_glBindMaterialParameterEXT\r
+  typedef GLuint (APIENTRYP GLEEPFNGLBINDMATERIALPARAMETEREXTPROC) (GLenum face, GLenum value);\r
+  GLEE_EXTERN GLEEPFNGLBINDMATERIALPARAMETEREXTPROC GLeeFuncPtr_glBindMaterialParameterEXT;\r
+  #define glBindMaterialParameterEXT GLeeFuncPtr_glBindMaterialParameterEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glBindTexGenParameterEXT\r
+#define GLEE_H_DEFINED_glBindTexGenParameterEXT\r
+  typedef GLuint (APIENTRYP GLEEPFNGLBINDTEXGENPARAMETEREXTPROC) (GLenum unit, GLenum coord, GLenum value);\r
+  GLEE_EXTERN GLEEPFNGLBINDTEXGENPARAMETEREXTPROC GLeeFuncPtr_glBindTexGenParameterEXT;\r
+  #define glBindTexGenParameterEXT GLeeFuncPtr_glBindTexGenParameterEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glBindTextureUnitParameterEXT\r
+#define GLEE_H_DEFINED_glBindTextureUnitParameterEXT\r
+  typedef GLuint (APIENTRYP GLEEPFNGLBINDTEXTUREUNITPARAMETEREXTPROC) (GLenum unit, GLenum value);\r
+  GLEE_EXTERN GLEEPFNGLBINDTEXTUREUNITPARAMETEREXTPROC GLeeFuncPtr_glBindTextureUnitParameterEXT;\r
+  #define glBindTextureUnitParameterEXT GLeeFuncPtr_glBindTextureUnitParameterEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glBindParameterEXT\r
+#define GLEE_H_DEFINED_glBindParameterEXT\r
+  typedef GLuint (APIENTRYP GLEEPFNGLBINDPARAMETEREXTPROC) (GLenum value);\r
+  GLEE_EXTERN GLEEPFNGLBINDPARAMETEREXTPROC GLeeFuncPtr_glBindParameterEXT;\r
+  #define glBindParameterEXT GLeeFuncPtr_glBindParameterEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glIsVariantEnabledEXT\r
+#define GLEE_H_DEFINED_glIsVariantEnabledEXT\r
+  typedef GLboolean (APIENTRYP GLEEPFNGLISVARIANTENABLEDEXTPROC) (GLuint id, GLenum cap);\r
+  GLEE_EXTERN GLEEPFNGLISVARIANTENABLEDEXTPROC GLeeFuncPtr_glIsVariantEnabledEXT;\r
+  #define glIsVariantEnabledEXT GLeeFuncPtr_glIsVariantEnabledEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetVariantBooleanvEXT\r
+#define GLEE_H_DEFINED_glGetVariantBooleanvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean * data);\r
+  GLEE_EXTERN GLEEPFNGLGETVARIANTBOOLEANVEXTPROC GLeeFuncPtr_glGetVariantBooleanvEXT;\r
+  #define glGetVariantBooleanvEXT GLeeFuncPtr_glGetVariantBooleanvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetVariantIntegervEXT\r
+#define GLEE_H_DEFINED_glGetVariantIntegervEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint * data);\r
+  GLEE_EXTERN GLEEPFNGLGETVARIANTINTEGERVEXTPROC GLeeFuncPtr_glGetVariantIntegervEXT;\r
+  #define glGetVariantIntegervEXT GLeeFuncPtr_glGetVariantIntegervEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetVariantFloatvEXT\r
+#define GLEE_H_DEFINED_glGetVariantFloatvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat * data);\r
+  GLEE_EXTERN GLEEPFNGLGETVARIANTFLOATVEXTPROC GLeeFuncPtr_glGetVariantFloatvEXT;\r
+  #define glGetVariantFloatvEXT GLeeFuncPtr_glGetVariantFloatvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetVariantPointervEXT\r
+#define GLEE_H_DEFINED_glGetVariantPointervEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETVARIANTPOINTERVEXTPROC) (GLuint id, GLenum value, GLvoid* * data);\r
+  GLEE_EXTERN GLEEPFNGLGETVARIANTPOINTERVEXTPROC GLeeFuncPtr_glGetVariantPointervEXT;\r
+  #define glGetVariantPointervEXT GLeeFuncPtr_glGetVariantPointervEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetInvariantBooleanvEXT\r
+#define GLEE_H_DEFINED_glGetInvariantBooleanvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETINVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean * data);\r
+  GLEE_EXTERN GLEEPFNGLGETINVARIANTBOOLEANVEXTPROC GLeeFuncPtr_glGetInvariantBooleanvEXT;\r
+  #define glGetInvariantBooleanvEXT GLeeFuncPtr_glGetInvariantBooleanvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetInvariantIntegervEXT\r
+#define GLEE_H_DEFINED_glGetInvariantIntegervEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETINVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint * data);\r
+  GLEE_EXTERN GLEEPFNGLGETINVARIANTINTEGERVEXTPROC GLeeFuncPtr_glGetInvariantIntegervEXT;\r
+  #define glGetInvariantIntegervEXT GLeeFuncPtr_glGetInvariantIntegervEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetInvariantFloatvEXT\r
+#define GLEE_H_DEFINED_glGetInvariantFloatvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETINVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat * data);\r
+  GLEE_EXTERN GLEEPFNGLGETINVARIANTFLOATVEXTPROC GLeeFuncPtr_glGetInvariantFloatvEXT;\r
+  #define glGetInvariantFloatvEXT GLeeFuncPtr_glGetInvariantFloatvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetLocalConstantBooleanvEXT\r
+#define GLEE_H_DEFINED_glGetLocalConstantBooleanvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETLOCALCONSTANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean * data);\r
+  GLEE_EXTERN GLEEPFNGLGETLOCALCONSTANTBOOLEANVEXTPROC GLeeFuncPtr_glGetLocalConstantBooleanvEXT;\r
+  #define glGetLocalConstantBooleanvEXT GLeeFuncPtr_glGetLocalConstantBooleanvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetLocalConstantIntegervEXT\r
+#define GLEE_H_DEFINED_glGetLocalConstantIntegervEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETLOCALCONSTANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint * data);\r
+  GLEE_EXTERN GLEEPFNGLGETLOCALCONSTANTINTEGERVEXTPROC GLeeFuncPtr_glGetLocalConstantIntegervEXT;\r
+  #define glGetLocalConstantIntegervEXT GLeeFuncPtr_glGetLocalConstantIntegervEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetLocalConstantFloatvEXT\r
+#define GLEE_H_DEFINED_glGetLocalConstantFloatvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETLOCALCONSTANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat * data);\r
+  GLEE_EXTERN GLEEPFNGLGETLOCALCONSTANTFLOATVEXTPROC GLeeFuncPtr_glGetLocalConstantFloatvEXT;\r
+  #define glGetLocalConstantFloatvEXT GLeeFuncPtr_glGetLocalConstantFloatvEXT\r
+#endif\r
+#endif \r
+\r
+/* GL_ATI_vertex_streams */\r
+\r
+#ifndef GL_ATI_vertex_streams\r
+#define GL_ATI_vertex_streams 1\r
+#define __GLEE_GL_ATI_vertex_streams 1\r
+/* Constants */\r
+#define GL_MAX_VERTEX_STREAMS_ATI                          0x876B\r
+#define GL_VERTEX_STREAM0_ATI                              0x876C\r
+#define GL_VERTEX_STREAM1_ATI                              0x876D\r
+#define GL_VERTEX_STREAM2_ATI                              0x876E\r
+#define GL_VERTEX_STREAM3_ATI                              0x876F\r
+#define GL_VERTEX_STREAM4_ATI                              0x8770\r
+#define GL_VERTEX_STREAM5_ATI                              0x8771\r
+#define GL_VERTEX_STREAM6_ATI                              0x8772\r
+#define GL_VERTEX_STREAM7_ATI                              0x8773\r
+#define GL_VERTEX_SOURCE_ATI                               0x8774\r
+#ifndef GLEE_H_DEFINED_glVertexStream1sATI\r
+#define GLEE_H_DEFINED_glVertexStream1sATI\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM1SATIPROC) (GLenum stream, GLshort x);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXSTREAM1SATIPROC GLeeFuncPtr_glVertexStream1sATI;\r
+  #define glVertexStream1sATI GLeeFuncPtr_glVertexStream1sATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexStream1svATI\r
+#define GLEE_H_DEFINED_glVertexStream1svATI\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM1SVATIPROC) (GLenum stream, const GLshort * coords);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXSTREAM1SVATIPROC GLeeFuncPtr_glVertexStream1svATI;\r
+  #define glVertexStream1svATI GLeeFuncPtr_glVertexStream1svATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexStream1iATI\r
+#define GLEE_H_DEFINED_glVertexStream1iATI\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM1IATIPROC) (GLenum stream, GLint x);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXSTREAM1IATIPROC GLeeFuncPtr_glVertexStream1iATI;\r
+  #define glVertexStream1iATI GLeeFuncPtr_glVertexStream1iATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexStream1ivATI\r
+#define GLEE_H_DEFINED_glVertexStream1ivATI\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM1IVATIPROC) (GLenum stream, const GLint * coords);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXSTREAM1IVATIPROC GLeeFuncPtr_glVertexStream1ivATI;\r
+  #define glVertexStream1ivATI GLeeFuncPtr_glVertexStream1ivATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexStream1fATI\r
+#define GLEE_H_DEFINED_glVertexStream1fATI\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM1FATIPROC) (GLenum stream, GLfloat x);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXSTREAM1FATIPROC GLeeFuncPtr_glVertexStream1fATI;\r
+  #define glVertexStream1fATI GLeeFuncPtr_glVertexStream1fATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexStream1fvATI\r
+#define GLEE_H_DEFINED_glVertexStream1fvATI\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM1FVATIPROC) (GLenum stream, const GLfloat * coords);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXSTREAM1FVATIPROC GLeeFuncPtr_glVertexStream1fvATI;\r
+  #define glVertexStream1fvATI GLeeFuncPtr_glVertexStream1fvATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexStream1dATI\r
+#define GLEE_H_DEFINED_glVertexStream1dATI\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM1DATIPROC) (GLenum stream, GLdouble x);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXSTREAM1DATIPROC GLeeFuncPtr_glVertexStream1dATI;\r
+  #define glVertexStream1dATI GLeeFuncPtr_glVertexStream1dATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexStream1dvATI\r
+#define GLEE_H_DEFINED_glVertexStream1dvATI\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM1DVATIPROC) (GLenum stream, const GLdouble * coords);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXSTREAM1DVATIPROC GLeeFuncPtr_glVertexStream1dvATI;\r
+  #define glVertexStream1dvATI GLeeFuncPtr_glVertexStream1dvATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexStream2sATI\r
+#define GLEE_H_DEFINED_glVertexStream2sATI\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM2SATIPROC) (GLenum stream, GLshort x, GLshort y);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXSTREAM2SATIPROC GLeeFuncPtr_glVertexStream2sATI;\r
+  #define glVertexStream2sATI GLeeFuncPtr_glVertexStream2sATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexStream2svATI\r
+#define GLEE_H_DEFINED_glVertexStream2svATI\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM2SVATIPROC) (GLenum stream, const GLshort * coords);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXSTREAM2SVATIPROC GLeeFuncPtr_glVertexStream2svATI;\r
+  #define glVertexStream2svATI GLeeFuncPtr_glVertexStream2svATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexStream2iATI\r
+#define GLEE_H_DEFINED_glVertexStream2iATI\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM2IATIPROC) (GLenum stream, GLint x, GLint y);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXSTREAM2IATIPROC GLeeFuncPtr_glVertexStream2iATI;\r
+  #define glVertexStream2iATI GLeeFuncPtr_glVertexStream2iATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexStream2ivATI\r
+#define GLEE_H_DEFINED_glVertexStream2ivATI\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM2IVATIPROC) (GLenum stream, const GLint * coords);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXSTREAM2IVATIPROC GLeeFuncPtr_glVertexStream2ivATI;\r
+  #define glVertexStream2ivATI GLeeFuncPtr_glVertexStream2ivATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexStream2fATI\r
+#define GLEE_H_DEFINED_glVertexStream2fATI\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM2FATIPROC) (GLenum stream, GLfloat x, GLfloat y);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXSTREAM2FATIPROC GLeeFuncPtr_glVertexStream2fATI;\r
+  #define glVertexStream2fATI GLeeFuncPtr_glVertexStream2fATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexStream2fvATI\r
+#define GLEE_H_DEFINED_glVertexStream2fvATI\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM2FVATIPROC) (GLenum stream, const GLfloat * coords);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXSTREAM2FVATIPROC GLeeFuncPtr_glVertexStream2fvATI;\r
+  #define glVertexStream2fvATI GLeeFuncPtr_glVertexStream2fvATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexStream2dATI\r
+#define GLEE_H_DEFINED_glVertexStream2dATI\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM2DATIPROC) (GLenum stream, GLdouble x, GLdouble y);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXSTREAM2DATIPROC GLeeFuncPtr_glVertexStream2dATI;\r
+  #define glVertexStream2dATI GLeeFuncPtr_glVertexStream2dATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexStream2dvATI\r
+#define GLEE_H_DEFINED_glVertexStream2dvATI\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM2DVATIPROC) (GLenum stream, const GLdouble * coords);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXSTREAM2DVATIPROC GLeeFuncPtr_glVertexStream2dvATI;\r
+  #define glVertexStream2dvATI GLeeFuncPtr_glVertexStream2dvATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexStream3sATI\r
+#define GLEE_H_DEFINED_glVertexStream3sATI\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXSTREAM3SATIPROC GLeeFuncPtr_glVertexStream3sATI;\r
+  #define glVertexStream3sATI GLeeFuncPtr_glVertexStream3sATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexStream3svATI\r
+#define GLEE_H_DEFINED_glVertexStream3svATI\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM3SVATIPROC) (GLenum stream, const GLshort * coords);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXSTREAM3SVATIPROC GLeeFuncPtr_glVertexStream3svATI;\r
+  #define glVertexStream3svATI GLeeFuncPtr_glVertexStream3svATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexStream3iATI\r
+#define GLEE_H_DEFINED_glVertexStream3iATI\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXSTREAM3IATIPROC GLeeFuncPtr_glVertexStream3iATI;\r
+  #define glVertexStream3iATI GLeeFuncPtr_glVertexStream3iATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexStream3ivATI\r
+#define GLEE_H_DEFINED_glVertexStream3ivATI\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM3IVATIPROC) (GLenum stream, const GLint * coords);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXSTREAM3IVATIPROC GLeeFuncPtr_glVertexStream3ivATI;\r
+  #define glVertexStream3ivATI GLeeFuncPtr_glVertexStream3ivATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexStream3fATI\r
+#define GLEE_H_DEFINED_glVertexStream3fATI\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXSTREAM3FATIPROC GLeeFuncPtr_glVertexStream3fATI;\r
+  #define glVertexStream3fATI GLeeFuncPtr_glVertexStream3fATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexStream3fvATI\r
+#define GLEE_H_DEFINED_glVertexStream3fvATI\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM3FVATIPROC) (GLenum stream, const GLfloat * coords);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXSTREAM3FVATIPROC GLeeFuncPtr_glVertexStream3fvATI;\r
+  #define glVertexStream3fvATI GLeeFuncPtr_glVertexStream3fvATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexStream3dATI\r
+#define GLEE_H_DEFINED_glVertexStream3dATI\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXSTREAM3DATIPROC GLeeFuncPtr_glVertexStream3dATI;\r
+  #define glVertexStream3dATI GLeeFuncPtr_glVertexStream3dATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexStream3dvATI\r
+#define GLEE_H_DEFINED_glVertexStream3dvATI\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM3DVATIPROC) (GLenum stream, const GLdouble * coords);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXSTREAM3DVATIPROC GLeeFuncPtr_glVertexStream3dvATI;\r
+  #define glVertexStream3dvATI GLeeFuncPtr_glVertexStream3dvATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexStream4sATI\r
+#define GLEE_H_DEFINED_glVertexStream4sATI\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM4SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXSTREAM4SATIPROC GLeeFuncPtr_glVertexStream4sATI;\r
+  #define glVertexStream4sATI GLeeFuncPtr_glVertexStream4sATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexStream4svATI\r
+#define GLEE_H_DEFINED_glVertexStream4svATI\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM4SVATIPROC) (GLenum stream, const GLshort * coords);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXSTREAM4SVATIPROC GLeeFuncPtr_glVertexStream4svATI;\r
+  #define glVertexStream4svATI GLeeFuncPtr_glVertexStream4svATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexStream4iATI\r
+#define GLEE_H_DEFINED_glVertexStream4iATI\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM4IATIPROC) (GLenum stream, GLint x, GLint y, GLint z, GLint w);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXSTREAM4IATIPROC GLeeFuncPtr_glVertexStream4iATI;\r
+  #define glVertexStream4iATI GLeeFuncPtr_glVertexStream4iATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexStream4ivATI\r
+#define GLEE_H_DEFINED_glVertexStream4ivATI\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM4IVATIPROC) (GLenum stream, const GLint * coords);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXSTREAM4IVATIPROC GLeeFuncPtr_glVertexStream4ivATI;\r
+  #define glVertexStream4ivATI GLeeFuncPtr_glVertexStream4ivATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexStream4fATI\r
+#define GLEE_H_DEFINED_glVertexStream4fATI\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM4FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXSTREAM4FATIPROC GLeeFuncPtr_glVertexStream4fATI;\r
+  #define glVertexStream4fATI GLeeFuncPtr_glVertexStream4fATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexStream4fvATI\r
+#define GLEE_H_DEFINED_glVertexStream4fvATI\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM4FVATIPROC) (GLenum stream, const GLfloat * coords);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXSTREAM4FVATIPROC GLeeFuncPtr_glVertexStream4fvATI;\r
+  #define glVertexStream4fvATI GLeeFuncPtr_glVertexStream4fvATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexStream4dATI\r
+#define GLEE_H_DEFINED_glVertexStream4dATI\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM4DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXSTREAM4DATIPROC GLeeFuncPtr_glVertexStream4dATI;\r
+  #define glVertexStream4dATI GLeeFuncPtr_glVertexStream4dATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexStream4dvATI\r
+#define GLEE_H_DEFINED_glVertexStream4dvATI\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXSTREAM4DVATIPROC) (GLenum stream, const GLdouble * coords);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXSTREAM4DVATIPROC GLeeFuncPtr_glVertexStream4dvATI;\r
+  #define glVertexStream4dvATI GLeeFuncPtr_glVertexStream4dvATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glNormalStream3bATI\r
+#define GLEE_H_DEFINED_glNormalStream3bATI\r
+  typedef void (APIENTRYP GLEEPFNGLNORMALSTREAM3BATIPROC) (GLenum stream, GLbyte nx, GLbyte ny, GLbyte nz);\r
+  GLEE_EXTERN GLEEPFNGLNORMALSTREAM3BATIPROC GLeeFuncPtr_glNormalStream3bATI;\r
+  #define glNormalStream3bATI GLeeFuncPtr_glNormalStream3bATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glNormalStream3bvATI\r
+#define GLEE_H_DEFINED_glNormalStream3bvATI\r
+  typedef void (APIENTRYP GLEEPFNGLNORMALSTREAM3BVATIPROC) (GLenum stream, const GLbyte * coords);\r
+  GLEE_EXTERN GLEEPFNGLNORMALSTREAM3BVATIPROC GLeeFuncPtr_glNormalStream3bvATI;\r
+  #define glNormalStream3bvATI GLeeFuncPtr_glNormalStream3bvATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glNormalStream3sATI\r
+#define GLEE_H_DEFINED_glNormalStream3sATI\r
+  typedef void (APIENTRYP GLEEPFNGLNORMALSTREAM3SATIPROC) (GLenum stream, GLshort nx, GLshort ny, GLshort nz);\r
+  GLEE_EXTERN GLEEPFNGLNORMALSTREAM3SATIPROC GLeeFuncPtr_glNormalStream3sATI;\r
+  #define glNormalStream3sATI GLeeFuncPtr_glNormalStream3sATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glNormalStream3svATI\r
+#define GLEE_H_DEFINED_glNormalStream3svATI\r
+  typedef void (APIENTRYP GLEEPFNGLNORMALSTREAM3SVATIPROC) (GLenum stream, const GLshort * coords);\r
+  GLEE_EXTERN GLEEPFNGLNORMALSTREAM3SVATIPROC GLeeFuncPtr_glNormalStream3svATI;\r
+  #define glNormalStream3svATI GLeeFuncPtr_glNormalStream3svATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glNormalStream3iATI\r
+#define GLEE_H_DEFINED_glNormalStream3iATI\r
+  typedef void (APIENTRYP GLEEPFNGLNORMALSTREAM3IATIPROC) (GLenum stream, GLint nx, GLint ny, GLint nz);\r
+  GLEE_EXTERN GLEEPFNGLNORMALSTREAM3IATIPROC GLeeFuncPtr_glNormalStream3iATI;\r
+  #define glNormalStream3iATI GLeeFuncPtr_glNormalStream3iATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glNormalStream3ivATI\r
+#define GLEE_H_DEFINED_glNormalStream3ivATI\r
+  typedef void (APIENTRYP GLEEPFNGLNORMALSTREAM3IVATIPROC) (GLenum stream, const GLint * coords);\r
+  GLEE_EXTERN GLEEPFNGLNORMALSTREAM3IVATIPROC GLeeFuncPtr_glNormalStream3ivATI;\r
+  #define glNormalStream3ivATI GLeeFuncPtr_glNormalStream3ivATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glNormalStream3fATI\r
+#define GLEE_H_DEFINED_glNormalStream3fATI\r
+  typedef void (APIENTRYP GLEEPFNGLNORMALSTREAM3FATIPROC) (GLenum stream, GLfloat nx, GLfloat ny, GLfloat nz);\r
+  GLEE_EXTERN GLEEPFNGLNORMALSTREAM3FATIPROC GLeeFuncPtr_glNormalStream3fATI;\r
+  #define glNormalStream3fATI GLeeFuncPtr_glNormalStream3fATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glNormalStream3fvATI\r
+#define GLEE_H_DEFINED_glNormalStream3fvATI\r
+  typedef void (APIENTRYP GLEEPFNGLNORMALSTREAM3FVATIPROC) (GLenum stream, const GLfloat * coords);\r
+  GLEE_EXTERN GLEEPFNGLNORMALSTREAM3FVATIPROC GLeeFuncPtr_glNormalStream3fvATI;\r
+  #define glNormalStream3fvATI GLeeFuncPtr_glNormalStream3fvATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glNormalStream3dATI\r
+#define GLEE_H_DEFINED_glNormalStream3dATI\r
+  typedef void (APIENTRYP GLEEPFNGLNORMALSTREAM3DATIPROC) (GLenum stream, GLdouble nx, GLdouble ny, GLdouble nz);\r
+  GLEE_EXTERN GLEEPFNGLNORMALSTREAM3DATIPROC GLeeFuncPtr_glNormalStream3dATI;\r
+  #define glNormalStream3dATI GLeeFuncPtr_glNormalStream3dATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glNormalStream3dvATI\r
+#define GLEE_H_DEFINED_glNormalStream3dvATI\r
+  typedef void (APIENTRYP GLEEPFNGLNORMALSTREAM3DVATIPROC) (GLenum stream, const GLdouble * coords);\r
+  GLEE_EXTERN GLEEPFNGLNORMALSTREAM3DVATIPROC GLeeFuncPtr_glNormalStream3dvATI;\r
+  #define glNormalStream3dvATI GLeeFuncPtr_glNormalStream3dvATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glClientActiveVertexStreamATI\r
+#define GLEE_H_DEFINED_glClientActiveVertexStreamATI\r
+  typedef void (APIENTRYP GLEEPFNGLCLIENTACTIVEVERTEXSTREAMATIPROC) (GLenum stream);\r
+  GLEE_EXTERN GLEEPFNGLCLIENTACTIVEVERTEXSTREAMATIPROC GLeeFuncPtr_glClientActiveVertexStreamATI;\r
+  #define glClientActiveVertexStreamATI GLeeFuncPtr_glClientActiveVertexStreamATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexBlendEnviATI\r
+#define GLEE_H_DEFINED_glVertexBlendEnviATI\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXBLENDENVIATIPROC) (GLenum pname, GLint param);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXBLENDENVIATIPROC GLeeFuncPtr_glVertexBlendEnviATI;\r
+  #define glVertexBlendEnviATI GLeeFuncPtr_glVertexBlendEnviATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexBlendEnvfATI\r
+#define GLEE_H_DEFINED_glVertexBlendEnvfATI\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXBLENDENVFATIPROC) (GLenum pname, GLfloat param);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXBLENDENVFATIPROC GLeeFuncPtr_glVertexBlendEnvfATI;\r
+  #define glVertexBlendEnvfATI GLeeFuncPtr_glVertexBlendEnvfATI\r
+#endif\r
+#endif \r
+\r
+/* GL_ATI_element_array */\r
+\r
+#ifndef GL_ATI_element_array\r
+#define GL_ATI_element_array 1\r
+#define __GLEE_GL_ATI_element_array 1\r
+/* Constants */\r
+#define GL_ELEMENT_ARRAY_ATI                               0x8768\r
+#define GL_ELEMENT_ARRAY_TYPE_ATI                          0x8769\r
+#define GL_ELEMENT_ARRAY_POINTER_ATI                       0x876A\r
+#ifndef GLEE_H_DEFINED_glElementPointerATI\r
+#define GLEE_H_DEFINED_glElementPointerATI\r
+  typedef void (APIENTRYP GLEEPFNGLELEMENTPOINTERATIPROC) (GLenum type, const GLvoid * pointer);\r
+  GLEE_EXTERN GLEEPFNGLELEMENTPOINTERATIPROC GLeeFuncPtr_glElementPointerATI;\r
+  #define glElementPointerATI GLeeFuncPtr_glElementPointerATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glDrawElementArrayATI\r
+#define GLEE_H_DEFINED_glDrawElementArrayATI\r
+  typedef void (APIENTRYP GLEEPFNGLDRAWELEMENTARRAYATIPROC) (GLenum mode, GLsizei count);\r
+  GLEE_EXTERN GLEEPFNGLDRAWELEMENTARRAYATIPROC GLeeFuncPtr_glDrawElementArrayATI;\r
+  #define glDrawElementArrayATI GLeeFuncPtr_glDrawElementArrayATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glDrawRangeElementArrayATI\r
+#define GLEE_H_DEFINED_glDrawRangeElementArrayATI\r
+  typedef void (APIENTRYP GLEEPFNGLDRAWRANGEELEMENTARRAYATIPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count);\r
+  GLEE_EXTERN GLEEPFNGLDRAWRANGEELEMENTARRAYATIPROC GLeeFuncPtr_glDrawRangeElementArrayATI;\r
+  #define glDrawRangeElementArrayATI GLeeFuncPtr_glDrawRangeElementArrayATI\r
+#endif\r
+#endif \r
+\r
+/* GL_SUN_mesh_array */\r
+\r
+#ifndef GL_SUN_mesh_array\r
+#define GL_SUN_mesh_array 1\r
+#define __GLEE_GL_SUN_mesh_array 1\r
+/* Constants */\r
+#define GL_QUAD_MESH_SUN                                   0x8614\r
+#define GL_TRIANGLE_MESH_SUN                               0x8615\r
+#ifndef GLEE_H_DEFINED_glDrawMeshArraysSUN\r
+#define GLEE_H_DEFINED_glDrawMeshArraysSUN\r
+  typedef void (APIENTRYP GLEEPFNGLDRAWMESHARRAYSSUNPROC) (GLenum mode, GLint first, GLsizei count, GLsizei width);\r
+  GLEE_EXTERN GLEEPFNGLDRAWMESHARRAYSSUNPROC GLeeFuncPtr_glDrawMeshArraysSUN;\r
+  #define glDrawMeshArraysSUN GLeeFuncPtr_glDrawMeshArraysSUN\r
+#endif\r
+#endif \r
+\r
+/* GL_SUN_slice_accum */\r
+\r
+#ifndef GL_SUN_slice_accum\r
+#define GL_SUN_slice_accum 1\r
+#define __GLEE_GL_SUN_slice_accum 1\r
+/* Constants */\r
+#define GL_SLICE_ACCUM_SUN                                 0x85CC\r
+#endif \r
+\r
+/* GL_NV_multisample_filter_hint */\r
+\r
+#ifndef GL_NV_multisample_filter_hint\r
+#define GL_NV_multisample_filter_hint 1\r
+#define __GLEE_GL_NV_multisample_filter_hint 1\r
+/* Constants */\r
+#define GL_MULTISAMPLE_FILTER_HINT_NV                      0x8534\r
+#endif \r
+\r
+/* GL_NV_depth_clamp */\r
+\r
+#ifndef GL_NV_depth_clamp\r
+#define GL_NV_depth_clamp 1\r
+#define __GLEE_GL_NV_depth_clamp 1\r
+/* Constants */\r
+#define GL_DEPTH_CLAMP_NV                                  0x864F\r
+#endif \r
+\r
+/* GL_NV_occlusion_query */\r
+\r
+#ifndef GL_NV_occlusion_query\r
+#define GL_NV_occlusion_query 1\r
+#define __GLEE_GL_NV_occlusion_query 1\r
+/* Constants */\r
+#define GL_PIXEL_COUNTER_BITS_NV                           0x8864\r
+#define GL_CURRENT_OCCLUSION_QUERY_ID_NV                   0x8865\r
+#define GL_PIXEL_COUNT_NV                                  0x8866\r
+#define GL_PIXEL_COUNT_AVAILABLE_NV                        0x8867\r
+#ifndef GLEE_H_DEFINED_glGenOcclusionQueriesNV\r
+#define GLEE_H_DEFINED_glGenOcclusionQueriesNV\r
+  typedef void (APIENTRYP GLEEPFNGLGENOCCLUSIONQUERIESNVPROC) (GLsizei n, GLuint * ids);\r
+  GLEE_EXTERN GLEEPFNGLGENOCCLUSIONQUERIESNVPROC GLeeFuncPtr_glGenOcclusionQueriesNV;\r
+  #define glGenOcclusionQueriesNV GLeeFuncPtr_glGenOcclusionQueriesNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glDeleteOcclusionQueriesNV\r
+#define GLEE_H_DEFINED_glDeleteOcclusionQueriesNV\r
+  typedef void (APIENTRYP GLEEPFNGLDELETEOCCLUSIONQUERIESNVPROC) (GLsizei n, const GLuint * ids);\r
+  GLEE_EXTERN GLEEPFNGLDELETEOCCLUSIONQUERIESNVPROC GLeeFuncPtr_glDeleteOcclusionQueriesNV;\r
+  #define glDeleteOcclusionQueriesNV GLeeFuncPtr_glDeleteOcclusionQueriesNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glIsOcclusionQueryNV\r
+#define GLEE_H_DEFINED_glIsOcclusionQueryNV\r
+  typedef GLboolean (APIENTRYP GLEEPFNGLISOCCLUSIONQUERYNVPROC) (GLuint id);\r
+  GLEE_EXTERN GLEEPFNGLISOCCLUSIONQUERYNVPROC GLeeFuncPtr_glIsOcclusionQueryNV;\r
+  #define glIsOcclusionQueryNV GLeeFuncPtr_glIsOcclusionQueryNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glBeginOcclusionQueryNV\r
+#define GLEE_H_DEFINED_glBeginOcclusionQueryNV\r
+  typedef void (APIENTRYP GLEEPFNGLBEGINOCCLUSIONQUERYNVPROC) (GLuint id);\r
+  GLEE_EXTERN GLEEPFNGLBEGINOCCLUSIONQUERYNVPROC GLeeFuncPtr_glBeginOcclusionQueryNV;\r
+  #define glBeginOcclusionQueryNV GLeeFuncPtr_glBeginOcclusionQueryNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glEndOcclusionQueryNV\r
+#define GLEE_H_DEFINED_glEndOcclusionQueryNV\r
+  typedef void (APIENTRYP GLEEPFNGLENDOCCLUSIONQUERYNVPROC) ();\r
+  GLEE_EXTERN GLEEPFNGLENDOCCLUSIONQUERYNVPROC GLeeFuncPtr_glEndOcclusionQueryNV;\r
+  #define glEndOcclusionQueryNV GLeeFuncPtr_glEndOcclusionQueryNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetOcclusionQueryivNV\r
+#define GLEE_H_DEFINED_glGetOcclusionQueryivNV\r
+  typedef void (APIENTRYP GLEEPFNGLGETOCCLUSIONQUERYIVNVPROC) (GLuint id, GLenum pname, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETOCCLUSIONQUERYIVNVPROC GLeeFuncPtr_glGetOcclusionQueryivNV;\r
+  #define glGetOcclusionQueryivNV GLeeFuncPtr_glGetOcclusionQueryivNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetOcclusionQueryuivNV\r
+#define GLEE_H_DEFINED_glGetOcclusionQueryuivNV\r
+  typedef void (APIENTRYP GLEEPFNGLGETOCCLUSIONQUERYUIVNVPROC) (GLuint id, GLenum pname, GLuint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETOCCLUSIONQUERYUIVNVPROC GLeeFuncPtr_glGetOcclusionQueryuivNV;\r
+  #define glGetOcclusionQueryuivNV GLeeFuncPtr_glGetOcclusionQueryuivNV\r
+#endif\r
+#endif \r
+\r
+/* GL_NV_point_sprite */\r
+\r
+#ifndef GL_NV_point_sprite\r
+#define GL_NV_point_sprite 1\r
+#define __GLEE_GL_NV_point_sprite 1\r
+/* Constants */\r
+#define GL_POINT_SPRITE_NV                                 0x8861\r
+#define GL_COORD_REPLACE_NV                                0x8862\r
+#define GL_POINT_SPRITE_R_MODE_NV                          0x8863\r
+#ifndef GLEE_H_DEFINED_glPointParameteriNV\r
+#define GLEE_H_DEFINED_glPointParameteriNV\r
+  typedef void (APIENTRYP GLEEPFNGLPOINTPARAMETERINVPROC) (GLenum pname, GLint param);\r
+  GLEE_EXTERN GLEEPFNGLPOINTPARAMETERINVPROC GLeeFuncPtr_glPointParameteriNV;\r
+  #define glPointParameteriNV GLeeFuncPtr_glPointParameteriNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glPointParameterivNV\r
+#define GLEE_H_DEFINED_glPointParameterivNV\r
+  typedef void (APIENTRYP GLEEPFNGLPOINTPARAMETERIVNVPROC) (GLenum pname, const GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLPOINTPARAMETERIVNVPROC GLeeFuncPtr_glPointParameterivNV;\r
+  #define glPointParameterivNV GLeeFuncPtr_glPointParameterivNV\r
+#endif\r
+#endif \r
+\r
+/* GL_NV_texture_shader3 */\r
+\r
+#ifndef GL_NV_texture_shader3\r
+#define GL_NV_texture_shader3 1\r
+#define __GLEE_GL_NV_texture_shader3 1\r
+/* Constants */\r
+#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV                 0x8850\r
+#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV           0x8851\r
+#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV          0x8852\r
+#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV    0x8853\r
+#define GL_OFFSET_HILO_TEXTURE_2D_NV                       0x8854\r
+#define GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV                0x8855\r
+#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV            0x8856\r
+#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV     0x8857\r
+#define GL_DEPENDENT_HILO_TEXTURE_2D_NV                    0x8858\r
+#define GL_DEPENDENT_RGB_TEXTURE_3D_NV                     0x8859\r
+#define GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV               0x885A\r
+#define GL_DOT_PRODUCT_PASS_THROUGH_NV                     0x885B\r
+#define GL_DOT_PRODUCT_TEXTURE_1D_NV                       0x885C\r
+#define GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV             0x885D\r
+#define GL_HILO8_NV                                        0x885E\r
+#define GL_SIGNED_HILO8_NV                                 0x885F\r
+#define GL_FORCE_BLUE_TO_ONE_NV                            0x8860\r
+#endif \r
+\r
+/* GL_NV_vertex_program1_1 */\r
+\r
+#ifndef GL_NV_vertex_program1_1\r
+#define GL_NV_vertex_program1_1 1\r
+#define __GLEE_GL_NV_vertex_program1_1 1\r
+/* Constants */\r
+#endif \r
+\r
+/* GL_EXT_shadow_funcs */\r
+\r
+#ifndef GL_EXT_shadow_funcs\r
+#define GL_EXT_shadow_funcs 1\r
+#define __GLEE_GL_EXT_shadow_funcs 1\r
+/* Constants */\r
+#endif \r
+\r
+/* GL_EXT_stencil_two_side */\r
+\r
+#ifndef GL_EXT_stencil_two_side\r
+#define GL_EXT_stencil_two_side 1\r
+#define __GLEE_GL_EXT_stencil_two_side 1\r
+/* Constants */\r
+#define GL_STENCIL_TEST_TWO_SIDE_EXT                       0x8910\r
+#define GL_ACTIVE_STENCIL_FACE_EXT                         0x8911\r
+#ifndef GLEE_H_DEFINED_glActiveStencilFaceEXT\r
+#define GLEE_H_DEFINED_glActiveStencilFaceEXT\r
+  typedef void (APIENTRYP GLEEPFNGLACTIVESTENCILFACEEXTPROC) (GLenum face);\r
+  GLEE_EXTERN GLEEPFNGLACTIVESTENCILFACEEXTPROC GLeeFuncPtr_glActiveStencilFaceEXT;\r
+  #define glActiveStencilFaceEXT GLeeFuncPtr_glActiveStencilFaceEXT\r
+#endif\r
+#endif \r
+\r
+/* GL_ATI_text_fragment_shader */\r
+\r
+#ifndef GL_ATI_text_fragment_shader\r
+#define GL_ATI_text_fragment_shader 1\r
+#define __GLEE_GL_ATI_text_fragment_shader 1\r
+/* Constants */\r
+#define GL_TEXT_FRAGMENT_SHADER_ATI                        0x8200\r
+#endif \r
+\r
+/* GL_APPLE_client_storage */\r
+\r
+#ifndef GL_APPLE_client_storage\r
+#define GL_APPLE_client_storage 1\r
+#define __GLEE_GL_APPLE_client_storage 1\r
+/* Constants */\r
+#define GL_UNPACK_CLIENT_STORAGE_APPLE                     0x85B2\r
+#endif \r
+\r
+/* GL_APPLE_element_array */\r
+\r
+#ifndef GL_APPLE_element_array\r
+#define GL_APPLE_element_array 1\r
+#define __GLEE_GL_APPLE_element_array 1\r
+/* Constants */\r
+#define GL_ELEMENT_ARRAY_APPLE                             0x8768\r
+#define GL_ELEMENT_ARRAY_TYPE_APPLE                        0x8769\r
+#define GL_ELEMENT_ARRAY_POINTER_APPLE                     0x876A\r
+#ifndef GLEE_H_DEFINED_glElementPointerAPPLE\r
+#define GLEE_H_DEFINED_glElementPointerAPPLE\r
+  typedef void (APIENTRYP GLEEPFNGLELEMENTPOINTERAPPLEPROC) (GLenum type, const GLvoid * pointer);\r
+  GLEE_EXTERN GLEEPFNGLELEMENTPOINTERAPPLEPROC GLeeFuncPtr_glElementPointerAPPLE;\r
+  #define glElementPointerAPPLE GLeeFuncPtr_glElementPointerAPPLE\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glDrawElementArrayAPPLE\r
+#define GLEE_H_DEFINED_glDrawElementArrayAPPLE\r
+  typedef void (APIENTRYP GLEEPFNGLDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, GLint first, GLsizei count);\r
+  GLEE_EXTERN GLEEPFNGLDRAWELEMENTARRAYAPPLEPROC GLeeFuncPtr_glDrawElementArrayAPPLE;\r
+  #define glDrawElementArrayAPPLE GLeeFuncPtr_glDrawElementArrayAPPLE\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glDrawRangeElementArrayAPPLE\r
+#define GLEE_H_DEFINED_glDrawRangeElementArrayAPPLE\r
+  typedef void (APIENTRYP GLEEPFNGLDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count);\r
+  GLEE_EXTERN GLEEPFNGLDRAWRANGEELEMENTARRAYAPPLEPROC GLeeFuncPtr_glDrawRangeElementArrayAPPLE;\r
+  #define glDrawRangeElementArrayAPPLE GLeeFuncPtr_glDrawRangeElementArrayAPPLE\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiDrawElementArrayAPPLE\r
+#define GLEE_H_DEFINED_glMultiDrawElementArrayAPPLE\r
+  typedef void (APIENTRYP GLEEPFNGLMULTIDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, const GLint * first, const GLsizei * count, GLsizei primcount);\r
+  GLEE_EXTERN GLEEPFNGLMULTIDRAWELEMENTARRAYAPPLEPROC GLeeFuncPtr_glMultiDrawElementArrayAPPLE;\r
+  #define glMultiDrawElementArrayAPPLE GLeeFuncPtr_glMultiDrawElementArrayAPPLE\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiDrawRangeElementArrayAPPLE\r
+#define GLEE_H_DEFINED_glMultiDrawRangeElementArrayAPPLE\r
+  typedef void (APIENTRYP GLEEPFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, const GLint * first, const GLsizei * count, GLsizei primcount);\r
+  GLEE_EXTERN GLEEPFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC GLeeFuncPtr_glMultiDrawRangeElementArrayAPPLE;\r
+  #define glMultiDrawRangeElementArrayAPPLE GLeeFuncPtr_glMultiDrawRangeElementArrayAPPLE\r
+#endif\r
+#endif \r
+\r
+/* GL_APPLE_fence */\r
+\r
+#ifndef GL_APPLE_fence\r
+#define GL_APPLE_fence 1\r
+#define __GLEE_GL_APPLE_fence 1\r
+/* Constants */\r
+#define GL_DRAW_PIXELS_APPLE                               0x8A0A\r
+#define GL_FENCE_APPLE                                     0x8A0B\r
+#ifndef GLEE_H_DEFINED_glGenFencesAPPLE\r
+#define GLEE_H_DEFINED_glGenFencesAPPLE\r
+  typedef void (APIENTRYP GLEEPFNGLGENFENCESAPPLEPROC) (GLsizei n, GLuint * fences);\r
+  GLEE_EXTERN GLEEPFNGLGENFENCESAPPLEPROC GLeeFuncPtr_glGenFencesAPPLE;\r
+  #define glGenFencesAPPLE GLeeFuncPtr_glGenFencesAPPLE\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glDeleteFencesAPPLE\r
+#define GLEE_H_DEFINED_glDeleteFencesAPPLE\r
+  typedef void (APIENTRYP GLEEPFNGLDELETEFENCESAPPLEPROC) (GLsizei n, const GLuint * fences);\r
+  GLEE_EXTERN GLEEPFNGLDELETEFENCESAPPLEPROC GLeeFuncPtr_glDeleteFencesAPPLE;\r
+  #define glDeleteFencesAPPLE GLeeFuncPtr_glDeleteFencesAPPLE\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glSetFenceAPPLE\r
+#define GLEE_H_DEFINED_glSetFenceAPPLE\r
+  typedef void (APIENTRYP GLEEPFNGLSETFENCEAPPLEPROC) (GLuint fence);\r
+  GLEE_EXTERN GLEEPFNGLSETFENCEAPPLEPROC GLeeFuncPtr_glSetFenceAPPLE;\r
+  #define glSetFenceAPPLE GLeeFuncPtr_glSetFenceAPPLE\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glIsFenceAPPLE\r
+#define GLEE_H_DEFINED_glIsFenceAPPLE\r
+  typedef GLboolean (APIENTRYP GLEEPFNGLISFENCEAPPLEPROC) (GLuint fence);\r
+  GLEE_EXTERN GLEEPFNGLISFENCEAPPLEPROC GLeeFuncPtr_glIsFenceAPPLE;\r
+  #define glIsFenceAPPLE GLeeFuncPtr_glIsFenceAPPLE\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTestFenceAPPLE\r
+#define GLEE_H_DEFINED_glTestFenceAPPLE\r
+  typedef GLboolean (APIENTRYP GLEEPFNGLTESTFENCEAPPLEPROC) (GLuint fence);\r
+  GLEE_EXTERN GLEEPFNGLTESTFENCEAPPLEPROC GLeeFuncPtr_glTestFenceAPPLE;\r
+  #define glTestFenceAPPLE GLeeFuncPtr_glTestFenceAPPLE\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFinishFenceAPPLE\r
+#define GLEE_H_DEFINED_glFinishFenceAPPLE\r
+  typedef void (APIENTRYP GLEEPFNGLFINISHFENCEAPPLEPROC) (GLuint fence);\r
+  GLEE_EXTERN GLEEPFNGLFINISHFENCEAPPLEPROC GLeeFuncPtr_glFinishFenceAPPLE;\r
+  #define glFinishFenceAPPLE GLeeFuncPtr_glFinishFenceAPPLE\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTestObjectAPPLE\r
+#define GLEE_H_DEFINED_glTestObjectAPPLE\r
+  typedef GLboolean (APIENTRYP GLEEPFNGLTESTOBJECTAPPLEPROC) (GLenum object, GLuint name);\r
+  GLEE_EXTERN GLEEPFNGLTESTOBJECTAPPLEPROC GLeeFuncPtr_glTestObjectAPPLE;\r
+  #define glTestObjectAPPLE GLeeFuncPtr_glTestObjectAPPLE\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFinishObjectAPPLE\r
+#define GLEE_H_DEFINED_glFinishObjectAPPLE\r
+  typedef void (APIENTRYP GLEEPFNGLFINISHOBJECTAPPLEPROC) (GLenum object, GLint name);\r
+  GLEE_EXTERN GLEEPFNGLFINISHOBJECTAPPLEPROC GLeeFuncPtr_glFinishObjectAPPLE;\r
+  #define glFinishObjectAPPLE GLeeFuncPtr_glFinishObjectAPPLE\r
+#endif\r
+#endif \r
+\r
+/* GL_APPLE_vertex_array_object */\r
+\r
+#ifndef GL_APPLE_vertex_array_object\r
+#define GL_APPLE_vertex_array_object 1\r
+#define __GLEE_GL_APPLE_vertex_array_object 1\r
+/* Constants */\r
+#define GL_VERTEX_ARRAY_BINDING_APPLE                      0x85B5\r
+#ifndef GLEE_H_DEFINED_glBindVertexArrayAPPLE\r
+#define GLEE_H_DEFINED_glBindVertexArrayAPPLE\r
+  typedef void (APIENTRYP GLEEPFNGLBINDVERTEXARRAYAPPLEPROC) (GLuint array);\r
+  GLEE_EXTERN GLEEPFNGLBINDVERTEXARRAYAPPLEPROC GLeeFuncPtr_glBindVertexArrayAPPLE;\r
+  #define glBindVertexArrayAPPLE GLeeFuncPtr_glBindVertexArrayAPPLE\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glDeleteVertexArraysAPPLE\r
+#define GLEE_H_DEFINED_glDeleteVertexArraysAPPLE\r
+  typedef void (APIENTRYP GLEEPFNGLDELETEVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint * arrays);\r
+  GLEE_EXTERN GLEEPFNGLDELETEVERTEXARRAYSAPPLEPROC GLeeFuncPtr_glDeleteVertexArraysAPPLE;\r
+  #define glDeleteVertexArraysAPPLE GLeeFuncPtr_glDeleteVertexArraysAPPLE\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGenVertexArraysAPPLE\r
+#define GLEE_H_DEFINED_glGenVertexArraysAPPLE\r
+  typedef void (APIENTRYP GLEEPFNGLGENVERTEXARRAYSAPPLEPROC) (GLsizei n, GLuint * arrays);\r
+  GLEE_EXTERN GLEEPFNGLGENVERTEXARRAYSAPPLEPROC GLeeFuncPtr_glGenVertexArraysAPPLE;\r
+  #define glGenVertexArraysAPPLE GLeeFuncPtr_glGenVertexArraysAPPLE\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glIsVertexArrayAPPLE\r
+#define GLEE_H_DEFINED_glIsVertexArrayAPPLE\r
+  typedef GLboolean (APIENTRYP GLEEPFNGLISVERTEXARRAYAPPLEPROC) (GLuint array);\r
+  GLEE_EXTERN GLEEPFNGLISVERTEXARRAYAPPLEPROC GLeeFuncPtr_glIsVertexArrayAPPLE;\r
+  #define glIsVertexArrayAPPLE GLeeFuncPtr_glIsVertexArrayAPPLE\r
+#endif\r
+#endif \r
+\r
+/* GL_APPLE_vertex_array_range */\r
+\r
+#ifndef GL_APPLE_vertex_array_range\r
+#define GL_APPLE_vertex_array_range 1\r
+#define __GLEE_GL_APPLE_vertex_array_range 1\r
+/* Constants */\r
+#define GL_VERTEX_ARRAY_RANGE_APPLE                        0x851D\r
+#define GL_VERTEX_ARRAY_RANGE_LENGTH_APPLE                 0x851E\r
+#define GL_VERTEX_ARRAY_STORAGE_HINT_APPLE                 0x851F\r
+#define GL_VERTEX_ARRAY_RANGE_POINTER_APPLE                0x8521\r
+#define GL_STORAGE_CACHED_APPLE                            0x85BE\r
+#define GL_STORAGE_SHARED_APPLE                            0x85BF\r
+#ifndef GLEE_H_DEFINED_glVertexArrayRangeAPPLE\r
+#define GLEE_H_DEFINED_glVertexArrayRangeAPPLE\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, GLvoid * pointer);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXARRAYRANGEAPPLEPROC GLeeFuncPtr_glVertexArrayRangeAPPLE;\r
+  #define glVertexArrayRangeAPPLE GLeeFuncPtr_glVertexArrayRangeAPPLE\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFlushVertexArrayRangeAPPLE\r
+#define GLEE_H_DEFINED_glFlushVertexArrayRangeAPPLE\r
+  typedef void (APIENTRYP GLEEPFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, GLvoid * pointer);\r
+  GLEE_EXTERN GLEEPFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC GLeeFuncPtr_glFlushVertexArrayRangeAPPLE;\r
+  #define glFlushVertexArrayRangeAPPLE GLeeFuncPtr_glFlushVertexArrayRangeAPPLE\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexArrayParameteriAPPLE\r
+#define GLEE_H_DEFINED_glVertexArrayParameteriAPPLE\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXARRAYPARAMETERIAPPLEPROC) (GLenum pname, GLint param);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXARRAYPARAMETERIAPPLEPROC GLeeFuncPtr_glVertexArrayParameteriAPPLE;\r
+  #define glVertexArrayParameteriAPPLE GLeeFuncPtr_glVertexArrayParameteriAPPLE\r
+#endif\r
+#endif \r
+\r
+/* GL_APPLE_ycbcr_422 */\r
+\r
+#ifndef GL_APPLE_ycbcr_422\r
+#define GL_APPLE_ycbcr_422 1\r
+#define __GLEE_GL_APPLE_ycbcr_422 1\r
+/* Constants */\r
+#define GL_YCBCR_422_APPLE                                 0x85B9\r
+#define GL_UNSIGNED_SHORT_8_8_APPLE                        0x85BA\r
+#define GL_UNSIGNED_SHORT_8_8_REV_APPLE                    0x85BB\r
+#endif \r
+\r
+/* GL_S3_s3tc */\r
+\r
+#ifndef GL_S3_s3tc\r
+#define GL_S3_s3tc 1\r
+#define __GLEE_GL_S3_s3tc 1\r
+/* Constants */\r
+#define GL_RGB_S3TC                                        0x83A0\r
+#define GL_RGB4_S3TC                                       0x83A1\r
+#define GL_RGBA_S3TC                                       0x83A2\r
+#define GL_RGBA4_S3TC                                      0x83A3\r
+#endif \r
+\r
+/* GL_ATI_draw_buffers */\r
+\r
+#ifndef GL_ATI_draw_buffers\r
+#define GL_ATI_draw_buffers 1\r
+#define __GLEE_GL_ATI_draw_buffers 1\r
+/* Constants */\r
+#define GL_MAX_DRAW_BUFFERS_ATI                            0x8824\r
+#define GL_DRAW_BUFFER0_ATI                                0x8825\r
+#define GL_DRAW_BUFFER1_ATI                                0x8826\r
+#define GL_DRAW_BUFFER2_ATI                                0x8827\r
+#define GL_DRAW_BUFFER3_ATI                                0x8828\r
+#define GL_DRAW_BUFFER4_ATI                                0x8829\r
+#define GL_DRAW_BUFFER5_ATI                                0x882A\r
+#define GL_DRAW_BUFFER6_ATI                                0x882B\r
+#define GL_DRAW_BUFFER7_ATI                                0x882C\r
+#define GL_DRAW_BUFFER8_ATI                                0x882D\r
+#define GL_DRAW_BUFFER9_ATI                                0x882E\r
+#define GL_DRAW_BUFFER10_ATI                               0x882F\r
+#define GL_DRAW_BUFFER11_ATI                               0x8830\r
+#define GL_DRAW_BUFFER12_ATI                               0x8831\r
+#define GL_DRAW_BUFFER13_ATI                               0x8832\r
+#define GL_DRAW_BUFFER14_ATI                               0x8833\r
+#define GL_DRAW_BUFFER15_ATI                               0x8834\r
+#ifndef GLEE_H_DEFINED_glDrawBuffersATI\r
+#define GLEE_H_DEFINED_glDrawBuffersATI\r
+  typedef void (APIENTRYP GLEEPFNGLDRAWBUFFERSATIPROC) (GLsizei n, const GLenum * bufs);\r
+  GLEE_EXTERN GLEEPFNGLDRAWBUFFERSATIPROC GLeeFuncPtr_glDrawBuffersATI;\r
+  #define glDrawBuffersATI GLeeFuncPtr_glDrawBuffersATI\r
+#endif\r
+#endif \r
+\r
+/* GL_ATI_pixel_format_float */\r
+\r
+#ifndef GL_ATI_pixel_format_float\r
+#define GL_ATI_pixel_format_float 1\r
+#define __GLEE_GL_ATI_pixel_format_float 1\r
+/* Constants */\r
+#define GL_TYPE_RGBA_FLOAT_ATI                             0x8820\r
+#define GL_COLOR_CLEAR_UNCLAMPED_VALUE_ATI                 0x8835\r
+#endif \r
+\r
+/* GL_ATI_texture_env_combine3 */\r
+\r
+#ifndef GL_ATI_texture_env_combine3\r
+#define GL_ATI_texture_env_combine3 1\r
+#define __GLEE_GL_ATI_texture_env_combine3 1\r
+/* Constants */\r
+#define GL_MODULATE_ADD_ATI                                0x8744\r
+#define GL_MODULATE_SIGNED_ADD_ATI                         0x8745\r
+#define GL_MODULATE_SUBTRACT_ATI                           0x8746\r
+#endif \r
+\r
+/* GL_ATI_texture_float */\r
+\r
+#ifndef GL_ATI_texture_float\r
+#define GL_ATI_texture_float 1\r
+#define __GLEE_GL_ATI_texture_float 1\r
+/* Constants */\r
+#define GL_RGBA_FLOAT32_ATI                                0x8814\r
+#define GL_RGB_FLOAT32_ATI                                 0x8815\r
+#define GL_ALPHA_FLOAT32_ATI                               0x8816\r
+#define GL_INTENSITY_FLOAT32_ATI                           0x8817\r
+#define GL_LUMINANCE_FLOAT32_ATI                           0x8818\r
+#define GL_LUMINANCE_ALPHA_FLOAT32_ATI                     0x8819\r
+#define GL_RGBA_FLOAT16_ATI                                0x881A\r
+#define GL_RGB_FLOAT16_ATI                                 0x881B\r
+#define GL_ALPHA_FLOAT16_ATI                               0x881C\r
+#define GL_INTENSITY_FLOAT16_ATI                           0x881D\r
+#define GL_LUMINANCE_FLOAT16_ATI                           0x881E\r
+#define GL_LUMINANCE_ALPHA_FLOAT16_ATI                     0x881F\r
+#endif \r
+\r
+/* GL_NV_float_buffer */\r
+\r
+#ifndef GL_NV_float_buffer\r
+#define GL_NV_float_buffer 1\r
+#define __GLEE_GL_NV_float_buffer 1\r
+/* Constants */\r
+#define GL_FLOAT_R_NV                                      0x8880\r
+#define GL_FLOAT_RG_NV                                     0x8881\r
+#define GL_FLOAT_RGB_NV                                    0x8882\r
+#define GL_FLOAT_RGBA_NV                                   0x8883\r
+#define GL_FLOAT_R16_NV                                    0x8884\r
+#define GL_FLOAT_R32_NV                                    0x8885\r
+#define GL_FLOAT_RG16_NV                                   0x8886\r
+#define GL_FLOAT_RG32_NV                                   0x8887\r
+#define GL_FLOAT_RGB16_NV                                  0x8888\r
+#define GL_FLOAT_RGB32_NV                                  0x8889\r
+#define GL_FLOAT_RGBA16_NV                                 0x888A\r
+#define GL_FLOAT_RGBA32_NV                                 0x888B\r
+#define GL_TEXTURE_FLOAT_COMPONENTS_NV                     0x888C\r
+#define GL_FLOAT_CLEAR_COLOR_VALUE_NV                      0x888D\r
+#define GL_FLOAT_RGBA_MODE_NV                              0x888E\r
+#endif \r
+\r
+/* GL_NV_fragment_program */\r
+\r
+#ifndef GL_NV_fragment_program\r
+#define GL_NV_fragment_program 1\r
+#define __GLEE_GL_NV_fragment_program 1\r
+/* Constants */\r
+#define GL_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV        0x8868\r
+#define GL_FRAGMENT_PROGRAM_NV                             0x8870\r
+#define GL_MAX_TEXTURE_COORDS_NV                           0x8871\r
+#define GL_MAX_TEXTURE_IMAGE_UNITS_NV                      0x8872\r
+#define GL_FRAGMENT_PROGRAM_BINDING_NV                     0x8873\r
+#define GL_PROGRAM_ERROR_STRING_NV                         0x8874\r
+#ifndef GLEE_H_DEFINED_glProgramNamedParameter4fNV\r
+#define GLEE_H_DEFINED_glProgramNamedParameter4fNV\r
+  typedef void (APIENTRYP GLEEPFNGLPROGRAMNAMEDPARAMETER4FNVPROC) (GLuint id, GLsizei len, const GLubyte * name, GLfloat x, GLfloat y, GLfloat z, GLfloat w);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMNAMEDPARAMETER4FNVPROC GLeeFuncPtr_glProgramNamedParameter4fNV;\r
+  #define glProgramNamedParameter4fNV GLeeFuncPtr_glProgramNamedParameter4fNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramNamedParameter4dNV\r
+#define GLEE_H_DEFINED_glProgramNamedParameter4dNV\r
+  typedef void (APIENTRYP GLEEPFNGLPROGRAMNAMEDPARAMETER4DNVPROC) (GLuint id, GLsizei len, const GLubyte * name, GLdouble x, GLdouble y, GLdouble z, GLdouble w);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMNAMEDPARAMETER4DNVPROC GLeeFuncPtr_glProgramNamedParameter4dNV;\r
+  #define glProgramNamedParameter4dNV GLeeFuncPtr_glProgramNamedParameter4dNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramNamedParameter4fvNV\r
+#define GLEE_H_DEFINED_glProgramNamedParameter4fvNV\r
+  typedef void (APIENTRYP GLEEPFNGLPROGRAMNAMEDPARAMETER4FVNVPROC) (GLuint id, GLsizei len, const GLubyte * name, const GLfloat * v);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMNAMEDPARAMETER4FVNVPROC GLeeFuncPtr_glProgramNamedParameter4fvNV;\r
+  #define glProgramNamedParameter4fvNV GLeeFuncPtr_glProgramNamedParameter4fvNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramNamedParameter4dvNV\r
+#define GLEE_H_DEFINED_glProgramNamedParameter4dvNV\r
+  typedef void (APIENTRYP GLEEPFNGLPROGRAMNAMEDPARAMETER4DVNVPROC) (GLuint id, GLsizei len, const GLubyte * name, const GLdouble * v);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMNAMEDPARAMETER4DVNVPROC GLeeFuncPtr_glProgramNamedParameter4dvNV;\r
+  #define glProgramNamedParameter4dvNV GLeeFuncPtr_glProgramNamedParameter4dvNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetProgramNamedParameterfvNV\r
+#define GLEE_H_DEFINED_glGetProgramNamedParameterfvNV\r
+  typedef void (APIENTRYP GLEEPFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC) (GLuint id, GLsizei len, const GLubyte * name, GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC GLeeFuncPtr_glGetProgramNamedParameterfvNV;\r
+  #define glGetProgramNamedParameterfvNV GLeeFuncPtr_glGetProgramNamedParameterfvNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetProgramNamedParameterdvNV\r
+#define GLEE_H_DEFINED_glGetProgramNamedParameterdvNV\r
+  typedef void (APIENTRYP GLEEPFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC) (GLuint id, GLsizei len, const GLubyte * name, GLdouble * params);\r
+  GLEE_EXTERN GLEEPFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC GLeeFuncPtr_glGetProgramNamedParameterdvNV;\r
+  #define glGetProgramNamedParameterdvNV GLeeFuncPtr_glGetProgramNamedParameterdvNV\r
+#endif\r
+#endif \r
+\r
+/* GL_NV_half_float */\r
+\r
+#ifndef GL_NV_half_float\r
+#define GL_NV_half_float 1\r
+#define __GLEE_GL_NV_half_float 1\r
+/* Constants */\r
+#define GL_HALF_FLOAT_NV                                   0x140B\r
+#ifndef GLEE_H_DEFINED_glVertex2hNV\r
+#define GLEE_H_DEFINED_glVertex2hNV\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEX2HNVPROC) (GLhalfNV x, GLhalfNV y);\r
+  GLEE_EXTERN GLEEPFNGLVERTEX2HNVPROC GLeeFuncPtr_glVertex2hNV;\r
+  #define glVertex2hNV GLeeFuncPtr_glVertex2hNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertex2hvNV\r
+#define GLEE_H_DEFINED_glVertex2hvNV\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEX2HVNVPROC) (const GLhalfNV * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEX2HVNVPROC GLeeFuncPtr_glVertex2hvNV;\r
+  #define glVertex2hvNV GLeeFuncPtr_glVertex2hvNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertex3hNV\r
+#define GLEE_H_DEFINED_glVertex3hNV\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEX3HNVPROC) (GLhalfNV x, GLhalfNV y, GLhalfNV z);\r
+  GLEE_EXTERN GLEEPFNGLVERTEX3HNVPROC GLeeFuncPtr_glVertex3hNV;\r
+  #define glVertex3hNV GLeeFuncPtr_glVertex3hNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertex3hvNV\r
+#define GLEE_H_DEFINED_glVertex3hvNV\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEX3HVNVPROC) (const GLhalfNV * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEX3HVNVPROC GLeeFuncPtr_glVertex3hvNV;\r
+  #define glVertex3hvNV GLeeFuncPtr_glVertex3hvNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertex4hNV\r
+#define GLEE_H_DEFINED_glVertex4hNV\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEX4HNVPROC) (GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w);\r
+  GLEE_EXTERN GLEEPFNGLVERTEX4HNVPROC GLeeFuncPtr_glVertex4hNV;\r
+  #define glVertex4hNV GLeeFuncPtr_glVertex4hNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertex4hvNV\r
+#define GLEE_H_DEFINED_glVertex4hvNV\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEX4HVNVPROC) (const GLhalfNV * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEX4HVNVPROC GLeeFuncPtr_glVertex4hvNV;\r
+  #define glVertex4hvNV GLeeFuncPtr_glVertex4hvNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glNormal3hNV\r
+#define GLEE_H_DEFINED_glNormal3hNV\r
+  typedef void (APIENTRYP GLEEPFNGLNORMAL3HNVPROC) (GLhalfNV nx, GLhalfNV ny, GLhalfNV nz);\r
+  GLEE_EXTERN GLEEPFNGLNORMAL3HNVPROC GLeeFuncPtr_glNormal3hNV;\r
+  #define glNormal3hNV GLeeFuncPtr_glNormal3hNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glNormal3hvNV\r
+#define GLEE_H_DEFINED_glNormal3hvNV\r
+  typedef void (APIENTRYP GLEEPFNGLNORMAL3HVNVPROC) (const GLhalfNV * v);\r
+  GLEE_EXTERN GLEEPFNGLNORMAL3HVNVPROC GLeeFuncPtr_glNormal3hvNV;\r
+  #define glNormal3hvNV GLeeFuncPtr_glNormal3hvNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glColor3hNV\r
+#define GLEE_H_DEFINED_glColor3hNV\r
+  typedef void (APIENTRYP GLEEPFNGLCOLOR3HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue);\r
+  GLEE_EXTERN GLEEPFNGLCOLOR3HNVPROC GLeeFuncPtr_glColor3hNV;\r
+  #define glColor3hNV GLeeFuncPtr_glColor3hNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glColor3hvNV\r
+#define GLEE_H_DEFINED_glColor3hvNV\r
+  typedef void (APIENTRYP GLEEPFNGLCOLOR3HVNVPROC) (const GLhalfNV * v);\r
+  GLEE_EXTERN GLEEPFNGLCOLOR3HVNVPROC GLeeFuncPtr_glColor3hvNV;\r
+  #define glColor3hvNV GLeeFuncPtr_glColor3hvNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glColor4hNV\r
+#define GLEE_H_DEFINED_glColor4hNV\r
+  typedef void (APIENTRYP GLEEPFNGLCOLOR4HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue, GLhalfNV alpha);\r
+  GLEE_EXTERN GLEEPFNGLCOLOR4HNVPROC GLeeFuncPtr_glColor4hNV;\r
+  #define glColor4hNV GLeeFuncPtr_glColor4hNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glColor4hvNV\r
+#define GLEE_H_DEFINED_glColor4hvNV\r
+  typedef void (APIENTRYP GLEEPFNGLCOLOR4HVNVPROC) (const GLhalfNV * v);\r
+  GLEE_EXTERN GLEEPFNGLCOLOR4HVNVPROC GLeeFuncPtr_glColor4hvNV;\r
+  #define glColor4hvNV GLeeFuncPtr_glColor4hvNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTexCoord1hNV\r
+#define GLEE_H_DEFINED_glTexCoord1hNV\r
+  typedef void (APIENTRYP GLEEPFNGLTEXCOORD1HNVPROC) (GLhalfNV s);\r
+  GLEE_EXTERN GLEEPFNGLTEXCOORD1HNVPROC GLeeFuncPtr_glTexCoord1hNV;\r
+  #define glTexCoord1hNV GLeeFuncPtr_glTexCoord1hNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTexCoord1hvNV\r
+#define GLEE_H_DEFINED_glTexCoord1hvNV\r
+  typedef void (APIENTRYP GLEEPFNGLTEXCOORD1HVNVPROC) (const GLhalfNV * v);\r
+  GLEE_EXTERN GLEEPFNGLTEXCOORD1HVNVPROC GLeeFuncPtr_glTexCoord1hvNV;\r
+  #define glTexCoord1hvNV GLeeFuncPtr_glTexCoord1hvNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTexCoord2hNV\r
+#define GLEE_H_DEFINED_glTexCoord2hNV\r
+  typedef void (APIENTRYP GLEEPFNGLTEXCOORD2HNVPROC) (GLhalfNV s, GLhalfNV t);\r
+  GLEE_EXTERN GLEEPFNGLTEXCOORD2HNVPROC GLeeFuncPtr_glTexCoord2hNV;\r
+  #define glTexCoord2hNV GLeeFuncPtr_glTexCoord2hNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTexCoord2hvNV\r
+#define GLEE_H_DEFINED_glTexCoord2hvNV\r
+  typedef void (APIENTRYP GLEEPFNGLTEXCOORD2HVNVPROC) (const GLhalfNV * v);\r
+  GLEE_EXTERN GLEEPFNGLTEXCOORD2HVNVPROC GLeeFuncPtr_glTexCoord2hvNV;\r
+  #define glTexCoord2hvNV GLeeFuncPtr_glTexCoord2hvNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTexCoord3hNV\r
+#define GLEE_H_DEFINED_glTexCoord3hNV\r
+  typedef void (APIENTRYP GLEEPFNGLTEXCOORD3HNVPROC) (GLhalfNV s, GLhalfNV t, GLhalfNV r);\r
+  GLEE_EXTERN GLEEPFNGLTEXCOORD3HNVPROC GLeeFuncPtr_glTexCoord3hNV;\r
+  #define glTexCoord3hNV GLeeFuncPtr_glTexCoord3hNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTexCoord3hvNV\r
+#define GLEE_H_DEFINED_glTexCoord3hvNV\r
+  typedef void (APIENTRYP GLEEPFNGLTEXCOORD3HVNVPROC) (const GLhalfNV * v);\r
+  GLEE_EXTERN GLEEPFNGLTEXCOORD3HVNVPROC GLeeFuncPtr_glTexCoord3hvNV;\r
+  #define glTexCoord3hvNV GLeeFuncPtr_glTexCoord3hvNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTexCoord4hNV\r
+#define GLEE_H_DEFINED_glTexCoord4hNV\r
+  typedef void (APIENTRYP GLEEPFNGLTEXCOORD4HNVPROC) (GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q);\r
+  GLEE_EXTERN GLEEPFNGLTEXCOORD4HNVPROC GLeeFuncPtr_glTexCoord4hNV;\r
+  #define glTexCoord4hNV GLeeFuncPtr_glTexCoord4hNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTexCoord4hvNV\r
+#define GLEE_H_DEFINED_glTexCoord4hvNV\r
+  typedef void (APIENTRYP GLEEPFNGLTEXCOORD4HVNVPROC) (const GLhalfNV * v);\r
+  GLEE_EXTERN GLEEPFNGLTEXCOORD4HVNVPROC GLeeFuncPtr_glTexCoord4hvNV;\r
+  #define glTexCoord4hvNV GLeeFuncPtr_glTexCoord4hvNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord1hNV\r
+#define GLEE_H_DEFINED_glMultiTexCoord1hNV\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD1HNVPROC) (GLenum target, GLhalfNV s);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD1HNVPROC GLeeFuncPtr_glMultiTexCoord1hNV;\r
+  #define glMultiTexCoord1hNV GLeeFuncPtr_glMultiTexCoord1hNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord1hvNV\r
+#define GLEE_H_DEFINED_glMultiTexCoord1hvNV\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD1HVNVPROC) (GLenum target, const GLhalfNV * v);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD1HVNVPROC GLeeFuncPtr_glMultiTexCoord1hvNV;\r
+  #define glMultiTexCoord1hvNV GLeeFuncPtr_glMultiTexCoord1hvNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord2hNV\r
+#define GLEE_H_DEFINED_glMultiTexCoord2hNV\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD2HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD2HNVPROC GLeeFuncPtr_glMultiTexCoord2hNV;\r
+  #define glMultiTexCoord2hNV GLeeFuncPtr_glMultiTexCoord2hNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord2hvNV\r
+#define GLEE_H_DEFINED_glMultiTexCoord2hvNV\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD2HVNVPROC) (GLenum target, const GLhalfNV * v);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD2HVNVPROC GLeeFuncPtr_glMultiTexCoord2hvNV;\r
+  #define glMultiTexCoord2hvNV GLeeFuncPtr_glMultiTexCoord2hvNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord3hNV\r
+#define GLEE_H_DEFINED_glMultiTexCoord3hNV\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD3HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD3HNVPROC GLeeFuncPtr_glMultiTexCoord3hNV;\r
+  #define glMultiTexCoord3hNV GLeeFuncPtr_glMultiTexCoord3hNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord3hvNV\r
+#define GLEE_H_DEFINED_glMultiTexCoord3hvNV\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD3HVNVPROC) (GLenum target, const GLhalfNV * v);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD3HVNVPROC GLeeFuncPtr_glMultiTexCoord3hvNV;\r
+  #define glMultiTexCoord3hvNV GLeeFuncPtr_glMultiTexCoord3hvNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord4hNV\r
+#define GLEE_H_DEFINED_glMultiTexCoord4hNV\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD4HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD4HNVPROC GLeeFuncPtr_glMultiTexCoord4hNV;\r
+  #define glMultiTexCoord4hNV GLeeFuncPtr_glMultiTexCoord4hNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoord4hvNV\r
+#define GLEE_H_DEFINED_glMultiTexCoord4hvNV\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORD4HVNVPROC) (GLenum target, const GLhalfNV * v);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORD4HVNVPROC GLeeFuncPtr_glMultiTexCoord4hvNV;\r
+  #define glMultiTexCoord4hvNV GLeeFuncPtr_glMultiTexCoord4hvNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFogCoordhNV\r
+#define GLEE_H_DEFINED_glFogCoordhNV\r
+  typedef void (APIENTRYP GLEEPFNGLFOGCOORDHNVPROC) (GLhalfNV fog);\r
+  GLEE_EXTERN GLEEPFNGLFOGCOORDHNVPROC GLeeFuncPtr_glFogCoordhNV;\r
+  #define glFogCoordhNV GLeeFuncPtr_glFogCoordhNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFogCoordhvNV\r
+#define GLEE_H_DEFINED_glFogCoordhvNV\r
+  typedef void (APIENTRYP GLEEPFNGLFOGCOORDHVNVPROC) (const GLhalfNV * fog);\r
+  GLEE_EXTERN GLEEPFNGLFOGCOORDHVNVPROC GLeeFuncPtr_glFogCoordhvNV;\r
+  #define glFogCoordhvNV GLeeFuncPtr_glFogCoordhvNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glSecondaryColor3hNV\r
+#define GLEE_H_DEFINED_glSecondaryColor3hNV\r
+  typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue);\r
+  GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3HNVPROC GLeeFuncPtr_glSecondaryColor3hNV;\r
+  #define glSecondaryColor3hNV GLeeFuncPtr_glSecondaryColor3hNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glSecondaryColor3hvNV\r
+#define GLEE_H_DEFINED_glSecondaryColor3hvNV\r
+  typedef void (APIENTRYP GLEEPFNGLSECONDARYCOLOR3HVNVPROC) (const GLhalfNV * v);\r
+  GLEE_EXTERN GLEEPFNGLSECONDARYCOLOR3HVNVPROC GLeeFuncPtr_glSecondaryColor3hvNV;\r
+  #define glSecondaryColor3hvNV GLeeFuncPtr_glSecondaryColor3hvNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexWeighthNV\r
+#define GLEE_H_DEFINED_glVertexWeighthNV\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXWEIGHTHNVPROC) (GLhalfNV weight);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXWEIGHTHNVPROC GLeeFuncPtr_glVertexWeighthNV;\r
+  #define glVertexWeighthNV GLeeFuncPtr_glVertexWeighthNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexWeighthvNV\r
+#define GLEE_H_DEFINED_glVertexWeighthvNV\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXWEIGHTHVNVPROC) (const GLhalfNV * weight);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXWEIGHTHVNVPROC GLeeFuncPtr_glVertexWeighthvNV;\r
+  #define glVertexWeighthvNV GLeeFuncPtr_glVertexWeighthvNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib1hNV\r
+#define GLEE_H_DEFINED_glVertexAttrib1hNV\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB1HNVPROC) (GLuint index, GLhalfNV x);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB1HNVPROC GLeeFuncPtr_glVertexAttrib1hNV;\r
+  #define glVertexAttrib1hNV GLeeFuncPtr_glVertexAttrib1hNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib1hvNV\r
+#define GLEE_H_DEFINED_glVertexAttrib1hvNV\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB1HVNVPROC) (GLuint index, const GLhalfNV * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB1HVNVPROC GLeeFuncPtr_glVertexAttrib1hvNV;\r
+  #define glVertexAttrib1hvNV GLeeFuncPtr_glVertexAttrib1hvNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib2hNV\r
+#define GLEE_H_DEFINED_glVertexAttrib2hNV\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB2HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB2HNVPROC GLeeFuncPtr_glVertexAttrib2hNV;\r
+  #define glVertexAttrib2hNV GLeeFuncPtr_glVertexAttrib2hNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib2hvNV\r
+#define GLEE_H_DEFINED_glVertexAttrib2hvNV\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB2HVNVPROC) (GLuint index, const GLhalfNV * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB2HVNVPROC GLeeFuncPtr_glVertexAttrib2hvNV;\r
+  #define glVertexAttrib2hvNV GLeeFuncPtr_glVertexAttrib2hvNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib3hNV\r
+#define GLEE_H_DEFINED_glVertexAttrib3hNV\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB3HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB3HNVPROC GLeeFuncPtr_glVertexAttrib3hNV;\r
+  #define glVertexAttrib3hNV GLeeFuncPtr_glVertexAttrib3hNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib3hvNV\r
+#define GLEE_H_DEFINED_glVertexAttrib3hvNV\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB3HVNVPROC) (GLuint index, const GLhalfNV * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB3HVNVPROC GLeeFuncPtr_glVertexAttrib3hvNV;\r
+  #define glVertexAttrib3hvNV GLeeFuncPtr_glVertexAttrib3hvNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib4hNV\r
+#define GLEE_H_DEFINED_glVertexAttrib4hNV\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4HNVPROC GLeeFuncPtr_glVertexAttrib4hNV;\r
+  #define glVertexAttrib4hNV GLeeFuncPtr_glVertexAttrib4hNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttrib4hvNV\r
+#define GLEE_H_DEFINED_glVertexAttrib4hvNV\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIB4HVNVPROC) (GLuint index, const GLhalfNV * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIB4HVNVPROC GLeeFuncPtr_glVertexAttrib4hvNV;\r
+  #define glVertexAttrib4hvNV GLeeFuncPtr_glVertexAttrib4hvNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttribs1hvNV\r
+#define GLEE_H_DEFINED_glVertexAttribs1hvNV\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBS1HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIBS1HVNVPROC GLeeFuncPtr_glVertexAttribs1hvNV;\r
+  #define glVertexAttribs1hvNV GLeeFuncPtr_glVertexAttribs1hvNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttribs2hvNV\r
+#define GLEE_H_DEFINED_glVertexAttribs2hvNV\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBS2HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIBS2HVNVPROC GLeeFuncPtr_glVertexAttribs2hvNV;\r
+  #define glVertexAttribs2hvNV GLeeFuncPtr_glVertexAttribs2hvNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttribs3hvNV\r
+#define GLEE_H_DEFINED_glVertexAttribs3hvNV\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBS3HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIBS3HVNVPROC GLeeFuncPtr_glVertexAttribs3hvNV;\r
+  #define glVertexAttribs3hvNV GLeeFuncPtr_glVertexAttribs3hvNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttribs4hvNV\r
+#define GLEE_H_DEFINED_glVertexAttribs4hvNV\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBS4HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIBS4HVNVPROC GLeeFuncPtr_glVertexAttribs4hvNV;\r
+  #define glVertexAttribs4hvNV GLeeFuncPtr_glVertexAttribs4hvNV\r
+#endif\r
+#endif \r
+\r
+/* GL_NV_pixel_data_range */\r
+\r
+#ifndef GL_NV_pixel_data_range\r
+#define GL_NV_pixel_data_range 1\r
+#define __GLEE_GL_NV_pixel_data_range 1\r
+/* Constants */\r
+#define GL_WRITE_PIXEL_DATA_RANGE_NV                       0x8878\r
+#define GL_READ_PIXEL_DATA_RANGE_NV                        0x8879\r
+#define GL_WRITE_PIXEL_DATA_RANGE_LENGTH_NV                0x887A\r
+#define GL_READ_PIXEL_DATA_RANGE_LENGTH_NV                 0x887B\r
+#define GL_WRITE_PIXEL_DATA_RANGE_POINTER_NV               0x887C\r
+#define GL_READ_PIXEL_DATA_RANGE_POINTER_NV                0x887D\r
+#ifndef GLEE_H_DEFINED_glPixelDataRangeNV\r
+#define GLEE_H_DEFINED_glPixelDataRangeNV\r
+  typedef void (APIENTRYP GLEEPFNGLPIXELDATARANGENVPROC) (GLenum target, GLsizei length, GLvoid * pointer);\r
+  GLEE_EXTERN GLEEPFNGLPIXELDATARANGENVPROC GLeeFuncPtr_glPixelDataRangeNV;\r
+  #define glPixelDataRangeNV GLeeFuncPtr_glPixelDataRangeNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFlushPixelDataRangeNV\r
+#define GLEE_H_DEFINED_glFlushPixelDataRangeNV\r
+  typedef void (APIENTRYP GLEEPFNGLFLUSHPIXELDATARANGENVPROC) (GLenum target);\r
+  GLEE_EXTERN GLEEPFNGLFLUSHPIXELDATARANGENVPROC GLeeFuncPtr_glFlushPixelDataRangeNV;\r
+  #define glFlushPixelDataRangeNV GLeeFuncPtr_glFlushPixelDataRangeNV\r
+#endif\r
+#endif \r
+\r
+/* GL_NV_primitive_restart */\r
+\r
+#ifndef GL_NV_primitive_restart\r
+#define GL_NV_primitive_restart 1\r
+#define __GLEE_GL_NV_primitive_restart 1\r
+/* Constants */\r
+#define GL_PRIMITIVE_RESTART_NV                            0x8558\r
+#define GL_PRIMITIVE_RESTART_INDEX_NV                      0x8559\r
+#ifndef GLEE_H_DEFINED_glPrimitiveRestartNV\r
+#define GLEE_H_DEFINED_glPrimitiveRestartNV\r
+  typedef void (APIENTRYP GLEEPFNGLPRIMITIVERESTARTNVPROC) ();\r
+  GLEE_EXTERN GLEEPFNGLPRIMITIVERESTARTNVPROC GLeeFuncPtr_glPrimitiveRestartNV;\r
+  #define glPrimitiveRestartNV GLeeFuncPtr_glPrimitiveRestartNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glPrimitiveRestartIndexNV\r
+#define GLEE_H_DEFINED_glPrimitiveRestartIndexNV\r
+  typedef void (APIENTRYP GLEEPFNGLPRIMITIVERESTARTINDEXNVPROC) (GLuint index);\r
+  GLEE_EXTERN GLEEPFNGLPRIMITIVERESTARTINDEXNVPROC GLeeFuncPtr_glPrimitiveRestartIndexNV;\r
+  #define glPrimitiveRestartIndexNV GLeeFuncPtr_glPrimitiveRestartIndexNV\r
+#endif\r
+#endif \r
+\r
+/* GL_NV_texture_expand_normal */\r
+\r
+#ifndef GL_NV_texture_expand_normal\r
+#define GL_NV_texture_expand_normal 1\r
+#define __GLEE_GL_NV_texture_expand_normal 1\r
+/* Constants */\r
+#define GL_TEXTURE_UNSIGNED_REMAP_MODE_NV                  0x888F\r
+#endif \r
+\r
+/* GL_NV_vertex_program2 */\r
+\r
+#ifndef GL_NV_vertex_program2\r
+#define GL_NV_vertex_program2 1\r
+#define __GLEE_GL_NV_vertex_program2 1\r
+/* Constants */\r
+#endif \r
+\r
+/* GL_ATI_map_object_buffer */\r
+\r
+#ifndef GL_ATI_map_object_buffer\r
+#define GL_ATI_map_object_buffer 1\r
+#define __GLEE_GL_ATI_map_object_buffer 1\r
+/* Constants */\r
+#ifndef GLEE_H_DEFINED_glMapObjectBufferATI\r
+#define GLEE_H_DEFINED_glMapObjectBufferATI\r
+  typedef GLvoid* (APIENTRYP GLEEPFNGLMAPOBJECTBUFFERATIPROC) (GLuint buffer);\r
+  GLEE_EXTERN GLEEPFNGLMAPOBJECTBUFFERATIPROC GLeeFuncPtr_glMapObjectBufferATI;\r
+  #define glMapObjectBufferATI GLeeFuncPtr_glMapObjectBufferATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUnmapObjectBufferATI\r
+#define GLEE_H_DEFINED_glUnmapObjectBufferATI\r
+  typedef void (APIENTRYP GLEEPFNGLUNMAPOBJECTBUFFERATIPROC) (GLuint buffer);\r
+  GLEE_EXTERN GLEEPFNGLUNMAPOBJECTBUFFERATIPROC GLeeFuncPtr_glUnmapObjectBufferATI;\r
+  #define glUnmapObjectBufferATI GLeeFuncPtr_glUnmapObjectBufferATI\r
+#endif\r
+#endif \r
+\r
+/* GL_ATI_separate_stencil */\r
+\r
+#ifndef GL_ATI_separate_stencil\r
+#define GL_ATI_separate_stencil 1\r
+#define __GLEE_GL_ATI_separate_stencil 1\r
+/* Constants */\r
+#define GL_STENCIL_BACK_FUNC_ATI                           0x8800\r
+#define GL_STENCIL_BACK_FAIL_ATI                           0x8801\r
+#define GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI                0x8802\r
+#define GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI                0x8803\r
+#ifndef GLEE_H_DEFINED_glStencilOpSeparateATI\r
+#define GLEE_H_DEFINED_glStencilOpSeparateATI\r
+  typedef void (APIENTRYP GLEEPFNGLSTENCILOPSEPARATEATIPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);\r
+  GLEE_EXTERN GLEEPFNGLSTENCILOPSEPARATEATIPROC GLeeFuncPtr_glStencilOpSeparateATI;\r
+  #define glStencilOpSeparateATI GLeeFuncPtr_glStencilOpSeparateATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glStencilFuncSeparateATI\r
+#define GLEE_H_DEFINED_glStencilFuncSeparateATI\r
+  typedef void (APIENTRYP GLEEPFNGLSTENCILFUNCSEPARATEATIPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask);\r
+  GLEE_EXTERN GLEEPFNGLSTENCILFUNCSEPARATEATIPROC GLeeFuncPtr_glStencilFuncSeparateATI;\r
+  #define glStencilFuncSeparateATI GLeeFuncPtr_glStencilFuncSeparateATI\r
+#endif\r
+#endif \r
+\r
+/* GL_ATI_vertex_attrib_array_object */\r
+\r
+#ifndef GL_ATI_vertex_attrib_array_object\r
+#define GL_ATI_vertex_attrib_array_object 1\r
+#define __GLEE_GL_ATI_vertex_attrib_array_object 1\r
+/* Constants */\r
+#ifndef GLEE_H_DEFINED_glVertexAttribArrayObjectATI\r
+#define GLEE_H_DEFINED_glVertexAttribArrayObjectATI\r
+  typedef void (APIENTRYP GLEEPFNGLVERTEXATTRIBARRAYOBJECTATIPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIBARRAYOBJECTATIPROC GLeeFuncPtr_glVertexAttribArrayObjectATI;\r
+  #define glVertexAttribArrayObjectATI GLeeFuncPtr_glVertexAttribArrayObjectATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetVertexAttribArrayObjectfvATI\r
+#define GLEE_H_DEFINED_glGetVertexAttribArrayObjectfvATI\r
+  typedef void (APIENTRYP GLEEPFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC) (GLuint index, GLenum pname, GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC GLeeFuncPtr_glGetVertexAttribArrayObjectfvATI;\r
+  #define glGetVertexAttribArrayObjectfvATI GLeeFuncPtr_glGetVertexAttribArrayObjectfvATI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetVertexAttribArrayObjectivATI\r
+#define GLEE_H_DEFINED_glGetVertexAttribArrayObjectivATI\r
+  typedef void (APIENTRYP GLEEPFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC) (GLuint index, GLenum pname, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC GLeeFuncPtr_glGetVertexAttribArrayObjectivATI;\r
+  #define glGetVertexAttribArrayObjectivATI GLeeFuncPtr_glGetVertexAttribArrayObjectivATI\r
+#endif\r
+#endif \r
+\r
+/* GL_OES_read_format */\r
+\r
+#ifndef GL_OES_read_format\r
+#define GL_OES_read_format 1\r
+#define __GLEE_GL_OES_read_format 1\r
+/* Constants */\r
+#define GL_IMPLEMENTATION_COLOR_READ_TYPE_OES              0x8B9A\r
+#define GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES            0x8B9B\r
+#endif \r
+\r
+/* GL_EXT_depth_bounds_test */\r
+\r
+#ifndef GL_EXT_depth_bounds_test\r
+#define GL_EXT_depth_bounds_test 1\r
+#define __GLEE_GL_EXT_depth_bounds_test 1\r
+/* Constants */\r
+#define GL_DEPTH_BOUNDS_TEST_EXT                           0x8890\r
+#define GL_DEPTH_BOUNDS_EXT                                0x8891\r
+#ifndef GLEE_H_DEFINED_glDepthBoundsEXT\r
+#define GLEE_H_DEFINED_glDepthBoundsEXT\r
+  typedef void (APIENTRYP GLEEPFNGLDEPTHBOUNDSEXTPROC) (GLclampd zmin, GLclampd zmax);\r
+  GLEE_EXTERN GLEEPFNGLDEPTHBOUNDSEXTPROC GLeeFuncPtr_glDepthBoundsEXT;\r
+  #define glDepthBoundsEXT GLeeFuncPtr_glDepthBoundsEXT\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_texture_mirror_clamp */\r
+\r
+#ifndef GL_EXT_texture_mirror_clamp\r
+#define GL_EXT_texture_mirror_clamp 1\r
+#define __GLEE_GL_EXT_texture_mirror_clamp 1\r
+/* Constants */\r
+#define GL_MIRROR_CLAMP_EXT                                0x8742\r
+#define GL_MIRROR_CLAMP_TO_EDGE_EXT                        0x8743\r
+#define GL_MIRROR_CLAMP_TO_BORDER_EXT                      0x8912\r
+#endif \r
+\r
+/* GL_EXT_blend_equation_separate */\r
+\r
+#ifndef GL_EXT_blend_equation_separate\r
+#define GL_EXT_blend_equation_separate 1\r
+#define __GLEE_GL_EXT_blend_equation_separate 1\r
+/* Constants */\r
+#define GL_BLEND_EQUATION_RGB_EXT                          GL_BLEND_EQUATION\r
+#define GL_BLEND_EQUATION_ALPHA_EXT                        0x883D\r
+#ifndef GLEE_H_DEFINED_glBlendEquationSeparateEXT\r
+#define GLEE_H_DEFINED_glBlendEquationSeparateEXT\r
+  typedef void (APIENTRYP GLEEPFNGLBLENDEQUATIONSEPARATEEXTPROC) (GLenum modeRGB, GLenum modeAlpha);\r
+  GLEE_EXTERN GLEEPFNGLBLENDEQUATIONSEPARATEEXTPROC GLeeFuncPtr_glBlendEquationSeparateEXT;\r
+  #define glBlendEquationSeparateEXT GLeeFuncPtr_glBlendEquationSeparateEXT\r
+#endif\r
+#endif \r
+\r
+/* GL_MESA_pack_invert */\r
+\r
+#ifndef GL_MESA_pack_invert\r
+#define GL_MESA_pack_invert 1\r
+#define __GLEE_GL_MESA_pack_invert 1\r
+/* Constants */\r
+#define GL_PACK_INVERT_MESA                                0x8758\r
+#endif \r
+\r
+/* GL_MESA_ycbcr_texture */\r
+\r
+#ifndef GL_MESA_ycbcr_texture\r
+#define GL_MESA_ycbcr_texture 1\r
+#define __GLEE_GL_MESA_ycbcr_texture 1\r
+/* Constants */\r
+#define GL_UNSIGNED_SHORT_8_8_MESA                         0x85BA\r
+#define GL_UNSIGNED_SHORT_8_8_REV_MESA                     0x85BB\r
+#define GL_YCBCR_MESA                                      0x8757\r
+#endif \r
+\r
+/* GL_EXT_pixel_buffer_object */\r
+\r
+#ifndef GL_EXT_pixel_buffer_object\r
+#define GL_EXT_pixel_buffer_object 1\r
+#define __GLEE_GL_EXT_pixel_buffer_object 1\r
+/* Constants */\r
+#define GL_PIXEL_PACK_BUFFER_EXT                           0x88EB\r
+#define GL_PIXEL_UNPACK_BUFFER_EXT                         0x88EC\r
+#define GL_PIXEL_PACK_BUFFER_BINDING_EXT                   0x88ED\r
+#define GL_PIXEL_UNPACK_BUFFER_BINDING_EXT                 0x88EF\r
+#endif \r
+\r
+/* GL_NV_fragment_program_option */\r
+\r
+#ifndef GL_NV_fragment_program_option\r
+#define GL_NV_fragment_program_option 1\r
+#define __GLEE_GL_NV_fragment_program_option 1\r
+/* Constants */\r
+#endif \r
+\r
+/* GL_NV_fragment_program2 */\r
+\r
+#ifndef GL_NV_fragment_program2\r
+#define GL_NV_fragment_program2 1\r
+#define __GLEE_GL_NV_fragment_program2 1\r
+/* Constants */\r
+#define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV                0x88F4\r
+#define GL_MAX_PROGRAM_CALL_DEPTH_NV                       0x88F5\r
+#define GL_MAX_PROGRAM_IF_DEPTH_NV                         0x88F6\r
+#define GL_MAX_PROGRAM_LOOP_DEPTH_NV                       0x88F7\r
+#define GL_MAX_PROGRAM_LOOP_COUNT_NV                       0x88F8\r
+#endif \r
+\r
+/* GL_NV_vertex_program2_option */\r
+\r
+#ifndef GL_NV_vertex_program2_option\r
+#define GL_NV_vertex_program2_option 1\r
+#define __GLEE_GL_NV_vertex_program2_option 1\r
+/* Constants */\r
+#endif \r
+\r
+/* GL_NV_vertex_program3 */\r
+\r
+#ifndef GL_NV_vertex_program3\r
+#define GL_NV_vertex_program3 1\r
+#define __GLEE_GL_NV_vertex_program3 1\r
+/* Constants */\r
+#endif \r
+\r
+/* GL_EXT_framebuffer_object */\r
+\r
+#ifndef GL_EXT_framebuffer_object\r
+#define GL_EXT_framebuffer_object 1\r
+#define __GLEE_GL_EXT_framebuffer_object 1\r
+/* Constants */\r
+#define GL_INVALID_FRAMEBUFFER_OPERATION_EXT               0x0506\r
+#define GL_MAX_RENDERBUFFER_SIZE_EXT                       0x84E8\r
+#define GL_FRAMEBUFFER_BINDING_EXT                         0x8CA6\r
+#define GL_RENDERBUFFER_BINDING_EXT                        0x8CA7\r
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT          0x8CD0\r
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT          0x8CD1\r
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT        0x8CD2\r
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT 0x8CD3\r
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT   0x8CD4\r
+#define GL_FRAMEBUFFER_COMPLETE_EXT                        0x8CD5\r
+#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT           0x8CD6\r
+#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT   0x8CD7\r
+#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT           0x8CD9\r
+#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT              0x8CDA\r
+#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT          0x8CDB\r
+#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT          0x8CDC\r
+#define GL_FRAMEBUFFER_UNSUPPORTED_EXT                     0x8CDD\r
+#define GL_MAX_COLOR_ATTACHMENTS_EXT                       0x8CDF\r
+#define GL_COLOR_ATTACHMENT0_EXT                           0x8CE0\r
+#define GL_COLOR_ATTACHMENT1_EXT                           0x8CE1\r
+#define GL_COLOR_ATTACHMENT2_EXT                           0x8CE2\r
+#define GL_COLOR_ATTACHMENT3_EXT                           0x8CE3\r
+#define GL_COLOR_ATTACHMENT4_EXT                           0x8CE4\r
+#define GL_COLOR_ATTACHMENT5_EXT                           0x8CE5\r
+#define GL_COLOR_ATTACHMENT6_EXT                           0x8CE6\r
+#define GL_COLOR_ATTACHMENT7_EXT                           0x8CE7\r
+#define GL_COLOR_ATTACHMENT8_EXT                           0x8CE8\r
+#define GL_COLOR_ATTACHMENT9_EXT                           0x8CE9\r
+#define GL_COLOR_ATTACHMENT10_EXT                          0x8CEA\r
+#define GL_COLOR_ATTACHMENT11_EXT                          0x8CEB\r
+#define GL_COLOR_ATTACHMENT12_EXT                          0x8CEC\r
+#define GL_COLOR_ATTACHMENT13_EXT                          0x8CED\r
+#define GL_COLOR_ATTACHMENT14_EXT                          0x8CEE\r
+#define GL_COLOR_ATTACHMENT15_EXT                          0x8CEF\r
+#define GL_DEPTH_ATTACHMENT_EXT                            0x8D00\r
+#define GL_STENCIL_ATTACHMENT_EXT                          0x8D20\r
+#define GL_FRAMEBUFFER_EXT                                 0x8D40\r
+#define GL_RENDERBUFFER_EXT                                0x8D41\r
+#define GL_RENDERBUFFER_WIDTH_EXT                          0x8D42\r
+#define GL_RENDERBUFFER_HEIGHT_EXT                         0x8D43\r
+#define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT                0x8D44\r
+#define GL_STENCIL_INDEX1_EXT                              0x8D46\r
+#define GL_STENCIL_INDEX4_EXT                              0x8D47\r
+#define GL_STENCIL_INDEX8_EXT                              0x8D48\r
+#define GL_STENCIL_INDEX16_EXT                             0x8D49\r
+#define GL_RENDERBUFFER_RED_SIZE_EXT                       0x8D50\r
+#define GL_RENDERBUFFER_GREEN_SIZE_EXT                     0x8D51\r
+#define GL_RENDERBUFFER_BLUE_SIZE_EXT                      0x8D52\r
+#define GL_RENDERBUFFER_ALPHA_SIZE_EXT                     0x8D53\r
+#define GL_RENDERBUFFER_DEPTH_SIZE_EXT                     0x8D54\r
+#define GL_RENDERBUFFER_STENCIL_SIZE_EXT                   0x8D55\r
+#ifndef GLEE_H_DEFINED_glIsRenderbufferEXT\r
+#define GLEE_H_DEFINED_glIsRenderbufferEXT\r
+  typedef GLboolean (APIENTRYP GLEEPFNGLISRENDERBUFFEREXTPROC) (GLuint renderbuffer);\r
+  GLEE_EXTERN GLEEPFNGLISRENDERBUFFEREXTPROC GLeeFuncPtr_glIsRenderbufferEXT;\r
+  #define glIsRenderbufferEXT GLeeFuncPtr_glIsRenderbufferEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glBindRenderbufferEXT\r
+#define GLEE_H_DEFINED_glBindRenderbufferEXT\r
+  typedef void (APIENTRYP GLEEPFNGLBINDRENDERBUFFEREXTPROC) (GLenum target, GLuint renderbuffer);\r
+  GLEE_EXTERN GLEEPFNGLBINDRENDERBUFFEREXTPROC GLeeFuncPtr_glBindRenderbufferEXT;\r
+  #define glBindRenderbufferEXT GLeeFuncPtr_glBindRenderbufferEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glDeleteRenderbuffersEXT\r
+#define GLEE_H_DEFINED_glDeleteRenderbuffersEXT\r
+  typedef void (APIENTRYP GLEEPFNGLDELETERENDERBUFFERSEXTPROC) (GLsizei n, const GLuint * renderbuffers);\r
+  GLEE_EXTERN GLEEPFNGLDELETERENDERBUFFERSEXTPROC GLeeFuncPtr_glDeleteRenderbuffersEXT;\r
+  #define glDeleteRenderbuffersEXT GLeeFuncPtr_glDeleteRenderbuffersEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGenRenderbuffersEXT\r
+#define GLEE_H_DEFINED_glGenRenderbuffersEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGENRENDERBUFFERSEXTPROC) (GLsizei n, GLuint * renderbuffers);\r
+  GLEE_EXTERN GLEEPFNGLGENRENDERBUFFERSEXTPROC GLeeFuncPtr_glGenRenderbuffersEXT;\r
+  #define glGenRenderbuffersEXT GLeeFuncPtr_glGenRenderbuffersEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glRenderbufferStorageEXT\r
+#define GLEE_H_DEFINED_glRenderbufferStorageEXT\r
+  typedef void (APIENTRYP GLEEPFNGLRENDERBUFFERSTORAGEEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height);\r
+  GLEE_EXTERN GLEEPFNGLRENDERBUFFERSTORAGEEXTPROC GLeeFuncPtr_glRenderbufferStorageEXT;\r
+  #define glRenderbufferStorageEXT GLeeFuncPtr_glRenderbufferStorageEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetRenderbufferParameterivEXT\r
+#define GLEE_H_DEFINED_glGetRenderbufferParameterivEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETRENDERBUFFERPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETRENDERBUFFERPARAMETERIVEXTPROC GLeeFuncPtr_glGetRenderbufferParameterivEXT;\r
+  #define glGetRenderbufferParameterivEXT GLeeFuncPtr_glGetRenderbufferParameterivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glIsFramebufferEXT\r
+#define GLEE_H_DEFINED_glIsFramebufferEXT\r
+  typedef GLboolean (APIENTRYP GLEEPFNGLISFRAMEBUFFEREXTPROC) (GLuint framebuffer);\r
+  GLEE_EXTERN GLEEPFNGLISFRAMEBUFFEREXTPROC GLeeFuncPtr_glIsFramebufferEXT;\r
+  #define glIsFramebufferEXT GLeeFuncPtr_glIsFramebufferEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glBindFramebufferEXT\r
+#define GLEE_H_DEFINED_glBindFramebufferEXT\r
+  typedef void (APIENTRYP GLEEPFNGLBINDFRAMEBUFFEREXTPROC) (GLenum target, GLuint framebuffer);\r
+  GLEE_EXTERN GLEEPFNGLBINDFRAMEBUFFEREXTPROC GLeeFuncPtr_glBindFramebufferEXT;\r
+  #define glBindFramebufferEXT GLeeFuncPtr_glBindFramebufferEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glDeleteFramebuffersEXT\r
+#define GLEE_H_DEFINED_glDeleteFramebuffersEXT\r
+  typedef void (APIENTRYP GLEEPFNGLDELETEFRAMEBUFFERSEXTPROC) (GLsizei n, const GLuint * framebuffers);\r
+  GLEE_EXTERN GLEEPFNGLDELETEFRAMEBUFFERSEXTPROC GLeeFuncPtr_glDeleteFramebuffersEXT;\r
+  #define glDeleteFramebuffersEXT GLeeFuncPtr_glDeleteFramebuffersEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGenFramebuffersEXT\r
+#define GLEE_H_DEFINED_glGenFramebuffersEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGENFRAMEBUFFERSEXTPROC) (GLsizei n, GLuint * framebuffers);\r
+  GLEE_EXTERN GLEEPFNGLGENFRAMEBUFFERSEXTPROC GLeeFuncPtr_glGenFramebuffersEXT;\r
+  #define glGenFramebuffersEXT GLeeFuncPtr_glGenFramebuffersEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glCheckFramebufferStatusEXT\r
+#define GLEE_H_DEFINED_glCheckFramebufferStatusEXT\r
+  typedef GLenum (APIENTRYP GLEEPFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) (GLenum target);\r
+  GLEE_EXTERN GLEEPFNGLCHECKFRAMEBUFFERSTATUSEXTPROC GLeeFuncPtr_glCheckFramebufferStatusEXT;\r
+  #define glCheckFramebufferStatusEXT GLeeFuncPtr_glCheckFramebufferStatusEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFramebufferTexture1DEXT\r
+#define GLEE_H_DEFINED_glFramebufferTexture1DEXT\r
+  typedef void (APIENTRYP GLEEPFNGLFRAMEBUFFERTEXTURE1DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);\r
+  GLEE_EXTERN GLEEPFNGLFRAMEBUFFERTEXTURE1DEXTPROC GLeeFuncPtr_glFramebufferTexture1DEXT;\r
+  #define glFramebufferTexture1DEXT GLeeFuncPtr_glFramebufferTexture1DEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFramebufferTexture2DEXT\r
+#define GLEE_H_DEFINED_glFramebufferTexture2DEXT\r
+  typedef void (APIENTRYP GLEEPFNGLFRAMEBUFFERTEXTURE2DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);\r
+  GLEE_EXTERN GLEEPFNGLFRAMEBUFFERTEXTURE2DEXTPROC GLeeFuncPtr_glFramebufferTexture2DEXT;\r
+  #define glFramebufferTexture2DEXT GLeeFuncPtr_glFramebufferTexture2DEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFramebufferTexture3DEXT\r
+#define GLEE_H_DEFINED_glFramebufferTexture3DEXT\r
+  typedef void (APIENTRYP GLEEPFNGLFRAMEBUFFERTEXTURE3DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);\r
+  GLEE_EXTERN GLEEPFNGLFRAMEBUFFERTEXTURE3DEXTPROC GLeeFuncPtr_glFramebufferTexture3DEXT;\r
+  #define glFramebufferTexture3DEXT GLeeFuncPtr_glFramebufferTexture3DEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFramebufferRenderbufferEXT\r
+#define GLEE_H_DEFINED_glFramebufferRenderbufferEXT\r
+  typedef void (APIENTRYP GLEEPFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);\r
+  GLEE_EXTERN GLEEPFNGLFRAMEBUFFERRENDERBUFFEREXTPROC GLeeFuncPtr_glFramebufferRenderbufferEXT;\r
+  #define glFramebufferRenderbufferEXT GLeeFuncPtr_glFramebufferRenderbufferEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetFramebufferAttachmentParameterivEXT\r
+#define GLEE_H_DEFINED_glGetFramebufferAttachmentParameterivEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLenum target, GLenum attachment, GLenum pname, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC GLeeFuncPtr_glGetFramebufferAttachmentParameterivEXT;\r
+  #define glGetFramebufferAttachmentParameterivEXT GLeeFuncPtr_glGetFramebufferAttachmentParameterivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGenerateMipmapEXT\r
+#define GLEE_H_DEFINED_glGenerateMipmapEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGENERATEMIPMAPEXTPROC) (GLenum target);\r
+  GLEE_EXTERN GLEEPFNGLGENERATEMIPMAPEXTPROC GLeeFuncPtr_glGenerateMipmapEXT;\r
+  #define glGenerateMipmapEXT GLeeFuncPtr_glGenerateMipmapEXT\r
+#endif\r
+#endif \r
+\r
+/* GL_GREMEDY_string_marker */\r
+\r
+#ifndef GL_GREMEDY_string_marker\r
+#define GL_GREMEDY_string_marker 1\r
+#define __GLEE_GL_GREMEDY_string_marker 1\r
+/* Constants */\r
+#ifndef GLEE_H_DEFINED_glStringMarkerGREMEDY\r
+#define GLEE_H_DEFINED_glStringMarkerGREMEDY\r
+  typedef void (APIENTRYP GLEEPFNGLSTRINGMARKERGREMEDYPROC) (GLsizei len, const GLvoid * string);\r
+  GLEE_EXTERN GLEEPFNGLSTRINGMARKERGREMEDYPROC GLeeFuncPtr_glStringMarkerGREMEDY;\r
+  #define glStringMarkerGREMEDY GLeeFuncPtr_glStringMarkerGREMEDY\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_packed_depth_stencil */\r
+\r
+#ifndef GL_EXT_packed_depth_stencil\r
+#define GL_EXT_packed_depth_stencil 1\r
+#define __GLEE_GL_EXT_packed_depth_stencil 1\r
+/* Constants */\r
+#define GL_DEPTH_STENCIL_EXT                               0x84F9\r
+#define GL_UNSIGNED_INT_24_8_EXT                           0x84FA\r
+#define GL_DEPTH24_STENCIL8_EXT                            0x88F0\r
+#define GL_TEXTURE_STENCIL_SIZE_EXT                        0x88F1\r
+#endif \r
+\r
+/* GL_EXT_stencil_clear_tag */\r
+\r
+#ifndef GL_EXT_stencil_clear_tag\r
+#define GL_EXT_stencil_clear_tag 1\r
+#define __GLEE_GL_EXT_stencil_clear_tag 1\r
+/* Constants */\r
+#define GL_STENCIL_TAG_BITS_EXT                            0x88F2\r
+#define GL_STENCIL_CLEAR_TAG_VALUE_EXT                     0x88F3\r
+#ifndef GLEE_H_DEFINED_glStencilClearTagEXT\r
+#define GLEE_H_DEFINED_glStencilClearTagEXT\r
+  typedef void (APIENTRYP GLEEPFNGLSTENCILCLEARTAGEXTPROC) (GLsizei stencilTagBits, GLuint stencilClearTag);\r
+  GLEE_EXTERN GLEEPFNGLSTENCILCLEARTAGEXTPROC GLeeFuncPtr_glStencilClearTagEXT;\r
+  #define glStencilClearTagEXT GLeeFuncPtr_glStencilClearTagEXT\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_texture_sRGB */\r
+\r
+#ifndef GL_EXT_texture_sRGB\r
+#define GL_EXT_texture_sRGB 1\r
+#define __GLEE_GL_EXT_texture_sRGB 1\r
+/* Constants */\r
+#define GL_SRGB_EXT                                        0x8C40\r
+#define GL_SRGB8_EXT                                       0x8C41\r
+#define GL_SRGB_ALPHA_EXT                                  0x8C42\r
+#define GL_SRGB8_ALPHA8_EXT                                0x8C43\r
+#define GL_SLUMINANCE_ALPHA_EXT                            0x8C44\r
+#define GL_SLUMINANCE8_ALPHA8_EXT                          0x8C45\r
+#define GL_SLUMINANCE_EXT                                  0x8C46\r
+#define GL_SLUMINANCE8_EXT                                 0x8C47\r
+#define GL_COMPRESSED_SRGB_EXT                             0x8C48\r
+#define GL_COMPRESSED_SRGB_ALPHA_EXT                       0x8C49\r
+#define GL_COMPRESSED_SLUMINANCE_EXT                       0x8C4A\r
+#define GL_COMPRESSED_SLUMINANCE_ALPHA_EXT                 0x8C4B\r
+#define GL_COMPRESSED_SRGB_S3TC_DXT1_EXT                   0x8C4C\r
+#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT             0x8C4D\r
+#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT             0x8C4E\r
+#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT             0x8C4F\r
+#endif \r
+\r
+/* GL_EXT_framebuffer_blit */\r
+\r
+#ifndef GL_EXT_framebuffer_blit\r
+#define GL_EXT_framebuffer_blit 1\r
+#define __GLEE_GL_EXT_framebuffer_blit 1\r
+/* Constants */\r
+#define GL_READ_FRAMEBUFFER_EXT                            0x8CA8\r
+#define GL_DRAW_FRAMEBUFFER_EXT                            0x8CA9\r
+#define GL_DRAW_FRAMEBUFFER_BINDING_EXT                    GL_FRAMEBUFFER_BINDING_EXT\r
+#define GL_READ_FRAMEBUFFER_BINDING_EXT                    0x8CAA\r
+#ifndef GLEE_H_DEFINED_glBlitFramebufferEXT\r
+#define GLEE_H_DEFINED_glBlitFramebufferEXT\r
+  typedef void (APIENTRYP GLEEPFNGLBLITFRAMEBUFFEREXTPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);\r
+  GLEE_EXTERN GLEEPFNGLBLITFRAMEBUFFEREXTPROC GLeeFuncPtr_glBlitFramebufferEXT;\r
+  #define glBlitFramebufferEXT GLeeFuncPtr_glBlitFramebufferEXT\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_framebuffer_multisample */\r
+\r
+#ifndef GL_EXT_framebuffer_multisample\r
+#define GL_EXT_framebuffer_multisample 1\r
+#define __GLEE_GL_EXT_framebuffer_multisample 1\r
+/* Constants */\r
+#define GL_RENDERBUFFER_SAMPLES_EXT                        0x8CAB\r
+#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT          0x8D56\r
+#define GL_MAX_SAMPLES_EXT                                 0x8D57\r
+#ifndef GLEE_H_DEFINED_glRenderbufferStorageMultisampleEXT\r
+#define GLEE_H_DEFINED_glRenderbufferStorageMultisampleEXT\r
+  typedef void (APIENTRYP GLEEPFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);\r
+  GLEE_EXTERN GLEEPFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC GLeeFuncPtr_glRenderbufferStorageMultisampleEXT;\r
+  #define glRenderbufferStorageMultisampleEXT GLeeFuncPtr_glRenderbufferStorageMultisampleEXT\r
+#endif\r
+#endif \r
+\r
+/* GL_MESAX_texture_stack */\r
+\r
+#ifndef GL_MESAX_texture_stack\r
+#define GL_MESAX_texture_stack 1\r
+#define __GLEE_GL_MESAX_texture_stack 1\r
+/* Constants */\r
+#define GL_TEXTURE_1D_STACK_MESAX                          0x8759\r
+#define GL_TEXTURE_2D_STACK_MESAX                          0x875A\r
+#define GL_PROXY_TEXTURE_1D_STACK_MESAX                    0x875B\r
+#define GL_PROXY_TEXTURE_2D_STACK_MESAX                    0x875C\r
+#define GL_TEXTURE_1D_STACK_BINDING_MESAX                  0x875D\r
+#define GL_TEXTURE_2D_STACK_BINDING_MESAX                  0x875E\r
+#endif \r
+\r
+/* GL_EXT_timer_query */\r
+\r
+#ifndef GL_EXT_timer_query\r
+#define GL_EXT_timer_query 1\r
+#define __GLEE_GL_EXT_timer_query 1\r
+/* Constants */\r
+#define GL_TIME_ELAPSED_EXT                                0x88BF\r
+#ifndef GLEE_H_DEFINED_glGetQueryObjecti64vEXT\r
+#define GLEE_H_DEFINED_glGetQueryObjecti64vEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETQUERYOBJECTI64VEXTPROC) (GLuint id, GLenum pname, GLint64EXT * params);\r
+  GLEE_EXTERN GLEEPFNGLGETQUERYOBJECTI64VEXTPROC GLeeFuncPtr_glGetQueryObjecti64vEXT;\r
+  #define glGetQueryObjecti64vEXT GLeeFuncPtr_glGetQueryObjecti64vEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetQueryObjectui64vEXT\r
+#define GLEE_H_DEFINED_glGetQueryObjectui64vEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETQUERYOBJECTUI64VEXTPROC) (GLuint id, GLenum pname, GLuint64EXT * params);\r
+  GLEE_EXTERN GLEEPFNGLGETQUERYOBJECTUI64VEXTPROC GLeeFuncPtr_glGetQueryObjectui64vEXT;\r
+  #define glGetQueryObjectui64vEXT GLeeFuncPtr_glGetQueryObjectui64vEXT\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_gpu_program_parameters */\r
+\r
+#ifndef GL_EXT_gpu_program_parameters\r
+#define GL_EXT_gpu_program_parameters 1\r
+#define __GLEE_GL_EXT_gpu_program_parameters 1\r
+/* Constants */\r
+#ifndef GLEE_H_DEFINED_glProgramEnvParameters4fvEXT\r
+#define GLEE_H_DEFINED_glProgramEnvParameters4fvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLPROGRAMENVPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMENVPARAMETERS4FVEXTPROC GLeeFuncPtr_glProgramEnvParameters4fvEXT;\r
+  #define glProgramEnvParameters4fvEXT GLeeFuncPtr_glProgramEnvParameters4fvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramLocalParameters4fvEXT\r
+#define GLEE_H_DEFINED_glProgramLocalParameters4fvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC GLeeFuncPtr_glProgramLocalParameters4fvEXT;\r
+  #define glProgramLocalParameters4fvEXT GLeeFuncPtr_glProgramLocalParameters4fvEXT\r
+#endif\r
+#endif \r
+\r
+/* GL_APPLE_flush_buffer_range */\r
+\r
+#ifndef GL_APPLE_flush_buffer_range\r
+#define GL_APPLE_flush_buffer_range 1\r
+#define __GLEE_GL_APPLE_flush_buffer_range 1\r
+/* Constants */\r
+#define GL_BUFFER_SERIALIZED_MODIFY_APPLE                  0x8A12\r
+#define GL_BUFFER_FLUSHING_UNMAP_APPLE                     0x8A13\r
+#ifndef GLEE_H_DEFINED_glBufferParameteriAPPLE\r
+#define GLEE_H_DEFINED_glBufferParameteriAPPLE\r
+  typedef void (APIENTRYP GLEEPFNGLBUFFERPARAMETERIAPPLEPROC) (GLenum target, GLenum pname, GLint param);\r
+  GLEE_EXTERN GLEEPFNGLBUFFERPARAMETERIAPPLEPROC GLeeFuncPtr_glBufferParameteriAPPLE;\r
+  #define glBufferParameteriAPPLE GLeeFuncPtr_glBufferParameteriAPPLE\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFlushMappedBufferRangeAPPLE\r
+#define GLEE_H_DEFINED_glFlushMappedBufferRangeAPPLE\r
+  typedef void (APIENTRYP GLEEPFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC) (GLenum target, GLintptr offset, GLsizeiptr size);\r
+  GLEE_EXTERN GLEEPFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC GLeeFuncPtr_glFlushMappedBufferRangeAPPLE;\r
+  #define glFlushMappedBufferRangeAPPLE GLeeFuncPtr_glFlushMappedBufferRangeAPPLE\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_gpu_shader4 */\r
+\r
+#ifndef GL_EXT_gpu_shader4\r
+#define GL_EXT_gpu_shader4 1\r
+#define __GLEE_GL_EXT_gpu_shader4 1\r
+/* Constants */\r
+#define GL_SAMPLER_1D_ARRAY_EXT                            0x8DC0\r
+#define GL_SAMPLER_2D_ARRAY_EXT                            0x8DC1\r
+#define GL_SAMPLER_BUFFER_EXT                              0x8DC2\r
+#define GL_SAMPLER_1D_ARRAY_SHADOW_EXT                     0x8DC3\r
+#define GL_SAMPLER_2D_ARRAY_SHADOW_EXT                     0x8DC4\r
+#define GL_SAMPLER_CUBE_SHADOW_EXT                         0x8DC5\r
+#define GL_UNSIGNED_INT_VEC2_EXT                           0x8DC6\r
+#define GL_UNSIGNED_INT_VEC3_EXT                           0x8DC7\r
+#define GL_UNSIGNED_INT_VEC4_EXT                           0x8DC8\r
+#define GL_INT_SAMPLER_1D_EXT                              0x8DC9\r
+#define GL_INT_SAMPLER_2D_EXT                              0x8DCA\r
+#define GL_INT_SAMPLER_3D_EXT                              0x8DCB\r
+#define GL_INT_SAMPLER_CUBE_EXT                            0x8DCC\r
+#define GL_INT_SAMPLER_2D_RECT_EXT                         0x8DCD\r
+#define GL_INT_SAMPLER_1D_ARRAY_EXT                        0x8DCE\r
+#define GL_INT_SAMPLER_2D_ARRAY_EXT                        0x8DCF\r
+#define GL_INT_SAMPLER_BUFFER_EXT                          0x8DD0\r
+#define GL_UNSIGNED_INT_SAMPLER_1D_EXT                     0x8DD1\r
+#define GL_UNSIGNED_INT_SAMPLER_2D_EXT                     0x8DD2\r
+#define GL_UNSIGNED_INT_SAMPLER_3D_EXT                     0x8DD3\r
+#define GL_UNSIGNED_INT_SAMPLER_CUBE_EXT                   0x8DD4\r
+#define GL_UNSIGNED_INT_SAMPLER_2D_RECT_EXT                0x8DD5\r
+#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY_EXT               0x8DD6\r
+#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY_EXT               0x8DD7\r
+#define GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT                 0x8DD8\r
+#ifndef GLEE_H_DEFINED_glGetUniformuivEXT\r
+#define GLEE_H_DEFINED_glGetUniformuivEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETUNIFORMUIVEXTPROC) (GLuint program, GLint location, GLuint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETUNIFORMUIVEXTPROC GLeeFuncPtr_glGetUniformuivEXT;\r
+  #define glGetUniformuivEXT GLeeFuncPtr_glGetUniformuivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glBindFragDataLocationEXT\r
+#define GLEE_H_DEFINED_glBindFragDataLocationEXT\r
+  typedef void (APIENTRYP GLEEPFNGLBINDFRAGDATALOCATIONEXTPROC) (GLuint program, GLuint color, const GLchar * name);\r
+  GLEE_EXTERN GLEEPFNGLBINDFRAGDATALOCATIONEXTPROC GLeeFuncPtr_glBindFragDataLocationEXT;\r
+  #define glBindFragDataLocationEXT GLeeFuncPtr_glBindFragDataLocationEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetFragDataLocationEXT\r
+#define GLEE_H_DEFINED_glGetFragDataLocationEXT\r
+  typedef GLint (APIENTRYP GLEEPFNGLGETFRAGDATALOCATIONEXTPROC) (GLuint program, const GLchar * name);\r
+  GLEE_EXTERN GLEEPFNGLGETFRAGDATALOCATIONEXTPROC GLeeFuncPtr_glGetFragDataLocationEXT;\r
+  #define glGetFragDataLocationEXT GLeeFuncPtr_glGetFragDataLocationEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUniform1uiEXT\r
+#define GLEE_H_DEFINED_glUniform1uiEXT\r
+  typedef void (APIENTRYP GLEEPFNGLUNIFORM1UIEXTPROC) (GLint location, GLuint v0);\r
+  GLEE_EXTERN GLEEPFNGLUNIFORM1UIEXTPROC GLeeFuncPtr_glUniform1uiEXT;\r
+  #define glUniform1uiEXT GLeeFuncPtr_glUniform1uiEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUniform2uiEXT\r
+#define GLEE_H_DEFINED_glUniform2uiEXT\r
+  typedef void (APIENTRYP GLEEPFNGLUNIFORM2UIEXTPROC) (GLint location, GLuint v0, GLuint v1);\r
+  GLEE_EXTERN GLEEPFNGLUNIFORM2UIEXTPROC GLeeFuncPtr_glUniform2uiEXT;\r
+  #define glUniform2uiEXT GLeeFuncPtr_glUniform2uiEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUniform3uiEXT\r
+#define GLEE_H_DEFINED_glUniform3uiEXT\r
+  typedef void (APIENTRYP GLEEPFNGLUNIFORM3UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2);\r
+  GLEE_EXTERN GLEEPFNGLUNIFORM3UIEXTPROC GLeeFuncPtr_glUniform3uiEXT;\r
+  #define glUniform3uiEXT GLeeFuncPtr_glUniform3uiEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUniform4uiEXT\r
+#define GLEE_H_DEFINED_glUniform4uiEXT\r
+  typedef void (APIENTRYP GLEEPFNGLUNIFORM4UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);\r
+  GLEE_EXTERN GLEEPFNGLUNIFORM4UIEXTPROC GLeeFuncPtr_glUniform4uiEXT;\r
+  #define glUniform4uiEXT GLeeFuncPtr_glUniform4uiEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUniform1uivEXT\r
+#define GLEE_H_DEFINED_glUniform1uivEXT\r
+  typedef void (APIENTRYP GLEEPFNGLUNIFORM1UIVEXTPROC) (GLint location, GLsizei count, const GLuint * value);\r
+  GLEE_EXTERN GLEEPFNGLUNIFORM1UIVEXTPROC GLeeFuncPtr_glUniform1uivEXT;\r
+  #define glUniform1uivEXT GLeeFuncPtr_glUniform1uivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUniform2uivEXT\r
+#define GLEE_H_DEFINED_glUniform2uivEXT\r
+  typedef void (APIENTRYP GLEEPFNGLUNIFORM2UIVEXTPROC) (GLint location, GLsizei count, const GLuint * value);\r
+  GLEE_EXTERN GLEEPFNGLUNIFORM2UIVEXTPROC GLeeFuncPtr_glUniform2uivEXT;\r
+  #define glUniform2uivEXT GLeeFuncPtr_glUniform2uivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUniform3uivEXT\r
+#define GLEE_H_DEFINED_glUniform3uivEXT\r
+  typedef void (APIENTRYP GLEEPFNGLUNIFORM3UIVEXTPROC) (GLint location, GLsizei count, const GLuint * value);\r
+  GLEE_EXTERN GLEEPFNGLUNIFORM3UIVEXTPROC GLeeFuncPtr_glUniform3uivEXT;\r
+  #define glUniform3uivEXT GLeeFuncPtr_glUniform3uivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUniform4uivEXT\r
+#define GLEE_H_DEFINED_glUniform4uivEXT\r
+  typedef void (APIENTRYP GLEEPFNGLUNIFORM4UIVEXTPROC) (GLint location, GLsizei count, const GLuint * value);\r
+  GLEE_EXTERN GLEEPFNGLUNIFORM4UIVEXTPROC GLeeFuncPtr_glUniform4uivEXT;\r
+  #define glUniform4uivEXT GLeeFuncPtr_glUniform4uivEXT\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_draw_instanced */\r
+\r
+#ifndef GL_EXT_draw_instanced\r
+#define GL_EXT_draw_instanced 1\r
+#define __GLEE_GL_EXT_draw_instanced 1\r
+/* Constants */\r
+#ifndef GLEE_H_DEFINED_glDrawArraysInstancedEXT\r
+#define GLEE_H_DEFINED_glDrawArraysInstancedEXT\r
+  typedef void (APIENTRYP GLEEPFNGLDRAWARRAYSINSTANCEDEXTPROC) (GLenum mode, GLint start, GLsizei count, GLsizei primcount);\r
+  GLEE_EXTERN GLEEPFNGLDRAWARRAYSINSTANCEDEXTPROC GLeeFuncPtr_glDrawArraysInstancedEXT;\r
+  #define glDrawArraysInstancedEXT GLeeFuncPtr_glDrawArraysInstancedEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glDrawElementsInstancedEXT\r
+#define GLEE_H_DEFINED_glDrawElementsInstancedEXT\r
+  typedef void (APIENTRYP GLEEPFNGLDRAWELEMENTSINSTANCEDEXTPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid * indices, GLsizei primcount);\r
+  GLEE_EXTERN GLEEPFNGLDRAWELEMENTSINSTANCEDEXTPROC GLeeFuncPtr_glDrawElementsInstancedEXT;\r
+  #define glDrawElementsInstancedEXT GLeeFuncPtr_glDrawElementsInstancedEXT\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_packed_float */\r
+\r
+#ifndef GL_EXT_packed_float\r
+#define GL_EXT_packed_float 1\r
+#define __GLEE_GL_EXT_packed_float 1\r
+/* Constants */\r
+#define GL_R11F_G11F_B10F_EXT                              0x8C3A\r
+#define GL_UNSIGNED_INT_10F_11F_11F_REV_EXT                0x8C3B\r
+#define GL_RGBA_SIGNED_COMPONENTS_EXT                      0x8C3C\r
+#endif \r
+\r
+/* GL_EXT_texture_array */\r
+\r
+#ifndef GL_EXT_texture_array\r
+#define GL_EXT_texture_array 1\r
+#define __GLEE_GL_EXT_texture_array 1\r
+/* Constants */\r
+#define GL_TEXTURE_1D_ARRAY_EXT                            0x8C18\r
+#define GL_PROXY_TEXTURE_1D_ARRAY_EXT                      0x8C19\r
+#define GL_TEXTURE_2D_ARRAY_EXT                            0x8C1A\r
+#define GL_PROXY_TEXTURE_2D_ARRAY_EXT                      0x8C1B\r
+#define GL_TEXTURE_BINDING_1D_ARRAY_EXT                    0x8C1C\r
+#define GL_TEXTURE_BINDING_2D_ARRAY_EXT                    0x8C1D\r
+#define GL_MAX_ARRAY_TEXTURE_LAYERS_EXT                    0x88FF\r
+#define GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT                0x884E\r
+#endif \r
+\r
+/* GL_EXT_texture_buffer_object */\r
+\r
+#ifndef GL_EXT_texture_buffer_object\r
+#define GL_EXT_texture_buffer_object 1\r
+#define __GLEE_GL_EXT_texture_buffer_object 1\r
+/* Constants */\r
+#define GL_TEXTURE_BUFFER_EXT                              0x8C2A\r
+#define GL_MAX_TEXTURE_BUFFER_SIZE_EXT                     0x8C2B\r
+#define GL_TEXTURE_BINDING_BUFFER_EXT                      0x8C2C\r
+#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT           0x8C2D\r
+#define GL_TEXTURE_BUFFER_FORMAT_EXT                       0x8C2E\r
+#ifndef GLEE_H_DEFINED_glTexBufferEXT\r
+#define GLEE_H_DEFINED_glTexBufferEXT\r
+  typedef void (APIENTRYP GLEEPFNGLTEXBUFFEREXTPROC) (GLenum target, GLenum internalformat, GLuint buffer);\r
+  GLEE_EXTERN GLEEPFNGLTEXBUFFEREXTPROC GLeeFuncPtr_glTexBufferEXT;\r
+  #define glTexBufferEXT GLeeFuncPtr_glTexBufferEXT\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_texture_compression_latc */\r
+\r
+#ifndef GL_EXT_texture_compression_latc\r
+#define GL_EXT_texture_compression_latc 1\r
+#define __GLEE_GL_EXT_texture_compression_latc 1\r
+/* Constants */\r
+#define GL_COMPRESSED_LUMINANCE_LATC1_EXT                  0x8C70\r
+#define GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT           0x8C71\r
+#define GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT            0x8C72\r
+#define GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT     0x8C73\r
+#endif \r
+\r
+/* GL_EXT_texture_compression_rgtc */\r
+\r
+#ifndef GL_EXT_texture_compression_rgtc\r
+#define GL_EXT_texture_compression_rgtc 1\r
+#define __GLEE_GL_EXT_texture_compression_rgtc 1\r
+/* Constants */\r
+#define GL_COMPRESSED_RED_RGTC1_EXT                        0x8DBB\r
+#define GL_COMPRESSED_SIGNED_RED_RGTC1_EXT                 0x8DBC\r
+#define GL_COMPRESSED_RED_GREEN_RGTC2_EXT                  0x8DBD\r
+#define GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT           0x8DBE\r
+#endif \r
+\r
+/* GL_EXT_texture_shared_exponent */\r
+\r
+#ifndef GL_EXT_texture_shared_exponent\r
+#define GL_EXT_texture_shared_exponent 1\r
+#define __GLEE_GL_EXT_texture_shared_exponent 1\r
+/* Constants */\r
+#define GL_RGB9_E5_EXT                                     0x8C3D\r
+#define GL_UNSIGNED_INT_5_9_9_9_REV_EXT                    0x8C3E\r
+#define GL_TEXTURE_SHARED_SIZE_EXT                         0x8C3F\r
+#endif \r
+\r
+/* GL_NV_depth_buffer_float */\r
+\r
+#ifndef GL_NV_depth_buffer_float\r
+#define GL_NV_depth_buffer_float 1\r
+#define __GLEE_GL_NV_depth_buffer_float 1\r
+/* Constants */\r
+#define GL_DEPTH_COMPONENT32F_NV                           0x8DAB\r
+#define GL_DEPTH32F_STENCIL8_NV                            0x8DAC\r
+#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV_NV               0x8DAD\r
+#define GL_DEPTH_BUFFER_FLOAT_MODE_NV                      0x8DAF\r
+#ifndef GLEE_H_DEFINED_glDepthRangedNV\r
+#define GLEE_H_DEFINED_glDepthRangedNV\r
+  typedef void (APIENTRYP GLEEPFNGLDEPTHRANGEDNVPROC) (GLdouble zNear, GLdouble zFar);\r
+  GLEE_EXTERN GLEEPFNGLDEPTHRANGEDNVPROC GLeeFuncPtr_glDepthRangedNV;\r
+  #define glDepthRangedNV GLeeFuncPtr_glDepthRangedNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glClearDepthdNV\r
+#define GLEE_H_DEFINED_glClearDepthdNV\r
+  typedef void (APIENTRYP GLEEPFNGLCLEARDEPTHDNVPROC) (GLdouble depth);\r
+  GLEE_EXTERN GLEEPFNGLCLEARDEPTHDNVPROC GLeeFuncPtr_glClearDepthdNV;\r
+  #define glClearDepthdNV GLeeFuncPtr_glClearDepthdNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glDepthBoundsdNV\r
+#define GLEE_H_DEFINED_glDepthBoundsdNV\r
+  typedef void (APIENTRYP GLEEPFNGLDEPTHBOUNDSDNVPROC) (GLdouble zmin, GLdouble zmax);\r
+  GLEE_EXTERN GLEEPFNGLDEPTHBOUNDSDNVPROC GLeeFuncPtr_glDepthBoundsdNV;\r
+  #define glDepthBoundsdNV GLeeFuncPtr_glDepthBoundsdNV\r
+#endif\r
+#endif \r
+\r
+/* GL_NV_framebuffer_multisample_coverage */\r
+\r
+#ifndef GL_NV_framebuffer_multisample_coverage\r
+#define GL_NV_framebuffer_multisample_coverage 1\r
+#define __GLEE_GL_NV_framebuffer_multisample_coverage 1\r
+/* Constants */\r
+#define GL_RENDERBUFFER_COVERAGE_SAMPLES_NV                0x8CAB\r
+#define GL_RENDERBUFFER_COLOR_SAMPLES_NV                   0x8E10\r
+#define GL_MAX_MULTISAMPLE_COVERAGE_MODES_NV               0x8E11\r
+#define GL_MULTISAMPLE_COVERAGE_MODES_NV                   0x8E12\r
+#ifndef GLEE_H_DEFINED_glRenderbufferStorageMultisampleCoverageNV\r
+#define GLEE_H_DEFINED_glRenderbufferStorageMultisampleCoverageNV\r
+  typedef void (APIENTRYP GLEEPFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height);\r
+  GLEE_EXTERN GLEEPFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC GLeeFuncPtr_glRenderbufferStorageMultisampleCoverageNV;\r
+  #define glRenderbufferStorageMultisampleCoverageNV GLeeFuncPtr_glRenderbufferStorageMultisampleCoverageNV\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_framebuffer_sRGB */\r
+\r
+#ifndef GL_EXT_framebuffer_sRGB\r
+#define GL_EXT_framebuffer_sRGB 1\r
+#define __GLEE_GL_EXT_framebuffer_sRGB 1\r
+/* Constants */\r
+#define GL_FRAMEBUFFER_SRGB_EXT                            0x8DB9\r
+#define GL_FRAMEBUFFER_SRGB_CAPABLE_EXT                    0x8DBA\r
+#endif \r
+\r
+/* GL_NV_geometry_shader4 */\r
+\r
+#ifndef GL_NV_geometry_shader4\r
+#define GL_NV_geometry_shader4 1\r
+#define __GLEE_GL_NV_geometry_shader4 1\r
+/* Constants */\r
+#endif \r
+\r
+/* GL_NV_parameter_buffer_object */\r
+\r
+#ifndef GL_NV_parameter_buffer_object\r
+#define GL_NV_parameter_buffer_object 1\r
+#define __GLEE_GL_NV_parameter_buffer_object 1\r
+/* Constants */\r
+#define GL_MAX_PROGRAM_PARAMETER_BUFFER_BINDINGS_NV        0x8DA0\r
+#define GL_MAX_PROGRAM_PARAMETER_BUFFER_SIZE_NV            0x8DA1\r
+#define GL_VERTEX_PROGRAM_PARAMETER_BUFFER_NV              0x8DA2\r
+#define GL_GEOMETRY_PROGRAM_PARAMETER_BUFFER_NV            0x8DA3\r
+#define GL_FRAGMENT_PROGRAM_PARAMETER_BUFFER_NV            0x8DA4\r
+#ifndef GLEE_H_DEFINED_glProgramBufferParametersfvNV\r
+#define GLEE_H_DEFINED_glProgramBufferParametersfvNV\r
+  typedef void (APIENTRYP GLEEPFNGLPROGRAMBUFFERPARAMETERSFVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMBUFFERPARAMETERSFVNVPROC GLeeFuncPtr_glProgramBufferParametersfvNV;\r
+  #define glProgramBufferParametersfvNV GLeeFuncPtr_glProgramBufferParametersfvNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramBufferParametersIivNV\r
+#define GLEE_H_DEFINED_glProgramBufferParametersIivNV\r
+  typedef void (APIENTRYP GLEEPFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC GLeeFuncPtr_glProgramBufferParametersIivNV;\r
+  #define glProgramBufferParametersIivNV GLeeFuncPtr_glProgramBufferParametersIivNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramBufferParametersIuivNV\r
+#define GLEE_H_DEFINED_glProgramBufferParametersIuivNV\r
+  typedef void (APIENTRYP GLEEPFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLuint * params);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC GLeeFuncPtr_glProgramBufferParametersIuivNV;\r
+  #define glProgramBufferParametersIuivNV GLeeFuncPtr_glProgramBufferParametersIuivNV\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_draw_buffers2 */\r
+\r
+#ifndef GL_EXT_draw_buffers2\r
+#define GL_EXT_draw_buffers2 1\r
+#define __GLEE_GL_EXT_draw_buffers2 1\r
+/* Constants */\r
+#ifndef GLEE_H_DEFINED_glColorMaskIndexedEXT\r
+#define GLEE_H_DEFINED_glColorMaskIndexedEXT\r
+  typedef void (APIENTRYP GLEEPFNGLCOLORMASKINDEXEDEXTPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);\r
+  GLEE_EXTERN GLEEPFNGLCOLORMASKINDEXEDEXTPROC GLeeFuncPtr_glColorMaskIndexedEXT;\r
+  #define glColorMaskIndexedEXT GLeeFuncPtr_glColorMaskIndexedEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetBooleanIndexedvEXT\r
+#define GLEE_H_DEFINED_glGetBooleanIndexedvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETBOOLEANINDEXEDVEXTPROC) (GLenum target, GLuint index, GLboolean * data);\r
+  GLEE_EXTERN GLEEPFNGLGETBOOLEANINDEXEDVEXTPROC GLeeFuncPtr_glGetBooleanIndexedvEXT;\r
+  #define glGetBooleanIndexedvEXT GLeeFuncPtr_glGetBooleanIndexedvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetIntegerIndexedvEXT\r
+#define GLEE_H_DEFINED_glGetIntegerIndexedvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETINTEGERINDEXEDVEXTPROC) (GLenum target, GLuint index, GLint * data);\r
+  GLEE_EXTERN GLEEPFNGLGETINTEGERINDEXEDVEXTPROC GLeeFuncPtr_glGetIntegerIndexedvEXT;\r
+  #define glGetIntegerIndexedvEXT GLeeFuncPtr_glGetIntegerIndexedvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glEnableIndexedEXT\r
+#define GLEE_H_DEFINED_glEnableIndexedEXT\r
+  typedef void (APIENTRYP GLEEPFNGLENABLEINDEXEDEXTPROC) (GLenum target, GLuint index);\r
+  GLEE_EXTERN GLEEPFNGLENABLEINDEXEDEXTPROC GLeeFuncPtr_glEnableIndexedEXT;\r
+  #define glEnableIndexedEXT GLeeFuncPtr_glEnableIndexedEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glDisableIndexedEXT\r
+#define GLEE_H_DEFINED_glDisableIndexedEXT\r
+  typedef void (APIENTRYP GLEEPFNGLDISABLEINDEXEDEXTPROC) (GLenum target, GLuint index);\r
+  GLEE_EXTERN GLEEPFNGLDISABLEINDEXEDEXTPROC GLeeFuncPtr_glDisableIndexedEXT;\r
+  #define glDisableIndexedEXT GLeeFuncPtr_glDisableIndexedEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glIsEnabledIndexedEXT\r
+#define GLEE_H_DEFINED_glIsEnabledIndexedEXT\r
+  typedef GLboolean (APIENTRYP GLEEPFNGLISENABLEDINDEXEDEXTPROC) (GLenum target, GLuint index);\r
+  GLEE_EXTERN GLEEPFNGLISENABLEDINDEXEDEXTPROC GLeeFuncPtr_glIsEnabledIndexedEXT;\r
+  #define glIsEnabledIndexedEXT GLeeFuncPtr_glIsEnabledIndexedEXT\r
+#endif\r
+#endif \r
+\r
+/* GL_NV_transform_feedback */\r
+\r
+#ifndef GL_NV_transform_feedback\r
+#define GL_NV_transform_feedback 1\r
+#define __GLEE_GL_NV_transform_feedback 1\r
+/* Constants */\r
+#define GL_BACK_PRIMARY_COLOR_NV                           0x8C77\r
+#define GL_BACK_SECONDARY_COLOR_NV                         0x8C78\r
+#define GL_TEXTURE_COORD_NV                                0x8C79\r
+#define GL_CLIP_DISTANCE_NV                                0x8C7A\r
+#define GL_VERTEX_ID_NV                                    0x8C7B\r
+#define GL_PRIMITIVE_ID_NV                                 0x8C7C\r
+#define GL_GENERIC_ATTRIB_NV                               0x8C7D\r
+#define GL_TRANSFORM_FEEDBACK_ATTRIBS_NV                   0x8C7E\r
+#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_NV               0x8C7F\r
+#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_NV   0x8C80\r
+#define GL_ACTIVE_VARYINGS_NV                              0x8C81\r
+#define GL_ACTIVE_VARYING_MAX_LENGTH_NV                    0x8C82\r
+#define GL_TRANSFORM_FEEDBACK_VARYINGS_NV                  0x8C83\r
+#define GL_TRANSFORM_FEEDBACK_BUFFER_START_NV              0x8C84\r
+#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_NV               0x8C85\r
+#define GL_TRANSFORM_FEEDBACK_RECORD_NV                    0x8C86\r
+#define GL_PRIMITIVES_GENERATED_NV                         0x8C87\r
+#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV        0x8C88\r
+#define GL_RASTERIZER_DISCARD_NV                           0x8C89\r
+#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_ATTRIBS_NV   0x8C8A\r
+#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_NV      0x8C8B\r
+#define GL_INTERLEAVED_ATTRIBS_NV                          0x8C8C\r
+#define GL_SEPARATE_ATTRIBS_NV                             0x8C8D\r
+#define GL_TRANSFORM_FEEDBACK_BUFFER_NV                    0x8C8E\r
+#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_NV            0x8C8F\r
+#ifndef GLEE_H_DEFINED_glBeginTransformFeedbackNV\r
+#define GLEE_H_DEFINED_glBeginTransformFeedbackNV\r
+  typedef void (APIENTRYP GLEEPFNGLBEGINTRANSFORMFEEDBACKNVPROC) (GLenum primitiveMode);\r
+  GLEE_EXTERN GLEEPFNGLBEGINTRANSFORMFEEDBACKNVPROC GLeeFuncPtr_glBeginTransformFeedbackNV;\r
+  #define glBeginTransformFeedbackNV GLeeFuncPtr_glBeginTransformFeedbackNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glEndTransformFeedbackNV\r
+#define GLEE_H_DEFINED_glEndTransformFeedbackNV\r
+  typedef void (APIENTRYP GLEEPFNGLENDTRANSFORMFEEDBACKNVPROC) ();\r
+  GLEE_EXTERN GLEEPFNGLENDTRANSFORMFEEDBACKNVPROC GLeeFuncPtr_glEndTransformFeedbackNV;\r
+  #define glEndTransformFeedbackNV GLeeFuncPtr_glEndTransformFeedbackNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTransformFeedbackAttribsNV\r
+#define GLEE_H_DEFINED_glTransformFeedbackAttribsNV\r
+  typedef void (APIENTRYP GLEEPFNGLTRANSFORMFEEDBACKATTRIBSNVPROC) (GLuint count, const GLint * attribs, GLenum bufferMode);\r
+  GLEE_EXTERN GLEEPFNGLTRANSFORMFEEDBACKATTRIBSNVPROC GLeeFuncPtr_glTransformFeedbackAttribsNV;\r
+  #define glTransformFeedbackAttribsNV GLeeFuncPtr_glTransformFeedbackAttribsNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glBindBufferRangeNV\r
+#define GLEE_H_DEFINED_glBindBufferRangeNV\r
+  typedef void (APIENTRYP GLEEPFNGLBINDBUFFERRANGENVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);\r
+  GLEE_EXTERN GLEEPFNGLBINDBUFFERRANGENVPROC GLeeFuncPtr_glBindBufferRangeNV;\r
+  #define glBindBufferRangeNV GLeeFuncPtr_glBindBufferRangeNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glBindBufferOffsetNV\r
+#define GLEE_H_DEFINED_glBindBufferOffsetNV\r
+  typedef void (APIENTRYP GLEEPFNGLBINDBUFFEROFFSETNVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset);\r
+  GLEE_EXTERN GLEEPFNGLBINDBUFFEROFFSETNVPROC GLeeFuncPtr_glBindBufferOffsetNV;\r
+  #define glBindBufferOffsetNV GLeeFuncPtr_glBindBufferOffsetNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glBindBufferBaseNV\r
+#define GLEE_H_DEFINED_glBindBufferBaseNV\r
+  typedef void (APIENTRYP GLEEPFNGLBINDBUFFERBASENVPROC) (GLenum target, GLuint index, GLuint buffer);\r
+  GLEE_EXTERN GLEEPFNGLBINDBUFFERBASENVPROC GLeeFuncPtr_glBindBufferBaseNV;\r
+  #define glBindBufferBaseNV GLeeFuncPtr_glBindBufferBaseNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTransformFeedbackVaryingsNV\r
+#define GLEE_H_DEFINED_glTransformFeedbackVaryingsNV\r
+  typedef void (APIENTRYP GLEEPFNGLTRANSFORMFEEDBACKVARYINGSNVPROC) (GLuint program, GLsizei count, const GLint * locations, GLenum bufferMode);\r
+  GLEE_EXTERN GLEEPFNGLTRANSFORMFEEDBACKVARYINGSNVPROC GLeeFuncPtr_glTransformFeedbackVaryingsNV;\r
+  #define glTransformFeedbackVaryingsNV GLeeFuncPtr_glTransformFeedbackVaryingsNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glActiveVaryingNV\r
+#define GLEE_H_DEFINED_glActiveVaryingNV\r
+  typedef void (APIENTRYP GLEEPFNGLACTIVEVARYINGNVPROC) (GLuint program, const GLchar * name);\r
+  GLEE_EXTERN GLEEPFNGLACTIVEVARYINGNVPROC GLeeFuncPtr_glActiveVaryingNV;\r
+  #define glActiveVaryingNV GLeeFuncPtr_glActiveVaryingNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetVaryingLocationNV\r
+#define GLEE_H_DEFINED_glGetVaryingLocationNV\r
+  typedef GLint (APIENTRYP GLEEPFNGLGETVARYINGLOCATIONNVPROC) (GLuint program, const GLchar * name);\r
+  GLEE_EXTERN GLEEPFNGLGETVARYINGLOCATIONNVPROC GLeeFuncPtr_glGetVaryingLocationNV;\r
+  #define glGetVaryingLocationNV GLeeFuncPtr_glGetVaryingLocationNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetActiveVaryingNV\r
+#define GLEE_H_DEFINED_glGetActiveVaryingNV\r
+  typedef void (APIENTRYP GLEEPFNGLGETACTIVEVARYINGNVPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLsizei * size, GLenum * type, GLchar * name);\r
+  GLEE_EXTERN GLEEPFNGLGETACTIVEVARYINGNVPROC GLeeFuncPtr_glGetActiveVaryingNV;\r
+  #define glGetActiveVaryingNV GLeeFuncPtr_glGetActiveVaryingNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetTransformFeedbackVaryingNV\r
+#define GLEE_H_DEFINED_glGetTransformFeedbackVaryingNV\r
+  typedef void (APIENTRYP GLEEPFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC) (GLuint program, GLuint index, GLint * location);\r
+  GLEE_EXTERN GLEEPFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC GLeeFuncPtr_glGetTransformFeedbackVaryingNV;\r
+  #define glGetTransformFeedbackVaryingNV GLeeFuncPtr_glGetTransformFeedbackVaryingNV\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_bindable_uniform */\r
+\r
+#ifndef GL_EXT_bindable_uniform\r
+#define GL_EXT_bindable_uniform 1\r
+#define __GLEE_GL_EXT_bindable_uniform 1\r
+/* Constants */\r
+#define GL_MAX_VERTEX_BINDABLE_UNIFORMS_EXT                0x8DE2\r
+#define GL_MAX_FRAGMENT_BINDABLE_UNIFORMS_EXT              0x8DE3\r
+#define GL_MAX_GEOMETRY_BINDABLE_UNIFORMS_EXT              0x8DE4\r
+#define GL_MAX_BINDABLE_UNIFORM_SIZE_EXT                   0x8DED\r
+#define GL_UNIFORM_BUFFER_EXT                              0x8DEE\r
+#define GL_UNIFORM_BUFFER_BINDING_EXT                      0x8DEF\r
+#ifndef GLEE_H_DEFINED_glUniformBufferEXT\r
+#define GLEE_H_DEFINED_glUniformBufferEXT\r
+  typedef void (APIENTRYP GLEEPFNGLUNIFORMBUFFEREXTPROC) (GLuint program, GLint location, GLuint buffer);\r
+  GLEE_EXTERN GLEEPFNGLUNIFORMBUFFEREXTPROC GLeeFuncPtr_glUniformBufferEXT;\r
+  #define glUniformBufferEXT GLeeFuncPtr_glUniformBufferEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetUniformBufferSizeEXT\r
+#define GLEE_H_DEFINED_glGetUniformBufferSizeEXT\r
+  typedef GLint (APIENTRYP GLEEPFNGLGETUNIFORMBUFFERSIZEEXTPROC) (GLuint program, GLint location);\r
+  GLEE_EXTERN GLEEPFNGLGETUNIFORMBUFFERSIZEEXTPROC GLeeFuncPtr_glGetUniformBufferSizeEXT;\r
+  #define glGetUniformBufferSizeEXT GLeeFuncPtr_glGetUniformBufferSizeEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetUniformOffsetEXT\r
+#define GLEE_H_DEFINED_glGetUniformOffsetEXT\r
+  typedef GLintptr (APIENTRYP GLEEPFNGLGETUNIFORMOFFSETEXTPROC) (GLuint program, GLint location);\r
+  GLEE_EXTERN GLEEPFNGLGETUNIFORMOFFSETEXTPROC GLeeFuncPtr_glGetUniformOffsetEXT;\r
+  #define glGetUniformOffsetEXT GLeeFuncPtr_glGetUniformOffsetEXT\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_texture_integer */\r
+\r
+#ifndef GL_EXT_texture_integer\r
+#define GL_EXT_texture_integer 1\r
+#define __GLEE_GL_EXT_texture_integer 1\r
+/* Constants */\r
+#define GL_RGBA32UI_EXT                                    0x8D70\r
+#define GL_RGB32UI_EXT                                     0x8D71\r
+#define GL_ALPHA32UI_EXT                                   0x8D72\r
+#define GL_INTENSITY32UI_EXT                               0x8D73\r
+#define GL_LUMINANCE32UI_EXT                               0x8D74\r
+#define GL_LUMINANCE_ALPHA32UI_EXT                         0x8D75\r
+#define GL_RGBA16UI_EXT                                    0x8D76\r
+#define GL_RGB16UI_EXT                                     0x8D77\r
+#define GL_ALPHA16UI_EXT                                   0x8D78\r
+#define GL_INTENSITY16UI_EXT                               0x8D79\r
+#define GL_LUMINANCE16UI_EXT                               0x8D7A\r
+#define GL_LUMINANCE_ALPHA16UI_EXT                         0x8D7B\r
+#define GL_RGBA8UI_EXT                                     0x8D7C\r
+#define GL_RGB8UI_EXT                                      0x8D7D\r
+#define GL_ALPHA8UI_EXT                                    0x8D7E\r
+#define GL_INTENSITY8UI_EXT                                0x8D7F\r
+#define GL_LUMINANCE8UI_EXT                                0x8D80\r
+#define GL_LUMINANCE_ALPHA8UI_EXT                          0x8D81\r
+#define GL_RGBA32I_EXT                                     0x8D82\r
+#define GL_RGB32I_EXT                                      0x8D83\r
+#define GL_ALPHA32I_EXT                                    0x8D84\r
+#define GL_INTENSITY32I_EXT                                0x8D85\r
+#define GL_LUMINANCE32I_EXT                                0x8D86\r
+#define GL_LUMINANCE_ALPHA32I_EXT                          0x8D87\r
+#define GL_RGBA16I_EXT                                     0x8D88\r
+#define GL_RGB16I_EXT                                      0x8D89\r
+#define GL_ALPHA16I_EXT                                    0x8D8A\r
+#define GL_INTENSITY16I_EXT                                0x8D8B\r
+#define GL_LUMINANCE16I_EXT                                0x8D8C\r
+#define GL_LUMINANCE_ALPHA16I_EXT                          0x8D8D\r
+#define GL_RGBA8I_EXT                                      0x8D8E\r
+#define GL_RGB8I_EXT                                       0x8D8F\r
+#define GL_ALPHA8I_EXT                                     0x8D90\r
+#define GL_INTENSITY8I_EXT                                 0x8D91\r
+#define GL_LUMINANCE8I_EXT                                 0x8D92\r
+#define GL_LUMINANCE_ALPHA8I_EXT                           0x8D93\r
+#define GL_RED_INTEGER_EXT                                 0x8D94\r
+#define GL_GREEN_INTEGER_EXT                               0x8D95\r
+#define GL_BLUE_INTEGER_EXT                                0x8D96\r
+#define GL_ALPHA_INTEGER_EXT                               0x8D97\r
+#define GL_RGB_INTEGER_EXT                                 0x8D98\r
+#define GL_RGBA_INTEGER_EXT                                0x8D99\r
+#define GL_BGR_INTEGER_EXT                                 0x8D9A\r
+#define GL_BGRA_INTEGER_EXT                                0x8D9B\r
+#define GL_LUMINANCE_INTEGER_EXT                           0x8D9C\r
+#define GL_LUMINANCE_ALPHA_INTEGER_EXT                     0x8D9D\r
+#define GL_RGBA_INTEGER_MODE_EXT                           0x8D9E\r
+#ifndef GLEE_H_DEFINED_glTexParameterIivEXT\r
+#define GLEE_H_DEFINED_glTexParameterIivEXT\r
+  typedef void (APIENTRYP GLEEPFNGLTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, const GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLTEXPARAMETERIIVEXTPROC GLeeFuncPtr_glTexParameterIivEXT;\r
+  #define glTexParameterIivEXT GLeeFuncPtr_glTexParameterIivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTexParameterIuivEXT\r
+#define GLEE_H_DEFINED_glTexParameterIuivEXT\r
+  typedef void (APIENTRYP GLEEPFNGLTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, const GLuint * params);\r
+  GLEE_EXTERN GLEEPFNGLTEXPARAMETERIUIVEXTPROC GLeeFuncPtr_glTexParameterIuivEXT;\r
+  #define glTexParameterIuivEXT GLeeFuncPtr_glTexParameterIuivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetTexParameterIivEXT\r
+#define GLEE_H_DEFINED_glGetTexParameterIivEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETTEXPARAMETERIIVEXTPROC GLeeFuncPtr_glGetTexParameterIivEXT;\r
+  #define glGetTexParameterIivEXT GLeeFuncPtr_glGetTexParameterIivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetTexParameterIuivEXT\r
+#define GLEE_H_DEFINED_glGetTexParameterIuivEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, GLuint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETTEXPARAMETERIUIVEXTPROC GLeeFuncPtr_glGetTexParameterIuivEXT;\r
+  #define glGetTexParameterIuivEXT GLeeFuncPtr_glGetTexParameterIuivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glClearColorIiEXT\r
+#define GLEE_H_DEFINED_glClearColorIiEXT\r
+  typedef void (APIENTRYP GLEEPFNGLCLEARCOLORIIEXTPROC) (GLint red, GLint green, GLint blue, GLint alpha);\r
+  GLEE_EXTERN GLEEPFNGLCLEARCOLORIIEXTPROC GLeeFuncPtr_glClearColorIiEXT;\r
+  #define glClearColorIiEXT GLeeFuncPtr_glClearColorIiEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glClearColorIuiEXT\r
+#define GLEE_H_DEFINED_glClearColorIuiEXT\r
+  typedef void (APIENTRYP GLEEPFNGLCLEARCOLORIUIEXTPROC) (GLuint red, GLuint green, GLuint blue, GLuint alpha);\r
+  GLEE_EXTERN GLEEPFNGLCLEARCOLORIUIEXTPROC GLeeFuncPtr_glClearColorIuiEXT;\r
+  #define glClearColorIuiEXT GLeeFuncPtr_glClearColorIuiEXT\r
+#endif\r
+#endif \r
+\r
+/* GL_GREMEDY_frame_terminator */\r
+\r
+#ifndef GL_GREMEDY_frame_terminator\r
+#define GL_GREMEDY_frame_terminator 1\r
+#define __GLEE_GL_GREMEDY_frame_terminator 1\r
+/* Constants */\r
+#ifndef GLEE_H_DEFINED_glFrameTerminatorGREMEDY\r
+#define GLEE_H_DEFINED_glFrameTerminatorGREMEDY\r
+  typedef void (APIENTRYP GLEEPFNGLFRAMETERMINATORGREMEDYPROC) ();\r
+  GLEE_EXTERN GLEEPFNGLFRAMETERMINATORGREMEDYPROC GLeeFuncPtr_glFrameTerminatorGREMEDY;\r
+  #define glFrameTerminatorGREMEDY GLeeFuncPtr_glFrameTerminatorGREMEDY\r
+#endif\r
+#endif \r
+\r
+/* GL_NV_conditional_render */\r
+\r
+#ifndef GL_NV_conditional_render\r
+#define GL_NV_conditional_render 1\r
+#define __GLEE_GL_NV_conditional_render 1\r
+/* Constants */\r
+#define GL_QUERY_WAIT_NV                                   0x8E13\r
+#define GL_QUERY_NO_WAIT_NV                                0x8E14\r
+#define GL_QUERY_BY_REGION_WAIT_NV                         0x8E15\r
+#define GL_QUERY_BY_REGION_NO_WAIT_NV                      0x8E16\r
+#ifndef GLEE_H_DEFINED_glBeginConditionalRenderNV\r
+#define GLEE_H_DEFINED_glBeginConditionalRenderNV\r
+  typedef void (APIENTRYP GLEEPFNGLBEGINCONDITIONALRENDERNVPROC) (GLuint id, GLenum mode);\r
+  GLEE_EXTERN GLEEPFNGLBEGINCONDITIONALRENDERNVPROC GLeeFuncPtr_glBeginConditionalRenderNV;\r
+  #define glBeginConditionalRenderNV GLeeFuncPtr_glBeginConditionalRenderNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glEndConditionalRenderNV\r
+#define GLEE_H_DEFINED_glEndConditionalRenderNV\r
+  typedef void (APIENTRYP GLEEPFNGLENDCONDITIONALRENDERNVPROC) ();\r
+  GLEE_EXTERN GLEEPFNGLENDCONDITIONALRENDERNVPROC GLeeFuncPtr_glEndConditionalRenderNV;\r
+  #define glEndConditionalRenderNV GLeeFuncPtr_glEndConditionalRenderNV\r
+#endif\r
+#endif \r
+\r
+/* GL_NV_present_video */\r
+\r
+#ifndef GL_NV_present_video\r
+#define GL_NV_present_video 1\r
+#define __GLEE_GL_NV_present_video 1\r
+/* Constants */\r
+#define GL_FRAME_NV                                        0x8E26\r
+#define GL_FIELDS_NV                                       0x8E27\r
+#define GL_CURRENT_TIME_NV                                 0x8E28\r
+#define GL_NUM_FILL_STREAMS_NV                             0x8E29\r
+#define GL_PRESENT_TIME_NV                                 0x8E2A\r
+#define GL_PRESENT_DURATION_NV                             0x8E2B\r
+#endif \r
+\r
+/* GL_EXT_transform_feedback */\r
+\r
+#ifndef GL_EXT_transform_feedback\r
+#define GL_EXT_transform_feedback 1\r
+#define __GLEE_GL_EXT_transform_feedback 1\r
+/* Constants */\r
+#define GL_TRANSFORM_FEEDBACK_BUFFER_EXT                   0x8C8E\r
+#define GL_TRANSFORM_FEEDBACK_BUFFER_START_EXT             0x8C84\r
+#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_EXT              0x8C85\r
+#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_EXT           0x8C8F\r
+#define GL_INTERLEAVED_ATTRIBS_EXT                         0x8C8C\r
+#define GL_SEPARATE_ATTRIBS_EXT                            0x8C8D\r
+#define GL_PRIMITIVES_GENERATED_EXT                        0x8C87\r
+#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_EXT       0x8C88\r
+#define GL_RASTERIZER_DISCARD_EXT                          0x8C89\r
+#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_EXT 0x8C8A\r
+#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_EXT     0x8C8B\r
+#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_EXT  0x8C80\r
+#define GL_TRANSFORM_FEEDBACK_VARYINGS_EXT                 0x8C83\r
+#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_EXT              0x8C7F\r
+#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH_EXT       0x8C76\r
+#ifndef GLEE_H_DEFINED_glBeginTransformFeedbackEXT\r
+#define GLEE_H_DEFINED_glBeginTransformFeedbackEXT\r
+  typedef void (APIENTRYP GLEEPFNGLBEGINTRANSFORMFEEDBACKEXTPROC) (GLenum primitiveMode);\r
+  GLEE_EXTERN GLEEPFNGLBEGINTRANSFORMFEEDBACKEXTPROC GLeeFuncPtr_glBeginTransformFeedbackEXT;\r
+  #define glBeginTransformFeedbackEXT GLeeFuncPtr_glBeginTransformFeedbackEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glEndTransformFeedbackEXT\r
+#define GLEE_H_DEFINED_glEndTransformFeedbackEXT\r
+  typedef void (APIENTRYP GLEEPFNGLENDTRANSFORMFEEDBACKEXTPROC) ();\r
+  GLEE_EXTERN GLEEPFNGLENDTRANSFORMFEEDBACKEXTPROC GLeeFuncPtr_glEndTransformFeedbackEXT;\r
+  #define glEndTransformFeedbackEXT GLeeFuncPtr_glEndTransformFeedbackEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glBindBufferRangeEXT\r
+#define GLEE_H_DEFINED_glBindBufferRangeEXT\r
+  typedef void (APIENTRYP GLEEPFNGLBINDBUFFERRANGEEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);\r
+  GLEE_EXTERN GLEEPFNGLBINDBUFFERRANGEEXTPROC GLeeFuncPtr_glBindBufferRangeEXT;\r
+  #define glBindBufferRangeEXT GLeeFuncPtr_glBindBufferRangeEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glBindBufferOffsetEXT\r
+#define GLEE_H_DEFINED_glBindBufferOffsetEXT\r
+  typedef void (APIENTRYP GLEEPFNGLBINDBUFFEROFFSETEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset);\r
+  GLEE_EXTERN GLEEPFNGLBINDBUFFEROFFSETEXTPROC GLeeFuncPtr_glBindBufferOffsetEXT;\r
+  #define glBindBufferOffsetEXT GLeeFuncPtr_glBindBufferOffsetEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glBindBufferBaseEXT\r
+#define GLEE_H_DEFINED_glBindBufferBaseEXT\r
+  typedef void (APIENTRYP GLEEPFNGLBINDBUFFERBASEEXTPROC) (GLenum target, GLuint index, GLuint buffer);\r
+  GLEE_EXTERN GLEEPFNGLBINDBUFFERBASEEXTPROC GLeeFuncPtr_glBindBufferBaseEXT;\r
+  #define glBindBufferBaseEXT GLeeFuncPtr_glBindBufferBaseEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTransformFeedbackVaryingsEXT\r
+#define GLEE_H_DEFINED_glTransformFeedbackVaryingsEXT\r
+  typedef void (APIENTRYP GLEEPFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC) (GLuint program, GLsizei count, const GLint * locations, GLenum bufferMode);\r
+  GLEE_EXTERN GLEEPFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC GLeeFuncPtr_glTransformFeedbackVaryingsEXT;\r
+  #define glTransformFeedbackVaryingsEXT GLeeFuncPtr_glTransformFeedbackVaryingsEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetTransformFeedbackVaryingEXT\r
+#define GLEE_H_DEFINED_glGetTransformFeedbackVaryingEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC) (GLuint program, GLuint index, GLint * location);\r
+  GLEE_EXTERN GLEEPFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC GLeeFuncPtr_glGetTransformFeedbackVaryingEXT;\r
+  #define glGetTransformFeedbackVaryingEXT GLeeFuncPtr_glGetTransformFeedbackVaryingEXT\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_direct_state_access */\r
+\r
+#ifndef GL_EXT_direct_state_access\r
+#define GL_EXT_direct_state_access 1\r
+#define __GLEE_GL_EXT_direct_state_access 1\r
+/* Constants */\r
+#define GL_PROGRAM_MATRIX_EXT                              0x8E2D\r
+#define GL_TRANSPOSE_PROGRAM_MATRIX_EXT                    0x8E2E\r
+#define GL_PROGRAM_MATRIX_STACK_DEPTH_EXT                  0x8E2F\r
+#ifndef GLEE_H_DEFINED_glClientAttribDefaultEXT\r
+#define GLEE_H_DEFINED_glClientAttribDefaultEXT\r
+  typedef void (APIENTRYP GLEEPFNGLCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask);\r
+  GLEE_EXTERN GLEEPFNGLCLIENTATTRIBDEFAULTEXTPROC GLeeFuncPtr_glClientAttribDefaultEXT;\r
+  #define glClientAttribDefaultEXT GLeeFuncPtr_glClientAttribDefaultEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glPushClientAttribDefaultEXT\r
+#define GLEE_H_DEFINED_glPushClientAttribDefaultEXT\r
+  typedef void (APIENTRYP GLEEPFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask);\r
+  GLEE_EXTERN GLEEPFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC GLeeFuncPtr_glPushClientAttribDefaultEXT;\r
+  #define glPushClientAttribDefaultEXT GLeeFuncPtr_glPushClientAttribDefaultEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMatrixLoadfEXT\r
+#define GLEE_H_DEFINED_glMatrixLoadfEXT\r
+  typedef void (APIENTRYP GLEEPFNGLMATRIXLOADFEXTPROC) (GLenum mode, const GLfloat * m);\r
+  GLEE_EXTERN GLEEPFNGLMATRIXLOADFEXTPROC GLeeFuncPtr_glMatrixLoadfEXT;\r
+  #define glMatrixLoadfEXT GLeeFuncPtr_glMatrixLoadfEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMatrixLoaddEXT\r
+#define GLEE_H_DEFINED_glMatrixLoaddEXT\r
+  typedef void (APIENTRYP GLEEPFNGLMATRIXLOADDEXTPROC) (GLenum mode, const GLdouble * m);\r
+  GLEE_EXTERN GLEEPFNGLMATRIXLOADDEXTPROC GLeeFuncPtr_glMatrixLoaddEXT;\r
+  #define glMatrixLoaddEXT GLeeFuncPtr_glMatrixLoaddEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMatrixMultfEXT\r
+#define GLEE_H_DEFINED_glMatrixMultfEXT\r
+  typedef void (APIENTRYP GLEEPFNGLMATRIXMULTFEXTPROC) (GLenum mode, const GLfloat * m);\r
+  GLEE_EXTERN GLEEPFNGLMATRIXMULTFEXTPROC GLeeFuncPtr_glMatrixMultfEXT;\r
+  #define glMatrixMultfEXT GLeeFuncPtr_glMatrixMultfEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMatrixMultdEXT\r
+#define GLEE_H_DEFINED_glMatrixMultdEXT\r
+  typedef void (APIENTRYP GLEEPFNGLMATRIXMULTDEXTPROC) (GLenum mode, const GLdouble * m);\r
+  GLEE_EXTERN GLEEPFNGLMATRIXMULTDEXTPROC GLeeFuncPtr_glMatrixMultdEXT;\r
+  #define glMatrixMultdEXT GLeeFuncPtr_glMatrixMultdEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMatrixLoadIdentityEXT\r
+#define GLEE_H_DEFINED_glMatrixLoadIdentityEXT\r
+  typedef void (APIENTRYP GLEEPFNGLMATRIXLOADIDENTITYEXTPROC) (GLenum mode);\r
+  GLEE_EXTERN GLEEPFNGLMATRIXLOADIDENTITYEXTPROC GLeeFuncPtr_glMatrixLoadIdentityEXT;\r
+  #define glMatrixLoadIdentityEXT GLeeFuncPtr_glMatrixLoadIdentityEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMatrixRotatefEXT\r
+#define GLEE_H_DEFINED_glMatrixRotatefEXT\r
+  typedef void (APIENTRYP GLEEPFNGLMATRIXROTATEFEXTPROC) (GLenum mode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z);\r
+  GLEE_EXTERN GLEEPFNGLMATRIXROTATEFEXTPROC GLeeFuncPtr_glMatrixRotatefEXT;\r
+  #define glMatrixRotatefEXT GLeeFuncPtr_glMatrixRotatefEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMatrixRotatedEXT\r
+#define GLEE_H_DEFINED_glMatrixRotatedEXT\r
+  typedef void (APIENTRYP GLEEPFNGLMATRIXROTATEDEXTPROC) (GLenum mode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z);\r
+  GLEE_EXTERN GLEEPFNGLMATRIXROTATEDEXTPROC GLeeFuncPtr_glMatrixRotatedEXT;\r
+  #define glMatrixRotatedEXT GLeeFuncPtr_glMatrixRotatedEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMatrixScalefEXT\r
+#define GLEE_H_DEFINED_glMatrixScalefEXT\r
+  typedef void (APIENTRYP GLEEPFNGLMATRIXSCALEFEXTPROC) (GLenum mode, GLfloat x, GLfloat y, GLfloat z);\r
+  GLEE_EXTERN GLEEPFNGLMATRIXSCALEFEXTPROC GLeeFuncPtr_glMatrixScalefEXT;\r
+  #define glMatrixScalefEXT GLeeFuncPtr_glMatrixScalefEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMatrixScaledEXT\r
+#define GLEE_H_DEFINED_glMatrixScaledEXT\r
+  typedef void (APIENTRYP GLEEPFNGLMATRIXSCALEDEXTPROC) (GLenum mode, GLdouble x, GLdouble y, GLdouble z);\r
+  GLEE_EXTERN GLEEPFNGLMATRIXSCALEDEXTPROC GLeeFuncPtr_glMatrixScaledEXT;\r
+  #define glMatrixScaledEXT GLeeFuncPtr_glMatrixScaledEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMatrixTranslatefEXT\r
+#define GLEE_H_DEFINED_glMatrixTranslatefEXT\r
+  typedef void (APIENTRYP GLEEPFNGLMATRIXTRANSLATEFEXTPROC) (GLenum mode, GLfloat x, GLfloat y, GLfloat z);\r
+  GLEE_EXTERN GLEEPFNGLMATRIXTRANSLATEFEXTPROC GLeeFuncPtr_glMatrixTranslatefEXT;\r
+  #define glMatrixTranslatefEXT GLeeFuncPtr_glMatrixTranslatefEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMatrixTranslatedEXT\r
+#define GLEE_H_DEFINED_glMatrixTranslatedEXT\r
+  typedef void (APIENTRYP GLEEPFNGLMATRIXTRANSLATEDEXTPROC) (GLenum mode, GLdouble x, GLdouble y, GLdouble z);\r
+  GLEE_EXTERN GLEEPFNGLMATRIXTRANSLATEDEXTPROC GLeeFuncPtr_glMatrixTranslatedEXT;\r
+  #define glMatrixTranslatedEXT GLeeFuncPtr_glMatrixTranslatedEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMatrixFrustumEXT\r
+#define GLEE_H_DEFINED_glMatrixFrustumEXT\r
+  typedef void (APIENTRYP GLEEPFNGLMATRIXFRUSTUMEXTPROC) (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);\r
+  GLEE_EXTERN GLEEPFNGLMATRIXFRUSTUMEXTPROC GLeeFuncPtr_glMatrixFrustumEXT;\r
+  #define glMatrixFrustumEXT GLeeFuncPtr_glMatrixFrustumEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMatrixOrthoEXT\r
+#define GLEE_H_DEFINED_glMatrixOrthoEXT\r
+  typedef void (APIENTRYP GLEEPFNGLMATRIXORTHOEXTPROC) (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);\r
+  GLEE_EXTERN GLEEPFNGLMATRIXORTHOEXTPROC GLeeFuncPtr_glMatrixOrthoEXT;\r
+  #define glMatrixOrthoEXT GLeeFuncPtr_glMatrixOrthoEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMatrixPopEXT\r
+#define GLEE_H_DEFINED_glMatrixPopEXT\r
+  typedef void (APIENTRYP GLEEPFNGLMATRIXPOPEXTPROC) (GLenum mode);\r
+  GLEE_EXTERN GLEEPFNGLMATRIXPOPEXTPROC GLeeFuncPtr_glMatrixPopEXT;\r
+  #define glMatrixPopEXT GLeeFuncPtr_glMatrixPopEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMatrixPushEXT\r
+#define GLEE_H_DEFINED_glMatrixPushEXT\r
+  typedef void (APIENTRYP GLEEPFNGLMATRIXPUSHEXTPROC) (GLenum mode);\r
+  GLEE_EXTERN GLEEPFNGLMATRIXPUSHEXTPROC GLeeFuncPtr_glMatrixPushEXT;\r
+  #define glMatrixPushEXT GLeeFuncPtr_glMatrixPushEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMatrixLoadTransposefEXT\r
+#define GLEE_H_DEFINED_glMatrixLoadTransposefEXT\r
+  typedef void (APIENTRYP GLEEPFNGLMATRIXLOADTRANSPOSEFEXTPROC) (GLenum mode, const GLfloat * m);\r
+  GLEE_EXTERN GLEEPFNGLMATRIXLOADTRANSPOSEFEXTPROC GLeeFuncPtr_glMatrixLoadTransposefEXT;\r
+  #define glMatrixLoadTransposefEXT GLeeFuncPtr_glMatrixLoadTransposefEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMatrixLoadTransposedEXT\r
+#define GLEE_H_DEFINED_glMatrixLoadTransposedEXT\r
+  typedef void (APIENTRYP GLEEPFNGLMATRIXLOADTRANSPOSEDEXTPROC) (GLenum mode, const GLdouble * m);\r
+  GLEE_EXTERN GLEEPFNGLMATRIXLOADTRANSPOSEDEXTPROC GLeeFuncPtr_glMatrixLoadTransposedEXT;\r
+  #define glMatrixLoadTransposedEXT GLeeFuncPtr_glMatrixLoadTransposedEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMatrixMultTransposefEXT\r
+#define GLEE_H_DEFINED_glMatrixMultTransposefEXT\r
+  typedef void (APIENTRYP GLEEPFNGLMATRIXMULTTRANSPOSEFEXTPROC) (GLenum mode, const GLfloat * m);\r
+  GLEE_EXTERN GLEEPFNGLMATRIXMULTTRANSPOSEFEXTPROC GLeeFuncPtr_glMatrixMultTransposefEXT;\r
+  #define glMatrixMultTransposefEXT GLeeFuncPtr_glMatrixMultTransposefEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMatrixMultTransposedEXT\r
+#define GLEE_H_DEFINED_glMatrixMultTransposedEXT\r
+  typedef void (APIENTRYP GLEEPFNGLMATRIXMULTTRANSPOSEDEXTPROC) (GLenum mode, const GLdouble * m);\r
+  GLEE_EXTERN GLEEPFNGLMATRIXMULTTRANSPOSEDEXTPROC GLeeFuncPtr_glMatrixMultTransposedEXT;\r
+  #define glMatrixMultTransposedEXT GLeeFuncPtr_glMatrixMultTransposedEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTextureParameterfEXT\r
+#define GLEE_H_DEFINED_glTextureParameterfEXT\r
+  typedef void (APIENTRYP GLEEPFNGLTEXTUREPARAMETERFEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat param);\r
+  GLEE_EXTERN GLEEPFNGLTEXTUREPARAMETERFEXTPROC GLeeFuncPtr_glTextureParameterfEXT;\r
+  #define glTextureParameterfEXT GLeeFuncPtr_glTextureParameterfEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTextureParameterfvEXT\r
+#define GLEE_H_DEFINED_glTextureParameterfvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLTEXTUREPARAMETERFVEXTPROC GLeeFuncPtr_glTextureParameterfvEXT;\r
+  #define glTextureParameterfvEXT GLeeFuncPtr_glTextureParameterfvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTextureParameteriEXT\r
+#define GLEE_H_DEFINED_glTextureParameteriEXT\r
+  typedef void (APIENTRYP GLEEPFNGLTEXTUREPARAMETERIEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint param);\r
+  GLEE_EXTERN GLEEPFNGLTEXTUREPARAMETERIEXTPROC GLeeFuncPtr_glTextureParameteriEXT;\r
+  #define glTextureParameteriEXT GLeeFuncPtr_glTextureParameteriEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTextureParameterivEXT\r
+#define GLEE_H_DEFINED_glTextureParameterivEXT\r
+  typedef void (APIENTRYP GLEEPFNGLTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLTEXTUREPARAMETERIVEXTPROC GLeeFuncPtr_glTextureParameterivEXT;\r
+  #define glTextureParameterivEXT GLeeFuncPtr_glTextureParameterivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTextureImage1DEXT\r
+#define GLEE_H_DEFINED_glTextureImage1DEXT\r
+  typedef void (APIENTRYP GLEEPFNGLTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid * pixels);\r
+  GLEE_EXTERN GLEEPFNGLTEXTUREIMAGE1DEXTPROC GLeeFuncPtr_glTextureImage1DEXT;\r
+  #define glTextureImage1DEXT GLeeFuncPtr_glTextureImage1DEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTextureImage2DEXT\r
+#define GLEE_H_DEFINED_glTextureImage2DEXT\r
+  typedef void (APIENTRYP GLEEPFNGLTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid * pixels);\r
+  GLEE_EXTERN GLEEPFNGLTEXTUREIMAGE2DEXTPROC GLeeFuncPtr_glTextureImage2DEXT;\r
+  #define glTextureImage2DEXT GLeeFuncPtr_glTextureImage2DEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTextureSubImage1DEXT\r
+#define GLEE_H_DEFINED_glTextureSubImage1DEXT\r
+  typedef void (APIENTRYP GLEEPFNGLTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid * pixels);\r
+  GLEE_EXTERN GLEEPFNGLTEXTURESUBIMAGE1DEXTPROC GLeeFuncPtr_glTextureSubImage1DEXT;\r
+  #define glTextureSubImage1DEXT GLeeFuncPtr_glTextureSubImage1DEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTextureSubImage2DEXT\r
+#define GLEE_H_DEFINED_glTextureSubImage2DEXT\r
+  typedef void (APIENTRYP GLEEPFNGLTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * pixels);\r
+  GLEE_EXTERN GLEEPFNGLTEXTURESUBIMAGE2DEXTPROC GLeeFuncPtr_glTextureSubImage2DEXT;\r
+  #define glTextureSubImage2DEXT GLeeFuncPtr_glTextureSubImage2DEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glCopyTextureImage1DEXT\r
+#define GLEE_H_DEFINED_glCopyTextureImage1DEXT\r
+  typedef void (APIENTRYP GLEEPFNGLCOPYTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);\r
+  GLEE_EXTERN GLEEPFNGLCOPYTEXTUREIMAGE1DEXTPROC GLeeFuncPtr_glCopyTextureImage1DEXT;\r
+  #define glCopyTextureImage1DEXT GLeeFuncPtr_glCopyTextureImage1DEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glCopyTextureImage2DEXT\r
+#define GLEE_H_DEFINED_glCopyTextureImage2DEXT\r
+  typedef void (APIENTRYP GLEEPFNGLCOPYTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);\r
+  GLEE_EXTERN GLEEPFNGLCOPYTEXTUREIMAGE2DEXTPROC GLeeFuncPtr_glCopyTextureImage2DEXT;\r
+  #define glCopyTextureImage2DEXT GLeeFuncPtr_glCopyTextureImage2DEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glCopyTextureSubImage1DEXT\r
+#define GLEE_H_DEFINED_glCopyTextureSubImage1DEXT\r
+  typedef void (APIENTRYP GLEEPFNGLCOPYTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);\r
+  GLEE_EXTERN GLEEPFNGLCOPYTEXTURESUBIMAGE1DEXTPROC GLeeFuncPtr_glCopyTextureSubImage1DEXT;\r
+  #define glCopyTextureSubImage1DEXT GLeeFuncPtr_glCopyTextureSubImage1DEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glCopyTextureSubImage2DEXT\r
+#define GLEE_H_DEFINED_glCopyTextureSubImage2DEXT\r
+  typedef void (APIENTRYP GLEEPFNGLCOPYTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);\r
+  GLEE_EXTERN GLEEPFNGLCOPYTEXTURESUBIMAGE2DEXTPROC GLeeFuncPtr_glCopyTextureSubImage2DEXT;\r
+  #define glCopyTextureSubImage2DEXT GLeeFuncPtr_glCopyTextureSubImage2DEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetTextureImageEXT\r
+#define GLEE_H_DEFINED_glGetTextureImageEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, GLvoid * pixels);\r
+  GLEE_EXTERN GLEEPFNGLGETTEXTUREIMAGEEXTPROC GLeeFuncPtr_glGetTextureImageEXT;\r
+  #define glGetTextureImageEXT GLeeFuncPtr_glGetTextureImageEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetTextureParameterfvEXT\r
+#define GLEE_H_DEFINED_glGetTextureParameterfvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLGETTEXTUREPARAMETERFVEXTPROC GLeeFuncPtr_glGetTextureParameterfvEXT;\r
+  #define glGetTextureParameterfvEXT GLeeFuncPtr_glGetTextureParameterfvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetTextureParameterivEXT\r
+#define GLEE_H_DEFINED_glGetTextureParameterivEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETTEXTUREPARAMETERIVEXTPROC GLeeFuncPtr_glGetTextureParameterivEXT;\r
+  #define glGetTextureParameterivEXT GLeeFuncPtr_glGetTextureParameterivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetTextureLevelParameterfvEXT\r
+#define GLEE_H_DEFINED_glGetTextureLevelParameterfvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETTEXTURELEVELPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLGETTEXTURELEVELPARAMETERFVEXTPROC GLeeFuncPtr_glGetTextureLevelParameterfvEXT;\r
+  #define glGetTextureLevelParameterfvEXT GLeeFuncPtr_glGetTextureLevelParameterfvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetTextureLevelParameterivEXT\r
+#define GLEE_H_DEFINED_glGetTextureLevelParameterivEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETTEXTURELEVELPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETTEXTURELEVELPARAMETERIVEXTPROC GLeeFuncPtr_glGetTextureLevelParameterivEXT;\r
+  #define glGetTextureLevelParameterivEXT GLeeFuncPtr_glGetTextureLevelParameterivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTextureImage3DEXT\r
+#define GLEE_H_DEFINED_glTextureImage3DEXT\r
+  typedef void (APIENTRYP GLEEPFNGLTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid * pixels);\r
+  GLEE_EXTERN GLEEPFNGLTEXTUREIMAGE3DEXTPROC GLeeFuncPtr_glTextureImage3DEXT;\r
+  #define glTextureImage3DEXT GLeeFuncPtr_glTextureImage3DEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTextureSubImage3DEXT\r
+#define GLEE_H_DEFINED_glTextureSubImage3DEXT\r
+  typedef void (APIENTRYP GLEEPFNGLTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid * pixels);\r
+  GLEE_EXTERN GLEEPFNGLTEXTURESUBIMAGE3DEXTPROC GLeeFuncPtr_glTextureSubImage3DEXT;\r
+  #define glTextureSubImage3DEXT GLeeFuncPtr_glTextureSubImage3DEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glCopyTextureSubImage3DEXT\r
+#define GLEE_H_DEFINED_glCopyTextureSubImage3DEXT\r
+  typedef void (APIENTRYP GLEEPFNGLCOPYTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);\r
+  GLEE_EXTERN GLEEPFNGLCOPYTEXTURESUBIMAGE3DEXTPROC GLeeFuncPtr_glCopyTextureSubImage3DEXT;\r
+  #define glCopyTextureSubImage3DEXT GLeeFuncPtr_glCopyTextureSubImage3DEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexParameterfEXT\r
+#define GLEE_H_DEFINED_glMultiTexParameterfEXT\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXPARAMETERFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXPARAMETERFEXTPROC GLeeFuncPtr_glMultiTexParameterfEXT;\r
+  #define glMultiTexParameterfEXT GLeeFuncPtr_glMultiTexParameterfEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexParameterfvEXT\r
+#define GLEE_H_DEFINED_glMultiTexParameterfvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXPARAMETERFVEXTPROC GLeeFuncPtr_glMultiTexParameterfvEXT;\r
+  #define glMultiTexParameterfvEXT GLeeFuncPtr_glMultiTexParameterfvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexParameteriEXT\r
+#define GLEE_H_DEFINED_glMultiTexParameteriEXT\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXPARAMETERIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXPARAMETERIEXTPROC GLeeFuncPtr_glMultiTexParameteriEXT;\r
+  #define glMultiTexParameteriEXT GLeeFuncPtr_glMultiTexParameteriEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexParameterivEXT\r
+#define GLEE_H_DEFINED_glMultiTexParameterivEXT\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXPARAMETERIVEXTPROC GLeeFuncPtr_glMultiTexParameterivEXT;\r
+  #define glMultiTexParameterivEXT GLeeFuncPtr_glMultiTexParameterivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexImage1DEXT\r
+#define GLEE_H_DEFINED_glMultiTexImage1DEXT\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid * pixels);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXIMAGE1DEXTPROC GLeeFuncPtr_glMultiTexImage1DEXT;\r
+  #define glMultiTexImage1DEXT GLeeFuncPtr_glMultiTexImage1DEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexImage2DEXT\r
+#define GLEE_H_DEFINED_glMultiTexImage2DEXT\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid * pixels);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXIMAGE2DEXTPROC GLeeFuncPtr_glMultiTexImage2DEXT;\r
+  #define glMultiTexImage2DEXT GLeeFuncPtr_glMultiTexImage2DEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexSubImage1DEXT\r
+#define GLEE_H_DEFINED_glMultiTexSubImage1DEXT\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid * pixels);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXSUBIMAGE1DEXTPROC GLeeFuncPtr_glMultiTexSubImage1DEXT;\r
+  #define glMultiTexSubImage1DEXT GLeeFuncPtr_glMultiTexSubImage1DEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexSubImage2DEXT\r
+#define GLEE_H_DEFINED_glMultiTexSubImage2DEXT\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * pixels);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXSUBIMAGE2DEXTPROC GLeeFuncPtr_glMultiTexSubImage2DEXT;\r
+  #define glMultiTexSubImage2DEXT GLeeFuncPtr_glMultiTexSubImage2DEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glCopyMultiTexImage1DEXT\r
+#define GLEE_H_DEFINED_glCopyMultiTexImage1DEXT\r
+  typedef void (APIENTRYP GLEEPFNGLCOPYMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border);\r
+  GLEE_EXTERN GLEEPFNGLCOPYMULTITEXIMAGE1DEXTPROC GLeeFuncPtr_glCopyMultiTexImage1DEXT;\r
+  #define glCopyMultiTexImage1DEXT GLeeFuncPtr_glCopyMultiTexImage1DEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glCopyMultiTexImage2DEXT\r
+#define GLEE_H_DEFINED_glCopyMultiTexImage2DEXT\r
+  typedef void (APIENTRYP GLEEPFNGLCOPYMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);\r
+  GLEE_EXTERN GLEEPFNGLCOPYMULTITEXIMAGE2DEXTPROC GLeeFuncPtr_glCopyMultiTexImage2DEXT;\r
+  #define glCopyMultiTexImage2DEXT GLeeFuncPtr_glCopyMultiTexImage2DEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glCopyMultiTexSubImage1DEXT\r
+#define GLEE_H_DEFINED_glCopyMultiTexSubImage1DEXT\r
+  typedef void (APIENTRYP GLEEPFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);\r
+  GLEE_EXTERN GLEEPFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC GLeeFuncPtr_glCopyMultiTexSubImage1DEXT;\r
+  #define glCopyMultiTexSubImage1DEXT GLeeFuncPtr_glCopyMultiTexSubImage1DEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glCopyMultiTexSubImage2DEXT\r
+#define GLEE_H_DEFINED_glCopyMultiTexSubImage2DEXT\r
+  typedef void (APIENTRYP GLEEPFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);\r
+  GLEE_EXTERN GLEEPFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC GLeeFuncPtr_glCopyMultiTexSubImage2DEXT;\r
+  #define glCopyMultiTexSubImage2DEXT GLeeFuncPtr_glCopyMultiTexSubImage2DEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetMultiTexImageEXT\r
+#define GLEE_H_DEFINED_glGetMultiTexImageEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, GLvoid * pixels);\r
+  GLEE_EXTERN GLEEPFNGLGETMULTITEXIMAGEEXTPROC GLeeFuncPtr_glGetMultiTexImageEXT;\r
+  #define glGetMultiTexImageEXT GLeeFuncPtr_glGetMultiTexImageEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetMultiTexParameterfvEXT\r
+#define GLEE_H_DEFINED_glGetMultiTexParameterfvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLGETMULTITEXPARAMETERFVEXTPROC GLeeFuncPtr_glGetMultiTexParameterfvEXT;\r
+  #define glGetMultiTexParameterfvEXT GLeeFuncPtr_glGetMultiTexParameterfvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetMultiTexParameterivEXT\r
+#define GLEE_H_DEFINED_glGetMultiTexParameterivEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETMULTITEXPARAMETERIVEXTPROC GLeeFuncPtr_glGetMultiTexParameterivEXT;\r
+  #define glGetMultiTexParameterivEXT GLeeFuncPtr_glGetMultiTexParameterivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetMultiTexLevelParameterfvEXT\r
+#define GLEE_H_DEFINED_glGetMultiTexLevelParameterfvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC GLeeFuncPtr_glGetMultiTexLevelParameterfvEXT;\r
+  #define glGetMultiTexLevelParameterfvEXT GLeeFuncPtr_glGetMultiTexLevelParameterfvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetMultiTexLevelParameterivEXT\r
+#define GLEE_H_DEFINED_glGetMultiTexLevelParameterivEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC GLeeFuncPtr_glGetMultiTexLevelParameterivEXT;\r
+  #define glGetMultiTexLevelParameterivEXT GLeeFuncPtr_glGetMultiTexLevelParameterivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexImage3DEXT\r
+#define GLEE_H_DEFINED_glMultiTexImage3DEXT\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid * pixels);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXIMAGE3DEXTPROC GLeeFuncPtr_glMultiTexImage3DEXT;\r
+  #define glMultiTexImage3DEXT GLeeFuncPtr_glMultiTexImage3DEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexSubImage3DEXT\r
+#define GLEE_H_DEFINED_glMultiTexSubImage3DEXT\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid * pixels);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXSUBIMAGE3DEXTPROC GLeeFuncPtr_glMultiTexSubImage3DEXT;\r
+  #define glMultiTexSubImage3DEXT GLeeFuncPtr_glMultiTexSubImage3DEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glCopyMultiTexSubImage3DEXT\r
+#define GLEE_H_DEFINED_glCopyMultiTexSubImage3DEXT\r
+  typedef void (APIENTRYP GLEEPFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);\r
+  GLEE_EXTERN GLEEPFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC GLeeFuncPtr_glCopyMultiTexSubImage3DEXT;\r
+  #define glCopyMultiTexSubImage3DEXT GLeeFuncPtr_glCopyMultiTexSubImage3DEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glBindMultiTextureEXT\r
+#define GLEE_H_DEFINED_glBindMultiTextureEXT\r
+  typedef void (APIENTRYP GLEEPFNGLBINDMULTITEXTUREEXTPROC) (GLenum texunit, GLenum target, GLuint texture);\r
+  GLEE_EXTERN GLEEPFNGLBINDMULTITEXTUREEXTPROC GLeeFuncPtr_glBindMultiTextureEXT;\r
+  #define glBindMultiTextureEXT GLeeFuncPtr_glBindMultiTextureEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glEnableClientStateIndexedEXT\r
+#define GLEE_H_DEFINED_glEnableClientStateIndexedEXT\r
+  typedef void (APIENTRYP GLEEPFNGLENABLECLIENTSTATEINDEXEDEXTPROC) (GLenum array, GLuint index);\r
+  GLEE_EXTERN GLEEPFNGLENABLECLIENTSTATEINDEXEDEXTPROC GLeeFuncPtr_glEnableClientStateIndexedEXT;\r
+  #define glEnableClientStateIndexedEXT GLeeFuncPtr_glEnableClientStateIndexedEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glDisableClientStateIndexedEXT\r
+#define GLEE_H_DEFINED_glDisableClientStateIndexedEXT\r
+  typedef void (APIENTRYP GLEEPFNGLDISABLECLIENTSTATEINDEXEDEXTPROC) (GLenum array, GLuint index);\r
+  GLEE_EXTERN GLEEPFNGLDISABLECLIENTSTATEINDEXEDEXTPROC GLeeFuncPtr_glDisableClientStateIndexedEXT;\r
+  #define glDisableClientStateIndexedEXT GLeeFuncPtr_glDisableClientStateIndexedEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexCoordPointerEXT\r
+#define GLEE_H_DEFINED_glMultiTexCoordPointerEXT\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXCOORDPOINTEREXTPROC) (GLenum texunit, GLint size, GLenum type, GLsizei stride, const GLvoid * pointer);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXCOORDPOINTEREXTPROC GLeeFuncPtr_glMultiTexCoordPointerEXT;\r
+  #define glMultiTexCoordPointerEXT GLeeFuncPtr_glMultiTexCoordPointerEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexEnvfEXT\r
+#define GLEE_H_DEFINED_glMultiTexEnvfEXT\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXENVFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXENVFEXTPROC GLeeFuncPtr_glMultiTexEnvfEXT;\r
+  #define glMultiTexEnvfEXT GLeeFuncPtr_glMultiTexEnvfEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexEnvfvEXT\r
+#define GLEE_H_DEFINED_glMultiTexEnvfvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXENVFVEXTPROC GLeeFuncPtr_glMultiTexEnvfvEXT;\r
+  #define glMultiTexEnvfvEXT GLeeFuncPtr_glMultiTexEnvfvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexEnviEXT\r
+#define GLEE_H_DEFINED_glMultiTexEnviEXT\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXENVIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXENVIEXTPROC GLeeFuncPtr_glMultiTexEnviEXT;\r
+  #define glMultiTexEnviEXT GLeeFuncPtr_glMultiTexEnviEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexEnvivEXT\r
+#define GLEE_H_DEFINED_glMultiTexEnvivEXT\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXENVIVEXTPROC GLeeFuncPtr_glMultiTexEnvivEXT;\r
+  #define glMultiTexEnvivEXT GLeeFuncPtr_glMultiTexEnvivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexGendEXT\r
+#define GLEE_H_DEFINED_glMultiTexGendEXT\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXGENDEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble param);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXGENDEXTPROC GLeeFuncPtr_glMultiTexGendEXT;\r
+  #define glMultiTexGendEXT GLeeFuncPtr_glMultiTexGendEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexGendvEXT\r
+#define GLEE_H_DEFINED_glMultiTexGendvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXGENDVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLdouble * params);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXGENDVEXTPROC GLeeFuncPtr_glMultiTexGendvEXT;\r
+  #define glMultiTexGendvEXT GLeeFuncPtr_glMultiTexGendvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexGenfEXT\r
+#define GLEE_H_DEFINED_glMultiTexGenfEXT\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXGENFEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat param);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXGENFEXTPROC GLeeFuncPtr_glMultiTexGenfEXT;\r
+  #define glMultiTexGenfEXT GLeeFuncPtr_glMultiTexGenfEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexGenfvEXT\r
+#define GLEE_H_DEFINED_glMultiTexGenfvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXGENFVEXTPROC GLeeFuncPtr_glMultiTexGenfvEXT;\r
+  #define glMultiTexGenfvEXT GLeeFuncPtr_glMultiTexGenfvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexGeniEXT\r
+#define GLEE_H_DEFINED_glMultiTexGeniEXT\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXGENIEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint param);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXGENIEXTPROC GLeeFuncPtr_glMultiTexGeniEXT;\r
+  #define glMultiTexGeniEXT GLeeFuncPtr_glMultiTexGeniEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexGenivEXT\r
+#define GLEE_H_DEFINED_glMultiTexGenivEXT\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXGENIVEXTPROC GLeeFuncPtr_glMultiTexGenivEXT;\r
+  #define glMultiTexGenivEXT GLeeFuncPtr_glMultiTexGenivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetMultiTexEnvfvEXT\r
+#define GLEE_H_DEFINED_glGetMultiTexEnvfvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLGETMULTITEXENVFVEXTPROC GLeeFuncPtr_glGetMultiTexEnvfvEXT;\r
+  #define glGetMultiTexEnvfvEXT GLeeFuncPtr_glGetMultiTexEnvfvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetMultiTexEnvivEXT\r
+#define GLEE_H_DEFINED_glGetMultiTexEnvivEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETMULTITEXENVIVEXTPROC GLeeFuncPtr_glGetMultiTexEnvivEXT;\r
+  #define glGetMultiTexEnvivEXT GLeeFuncPtr_glGetMultiTexEnvivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetMultiTexGendvEXT\r
+#define GLEE_H_DEFINED_glGetMultiTexGendvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETMULTITEXGENDVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble * params);\r
+  GLEE_EXTERN GLEEPFNGLGETMULTITEXGENDVEXTPROC GLeeFuncPtr_glGetMultiTexGendvEXT;\r
+  #define glGetMultiTexGendvEXT GLeeFuncPtr_glGetMultiTexGendvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetMultiTexGenfvEXT\r
+#define GLEE_H_DEFINED_glGetMultiTexGenfvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLGETMULTITEXGENFVEXTPROC GLeeFuncPtr_glGetMultiTexGenfvEXT;\r
+  #define glGetMultiTexGenfvEXT GLeeFuncPtr_glGetMultiTexGenfvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetMultiTexGenivEXT\r
+#define GLEE_H_DEFINED_glGetMultiTexGenivEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETMULTITEXGENIVEXTPROC GLeeFuncPtr_glGetMultiTexGenivEXT;\r
+  #define glGetMultiTexGenivEXT GLeeFuncPtr_glGetMultiTexGenivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetFloatIndexedvEXT\r
+#define GLEE_H_DEFINED_glGetFloatIndexedvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETFLOATINDEXEDVEXTPROC) (GLenum target, GLuint index, GLfloat * data);\r
+  GLEE_EXTERN GLEEPFNGLGETFLOATINDEXEDVEXTPROC GLeeFuncPtr_glGetFloatIndexedvEXT;\r
+  #define glGetFloatIndexedvEXT GLeeFuncPtr_glGetFloatIndexedvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetDoubleIndexedvEXT\r
+#define GLEE_H_DEFINED_glGetDoubleIndexedvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETDOUBLEINDEXEDVEXTPROC) (GLenum target, GLuint index, GLdouble * data);\r
+  GLEE_EXTERN GLEEPFNGLGETDOUBLEINDEXEDVEXTPROC GLeeFuncPtr_glGetDoubleIndexedvEXT;\r
+  #define glGetDoubleIndexedvEXT GLeeFuncPtr_glGetDoubleIndexedvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetPointerIndexedvEXT\r
+#define GLEE_H_DEFINED_glGetPointerIndexedvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETPOINTERINDEXEDVEXTPROC) (GLenum target, GLuint index, GLvoid* * data);\r
+  GLEE_EXTERN GLEEPFNGLGETPOINTERINDEXEDVEXTPROC GLeeFuncPtr_glGetPointerIndexedvEXT;\r
+  #define glGetPointerIndexedvEXT GLeeFuncPtr_glGetPointerIndexedvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glCompressedTextureImage3DEXT\r
+#define GLEE_H_DEFINED_glCompressedTextureImage3DEXT\r
+  typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid * bits);\r
+  GLEE_EXTERN GLEEPFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC GLeeFuncPtr_glCompressedTextureImage3DEXT;\r
+  #define glCompressedTextureImage3DEXT GLeeFuncPtr_glCompressedTextureImage3DEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glCompressedTextureImage2DEXT\r
+#define GLEE_H_DEFINED_glCompressedTextureImage2DEXT\r
+  typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid * bits);\r
+  GLEE_EXTERN GLEEPFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC GLeeFuncPtr_glCompressedTextureImage2DEXT;\r
+  #define glCompressedTextureImage2DEXT GLeeFuncPtr_glCompressedTextureImage2DEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glCompressedTextureImage1DEXT\r
+#define GLEE_H_DEFINED_glCompressedTextureImage1DEXT\r
+  typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid * bits);\r
+  GLEE_EXTERN GLEEPFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC GLeeFuncPtr_glCompressedTextureImage1DEXT;\r
+  #define glCompressedTextureImage1DEXT GLeeFuncPtr_glCompressedTextureImage1DEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glCompressedTextureSubImage3DEXT\r
+#define GLEE_H_DEFINED_glCompressedTextureSubImage3DEXT\r
+  typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid * bits);\r
+  GLEE_EXTERN GLEEPFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC GLeeFuncPtr_glCompressedTextureSubImage3DEXT;\r
+  #define glCompressedTextureSubImage3DEXT GLeeFuncPtr_glCompressedTextureSubImage3DEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glCompressedTextureSubImage2DEXT\r
+#define GLEE_H_DEFINED_glCompressedTextureSubImage2DEXT\r
+  typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid * bits);\r
+  GLEE_EXTERN GLEEPFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC GLeeFuncPtr_glCompressedTextureSubImage2DEXT;\r
+  #define glCompressedTextureSubImage2DEXT GLeeFuncPtr_glCompressedTextureSubImage2DEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glCompressedTextureSubImage1DEXT\r
+#define GLEE_H_DEFINED_glCompressedTextureSubImage1DEXT\r
+  typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid * bits);\r
+  GLEE_EXTERN GLEEPFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC GLeeFuncPtr_glCompressedTextureSubImage1DEXT;\r
+  #define glCompressedTextureSubImage1DEXT GLeeFuncPtr_glCompressedTextureSubImage1DEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetCompressedTextureImageEXT\r
+#define GLEE_H_DEFINED_glGetCompressedTextureImageEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint lod, GLvoid * img);\r
+  GLEE_EXTERN GLEEPFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC GLeeFuncPtr_glGetCompressedTextureImageEXT;\r
+  #define glGetCompressedTextureImageEXT GLeeFuncPtr_glGetCompressedTextureImageEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glCompressedMultiTexImage3DEXT\r
+#define GLEE_H_DEFINED_glCompressedMultiTexImage3DEXT\r
+  typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid * bits);\r
+  GLEE_EXTERN GLEEPFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC GLeeFuncPtr_glCompressedMultiTexImage3DEXT;\r
+  #define glCompressedMultiTexImage3DEXT GLeeFuncPtr_glCompressedMultiTexImage3DEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glCompressedMultiTexImage2DEXT\r
+#define GLEE_H_DEFINED_glCompressedMultiTexImage2DEXT\r
+  typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid * bits);\r
+  GLEE_EXTERN GLEEPFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC GLeeFuncPtr_glCompressedMultiTexImage2DEXT;\r
+  #define glCompressedMultiTexImage2DEXT GLeeFuncPtr_glCompressedMultiTexImage2DEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glCompressedMultiTexImage1DEXT\r
+#define GLEE_H_DEFINED_glCompressedMultiTexImage1DEXT\r
+  typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid * bits);\r
+  GLEE_EXTERN GLEEPFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC GLeeFuncPtr_glCompressedMultiTexImage1DEXT;\r
+  #define glCompressedMultiTexImage1DEXT GLeeFuncPtr_glCompressedMultiTexImage1DEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glCompressedMultiTexSubImage3DEXT\r
+#define GLEE_H_DEFINED_glCompressedMultiTexSubImage3DEXT\r
+  typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid * bits);\r
+  GLEE_EXTERN GLEEPFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC GLeeFuncPtr_glCompressedMultiTexSubImage3DEXT;\r
+  #define glCompressedMultiTexSubImage3DEXT GLeeFuncPtr_glCompressedMultiTexSubImage3DEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glCompressedMultiTexSubImage2DEXT\r
+#define GLEE_H_DEFINED_glCompressedMultiTexSubImage2DEXT\r
+  typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid * bits);\r
+  GLEE_EXTERN GLEEPFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC GLeeFuncPtr_glCompressedMultiTexSubImage2DEXT;\r
+  #define glCompressedMultiTexSubImage2DEXT GLeeFuncPtr_glCompressedMultiTexSubImage2DEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glCompressedMultiTexSubImage1DEXT\r
+#define GLEE_H_DEFINED_glCompressedMultiTexSubImage1DEXT\r
+  typedef void (APIENTRYP GLEEPFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid * bits);\r
+  GLEE_EXTERN GLEEPFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC GLeeFuncPtr_glCompressedMultiTexSubImage1DEXT;\r
+  #define glCompressedMultiTexSubImage1DEXT GLeeFuncPtr_glCompressedMultiTexSubImage1DEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetCompressedMultiTexImageEXT\r
+#define GLEE_H_DEFINED_glGetCompressedMultiTexImageEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint lod, GLvoid * img);\r
+  GLEE_EXTERN GLEEPFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC GLeeFuncPtr_glGetCompressedMultiTexImageEXT;\r
+  #define glGetCompressedMultiTexImageEXT GLeeFuncPtr_glGetCompressedMultiTexImageEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glNamedProgramStringEXT\r
+#define GLEE_H_DEFINED_glNamedProgramStringEXT\r
+  typedef void (APIENTRYP GLEEPFNGLNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum format, GLsizei len, const GLvoid * string);\r
+  GLEE_EXTERN GLEEPFNGLNAMEDPROGRAMSTRINGEXTPROC GLeeFuncPtr_glNamedProgramStringEXT;\r
+  #define glNamedProgramStringEXT GLeeFuncPtr_glNamedProgramStringEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glNamedProgramLocalParameter4dEXT\r
+#define GLEE_H_DEFINED_glNamedProgramLocalParameter4dEXT\r
+  typedef void (APIENTRYP GLEEPFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);\r
+  GLEE_EXTERN GLEEPFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC GLeeFuncPtr_glNamedProgramLocalParameter4dEXT;\r
+  #define glNamedProgramLocalParameter4dEXT GLeeFuncPtr_glNamedProgramLocalParameter4dEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glNamedProgramLocalParameter4dvEXT\r
+#define GLEE_H_DEFINED_glNamedProgramLocalParameter4dvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLdouble * params);\r
+  GLEE_EXTERN GLEEPFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC GLeeFuncPtr_glNamedProgramLocalParameter4dvEXT;\r
+  #define glNamedProgramLocalParameter4dvEXT GLeeFuncPtr_glNamedProgramLocalParameter4dvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glNamedProgramLocalParameter4fEXT\r
+#define GLEE_H_DEFINED_glNamedProgramLocalParameter4fEXT\r
+  typedef void (APIENTRYP GLEEPFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);\r
+  GLEE_EXTERN GLEEPFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC GLeeFuncPtr_glNamedProgramLocalParameter4fEXT;\r
+  #define glNamedProgramLocalParameter4fEXT GLeeFuncPtr_glNamedProgramLocalParameter4fEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glNamedProgramLocalParameter4fvEXT\r
+#define GLEE_H_DEFINED_glNamedProgramLocalParameter4fvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC GLeeFuncPtr_glNamedProgramLocalParameter4fvEXT;\r
+  #define glNamedProgramLocalParameter4fvEXT GLeeFuncPtr_glNamedProgramLocalParameter4fvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetNamedProgramLocalParameterdvEXT\r
+#define GLEE_H_DEFINED_glGetNamedProgramLocalParameterdvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble * params);\r
+  GLEE_EXTERN GLEEPFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC GLeeFuncPtr_glGetNamedProgramLocalParameterdvEXT;\r
+  #define glGetNamedProgramLocalParameterdvEXT GLeeFuncPtr_glGetNamedProgramLocalParameterdvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetNamedProgramLocalParameterfvEXT\r
+#define GLEE_H_DEFINED_glGetNamedProgramLocalParameterfvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC GLeeFuncPtr_glGetNamedProgramLocalParameterfvEXT;\r
+  #define glGetNamedProgramLocalParameterfvEXT GLeeFuncPtr_glGetNamedProgramLocalParameterfvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetNamedProgramivEXT\r
+#define GLEE_H_DEFINED_glGetNamedProgramivEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETNAMEDPROGRAMIVEXTPROC) (GLuint program, GLenum target, GLenum pname, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETNAMEDPROGRAMIVEXTPROC GLeeFuncPtr_glGetNamedProgramivEXT;\r
+  #define glGetNamedProgramivEXT GLeeFuncPtr_glGetNamedProgramivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetNamedProgramStringEXT\r
+#define GLEE_H_DEFINED_glGetNamedProgramStringEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum pname, GLvoid * string);\r
+  GLEE_EXTERN GLEEPFNGLGETNAMEDPROGRAMSTRINGEXTPROC GLeeFuncPtr_glGetNamedProgramStringEXT;\r
+  #define glGetNamedProgramStringEXT GLeeFuncPtr_glGetNamedProgramStringEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glNamedProgramLocalParameters4fvEXT\r
+#define GLEE_H_DEFINED_glNamedProgramLocalParameters4fvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC GLeeFuncPtr_glNamedProgramLocalParameters4fvEXT;\r
+  #define glNamedProgramLocalParameters4fvEXT GLeeFuncPtr_glNamedProgramLocalParameters4fvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glNamedProgramLocalParameterI4iEXT\r
+#define GLEE_H_DEFINED_glNamedProgramLocalParameterI4iEXT\r
+  typedef void (APIENTRYP GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC) (GLuint program, GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w);\r
+  GLEE_EXTERN GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC GLeeFuncPtr_glNamedProgramLocalParameterI4iEXT;\r
+  #define glNamedProgramLocalParameterI4iEXT GLeeFuncPtr_glNamedProgramLocalParameterI4iEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glNamedProgramLocalParameterI4ivEXT\r
+#define GLEE_H_DEFINED_glNamedProgramLocalParameterI4ivEXT\r
+  typedef void (APIENTRYP GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC GLeeFuncPtr_glNamedProgramLocalParameterI4ivEXT;\r
+  #define glNamedProgramLocalParameterI4ivEXT GLeeFuncPtr_glNamedProgramLocalParameterI4ivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glNamedProgramLocalParametersI4ivEXT\r
+#define GLEE_H_DEFINED_glNamedProgramLocalParametersI4ivEXT\r
+  typedef void (APIENTRYP GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC GLeeFuncPtr_glNamedProgramLocalParametersI4ivEXT;\r
+  #define glNamedProgramLocalParametersI4ivEXT GLeeFuncPtr_glNamedProgramLocalParametersI4ivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glNamedProgramLocalParameterI4uiEXT\r
+#define GLEE_H_DEFINED_glNamedProgramLocalParameterI4uiEXT\r
+  typedef void (APIENTRYP GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);\r
+  GLEE_EXTERN GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC GLeeFuncPtr_glNamedProgramLocalParameterI4uiEXT;\r
+  #define glNamedProgramLocalParameterI4uiEXT GLeeFuncPtr_glNamedProgramLocalParameterI4uiEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glNamedProgramLocalParameterI4uivEXT\r
+#define GLEE_H_DEFINED_glNamedProgramLocalParameterI4uivEXT\r
+  typedef void (APIENTRYP GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLuint * params);\r
+  GLEE_EXTERN GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC GLeeFuncPtr_glNamedProgramLocalParameterI4uivEXT;\r
+  #define glNamedProgramLocalParameterI4uivEXT GLeeFuncPtr_glNamedProgramLocalParameterI4uivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glNamedProgramLocalParametersI4uivEXT\r
+#define GLEE_H_DEFINED_glNamedProgramLocalParametersI4uivEXT\r
+  typedef void (APIENTRYP GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLuint * params);\r
+  GLEE_EXTERN GLEEPFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC GLeeFuncPtr_glNamedProgramLocalParametersI4uivEXT;\r
+  #define glNamedProgramLocalParametersI4uivEXT GLeeFuncPtr_glNamedProgramLocalParametersI4uivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetNamedProgramLocalParameterIivEXT\r
+#define GLEE_H_DEFINED_glGetNamedProgramLocalParameterIivEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC GLeeFuncPtr_glGetNamedProgramLocalParameterIivEXT;\r
+  #define glGetNamedProgramLocalParameterIivEXT GLeeFuncPtr_glGetNamedProgramLocalParameterIivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetNamedProgramLocalParameterIuivEXT\r
+#define GLEE_H_DEFINED_glGetNamedProgramLocalParameterIuivEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC GLeeFuncPtr_glGetNamedProgramLocalParameterIuivEXT;\r
+  #define glGetNamedProgramLocalParameterIuivEXT GLeeFuncPtr_glGetNamedProgramLocalParameterIuivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTextureParameterIivEXT\r
+#define GLEE_H_DEFINED_glTextureParameterIivEXT\r
+  typedef void (APIENTRYP GLEEPFNGLTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLTEXTUREPARAMETERIIVEXTPROC GLeeFuncPtr_glTextureParameterIivEXT;\r
+  #define glTextureParameterIivEXT GLeeFuncPtr_glTextureParameterIivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTextureParameterIuivEXT\r
+#define GLEE_H_DEFINED_glTextureParameterIuivEXT\r
+  typedef void (APIENTRYP GLEEPFNGLTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLuint * params);\r
+  GLEE_EXTERN GLEEPFNGLTEXTUREPARAMETERIUIVEXTPROC GLeeFuncPtr_glTextureParameterIuivEXT;\r
+  #define glTextureParameterIuivEXT GLeeFuncPtr_glTextureParameterIuivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetTextureParameterIivEXT\r
+#define GLEE_H_DEFINED_glGetTextureParameterIivEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETTEXTUREPARAMETERIIVEXTPROC GLeeFuncPtr_glGetTextureParameterIivEXT;\r
+  #define glGetTextureParameterIivEXT GLeeFuncPtr_glGetTextureParameterIivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetTextureParameterIuivEXT\r
+#define GLEE_H_DEFINED_glGetTextureParameterIuivEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLuint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETTEXTUREPARAMETERIUIVEXTPROC GLeeFuncPtr_glGetTextureParameterIuivEXT;\r
+  #define glGetTextureParameterIuivEXT GLeeFuncPtr_glGetTextureParameterIuivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexParameterIivEXT\r
+#define GLEE_H_DEFINED_glMultiTexParameterIivEXT\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXPARAMETERIIVEXTPROC GLeeFuncPtr_glMultiTexParameterIivEXT;\r
+  #define glMultiTexParameterIivEXT GLeeFuncPtr_glMultiTexParameterIivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexParameterIuivEXT\r
+#define GLEE_H_DEFINED_glMultiTexParameterIuivEXT\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXPARAMETERIUIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLuint * params);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXPARAMETERIUIVEXTPROC GLeeFuncPtr_glMultiTexParameterIuivEXT;\r
+  #define glMultiTexParameterIuivEXT GLeeFuncPtr_glMultiTexParameterIuivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetMultiTexParameterIivEXT\r
+#define GLEE_H_DEFINED_glGetMultiTexParameterIivEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETMULTITEXPARAMETERIIVEXTPROC GLeeFuncPtr_glGetMultiTexParameterIivEXT;\r
+  #define glGetMultiTexParameterIivEXT GLeeFuncPtr_glGetMultiTexParameterIivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetMultiTexParameterIuivEXT\r
+#define GLEE_H_DEFINED_glGetMultiTexParameterIuivEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETMULTITEXPARAMETERIUIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLuint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETMULTITEXPARAMETERIUIVEXTPROC GLeeFuncPtr_glGetMultiTexParameterIuivEXT;\r
+  #define glGetMultiTexParameterIuivEXT GLeeFuncPtr_glGetMultiTexParameterIuivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramUniform1fEXT\r
+#define GLEE_H_DEFINED_glProgramUniform1fEXT\r
+  typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM1FEXTPROC) (GLuint program, GLint location, GLfloat v0);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM1FEXTPROC GLeeFuncPtr_glProgramUniform1fEXT;\r
+  #define glProgramUniform1fEXT GLeeFuncPtr_glProgramUniform1fEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramUniform2fEXT\r
+#define GLEE_H_DEFINED_glProgramUniform2fEXT\r
+  typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM2FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM2FEXTPROC GLeeFuncPtr_glProgramUniform2fEXT;\r
+  #define glProgramUniform2fEXT GLeeFuncPtr_glProgramUniform2fEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramUniform3fEXT\r
+#define GLEE_H_DEFINED_glProgramUniform3fEXT\r
+  typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM3FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM3FEXTPROC GLeeFuncPtr_glProgramUniform3fEXT;\r
+  #define glProgramUniform3fEXT GLeeFuncPtr_glProgramUniform3fEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramUniform4fEXT\r
+#define GLEE_H_DEFINED_glProgramUniform4fEXT\r
+  typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM4FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM4FEXTPROC GLeeFuncPtr_glProgramUniform4fEXT;\r
+  #define glProgramUniform4fEXT GLeeFuncPtr_glProgramUniform4fEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramUniform1iEXT\r
+#define GLEE_H_DEFINED_glProgramUniform1iEXT\r
+  typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM1IEXTPROC) (GLuint program, GLint location, GLint v0);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM1IEXTPROC GLeeFuncPtr_glProgramUniform1iEXT;\r
+  #define glProgramUniform1iEXT GLeeFuncPtr_glProgramUniform1iEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramUniform2iEXT\r
+#define GLEE_H_DEFINED_glProgramUniform2iEXT\r
+  typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM2IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM2IEXTPROC GLeeFuncPtr_glProgramUniform2iEXT;\r
+  #define glProgramUniform2iEXT GLeeFuncPtr_glProgramUniform2iEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramUniform3iEXT\r
+#define GLEE_H_DEFINED_glProgramUniform3iEXT\r
+  typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM3IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM3IEXTPROC GLeeFuncPtr_glProgramUniform3iEXT;\r
+  #define glProgramUniform3iEXT GLeeFuncPtr_glProgramUniform3iEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramUniform4iEXT\r
+#define GLEE_H_DEFINED_glProgramUniform4iEXT\r
+  typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM4IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM4IEXTPROC GLeeFuncPtr_glProgramUniform4iEXT;\r
+  #define glProgramUniform4iEXT GLeeFuncPtr_glProgramUniform4iEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramUniform1fvEXT\r
+#define GLEE_H_DEFINED_glProgramUniform1fvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM1FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat * value);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM1FVEXTPROC GLeeFuncPtr_glProgramUniform1fvEXT;\r
+  #define glProgramUniform1fvEXT GLeeFuncPtr_glProgramUniform1fvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramUniform2fvEXT\r
+#define GLEE_H_DEFINED_glProgramUniform2fvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM2FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat * value);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM2FVEXTPROC GLeeFuncPtr_glProgramUniform2fvEXT;\r
+  #define glProgramUniform2fvEXT GLeeFuncPtr_glProgramUniform2fvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramUniform3fvEXT\r
+#define GLEE_H_DEFINED_glProgramUniform3fvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM3FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat * value);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM3FVEXTPROC GLeeFuncPtr_glProgramUniform3fvEXT;\r
+  #define glProgramUniform3fvEXT GLeeFuncPtr_glProgramUniform3fvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramUniform4fvEXT\r
+#define GLEE_H_DEFINED_glProgramUniform4fvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM4FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat * value);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM4FVEXTPROC GLeeFuncPtr_glProgramUniform4fvEXT;\r
+  #define glProgramUniform4fvEXT GLeeFuncPtr_glProgramUniform4fvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramUniform1ivEXT\r
+#define GLEE_H_DEFINED_glProgramUniform1ivEXT\r
+  typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM1IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint * value);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM1IVEXTPROC GLeeFuncPtr_glProgramUniform1ivEXT;\r
+  #define glProgramUniform1ivEXT GLeeFuncPtr_glProgramUniform1ivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramUniform2ivEXT\r
+#define GLEE_H_DEFINED_glProgramUniform2ivEXT\r
+  typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM2IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint * value);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM2IVEXTPROC GLeeFuncPtr_glProgramUniform2ivEXT;\r
+  #define glProgramUniform2ivEXT GLeeFuncPtr_glProgramUniform2ivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramUniform3ivEXT\r
+#define GLEE_H_DEFINED_glProgramUniform3ivEXT\r
+  typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM3IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint * value);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM3IVEXTPROC GLeeFuncPtr_glProgramUniform3ivEXT;\r
+  #define glProgramUniform3ivEXT GLeeFuncPtr_glProgramUniform3ivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramUniform4ivEXT\r
+#define GLEE_H_DEFINED_glProgramUniform4ivEXT\r
+  typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM4IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint * value);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM4IVEXTPROC GLeeFuncPtr_glProgramUniform4ivEXT;\r
+  #define glProgramUniform4ivEXT GLeeFuncPtr_glProgramUniform4ivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramUniformMatrix2fvEXT\r
+#define GLEE_H_DEFINED_glProgramUniformMatrix2fvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC GLeeFuncPtr_glProgramUniformMatrix2fvEXT;\r
+  #define glProgramUniformMatrix2fvEXT GLeeFuncPtr_glProgramUniformMatrix2fvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramUniformMatrix3fvEXT\r
+#define GLEE_H_DEFINED_glProgramUniformMatrix3fvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC GLeeFuncPtr_glProgramUniformMatrix3fvEXT;\r
+  #define glProgramUniformMatrix3fvEXT GLeeFuncPtr_glProgramUniformMatrix3fvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramUniformMatrix4fvEXT\r
+#define GLEE_H_DEFINED_glProgramUniformMatrix4fvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC GLeeFuncPtr_glProgramUniformMatrix4fvEXT;\r
+  #define glProgramUniformMatrix4fvEXT GLeeFuncPtr_glProgramUniformMatrix4fvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramUniformMatrix2x3fvEXT\r
+#define GLEE_H_DEFINED_glProgramUniformMatrix2x3fvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC GLeeFuncPtr_glProgramUniformMatrix2x3fvEXT;\r
+  #define glProgramUniformMatrix2x3fvEXT GLeeFuncPtr_glProgramUniformMatrix2x3fvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramUniformMatrix3x2fvEXT\r
+#define GLEE_H_DEFINED_glProgramUniformMatrix3x2fvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC GLeeFuncPtr_glProgramUniformMatrix3x2fvEXT;\r
+  #define glProgramUniformMatrix3x2fvEXT GLeeFuncPtr_glProgramUniformMatrix3x2fvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramUniformMatrix2x4fvEXT\r
+#define GLEE_H_DEFINED_glProgramUniformMatrix2x4fvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC GLeeFuncPtr_glProgramUniformMatrix2x4fvEXT;\r
+  #define glProgramUniformMatrix2x4fvEXT GLeeFuncPtr_glProgramUniformMatrix2x4fvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramUniformMatrix4x2fvEXT\r
+#define GLEE_H_DEFINED_glProgramUniformMatrix4x2fvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC GLeeFuncPtr_glProgramUniformMatrix4x2fvEXT;\r
+  #define glProgramUniformMatrix4x2fvEXT GLeeFuncPtr_glProgramUniformMatrix4x2fvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramUniformMatrix3x4fvEXT\r
+#define GLEE_H_DEFINED_glProgramUniformMatrix3x4fvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC GLeeFuncPtr_glProgramUniformMatrix3x4fvEXT;\r
+  #define glProgramUniformMatrix3x4fvEXT GLeeFuncPtr_glProgramUniformMatrix3x4fvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramUniformMatrix4x3fvEXT\r
+#define GLEE_H_DEFINED_glProgramUniformMatrix4x3fvEXT\r
+  typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC GLeeFuncPtr_glProgramUniformMatrix4x3fvEXT;\r
+  #define glProgramUniformMatrix4x3fvEXT GLeeFuncPtr_glProgramUniformMatrix4x3fvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramUniform1uiEXT\r
+#define GLEE_H_DEFINED_glProgramUniform1uiEXT\r
+  typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM1UIEXTPROC) (GLuint program, GLint location, GLuint v0);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM1UIEXTPROC GLeeFuncPtr_glProgramUniform1uiEXT;\r
+  #define glProgramUniform1uiEXT GLeeFuncPtr_glProgramUniform1uiEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramUniform2uiEXT\r
+#define GLEE_H_DEFINED_glProgramUniform2uiEXT\r
+  typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM2UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM2UIEXTPROC GLeeFuncPtr_glProgramUniform2uiEXT;\r
+  #define glProgramUniform2uiEXT GLeeFuncPtr_glProgramUniform2uiEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramUniform3uiEXT\r
+#define GLEE_H_DEFINED_glProgramUniform3uiEXT\r
+  typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM3UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM3UIEXTPROC GLeeFuncPtr_glProgramUniform3uiEXT;\r
+  #define glProgramUniform3uiEXT GLeeFuncPtr_glProgramUniform3uiEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramUniform4uiEXT\r
+#define GLEE_H_DEFINED_glProgramUniform4uiEXT\r
+  typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM4UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM4UIEXTPROC GLeeFuncPtr_glProgramUniform4uiEXT;\r
+  #define glProgramUniform4uiEXT GLeeFuncPtr_glProgramUniform4uiEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramUniform1uivEXT\r
+#define GLEE_H_DEFINED_glProgramUniform1uivEXT\r
+  typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM1UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint * value);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM1UIVEXTPROC GLeeFuncPtr_glProgramUniform1uivEXT;\r
+  #define glProgramUniform1uivEXT GLeeFuncPtr_glProgramUniform1uivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramUniform2uivEXT\r
+#define GLEE_H_DEFINED_glProgramUniform2uivEXT\r
+  typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM2UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint * value);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM2UIVEXTPROC GLeeFuncPtr_glProgramUniform2uivEXT;\r
+  #define glProgramUniform2uivEXT GLeeFuncPtr_glProgramUniform2uivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramUniform3uivEXT\r
+#define GLEE_H_DEFINED_glProgramUniform3uivEXT\r
+  typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM3UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint * value);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM3UIVEXTPROC GLeeFuncPtr_glProgramUniform3uivEXT;\r
+  #define glProgramUniform3uivEXT GLeeFuncPtr_glProgramUniform3uivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramUniform4uivEXT\r
+#define GLEE_H_DEFINED_glProgramUniform4uivEXT\r
+  typedef void (APIENTRYP GLEEPFNGLPROGRAMUNIFORM4UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint * value);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMUNIFORM4UIVEXTPROC GLeeFuncPtr_glProgramUniform4uivEXT;\r
+  #define glProgramUniform4uivEXT GLeeFuncPtr_glProgramUniform4uivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glNamedBufferDataEXT\r
+#define GLEE_H_DEFINED_glNamedBufferDataEXT\r
+  typedef void (APIENTRYP GLEEPFNGLNAMEDBUFFERDATAEXTPROC) (GLuint buffer, GLsizeiptr size, const GLvoid * data, GLenum usage);\r
+  GLEE_EXTERN GLEEPFNGLNAMEDBUFFERDATAEXTPROC GLeeFuncPtr_glNamedBufferDataEXT;\r
+  #define glNamedBufferDataEXT GLeeFuncPtr_glNamedBufferDataEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glNamedBufferSubDataEXT\r
+#define GLEE_H_DEFINED_glNamedBufferSubDataEXT\r
+  typedef void (APIENTRYP GLEEPFNGLNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, const GLvoid * data);\r
+  GLEE_EXTERN GLEEPFNGLNAMEDBUFFERSUBDATAEXTPROC GLeeFuncPtr_glNamedBufferSubDataEXT;\r
+  #define glNamedBufferSubDataEXT GLeeFuncPtr_glNamedBufferSubDataEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMapNamedBufferEXT\r
+#define GLEE_H_DEFINED_glMapNamedBufferEXT\r
+  typedef GLvoid* (APIENTRYP GLEEPFNGLMAPNAMEDBUFFEREXTPROC) (GLuint buffer, GLenum access);\r
+  GLEE_EXTERN GLEEPFNGLMAPNAMEDBUFFEREXTPROC GLeeFuncPtr_glMapNamedBufferEXT;\r
+  #define glMapNamedBufferEXT GLeeFuncPtr_glMapNamedBufferEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glUnmapNamedBufferEXT\r
+#define GLEE_H_DEFINED_glUnmapNamedBufferEXT\r
+  typedef GLboolean (APIENTRYP GLEEPFNGLUNMAPNAMEDBUFFEREXTPROC) (GLuint buffer);\r
+  GLEE_EXTERN GLEEPFNGLUNMAPNAMEDBUFFEREXTPROC GLeeFuncPtr_glUnmapNamedBufferEXT;\r
+  #define glUnmapNamedBufferEXT GLeeFuncPtr_glUnmapNamedBufferEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetNamedBufferParameterivEXT\r
+#define GLEE_H_DEFINED_glGetNamedBufferParameterivEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC) (GLuint buffer, GLenum pname, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC GLeeFuncPtr_glGetNamedBufferParameterivEXT;\r
+  #define glGetNamedBufferParameterivEXT GLeeFuncPtr_glGetNamedBufferParameterivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetNamedBufferPointervEXT\r
+#define GLEE_H_DEFINED_glGetNamedBufferPointervEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETNAMEDBUFFERPOINTERVEXTPROC) (GLuint buffer, GLenum pname, GLvoid* * params);\r
+  GLEE_EXTERN GLEEPFNGLGETNAMEDBUFFERPOINTERVEXTPROC GLeeFuncPtr_glGetNamedBufferPointervEXT;\r
+  #define glGetNamedBufferPointervEXT GLeeFuncPtr_glGetNamedBufferPointervEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetNamedBufferSubDataEXT\r
+#define GLEE_H_DEFINED_glGetNamedBufferSubDataEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, GLvoid * data);\r
+  GLEE_EXTERN GLEEPFNGLGETNAMEDBUFFERSUBDATAEXTPROC GLeeFuncPtr_glGetNamedBufferSubDataEXT;\r
+  #define glGetNamedBufferSubDataEXT GLeeFuncPtr_glGetNamedBufferSubDataEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTextureBufferEXT\r
+#define GLEE_H_DEFINED_glTextureBufferEXT\r
+  typedef void (APIENTRYP GLEEPFNGLTEXTUREBUFFEREXTPROC) (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer);\r
+  GLEE_EXTERN GLEEPFNGLTEXTUREBUFFEREXTPROC GLeeFuncPtr_glTextureBufferEXT;\r
+  #define glTextureBufferEXT GLeeFuncPtr_glTextureBufferEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexBufferEXT\r
+#define GLEE_H_DEFINED_glMultiTexBufferEXT\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXBUFFEREXTPROC) (GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXBUFFEREXTPROC GLeeFuncPtr_glMultiTexBufferEXT;\r
+  #define glMultiTexBufferEXT GLeeFuncPtr_glMultiTexBufferEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glNamedRenderbufferStorageEXT\r
+#define GLEE_H_DEFINED_glNamedRenderbufferStorageEXT\r
+  typedef void (APIENTRYP GLEEPFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC) (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height);\r
+  GLEE_EXTERN GLEEPFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC GLeeFuncPtr_glNamedRenderbufferStorageEXT;\r
+  #define glNamedRenderbufferStorageEXT GLeeFuncPtr_glNamedRenderbufferStorageEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetNamedRenderbufferParameterivEXT\r
+#define GLEE_H_DEFINED_glGetNamedRenderbufferParameterivEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC) (GLuint renderbuffer, GLenum pname, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC GLeeFuncPtr_glGetNamedRenderbufferParameterivEXT;\r
+  #define glGetNamedRenderbufferParameterivEXT GLeeFuncPtr_glGetNamedRenderbufferParameterivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glCheckNamedFramebufferStatusEXT\r
+#define GLEE_H_DEFINED_glCheckNamedFramebufferStatusEXT\r
+  typedef GLenum (APIENTRYP GLEEPFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC) (GLuint framebuffer, GLenum target);\r
+  GLEE_EXTERN GLEEPFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC GLeeFuncPtr_glCheckNamedFramebufferStatusEXT;\r
+  #define glCheckNamedFramebufferStatusEXT GLeeFuncPtr_glCheckNamedFramebufferStatusEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glNamedFramebufferTexture1DEXT\r
+#define GLEE_H_DEFINED_glNamedFramebufferTexture1DEXT\r
+  typedef void (APIENTRYP GLEEPFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level);\r
+  GLEE_EXTERN GLEEPFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC GLeeFuncPtr_glNamedFramebufferTexture1DEXT;\r
+  #define glNamedFramebufferTexture1DEXT GLeeFuncPtr_glNamedFramebufferTexture1DEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glNamedFramebufferTexture2DEXT\r
+#define GLEE_H_DEFINED_glNamedFramebufferTexture2DEXT\r
+  typedef void (APIENTRYP GLEEPFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level);\r
+  GLEE_EXTERN GLEEPFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC GLeeFuncPtr_glNamedFramebufferTexture2DEXT;\r
+  #define glNamedFramebufferTexture2DEXT GLeeFuncPtr_glNamedFramebufferTexture2DEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glNamedFramebufferTexture3DEXT\r
+#define GLEE_H_DEFINED_glNamedFramebufferTexture3DEXT\r
+  typedef void (APIENTRYP GLEEPFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);\r
+  GLEE_EXTERN GLEEPFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC GLeeFuncPtr_glNamedFramebufferTexture3DEXT;\r
+  #define glNamedFramebufferTexture3DEXT GLeeFuncPtr_glNamedFramebufferTexture3DEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glNamedFramebufferRenderbufferEXT\r
+#define GLEE_H_DEFINED_glNamedFramebufferRenderbufferEXT\r
+  typedef void (APIENTRYP GLEEPFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC) (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);\r
+  GLEE_EXTERN GLEEPFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC GLeeFuncPtr_glNamedFramebufferRenderbufferEXT;\r
+  #define glNamedFramebufferRenderbufferEXT GLeeFuncPtr_glNamedFramebufferRenderbufferEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetNamedFramebufferAttachmentParameterivEXT\r
+#define GLEE_H_DEFINED_glGetNamedFramebufferAttachmentParameterivEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum pname, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC GLeeFuncPtr_glGetNamedFramebufferAttachmentParameterivEXT;\r
+  #define glGetNamedFramebufferAttachmentParameterivEXT GLeeFuncPtr_glGetNamedFramebufferAttachmentParameterivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGenerateTextureMipmapEXT\r
+#define GLEE_H_DEFINED_glGenerateTextureMipmapEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGENERATETEXTUREMIPMAPEXTPROC) (GLuint texture, GLenum target);\r
+  GLEE_EXTERN GLEEPFNGLGENERATETEXTUREMIPMAPEXTPROC GLeeFuncPtr_glGenerateTextureMipmapEXT;\r
+  #define glGenerateTextureMipmapEXT GLeeFuncPtr_glGenerateTextureMipmapEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGenerateMultiTexMipmapEXT\r
+#define GLEE_H_DEFINED_glGenerateMultiTexMipmapEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGENERATEMULTITEXMIPMAPEXTPROC) (GLenum texunit, GLenum target);\r
+  GLEE_EXTERN GLEEPFNGLGENERATEMULTITEXMIPMAPEXTPROC GLeeFuncPtr_glGenerateMultiTexMipmapEXT;\r
+  #define glGenerateMultiTexMipmapEXT GLeeFuncPtr_glGenerateMultiTexMipmapEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFramebufferDrawBufferEXT\r
+#define GLEE_H_DEFINED_glFramebufferDrawBufferEXT\r
+  typedef void (APIENTRYP GLEEPFNGLFRAMEBUFFERDRAWBUFFEREXTPROC) (GLuint framebuffer, GLenum mode);\r
+  GLEE_EXTERN GLEEPFNGLFRAMEBUFFERDRAWBUFFEREXTPROC GLeeFuncPtr_glFramebufferDrawBufferEXT;\r
+  #define glFramebufferDrawBufferEXT GLeeFuncPtr_glFramebufferDrawBufferEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFramebufferDrawBuffersEXT\r
+#define GLEE_H_DEFINED_glFramebufferDrawBuffersEXT\r
+  typedef void (APIENTRYP GLEEPFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC) (GLuint framebuffer, GLsizei n, const GLenum * bufs);\r
+  GLEE_EXTERN GLEEPFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC GLeeFuncPtr_glFramebufferDrawBuffersEXT;\r
+  #define glFramebufferDrawBuffersEXT GLeeFuncPtr_glFramebufferDrawBuffersEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFramebufferReadBufferEXT\r
+#define GLEE_H_DEFINED_glFramebufferReadBufferEXT\r
+  typedef void (APIENTRYP GLEEPFNGLFRAMEBUFFERREADBUFFEREXTPROC) (GLuint framebuffer, GLenum mode);\r
+  GLEE_EXTERN GLEEPFNGLFRAMEBUFFERREADBUFFEREXTPROC GLeeFuncPtr_glFramebufferReadBufferEXT;\r
+  #define glFramebufferReadBufferEXT GLeeFuncPtr_glFramebufferReadBufferEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetFramebufferParameterivEXT\r
+#define GLEE_H_DEFINED_glGetFramebufferParameterivEXT\r
+  typedef void (APIENTRYP GLEEPFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum pname, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC GLeeFuncPtr_glGetFramebufferParameterivEXT;\r
+  #define glGetFramebufferParameterivEXT GLeeFuncPtr_glGetFramebufferParameterivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glNamedRenderbufferStorageMultisampleEXT\r
+#define GLEE_H_DEFINED_glNamedRenderbufferStorageMultisampleEXT\r
+  typedef void (APIENTRYP GLEEPFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);\r
+  GLEE_EXTERN GLEEPFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC GLeeFuncPtr_glNamedRenderbufferStorageMultisampleEXT;\r
+  #define glNamedRenderbufferStorageMultisampleEXT GLeeFuncPtr_glNamedRenderbufferStorageMultisampleEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glNamedRenderbufferStorageMultisampleCoverageEXT\r
+#define GLEE_H_DEFINED_glNamedRenderbufferStorageMultisampleCoverageEXT\r
+  typedef void (APIENTRYP GLEEPFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC) (GLuint renderbuffer, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height);\r
+  GLEE_EXTERN GLEEPFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC GLeeFuncPtr_glNamedRenderbufferStorageMultisampleCoverageEXT;\r
+  #define glNamedRenderbufferStorageMultisampleCoverageEXT GLeeFuncPtr_glNamedRenderbufferStorageMultisampleCoverageEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glNamedFramebufferTextureEXT\r
+#define GLEE_H_DEFINED_glNamedFramebufferTextureEXT\r
+  typedef void (APIENTRYP GLEEPFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level);\r
+  GLEE_EXTERN GLEEPFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC GLeeFuncPtr_glNamedFramebufferTextureEXT;\r
+  #define glNamedFramebufferTextureEXT GLeeFuncPtr_glNamedFramebufferTextureEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glNamedFramebufferTextureLayerEXT\r
+#define GLEE_H_DEFINED_glNamedFramebufferTextureLayerEXT\r
+  typedef void (APIENTRYP GLEEPFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer);\r
+  GLEE_EXTERN GLEEPFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC GLeeFuncPtr_glNamedFramebufferTextureLayerEXT;\r
+  #define glNamedFramebufferTextureLayerEXT GLeeFuncPtr_glNamedFramebufferTextureLayerEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glNamedFramebufferTextureFaceEXT\r
+#define GLEE_H_DEFINED_glNamedFramebufferTextureFaceEXT\r
+  typedef void (APIENTRYP GLEEPFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLenum face);\r
+  GLEE_EXTERN GLEEPFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC GLeeFuncPtr_glNamedFramebufferTextureFaceEXT;\r
+  #define glNamedFramebufferTextureFaceEXT GLeeFuncPtr_glNamedFramebufferTextureFaceEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTextureRenderbufferEXT\r
+#define GLEE_H_DEFINED_glTextureRenderbufferEXT\r
+  typedef void (APIENTRYP GLEEPFNGLTEXTURERENDERBUFFEREXTPROC) (GLuint texture, GLenum target, GLuint renderbuffer);\r
+  GLEE_EXTERN GLEEPFNGLTEXTURERENDERBUFFEREXTPROC GLeeFuncPtr_glTextureRenderbufferEXT;\r
+  #define glTextureRenderbufferEXT GLeeFuncPtr_glTextureRenderbufferEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glMultiTexRenderbufferEXT\r
+#define GLEE_H_DEFINED_glMultiTexRenderbufferEXT\r
+  typedef void (APIENTRYP GLEEPFNGLMULTITEXRENDERBUFFEREXTPROC) (GLenum texunit, GLenum target, GLuint renderbuffer);\r
+  GLEE_EXTERN GLEEPFNGLMULTITEXRENDERBUFFEREXTPROC GLeeFuncPtr_glMultiTexRenderbufferEXT;\r
+  #define glMultiTexRenderbufferEXT GLeeFuncPtr_glMultiTexRenderbufferEXT\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_vertex_array_bgra */\r
+\r
+#ifndef GL_EXT_vertex_array_bgra\r
+#define GL_EXT_vertex_array_bgra 1\r
+#define __GLEE_GL_EXT_vertex_array_bgra 1\r
+/* Constants */\r
+#endif \r
+\r
+/* GL_EXT_texture_swizzle */\r
+\r
+#ifndef GL_EXT_texture_swizzle\r
+#define GL_EXT_texture_swizzle 1\r
+#define __GLEE_GL_EXT_texture_swizzle 1\r
+/* Constants */\r
+#define GL_TEXTURE_SWIZZLE_R_EXT                           0x8E42\r
+#define GL_TEXTURE_SWIZZLE_G_EXT                           0x8E43\r
+#define GL_TEXTURE_SWIZZLE_B_EXT                           0x8E44\r
+#define GL_TEXTURE_SWIZZLE_A_EXT                           0x8E45\r
+#define GL_TEXTURE_SWIZZLE_RGBA_EXT                        0x8E46\r
+#endif \r
+\r
+/* GL_NV_explicit_multisample */\r
+\r
+#ifndef GL_NV_explicit_multisample\r
+#define GL_NV_explicit_multisample 1\r
+#define __GLEE_GL_NV_explicit_multisample 1\r
+/* Constants */\r
+#define GL_SAMPLE_POSITION_NV                              0x8E50\r
+#define GL_SAMPLE_MASK_NV                                  0x8E51\r
+#define GL_SAMPLE_MASK_VALUE_NV                            0x8E52\r
+#define GL_TEXTURE_BINDING_RENDERBUFFER_NV                 0x8E53\r
+#define GL_TEXTURE_RENDERBUFFER_DATA_STORE_BINDING_NV      0x8E54\r
+#define GL_MAX_SAMPLE_MASK_WORDS_NV                        0x8E59\r
+#define GL_TEXTURE_RENDERBUFFER_NV                         0x8E55\r
+#define GL_SAMPLER_RENDERBUFFER_NV                         0x8E56\r
+#define GL_INT_SAMPLER_RENDERBUFFER_NV                     0x8E57\r
+#define GL_UNSIGNED_INT_SAMPLER_RENDERBUFFER_NV            0x8E58\r
+#ifndef GLEE_H_DEFINED_glGetMultisamplefvNV\r
+#define GLEE_H_DEFINED_glGetMultisamplefvNV\r
+  typedef void (APIENTRYP GLEEPFNGLGETMULTISAMPLEFVNVPROC) (GLenum pname, GLuint index, GLfloat * val);\r
+  GLEE_EXTERN GLEEPFNGLGETMULTISAMPLEFVNVPROC GLeeFuncPtr_glGetMultisamplefvNV;\r
+  #define glGetMultisamplefvNV GLeeFuncPtr_glGetMultisamplefvNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glSampleMaskIndexedNV\r
+#define GLEE_H_DEFINED_glSampleMaskIndexedNV\r
+  typedef void (APIENTRYP GLEEPFNGLSAMPLEMASKINDEXEDNVPROC) (GLuint index, GLbitfield mask);\r
+  GLEE_EXTERN GLEEPFNGLSAMPLEMASKINDEXEDNVPROC GLeeFuncPtr_glSampleMaskIndexedNV;\r
+  #define glSampleMaskIndexedNV GLeeFuncPtr_glSampleMaskIndexedNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glTexRenderbufferNV\r
+#define GLEE_H_DEFINED_glTexRenderbufferNV\r
+  typedef void (APIENTRYP GLEEPFNGLTEXRENDERBUFFERNVPROC) (GLenum target, GLuint renderbuffer);\r
+  GLEE_EXTERN GLEEPFNGLTEXRENDERBUFFERNVPROC GLeeFuncPtr_glTexRenderbufferNV;\r
+  #define glTexRenderbufferNV GLeeFuncPtr_glTexRenderbufferNV\r
+#endif\r
+#endif \r
+\r
+/* GL_NV_transform_feedback2 */\r
+\r
+#ifndef GL_NV_transform_feedback2\r
+#define GL_NV_transform_feedback2 1\r
+#define __GLEE_GL_NV_transform_feedback2 1\r
+/* Constants */\r
+#define GL_TRANSFORM_FEEDBACK_NV                           0x8E22\r
+#define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED_NV             0x8E23\r
+#define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE_NV             0x8E24\r
+#define GL_TRANSFORM_FEEDBACK_BINDING_NV                   0x8E25\r
+#ifndef GLEE_H_DEFINED_glBindTransformFeedbackNV\r
+#define GLEE_H_DEFINED_glBindTransformFeedbackNV\r
+  typedef void (APIENTRYP GLEEPFNGLBINDTRANSFORMFEEDBACKNVPROC) (GLenum target, GLuint id);\r
+  GLEE_EXTERN GLEEPFNGLBINDTRANSFORMFEEDBACKNVPROC GLeeFuncPtr_glBindTransformFeedbackNV;\r
+  #define glBindTransformFeedbackNV GLeeFuncPtr_glBindTransformFeedbackNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glDeleteTransformFeedbacksNV\r
+#define GLEE_H_DEFINED_glDeleteTransformFeedbacksNV\r
+  typedef void (APIENTRYP GLEEPFNGLDELETETRANSFORMFEEDBACKSNVPROC) (GLsizei n, const GLuint * ids);\r
+  GLEE_EXTERN GLEEPFNGLDELETETRANSFORMFEEDBACKSNVPROC GLeeFuncPtr_glDeleteTransformFeedbacksNV;\r
+  #define glDeleteTransformFeedbacksNV GLeeFuncPtr_glDeleteTransformFeedbacksNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGenTransformFeedbacksNV\r
+#define GLEE_H_DEFINED_glGenTransformFeedbacksNV\r
+  typedef void (APIENTRYP GLEEPFNGLGENTRANSFORMFEEDBACKSNVPROC) (GLsizei n, GLuint * ids);\r
+  GLEE_EXTERN GLEEPFNGLGENTRANSFORMFEEDBACKSNVPROC GLeeFuncPtr_glGenTransformFeedbacksNV;\r
+  #define glGenTransformFeedbacksNV GLeeFuncPtr_glGenTransformFeedbacksNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glIsTransformFeedbackNV\r
+#define GLEE_H_DEFINED_glIsTransformFeedbackNV\r
+  typedef GLboolean (APIENTRYP GLEEPFNGLISTRANSFORMFEEDBACKNVPROC) (GLuint id);\r
+  GLEE_EXTERN GLEEPFNGLISTRANSFORMFEEDBACKNVPROC GLeeFuncPtr_glIsTransformFeedbackNV;\r
+  #define glIsTransformFeedbackNV GLeeFuncPtr_glIsTransformFeedbackNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glPauseTransformFeedbackNV\r
+#define GLEE_H_DEFINED_glPauseTransformFeedbackNV\r
+  typedef void (APIENTRYP GLEEPFNGLPAUSETRANSFORMFEEDBACKNVPROC) ();\r
+  GLEE_EXTERN GLEEPFNGLPAUSETRANSFORMFEEDBACKNVPROC GLeeFuncPtr_glPauseTransformFeedbackNV;\r
+  #define glPauseTransformFeedbackNV GLeeFuncPtr_glPauseTransformFeedbackNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glResumeTransformFeedbackNV\r
+#define GLEE_H_DEFINED_glResumeTransformFeedbackNV\r
+  typedef void (APIENTRYP GLEEPFNGLRESUMETRANSFORMFEEDBACKNVPROC) ();\r
+  GLEE_EXTERN GLEEPFNGLRESUMETRANSFORMFEEDBACKNVPROC GLeeFuncPtr_glResumeTransformFeedbackNV;\r
+  #define glResumeTransformFeedbackNV GLeeFuncPtr_glResumeTransformFeedbackNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glDrawTransformFeedbackNV\r
+#define GLEE_H_DEFINED_glDrawTransformFeedbackNV\r
+  typedef void (APIENTRYP GLEEPFNGLDRAWTRANSFORMFEEDBACKNVPROC) (GLenum mode, GLuint id);\r
+  GLEE_EXTERN GLEEPFNGLDRAWTRANSFORMFEEDBACKNVPROC GLeeFuncPtr_glDrawTransformFeedbackNV;\r
+  #define glDrawTransformFeedbackNV GLeeFuncPtr_glDrawTransformFeedbackNV\r
+#endif\r
+#endif \r
+\r
+/* GL_SGIX_texture_select */\r
+\r
+#ifndef GL_SGIX_texture_select\r
+#define GL_SGIX_texture_select 1\r
+#define __GLEE_GL_SGIX_texture_select 1\r
+/* Constants */\r
+#endif \r
+\r
+/* GL_INGR_blend_func_separate */\r
+\r
+#ifndef GL_INGR_blend_func_separate\r
+#define GL_INGR_blend_func_separate 1\r
+#define __GLEE_GL_INGR_blend_func_separate 1\r
+/* Constants */\r
+#ifndef GLEE_H_DEFINED_glBlendFuncSeparateINGR\r
+#define GLEE_H_DEFINED_glBlendFuncSeparateINGR\r
+  typedef void (APIENTRYP GLEEPFNGLBLENDFUNCSEPARATEINGRPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);\r
+  GLEE_EXTERN GLEEPFNGLBLENDFUNCSEPARATEINGRPROC GLeeFuncPtr_glBlendFuncSeparateINGR;\r
+  #define glBlendFuncSeparateINGR GLeeFuncPtr_glBlendFuncSeparateINGR\r
+#endif\r
+#endif \r
+\r
+/* GL_SGIX_depth_pass_instrument */\r
+\r
+#ifndef GL_SGIX_depth_pass_instrument\r
+#define GL_SGIX_depth_pass_instrument 1\r
+#define __GLEE_GL_SGIX_depth_pass_instrument 1\r
+/* Constants */\r
+#endif \r
+\r
+/* GL_SGIX_igloo_interface */\r
+\r
+#ifndef GL_SGIX_igloo_interface\r
+#define GL_SGIX_igloo_interface 1\r
+#define __GLEE_GL_SGIX_igloo_interface 1\r
+/* Constants */\r
+#ifndef GLEE_H_DEFINED_glIglooInterfaceSGIX\r
+#define GLEE_H_DEFINED_glIglooInterfaceSGIX\r
+  typedef void (APIENTRYP GLEEPFNGLIGLOOINTERFACESGIXPROC) (GLenum pname, const GLvoid * params);\r
+  GLEE_EXTERN GLEEPFNGLIGLOOINTERFACESGIXPROC GLeeFuncPtr_glIglooInterfaceSGIX;\r
+  #define glIglooInterfaceSGIX GLeeFuncPtr_glIglooInterfaceSGIX\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_fragment_lighting */\r
+\r
+#ifndef GL_EXT_fragment_lighting\r
+#define GL_EXT_fragment_lighting 1\r
+#define __GLEE_GL_EXT_fragment_lighting 1\r
+/* Constants */\r
+#define GL_FRAGMENT_LIGHTING_EXT                           0x8400\r
+#define GL_FRAGMENT_COLOR_MATERIAL_EXT                     0x8401\r
+#define GL_FRAGMENT_COLOR_MATERIAL_FACE_EXT                0x8402\r
+#define GL_FRAGMENT_COLOR_MATERIAL_PARAMETER_EXT           0x8403\r
+#define GL_MAX_FRAGMENT_LIGHTS_EXT                         0x8404\r
+#define GL_MAX_ACTIVE_LIGHTS_EXT                           0x8405\r
+#define GL_CURRENT_RASTER_NORMAL_EXT                       0x8406\r
+#define GL_LIGHT_ENV_MODE_EXT                              0x8407\r
+#define GL_FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_EXT           0x8408\r
+#define GL_FRAGMENT_LIGHT_MODEL_TWO_SIDE_EXT               0x8409\r
+#define GL_FRAGMENT_LIGHT_MODEL_AMBIENT_EXT                0x840A\r
+#define GL_FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_EXT   0x840B\r
+#define GL_FRAGMENT_LIGHT0_EXT                             0x840C\r
+#define GL_FRAGMENT_LIGHT7_EXT                             0x8413\r
+#ifndef GLEE_H_DEFINED_glFragmentLightModeliEXT\r
+#define GLEE_H_DEFINED_glFragmentLightModeliEXT\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLFRAGMENTLIGHTMODELIEXTPROC) (GLenum pname, GLint param);\r
+  GLEE_EXTERN GLEEPFNGLFRAGMENTLIGHTMODELIEXTPROC GLeeFuncPtr_glFragmentLightModeliEXT;\r
+  #define glFragmentLightModeliEXT GLeeFuncPtr_glFragmentLightModeliEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFragmentLightModelfEXT\r
+#define GLEE_H_DEFINED_glFragmentLightModelfEXT\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLFRAGMENTLIGHTMODELFEXTPROC) (GLenum pname, GLfloat param);\r
+  GLEE_EXTERN GLEEPFNGLFRAGMENTLIGHTMODELFEXTPROC GLeeFuncPtr_glFragmentLightModelfEXT;\r
+  #define glFragmentLightModelfEXT GLeeFuncPtr_glFragmentLightModelfEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFragmentLightModelivEXT\r
+#define GLEE_H_DEFINED_glFragmentLightModelivEXT\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLFRAGMENTLIGHTMODELIVEXTPROC) (GLenum pname, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLFRAGMENTLIGHTMODELIVEXTPROC GLeeFuncPtr_glFragmentLightModelivEXT;\r
+  #define glFragmentLightModelivEXT GLeeFuncPtr_glFragmentLightModelivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFragmentLightModelfvEXT\r
+#define GLEE_H_DEFINED_glFragmentLightModelfvEXT\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLFRAGMENTLIGHTMODELFVEXTPROC) (GLenum pname, GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLFRAGMENTLIGHTMODELFVEXTPROC GLeeFuncPtr_glFragmentLightModelfvEXT;\r
+  #define glFragmentLightModelfvEXT GLeeFuncPtr_glFragmentLightModelfvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFragmentLightiEXT\r
+#define GLEE_H_DEFINED_glFragmentLightiEXT\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLFRAGMENTLIGHTIEXTPROC) (GLenum light, GLenum pname, GLint param);\r
+  GLEE_EXTERN GLEEPFNGLFRAGMENTLIGHTIEXTPROC GLeeFuncPtr_glFragmentLightiEXT;\r
+  #define glFragmentLightiEXT GLeeFuncPtr_glFragmentLightiEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFragmentLightfEXT\r
+#define GLEE_H_DEFINED_glFragmentLightfEXT\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLFRAGMENTLIGHTFEXTPROC) (GLenum light, GLenum pname, GLfloat param);\r
+  GLEE_EXTERN GLEEPFNGLFRAGMENTLIGHTFEXTPROC GLeeFuncPtr_glFragmentLightfEXT;\r
+  #define glFragmentLightfEXT GLeeFuncPtr_glFragmentLightfEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFragmentLightivEXT\r
+#define GLEE_H_DEFINED_glFragmentLightivEXT\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLFRAGMENTLIGHTIVEXTPROC) (GLenum light, GLenum pname, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLFRAGMENTLIGHTIVEXTPROC GLeeFuncPtr_glFragmentLightivEXT;\r
+  #define glFragmentLightivEXT GLeeFuncPtr_glFragmentLightivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFragmentLightfvEXT\r
+#define GLEE_H_DEFINED_glFragmentLightfvEXT\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLFRAGMENTLIGHTFVEXTPROC) (GLenum light, GLenum pname, GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLFRAGMENTLIGHTFVEXTPROC GLeeFuncPtr_glFragmentLightfvEXT;\r
+  #define glFragmentLightfvEXT GLeeFuncPtr_glFragmentLightfvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetFragmentLightivEXT\r
+#define GLEE_H_DEFINED_glGetFragmentLightivEXT\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLGETFRAGMENTLIGHTIVEXTPROC) (GLenum light, GLenum pname, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETFRAGMENTLIGHTIVEXTPROC GLeeFuncPtr_glGetFragmentLightivEXT;\r
+  #define glGetFragmentLightivEXT GLeeFuncPtr_glGetFragmentLightivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetFragmentLightfvEXT\r
+#define GLEE_H_DEFINED_glGetFragmentLightfvEXT\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLGETFRAGMENTLIGHTFVEXTPROC) (GLenum light, GLenum pname, GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLGETFRAGMENTLIGHTFVEXTPROC GLeeFuncPtr_glGetFragmentLightfvEXT;\r
+  #define glGetFragmentLightfvEXT GLeeFuncPtr_glGetFragmentLightfvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFragmentMaterialfEXT\r
+#define GLEE_H_DEFINED_glFragmentMaterialfEXT\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLFRAGMENTMATERIALFEXTPROC) (GLenum face, GLenum pname, const GLfloat param);\r
+  GLEE_EXTERN GLEEPFNGLFRAGMENTMATERIALFEXTPROC GLeeFuncPtr_glFragmentMaterialfEXT;\r
+  #define glFragmentMaterialfEXT GLeeFuncPtr_glFragmentMaterialfEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFragmentMaterialiEXT\r
+#define GLEE_H_DEFINED_glFragmentMaterialiEXT\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLFRAGMENTMATERIALIEXTPROC) (GLenum face, GLenum pname, const GLint param);\r
+  GLEE_EXTERN GLEEPFNGLFRAGMENTMATERIALIEXTPROC GLeeFuncPtr_glFragmentMaterialiEXT;\r
+  #define glFragmentMaterialiEXT GLeeFuncPtr_glFragmentMaterialiEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFragmentMaterialfvEXT\r
+#define GLEE_H_DEFINED_glFragmentMaterialfvEXT\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLFRAGMENTMATERIALFVEXTPROC) (GLenum face, GLenum pname, const GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLFRAGMENTMATERIALFVEXTPROC GLeeFuncPtr_glFragmentMaterialfvEXT;\r
+  #define glFragmentMaterialfvEXT GLeeFuncPtr_glFragmentMaterialfvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFragmentMaterialivEXT\r
+#define GLEE_H_DEFINED_glFragmentMaterialivEXT\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLFRAGMENTMATERIALIVEXTPROC) (GLenum face, GLenum pname, const GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLFRAGMENTMATERIALIVEXTPROC GLeeFuncPtr_glFragmentMaterialivEXT;\r
+  #define glFragmentMaterialivEXT GLeeFuncPtr_glFragmentMaterialivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFragmentColorMaterialEXT\r
+#define GLEE_H_DEFINED_glFragmentColorMaterialEXT\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLFRAGMENTCOLORMATERIALEXTPROC) (GLenum face, GLenum mode);\r
+  GLEE_EXTERN GLEEPFNGLFRAGMENTCOLORMATERIALEXTPROC GLeeFuncPtr_glFragmentColorMaterialEXT;\r
+  #define glFragmentColorMaterialEXT GLeeFuncPtr_glFragmentColorMaterialEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetFragmentMaterialfvEXT\r
+#define GLEE_H_DEFINED_glGetFragmentMaterialfvEXT\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLGETFRAGMENTMATERIALFVEXTPROC) (GLenum face, GLenum pname, const GLfloat * params);\r
+  GLEE_EXTERN GLEEPFNGLGETFRAGMENTMATERIALFVEXTPROC GLeeFuncPtr_glGetFragmentMaterialfvEXT;\r
+  #define glGetFragmentMaterialfvEXT GLeeFuncPtr_glGetFragmentMaterialfvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetFragmentMaterialivEXT\r
+#define GLEE_H_DEFINED_glGetFragmentMaterialivEXT\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLGETFRAGMENTMATERIALIVEXTPROC) (GLenum face, GLenum pname, const GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETFRAGMENTMATERIALIVEXTPROC GLeeFuncPtr_glGetFragmentMaterialivEXT;\r
+  #define glGetFragmentMaterialivEXT GLeeFuncPtr_glGetFragmentMaterialivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glLightEnviEXT\r
+#define GLEE_H_DEFINED_glLightEnviEXT\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLLIGHTENVIEXTPROC) (GLenum pname, GLint param);\r
+  GLEE_EXTERN GLEEPFNGLLIGHTENVIEXTPROC GLeeFuncPtr_glLightEnviEXT;\r
+  #define glLightEnviEXT GLeeFuncPtr_glLightEnviEXT\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_geometry_shader4 */\r
+\r
+#ifndef GL_EXT_geometry_shader4\r
+#define GL_EXT_geometry_shader4 1\r
+#define __GLEE_GL_EXT_geometry_shader4 1\r
+/* Constants */\r
+#define GL_GEOMETRY_SHADER_EXT                             0x8DD9\r
+#define GL_GEOMETRY_VERTICES_OUT_EXT                       0x8DDA\r
+#define GL_GEOMETRY_INPUT_TYPE_EXT                         0x8DDB\r
+#define GL_GEOMETRY_OUTPUT_TYPE_EXT                        0x8DDC\r
+#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT            0x8C29\r
+#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_EXT             0x8DDD\r
+#define GL_MAX_VERTEX_VARYING_COMPONENTS_EXT               0x8DDE\r
+#define GL_MAX_VARYING_COMPONENTS_EXT                      0x8B4B\r
+#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT             0x8DDF\r
+#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT                0x8DE0\r
+#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT        0x8DE1\r
+#define GL_LINES_ADJACENCY_EXT                             0xA\r
+#define GL_LINE_STRIP_ADJACENCY_EXT                        0xB\r
+#define GL_TRIANGLES_ADJACENCY_EXT                         0xC\r
+#define GL_TRIANGLE_STRIP_ADJACENCY_EXT                    0xD\r
+#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT        0x8DA8\r
+#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT          0x8DA9\r
+#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT              0x8DA7\r
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT        0x8CD4\r
+#define GL_PROGRAM_POINT_SIZE_EXT                          0x8642\r
+#ifndef GLEE_H_DEFINED_glProgramParameteriEXT\r
+#define GLEE_H_DEFINED_glProgramParameteriEXT\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLPROGRAMPARAMETERIEXTPROC) (GLuint program, GLenum pname, GLint value);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMPARAMETERIEXTPROC GLeeFuncPtr_glProgramParameteriEXT;\r
+  #define glProgramParameteriEXT GLeeFuncPtr_glProgramParameteriEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFramebufferTextureEXT\r
+#define GLEE_H_DEFINED_glFramebufferTextureEXT\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLFRAMEBUFFERTEXTUREEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level);\r
+  GLEE_EXTERN GLEEPFNGLFRAMEBUFFERTEXTUREEXTPROC GLeeFuncPtr_glFramebufferTextureEXT;\r
+  #define glFramebufferTextureEXT GLeeFuncPtr_glFramebufferTextureEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFramebufferTextureLayerEXT\r
+#define GLEE_H_DEFINED_glFramebufferTextureLayerEXT\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLFRAMEBUFFERTEXTURELAYEREXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);\r
+  GLEE_EXTERN GLEEPFNGLFRAMEBUFFERTEXTURELAYEREXTPROC GLeeFuncPtr_glFramebufferTextureLayerEXT;\r
+  #define glFramebufferTextureLayerEXT GLeeFuncPtr_glFramebufferTextureLayerEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFramebufferTextureFaceEXT\r
+#define GLEE_H_DEFINED_glFramebufferTextureFaceEXT\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLFRAMEBUFFERTEXTUREFACEEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face);\r
+  GLEE_EXTERN GLEEPFNGLFRAMEBUFFERTEXTUREFACEEXTPROC GLeeFuncPtr_glFramebufferTextureFaceEXT;\r
+  #define glFramebufferTextureFaceEXT GLeeFuncPtr_glFramebufferTextureFaceEXT\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_scene_marker */\r
+\r
+#ifndef GL_EXT_scene_marker\r
+#define GL_EXT_scene_marker 1\r
+#define __GLEE_GL_EXT_scene_marker 1\r
+/* Constants */\r
+#ifndef GLEE_H_DEFINED_glBeginSceneEXT\r
+#define GLEE_H_DEFINED_glBeginSceneEXT\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLBEGINSCENEEXTPROC) ();\r
+  GLEE_EXTERN GLEEPFNGLBEGINSCENEEXTPROC GLeeFuncPtr_glBeginSceneEXT;\r
+  #define glBeginSceneEXT GLeeFuncPtr_glBeginSceneEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glEndSceneEXT\r
+#define GLEE_H_DEFINED_glEndSceneEXT\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLENDSCENEEXTPROC) ();\r
+  GLEE_EXTERN GLEEPFNGLENDSCENEEXTPROC GLeeFuncPtr_glEndSceneEXT;\r
+  #define glEndSceneEXT GLeeFuncPtr_glEndSceneEXT\r
+#endif\r
+#endif \r
+\r
+/* GL_EXT_texture_compression_dxt1 */\r
+\r
+#ifndef GL_EXT_texture_compression_dxt1\r
+#define GL_EXT_texture_compression_dxt1 1\r
+#define __GLEE_GL_EXT_texture_compression_dxt1 1\r
+/* Constants */\r
+#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT                    0x83F0\r
+#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT                   0x83F1\r
+#endif \r
+\r
+/* GL_EXT_texture_env */\r
+\r
+#ifndef GL_EXT_texture_env\r
+#define GL_EXT_texture_env 1\r
+#define __GLEE_GL_EXT_texture_env 1\r
+/* Constants */\r
+#define GL_TEXTURE_ENV0_EXT                                0\r
+#define GL_TEXTURE_ENV_MODE_ALPHA_EXT                      0\r
+#define GL_ENV_COPY_EXT                                    0\r
+#define GL_ENV_REPLACE_EXT                                 0\r
+#define GL_ENV_MODULATE_EXT                                0\r
+#define GL_ENV_ADD_EXT                                     0\r
+#define GL_ENV_SUBTRACT_EXT                                0\r
+#define GL_ENV_REVERSE_SUBTRACT_EXT                        0\r
+#define GL_ENV_BLEND_EXT                                   0\r
+#define GL_ENV_REVERSE_BLEND_EXT                           0\r
+#define GL_TEXTURE_ENV_SHIFT_EXT                           0\r
+#endif \r
+\r
+/* GL_IBM_static_data */\r
+\r
+#ifndef GL_IBM_static_data\r
+#define GL_IBM_static_data 1\r
+#define __GLEE_GL_IBM_static_data 1\r
+/* Constants */\r
+#define GL_ALL_STATIC_DATA_IBM                             103060\r
+#define GL_STATIC_VERTEX_ARRAY_IBM                         103061\r
+#endif \r
+\r
+/* GL_NV_gpu_program4 */\r
+\r
+#ifndef GL_NV_gpu_program4\r
+#define GL_NV_gpu_program4 1\r
+#define __GLEE_GL_NV_gpu_program4 1\r
+/* Constants */\r
+#define GL_MIN_PROGRAM_TEXEL_OFFSET_EXT                    0x8904\r
+#define GL_MAX_PROGRAM_TEXEL_OFFSET_EXT                    0x8905\r
+#define GL_PROGRAM_ATTRIB_COMPONENTS_NV                    0x8906\r
+#define GL_PROGRAM_RESULT_COMPONENTS_NV                    0x8907\r
+#define GL_MAX_PROGRAM_ATTRIB_COMPONENTS_NV                0x8908\r
+#define GL_MAX_PROGRAM_RESULT_COMPONENTS_NV                0x8909\r
+#define GL_MAX_PROGRAM_GENERIC_ATTRIBS_NV                  0x8DA5\r
+#define GL_MAX_PROGRAM_GENERIC_RESULTS_NV                  0x8DA6\r
+#define GL_GEOMETRY_PROGRAM_NV                             0x8C26\r
+#define GL_MAX_PROGRAM_OUTPUT_VERTICES_NV                  0x8C27\r
+#define GL_MAX_PROGRAM_TOTAL_OUTPUT_COMPONENTS_NV          0x8C28\r
+#define GL_GEOMETRY_VERTICES_OUT_EXT                       0x8DDA\r
+#define GL_GEOMETRY_INPUT_TYPE_EXT                         0x8DDB\r
+#define GL_GEOMETRY_OUTPUT_TYPE_EXT                        0x8DDC\r
+#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT            0x8C29\r
+#define GL_LINES_ADJACENCY_EXT                             0xA\r
+#define GL_LINE_STRIP_ADJACENCY_EXT                        0xB\r
+#define GL_TRIANGLES_ADJACENCY_EXT                         0xC\r
+#define GL_TRIANGLE_STRIP_ADJACENCY_EXT                    0xD\r
+#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT        0x8DA8\r
+#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT          0x8DA9\r
+#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT              0x8DA7\r
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT        0x8CD4\r
+#define GL_PROGRAM_POINT_SIZE_EXT                          0x8642\r
+#define GL_VERTEX_ATTRIB_ARRAY_INTEGER_EXT                 0x88FD\r
+#ifndef GLEE_H_DEFINED_glProgramLocalParameterI4iNV\r
+#define GLEE_H_DEFINED_glProgramLocalParameterI4iNV\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLPROGRAMLOCALPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMLOCALPARAMETERI4INVPROC GLeeFuncPtr_glProgramLocalParameterI4iNV;\r
+  #define glProgramLocalParameterI4iNV GLeeFuncPtr_glProgramLocalParameterI4iNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramLocalParameterI4ivNV\r
+#define GLEE_H_DEFINED_glProgramLocalParameterI4ivNV\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLPROGRAMLOCALPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMLOCALPARAMETERI4IVNVPROC GLeeFuncPtr_glProgramLocalParameterI4ivNV;\r
+  #define glProgramLocalParameterI4ivNV GLeeFuncPtr_glProgramLocalParameterI4ivNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramLocalParametersI4ivNV\r
+#define GLEE_H_DEFINED_glProgramLocalParametersI4ivNV\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC GLeeFuncPtr_glProgramLocalParametersI4ivNV;\r
+  #define glProgramLocalParametersI4ivNV GLeeFuncPtr_glProgramLocalParametersI4ivNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramLocalParameterI4uiNV\r
+#define GLEE_H_DEFINED_glProgramLocalParameterI4uiNV\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLPROGRAMLOCALPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMLOCALPARAMETERI4UINVPROC GLeeFuncPtr_glProgramLocalParameterI4uiNV;\r
+  #define glProgramLocalParameterI4uiNV GLeeFuncPtr_glProgramLocalParameterI4uiNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramLocalParameterI4uivNV\r
+#define GLEE_H_DEFINED_glProgramLocalParameterI4uivNV\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint * params);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC GLeeFuncPtr_glProgramLocalParameterI4uivNV;\r
+  #define glProgramLocalParameterI4uivNV GLeeFuncPtr_glProgramLocalParameterI4uivNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramLocalParametersI4uivNV\r
+#define GLEE_H_DEFINED_glProgramLocalParametersI4uivNV\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint * params);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC GLeeFuncPtr_glProgramLocalParametersI4uivNV;\r
+  #define glProgramLocalParametersI4uivNV GLeeFuncPtr_glProgramLocalParametersI4uivNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramEnvParameterI4iNV\r
+#define GLEE_H_DEFINED_glProgramEnvParameterI4iNV\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLPROGRAMENVPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMENVPARAMETERI4INVPROC GLeeFuncPtr_glProgramEnvParameterI4iNV;\r
+  #define glProgramEnvParameterI4iNV GLeeFuncPtr_glProgramEnvParameterI4iNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramEnvParameterI4ivNV\r
+#define GLEE_H_DEFINED_glProgramEnvParameterI4ivNV\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLPROGRAMENVPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMENVPARAMETERI4IVNVPROC GLeeFuncPtr_glProgramEnvParameterI4ivNV;\r
+  #define glProgramEnvParameterI4ivNV GLeeFuncPtr_glProgramEnvParameterI4ivNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramEnvParametersI4ivNV\r
+#define GLEE_H_DEFINED_glProgramEnvParametersI4ivNV\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLPROGRAMENVPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMENVPARAMETERSI4IVNVPROC GLeeFuncPtr_glProgramEnvParametersI4ivNV;\r
+  #define glProgramEnvParametersI4ivNV GLeeFuncPtr_glProgramEnvParametersI4ivNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramEnvParameterI4uiNV\r
+#define GLEE_H_DEFINED_glProgramEnvParameterI4uiNV\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLPROGRAMENVPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMENVPARAMETERI4UINVPROC GLeeFuncPtr_glProgramEnvParameterI4uiNV;\r
+  #define glProgramEnvParameterI4uiNV GLeeFuncPtr_glProgramEnvParameterI4uiNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramEnvParameterI4uivNV\r
+#define GLEE_H_DEFINED_glProgramEnvParameterI4uivNV\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLPROGRAMENVPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint * params);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMENVPARAMETERI4UIVNVPROC GLeeFuncPtr_glProgramEnvParameterI4uivNV;\r
+  #define glProgramEnvParameterI4uivNV GLeeFuncPtr_glProgramEnvParameterI4uivNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glProgramEnvParametersI4uivNV\r
+#define GLEE_H_DEFINED_glProgramEnvParametersI4uivNV\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLPROGRAMENVPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint * params);\r
+  GLEE_EXTERN GLEEPFNGLPROGRAMENVPARAMETERSI4UIVNVPROC GLeeFuncPtr_glProgramEnvParametersI4uivNV;\r
+  #define glProgramEnvParametersI4uivNV GLeeFuncPtr_glProgramEnvParametersI4uivNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetProgramLocalParameterIivNV\r
+#define GLEE_H_DEFINED_glGetProgramLocalParameterIivNV\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLGETPROGRAMLOCALPARAMETERIIVNVPROC) (GLenum target, GLuint index, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETPROGRAMLOCALPARAMETERIIVNVPROC GLeeFuncPtr_glGetProgramLocalParameterIivNV;\r
+  #define glGetProgramLocalParameterIivNV GLeeFuncPtr_glGetProgramLocalParameterIivNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetProgramLocalParameterIuivNV\r
+#define GLEE_H_DEFINED_glGetProgramLocalParameterIuivNV\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLGETPROGRAMLOCALPARAMETERIUIVNVPROC) (GLenum target, GLuint index, GLuint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETPROGRAMLOCALPARAMETERIUIVNVPROC GLeeFuncPtr_glGetProgramLocalParameterIuivNV;\r
+  #define glGetProgramLocalParameterIuivNV GLeeFuncPtr_glGetProgramLocalParameterIuivNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetProgramEnvParameterIivNV\r
+#define GLEE_H_DEFINED_glGetProgramEnvParameterIivNV\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLGETPROGRAMENVPARAMETERIIVNVPROC) (GLenum target, GLuint index, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETPROGRAMENVPARAMETERIIVNVPROC GLeeFuncPtr_glGetProgramEnvParameterIivNV;\r
+  #define glGetProgramEnvParameterIivNV GLeeFuncPtr_glGetProgramEnvParameterIivNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetProgramEnvParameterIuivNV\r
+#define GLEE_H_DEFINED_glGetProgramEnvParameterIuivNV\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLGETPROGRAMENVPARAMETERIUIVNVPROC) (GLenum target, GLuint index, GLuint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETPROGRAMENVPARAMETERIUIVNVPROC GLeeFuncPtr_glGetProgramEnvParameterIuivNV;\r
+  #define glGetProgramEnvParameterIuivNV GLeeFuncPtr_glGetProgramEnvParameterIuivNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFramebufferTextureEXT\r
+#define GLEE_H_DEFINED_glFramebufferTextureEXT\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLFRAMEBUFFERTEXTUREEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level);\r
+  GLEE_EXTERN GLEEPFNGLFRAMEBUFFERTEXTUREEXTPROC GLeeFuncPtr_glFramebufferTextureEXT;\r
+  #define glFramebufferTextureEXT GLeeFuncPtr_glFramebufferTextureEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFramebufferTextureLayerEXT\r
+#define GLEE_H_DEFINED_glFramebufferTextureLayerEXT\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLFRAMEBUFFERTEXTURELAYEREXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);\r
+  GLEE_EXTERN GLEEPFNGLFRAMEBUFFERTEXTURELAYEREXTPROC GLeeFuncPtr_glFramebufferTextureLayerEXT;\r
+  #define glFramebufferTextureLayerEXT GLeeFuncPtr_glFramebufferTextureLayerEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFramebufferTextureFaceEXT\r
+#define GLEE_H_DEFINED_glFramebufferTextureFaceEXT\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLFRAMEBUFFERTEXTUREFACEEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face);\r
+  GLEE_EXTERN GLEEPFNGLFRAMEBUFFERTEXTUREFACEEXTPROC GLeeFuncPtr_glFramebufferTextureFaceEXT;\r
+  #define glFramebufferTextureFaceEXT GLeeFuncPtr_glFramebufferTextureFaceEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttribI2iEXT\r
+#define GLEE_H_DEFINED_glVertexAttribI2iEXT\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLVERTEXATTRIBI2IEXTPROC) (GLuint index, GLint x, GLint y);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI2IEXTPROC GLeeFuncPtr_glVertexAttribI2iEXT;\r
+  #define glVertexAttribI2iEXT GLeeFuncPtr_glVertexAttribI2iEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttribI3iEXT\r
+#define GLEE_H_DEFINED_glVertexAttribI3iEXT\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLVERTEXATTRIBI3IEXTPROC) (GLuint index, GLint x, GLint y, GLint z);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI3IEXTPROC GLeeFuncPtr_glVertexAttribI3iEXT;\r
+  #define glVertexAttribI3iEXT GLeeFuncPtr_glVertexAttribI3iEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttribI4iEXT\r
+#define GLEE_H_DEFINED_glVertexAttribI4iEXT\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLVERTEXATTRIBI4IEXTPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI4IEXTPROC GLeeFuncPtr_glVertexAttribI4iEXT;\r
+  #define glVertexAttribI4iEXT GLeeFuncPtr_glVertexAttribI4iEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttribI1uiEXT\r
+#define GLEE_H_DEFINED_glVertexAttribI1uiEXT\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLVERTEXATTRIBI1UIEXTPROC) (GLuint index, GLuint x);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI1UIEXTPROC GLeeFuncPtr_glVertexAttribI1uiEXT;\r
+  #define glVertexAttribI1uiEXT GLeeFuncPtr_glVertexAttribI1uiEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttribI2uiEXT\r
+#define GLEE_H_DEFINED_glVertexAttribI2uiEXT\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLVERTEXATTRIBI2UIEXTPROC) (GLuint index, GLuint x, GLuint y);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI2UIEXTPROC GLeeFuncPtr_glVertexAttribI2uiEXT;\r
+  #define glVertexAttribI2uiEXT GLeeFuncPtr_glVertexAttribI2uiEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttribI3uiEXT\r
+#define GLEE_H_DEFINED_glVertexAttribI3uiEXT\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLVERTEXATTRIBI3UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI3UIEXTPROC GLeeFuncPtr_glVertexAttribI3uiEXT;\r
+  #define glVertexAttribI3uiEXT GLeeFuncPtr_glVertexAttribI3uiEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttribI4uiEXT\r
+#define GLEE_H_DEFINED_glVertexAttribI4uiEXT\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLVERTEXATTRIBI4UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI4UIEXTPROC GLeeFuncPtr_glVertexAttribI4uiEXT;\r
+  #define glVertexAttribI4uiEXT GLeeFuncPtr_glVertexAttribI4uiEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttribI1ivEXT\r
+#define GLEE_H_DEFINED_glVertexAttribI1ivEXT\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLVERTEXATTRIBI1IVEXTPROC) (GLuint index, const GLint * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI1IVEXTPROC GLeeFuncPtr_glVertexAttribI1ivEXT;\r
+  #define glVertexAttribI1ivEXT GLeeFuncPtr_glVertexAttribI1ivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttribI2ivEXT\r
+#define GLEE_H_DEFINED_glVertexAttribI2ivEXT\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLVERTEXATTRIBI2IVEXTPROC) (GLuint index, const GLint * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI2IVEXTPROC GLeeFuncPtr_glVertexAttribI2ivEXT;\r
+  #define glVertexAttribI2ivEXT GLeeFuncPtr_glVertexAttribI2ivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttribI3ivEXT\r
+#define GLEE_H_DEFINED_glVertexAttribI3ivEXT\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLVERTEXATTRIBI3IVEXTPROC) (GLuint index, const GLint * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI3IVEXTPROC GLeeFuncPtr_glVertexAttribI3ivEXT;\r
+  #define glVertexAttribI3ivEXT GLeeFuncPtr_glVertexAttribI3ivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttribI4ivEXT\r
+#define GLEE_H_DEFINED_glVertexAttribI4ivEXT\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLVERTEXATTRIBI4IVEXTPROC) (GLuint index, const GLint * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI4IVEXTPROC GLeeFuncPtr_glVertexAttribI4ivEXT;\r
+  #define glVertexAttribI4ivEXT GLeeFuncPtr_glVertexAttribI4ivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttribI1uivEXT\r
+#define GLEE_H_DEFINED_glVertexAttribI1uivEXT\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLVERTEXATTRIBI1UIVEXTPROC) (GLuint index, const GLuint * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI1UIVEXTPROC GLeeFuncPtr_glVertexAttribI1uivEXT;\r
+  #define glVertexAttribI1uivEXT GLeeFuncPtr_glVertexAttribI1uivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttribI2uivEXT\r
+#define GLEE_H_DEFINED_glVertexAttribI2uivEXT\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLVERTEXATTRIBI2UIVEXTPROC) (GLuint index, const GLuint * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI2UIVEXTPROC GLeeFuncPtr_glVertexAttribI2uivEXT;\r
+  #define glVertexAttribI2uivEXT GLeeFuncPtr_glVertexAttribI2uivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttribI3uivEXT\r
+#define GLEE_H_DEFINED_glVertexAttribI3uivEXT\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLVERTEXATTRIBI3UIVEXTPROC) (GLuint index, const GLuint * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI3UIVEXTPROC GLeeFuncPtr_glVertexAttribI3uivEXT;\r
+  #define glVertexAttribI3uivEXT GLeeFuncPtr_glVertexAttribI3uivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttribI4uivEXT\r
+#define GLEE_H_DEFINED_glVertexAttribI4uivEXT\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLVERTEXATTRIBI4UIVEXTPROC) (GLuint index, const GLuint * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI4UIVEXTPROC GLeeFuncPtr_glVertexAttribI4uivEXT;\r
+  #define glVertexAttribI4uivEXT GLeeFuncPtr_glVertexAttribI4uivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttribI4bvEXT\r
+#define GLEE_H_DEFINED_glVertexAttribI4bvEXT\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLVERTEXATTRIBI4BVEXTPROC) (GLuint index, const GLbyte * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI4BVEXTPROC GLeeFuncPtr_glVertexAttribI4bvEXT;\r
+  #define glVertexAttribI4bvEXT GLeeFuncPtr_glVertexAttribI4bvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttribI4svEXT\r
+#define GLEE_H_DEFINED_glVertexAttribI4svEXT\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLVERTEXATTRIBI4SVEXTPROC) (GLuint index, const GLshort * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI4SVEXTPROC GLeeFuncPtr_glVertexAttribI4svEXT;\r
+  #define glVertexAttribI4svEXT GLeeFuncPtr_glVertexAttribI4svEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttribI4ubvEXT\r
+#define GLEE_H_DEFINED_glVertexAttribI4ubvEXT\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLVERTEXATTRIBI4UBVEXTPROC) (GLuint index, const GLubyte * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI4UBVEXTPROC GLeeFuncPtr_glVertexAttribI4ubvEXT;\r
+  #define glVertexAttribI4ubvEXT GLeeFuncPtr_glVertexAttribI4ubvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttribI4usvEXT\r
+#define GLEE_H_DEFINED_glVertexAttribI4usvEXT\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLVERTEXATTRIBI4USVEXTPROC) (GLuint index, const GLushort * v);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIBI4USVEXTPROC GLeeFuncPtr_glVertexAttribI4usvEXT;\r
+  #define glVertexAttribI4usvEXT GLeeFuncPtr_glVertexAttribI4usvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glVertexAttribIPointerEXT\r
+#define GLEE_H_DEFINED_glVertexAttribIPointerEXT\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLVERTEXATTRIBIPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid * pointer);\r
+  GLEE_EXTERN GLEEPFNGLVERTEXATTRIBIPOINTEREXTPROC GLeeFuncPtr_glVertexAttribIPointerEXT;\r
+  #define glVertexAttribIPointerEXT GLeeFuncPtr_glVertexAttribIPointerEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetVertexAttribIivEXT\r
+#define GLEE_H_DEFINED_glGetVertexAttribIivEXT\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLGETVERTEXATTRIBIIVEXTPROC) (GLuint index, GLenum pname, GLint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETVERTEXATTRIBIIVEXTPROC GLeeFuncPtr_glGetVertexAttribIivEXT;\r
+  #define glGetVertexAttribIivEXT GLeeFuncPtr_glGetVertexAttribIivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetVertexAttribIuivEXT\r
+#define GLEE_H_DEFINED_glGetVertexAttribIuivEXT\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLGETVERTEXATTRIBIUIVEXTPROC) (GLuint index, GLenum pname, GLuint * params);\r
+  GLEE_EXTERN GLEEPFNGLGETVERTEXATTRIBIUIVEXTPROC GLeeFuncPtr_glGetVertexAttribIuivEXT;\r
+  #define glGetVertexAttribIuivEXT GLeeFuncPtr_glGetVertexAttribIuivEXT\r
+#endif\r
+#endif \r
+\r
+/* GL_OES_byte_coordinates */\r
+\r
+#ifndef GL_OES_byte_coordinates\r
+#define GL_OES_byte_coordinates 1\r
+#define __GLEE_GL_OES_byte_coordinates 1\r
+/* Constants */\r
+#define GL_BYTE                                            0x1400\r
+#endif \r
+\r
+/* GL_OES_compressed_paletted_texture */\r
+\r
+#ifndef GL_OES_compressed_paletted_texture\r
+#define GL_OES_compressed_paletted_texture 1\r
+#define __GLEE_GL_OES_compressed_paletted_texture 1\r
+/* Constants */\r
+#define GL_PALETTE4_RGB8_OES                               0x8B90\r
+#define GL_PALETTE4_RGBA8_OES                              0x8B91\r
+#define GL_PALETTE4_R5_G6_B5_OES                           0x8B92\r
+#define GL_PALETTE4_RGBA4_OES                              0x8B93\r
+#define GL_PALETTE4_RGB5_A1_OES                            0x8B94\r
+#define GL_PALETTE8_RGB8_OES                               0x8B95\r
+#define GL_PALETTE8_RGBA8_OES                              0x8B96\r
+#define GL_PALETTE8_R5_G6_B5_OES                           0x8B97\r
+#define GL_PALETTE8_RGBA4_OES                              0x8B98\r
+#define GL_PALETTE8_RGB5_A1_OES                            0x8B99\r
+#endif \r
+\r
+/* GL_OES_single_precision */\r
+\r
+#ifndef GL_OES_single_precision\r
+#define GL_OES_single_precision 1\r
+#define __GLEE_GL_OES_single_precision 1\r
+/* Constants */\r
+#ifndef GLEE_H_DEFINED_glDepthRangefOES\r
+#define GLEE_H_DEFINED_glDepthRangefOES\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLDEPTHRANGEFOESPROC) (GLclampf n, GLclampf f);\r
+  GLEE_EXTERN GLEEPFNGLDEPTHRANGEFOESPROC GLeeFuncPtr_glDepthRangefOES;\r
+  #define glDepthRangefOES GLeeFuncPtr_glDepthRangefOES\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glFrustumfOES\r
+#define GLEE_H_DEFINED_glFrustumfOES\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLFRUSTUMFOESPROC) (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f);\r
+  GLEE_EXTERN GLEEPFNGLFRUSTUMFOESPROC GLeeFuncPtr_glFrustumfOES;\r
+  #define glFrustumfOES GLeeFuncPtr_glFrustumfOES\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glOrthofOES\r
+#define GLEE_H_DEFINED_glOrthofOES\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLORTHOFOESPROC) (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f);\r
+  GLEE_EXTERN GLEEPFNGLORTHOFOESPROC GLeeFuncPtr_glOrthofOES;\r
+  #define glOrthofOES GLeeFuncPtr_glOrthofOES\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glClipPlanefOES\r
+#define GLEE_H_DEFINED_glClipPlanefOES\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLCLIPPLANEFOESPROC) (GLenum plane, const GLfloat* equation);\r
+  GLEE_EXTERN GLEEPFNGLCLIPPLANEFOESPROC GLeeFuncPtr_glClipPlanefOES;\r
+  #define glClipPlanefOES GLeeFuncPtr_glClipPlanefOES\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glGetClipPlanefOES\r
+#define GLEE_H_DEFINED_glGetClipPlanefOES\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLGETCLIPPLANEFOESPROC) (GLenum plane, GLfloat* equation);\r
+  GLEE_EXTERN GLEEPFNGLGETCLIPPLANEFOESPROC GLeeFuncPtr_glGetClipPlanefOES;\r
+  #define glGetClipPlanefOES GLeeFuncPtr_glGetClipPlanefOES\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glClearDepthfOES\r
+#define GLEE_H_DEFINED_glClearDepthfOES\r
+  typedef GLvoid (APIENTRYP GLEEPFNGLCLEARDEPTHFOESPROC) (GLclampd depth);\r
+  GLEE_EXTERN GLEEPFNGLCLEARDEPTHFOESPROC GLeeFuncPtr_glClearDepthfOES;\r
+  #define glClearDepthfOES GLeeFuncPtr_glClearDepthfOES\r
+#endif\r
+#endif \r
+\r
+/* GL_SGIX_pixel_texture_bits */\r
+\r
+#ifndef GL_SGIX_pixel_texture_bits\r
+#define GL_SGIX_pixel_texture_bits 1\r
+#define __GLEE_GL_SGIX_pixel_texture_bits 1\r
+/* Constants */\r
+#endif \r
+\r
+/* GL_SGIX_texture_range */\r
+\r
+#ifndef GL_SGIX_texture_range\r
+#define GL_SGIX_texture_range 1\r
+#define __GLEE_GL_SGIX_texture_range 1\r
+/* Constants */\r
+#define GL_RGB_SIGNED_SGIX                                 0x85E0\r
+#define GL_RGBA_SIGNED_SGIX                                0x85E1\r
+#define GL_ALPHA_SIGNED_SGIX                               0x85E2\r
+#define GL_LUMINANCE_SIGNED_SGIX                           0x85E3\r
+#define GL_INTENSITY_SIGNED_SGIX                           0x85E4\r
+#define GL_LUMINANCE_ALPHA_SIGNED_SGIX                     0x85E5\r
+#define GL_RGB16_SIGNED_SGIX                               0x85E6\r
+#define GL_RGBA16_SIGNED_SGIX                              0x85E7\r
+#define GL_ALPHA16_SIGNED_SGIX                             0x85E8\r
+#define GL_LUMINANCE16_SIGNED_SGIX                         0x85E9\r
+#define GL_INTENSITY16_SIGNED_SGIX                         0x85EA\r
+#define GL_LUMINANCE16_ALPHA16_SIGNED_SGIX                 0x85EB\r
+#define GL_RGB_EXTENDED_RANGE_SGIX                         0x85EC\r
+#define GL_RGBA_EXTENDED_RANGE_SGIX                        0x85ED\r
+#define GL_ALPHA_EXTENDED_RANGE_SGIX                       0x85EE\r
+#define GL_LUMINANCE_EXTENDED_RANGE_SGIX                   0x85EF\r
+#define GL_INTENSITY_EXTENDED_RANGE_SGIX                   0x85F0\r
+#define GL_LUMINANCE_ALPHA_EXTENDED_RANGE_SGIX             0x85F1\r
+#define GL_RGB16_EXTENDED_RANGE_SGIX                       0x85F2\r
+#define GL_RGBA16_EXTENDED_RANGE_SGIX                      0x85F3\r
+#define GL_ALPHA16_EXTENDED_RANGE_SGIX                     0x85F4\r
+#define GL_LUMINANCE16_EXTENDED_RANGE_SGIX                 0x85F5\r
+#define GL_INTENSITY16_EXTENDED_RANGE_SGIX                 0x85F6\r
+#define GL_LUMINANCE16_ALPHA16_EXTENDED_RANGE_SGIX         0x85F7\r
+#define GL_MIN_LUMINANCE_SGIS                              0x85F8\r
+#define GL_MAX_LUMINANCE_SGIS                              0x85F9\r
+#define GL_MIN_INTENSITY_SGIS                              0x85FA\r
+#define GL_MAX_INTENSITY_SGIS                              0x85FB\r
+#endif \r
+\r
+/* WGL  */\r
+\r
+#ifdef WIN32\r
+\r
+/* Extension querying variables */\r
+\r
+GLEE_EXTERN GLboolean _GLEE_WGL_ARB_buffer_region;\r
+GLEE_EXTERN GLboolean _GLEE_WGL_ARB_multisample;\r
+GLEE_EXTERN GLboolean _GLEE_WGL_ARB_extensions_string;\r
+GLEE_EXTERN GLboolean _GLEE_WGL_ARB_pixel_format;\r
+GLEE_EXTERN GLboolean _GLEE_WGL_ARB_make_current_read;\r
+GLEE_EXTERN GLboolean _GLEE_WGL_ARB_pbuffer;\r
+GLEE_EXTERN GLboolean _GLEE_WGL_ARB_render_texture;\r
+GLEE_EXTERN GLboolean _GLEE_WGL_ARB_pixel_format_float;\r
+GLEE_EXTERN GLboolean _GLEE_WGL_ARB_create_context;\r
+GLEE_EXTERN GLboolean _GLEE_WGL_EXT_make_current_read;\r
+GLEE_EXTERN GLboolean _GLEE_WGL_EXT_pixel_format;\r
+GLEE_EXTERN GLboolean _GLEE_WGL_EXT_pbuffer;\r
+GLEE_EXTERN GLboolean _GLEE_WGL_EXT_depth_float;\r
+GLEE_EXTERN GLboolean _GLEE_WGL_3DFX_multisample;\r
+GLEE_EXTERN GLboolean _GLEE_WGL_EXT_multisample;\r
+GLEE_EXTERN GLboolean _GLEE_WGL_I3D_digital_video_control;\r
+GLEE_EXTERN GLboolean _GLEE_WGL_I3D_gamma;\r
+GLEE_EXTERN GLboolean _GLEE_WGL_I3D_genlock;\r
+GLEE_EXTERN GLboolean _GLEE_WGL_I3D_image_buffer;\r
+GLEE_EXTERN GLboolean _GLEE_WGL_I3D_swap_frame_lock;\r
+GLEE_EXTERN GLboolean _GLEE_WGL_NV_render_depth_texture;\r
+GLEE_EXTERN GLboolean _GLEE_WGL_NV_render_texture_rectangle;\r
+GLEE_EXTERN GLboolean _GLEE_WGL_ATI_pixel_format_float;\r
+GLEE_EXTERN GLboolean _GLEE_WGL_NV_float_buffer;\r
+GLEE_EXTERN GLboolean _GLEE_WGL_3DL_stereo_control;\r
+GLEE_EXTERN GLboolean _GLEE_WGL_EXT_pixel_format_packed_float;\r
+GLEE_EXTERN GLboolean _GLEE_WGL_EXT_framebuffer_sRGB;\r
+GLEE_EXTERN GLboolean _GLEE_WGL_NV_present_video;\r
+GLEE_EXTERN GLboolean _GLEE_WGL_NV_swap_group;\r
+GLEE_EXTERN GLboolean _GLEE_WGL_NV_gpu_affinity;\r
+GLEE_EXTERN GLboolean _GLEE_WGL_EXT_display_color_table;\r
+GLEE_EXTERN GLboolean _GLEE_WGL_EXT_extensions_string;\r
+GLEE_EXTERN GLboolean _GLEE_WGL_EXT_swap_control;\r
+GLEE_EXTERN GLboolean _GLEE_WGL_NV_vertex_array_range;\r
+GLEE_EXTERN GLboolean _GLEE_WGL_OML_sync_control;\r
+GLEE_EXTERN GLboolean _GLEE_WGL_I3D_swap_frame_usage;\r
+GLEE_EXTERN GLboolean _GLEE_WGL_NV_video_output;\r
+\r
+/* Aliases for extension querying variables */\r
+\r
+#define GLEE_WGL_ARB_buffer_region     GLeeEnabled(&_GLEE_WGL_ARB_buffer_region)\r
+#define GLEE_WGL_ARB_multisample     GLeeEnabled(&_GLEE_WGL_ARB_multisample)\r
+#define GLEE_WGL_ARB_extensions_string     GLeeEnabled(&_GLEE_WGL_ARB_extensions_string)\r
+#define GLEE_WGL_ARB_pixel_format     GLeeEnabled(&_GLEE_WGL_ARB_pixel_format)\r
+#define GLEE_WGL_ARB_make_current_read     GLeeEnabled(&_GLEE_WGL_ARB_make_current_read)\r
+#define GLEE_WGL_ARB_pbuffer     GLeeEnabled(&_GLEE_WGL_ARB_pbuffer)\r
+#define GLEE_WGL_ARB_render_texture     GLeeEnabled(&_GLEE_WGL_ARB_render_texture)\r
+#define GLEE_WGL_ARB_pixel_format_float     GLeeEnabled(&_GLEE_WGL_ARB_pixel_format_float)\r
+#define GLEE_WGL_ARB_create_context     GLeeEnabled(&_GLEE_WGL_ARB_create_context)\r
+#define GLEE_WGL_EXT_make_current_read     GLeeEnabled(&_GLEE_WGL_EXT_make_current_read)\r
+#define GLEE_WGL_EXT_pixel_format     GLeeEnabled(&_GLEE_WGL_EXT_pixel_format)\r
+#define GLEE_WGL_EXT_pbuffer     GLeeEnabled(&_GLEE_WGL_EXT_pbuffer)\r
+#define GLEE_WGL_EXT_depth_float     GLeeEnabled(&_GLEE_WGL_EXT_depth_float)\r
+#define GLEE_WGL_3DFX_multisample     GLeeEnabled(&_GLEE_WGL_3DFX_multisample)\r
+#define GLEE_WGL_EXT_multisample     GLeeEnabled(&_GLEE_WGL_EXT_multisample)\r
+#define GLEE_WGL_I3D_digital_video_control     GLeeEnabled(&_GLEE_WGL_I3D_digital_video_control)\r
+#define GLEE_WGL_I3D_gamma     GLeeEnabled(&_GLEE_WGL_I3D_gamma)\r
+#define GLEE_WGL_I3D_genlock     GLeeEnabled(&_GLEE_WGL_I3D_genlock)\r
+#define GLEE_WGL_I3D_image_buffer     GLeeEnabled(&_GLEE_WGL_I3D_image_buffer)\r
+#define GLEE_WGL_I3D_swap_frame_lock     GLeeEnabled(&_GLEE_WGL_I3D_swap_frame_lock)\r
+#define GLEE_WGL_NV_render_depth_texture     GLeeEnabled(&_GLEE_WGL_NV_render_depth_texture)\r
+#define GLEE_WGL_NV_render_texture_rectangle     GLeeEnabled(&_GLEE_WGL_NV_render_texture_rectangle)\r
+#define GLEE_WGL_ATI_pixel_format_float     GLeeEnabled(&_GLEE_WGL_ATI_pixel_format_float)\r
+#define GLEE_WGL_NV_float_buffer     GLeeEnabled(&_GLEE_WGL_NV_float_buffer)\r
+#define GLEE_WGL_3DL_stereo_control     GLeeEnabled(&_GLEE_WGL_3DL_stereo_control)\r
+#define GLEE_WGL_EXT_pixel_format_packed_float     GLeeEnabled(&_GLEE_WGL_EXT_pixel_format_packed_float)\r
+#define GLEE_WGL_EXT_framebuffer_sRGB     GLeeEnabled(&_GLEE_WGL_EXT_framebuffer_sRGB)\r
+#define GLEE_WGL_NV_present_video     GLeeEnabled(&_GLEE_WGL_NV_present_video)\r
+#define GLEE_WGL_NV_swap_group     GLeeEnabled(&_GLEE_WGL_NV_swap_group)\r
+#define GLEE_WGL_NV_gpu_affinity     GLeeEnabled(&_GLEE_WGL_NV_gpu_affinity)\r
+#define GLEE_WGL_EXT_display_color_table     GLeeEnabled(&_GLEE_WGL_EXT_display_color_table)\r
+#define GLEE_WGL_EXT_extensions_string     GLeeEnabled(&_GLEE_WGL_EXT_extensions_string)\r
+#define GLEE_WGL_EXT_swap_control     GLeeEnabled(&_GLEE_WGL_EXT_swap_control)\r
+#define GLEE_WGL_NV_vertex_array_range     GLeeEnabled(&_GLEE_WGL_NV_vertex_array_range)\r
+#define GLEE_WGL_OML_sync_control     GLeeEnabled(&_GLEE_WGL_OML_sync_control)\r
+#define GLEE_WGL_I3D_swap_frame_usage     GLeeEnabled(&_GLEE_WGL_I3D_swap_frame_usage)\r
+#define GLEE_WGL_NV_video_output     GLeeEnabled(&_GLEE_WGL_NV_video_output)\r
+\r
+/* WGL_ARB_buffer_region */\r
+\r
+#ifndef WGL_ARB_buffer_region\r
+#define WGL_ARB_buffer_region 1\r
+#define __GLEE_WGL_ARB_buffer_region 1\r
+/* Constants */\r
+#define WGL_FRONT_COLOR_BUFFER_BIT_ARB                     0x00000001\r
+#define WGL_BACK_COLOR_BUFFER_BIT_ARB                      0x00000002\r
+#define WGL_DEPTH_BUFFER_BIT_ARB                           0x00000004\r
+#define WGL_STENCIL_BUFFER_BIT_ARB                         0x00000008\r
+#ifndef GLEE_H_DEFINED_wglCreateBufferRegionARB\r
+#define GLEE_H_DEFINED_wglCreateBufferRegionARB\r
+  typedef HANDLE (APIENTRYP GLEEPFNWGLCREATEBUFFERREGIONARBPROC) (HDC hDC, int iLayerPlane, UINT uType);\r
+  GLEE_EXTERN GLEEPFNWGLCREATEBUFFERREGIONARBPROC GLeeFuncPtr_wglCreateBufferRegionARB;\r
+  #define wglCreateBufferRegionARB GLeeFuncPtr_wglCreateBufferRegionARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglDeleteBufferRegionARB\r
+#define GLEE_H_DEFINED_wglDeleteBufferRegionARB\r
+  typedef VOID (APIENTRYP GLEEPFNWGLDELETEBUFFERREGIONARBPROC) (HANDLE hRegion);\r
+  GLEE_EXTERN GLEEPFNWGLDELETEBUFFERREGIONARBPROC GLeeFuncPtr_wglDeleteBufferRegionARB;\r
+  #define wglDeleteBufferRegionARB GLeeFuncPtr_wglDeleteBufferRegionARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglSaveBufferRegionARB\r
+#define GLEE_H_DEFINED_wglSaveBufferRegionARB\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLSAVEBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height);\r
+  GLEE_EXTERN GLEEPFNWGLSAVEBUFFERREGIONARBPROC GLeeFuncPtr_wglSaveBufferRegionARB;\r
+  #define wglSaveBufferRegionARB GLeeFuncPtr_wglSaveBufferRegionARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglRestoreBufferRegionARB\r
+#define GLEE_H_DEFINED_wglRestoreBufferRegionARB\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLRESTOREBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height, int xSrc, int ySrc);\r
+  GLEE_EXTERN GLEEPFNWGLRESTOREBUFFERREGIONARBPROC GLeeFuncPtr_wglRestoreBufferRegionARB;\r
+  #define wglRestoreBufferRegionARB GLeeFuncPtr_wglRestoreBufferRegionARB\r
+#endif\r
+#endif \r
+\r
+/* WGL_ARB_multisample */\r
+\r
+#ifndef WGL_ARB_multisample\r
+#define WGL_ARB_multisample 1\r
+#define __GLEE_WGL_ARB_multisample 1\r
+/* Constants */\r
+#define WGL_SAMPLE_BUFFERS_ARB                             0x2041\r
+#define WGL_SAMPLES_ARB                                    0x2042\r
+#endif \r
+\r
+/* WGL_ARB_extensions_string */\r
+\r
+#ifndef WGL_ARB_extensions_string\r
+#define WGL_ARB_extensions_string 1\r
+#define __GLEE_WGL_ARB_extensions_string 1\r
+/* Constants */\r
+#ifndef GLEE_H_DEFINED_wglGetExtensionsStringARB\r
+#define GLEE_H_DEFINED_wglGetExtensionsStringARB\r
+  typedef const char * (APIENTRYP GLEEPFNWGLGETEXTENSIONSSTRINGARBPROC) (HDC hdc);\r
+  GLEE_EXTERN GLEEPFNWGLGETEXTENSIONSSTRINGARBPROC GLeeFuncPtr_wglGetExtensionsStringARB;\r
+  #define wglGetExtensionsStringARB GLeeFuncPtr_wglGetExtensionsStringARB\r
+#endif\r
+#endif \r
+\r
+/* WGL_ARB_pixel_format */\r
+\r
+#ifndef WGL_ARB_pixel_format\r
+#define WGL_ARB_pixel_format 1\r
+#define __GLEE_WGL_ARB_pixel_format 1\r
+/* Constants */\r
+#define WGL_NUMBER_PIXEL_FORMATS_ARB                       0x2000\r
+#define WGL_DRAW_TO_WINDOW_ARB                             0x2001\r
+#define WGL_DRAW_TO_BITMAP_ARB                             0x2002\r
+#define WGL_ACCELERATION_ARB                               0x2003\r
+#define WGL_NEED_PALETTE_ARB                               0x2004\r
+#define WGL_NEED_SYSTEM_PALETTE_ARB                        0x2005\r
+#define WGL_SWAP_LAYER_BUFFERS_ARB                         0x2006\r
+#define WGL_SWAP_METHOD_ARB                                0x2007\r
+#define WGL_NUMBER_OVERLAYS_ARB                            0x2008\r
+#define WGL_NUMBER_UNDERLAYS_ARB                           0x2009\r
+#define WGL_TRANSPARENT_ARB                                0x200A\r
+#define WGL_TRANSPARENT_RED_VALUE_ARB                      0x2037\r
+#define WGL_TRANSPARENT_GREEN_VALUE_ARB                    0x2038\r
+#define WGL_TRANSPARENT_BLUE_VALUE_ARB                     0x2039\r
+#define WGL_TRANSPARENT_ALPHA_VALUE_ARB                    0x203A\r
+#define WGL_TRANSPARENT_INDEX_VALUE_ARB                    0x203B\r
+#define WGL_SHARE_DEPTH_ARB                                0x200C\r
+#define WGL_SHARE_STENCIL_ARB                              0x200D\r
+#define WGL_SHARE_ACCUM_ARB                                0x200E\r
+#define WGL_SUPPORT_GDI_ARB                                0x200F\r
+#define WGL_SUPPORT_OPENGL_ARB                             0x2010\r
+#define WGL_DOUBLE_BUFFER_ARB                              0x2011\r
+#define WGL_STEREO_ARB                                     0x2012\r
+#define WGL_PIXEL_TYPE_ARB                                 0x2013\r
+#define WGL_COLOR_BITS_ARB                                 0x2014\r
+#define WGL_RED_BITS_ARB                                   0x2015\r
+#define WGL_RED_SHIFT_ARB                                  0x2016\r
+#define WGL_GREEN_BITS_ARB                                 0x2017\r
+#define WGL_GREEN_SHIFT_ARB                                0x2018\r
+#define WGL_BLUE_BITS_ARB                                  0x2019\r
+#define WGL_BLUE_SHIFT_ARB                                 0x201A\r
+#define WGL_ALPHA_BITS_ARB                                 0x201B\r
+#define WGL_ALPHA_SHIFT_ARB                                0x201C\r
+#define WGL_ACCUM_BITS_ARB                                 0x201D\r
+#define WGL_ACCUM_RED_BITS_ARB                             0x201E\r
+#define WGL_ACCUM_GREEN_BITS_ARB                           0x201F\r
+#define WGL_ACCUM_BLUE_BITS_ARB                            0x2020\r
+#define WGL_ACCUM_ALPHA_BITS_ARB                           0x2021\r
+#define WGL_DEPTH_BITS_ARB                                 0x2022\r
+#define WGL_STENCIL_BITS_ARB                               0x2023\r
+#define WGL_AUX_BUFFERS_ARB                                0x2024\r
+#define WGL_NO_ACCELERATION_ARB                            0x2025\r
+#define WGL_GENERIC_ACCELERATION_ARB                       0x2026\r
+#define WGL_FULL_ACCELERATION_ARB                          0x2027\r
+#define WGL_SWAP_EXCHANGE_ARB                              0x2028\r
+#define WGL_SWAP_COPY_ARB                                  0x2029\r
+#define WGL_SWAP_UNDEFINED_ARB                             0x202A\r
+#define WGL_TYPE_RGBA_ARB                                  0x202B\r
+#define WGL_TYPE_COLORINDEX_ARB                            0x202C\r
+#ifndef GLEE_H_DEFINED_wglGetPixelFormatAttribivARB\r
+#define GLEE_H_DEFINED_wglGetPixelFormatAttribivARB\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLGETPIXELFORMATATTRIBIVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int * piAttributes, int * piValues);\r
+  GLEE_EXTERN GLEEPFNWGLGETPIXELFORMATATTRIBIVARBPROC GLeeFuncPtr_wglGetPixelFormatAttribivARB;\r
+  #define wglGetPixelFormatAttribivARB GLeeFuncPtr_wglGetPixelFormatAttribivARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglGetPixelFormatAttribfvARB\r
+#define GLEE_H_DEFINED_wglGetPixelFormatAttribfvARB\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLGETPIXELFORMATATTRIBFVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int * piAttributes, FLOAT * pfValues);\r
+  GLEE_EXTERN GLEEPFNWGLGETPIXELFORMATATTRIBFVARBPROC GLeeFuncPtr_wglGetPixelFormatAttribfvARB;\r
+  #define wglGetPixelFormatAttribfvARB GLeeFuncPtr_wglGetPixelFormatAttribfvARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglChoosePixelFormatARB\r
+#define GLEE_H_DEFINED_wglChoosePixelFormatARB\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLCHOOSEPIXELFORMATARBPROC) (HDC hdc, const int * piAttribIList, const FLOAT * pfAttribFList, UINT nMaxFormats, int * piFormats, UINT * nNumFormats);\r
+  GLEE_EXTERN GLEEPFNWGLCHOOSEPIXELFORMATARBPROC GLeeFuncPtr_wglChoosePixelFormatARB;\r
+  #define wglChoosePixelFormatARB GLeeFuncPtr_wglChoosePixelFormatARB\r
+#endif\r
+#endif \r
+\r
+/* WGL_ARB_make_current_read */\r
+\r
+#ifndef WGL_ARB_make_current_read\r
+#define WGL_ARB_make_current_read 1\r
+#define __GLEE_WGL_ARB_make_current_read 1\r
+/* Constants */\r
+#define ERROR_INVALID_PIXEL_TYPE_ARB                       0x2043\r
+#define ERROR_INCOMPATIBLE_DEVICE_CONTEXTS_ARB             0x2054\r
+#ifndef GLEE_H_DEFINED_wglMakeContextCurrentARB\r
+#define GLEE_H_DEFINED_wglMakeContextCurrentARB\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLMAKECONTEXTCURRENTARBPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc);\r
+  GLEE_EXTERN GLEEPFNWGLMAKECONTEXTCURRENTARBPROC GLeeFuncPtr_wglMakeContextCurrentARB;\r
+  #define wglMakeContextCurrentARB GLeeFuncPtr_wglMakeContextCurrentARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglGetCurrentReadDCARB\r
+#define GLEE_H_DEFINED_wglGetCurrentReadDCARB\r
+  typedef HDC (APIENTRYP GLEEPFNWGLGETCURRENTREADDCARBPROC) ();\r
+  GLEE_EXTERN GLEEPFNWGLGETCURRENTREADDCARBPROC GLeeFuncPtr_wglGetCurrentReadDCARB;\r
+  #define wglGetCurrentReadDCARB GLeeFuncPtr_wglGetCurrentReadDCARB\r
+#endif\r
+#endif \r
+\r
+/* WGL_ARB_pbuffer */\r
+\r
+#ifndef WGL_ARB_pbuffer\r
+#define WGL_ARB_pbuffer 1\r
+#define __GLEE_WGL_ARB_pbuffer 1\r
+/* Constants */\r
+#define WGL_DRAW_TO_PBUFFER_ARB                            0x202D\r
+#define WGL_MAX_PBUFFER_PIXELS_ARB                         0x202E\r
+#define WGL_MAX_PBUFFER_WIDTH_ARB                          0x202F\r
+#define WGL_MAX_PBUFFER_HEIGHT_ARB                         0x2030\r
+#define WGL_PBUFFER_LARGEST_ARB                            0x2033\r
+#define WGL_PBUFFER_WIDTH_ARB                              0x2034\r
+#define WGL_PBUFFER_HEIGHT_ARB                             0x2035\r
+#define WGL_PBUFFER_LOST_ARB                               0x2036\r
+#ifndef GLEE_H_DEFINED_wglCreatePbufferARB\r
+#define GLEE_H_DEFINED_wglCreatePbufferARB\r
+  typedef HPBUFFERARB (APIENTRYP GLEEPFNWGLCREATEPBUFFERARBPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int * piAttribList);\r
+  GLEE_EXTERN GLEEPFNWGLCREATEPBUFFERARBPROC GLeeFuncPtr_wglCreatePbufferARB;\r
+  #define wglCreatePbufferARB GLeeFuncPtr_wglCreatePbufferARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglGetPbufferDCARB\r
+#define GLEE_H_DEFINED_wglGetPbufferDCARB\r
+  typedef HDC (APIENTRYP GLEEPFNWGLGETPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer);\r
+  GLEE_EXTERN GLEEPFNWGLGETPBUFFERDCARBPROC GLeeFuncPtr_wglGetPbufferDCARB;\r
+  #define wglGetPbufferDCARB GLeeFuncPtr_wglGetPbufferDCARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglReleasePbufferDCARB\r
+#define GLEE_H_DEFINED_wglReleasePbufferDCARB\r
+  typedef int (APIENTRYP GLEEPFNWGLRELEASEPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer, HDC hDC);\r
+  GLEE_EXTERN GLEEPFNWGLRELEASEPBUFFERDCARBPROC GLeeFuncPtr_wglReleasePbufferDCARB;\r
+  #define wglReleasePbufferDCARB GLeeFuncPtr_wglReleasePbufferDCARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglDestroyPbufferARB\r
+#define GLEE_H_DEFINED_wglDestroyPbufferARB\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLDESTROYPBUFFERARBPROC) (HPBUFFERARB hPbuffer);\r
+  GLEE_EXTERN GLEEPFNWGLDESTROYPBUFFERARBPROC GLeeFuncPtr_wglDestroyPbufferARB;\r
+  #define wglDestroyPbufferARB GLeeFuncPtr_wglDestroyPbufferARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglQueryPbufferARB\r
+#define GLEE_H_DEFINED_wglQueryPbufferARB\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLQUERYPBUFFERARBPROC) (HPBUFFERARB hPbuffer, int iAttribute, int * piValue);\r
+  GLEE_EXTERN GLEEPFNWGLQUERYPBUFFERARBPROC GLeeFuncPtr_wglQueryPbufferARB;\r
+  #define wglQueryPbufferARB GLeeFuncPtr_wglQueryPbufferARB\r
+#endif\r
+#endif \r
+\r
+/* WGL_ARB_render_texture */\r
+\r
+#ifndef WGL_ARB_render_texture\r
+#define WGL_ARB_render_texture 1\r
+#define __GLEE_WGL_ARB_render_texture 1\r
+/* Constants */\r
+#define WGL_BIND_TO_TEXTURE_RGB_ARB                        0x2070\r
+#define WGL_BIND_TO_TEXTURE_RGBA_ARB                       0x2071\r
+#define WGL_TEXTURE_FORMAT_ARB                             0x2072\r
+#define WGL_TEXTURE_TARGET_ARB                             0x2073\r
+#define WGL_MIPMAP_TEXTURE_ARB                             0x2074\r
+#define WGL_TEXTURE_RGB_ARB                                0x2075\r
+#define WGL_TEXTURE_RGBA_ARB                               0x2076\r
+#define WGL_NO_TEXTURE_ARB                                 0x2077\r
+#define WGL_TEXTURE_CUBE_MAP_ARB                           0x2078\r
+#define WGL_TEXTURE_1D_ARB                                 0x2079\r
+#define WGL_TEXTURE_2D_ARB                                 0x207A\r
+#define WGL_MIPMAP_LEVEL_ARB                               0x207B\r
+#define WGL_CUBE_MAP_FACE_ARB                              0x207C\r
+#define WGL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB                0x207D\r
+#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB                0x207E\r
+#define WGL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB                0x207F\r
+#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB                0x2080\r
+#define WGL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB                0x2081\r
+#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB                0x2082\r
+#define WGL_FRONT_LEFT_ARB                                 0x2083\r
+#define WGL_FRONT_RIGHT_ARB                                0x2084\r
+#define WGL_BACK_LEFT_ARB                                  0x2085\r
+#define WGL_BACK_RIGHT_ARB                                 0x2086\r
+#define WGL_AUX0_ARB                                       0x2087\r
+#define WGL_AUX1_ARB                                       0x2088\r
+#define WGL_AUX2_ARB                                       0x2089\r
+#define WGL_AUX3_ARB                                       0x208A\r
+#define WGL_AUX4_ARB                                       0x208B\r
+#define WGL_AUX5_ARB                                       0x208C\r
+#define WGL_AUX6_ARB                                       0x208D\r
+#define WGL_AUX7_ARB                                       0x208E\r
+#define WGL_AUX8_ARB                                       0x208F\r
+#define WGL_AUX9_ARB                                       0x2090\r
+#ifndef GLEE_H_DEFINED_wglBindTexImageARB\r
+#define GLEE_H_DEFINED_wglBindTexImageARB\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLBINDTEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer);\r
+  GLEE_EXTERN GLEEPFNWGLBINDTEXIMAGEARBPROC GLeeFuncPtr_wglBindTexImageARB;\r
+  #define wglBindTexImageARB GLeeFuncPtr_wglBindTexImageARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglReleaseTexImageARB\r
+#define GLEE_H_DEFINED_wglReleaseTexImageARB\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLRELEASETEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer);\r
+  GLEE_EXTERN GLEEPFNWGLRELEASETEXIMAGEARBPROC GLeeFuncPtr_wglReleaseTexImageARB;\r
+  #define wglReleaseTexImageARB GLeeFuncPtr_wglReleaseTexImageARB\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglSetPbufferAttribARB\r
+#define GLEE_H_DEFINED_wglSetPbufferAttribARB\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLSETPBUFFERATTRIBARBPROC) (HPBUFFERARB hPbuffer, const int * piAttribList);\r
+  GLEE_EXTERN GLEEPFNWGLSETPBUFFERATTRIBARBPROC GLeeFuncPtr_wglSetPbufferAttribARB;\r
+  #define wglSetPbufferAttribARB GLeeFuncPtr_wglSetPbufferAttribARB\r
+#endif\r
+#endif \r
+\r
+/* WGL_ARB_pixel_format_float */\r
+\r
+#ifndef WGL_ARB_pixel_format_float\r
+#define WGL_ARB_pixel_format_float 1\r
+#define __GLEE_WGL_ARB_pixel_format_float 1\r
+/* Constants */\r
+#define WGL_TYPE_RGBA_FLOAT_ARB                            0x21A0\r
+#endif \r
+\r
+/* WGL_ARB_create_context */\r
+\r
+#ifndef WGL_ARB_create_context\r
+#define WGL_ARB_create_context 1\r
+#define __GLEE_WGL_ARB_create_context 1\r
+/* Constants */\r
+#define WGL_CONTEXT_DEBUG_BIT_ARB                          0x0001\r
+#define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB             0x0002\r
+#define WGL_CONTEXT_MAJOR_VERSION_ARB                      0x2091\r
+#define WGL_CONTEXT_MINOR_VERSION_ARB                      0x2092\r
+#define WGL_CONTEXT_LAYER_PLANE_ARB                        0x2093\r
+#define WGL_CONTEXT_FLAGS_ARB                              0x2094\r
+#define ERROR_INVALID_VERSION_ARB                          0x2095\r
+#ifndef GLEE_H_DEFINED_wglCreateContextAttribsARB\r
+#define GLEE_H_DEFINED_wglCreateContextAttribsARB\r
+  typedef HGLRC (APIENTRYP GLEEPFNWGLCREATECONTEXTATTRIBSARBPROC) (HDC hDC, HGLRC hShareContext, const int * attribList);\r
+  GLEE_EXTERN GLEEPFNWGLCREATECONTEXTATTRIBSARBPROC GLeeFuncPtr_wglCreateContextAttribsARB;\r
+  #define wglCreateContextAttribsARB GLeeFuncPtr_wglCreateContextAttribsARB\r
+#endif\r
+#endif \r
+\r
+/* WGL_EXT_make_current_read */\r
+\r
+#ifndef WGL_EXT_make_current_read\r
+#define WGL_EXT_make_current_read 1\r
+#define __GLEE_WGL_EXT_make_current_read 1\r
+/* Constants */\r
+#define ERROR_INVALID_PIXEL_TYPE_EXT                       0x2043\r
+#ifndef GLEE_H_DEFINED_wglMakeContextCurrentEXT\r
+#define GLEE_H_DEFINED_wglMakeContextCurrentEXT\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLMAKECONTEXTCURRENTEXTPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc);\r
+  GLEE_EXTERN GLEEPFNWGLMAKECONTEXTCURRENTEXTPROC GLeeFuncPtr_wglMakeContextCurrentEXT;\r
+  #define wglMakeContextCurrentEXT GLeeFuncPtr_wglMakeContextCurrentEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglGetCurrentReadDCEXT\r
+#define GLEE_H_DEFINED_wglGetCurrentReadDCEXT\r
+  typedef HDC (APIENTRYP GLEEPFNWGLGETCURRENTREADDCEXTPROC) ();\r
+  GLEE_EXTERN GLEEPFNWGLGETCURRENTREADDCEXTPROC GLeeFuncPtr_wglGetCurrentReadDCEXT;\r
+  #define wglGetCurrentReadDCEXT GLeeFuncPtr_wglGetCurrentReadDCEXT\r
+#endif\r
+#endif \r
+\r
+/* WGL_EXT_pixel_format */\r
+\r
+#ifndef WGL_EXT_pixel_format\r
+#define WGL_EXT_pixel_format 1\r
+#define __GLEE_WGL_EXT_pixel_format 1\r
+/* Constants */\r
+#define WGL_NUMBER_PIXEL_FORMATS_EXT                       0x2000\r
+#define WGL_DRAW_TO_WINDOW_EXT                             0x2001\r
+#define WGL_DRAW_TO_BITMAP_EXT                             0x2002\r
+#define WGL_ACCELERATION_EXT                               0x2003\r
+#define WGL_NEED_PALETTE_EXT                               0x2004\r
+#define WGL_NEED_SYSTEM_PALETTE_EXT                        0x2005\r
+#define WGL_SWAP_LAYER_BUFFERS_EXT                         0x2006\r
+#define WGL_SWAP_METHOD_EXT                                0x2007\r
+#define WGL_NUMBER_OVERLAYS_EXT                            0x2008\r
+#define WGL_NUMBER_UNDERLAYS_EXT                           0x2009\r
+#define WGL_TRANSPARENT_EXT                                0x200A\r
+#define WGL_TRANSPARENT_VALUE_EXT                          0x200B\r
+#define WGL_SHARE_DEPTH_EXT                                0x200C\r
+#define WGL_SHARE_STENCIL_EXT                              0x200D\r
+#define WGL_SHARE_ACCUM_EXT                                0x200E\r
+#define WGL_SUPPORT_GDI_EXT                                0x200F\r
+#define WGL_SUPPORT_OPENGL_EXT                             0x2010\r
+#define WGL_DOUBLE_BUFFER_EXT                              0x2011\r
+#define WGL_STEREO_EXT                                     0x2012\r
+#define WGL_PIXEL_TYPE_EXT                                 0x2013\r
+#define WGL_COLOR_BITS_EXT                                 0x2014\r
+#define WGL_RED_BITS_EXT                                   0x2015\r
+#define WGL_RED_SHIFT_EXT                                  0x2016\r
+#define WGL_GREEN_BITS_EXT                                 0x2017\r
+#define WGL_GREEN_SHIFT_EXT                                0x2018\r
+#define WGL_BLUE_BITS_EXT                                  0x2019\r
+#define WGL_BLUE_SHIFT_EXT                                 0x201A\r
+#define WGL_ALPHA_BITS_EXT                                 0x201B\r
+#define WGL_ALPHA_SHIFT_EXT                                0x201C\r
+#define WGL_ACCUM_BITS_EXT                                 0x201D\r
+#define WGL_ACCUM_RED_BITS_EXT                             0x201E\r
+#define WGL_ACCUM_GREEN_BITS_EXT                           0x201F\r
+#define WGL_ACCUM_BLUE_BITS_EXT                            0x2020\r
+#define WGL_ACCUM_ALPHA_BITS_EXT                           0x2021\r
+#define WGL_DEPTH_BITS_EXT                                 0x2022\r
+#define WGL_STENCIL_BITS_EXT                               0x2023\r
+#define WGL_AUX_BUFFERS_EXT                                0x2024\r
+#define WGL_NO_ACCELERATION_EXT                            0x2025\r
+#define WGL_GENERIC_ACCELERATION_EXT                       0x2026\r
+#define WGL_FULL_ACCELERATION_EXT                          0x2027\r
+#define WGL_SWAP_EXCHANGE_EXT                              0x2028\r
+#define WGL_SWAP_COPY_EXT                                  0x2029\r
+#define WGL_SWAP_UNDEFINED_EXT                             0x202A\r
+#define WGL_TYPE_RGBA_EXT                                  0x202B\r
+#define WGL_TYPE_COLORINDEX_EXT                            0x202C\r
+#ifndef GLEE_H_DEFINED_wglGetPixelFormatAttribivEXT\r
+#define GLEE_H_DEFINED_wglGetPixelFormatAttribivEXT\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLGETPIXELFORMATATTRIBIVEXTPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int * piAttributes, int * piValues);\r
+  GLEE_EXTERN GLEEPFNWGLGETPIXELFORMATATTRIBIVEXTPROC GLeeFuncPtr_wglGetPixelFormatAttribivEXT;\r
+  #define wglGetPixelFormatAttribivEXT GLeeFuncPtr_wglGetPixelFormatAttribivEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglGetPixelFormatAttribfvEXT\r
+#define GLEE_H_DEFINED_wglGetPixelFormatAttribfvEXT\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLGETPIXELFORMATATTRIBFVEXTPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int * piAttributes, FLOAT * pfValues);\r
+  GLEE_EXTERN GLEEPFNWGLGETPIXELFORMATATTRIBFVEXTPROC GLeeFuncPtr_wglGetPixelFormatAttribfvEXT;\r
+  #define wglGetPixelFormatAttribfvEXT GLeeFuncPtr_wglGetPixelFormatAttribfvEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglChoosePixelFormatEXT\r
+#define GLEE_H_DEFINED_wglChoosePixelFormatEXT\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLCHOOSEPIXELFORMATEXTPROC) (HDC hdc, const int * piAttribIList, const FLOAT * pfAttribFList, UINT nMaxFormats, int * piFormats, UINT * nNumFormats);\r
+  GLEE_EXTERN GLEEPFNWGLCHOOSEPIXELFORMATEXTPROC GLeeFuncPtr_wglChoosePixelFormatEXT;\r
+  #define wglChoosePixelFormatEXT GLeeFuncPtr_wglChoosePixelFormatEXT\r
+#endif\r
+#endif \r
+\r
+/* WGL_EXT_pbuffer */\r
+\r
+#ifndef WGL_EXT_pbuffer\r
+#define WGL_EXT_pbuffer 1\r
+#define __GLEE_WGL_EXT_pbuffer 1\r
+/* Constants */\r
+#define WGL_DRAW_TO_PBUFFER_EXT                            0x202D\r
+#define WGL_MAX_PBUFFER_PIXELS_EXT                         0x202E\r
+#define WGL_MAX_PBUFFER_WIDTH_EXT                          0x202F\r
+#define WGL_MAX_PBUFFER_HEIGHT_EXT                         0x2030\r
+#define WGL_OPTIMAL_PBUFFER_WIDTH_EXT                      0x2031\r
+#define WGL_OPTIMAL_PBUFFER_HEIGHT_EXT                     0x2032\r
+#define WGL_PBUFFER_LARGEST_EXT                            0x2033\r
+#define WGL_PBUFFER_WIDTH_EXT                              0x2034\r
+#define WGL_PBUFFER_HEIGHT_EXT                             0x2035\r
+#ifndef GLEE_H_DEFINED_wglCreatePbufferEXT\r
+#define GLEE_H_DEFINED_wglCreatePbufferEXT\r
+  typedef HPBUFFEREXT (APIENTRYP GLEEPFNWGLCREATEPBUFFEREXTPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int * piAttribList);\r
+  GLEE_EXTERN GLEEPFNWGLCREATEPBUFFEREXTPROC GLeeFuncPtr_wglCreatePbufferEXT;\r
+  #define wglCreatePbufferEXT GLeeFuncPtr_wglCreatePbufferEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglGetPbufferDCEXT\r
+#define GLEE_H_DEFINED_wglGetPbufferDCEXT\r
+  typedef HDC (APIENTRYP GLEEPFNWGLGETPBUFFERDCEXTPROC) (HPBUFFEREXT hPbuffer);\r
+  GLEE_EXTERN GLEEPFNWGLGETPBUFFERDCEXTPROC GLeeFuncPtr_wglGetPbufferDCEXT;\r
+  #define wglGetPbufferDCEXT GLeeFuncPtr_wglGetPbufferDCEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglReleasePbufferDCEXT\r
+#define GLEE_H_DEFINED_wglReleasePbufferDCEXT\r
+  typedef int (APIENTRYP GLEEPFNWGLRELEASEPBUFFERDCEXTPROC) (HPBUFFEREXT hPbuffer, HDC hDC);\r
+  GLEE_EXTERN GLEEPFNWGLRELEASEPBUFFERDCEXTPROC GLeeFuncPtr_wglReleasePbufferDCEXT;\r
+  #define wglReleasePbufferDCEXT GLeeFuncPtr_wglReleasePbufferDCEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglDestroyPbufferEXT\r
+#define GLEE_H_DEFINED_wglDestroyPbufferEXT\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLDESTROYPBUFFEREXTPROC) (HPBUFFEREXT hPbuffer);\r
+  GLEE_EXTERN GLEEPFNWGLDESTROYPBUFFEREXTPROC GLeeFuncPtr_wglDestroyPbufferEXT;\r
+  #define wglDestroyPbufferEXT GLeeFuncPtr_wglDestroyPbufferEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglQueryPbufferEXT\r
+#define GLEE_H_DEFINED_wglQueryPbufferEXT\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLQUERYPBUFFEREXTPROC) (HPBUFFEREXT hPbuffer, int iAttribute, int * piValue);\r
+  GLEE_EXTERN GLEEPFNWGLQUERYPBUFFEREXTPROC GLeeFuncPtr_wglQueryPbufferEXT;\r
+  #define wglQueryPbufferEXT GLeeFuncPtr_wglQueryPbufferEXT\r
+#endif\r
+#endif \r
+\r
+/* WGL_EXT_depth_float */\r
+\r
+#ifndef WGL_EXT_depth_float\r
+#define WGL_EXT_depth_float 1\r
+#define __GLEE_WGL_EXT_depth_float 1\r
+/* Constants */\r
+#define WGL_DEPTH_FLOAT_EXT                                0x2040\r
+#endif \r
+\r
+/* WGL_3DFX_multisample */\r
+\r
+#ifndef WGL_3DFX_multisample\r
+#define WGL_3DFX_multisample 1\r
+#define __GLEE_WGL_3DFX_multisample 1\r
+/* Constants */\r
+#define WGL_SAMPLE_BUFFERS_3DFX                            0x2060\r
+#define WGL_SAMPLES_3DFX                                   0x2061\r
+#endif \r
+\r
+/* WGL_EXT_multisample */\r
+\r
+#ifndef WGL_EXT_multisample\r
+#define WGL_EXT_multisample 1\r
+#define __GLEE_WGL_EXT_multisample 1\r
+/* Constants */\r
+#define WGL_SAMPLE_BUFFERS_EXT                             0x2041\r
+#define WGL_SAMPLES_EXT                                    0x2042\r
+#endif \r
+\r
+/* WGL_I3D_digital_video_control */\r
+\r
+#ifndef WGL_I3D_digital_video_control\r
+#define WGL_I3D_digital_video_control 1\r
+#define __GLEE_WGL_I3D_digital_video_control 1\r
+/* Constants */\r
+#define WGL_DIGITAL_VIDEO_CURSOR_ALPHA_FRAMEBUFFER_I3D     0x2050\r
+#define WGL_DIGITAL_VIDEO_CURSOR_ALPHA_VALUE_I3D           0x2051\r
+#define WGL_DIGITAL_VIDEO_CURSOR_INCLUDED_I3D              0x2052\r
+#define WGL_DIGITAL_VIDEO_GAMMA_CORRECTED_I3D              0x2053\r
+#ifndef GLEE_H_DEFINED_wglGetDigitalVideoParametersI3D\r
+#define GLEE_H_DEFINED_wglGetDigitalVideoParametersI3D\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC) (HDC hDC, int iAttribute, int * piValue);\r
+  GLEE_EXTERN GLEEPFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC GLeeFuncPtr_wglGetDigitalVideoParametersI3D;\r
+  #define wglGetDigitalVideoParametersI3D GLeeFuncPtr_wglGetDigitalVideoParametersI3D\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglSetDigitalVideoParametersI3D\r
+#define GLEE_H_DEFINED_wglSetDigitalVideoParametersI3D\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC) (HDC hDC, int iAttribute, const int * piValue);\r
+  GLEE_EXTERN GLEEPFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC GLeeFuncPtr_wglSetDigitalVideoParametersI3D;\r
+  #define wglSetDigitalVideoParametersI3D GLeeFuncPtr_wglSetDigitalVideoParametersI3D\r
+#endif\r
+#endif \r
+\r
+/* WGL_I3D_gamma */\r
+\r
+#ifndef WGL_I3D_gamma\r
+#define WGL_I3D_gamma 1\r
+#define __GLEE_WGL_I3D_gamma 1\r
+/* Constants */\r
+#define WGL_GAMMA_TABLE_SIZE_I3D                           0x204E\r
+#define WGL_GAMMA_EXCLUDE_DESKTOP_I3D                      0x204F\r
+#ifndef GLEE_H_DEFINED_wglGetGammaTableParametersI3D\r
+#define GLEE_H_DEFINED_wglGetGammaTableParametersI3D\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLGETGAMMATABLEPARAMETERSI3DPROC) (HDC hDC, int iAttribute, int * piValue);\r
+  GLEE_EXTERN GLEEPFNWGLGETGAMMATABLEPARAMETERSI3DPROC GLeeFuncPtr_wglGetGammaTableParametersI3D;\r
+  #define wglGetGammaTableParametersI3D GLeeFuncPtr_wglGetGammaTableParametersI3D\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglSetGammaTableParametersI3D\r
+#define GLEE_H_DEFINED_wglSetGammaTableParametersI3D\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLSETGAMMATABLEPARAMETERSI3DPROC) (HDC hDC, int iAttribute, const int * piValue);\r
+  GLEE_EXTERN GLEEPFNWGLSETGAMMATABLEPARAMETERSI3DPROC GLeeFuncPtr_wglSetGammaTableParametersI3D;\r
+  #define wglSetGammaTableParametersI3D GLeeFuncPtr_wglSetGammaTableParametersI3D\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglGetGammaTableI3D\r
+#define GLEE_H_DEFINED_wglGetGammaTableI3D\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLGETGAMMATABLEI3DPROC) (HDC hDC, int iEntries, USHORT * puRed, USHORT * puGreen, USHORT * puBlue);\r
+  GLEE_EXTERN GLEEPFNWGLGETGAMMATABLEI3DPROC GLeeFuncPtr_wglGetGammaTableI3D;\r
+  #define wglGetGammaTableI3D GLeeFuncPtr_wglGetGammaTableI3D\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglSetGammaTableI3D\r
+#define GLEE_H_DEFINED_wglSetGammaTableI3D\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLSETGAMMATABLEI3DPROC) (HDC hDC, int iEntries, const USHORT * puRed, const USHORT * puGreen, const USHORT * puBlue);\r
+  GLEE_EXTERN GLEEPFNWGLSETGAMMATABLEI3DPROC GLeeFuncPtr_wglSetGammaTableI3D;\r
+  #define wglSetGammaTableI3D GLeeFuncPtr_wglSetGammaTableI3D\r
+#endif\r
+#endif \r
+\r
+/* WGL_I3D_genlock */\r
+\r
+#ifndef WGL_I3D_genlock\r
+#define WGL_I3D_genlock 1\r
+#define __GLEE_WGL_I3D_genlock 1\r
+/* Constants */\r
+#define WGL_GENLOCK_SOURCE_MULTIVIEW_I3D                   0x2044\r
+#define WGL_GENLOCK_SOURCE_EXTENAL_SYNC_I3D                0x2045\r
+#define WGL_GENLOCK_SOURCE_EXTENAL_FIELD_I3D               0x2046\r
+#define WGL_GENLOCK_SOURCE_EXTENAL_TTL_I3D                 0x2047\r
+#define WGL_GENLOCK_SOURCE_DIGITAL_SYNC_I3D                0x2048\r
+#define WGL_GENLOCK_SOURCE_DIGITAL_FIELD_I3D               0x2049\r
+#define WGL_GENLOCK_SOURCE_EDGE_FALLING_I3D                0x204A\r
+#define WGL_GENLOCK_SOURCE_EDGE_RISING_I3D                 0x204B\r
+#define WGL_GENLOCK_SOURCE_EDGE_BOTH_I3D                   0x204C\r
+#ifndef GLEE_H_DEFINED_wglEnableGenlockI3D\r
+#define GLEE_H_DEFINED_wglEnableGenlockI3D\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLENABLEGENLOCKI3DPROC) (HDC hDC);\r
+  GLEE_EXTERN GLEEPFNWGLENABLEGENLOCKI3DPROC GLeeFuncPtr_wglEnableGenlockI3D;\r
+  #define wglEnableGenlockI3D GLeeFuncPtr_wglEnableGenlockI3D\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglDisableGenlockI3D\r
+#define GLEE_H_DEFINED_wglDisableGenlockI3D\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLDISABLEGENLOCKI3DPROC) (HDC hDC);\r
+  GLEE_EXTERN GLEEPFNWGLDISABLEGENLOCKI3DPROC GLeeFuncPtr_wglDisableGenlockI3D;\r
+  #define wglDisableGenlockI3D GLeeFuncPtr_wglDisableGenlockI3D\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglIsEnabledGenlockI3D\r
+#define GLEE_H_DEFINED_wglIsEnabledGenlockI3D\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLISENABLEDGENLOCKI3DPROC) (HDC hDC, BOOL * pFlag);\r
+  GLEE_EXTERN GLEEPFNWGLISENABLEDGENLOCKI3DPROC GLeeFuncPtr_wglIsEnabledGenlockI3D;\r
+  #define wglIsEnabledGenlockI3D GLeeFuncPtr_wglIsEnabledGenlockI3D\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglGenlockSourceI3D\r
+#define GLEE_H_DEFINED_wglGenlockSourceI3D\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLGENLOCKSOURCEI3DPROC) (HDC hDC, UINT uSource);\r
+  GLEE_EXTERN GLEEPFNWGLGENLOCKSOURCEI3DPROC GLeeFuncPtr_wglGenlockSourceI3D;\r
+  #define wglGenlockSourceI3D GLeeFuncPtr_wglGenlockSourceI3D\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglGetGenlockSourceI3D\r
+#define GLEE_H_DEFINED_wglGetGenlockSourceI3D\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLGETGENLOCKSOURCEI3DPROC) (HDC hDC, UINT * uSource);\r
+  GLEE_EXTERN GLEEPFNWGLGETGENLOCKSOURCEI3DPROC GLeeFuncPtr_wglGetGenlockSourceI3D;\r
+  #define wglGetGenlockSourceI3D GLeeFuncPtr_wglGetGenlockSourceI3D\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglGenlockSourceEdgeI3D\r
+#define GLEE_H_DEFINED_wglGenlockSourceEdgeI3D\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLGENLOCKSOURCEEDGEI3DPROC) (HDC hDC, UINT uEdge);\r
+  GLEE_EXTERN GLEEPFNWGLGENLOCKSOURCEEDGEI3DPROC GLeeFuncPtr_wglGenlockSourceEdgeI3D;\r
+  #define wglGenlockSourceEdgeI3D GLeeFuncPtr_wglGenlockSourceEdgeI3D\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglGetGenlockSourceEdgeI3D\r
+#define GLEE_H_DEFINED_wglGetGenlockSourceEdgeI3D\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLGETGENLOCKSOURCEEDGEI3DPROC) (HDC hDC, UINT * uEdge);\r
+  GLEE_EXTERN GLEEPFNWGLGETGENLOCKSOURCEEDGEI3DPROC GLeeFuncPtr_wglGetGenlockSourceEdgeI3D;\r
+  #define wglGetGenlockSourceEdgeI3D GLeeFuncPtr_wglGetGenlockSourceEdgeI3D\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglGenlockSampleRateI3D\r
+#define GLEE_H_DEFINED_wglGenlockSampleRateI3D\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLGENLOCKSAMPLERATEI3DPROC) (HDC hDC, UINT uRate);\r
+  GLEE_EXTERN GLEEPFNWGLGENLOCKSAMPLERATEI3DPROC GLeeFuncPtr_wglGenlockSampleRateI3D;\r
+  #define wglGenlockSampleRateI3D GLeeFuncPtr_wglGenlockSampleRateI3D\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglGetGenlockSampleRateI3D\r
+#define GLEE_H_DEFINED_wglGetGenlockSampleRateI3D\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLGETGENLOCKSAMPLERATEI3DPROC) (HDC hDC, UINT * uRate);\r
+  GLEE_EXTERN GLEEPFNWGLGETGENLOCKSAMPLERATEI3DPROC GLeeFuncPtr_wglGetGenlockSampleRateI3D;\r
+  #define wglGetGenlockSampleRateI3D GLeeFuncPtr_wglGetGenlockSampleRateI3D\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglGenlockSourceDelayI3D\r
+#define GLEE_H_DEFINED_wglGenlockSourceDelayI3D\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLGENLOCKSOURCEDELAYI3DPROC) (HDC hDC, UINT uDelay);\r
+  GLEE_EXTERN GLEEPFNWGLGENLOCKSOURCEDELAYI3DPROC GLeeFuncPtr_wglGenlockSourceDelayI3D;\r
+  #define wglGenlockSourceDelayI3D GLeeFuncPtr_wglGenlockSourceDelayI3D\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglGetGenlockSourceDelayI3D\r
+#define GLEE_H_DEFINED_wglGetGenlockSourceDelayI3D\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLGETGENLOCKSOURCEDELAYI3DPROC) (HDC hDC, UINT * uDelay);\r
+  GLEE_EXTERN GLEEPFNWGLGETGENLOCKSOURCEDELAYI3DPROC GLeeFuncPtr_wglGetGenlockSourceDelayI3D;\r
+  #define wglGetGenlockSourceDelayI3D GLeeFuncPtr_wglGetGenlockSourceDelayI3D\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglQueryGenlockMaxSourceDelayI3D\r
+#define GLEE_H_DEFINED_wglQueryGenlockMaxSourceDelayI3D\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC) (HDC hDC, UINT * uMaxLineDelay, UINT * uMaxPixelDelay);\r
+  GLEE_EXTERN GLEEPFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC GLeeFuncPtr_wglQueryGenlockMaxSourceDelayI3D;\r
+  #define wglQueryGenlockMaxSourceDelayI3D GLeeFuncPtr_wglQueryGenlockMaxSourceDelayI3D\r
+#endif\r
+#endif \r
+\r
+/* WGL_I3D_image_buffer */\r
+\r
+#ifndef WGL_I3D_image_buffer\r
+#define WGL_I3D_image_buffer 1\r
+#define __GLEE_WGL_I3D_image_buffer 1\r
+/* Constants */\r
+#define WGL_IMAGE_BUFFER_MIN_ACCESS_I3D                    0x00000001\r
+#define WGL_IMAGE_BUFFER_LOCK_I3D                          0x00000002\r
+#ifndef GLEE_H_DEFINED_wglCreateImageBufferI3D\r
+#define GLEE_H_DEFINED_wglCreateImageBufferI3D\r
+  typedef LPVOID (APIENTRYP GLEEPFNWGLCREATEIMAGEBUFFERI3DPROC) (HDC hDC, DWORD dwSize, UINT uFlags);\r
+  GLEE_EXTERN GLEEPFNWGLCREATEIMAGEBUFFERI3DPROC GLeeFuncPtr_wglCreateImageBufferI3D;\r
+  #define wglCreateImageBufferI3D GLeeFuncPtr_wglCreateImageBufferI3D\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglDestroyImageBufferI3D\r
+#define GLEE_H_DEFINED_wglDestroyImageBufferI3D\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLDESTROYIMAGEBUFFERI3DPROC) (HDC hDC, LPVOID pAddress);\r
+  GLEE_EXTERN GLEEPFNWGLDESTROYIMAGEBUFFERI3DPROC GLeeFuncPtr_wglDestroyImageBufferI3D;\r
+  #define wglDestroyImageBufferI3D GLeeFuncPtr_wglDestroyImageBufferI3D\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglAssociateImageBufferEventsI3D\r
+#define GLEE_H_DEFINED_wglAssociateImageBufferEventsI3D\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC) (HDC hDC, const HANDLE * pEvent, const LPVOID * pAddress, const DWORD * pSize, UINT count);\r
+  GLEE_EXTERN GLEEPFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC GLeeFuncPtr_wglAssociateImageBufferEventsI3D;\r
+  #define wglAssociateImageBufferEventsI3D GLeeFuncPtr_wglAssociateImageBufferEventsI3D\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglReleaseImageBufferEventsI3D\r
+#define GLEE_H_DEFINED_wglReleaseImageBufferEventsI3D\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC) (HDC hDC, const LPVOID * pAddress, UINT count);\r
+  GLEE_EXTERN GLEEPFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC GLeeFuncPtr_wglReleaseImageBufferEventsI3D;\r
+  #define wglReleaseImageBufferEventsI3D GLeeFuncPtr_wglReleaseImageBufferEventsI3D\r
+#endif\r
+#endif \r
+\r
+/* WGL_I3D_swap_frame_lock */\r
+\r
+#ifndef WGL_I3D_swap_frame_lock\r
+#define WGL_I3D_swap_frame_lock 1\r
+#define __GLEE_WGL_I3D_swap_frame_lock 1\r
+/* Constants */\r
+#ifndef GLEE_H_DEFINED_wglEnableFrameLockI3D\r
+#define GLEE_H_DEFINED_wglEnableFrameLockI3D\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLENABLEFRAMELOCKI3DPROC) ();\r
+  GLEE_EXTERN GLEEPFNWGLENABLEFRAMELOCKI3DPROC GLeeFuncPtr_wglEnableFrameLockI3D;\r
+  #define wglEnableFrameLockI3D GLeeFuncPtr_wglEnableFrameLockI3D\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglDisableFrameLockI3D\r
+#define GLEE_H_DEFINED_wglDisableFrameLockI3D\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLDISABLEFRAMELOCKI3DPROC) ();\r
+  GLEE_EXTERN GLEEPFNWGLDISABLEFRAMELOCKI3DPROC GLeeFuncPtr_wglDisableFrameLockI3D;\r
+  #define wglDisableFrameLockI3D GLeeFuncPtr_wglDisableFrameLockI3D\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglIsEnabledFrameLockI3D\r
+#define GLEE_H_DEFINED_wglIsEnabledFrameLockI3D\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLISENABLEDFRAMELOCKI3DPROC) (BOOL * pFlag);\r
+  GLEE_EXTERN GLEEPFNWGLISENABLEDFRAMELOCKI3DPROC GLeeFuncPtr_wglIsEnabledFrameLockI3D;\r
+  #define wglIsEnabledFrameLockI3D GLeeFuncPtr_wglIsEnabledFrameLockI3D\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglQueryFrameLockMasterI3D\r
+#define GLEE_H_DEFINED_wglQueryFrameLockMasterI3D\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLQUERYFRAMELOCKMASTERI3DPROC) (BOOL * pFlag);\r
+  GLEE_EXTERN GLEEPFNWGLQUERYFRAMELOCKMASTERI3DPROC GLeeFuncPtr_wglQueryFrameLockMasterI3D;\r
+  #define wglQueryFrameLockMasterI3D GLeeFuncPtr_wglQueryFrameLockMasterI3D\r
+#endif\r
+#endif \r
+\r
+/* WGL_NV_render_depth_texture */\r
+\r
+#ifndef WGL_NV_render_depth_texture\r
+#define WGL_NV_render_depth_texture 1\r
+#define __GLEE_WGL_NV_render_depth_texture 1\r
+/* Constants */\r
+#define WGL_BIND_TO_TEXTURE_DEPTH_NV                       0x20A3\r
+#define WGL_BIND_TO_TEXTURE_RECTANGLE_DEPTH_NV             0x20A4\r
+#define WGL_DEPTH_TEXTURE_FORMAT_NV                        0x20A5\r
+#define WGL_TEXTURE_DEPTH_COMPONENT_NV                     0x20A6\r
+#define WGL_DEPTH_COMPONENT_NV                             0x20A7\r
+#endif \r
+\r
+/* WGL_NV_render_texture_rectangle */\r
+\r
+#ifndef WGL_NV_render_texture_rectangle\r
+#define WGL_NV_render_texture_rectangle 1\r
+#define __GLEE_WGL_NV_render_texture_rectangle 1\r
+/* Constants */\r
+#define WGL_BIND_TO_TEXTURE_RECTANGLE_RGB_NV               0x20A0\r
+#define WGL_BIND_TO_TEXTURE_RECTANGLE_RGBA_NV              0x20A1\r
+#define WGL_TEXTURE_RECTANGLE_NV                           0x20A2\r
+#endif \r
+\r
+/* WGL_ATI_pixel_format_float */\r
+\r
+#ifndef WGL_ATI_pixel_format_float\r
+#define WGL_ATI_pixel_format_float 1\r
+#define __GLEE_WGL_ATI_pixel_format_float 1\r
+/* Constants */\r
+#define WGL_TYPE_RGBA_FLOAT_ATI                            0x21A0\r
+#endif \r
+\r
+/* WGL_NV_float_buffer */\r
+\r
+#ifndef WGL_NV_float_buffer\r
+#define WGL_NV_float_buffer 1\r
+#define __GLEE_WGL_NV_float_buffer 1\r
+/* Constants */\r
+#define WGL_FLOAT_COMPONENTS_NV                            0x20B0\r
+#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_R_NV           0x20B1\r
+#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RG_NV          0x20B2\r
+#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGB_NV         0x20B3\r
+#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGBA_NV        0x20B4\r
+#define WGL_TEXTURE_FLOAT_R_NV                             0x20B5\r
+#define WGL_TEXTURE_FLOAT_RG_NV                            0x20B6\r
+#define WGL_TEXTURE_FLOAT_RGB_NV                           0x20B7\r
+#define WGL_TEXTURE_FLOAT_RGBA_NV                          0x20B8\r
+#endif \r
+\r
+/* WGL_3DL_stereo_control */\r
+\r
+#ifndef WGL_3DL_stereo_control\r
+#define WGL_3DL_stereo_control 1\r
+#define __GLEE_WGL_3DL_stereo_control 1\r
+/* Constants */\r
+#define WGL_STEREO_EMITTER_ENABLE_3DL                      0x2055\r
+#define WGL_STEREO_EMITTER_DISABLE_3DL                     0x2056\r
+#define WGL_STEREO_POLARITY_NORMAL_3DL                     0x2057\r
+#define WGL_STEREO_POLARITY_INVERT_3DL                     0x2058\r
+#endif \r
+\r
+/* WGL_EXT_pixel_format_packed_float */\r
+\r
+#ifndef WGL_EXT_pixel_format_packed_float\r
+#define WGL_EXT_pixel_format_packed_float 1\r
+#define __GLEE_WGL_EXT_pixel_format_packed_float 1\r
+/* Constants */\r
+#define WGL_TYPE_RGBA_UNSIGNED_FLOAT_EXT                   0x20A8\r
+#endif \r
+\r
+/* WGL_EXT_framebuffer_sRGB */\r
+\r
+#ifndef WGL_EXT_framebuffer_sRGB\r
+#define WGL_EXT_framebuffer_sRGB 1\r
+#define __GLEE_WGL_EXT_framebuffer_sRGB 1\r
+/* Constants */\r
+#define WGL_FRAMEBUFFER_SRGB_CAPABLE_EXT                   0x20A9\r
+#endif \r
+\r
+/* WGL_NV_present_video */\r
+\r
+#ifndef WGL_NV_present_video\r
+#define WGL_NV_present_video 1\r
+#define __GLEE_WGL_NV_present_video 1\r
+/* Constants */\r
+#define WGL_NUM_VIDEO_SLOTS_NV                             0x20F0\r
+#ifndef GLEE_H_DEFINED_wglEnumerateVideoDevicesNV\r
+#define GLEE_H_DEFINED_wglEnumerateVideoDevicesNV\r
+  typedef int (APIENTRYP GLEEPFNWGLENUMERATEVIDEODEVICESNVPROC) (HDC hDC, HVIDEOOUTPUTDEVICENV * phDeviceList);\r
+  GLEE_EXTERN GLEEPFNWGLENUMERATEVIDEODEVICESNVPROC GLeeFuncPtr_wglEnumerateVideoDevicesNV;\r
+  #define wglEnumerateVideoDevicesNV GLeeFuncPtr_wglEnumerateVideoDevicesNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglBindVideoDeviceNV\r
+#define GLEE_H_DEFINED_wglBindVideoDeviceNV\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLBINDVIDEODEVICENVPROC) (HDC hDC, unsigned int uVideoSlot, HVIDEOOUTPUTDEVICENV hVideoDevice, const int * piAttribList);\r
+  GLEE_EXTERN GLEEPFNWGLBINDVIDEODEVICENVPROC GLeeFuncPtr_wglBindVideoDeviceNV;\r
+  #define wglBindVideoDeviceNV GLeeFuncPtr_wglBindVideoDeviceNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglQueryCurrentContextNV\r
+#define GLEE_H_DEFINED_wglQueryCurrentContextNV\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLQUERYCURRENTCONTEXTNVPROC) (int iAttribute, int * piValue);\r
+  GLEE_EXTERN GLEEPFNWGLQUERYCURRENTCONTEXTNVPROC GLeeFuncPtr_wglQueryCurrentContextNV;\r
+  #define wglQueryCurrentContextNV GLeeFuncPtr_wglQueryCurrentContextNV\r
+#endif\r
+#endif \r
+\r
+/* WGL_NV_swap_group */\r
+\r
+#ifndef WGL_NV_swap_group\r
+#define WGL_NV_swap_group 1\r
+#define __GLEE_WGL_NV_swap_group 1\r
+/* Constants */\r
+#ifndef GLEE_H_DEFINED_wglJoinSwapGroupNV\r
+#define GLEE_H_DEFINED_wglJoinSwapGroupNV\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLJOINSWAPGROUPNVPROC) (HDC hDC, GLuint group);\r
+  GLEE_EXTERN GLEEPFNWGLJOINSWAPGROUPNVPROC GLeeFuncPtr_wglJoinSwapGroupNV;\r
+  #define wglJoinSwapGroupNV GLeeFuncPtr_wglJoinSwapGroupNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglBindSwapBarrierNV\r
+#define GLEE_H_DEFINED_wglBindSwapBarrierNV\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLBINDSWAPBARRIERNVPROC) (GLuint group, GLuint barrier);\r
+  GLEE_EXTERN GLEEPFNWGLBINDSWAPBARRIERNVPROC GLeeFuncPtr_wglBindSwapBarrierNV;\r
+  #define wglBindSwapBarrierNV GLeeFuncPtr_wglBindSwapBarrierNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglQuerySwapGroupNV\r
+#define GLEE_H_DEFINED_wglQuerySwapGroupNV\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLQUERYSWAPGROUPNVPROC) (HDC hDC, GLuint * group, GLuint * barrier);\r
+  GLEE_EXTERN GLEEPFNWGLQUERYSWAPGROUPNVPROC GLeeFuncPtr_wglQuerySwapGroupNV;\r
+  #define wglQuerySwapGroupNV GLeeFuncPtr_wglQuerySwapGroupNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglQueryMaxSwapGroupsNV\r
+#define GLEE_H_DEFINED_wglQueryMaxSwapGroupsNV\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLQUERYMAXSWAPGROUPSNVPROC) (HDC hDC, GLuint * maxGroups, GLuint * maxBarriers);\r
+  GLEE_EXTERN GLEEPFNWGLQUERYMAXSWAPGROUPSNVPROC GLeeFuncPtr_wglQueryMaxSwapGroupsNV;\r
+  #define wglQueryMaxSwapGroupsNV GLeeFuncPtr_wglQueryMaxSwapGroupsNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglQueryFrameCountNV\r
+#define GLEE_H_DEFINED_wglQueryFrameCountNV\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLQUERYFRAMECOUNTNVPROC) (HDC hDC, GLuint * count);\r
+  GLEE_EXTERN GLEEPFNWGLQUERYFRAMECOUNTNVPROC GLeeFuncPtr_wglQueryFrameCountNV;\r
+  #define wglQueryFrameCountNV GLeeFuncPtr_wglQueryFrameCountNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglResetFrameCountNV\r
+#define GLEE_H_DEFINED_wglResetFrameCountNV\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLRESETFRAMECOUNTNVPROC) (HDC hDC);\r
+  GLEE_EXTERN GLEEPFNWGLRESETFRAMECOUNTNVPROC GLeeFuncPtr_wglResetFrameCountNV;\r
+  #define wglResetFrameCountNV GLeeFuncPtr_wglResetFrameCountNV\r
+#endif\r
+#endif \r
+\r
+/* WGL_NV_gpu_affinity */\r
+\r
+#ifndef WGL_NV_gpu_affinity\r
+#define WGL_NV_gpu_affinity 1\r
+#define __GLEE_WGL_NV_gpu_affinity 1\r
+/* Constants */\r
+#define WGL_ERROR_INCOMPATIBLE_AFFINITY_MASKS_NV           0x20D0\r
+#define WGL_ERROR_MISSING_AFFINITY_MASK_NV                 0x20D1\r
+#ifndef GLEE_H_DEFINED_wglEnumGpusNV\r
+#define GLEE_H_DEFINED_wglEnumGpusNV\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLENUMGPUSNVPROC) (UINT iGpuIndex, HGPUNV * phGpu);\r
+  GLEE_EXTERN GLEEPFNWGLENUMGPUSNVPROC GLeeFuncPtr_wglEnumGpusNV;\r
+  #define wglEnumGpusNV GLeeFuncPtr_wglEnumGpusNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglEnumGpuDevicesNV\r
+#define GLEE_H_DEFINED_wglEnumGpuDevicesNV\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLENUMGPUDEVICESNVPROC) (HGPUNV hGpu, UINT iDeviceIndex, PGPU_DEVICE lpGpuDevice);\r
+  GLEE_EXTERN GLEEPFNWGLENUMGPUDEVICESNVPROC GLeeFuncPtr_wglEnumGpuDevicesNV;\r
+  #define wglEnumGpuDevicesNV GLeeFuncPtr_wglEnumGpuDevicesNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglCreateAffinityDCNV\r
+#define GLEE_H_DEFINED_wglCreateAffinityDCNV\r
+  typedef HDC (APIENTRYP GLEEPFNWGLCREATEAFFINITYDCNVPROC) (const HGPUNV * phGpuList);\r
+  GLEE_EXTERN GLEEPFNWGLCREATEAFFINITYDCNVPROC GLeeFuncPtr_wglCreateAffinityDCNV;\r
+  #define wglCreateAffinityDCNV GLeeFuncPtr_wglCreateAffinityDCNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglEnumGpusFromAffinityDCNV\r
+#define GLEE_H_DEFINED_wglEnumGpusFromAffinityDCNV\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLENUMGPUSFROMAFFINITYDCNVPROC) (HDC hAffinityDC, UINT iGpuIndex, HGPUNV * hGpu);\r
+  GLEE_EXTERN GLEEPFNWGLENUMGPUSFROMAFFINITYDCNVPROC GLeeFuncPtr_wglEnumGpusFromAffinityDCNV;\r
+  #define wglEnumGpusFromAffinityDCNV GLeeFuncPtr_wglEnumGpusFromAffinityDCNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglDeleteDCNV\r
+#define GLEE_H_DEFINED_wglDeleteDCNV\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLDELETEDCNVPROC) (HDC hdc);\r
+  GLEE_EXTERN GLEEPFNWGLDELETEDCNVPROC GLeeFuncPtr_wglDeleteDCNV;\r
+  #define wglDeleteDCNV GLeeFuncPtr_wglDeleteDCNV\r
+#endif\r
+#endif \r
+\r
+/* WGL_EXT_display_color_table */\r
+\r
+#ifndef WGL_EXT_display_color_table\r
+#define WGL_EXT_display_color_table 1\r
+#define __GLEE_WGL_EXT_display_color_table 1\r
+/* Constants */\r
+#ifndef GLEE_H_DEFINED_wglCreateDisplayColorTableEXT\r
+#define GLEE_H_DEFINED_wglCreateDisplayColorTableEXT\r
+  typedef GLboolean (APIENTRYP GLEEPFNWGLCREATEDISPLAYCOLORTABLEEXTPROC) (GLushort id);\r
+  GLEE_EXTERN GLEEPFNWGLCREATEDISPLAYCOLORTABLEEXTPROC GLeeFuncPtr_wglCreateDisplayColorTableEXT;\r
+  #define wglCreateDisplayColorTableEXT GLeeFuncPtr_wglCreateDisplayColorTableEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglLoadDisplayColorTableEXT\r
+#define GLEE_H_DEFINED_wglLoadDisplayColorTableEXT\r
+  typedef GLboolean (APIENTRYP GLEEPFNWGLLOADDISPLAYCOLORTABLEEXTPROC) (const GLushort * table, GLuint length);\r
+  GLEE_EXTERN GLEEPFNWGLLOADDISPLAYCOLORTABLEEXTPROC GLeeFuncPtr_wglLoadDisplayColorTableEXT;\r
+  #define wglLoadDisplayColorTableEXT GLeeFuncPtr_wglLoadDisplayColorTableEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglBindDisplayColorTableEXT\r
+#define GLEE_H_DEFINED_wglBindDisplayColorTableEXT\r
+  typedef GLboolean (APIENTRYP GLEEPFNWGLBINDDISPLAYCOLORTABLEEXTPROC) (GLushort id);\r
+  GLEE_EXTERN GLEEPFNWGLBINDDISPLAYCOLORTABLEEXTPROC GLeeFuncPtr_wglBindDisplayColorTableEXT;\r
+  #define wglBindDisplayColorTableEXT GLeeFuncPtr_wglBindDisplayColorTableEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglDestroyDisplayColorTableEXT\r
+#define GLEE_H_DEFINED_wglDestroyDisplayColorTableEXT\r
+  typedef VOID (APIENTRYP GLEEPFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC) (GLushort id);\r
+  GLEE_EXTERN GLEEPFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC GLeeFuncPtr_wglDestroyDisplayColorTableEXT;\r
+  #define wglDestroyDisplayColorTableEXT GLeeFuncPtr_wglDestroyDisplayColorTableEXT\r
+#endif\r
+#endif \r
+\r
+/* WGL_EXT_extensions_string */\r
+\r
+#ifndef WGL_EXT_extensions_string\r
+#define WGL_EXT_extensions_string 1\r
+#define __GLEE_WGL_EXT_extensions_string 1\r
+/* Constants */\r
+#ifndef GLEE_H_DEFINED_wglGetExtensionsStringEXT\r
+#define GLEE_H_DEFINED_wglGetExtensionsStringEXT\r
+  typedef const char * (APIENTRYP GLEEPFNWGLGETEXTENSIONSSTRINGEXTPROC) ();\r
+  GLEE_EXTERN GLEEPFNWGLGETEXTENSIONSSTRINGEXTPROC GLeeFuncPtr_wglGetExtensionsStringEXT;\r
+  #define wglGetExtensionsStringEXT GLeeFuncPtr_wglGetExtensionsStringEXT\r
+#endif\r
+#endif \r
+\r
+/* WGL_EXT_swap_control */\r
+\r
+#ifndef WGL_EXT_swap_control\r
+#define WGL_EXT_swap_control 1\r
+#define __GLEE_WGL_EXT_swap_control 1\r
+/* Constants */\r
+#ifndef GLEE_H_DEFINED_wglSwapIntervalEXT\r
+#define GLEE_H_DEFINED_wglSwapIntervalEXT\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLSWAPINTERVALEXTPROC) (int interval);\r
+  GLEE_EXTERN GLEEPFNWGLSWAPINTERVALEXTPROC GLeeFuncPtr_wglSwapIntervalEXT;\r
+  #define wglSwapIntervalEXT GLeeFuncPtr_wglSwapIntervalEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglGetSwapIntervalEXT\r
+#define GLEE_H_DEFINED_wglGetSwapIntervalEXT\r
+  typedef int (APIENTRYP GLEEPFNWGLGETSWAPINTERVALEXTPROC) ();\r
+  GLEE_EXTERN GLEEPFNWGLGETSWAPINTERVALEXTPROC GLeeFuncPtr_wglGetSwapIntervalEXT;\r
+  #define wglGetSwapIntervalEXT GLeeFuncPtr_wglGetSwapIntervalEXT\r
+#endif\r
+#endif \r
+\r
+/* WGL_NV_vertex_array_range */\r
+\r
+#ifndef WGL_NV_vertex_array_range\r
+#define WGL_NV_vertex_array_range 1\r
+#define __GLEE_WGL_NV_vertex_array_range 1\r
+/* Constants */\r
+#ifndef GLEE_H_DEFINED_wglAllocateMemoryNV\r
+#define GLEE_H_DEFINED_wglAllocateMemoryNV\r
+  typedef void* (APIENTRYP GLEEPFNWGLALLOCATEMEMORYNVPROC) (GLsizei size, GLfloat readfreq, GLfloat writefreq, GLfloat priority);\r
+  GLEE_EXTERN GLEEPFNWGLALLOCATEMEMORYNVPROC GLeeFuncPtr_wglAllocateMemoryNV;\r
+  #define wglAllocateMemoryNV GLeeFuncPtr_wglAllocateMemoryNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglFreeMemoryNV\r
+#define GLEE_H_DEFINED_wglFreeMemoryNV\r
+  typedef void (APIENTRYP GLEEPFNWGLFREEMEMORYNVPROC) (void * pointer);\r
+  GLEE_EXTERN GLEEPFNWGLFREEMEMORYNVPROC GLeeFuncPtr_wglFreeMemoryNV;\r
+  #define wglFreeMemoryNV GLeeFuncPtr_wglFreeMemoryNV\r
+#endif\r
+#endif \r
+\r
+/* WGL_OML_sync_control */\r
+\r
+#ifndef WGL_OML_sync_control\r
+#define WGL_OML_sync_control 1\r
+#define __GLEE_WGL_OML_sync_control 1\r
+/* Constants */\r
+#ifndef GLEE_H_DEFINED_wglGetSyncValuesOML\r
+#define GLEE_H_DEFINED_wglGetSyncValuesOML\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLGETSYNCVALUESOMLPROC) (HDC hdc, INT64 * ust, INT64 * msc, INT64 * sbc);\r
+  GLEE_EXTERN GLEEPFNWGLGETSYNCVALUESOMLPROC GLeeFuncPtr_wglGetSyncValuesOML;\r
+  #define wglGetSyncValuesOML GLeeFuncPtr_wglGetSyncValuesOML\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglGetMscRateOML\r
+#define GLEE_H_DEFINED_wglGetMscRateOML\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLGETMSCRATEOMLPROC) (HDC hdc, INT32 * numerator, INT32 * denominator);\r
+  GLEE_EXTERN GLEEPFNWGLGETMSCRATEOMLPROC GLeeFuncPtr_wglGetMscRateOML;\r
+  #define wglGetMscRateOML GLeeFuncPtr_wglGetMscRateOML\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglSwapBuffersMscOML\r
+#define GLEE_H_DEFINED_wglSwapBuffersMscOML\r
+  typedef INT64 (APIENTRYP GLEEPFNWGLSWAPBUFFERSMSCOMLPROC) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder);\r
+  GLEE_EXTERN GLEEPFNWGLSWAPBUFFERSMSCOMLPROC GLeeFuncPtr_wglSwapBuffersMscOML;\r
+  #define wglSwapBuffersMscOML GLeeFuncPtr_wglSwapBuffersMscOML\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglSwapLayerBuffersMscOML\r
+#define GLEE_H_DEFINED_wglSwapLayerBuffersMscOML\r
+  typedef INT64 (APIENTRYP GLEEPFNWGLSWAPLAYERBUFFERSMSCOMLPROC) (HDC hdc, int fuPlanes, INT64 target_msc, INT64 divisor, INT64 remainder);\r
+  GLEE_EXTERN GLEEPFNWGLSWAPLAYERBUFFERSMSCOMLPROC GLeeFuncPtr_wglSwapLayerBuffersMscOML;\r
+  #define wglSwapLayerBuffersMscOML GLeeFuncPtr_wglSwapLayerBuffersMscOML\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglWaitForMscOML\r
+#define GLEE_H_DEFINED_wglWaitForMscOML\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLWAITFORMSCOMLPROC) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder, INT64 * ust, INT64 * msc, INT64 * sbc);\r
+  GLEE_EXTERN GLEEPFNWGLWAITFORMSCOMLPROC GLeeFuncPtr_wglWaitForMscOML;\r
+  #define wglWaitForMscOML GLeeFuncPtr_wglWaitForMscOML\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglWaitForSbcOML\r
+#define GLEE_H_DEFINED_wglWaitForSbcOML\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLWAITFORSBCOMLPROC) (HDC hdc, INT64 target_sbc, INT64 * ust, INT64 * msc, INT64 * sbc);\r
+  GLEE_EXTERN GLEEPFNWGLWAITFORSBCOMLPROC GLeeFuncPtr_wglWaitForSbcOML;\r
+  #define wglWaitForSbcOML GLeeFuncPtr_wglWaitForSbcOML\r
+#endif\r
+#endif \r
+\r
+/* WGL_I3D_swap_frame_usage */\r
+\r
+#ifndef WGL_I3D_swap_frame_usage\r
+#define WGL_I3D_swap_frame_usage 1\r
+#define __GLEE_WGL_I3D_swap_frame_usage 1\r
+/* Constants */\r
+#ifndef GLEE_H_DEFINED_wglGetFrameUsageI3D\r
+#define GLEE_H_DEFINED_wglGetFrameUsageI3D\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLGETFRAMEUSAGEI3DPROC) (float * pUsage);\r
+  GLEE_EXTERN GLEEPFNWGLGETFRAMEUSAGEI3DPROC GLeeFuncPtr_wglGetFrameUsageI3D;\r
+  #define wglGetFrameUsageI3D GLeeFuncPtr_wglGetFrameUsageI3D\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglBeginFrameTrackingI3D\r
+#define GLEE_H_DEFINED_wglBeginFrameTrackingI3D\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLBEGINFRAMETRACKINGI3DPROC) ();\r
+  GLEE_EXTERN GLEEPFNWGLBEGINFRAMETRACKINGI3DPROC GLeeFuncPtr_wglBeginFrameTrackingI3D;\r
+  #define wglBeginFrameTrackingI3D GLeeFuncPtr_wglBeginFrameTrackingI3D\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglEndFrameTrackingI3D\r
+#define GLEE_H_DEFINED_wglEndFrameTrackingI3D\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLENDFRAMETRACKINGI3DPROC) ();\r
+  GLEE_EXTERN GLEEPFNWGLENDFRAMETRACKINGI3DPROC GLeeFuncPtr_wglEndFrameTrackingI3D;\r
+  #define wglEndFrameTrackingI3D GLeeFuncPtr_wglEndFrameTrackingI3D\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglQueryFrameTrackingI3D\r
+#define GLEE_H_DEFINED_wglQueryFrameTrackingI3D\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLQUERYFRAMETRACKINGI3DPROC) (DWORD * pFrameCount, DWORD * pMissedFrames, float * pLastMissedUsage);\r
+  GLEE_EXTERN GLEEPFNWGLQUERYFRAMETRACKINGI3DPROC GLeeFuncPtr_wglQueryFrameTrackingI3D;\r
+  #define wglQueryFrameTrackingI3D GLeeFuncPtr_wglQueryFrameTrackingI3D\r
+#endif\r
+#endif \r
+\r
+/* WGL_NV_video_output */\r
+\r
+#ifndef WGL_NV_video_output\r
+#define WGL_NV_video_output 1\r
+#define __GLEE_WGL_NV_video_output 1\r
+/* Constants */\r
+#define WGL_BIND_TO_VIDEO_RGB_NV                           0x20C0\r
+#define WGL_BIND_TO_VIDEO_RGBA_NV                          0x20C1\r
+#define WGL_BIND_TO_VIDEO_RGB_AND_DEPTH_NV                 0x20C2\r
+#define WGL_VIDEO_OUT_COLOR_NV                             0x20C3\r
+#define WGL_VIDEO_OUT_ALPHA_NV                             0x20C4\r
+#define WGL_VIDEO_OUT_DEPTH_NV                             0x20C5\r
+#define WGL_VIDEO_OUT_COLOR_AND_ALPHA_NV                   0x20C6\r
+#define WGL_VIDEO_OUT_COLOR_AND_DEPTH_NV                   0x20C7\r
+#define WGL_VIDEO_OUT_FRAME                                0x20C8\r
+#define WGL_VIDEO_OUT_FIELD_1                              0x20C9\r
+#define WGL_VIDEO_OUT_FIELD_2                              0x20CA\r
+#define WGL_VIDEO_OUT_STACKED_FIELDS_1_2                   0x20CB\r
+#define WGL_VIDEO_OUT_STACKED_FIELDS_2_1                   0x20CC\r
+#ifndef GLEE_H_DEFINED_wglGetVideoDeviceNV\r
+#define GLEE_H_DEFINED_wglGetVideoDeviceNV\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLGETVIDEODEVICENVPROC) (HDC hDC, int numDevices, HPVIDEODEV * hVideoDevice);\r
+  GLEE_EXTERN GLEEPFNWGLGETVIDEODEVICENVPROC GLeeFuncPtr_wglGetVideoDeviceNV;\r
+  #define wglGetVideoDeviceNV GLeeFuncPtr_wglGetVideoDeviceNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglReleaseVideoDeviceNV\r
+#define GLEE_H_DEFINED_wglReleaseVideoDeviceNV\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLRELEASEVIDEODEVICENVPROC) (HPVIDEODEV hVideoDevice);\r
+  GLEE_EXTERN GLEEPFNWGLRELEASEVIDEODEVICENVPROC GLeeFuncPtr_wglReleaseVideoDeviceNV;\r
+  #define wglReleaseVideoDeviceNV GLeeFuncPtr_wglReleaseVideoDeviceNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglBindVideoImageNV\r
+#define GLEE_H_DEFINED_wglBindVideoImageNV\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLBINDVIDEOIMAGENVPROC) (HPVIDEODEV hVideoDevice, HPBUFFERARB hPbuffer, int iVideoBuffer);\r
+  GLEE_EXTERN GLEEPFNWGLBINDVIDEOIMAGENVPROC GLeeFuncPtr_wglBindVideoImageNV;\r
+  #define wglBindVideoImageNV GLeeFuncPtr_wglBindVideoImageNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglReleaseVideoImageNV\r
+#define GLEE_H_DEFINED_wglReleaseVideoImageNV\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLRELEASEVIDEOIMAGENVPROC) (HPBUFFERARB hPbuffer, int iVideoBuffer);\r
+  GLEE_EXTERN GLEEPFNWGLRELEASEVIDEOIMAGENVPROC GLeeFuncPtr_wglReleaseVideoImageNV;\r
+  #define wglReleaseVideoImageNV GLeeFuncPtr_wglReleaseVideoImageNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglSendPbufferToVideoNV\r
+#define GLEE_H_DEFINED_wglSendPbufferToVideoNV\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLSENDPBUFFERTOVIDEONVPROC) (HPBUFFERARB hPbuffer, int iBufferType, unsigned long * pulCounterPbuffer, BOOL bBlock);\r
+  GLEE_EXTERN GLEEPFNWGLSENDPBUFFERTOVIDEONVPROC GLeeFuncPtr_wglSendPbufferToVideoNV;\r
+  #define wglSendPbufferToVideoNV GLeeFuncPtr_wglSendPbufferToVideoNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_wglGetVideoInfoNV\r
+#define GLEE_H_DEFINED_wglGetVideoInfoNV\r
+  typedef BOOL (APIENTRYP GLEEPFNWGLGETVIDEOINFONVPROC) (HPVIDEODEV hpVideoDevice, unsigned long * pulCounterOutputPbuffer, unsigned long * pulCounterOutputVideo);\r
+  GLEE_EXTERN GLEEPFNWGLGETVIDEOINFONVPROC GLeeFuncPtr_wglGetVideoInfoNV;\r
+  #define wglGetVideoInfoNV GLeeFuncPtr_wglGetVideoInfoNV\r
+#endif\r
+#endif \r
+#elif defined(__APPLE__) || defined(__APPLE_CC__)\r
+#else /* GLX */\r
+\r
+/* Extension querying variables */\r
+\r
+GLEE_EXTERN GLboolean _GLEE_GLX_VERSION_1_3;\r
+GLEE_EXTERN GLboolean _GLEE_GLX_VERSION_1_4;\r
+GLEE_EXTERN GLboolean _GLEE_GLX_ARB_multisample;\r
+GLEE_EXTERN GLboolean _GLEE_GLX_ARB_fbconfig_float;\r
+GLEE_EXTERN GLboolean _GLEE_GLX_ARB_create_context;\r
+GLEE_EXTERN GLboolean _GLEE_GLX_SGIS_multisample;\r
+GLEE_EXTERN GLboolean _GLEE_GLX_EXT_visual_info;\r
+GLEE_EXTERN GLboolean _GLEE_GLX_SGI_swap_control;\r
+GLEE_EXTERN GLboolean _GLEE_GLX_SGI_video_sync;\r
+GLEE_EXTERN GLboolean _GLEE_GLX_SGI_make_current_read;\r
+GLEE_EXTERN GLboolean _GLEE_GLX_EXT_visual_rating;\r
+GLEE_EXTERN GLboolean _GLEE_GLX_EXT_import_context;\r
+GLEE_EXTERN GLboolean _GLEE_GLX_SGIX_fbconfig;\r
+GLEE_EXTERN GLboolean _GLEE_GLX_SGIX_pbuffer;\r
+GLEE_EXTERN GLboolean _GLEE_GLX_SGI_cushion;\r
+GLEE_EXTERN GLboolean _GLEE_GLX_SGIX_video_resize;\r
+GLEE_EXTERN GLboolean _GLEE_GLX_SGIX_swap_group;\r
+GLEE_EXTERN GLboolean _GLEE_GLX_SGIX_swap_barrier;\r
+GLEE_EXTERN GLboolean _GLEE_GLX_SGIS_blended_overlay;\r
+GLEE_EXTERN GLboolean _GLEE_GLX_SGIS_shared_multisample;\r
+GLEE_EXTERN GLboolean _GLEE_GLX_SUN_get_transparent_index;\r
+GLEE_EXTERN GLboolean _GLEE_GLX_3DFX_multisample;\r
+GLEE_EXTERN GLboolean _GLEE_GLX_MESA_copy_sub_buffer;\r
+GLEE_EXTERN GLboolean _GLEE_GLX_MESA_pixmap_colormap;\r
+GLEE_EXTERN GLboolean _GLEE_GLX_MESA_release_buffers;\r
+GLEE_EXTERN GLboolean _GLEE_GLX_MESA_set_3dfx_mode;\r
+GLEE_EXTERN GLboolean _GLEE_GLX_SGIX_visual_select_group;\r
+GLEE_EXTERN GLboolean _GLEE_GLX_OML_swap_method;\r
+GLEE_EXTERN GLboolean _GLEE_GLX_OML_sync_control;\r
+GLEE_EXTERN GLboolean _GLEE_GLX_NV_float_buffer;\r
+GLEE_EXTERN GLboolean _GLEE_GLX_SGIX_hyperpipe;\r
+GLEE_EXTERN GLboolean _GLEE_GLX_MESA_agp_offset;\r
+GLEE_EXTERN GLboolean _GLEE_GLX_EXT_fbconfig_packed_float;\r
+GLEE_EXTERN GLboolean _GLEE_GLX_EXT_framebuffer_sRGB;\r
+GLEE_EXTERN GLboolean _GLEE_GLX_EXT_texture_from_pixmap;\r
+GLEE_EXTERN GLboolean _GLEE_GLX_NV_present_video;\r
+GLEE_EXTERN GLboolean _GLEE_GLX_NV_video_out;\r
+GLEE_EXTERN GLboolean _GLEE_GLX_NV_swap_group;\r
+GLEE_EXTERN GLboolean _GLEE_GLX_EXT_scene_marker;\r
+GLEE_EXTERN GLboolean _GLEE_GLX_NV_video_output;\r
+\r
+/* Aliases for extension querying variables */\r
+\r
+#define GLEE_GLX_VERSION_1_3     GLeeEnabled(&_GLEE_GLX_VERSION_1_3)\r
+#define GLEE_GLX_VERSION_1_4     GLeeEnabled(&_GLEE_GLX_VERSION_1_4)\r
+#define GLEE_GLX_ARB_multisample     GLeeEnabled(&_GLEE_GLX_ARB_multisample)\r
+#define GLEE_GLX_ARB_fbconfig_float     GLeeEnabled(&_GLEE_GLX_ARB_fbconfig_float)\r
+#define GLEE_GLX_ARB_create_context     GLeeEnabled(&_GLEE_GLX_ARB_create_context)\r
+#define GLEE_GLX_SGIS_multisample     GLeeEnabled(&_GLEE_GLX_SGIS_multisample)\r
+#define GLEE_GLX_EXT_visual_info     GLeeEnabled(&_GLEE_GLX_EXT_visual_info)\r
+#define GLEE_GLX_SGI_swap_control     GLeeEnabled(&_GLEE_GLX_SGI_swap_control)\r
+#define GLEE_GLX_SGI_video_sync     GLeeEnabled(&_GLEE_GLX_SGI_video_sync)\r
+#define GLEE_GLX_SGI_make_current_read     GLeeEnabled(&_GLEE_GLX_SGI_make_current_read)\r
+#define GLEE_GLX_EXT_visual_rating     GLeeEnabled(&_GLEE_GLX_EXT_visual_rating)\r
+#define GLEE_GLX_EXT_import_context     GLeeEnabled(&_GLEE_GLX_EXT_import_context)\r
+#define GLEE_GLX_SGIX_fbconfig     GLeeEnabled(&_GLEE_GLX_SGIX_fbconfig)\r
+#define GLEE_GLX_SGIX_pbuffer     GLeeEnabled(&_GLEE_GLX_SGIX_pbuffer)\r
+#define GLEE_GLX_SGI_cushion     GLeeEnabled(&_GLEE_GLX_SGI_cushion)\r
+#define GLEE_GLX_SGIX_video_resize     GLeeEnabled(&_GLEE_GLX_SGIX_video_resize)\r
+#define GLEE_GLX_SGIX_swap_group     GLeeEnabled(&_GLEE_GLX_SGIX_swap_group)\r
+#define GLEE_GLX_SGIX_swap_barrier     GLeeEnabled(&_GLEE_GLX_SGIX_swap_barrier)\r
+#define GLEE_GLX_SGIS_blended_overlay     GLeeEnabled(&_GLEE_GLX_SGIS_blended_overlay)\r
+#define GLEE_GLX_SGIS_shared_multisample     GLeeEnabled(&_GLEE_GLX_SGIS_shared_multisample)\r
+#define GLEE_GLX_SUN_get_transparent_index     GLeeEnabled(&_GLEE_GLX_SUN_get_transparent_index)\r
+#define GLEE_GLX_3DFX_multisample     GLeeEnabled(&_GLEE_GLX_3DFX_multisample)\r
+#define GLEE_GLX_MESA_copy_sub_buffer     GLeeEnabled(&_GLEE_GLX_MESA_copy_sub_buffer)\r
+#define GLEE_GLX_MESA_pixmap_colormap     GLeeEnabled(&_GLEE_GLX_MESA_pixmap_colormap)\r
+#define GLEE_GLX_MESA_release_buffers     GLeeEnabled(&_GLEE_GLX_MESA_release_buffers)\r
+#define GLEE_GLX_MESA_set_3dfx_mode     GLeeEnabled(&_GLEE_GLX_MESA_set_3dfx_mode)\r
+#define GLEE_GLX_SGIX_visual_select_group     GLeeEnabled(&_GLEE_GLX_SGIX_visual_select_group)\r
+#define GLEE_GLX_OML_swap_method     GLeeEnabled(&_GLEE_GLX_OML_swap_method)\r
+#define GLEE_GLX_OML_sync_control     GLeeEnabled(&_GLEE_GLX_OML_sync_control)\r
+#define GLEE_GLX_NV_float_buffer     GLeeEnabled(&_GLEE_GLX_NV_float_buffer)\r
+#define GLEE_GLX_SGIX_hyperpipe     GLeeEnabled(&_GLEE_GLX_SGIX_hyperpipe)\r
+#define GLEE_GLX_MESA_agp_offset     GLeeEnabled(&_GLEE_GLX_MESA_agp_offset)\r
+#define GLEE_GLX_EXT_fbconfig_packed_float     GLeeEnabled(&_GLEE_GLX_EXT_fbconfig_packed_float)\r
+#define GLEE_GLX_EXT_framebuffer_sRGB     GLeeEnabled(&_GLEE_GLX_EXT_framebuffer_sRGB)\r
+#define GLEE_GLX_EXT_texture_from_pixmap     GLeeEnabled(&_GLEE_GLX_EXT_texture_from_pixmap)\r
+#define GLEE_GLX_NV_present_video     GLeeEnabled(&_GLEE_GLX_NV_present_video)\r
+#define GLEE_GLX_NV_video_out     GLeeEnabled(&_GLEE_GLX_NV_video_out)\r
+#define GLEE_GLX_NV_swap_group     GLeeEnabled(&_GLEE_GLX_NV_swap_group)\r
+#define GLEE_GLX_EXT_scene_marker     GLeeEnabled(&_GLEE_GLX_EXT_scene_marker)\r
+#define GLEE_GLX_NV_video_output     GLeeEnabled(&_GLEE_GLX_NV_video_output)\r
+\r
+/* GLX_VERSION_1_3 */\r
+\r
+#ifndef GLX_VERSION_1_3\r
+#define GLX_VERSION_1_3 1\r
+#define __GLEE_GLX_VERSION_1_3 1\r
+/* Constants */\r
+#define GLX_WINDOW_BIT                                     0x00000001\r
+#define GLX_PIXMAP_BIT                                     0x00000002\r
+#define GLX_PBUFFER_BIT                                    0x00000004\r
+#define GLX_RGBA_BIT                                       0x00000001\r
+#define GLX_COLOR_INDEX_BIT                                0x00000002\r
+#define GLX_PBUFFER_CLOBBER_MASK                           0x08000000\r
+#define GLX_FRONT_LEFT_BUFFER_BIT                          0x00000001\r
+#define GLX_FRONT_RIGHT_BUFFER_BIT                         0x00000002\r
+#define GLX_BACK_LEFT_BUFFER_BIT                           0x00000004\r
+#define GLX_BACK_RIGHT_BUFFER_BIT                          0x00000008\r
+#define GLX_AUX_BUFFERS_BIT                                0x00000010\r
+#define GLX_DEPTH_BUFFER_BIT                               0x00000020\r
+#define GLX_STENCIL_BUFFER_BIT                             0x00000040\r
+#define GLX_ACCUM_BUFFER_BIT                               0x00000080\r
+#define GLX_CONFIG_CAVEAT                                  0x20\r
+#define GLX_X_VISUAL_TYPE                                  0x22\r
+#define GLX_TRANSPARENT_TYPE                               0x23\r
+#define GLX_TRANSPARENT_INDEX_VALUE                        0x24\r
+#define GLX_TRANSPARENT_RED_VALUE                          0x25\r
+#define GLX_TRANSPARENT_GREEN_VALUE                        0x26\r
+#define GLX_TRANSPARENT_BLUE_VALUE                         0x27\r
+#define GLX_TRANSPARENT_ALPHA_VALUE                        0x28\r
+#define GLX_DONT_CARE                                      0xFFFFFFFF\r
+#define GLX_NONE                                           0x8000\r
+#define GLX_SLOW_CONFIG                                    0x8001\r
+#define GLX_TRUE_COLOR                                     0x8002\r
+#define GLX_DIRECT_COLOR                                   0x8003\r
+#define GLX_PSEUDO_COLOR                                   0x8004\r
+#define GLX_STATIC_COLOR                                   0x8005\r
+#define GLX_GRAY_SCALE                                     0x8006\r
+#define GLX_STATIC_GRAY                                    0x8007\r
+#define GLX_TRANSPARENT_RGB                                0x8008\r
+#define GLX_TRANSPARENT_INDEX                              0x8009\r
+#define GLX_VISUAL_ID                                      0x800B\r
+#define GLX_SCREEN                                         0x800C\r
+#define GLX_NON_CONFORMANT_CONFIG                          0x800D\r
+#define GLX_DRAWABLE_TYPE                                  0x8010\r
+#define GLX_RENDER_TYPE                                    0x8011\r
+#define GLX_X_RENDERABLE                                   0x8012\r
+#define GLX_FBCONFIG_ID                                    0x8013\r
+#define GLX_RGBA_TYPE                                      0x8014\r
+#define GLX_COLOR_INDEX_TYPE                               0x8015\r
+#define GLX_MAX_PBUFFER_WIDTH                              0x8016\r
+#define GLX_MAX_PBUFFER_HEIGHT                             0x8017\r
+#define GLX_MAX_PBUFFER_PIXELS                             0x8018\r
+#define GLX_PRESERVED_CONTENTS                             0x801B\r
+#define GLX_LARGEST_PBUFFER                                0x801C\r
+#define GLX_WIDTH                                          0x801D\r
+#define GLX_HEIGHT                                         0x801E\r
+#define GLX_EVENT_MASK                                     0x801F\r
+#define GLX_DAMAGED                                        0x8020\r
+#define GLX_SAVED                                          0x8021\r
+#define GLX_WINDOW                                         0x8022\r
+#define GLX_PBUFFER                                        0x8023\r
+#define GLX_PBUFFER_HEIGHT                                 0x8040\r
+#define GLX_PBUFFER_WIDTH                                  0x8041\r
+#ifndef GLEE_H_DEFINED_glXGetFBConfigs\r
+#define GLEE_H_DEFINED_glXGetFBConfigs\r
+  typedef GLXFBConfig * (APIENTRYP GLEEPFNGLXGETFBCONFIGSPROC) (Display * dpy, int screen, int * nelements);\r
+  GLEE_EXTERN GLEEPFNGLXGETFBCONFIGSPROC GLeeFuncPtr_glXGetFBConfigs;\r
+  #define glXGetFBConfigs GLeeFuncPtr_glXGetFBConfigs\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glXChooseFBConfig\r
+#define GLEE_H_DEFINED_glXChooseFBConfig\r
+  typedef GLXFBConfig * (APIENTRYP GLEEPFNGLXCHOOSEFBCONFIGPROC) (Display * dpy, int screen, const int * attrib_list, int * nelements);\r
+  GLEE_EXTERN GLEEPFNGLXCHOOSEFBCONFIGPROC GLeeFuncPtr_glXChooseFBConfig;\r
+  #define glXChooseFBConfig GLeeFuncPtr_glXChooseFBConfig\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glXGetFBConfigAttrib\r
+#define GLEE_H_DEFINED_glXGetFBConfigAttrib\r
+  typedef int (APIENTRYP GLEEPFNGLXGETFBCONFIGATTRIBPROC) (Display * dpy, GLXFBConfig config, int attribute, int * value);\r
+  GLEE_EXTERN GLEEPFNGLXGETFBCONFIGATTRIBPROC GLeeFuncPtr_glXGetFBConfigAttrib;\r
+  #define glXGetFBConfigAttrib GLeeFuncPtr_glXGetFBConfigAttrib\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glXGetVisualFromFBConfig\r
+#define GLEE_H_DEFINED_glXGetVisualFromFBConfig\r
+  typedef XVisualInfo * (APIENTRYP GLEEPFNGLXGETVISUALFROMFBCONFIGPROC) (Display * dpy, GLXFBConfig config);\r
+  GLEE_EXTERN GLEEPFNGLXGETVISUALFROMFBCONFIGPROC GLeeFuncPtr_glXGetVisualFromFBConfig;\r
+  #define glXGetVisualFromFBConfig GLeeFuncPtr_glXGetVisualFromFBConfig\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glXCreateWindow\r
+#define GLEE_H_DEFINED_glXCreateWindow\r
+  typedef GLXWindow (APIENTRYP GLEEPFNGLXCREATEWINDOWPROC) (Display * dpy, GLXFBConfig config, Window win, const int * attrib_list);\r
+  GLEE_EXTERN GLEEPFNGLXCREATEWINDOWPROC GLeeFuncPtr_glXCreateWindow;\r
+  #define glXCreateWindow GLeeFuncPtr_glXCreateWindow\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glXDestroyWindow\r
+#define GLEE_H_DEFINED_glXDestroyWindow\r
+  typedef void (APIENTRYP GLEEPFNGLXDESTROYWINDOWPROC) (Display * dpy, GLXWindow win);\r
+  GLEE_EXTERN GLEEPFNGLXDESTROYWINDOWPROC GLeeFuncPtr_glXDestroyWindow;\r
+  #define glXDestroyWindow GLeeFuncPtr_glXDestroyWindow\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glXCreatePixmap\r
+#define GLEE_H_DEFINED_glXCreatePixmap\r
+  typedef GLXPixmap (APIENTRYP GLEEPFNGLXCREATEPIXMAPPROC) (Display * dpy, GLXFBConfig config, Pixmap pixmap, const int * attrib_list);\r
+  GLEE_EXTERN GLEEPFNGLXCREATEPIXMAPPROC GLeeFuncPtr_glXCreatePixmap;\r
+  #define glXCreatePixmap GLeeFuncPtr_glXCreatePixmap\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glXDestroyPixmap\r
+#define GLEE_H_DEFINED_glXDestroyPixmap\r
+  typedef void (APIENTRYP GLEEPFNGLXDESTROYPIXMAPPROC) (Display * dpy, GLXPixmap pixmap);\r
+  GLEE_EXTERN GLEEPFNGLXDESTROYPIXMAPPROC GLeeFuncPtr_glXDestroyPixmap;\r
+  #define glXDestroyPixmap GLeeFuncPtr_glXDestroyPixmap\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glXCreatePbuffer\r
+#define GLEE_H_DEFINED_glXCreatePbuffer\r
+  typedef GLXPbuffer (APIENTRYP GLEEPFNGLXCREATEPBUFFERPROC) (Display * dpy, GLXFBConfig config, const int * attrib_list);\r
+  GLEE_EXTERN GLEEPFNGLXCREATEPBUFFERPROC GLeeFuncPtr_glXCreatePbuffer;\r
+  #define glXCreatePbuffer GLeeFuncPtr_glXCreatePbuffer\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glXDestroyPbuffer\r
+#define GLEE_H_DEFINED_glXDestroyPbuffer\r
+  typedef void (APIENTRYP GLEEPFNGLXDESTROYPBUFFERPROC) (Display * dpy, GLXPbuffer pbuf);\r
+  GLEE_EXTERN GLEEPFNGLXDESTROYPBUFFERPROC GLeeFuncPtr_glXDestroyPbuffer;\r
+  #define glXDestroyPbuffer GLeeFuncPtr_glXDestroyPbuffer\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glXQueryDrawable\r
+#define GLEE_H_DEFINED_glXQueryDrawable\r
+  typedef void (APIENTRYP GLEEPFNGLXQUERYDRAWABLEPROC) (Display * dpy, GLXDrawable draw, int attribute, unsigned int * value);\r
+  GLEE_EXTERN GLEEPFNGLXQUERYDRAWABLEPROC GLeeFuncPtr_glXQueryDrawable;\r
+  #define glXQueryDrawable GLeeFuncPtr_glXQueryDrawable\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glXCreateNewContext\r
+#define GLEE_H_DEFINED_glXCreateNewContext\r
+  typedef GLXContext (APIENTRYP GLEEPFNGLXCREATENEWCONTEXTPROC) (Display * dpy, GLXFBConfig config, int render_type, GLXContext share_list, Bool direct);\r
+  GLEE_EXTERN GLEEPFNGLXCREATENEWCONTEXTPROC GLeeFuncPtr_glXCreateNewContext;\r
+  #define glXCreateNewContext GLeeFuncPtr_glXCreateNewContext\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glXMakeContextCurrent\r
+#define GLEE_H_DEFINED_glXMakeContextCurrent\r
+  typedef Bool (APIENTRYP GLEEPFNGLXMAKECONTEXTCURRENTPROC) (Display * dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx);\r
+  GLEE_EXTERN GLEEPFNGLXMAKECONTEXTCURRENTPROC GLeeFuncPtr_glXMakeContextCurrent;\r
+  #define glXMakeContextCurrent GLeeFuncPtr_glXMakeContextCurrent\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glXGetCurrentReadDrawable\r
+#define GLEE_H_DEFINED_glXGetCurrentReadDrawable\r
+  typedef GLXDrawable (APIENTRYP GLEEPFNGLXGETCURRENTREADDRAWABLEPROC) ();\r
+  GLEE_EXTERN GLEEPFNGLXGETCURRENTREADDRAWABLEPROC GLeeFuncPtr_glXGetCurrentReadDrawable;\r
+  #define glXGetCurrentReadDrawable GLeeFuncPtr_glXGetCurrentReadDrawable\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glXGetCurrentDisplay\r
+#define GLEE_H_DEFINED_glXGetCurrentDisplay\r
+  typedef Display * (APIENTRYP GLEEPFNGLXGETCURRENTDISPLAYPROC) ();\r
+  GLEE_EXTERN GLEEPFNGLXGETCURRENTDISPLAYPROC GLeeFuncPtr_glXGetCurrentDisplay;\r
+  #define glXGetCurrentDisplay GLeeFuncPtr_glXGetCurrentDisplay\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glXQueryContext\r
+#define GLEE_H_DEFINED_glXQueryContext\r
+  typedef int (APIENTRYP GLEEPFNGLXQUERYCONTEXTPROC) (Display * dpy, GLXContext ctx, int attribute, int * value);\r
+  GLEE_EXTERN GLEEPFNGLXQUERYCONTEXTPROC GLeeFuncPtr_glXQueryContext;\r
+  #define glXQueryContext GLeeFuncPtr_glXQueryContext\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glXSelectEvent\r
+#define GLEE_H_DEFINED_glXSelectEvent\r
+  typedef void (APIENTRYP GLEEPFNGLXSELECTEVENTPROC) (Display * dpy, GLXDrawable draw, unsigned long event_mask);\r
+  GLEE_EXTERN GLEEPFNGLXSELECTEVENTPROC GLeeFuncPtr_glXSelectEvent;\r
+  #define glXSelectEvent GLeeFuncPtr_glXSelectEvent\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glXGetSelectedEvent\r
+#define GLEE_H_DEFINED_glXGetSelectedEvent\r
+  typedef void (APIENTRYP GLEEPFNGLXGETSELECTEDEVENTPROC) (Display * dpy, GLXDrawable draw, unsigned long * event_mask);\r
+  GLEE_EXTERN GLEEPFNGLXGETSELECTEDEVENTPROC GLeeFuncPtr_glXGetSelectedEvent;\r
+  #define glXGetSelectedEvent GLeeFuncPtr_glXGetSelectedEvent\r
+#endif\r
+#endif \r
+\r
+/* GLX_VERSION_1_4 */\r
+\r
+#ifndef GLX_VERSION_1_4\r
+#define GLX_VERSION_1_4 1\r
+#define __GLEE_GLX_VERSION_1_4 1\r
+/* Constants */\r
+#define GLX_SAMPLE_BUFFERS                                 100000\r
+#define GLX_SAMPLES                                        100001\r
+#ifndef GLEE_H_DEFINED_glXGetProcAddress\r
+#define GLEE_H_DEFINED_glXGetProcAddress\r
+  typedef __GLXextFuncPtr (APIENTRYP GLEEPFNGLXGETPROCADDRESSPROC) (const GLubyte * procName);\r
+  GLEE_EXTERN GLEEPFNGLXGETPROCADDRESSPROC GLeeFuncPtr_glXGetProcAddress;\r
+  #define glXGetProcAddress GLeeFuncPtr_glXGetProcAddress\r
+#endif\r
+#endif \r
+\r
+/* GLX_ARB_multisample */\r
+\r
+#ifndef GLX_ARB_multisample\r
+#define GLX_ARB_multisample 1\r
+#define __GLEE_GLX_ARB_multisample 1\r
+/* Constants */\r
+#define GLX_SAMPLE_BUFFERS_ARB                             100000\r
+#define GLX_SAMPLES_ARB                                    100001\r
+#endif \r
+\r
+/* GLX_ARB_fbconfig_float */\r
+\r
+#ifndef GLX_ARB_fbconfig_float\r
+#define GLX_ARB_fbconfig_float 1\r
+#define __GLEE_GLX_ARB_fbconfig_float 1\r
+/* Constants */\r
+#define GLX_RGBA_FLOAT_TYPE_ARB                            0x20B9\r
+#define GLX_RGBA_FLOAT_BIT_ARB                             0x00000004\r
+#endif \r
+\r
+/* GLX_ARB_create_context */\r
+\r
+#ifndef GLX_ARB_create_context\r
+#define GLX_ARB_create_context 1\r
+#define __GLEE_GLX_ARB_create_context 1\r
+/* Constants */\r
+#define GLX_CONTEXT_DEBUG_BIT_ARB                          0x00000001\r
+#define GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB             0x00000002\r
+#define GLX_CONTEXT_MAJOR_VERSION_ARB                      0x2091\r
+#define GLX_CONTEXT_MINOR_VERSION_ARB                      0x2092\r
+#define GLX_CONTEXT_FLAGS_ARB                              0x2094\r
+#ifndef GLEE_H_DEFINED_glXCreateContextAttribsARB\r
+#define GLEE_H_DEFINED_glXCreateContextAttribsARB\r
+  typedef GLXContext (APIENTRYP GLEEPFNGLXCREATECONTEXTATTRIBSARBPROC) (Display * dpy, GLXFBConfig config, GLXContext share_context, Bool direct, const int * attrib_list);\r
+  GLEE_EXTERN GLEEPFNGLXCREATECONTEXTATTRIBSARBPROC GLeeFuncPtr_glXCreateContextAttribsARB;\r
+  #define glXCreateContextAttribsARB GLeeFuncPtr_glXCreateContextAttribsARB\r
+#endif\r
+#endif \r
+\r
+/* GLX_SGIS_multisample */\r
+\r
+#ifndef GLX_SGIS_multisample\r
+#define GLX_SGIS_multisample 1\r
+#define __GLEE_GLX_SGIS_multisample 1\r
+/* Constants */\r
+#define GLX_SAMPLE_BUFFERS_SGIS                            100000\r
+#define GLX_SAMPLES_SGIS                                   100001\r
+#endif \r
+\r
+/* GLX_EXT_visual_info */\r
+\r
+#ifndef GLX_EXT_visual_info\r
+#define GLX_EXT_visual_info 1\r
+#define __GLEE_GLX_EXT_visual_info 1\r
+/* Constants */\r
+#define GLX_X_VISUAL_TYPE_EXT                              0x22\r
+#define GLX_TRANSPARENT_TYPE_EXT                           0x23\r
+#define GLX_TRANSPARENT_INDEX_VALUE_EXT                    0x24\r
+#define GLX_TRANSPARENT_RED_VALUE_EXT                      0x25\r
+#define GLX_TRANSPARENT_GREEN_VALUE_EXT                    0x26\r
+#define GLX_TRANSPARENT_BLUE_VALUE_EXT                     0x27\r
+#define GLX_TRANSPARENT_ALPHA_VALUE_EXT                    0x28\r
+#define GLX_NONE_EXT                                       0x8000\r
+#define GLX_TRUE_COLOR_EXT                                 0x8002\r
+#define GLX_DIRECT_COLOR_EXT                               0x8003\r
+#define GLX_PSEUDO_COLOR_EXT                               0x8004\r
+#define GLX_STATIC_COLOR_EXT                               0x8005\r
+#define GLX_GRAY_SCALE_EXT                                 0x8006\r
+#define GLX_STATIC_GRAY_EXT                                0x8007\r
+#define GLX_TRANSPARENT_RGB_EXT                            0x8008\r
+#define GLX_TRANSPARENT_INDEX_EXT                          0x8009\r
+#endif \r
+\r
+/* GLX_SGI_swap_control */\r
+\r
+#ifndef GLX_SGI_swap_control\r
+#define GLX_SGI_swap_control 1\r
+#define __GLEE_GLX_SGI_swap_control 1\r
+/* Constants */\r
+#ifndef GLEE_H_DEFINED_glXSwapIntervalSGI\r
+#define GLEE_H_DEFINED_glXSwapIntervalSGI\r
+  typedef int (APIENTRYP GLEEPFNGLXSWAPINTERVALSGIPROC) (int interval);\r
+  GLEE_EXTERN GLEEPFNGLXSWAPINTERVALSGIPROC GLeeFuncPtr_glXSwapIntervalSGI;\r
+  #define glXSwapIntervalSGI GLeeFuncPtr_glXSwapIntervalSGI\r
+#endif\r
+#endif \r
+\r
+/* GLX_SGI_video_sync */\r
+\r
+#ifndef GLX_SGI_video_sync\r
+#define GLX_SGI_video_sync 1\r
+#define __GLEE_GLX_SGI_video_sync 1\r
+/* Constants */\r
+#ifndef GLEE_H_DEFINED_glXGetVideoSyncSGI\r
+#define GLEE_H_DEFINED_glXGetVideoSyncSGI\r
+  typedef int (APIENTRYP GLEEPFNGLXGETVIDEOSYNCSGIPROC) (unsigned int * count);\r
+  GLEE_EXTERN GLEEPFNGLXGETVIDEOSYNCSGIPROC GLeeFuncPtr_glXGetVideoSyncSGI;\r
+  #define glXGetVideoSyncSGI GLeeFuncPtr_glXGetVideoSyncSGI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glXWaitVideoSyncSGI\r
+#define GLEE_H_DEFINED_glXWaitVideoSyncSGI\r
+  typedef int (APIENTRYP GLEEPFNGLXWAITVIDEOSYNCSGIPROC) (int divisor, int remainder, unsigned int * count);\r
+  GLEE_EXTERN GLEEPFNGLXWAITVIDEOSYNCSGIPROC GLeeFuncPtr_glXWaitVideoSyncSGI;\r
+  #define glXWaitVideoSyncSGI GLeeFuncPtr_glXWaitVideoSyncSGI\r
+#endif\r
+#endif \r
+\r
+/* GLX_SGI_make_current_read */\r
+\r
+#ifndef GLX_SGI_make_current_read\r
+#define GLX_SGI_make_current_read 1\r
+#define __GLEE_GLX_SGI_make_current_read 1\r
+/* Constants */\r
+#ifndef GLEE_H_DEFINED_glXMakeCurrentReadSGI\r
+#define GLEE_H_DEFINED_glXMakeCurrentReadSGI\r
+  typedef Bool (APIENTRYP GLEEPFNGLXMAKECURRENTREADSGIPROC) (Display * dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx);\r
+  GLEE_EXTERN GLEEPFNGLXMAKECURRENTREADSGIPROC GLeeFuncPtr_glXMakeCurrentReadSGI;\r
+  #define glXMakeCurrentReadSGI GLeeFuncPtr_glXMakeCurrentReadSGI\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glXGetCurrentReadDrawableSGI\r
+#define GLEE_H_DEFINED_glXGetCurrentReadDrawableSGI\r
+  typedef GLXDrawable (APIENTRYP GLEEPFNGLXGETCURRENTREADDRAWABLESGIPROC) ();\r
+  GLEE_EXTERN GLEEPFNGLXGETCURRENTREADDRAWABLESGIPROC GLeeFuncPtr_glXGetCurrentReadDrawableSGI;\r
+  #define glXGetCurrentReadDrawableSGI GLeeFuncPtr_glXGetCurrentReadDrawableSGI\r
+#endif\r
+#endif \r
+\r
+/* GLX_EXT_visual_rating */\r
+\r
+#ifndef GLX_EXT_visual_rating\r
+#define GLX_EXT_visual_rating 1\r
+#define __GLEE_GLX_EXT_visual_rating 1\r
+/* Constants */\r
+#define GLX_VISUAL_CAVEAT_EXT                              0x20\r
+#define GLX_SLOW_VISUAL_EXT                                0x8001\r
+#define GLX_NON_CONFORMANT_VISUAL_EXT                      0x800D\r
+#endif \r
+\r
+/* GLX_EXT_import_context */\r
+\r
+#ifndef GLX_EXT_import_context\r
+#define GLX_EXT_import_context 1\r
+#define __GLEE_GLX_EXT_import_context 1\r
+/* Constants */\r
+#define GLX_SHARE_CONTEXT_EXT                              0x800A\r
+#define GLX_VISUAL_ID_EXT                                  0x800B\r
+#define GLX_SCREEN_EXT                                     0x800C\r
+#ifndef GLEE_H_DEFINED_glXGetCurrentDisplayEXT\r
+#define GLEE_H_DEFINED_glXGetCurrentDisplayEXT\r
+  typedef Display * (APIENTRYP GLEEPFNGLXGETCURRENTDISPLAYEXTPROC) ();\r
+  GLEE_EXTERN GLEEPFNGLXGETCURRENTDISPLAYEXTPROC GLeeFuncPtr_glXGetCurrentDisplayEXT;\r
+  #define glXGetCurrentDisplayEXT GLeeFuncPtr_glXGetCurrentDisplayEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glXQueryContextInfoEXT\r
+#define GLEE_H_DEFINED_glXQueryContextInfoEXT\r
+  typedef int (APIENTRYP GLEEPFNGLXQUERYCONTEXTINFOEXTPROC) (Display * dpy, GLXContext context, int attribute, int * value);\r
+  GLEE_EXTERN GLEEPFNGLXQUERYCONTEXTINFOEXTPROC GLeeFuncPtr_glXQueryContextInfoEXT;\r
+  #define glXQueryContextInfoEXT GLeeFuncPtr_glXQueryContextInfoEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glXGetContextIDEXT\r
+#define GLEE_H_DEFINED_glXGetContextIDEXT\r
+  typedef GLXContextID (APIENTRYP GLEEPFNGLXGETCONTEXTIDEXTPROC) (const GLXContext context);\r
+  GLEE_EXTERN GLEEPFNGLXGETCONTEXTIDEXTPROC GLeeFuncPtr_glXGetContextIDEXT;\r
+  #define glXGetContextIDEXT GLeeFuncPtr_glXGetContextIDEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glXImportContextEXT\r
+#define GLEE_H_DEFINED_glXImportContextEXT\r
+  typedef GLXContext (APIENTRYP GLEEPFNGLXIMPORTCONTEXTEXTPROC) (Display * dpy, GLXContextID contextID);\r
+  GLEE_EXTERN GLEEPFNGLXIMPORTCONTEXTEXTPROC GLeeFuncPtr_glXImportContextEXT;\r
+  #define glXImportContextEXT GLeeFuncPtr_glXImportContextEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glXFreeContextEXT\r
+#define GLEE_H_DEFINED_glXFreeContextEXT\r
+  typedef void (APIENTRYP GLEEPFNGLXFREECONTEXTEXTPROC) (Display * dpy, GLXContext context);\r
+  GLEE_EXTERN GLEEPFNGLXFREECONTEXTEXTPROC GLeeFuncPtr_glXFreeContextEXT;\r
+  #define glXFreeContextEXT GLeeFuncPtr_glXFreeContextEXT\r
+#endif\r
+#endif \r
+\r
+/* GLX_SGIX_fbconfig */\r
+\r
+#ifndef GLX_SGIX_fbconfig\r
+#define GLX_SGIX_fbconfig 1\r
+#define __GLEE_GLX_SGIX_fbconfig 1\r
+/* Constants */\r
+#define GLX_WINDOW_BIT_SGIX                                0x00000001\r
+#define GLX_PIXMAP_BIT_SGIX                                0x00000002\r
+#define GLX_RGBA_BIT_SGIX                                  0x00000001\r
+#define GLX_COLOR_INDEX_BIT_SGIX                           0x00000002\r
+#define GLX_DRAWABLE_TYPE_SGIX                             0x8010\r
+#define GLX_RENDER_TYPE_SGIX                               0x8011\r
+#define GLX_X_RENDERABLE_SGIX                              0x8012\r
+#define GLX_FBCONFIG_ID_SGIX                               0x8013\r
+#define GLX_RGBA_TYPE_SGIX                                 0x8014\r
+#define GLX_COLOR_INDEX_TYPE_SGIX                          0x8015\r
+#ifndef GLEE_H_DEFINED_glXGetFBConfigAttribSGIX\r
+#define GLEE_H_DEFINED_glXGetFBConfigAttribSGIX\r
+  typedef int (APIENTRYP GLEEPFNGLXGETFBCONFIGATTRIBSGIXPROC) (Display * dpy, GLXFBConfigSGIX config, int attribute, int * value);\r
+  GLEE_EXTERN GLEEPFNGLXGETFBCONFIGATTRIBSGIXPROC GLeeFuncPtr_glXGetFBConfigAttribSGIX;\r
+  #define glXGetFBConfigAttribSGIX GLeeFuncPtr_glXGetFBConfigAttribSGIX\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glXChooseFBConfigSGIX\r
+#define GLEE_H_DEFINED_glXChooseFBConfigSGIX\r
+  typedef GLXFBConfigSGIX * (APIENTRYP GLEEPFNGLXCHOOSEFBCONFIGSGIXPROC) (Display * dpy, int screen, int * attrib_list, int * nelements);\r
+  GLEE_EXTERN GLEEPFNGLXCHOOSEFBCONFIGSGIXPROC GLeeFuncPtr_glXChooseFBConfigSGIX;\r
+  #define glXChooseFBConfigSGIX GLeeFuncPtr_glXChooseFBConfigSGIX\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glXCreateGLXPixmapWithConfigSGIX\r
+#define GLEE_H_DEFINED_glXCreateGLXPixmapWithConfigSGIX\r
+  typedef GLXPixmap (APIENTRYP GLEEPFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC) (Display * dpy, GLXFBConfigSGIX config, Pixmap pixmap);\r
+  GLEE_EXTERN GLEEPFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC GLeeFuncPtr_glXCreateGLXPixmapWithConfigSGIX;\r
+  #define glXCreateGLXPixmapWithConfigSGIX GLeeFuncPtr_glXCreateGLXPixmapWithConfigSGIX\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glXCreateContextWithConfigSGIX\r
+#define GLEE_H_DEFINED_glXCreateContextWithConfigSGIX\r
+  typedef GLXContext (APIENTRYP GLEEPFNGLXCREATECONTEXTWITHCONFIGSGIXPROC) (Display * dpy, GLXFBConfigSGIX config, int render_type, GLXContext share_list, Bool direct);\r
+  GLEE_EXTERN GLEEPFNGLXCREATECONTEXTWITHCONFIGSGIXPROC GLeeFuncPtr_glXCreateContextWithConfigSGIX;\r
+  #define glXCreateContextWithConfigSGIX GLeeFuncPtr_glXCreateContextWithConfigSGIX\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glXGetVisualFromFBConfigSGIX\r
+#define GLEE_H_DEFINED_glXGetVisualFromFBConfigSGIX\r
+  typedef XVisualInfo * (APIENTRYP GLEEPFNGLXGETVISUALFROMFBCONFIGSGIXPROC) (Display * dpy, GLXFBConfigSGIX config);\r
+  GLEE_EXTERN GLEEPFNGLXGETVISUALFROMFBCONFIGSGIXPROC GLeeFuncPtr_glXGetVisualFromFBConfigSGIX;\r
+  #define glXGetVisualFromFBConfigSGIX GLeeFuncPtr_glXGetVisualFromFBConfigSGIX\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glXGetFBConfigFromVisualSGIX\r
+#define GLEE_H_DEFINED_glXGetFBConfigFromVisualSGIX\r
+  typedef GLXFBConfigSGIX (APIENTRYP GLEEPFNGLXGETFBCONFIGFROMVISUALSGIXPROC) (Display * dpy, XVisualInfo * vis);\r
+  GLEE_EXTERN GLEEPFNGLXGETFBCONFIGFROMVISUALSGIXPROC GLeeFuncPtr_glXGetFBConfigFromVisualSGIX;\r
+  #define glXGetFBConfigFromVisualSGIX GLeeFuncPtr_glXGetFBConfigFromVisualSGIX\r
+#endif\r
+#endif \r
+\r
+/* GLX_SGIX_pbuffer */\r
+\r
+#ifndef GLX_SGIX_pbuffer\r
+#define GLX_SGIX_pbuffer 1\r
+#define __GLEE_GLX_SGIX_pbuffer 1\r
+/* Constants */\r
+#define GLX_PBUFFER_BIT_SGIX                               0x00000004\r
+#define GLX_BUFFER_CLOBBER_MASK_SGIX                       0x08000000\r
+#define GLX_FRONT_LEFT_BUFFER_BIT_SGIX                     0x00000001\r
+#define GLX_FRONT_RIGHT_BUFFER_BIT_SGIX                    0x00000002\r
+#define GLX_BACK_LEFT_BUFFER_BIT_SGIX                      0x00000004\r
+#define GLX_BACK_RIGHT_BUFFER_BIT_SGIX                     0x00000008\r
+#define GLX_AUX_BUFFERS_BIT_SGIX                           0x00000010\r
+#define GLX_DEPTH_BUFFER_BIT_SGIX                          0x00000020\r
+#define GLX_STENCIL_BUFFER_BIT_SGIX                        0x00000040\r
+#define GLX_ACCUM_BUFFER_BIT_SGIX                          0x00000080\r
+#define GLX_SAMPLE_BUFFERS_BIT_SGIX                        0x00000100\r
+#define GLX_MAX_PBUFFER_WIDTH_SGIX                         0x8016\r
+#define GLX_MAX_PBUFFER_HEIGHT_SGIX                        0x8017\r
+#define GLX_MAX_PBUFFER_PIXELS_SGIX                        0x8018\r
+#define GLX_OPTIMAL_PBUFFER_WIDTH_SGIX                     0x8019\r
+#define GLX_OPTIMAL_PBUFFER_HEIGHT_SGIX                    0x801A\r
+#define GLX_PRESERVED_CONTENTS_SGIX                        0x801B\r
+#define GLX_LARGEST_PBUFFER_SGIX                           0x801C\r
+#define GLX_WIDTH_SGIX                                     0x801D\r
+#define GLX_HEIGHT_SGIX                                    0x801E\r
+#define GLX_EVENT_MASK_SGIX                                0x801F\r
+#define GLX_DAMAGED_SGIX                                   0x8020\r
+#define GLX_SAVED_SGIX                                     0x8021\r
+#define GLX_WINDOW_SGIX                                    0x8022\r
+#define GLX_PBUFFER_SGIX                                   0x8023\r
+#ifndef GLEE_H_DEFINED_glXCreateGLXPbufferSGIX\r
+#define GLEE_H_DEFINED_glXCreateGLXPbufferSGIX\r
+  typedef GLXPbufferSGIX (APIENTRYP GLEEPFNGLXCREATEGLXPBUFFERSGIXPROC) (Display * dpy, GLXFBConfigSGIX config, unsigned int width, unsigned int height, int * attrib_list);\r
+  GLEE_EXTERN GLEEPFNGLXCREATEGLXPBUFFERSGIXPROC GLeeFuncPtr_glXCreateGLXPbufferSGIX;\r
+  #define glXCreateGLXPbufferSGIX GLeeFuncPtr_glXCreateGLXPbufferSGIX\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glXDestroyGLXPbufferSGIX\r
+#define GLEE_H_DEFINED_glXDestroyGLXPbufferSGIX\r
+  typedef void (APIENTRYP GLEEPFNGLXDESTROYGLXPBUFFERSGIXPROC) (Display * dpy, GLXPbufferSGIX pbuf);\r
+  GLEE_EXTERN GLEEPFNGLXDESTROYGLXPBUFFERSGIXPROC GLeeFuncPtr_glXDestroyGLXPbufferSGIX;\r
+  #define glXDestroyGLXPbufferSGIX GLeeFuncPtr_glXDestroyGLXPbufferSGIX\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glXQueryGLXPbufferSGIX\r
+#define GLEE_H_DEFINED_glXQueryGLXPbufferSGIX\r
+  typedef int (APIENTRYP GLEEPFNGLXQUERYGLXPBUFFERSGIXPROC) (Display * dpy, GLXPbufferSGIX pbuf, int attribute, unsigned int * value);\r
+  GLEE_EXTERN GLEEPFNGLXQUERYGLXPBUFFERSGIXPROC GLeeFuncPtr_glXQueryGLXPbufferSGIX;\r
+  #define glXQueryGLXPbufferSGIX GLeeFuncPtr_glXQueryGLXPbufferSGIX\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glXSelectEventSGIX\r
+#define GLEE_H_DEFINED_glXSelectEventSGIX\r
+  typedef void (APIENTRYP GLEEPFNGLXSELECTEVENTSGIXPROC) (Display * dpy, GLXDrawable drawable, unsigned long mask);\r
+  GLEE_EXTERN GLEEPFNGLXSELECTEVENTSGIXPROC GLeeFuncPtr_glXSelectEventSGIX;\r
+  #define glXSelectEventSGIX GLeeFuncPtr_glXSelectEventSGIX\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glXGetSelectedEventSGIX\r
+#define GLEE_H_DEFINED_glXGetSelectedEventSGIX\r
+  typedef void (APIENTRYP GLEEPFNGLXGETSELECTEDEVENTSGIXPROC) (Display * dpy, GLXDrawable drawable, unsigned long * mask);\r
+  GLEE_EXTERN GLEEPFNGLXGETSELECTEDEVENTSGIXPROC GLeeFuncPtr_glXGetSelectedEventSGIX;\r
+  #define glXGetSelectedEventSGIX GLeeFuncPtr_glXGetSelectedEventSGIX\r
+#endif\r
+#endif \r
+\r
+/* GLX_SGI_cushion */\r
+\r
+#ifndef GLX_SGI_cushion\r
+#define GLX_SGI_cushion 1\r
+#define __GLEE_GLX_SGI_cushion 1\r
+/* Constants */\r
+#ifndef GLEE_H_DEFINED_glXCushionSGI\r
+#define GLEE_H_DEFINED_glXCushionSGI\r
+  typedef void (APIENTRYP GLEEPFNGLXCUSHIONSGIPROC) (Display * dpy, Window window, float cushion);\r
+  GLEE_EXTERN GLEEPFNGLXCUSHIONSGIPROC GLeeFuncPtr_glXCushionSGI;\r
+  #define glXCushionSGI GLeeFuncPtr_glXCushionSGI\r
+#endif\r
+#endif \r
+\r
+/* GLX_SGIX_video_resize */\r
+\r
+#ifndef GLX_SGIX_video_resize\r
+#define GLX_SGIX_video_resize 1\r
+#define __GLEE_GLX_SGIX_video_resize 1\r
+/* Constants */\r
+#define GLX_SYNC_FRAME_SGIX                                0x00000000\r
+#define GLX_SYNC_SWAP_SGIX                                 0x00000001\r
+#ifndef GLEE_H_DEFINED_glXBindChannelToWindowSGIX\r
+#define GLEE_H_DEFINED_glXBindChannelToWindowSGIX\r
+  typedef int (APIENTRYP GLEEPFNGLXBINDCHANNELTOWINDOWSGIXPROC) (Display * display, int screen, int channel, Window window);\r
+  GLEE_EXTERN GLEEPFNGLXBINDCHANNELTOWINDOWSGIXPROC GLeeFuncPtr_glXBindChannelToWindowSGIX;\r
+  #define glXBindChannelToWindowSGIX GLeeFuncPtr_glXBindChannelToWindowSGIX\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glXChannelRectSGIX\r
+#define GLEE_H_DEFINED_glXChannelRectSGIX\r
+  typedef int (APIENTRYP GLEEPFNGLXCHANNELRECTSGIXPROC) (Display * display, int screen, int channel, int x, int y, int w, int h);\r
+  GLEE_EXTERN GLEEPFNGLXCHANNELRECTSGIXPROC GLeeFuncPtr_glXChannelRectSGIX;\r
+  #define glXChannelRectSGIX GLeeFuncPtr_glXChannelRectSGIX\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glXQueryChannelRectSGIX\r
+#define GLEE_H_DEFINED_glXQueryChannelRectSGIX\r
+  typedef int (APIENTRYP GLEEPFNGLXQUERYCHANNELRECTSGIXPROC) (Display * display, int screen, int channel, int * dx, int * dy, int * dw, int * dh);\r
+  GLEE_EXTERN GLEEPFNGLXQUERYCHANNELRECTSGIXPROC GLeeFuncPtr_glXQueryChannelRectSGIX;\r
+  #define glXQueryChannelRectSGIX GLeeFuncPtr_glXQueryChannelRectSGIX\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glXQueryChannelDeltasSGIX\r
+#define GLEE_H_DEFINED_glXQueryChannelDeltasSGIX\r
+  typedef int (APIENTRYP GLEEPFNGLXQUERYCHANNELDELTASSGIXPROC) (Display * display, int screen, int channel, int * x, int * y, int * w, int * h);\r
+  GLEE_EXTERN GLEEPFNGLXQUERYCHANNELDELTASSGIXPROC GLeeFuncPtr_glXQueryChannelDeltasSGIX;\r
+  #define glXQueryChannelDeltasSGIX GLeeFuncPtr_glXQueryChannelDeltasSGIX\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glXChannelRectSyncSGIX\r
+#define GLEE_H_DEFINED_glXChannelRectSyncSGIX\r
+  typedef int (APIENTRYP GLEEPFNGLXCHANNELRECTSYNCSGIXPROC) (Display * display, int screen, int channel, GLenum synctype);\r
+  GLEE_EXTERN GLEEPFNGLXCHANNELRECTSYNCSGIXPROC GLeeFuncPtr_glXChannelRectSyncSGIX;\r
+  #define glXChannelRectSyncSGIX GLeeFuncPtr_glXChannelRectSyncSGIX\r
+#endif\r
+#endif \r
+\r
+/* GLX_SGIX_swap_group */\r
+\r
+#ifndef GLX_SGIX_swap_group\r
+#define GLX_SGIX_swap_group 1\r
+#define __GLEE_GLX_SGIX_swap_group 1\r
+/* Constants */\r
+#ifndef GLEE_H_DEFINED_glXJoinSwapGroupSGIX\r
+#define GLEE_H_DEFINED_glXJoinSwapGroupSGIX\r
+  typedef void (APIENTRYP GLEEPFNGLXJOINSWAPGROUPSGIXPROC) (Display * dpy, GLXDrawable drawable, GLXDrawable member);\r
+  GLEE_EXTERN GLEEPFNGLXJOINSWAPGROUPSGIXPROC GLeeFuncPtr_glXJoinSwapGroupSGIX;\r
+  #define glXJoinSwapGroupSGIX GLeeFuncPtr_glXJoinSwapGroupSGIX\r
+#endif\r
+#endif \r
+\r
+/* GLX_SGIX_swap_barrier */\r
+\r
+#ifndef GLX_SGIX_swap_barrier\r
+#define GLX_SGIX_swap_barrier 1\r
+#define __GLEE_GLX_SGIX_swap_barrier 1\r
+/* Constants */\r
+#ifndef GLEE_H_DEFINED_glXBindSwapBarrierSGIX\r
+#define GLEE_H_DEFINED_glXBindSwapBarrierSGIX\r
+  typedef void (APIENTRYP GLEEPFNGLXBINDSWAPBARRIERSGIXPROC) (Display * dpy, GLXDrawable drawable, int barrier);\r
+  GLEE_EXTERN GLEEPFNGLXBINDSWAPBARRIERSGIXPROC GLeeFuncPtr_glXBindSwapBarrierSGIX;\r
+  #define glXBindSwapBarrierSGIX GLeeFuncPtr_glXBindSwapBarrierSGIX\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glXQueryMaxSwapBarriersSGIX\r
+#define GLEE_H_DEFINED_glXQueryMaxSwapBarriersSGIX\r
+  typedef Bool (APIENTRYP GLEEPFNGLXQUERYMAXSWAPBARRIERSSGIXPROC) (Display * dpy, int screen, int * max);\r
+  GLEE_EXTERN GLEEPFNGLXQUERYMAXSWAPBARRIERSSGIXPROC GLeeFuncPtr_glXQueryMaxSwapBarriersSGIX;\r
+  #define glXQueryMaxSwapBarriersSGIX GLeeFuncPtr_glXQueryMaxSwapBarriersSGIX\r
+#endif\r
+#endif \r
+\r
+/* GLX_SGIS_blended_overlay */\r
+\r
+#ifndef GLX_SGIS_blended_overlay\r
+#define GLX_SGIS_blended_overlay 1\r
+#define __GLEE_GLX_SGIS_blended_overlay 1\r
+/* Constants */\r
+#define GLX_BLENDED_RGBA_SGIS                              0x8025\r
+#endif \r
+\r
+/* GLX_SGIS_shared_multisample */\r
+\r
+#ifndef GLX_SGIS_shared_multisample\r
+#define GLX_SGIS_shared_multisample 1\r
+#define __GLEE_GLX_SGIS_shared_multisample 1\r
+/* Constants */\r
+#define GLX_MULTISAMPLE_SUB_RECT_WIDTH_SGIS                0x8026\r
+#define GLX_MULTISAMPLE_SUB_RECT_HEIGHT_SGIS               0x8027\r
+#endif \r
+\r
+/* GLX_SUN_get_transparent_index */\r
+\r
+#ifndef GLX_SUN_get_transparent_index\r
+#define GLX_SUN_get_transparent_index 1\r
+#define __GLEE_GLX_SUN_get_transparent_index 1\r
+/* Constants */\r
+#ifndef GLEE_H_DEFINED_glXGetTransparentIndexSUN\r
+#define GLEE_H_DEFINED_glXGetTransparentIndexSUN\r
+  typedef Status (APIENTRYP GLEEPFNGLXGETTRANSPARENTINDEXSUNPROC) (Display * dpy, Window overlay, Window underlay, long * pTransparentIndex);\r
+  GLEE_EXTERN GLEEPFNGLXGETTRANSPARENTINDEXSUNPROC GLeeFuncPtr_glXGetTransparentIndexSUN;\r
+  #define glXGetTransparentIndexSUN GLeeFuncPtr_glXGetTransparentIndexSUN\r
+#endif\r
+#endif \r
+\r
+/* GLX_3DFX_multisample */\r
+\r
+#ifndef GLX_3DFX_multisample\r
+#define GLX_3DFX_multisample 1\r
+#define __GLEE_GLX_3DFX_multisample 1\r
+/* Constants */\r
+#define GLX_SAMPLE_BUFFERS_3DFX                            0x8050\r
+#define GLX_SAMPLES_3DFX                                   0x8051\r
+#endif \r
+\r
+/* GLX_MESA_copy_sub_buffer */\r
+\r
+#ifndef GLX_MESA_copy_sub_buffer\r
+#define GLX_MESA_copy_sub_buffer 1\r
+#define __GLEE_GLX_MESA_copy_sub_buffer 1\r
+/* Constants */\r
+#ifndef GLEE_H_DEFINED_glXCopySubBufferMESA\r
+#define GLEE_H_DEFINED_glXCopySubBufferMESA\r
+  typedef void (APIENTRYP GLEEPFNGLXCOPYSUBBUFFERMESAPROC) (Display * dpy, GLXDrawable drawable, int x, int y, int width, int height);\r
+  GLEE_EXTERN GLEEPFNGLXCOPYSUBBUFFERMESAPROC GLeeFuncPtr_glXCopySubBufferMESA;\r
+  #define glXCopySubBufferMESA GLeeFuncPtr_glXCopySubBufferMESA\r
+#endif\r
+#endif \r
+\r
+/* GLX_MESA_pixmap_colormap */\r
+\r
+#ifndef GLX_MESA_pixmap_colormap\r
+#define GLX_MESA_pixmap_colormap 1\r
+#define __GLEE_GLX_MESA_pixmap_colormap 1\r
+/* Constants */\r
+#ifndef GLEE_H_DEFINED_glXCreateGLXPixmapMESA\r
+#define GLEE_H_DEFINED_glXCreateGLXPixmapMESA\r
+  typedef GLXPixmap (APIENTRYP GLEEPFNGLXCREATEGLXPIXMAPMESAPROC) (Display * dpy, XVisualInfo * visual, Pixmap pixmap, Colormap cmap);\r
+  GLEE_EXTERN GLEEPFNGLXCREATEGLXPIXMAPMESAPROC GLeeFuncPtr_glXCreateGLXPixmapMESA;\r
+  #define glXCreateGLXPixmapMESA GLeeFuncPtr_glXCreateGLXPixmapMESA\r
+#endif\r
+#endif \r
+\r
+/* GLX_MESA_release_buffers */\r
+\r
+#ifndef GLX_MESA_release_buffers\r
+#define GLX_MESA_release_buffers 1\r
+#define __GLEE_GLX_MESA_release_buffers 1\r
+/* Constants */\r
+#ifndef GLEE_H_DEFINED_glXReleaseBuffersMESA\r
+#define GLEE_H_DEFINED_glXReleaseBuffersMESA\r
+  typedef Bool (APIENTRYP GLEEPFNGLXRELEASEBUFFERSMESAPROC) (Display * dpy, GLXDrawable drawable);\r
+  GLEE_EXTERN GLEEPFNGLXRELEASEBUFFERSMESAPROC GLeeFuncPtr_glXReleaseBuffersMESA;\r
+  #define glXReleaseBuffersMESA GLeeFuncPtr_glXReleaseBuffersMESA\r
+#endif\r
+#endif \r
+\r
+/* GLX_MESA_set_3dfx_mode */\r
+\r
+#ifndef GLX_MESA_set_3dfx_mode\r
+#define GLX_MESA_set_3dfx_mode 1\r
+#define __GLEE_GLX_MESA_set_3dfx_mode 1\r
+/* Constants */\r
+#define GLX_3DFX_WINDOW_MODE_MESA                          0x1\r
+#define GLX_3DFX_FULLSCREEN_MODE_MESA                      0x2\r
+#ifndef GLEE_H_DEFINED_glXSet3DfxModeMESA\r
+#define GLEE_H_DEFINED_glXSet3DfxModeMESA\r
+  typedef Bool (APIENTRYP GLEEPFNGLXSET3DFXMODEMESAPROC) (int mode);\r
+  GLEE_EXTERN GLEEPFNGLXSET3DFXMODEMESAPROC GLeeFuncPtr_glXSet3DfxModeMESA;\r
+  #define glXSet3DfxModeMESA GLeeFuncPtr_glXSet3DfxModeMESA\r
+#endif\r
+#endif \r
+\r
+/* GLX_SGIX_visual_select_group */\r
+\r
+#ifndef GLX_SGIX_visual_select_group\r
+#define GLX_SGIX_visual_select_group 1\r
+#define __GLEE_GLX_SGIX_visual_select_group 1\r
+/* Constants */\r
+#define GLX_VISUAL_SELECT_GROUP_SGIX                       0x8028\r
+#endif \r
+\r
+/* GLX_OML_swap_method */\r
+\r
+#ifndef GLX_OML_swap_method\r
+#define GLX_OML_swap_method 1\r
+#define __GLEE_GLX_OML_swap_method 1\r
+/* Constants */\r
+#define GLX_SWAP_METHOD_OML                                0x8060\r
+#define GLX_SWAP_EXCHANGE_OML                              0x8061\r
+#define GLX_SWAP_COPY_OML                                  0x8062\r
+#define GLX_SWAP_UNDEFINED_OML                             0x8063\r
+#endif \r
+\r
+/* GLX_OML_sync_control */\r
+\r
+#ifndef GLX_OML_sync_control\r
+#define GLX_OML_sync_control 1\r
+#define __GLEE_GLX_OML_sync_control 1\r
+/* Constants */\r
+#ifndef GLEE_H_DEFINED_glXGetSyncValuesOML\r
+#define GLEE_H_DEFINED_glXGetSyncValuesOML\r
+  typedef Bool (APIENTRYP GLEEPFNGLXGETSYNCVALUESOMLPROC) (Display * dpy, GLXDrawable drawable, int64_t * ust, int64_t * msc, int64_t * sbc);\r
+  GLEE_EXTERN GLEEPFNGLXGETSYNCVALUESOMLPROC GLeeFuncPtr_glXGetSyncValuesOML;\r
+  #define glXGetSyncValuesOML GLeeFuncPtr_glXGetSyncValuesOML\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glXGetMscRateOML\r
+#define GLEE_H_DEFINED_glXGetMscRateOML\r
+  typedef Bool (APIENTRYP GLEEPFNGLXGETMSCRATEOMLPROC) (Display * dpy, GLXDrawable drawable, int32_t * numerator, int32_t * denominator);\r
+  GLEE_EXTERN GLEEPFNGLXGETMSCRATEOMLPROC GLeeFuncPtr_glXGetMscRateOML;\r
+  #define glXGetMscRateOML GLeeFuncPtr_glXGetMscRateOML\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glXSwapBuffersMscOML\r
+#define GLEE_H_DEFINED_glXSwapBuffersMscOML\r
+  typedef int64_t (APIENTRYP GLEEPFNGLXSWAPBUFFERSMSCOMLPROC) (Display * dpy, GLXDrawable drawable, int64_t target_msc, int64_t divisor, int64_t remainder);\r
+  GLEE_EXTERN GLEEPFNGLXSWAPBUFFERSMSCOMLPROC GLeeFuncPtr_glXSwapBuffersMscOML;\r
+  #define glXSwapBuffersMscOML GLeeFuncPtr_glXSwapBuffersMscOML\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glXWaitForMscOML\r
+#define GLEE_H_DEFINED_glXWaitForMscOML\r
+  typedef Bool (APIENTRYP GLEEPFNGLXWAITFORMSCOMLPROC) (Display * dpy, GLXDrawable drawable, int64_t target_msc, int64_t divisor, int64_t remainder, int64_t * ust, int64_t * msc, int64_t * sbc);\r
+  GLEE_EXTERN GLEEPFNGLXWAITFORMSCOMLPROC GLeeFuncPtr_glXWaitForMscOML;\r
+  #define glXWaitForMscOML GLeeFuncPtr_glXWaitForMscOML\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glXWaitForSbcOML\r
+#define GLEE_H_DEFINED_glXWaitForSbcOML\r
+  typedef Bool (APIENTRYP GLEEPFNGLXWAITFORSBCOMLPROC) (Display * dpy, GLXDrawable drawable, int64_t target_sbc, int64_t * ust, int64_t * msc, int64_t * sbc);\r
+  GLEE_EXTERN GLEEPFNGLXWAITFORSBCOMLPROC GLeeFuncPtr_glXWaitForSbcOML;\r
+  #define glXWaitForSbcOML GLeeFuncPtr_glXWaitForSbcOML\r
+#endif\r
+#endif \r
+\r
+/* GLX_NV_float_buffer */\r
+\r
+#ifndef GLX_NV_float_buffer\r
+#define GLX_NV_float_buffer 1\r
+#define __GLEE_GLX_NV_float_buffer 1\r
+/* Constants */\r
+#define GLX_FLOAT_COMPONENTS_NV                            0x20B0\r
+#endif \r
+\r
+/* GLX_SGIX_hyperpipe */\r
+\r
+#ifndef GLX_SGIX_hyperpipe\r
+#define GLX_SGIX_hyperpipe 1\r
+#define __GLEE_GLX_SGIX_hyperpipe 1\r
+/* Constants */\r
+#define GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX                80\r
+#define GLX_BAD_HYPERPIPE_CONFIG_SGIX                      91\r
+#define GLX_BAD_HYPERPIPE_SGIX                             92\r
+#define GLX_HYPERPIPE_DISPLAY_PIPE_SGIX                    0x00000001\r
+#define GLX_HYPERPIPE_RENDER_PIPE_SGIX                     0x00000002\r
+#define GLX_PIPE_RECT_SGIX                                 0x00000001\r
+#define GLX_PIPE_RECT_LIMITS_SGIX                          0x00000002\r
+#define GLX_HYPERPIPE_STEREO_SGIX                          0x00000003\r
+#define GLX_HYPERPIPE_PIXEL_AVERAGE_SGIX                   0x00000004\r
+#define GLX_HYPERPIPE_ID_SGIX                              0x8030\r
+#ifndef GLEE_H_DEFINED_glXQueryHyperpipeNetworkSGIX\r
+#define GLEE_H_DEFINED_glXQueryHyperpipeNetworkSGIX\r
+  typedef GLXHyperpipeNetworkSGIX * (APIENTRYP GLEEPFNGLXQUERYHYPERPIPENETWORKSGIXPROC) (Display * dpy, int * npipes);\r
+  GLEE_EXTERN GLEEPFNGLXQUERYHYPERPIPENETWORKSGIXPROC GLeeFuncPtr_glXQueryHyperpipeNetworkSGIX;\r
+  #define glXQueryHyperpipeNetworkSGIX GLeeFuncPtr_glXQueryHyperpipeNetworkSGIX\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glXHyperpipeConfigSGIX\r
+#define GLEE_H_DEFINED_glXHyperpipeConfigSGIX\r
+  typedef int (APIENTRYP GLEEPFNGLXHYPERPIPECONFIGSGIXPROC) (Display * dpy, int networkId, int npipes, GLXHyperpipeConfigSGIX * cfg, int * hpId);\r
+  GLEE_EXTERN GLEEPFNGLXHYPERPIPECONFIGSGIXPROC GLeeFuncPtr_glXHyperpipeConfigSGIX;\r
+  #define glXHyperpipeConfigSGIX GLeeFuncPtr_glXHyperpipeConfigSGIX\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glXQueryHyperpipeConfigSGIX\r
+#define GLEE_H_DEFINED_glXQueryHyperpipeConfigSGIX\r
+  typedef GLXHyperpipeConfigSGIX * (APIENTRYP GLEEPFNGLXQUERYHYPERPIPECONFIGSGIXPROC) (Display * dpy, int hpId, int * npipes);\r
+  GLEE_EXTERN GLEEPFNGLXQUERYHYPERPIPECONFIGSGIXPROC GLeeFuncPtr_glXQueryHyperpipeConfigSGIX;\r
+  #define glXQueryHyperpipeConfigSGIX GLeeFuncPtr_glXQueryHyperpipeConfigSGIX\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glXDestroyHyperpipeConfigSGIX\r
+#define GLEE_H_DEFINED_glXDestroyHyperpipeConfigSGIX\r
+  typedef int (APIENTRYP GLEEPFNGLXDESTROYHYPERPIPECONFIGSGIXPROC) (Display * dpy, int hpId);\r
+  GLEE_EXTERN GLEEPFNGLXDESTROYHYPERPIPECONFIGSGIXPROC GLeeFuncPtr_glXDestroyHyperpipeConfigSGIX;\r
+  #define glXDestroyHyperpipeConfigSGIX GLeeFuncPtr_glXDestroyHyperpipeConfigSGIX\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glXBindHyperpipeSGIX\r
+#define GLEE_H_DEFINED_glXBindHyperpipeSGIX\r
+  typedef int (APIENTRYP GLEEPFNGLXBINDHYPERPIPESGIXPROC) (Display * dpy, int hpId);\r
+  GLEE_EXTERN GLEEPFNGLXBINDHYPERPIPESGIXPROC GLeeFuncPtr_glXBindHyperpipeSGIX;\r
+  #define glXBindHyperpipeSGIX GLeeFuncPtr_glXBindHyperpipeSGIX\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glXQueryHyperpipeBestAttribSGIX\r
+#define GLEE_H_DEFINED_glXQueryHyperpipeBestAttribSGIX\r
+  typedef int (APIENTRYP GLEEPFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC) (Display * dpy, int timeSlice, int attrib, int size, void * attribList, void * returnAttribList);\r
+  GLEE_EXTERN GLEEPFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC GLeeFuncPtr_glXQueryHyperpipeBestAttribSGIX;\r
+  #define glXQueryHyperpipeBestAttribSGIX GLeeFuncPtr_glXQueryHyperpipeBestAttribSGIX\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glXHyperpipeAttribSGIX\r
+#define GLEE_H_DEFINED_glXHyperpipeAttribSGIX\r
+  typedef int (APIENTRYP GLEEPFNGLXHYPERPIPEATTRIBSGIXPROC) (Display * dpy, int timeSlice, int attrib, int size, void * attribList);\r
+  GLEE_EXTERN GLEEPFNGLXHYPERPIPEATTRIBSGIXPROC GLeeFuncPtr_glXHyperpipeAttribSGIX;\r
+  #define glXHyperpipeAttribSGIX GLeeFuncPtr_glXHyperpipeAttribSGIX\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glXQueryHyperpipeAttribSGIX\r
+#define GLEE_H_DEFINED_glXQueryHyperpipeAttribSGIX\r
+  typedef int (APIENTRYP GLEEPFNGLXQUERYHYPERPIPEATTRIBSGIXPROC) (Display * dpy, int timeSlice, int attrib, int size, void * returnAttribList);\r
+  GLEE_EXTERN GLEEPFNGLXQUERYHYPERPIPEATTRIBSGIXPROC GLeeFuncPtr_glXQueryHyperpipeAttribSGIX;\r
+  #define glXQueryHyperpipeAttribSGIX GLeeFuncPtr_glXQueryHyperpipeAttribSGIX\r
+#endif\r
+#endif \r
+\r
+/* GLX_MESA_agp_offset */\r
+\r
+#ifndef GLX_MESA_agp_offset\r
+#define GLX_MESA_agp_offset 1\r
+#define __GLEE_GLX_MESA_agp_offset 1\r
+/* Constants */\r
+#ifndef GLEE_H_DEFINED_glXGetAGPOffsetMESA\r
+#define GLEE_H_DEFINED_glXGetAGPOffsetMESA\r
+  typedef unsigned int (APIENTRYP GLEEPFNGLXGETAGPOFFSETMESAPROC) (const void * pointer);\r
+  GLEE_EXTERN GLEEPFNGLXGETAGPOFFSETMESAPROC GLeeFuncPtr_glXGetAGPOffsetMESA;\r
+  #define glXGetAGPOffsetMESA GLeeFuncPtr_glXGetAGPOffsetMESA\r
+#endif\r
+#endif \r
+\r
+/* GLX_EXT_fbconfig_packed_float */\r
+\r
+#ifndef GLX_EXT_fbconfig_packed_float\r
+#define GLX_EXT_fbconfig_packed_float 1\r
+#define __GLEE_GLX_EXT_fbconfig_packed_float 1\r
+/* Constants */\r
+#define GLX_RGBA_UNSIGNED_FLOAT_TYPE_EXT                   0x20B1\r
+#define GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT                    0x00000008\r
+#endif \r
+\r
+/* GLX_EXT_framebuffer_sRGB */\r
+\r
+#ifndef GLX_EXT_framebuffer_sRGB\r
+#define GLX_EXT_framebuffer_sRGB 1\r
+#define __GLEE_GLX_EXT_framebuffer_sRGB 1\r
+/* Constants */\r
+#define GLX_FRAMEBUFFER_SRGB_CAPABLE_EXT                   0x20B2\r
+#endif \r
+\r
+/* GLX_EXT_texture_from_pixmap */\r
+\r
+#ifndef GLX_EXT_texture_from_pixmap\r
+#define GLX_EXT_texture_from_pixmap 1\r
+#define __GLEE_GLX_EXT_texture_from_pixmap 1\r
+/* Constants */\r
+#define GLX_TEXTURE_1D_BIT_EXT                             0x00000001\r
+#define GLX_TEXTURE_2D_BIT_EXT                             0x00000002\r
+#define GLX_TEXTURE_RECTANGLE_BIT_EXT                      0x00000004\r
+#define GLX_BIND_TO_TEXTURE_RGB_EXT                        0x20D0\r
+#define GLX_BIND_TO_TEXTURE_RGBA_EXT                       0x20D1\r
+#define GLX_BIND_TO_MIPMAP_TEXTURE_EXT                     0x20D2\r
+#define GLX_BIND_TO_TEXTURE_TARGETS_EXT                    0x20D3\r
+#define GLX_Y_INVERTED_EXT                                 0x20D4\r
+#define GLX_TEXTURE_FORMAT_EXT                             0x20D5\r
+#define GLX_TEXTURE_TARGET_EXT                             0x20D6\r
+#define GLX_MIPMAP_TEXTURE_EXT                             0x20D7\r
+#define GLX_TEXTURE_FORMAT_NONE_EXT                        0x20D8\r
+#define GLX_TEXTURE_FORMAT_RGB_EXT                         0x20D9\r
+#define GLX_TEXTURE_FORMAT_RGBA_EXT                        0x20DA\r
+#define GLX_TEXTURE_1D_EXT                                 0x20DB\r
+#define GLX_TEXTURE_2D_EXT                                 0x20DC\r
+#define GLX_TEXTURE_RECTANGLE_EXT                          0x20DD\r
+#define GLX_FRONT_LEFT_EXT                                 0x20DE\r
+#define GLX_FRONT_RIGHT_EXT                                0x20DF\r
+#define GLX_BACK_LEFT_EXT                                  0x20E0\r
+#define GLX_BACK_RIGHT_EXT                                 0x20E1\r
+#define GLX_FRONT_EXT                                      GLX_FRONT_LEFT_EXT\r
+#define GLX_BACK_EXT                                       GLX_BACK_LEFT_EXT\r
+#define GLX_AUX0_EXT                                       0x20E2\r
+#define GLX_AUX1_EXT                                       0x20E3\r
+#define GLX_AUX2_EXT                                       0x20E4\r
+#define GLX_AUX3_EXT                                       0x20E5\r
+#define GLX_AUX4_EXT                                       0x20E6\r
+#define GLX_AUX5_EXT                                       0x20E7\r
+#define GLX_AUX6_EXT                                       0x20E8\r
+#define GLX_AUX7_EXT                                       0x20E9\r
+#define GLX_AUX8_EXT                                       0x20EA\r
+#define GLX_AUX9_EXT                                       0x20EB\r
+#ifndef GLEE_H_DEFINED_glXBindTexImageEXT\r
+#define GLEE_H_DEFINED_glXBindTexImageEXT\r
+  typedef void (APIENTRYP GLEEPFNGLXBINDTEXIMAGEEXTPROC) (Display * dpy, GLXDrawable drawable, int buffer, const int * attrib_list);\r
+  GLEE_EXTERN GLEEPFNGLXBINDTEXIMAGEEXTPROC GLeeFuncPtr_glXBindTexImageEXT;\r
+  #define glXBindTexImageEXT GLeeFuncPtr_glXBindTexImageEXT\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glXReleaseTexImageEXT\r
+#define GLEE_H_DEFINED_glXReleaseTexImageEXT\r
+  typedef void (APIENTRYP GLEEPFNGLXRELEASETEXIMAGEEXTPROC) (Display * dpy, GLXDrawable drawable, int buffer);\r
+  GLEE_EXTERN GLEEPFNGLXRELEASETEXIMAGEEXTPROC GLeeFuncPtr_glXReleaseTexImageEXT;\r
+  #define glXReleaseTexImageEXT GLeeFuncPtr_glXReleaseTexImageEXT\r
+#endif\r
+#endif \r
+\r
+/* GLX_NV_present_video */\r
+\r
+#ifndef GLX_NV_present_video\r
+#define GLX_NV_present_video 1\r
+#define __GLEE_GLX_NV_present_video 1\r
+/* Constants */\r
+#define GLX_NUM_VIDEO_SLOTS_NV                             0x20F0\r
+#endif \r
+\r
+/* GLX_NV_video_out */\r
+\r
+#ifndef GLX_NV_video_out\r
+#define GLX_NV_video_out 1\r
+#define __GLEE_GLX_NV_video_out 1\r
+/* Constants */\r
+#define GLX_VIDEO_OUT_COLOR_NV                             0x20C3\r
+#define GLX_VIDEO_OUT_ALPHA_NV                             0x20C4\r
+#define GLX_VIDEO_OUT_DEPTH_NV                             0x20C5\r
+#define GLX_VIDEO_OUT_COLOR_AND_ALPHA_NV                   0x20C6\r
+#define GLX_VIDEO_OUT_COLOR_AND_DEPTH_NV                   0x20C7\r
+#define GLX_VIDEO_OUT_FRAME_NV                             0x20C8\r
+#define GLX_VIDEO_OUT_FIELD_1_NV                           0x20C9\r
+#define GLX_VIDEO_OUT_FIELD_2_NV                           0x20CA\r
+#define GLX_VIDEO_OUT_STACKED_FIELDS_1_2_NV                0x20CB\r
+#define GLX_VIDEO_OUT_STACKED_FIELDS_2_1_NV                0x20CC\r
+#endif \r
+\r
+/* GLX_NV_swap_group */\r
+\r
+#ifndef GLX_NV_swap_group\r
+#define GLX_NV_swap_group 1\r
+#define __GLEE_GLX_NV_swap_group 1\r
+/* Constants */\r
+#endif \r
+\r
+/* GLX_EXT_scene_marker */\r
+\r
+#ifndef GLX_EXT_scene_marker\r
+#define GLX_EXT_scene_marker 1\r
+#define __GLEE_GLX_EXT_scene_marker 1\r
+/* Constants */\r
+#endif \r
+\r
+/* GLX_NV_video_output */\r
+\r
+#ifndef GLX_NV_video_output\r
+#define GLX_NV_video_output 1\r
+#define __GLEE_GLX_NV_video_output 1\r
+/* Constants */\r
+#define GLX_VIDEO_OUT_COLOR_NV                             0x20C3\r
+#define GLX_VIDEO_OUT_ALPHA_NV                             0x20C4\r
+#define GLX_VIDEO_OUT_DEPTH_NV                             0x20C5\r
+#define GLX_VIDEO_OUT_COLOR_AND_ALPHA_NV                   0x20C6\r
+#define GLX_VIDEO_OUT_COLOR_AND_DEPTH_NV                   0x20C7\r
+#define GLX_VIDEO_OUT_FRAME_NV                             0x20C8\r
+#define GLX_VIDEO_OUT_FIELD_1_NV                           0x20C9\r
+#define GLX_VIDEO_OUT_FIELD_2_NV                           0x20CA\r
+#define GLX_VIDEO_OUT_STACKED_FIELDS_1_2_NV                0x20CB\r
+#define GLX_VIDEO_OUT_STACKED_FIELDS_2_1_NV                0x20CC\r
+#ifndef GLEE_H_DEFINED_glXGetVideoDeviceNV\r
+#define GLEE_H_DEFINED_glXGetVideoDeviceNV\r
+  typedef int (APIENTRYP GLEEPFNGLXGETVIDEODEVICENVPROC) (Display * dpy, int screen, int numVideoDevices, GLXVideoDeviceNV * pVideoDevice);\r
+  GLEE_EXTERN GLEEPFNGLXGETVIDEODEVICENVPROC GLeeFuncPtr_glXGetVideoDeviceNV;\r
+  #define glXGetVideoDeviceNV GLeeFuncPtr_glXGetVideoDeviceNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glXReleaseVideoDeviceNV\r
+#define GLEE_H_DEFINED_glXReleaseVideoDeviceNV\r
+  typedef int (APIENTRYP GLEEPFNGLXRELEASEVIDEODEVICENVPROC) (Display * dpy, int screen, GLXVideoDeviceNV VideoDevice);\r
+  GLEE_EXTERN GLEEPFNGLXRELEASEVIDEODEVICENVPROC GLeeFuncPtr_glXReleaseVideoDeviceNV;\r
+  #define glXReleaseVideoDeviceNV GLeeFuncPtr_glXReleaseVideoDeviceNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glXBindVideoImageNV\r
+#define GLEE_H_DEFINED_glXBindVideoImageNV\r
+  typedef int (APIENTRYP GLEEPFNGLXBINDVIDEOIMAGENVPROC) (Display * dpy, GLXVideoDeviceNV VideoDevice, GLXPbuffer pbuf, int iVideoBuffer);\r
+  GLEE_EXTERN GLEEPFNGLXBINDVIDEOIMAGENVPROC GLeeFuncPtr_glXBindVideoImageNV;\r
+  #define glXBindVideoImageNV GLeeFuncPtr_glXBindVideoImageNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glXReleaseVideoImageNV\r
+#define GLEE_H_DEFINED_glXReleaseVideoImageNV\r
+  typedef int (APIENTRYP GLEEPFNGLXRELEASEVIDEOIMAGENVPROC) (Display * dpy, GLXPbuffer pbuf);\r
+  GLEE_EXTERN GLEEPFNGLXRELEASEVIDEOIMAGENVPROC GLeeFuncPtr_glXReleaseVideoImageNV;\r
+  #define glXReleaseVideoImageNV GLeeFuncPtr_glXReleaseVideoImageNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glXSendPbufferToVideoNV\r
+#define GLEE_H_DEFINED_glXSendPbufferToVideoNV\r
+  typedef int (APIENTRYP GLEEPFNGLXSENDPBUFFERTOVIDEONVPROC) (Display * dpy, GLXPbuffer pbuf, int iBufferType, unsigned long * pulCounterPbuffer, GLboolean bBlock);\r
+  GLEE_EXTERN GLEEPFNGLXSENDPBUFFERTOVIDEONVPROC GLeeFuncPtr_glXSendPbufferToVideoNV;\r
+  #define glXSendPbufferToVideoNV GLeeFuncPtr_glXSendPbufferToVideoNV\r
+#endif\r
+#ifndef GLEE_H_DEFINED_glXGetVideoInfoNV\r
+#define GLEE_H_DEFINED_glXGetVideoInfoNV\r
+  typedef int (APIENTRYP GLEEPFNGLXGETVIDEOINFONVPROC) (Display * dpy, int screen, GLXVideoDeviceNV VideoDevice, unsigned long * pulCounterOutputPbuffer, unsigned long * pulCounterOutputVideo);\r
+  GLEE_EXTERN GLEEPFNGLXGETVIDEOINFONVPROC GLeeFuncPtr_glXGetVideoInfoNV;\r
+  #define glXGetVideoInfoNV GLeeFuncPtr_glXGetVideoInfoNV\r
+#endif\r
+#endif \r
+#endif /*end GLX */\r
+\r
+/*****************************************************************\r
+ * GLee functions\r
+ *****************************************************************/\r
\r
+GLEE_EXTERN GLboolean GLeeInit( void );\r
+GLEE_EXTERN GLint GLeeForceLink(const char * extensionName);\r
+GLEE_EXTERN const char * GLeeGetErrorString( void );\r
+GLEE_EXTERN const char * GLeeGetExtStrGL( void );\r
+GLEE_EXTERN GLboolean GLeeEnabled(GLboolean * extensionQueryingVariable);\r
+\r
+#ifdef WIN32\r
+GLEE_EXTERN const char * GLeeGetExtStrWGL( void );\r
+#elif defined(__APPLE__) || defined(__APPLE_CC__)\r
+#else \r
+GLEE_EXTERN const char * GLeeGetExtStrGLX( void );\r
+#endif\r
+\r
+#ifdef __cplusplus\r
+}      /* end C linkage */\r
+#endif\r
+\r
+#endif /* __glee_h_ defined */\r
diff --git a/GLee5_4/GLee.lib b/GLee5_4/GLee.lib
new file mode 100644 (file)
index 0000000..15016d8
Binary files /dev/null and b/GLee5_4/GLee.lib differ
diff --git a/GLee5_4/extensionList.txt b/GLee5_4/extensionList.txt
new file mode 100644 (file)
index 0000000..a2f4c3c
--- /dev/null
@@ -0,0 +1,410 @@
+--------------------------------------------------------------\r
+GLee 5.4 Supported Extensions and Core Functions\r
+--------------------------------------------------------------\r
+\r
+Core OpenGL Version: 3.0\r
+399 extensions supported (322 GL | 37 WGL | 40 GLX)\r
+\r
+GL Extensions\r
+-------------------\r
+\r
+GL_ARB_imaging\r
+GL_ARB_multitexture\r
+GL_ARB_transpose_matrix\r
+GL_ARB_multisample\r
+GL_ARB_texture_env_add\r
+GL_ARB_texture_cube_map\r
+GL_ARB_texture_compression\r
+GL_ARB_texture_border_clamp\r
+GL_ARB_point_parameters\r
+GL_ARB_vertex_blend\r
+GL_ARB_matrix_palette\r
+GL_ARB_texture_env_combine\r
+GL_ARB_texture_env_crossbar\r
+GL_ARB_texture_env_dot3\r
+GL_ARB_texture_mirrored_repeat\r
+GL_ARB_depth_texture\r
+GL_ARB_shadow\r
+GL_ARB_shadow_ambient\r
+GL_ARB_window_pos\r
+GL_ARB_vertex_program\r
+GL_ARB_fragment_program\r
+GL_ARB_vertex_buffer_object\r
+GL_ARB_occlusion_query\r
+GL_ARB_shader_objects\r
+GL_ARB_vertex_shader\r
+GL_ARB_fragment_shader\r
+GL_ARB_shading_language_100\r
+GL_ARB_texture_non_power_of_two\r
+GL_ARB_point_sprite\r
+GL_ARB_fragment_program_shadow\r
+GL_ARB_draw_buffers\r
+GL_ARB_texture_rectangle\r
+GL_ARB_color_buffer_float\r
+GL_ARB_half_float_pixel\r
+GL_ARB_texture_float\r
+GL_ARB_pixel_buffer_object\r
+GL_ARB_depth_buffer_float\r
+GL_ARB_draw_instanced\r
+GL_ARB_framebuffer_object\r
+GL_ARB_framebuffer_sRGB\r
+GL_ARB_geometry_shader4\r
+GL_ARB_half_float_vertex\r
+GL_ARB_instanced_arrays\r
+GL_ARB_map_buffer_range\r
+GL_ARB_texture_buffer_object\r
+GL_ARB_texture_compression_rgtc\r
+GL_ARB_texture_rg\r
+GL_ARB_vertex_array_object\r
+GL_EXT_abgr\r
+GL_EXT_blend_color\r
+GL_EXT_polygon_offset\r
+GL_EXT_texture\r
+GL_EXT_texture3D\r
+GL_SGIS_texture_filter4\r
+GL_EXT_subtexture\r
+GL_EXT_copy_texture\r
+GL_EXT_histogram\r
+GL_EXT_convolution\r
+GL_SGI_color_matrix\r
+GL_SGI_color_table\r
+GL_SGIS_pixel_texture\r
+GL_SGIX_pixel_texture\r
+GL_SGIS_texture4D\r
+GL_SGI_texture_color_table\r
+GL_EXT_cmyka\r
+GL_EXT_texture_object\r
+GL_SGIS_detail_texture\r
+GL_SGIS_sharpen_texture\r
+GL_EXT_packed_pixels\r
+GL_SGIS_texture_lod\r
+GL_SGIS_multisample\r
+GL_EXT_rescale_normal\r
+GL_EXT_vertex_array\r
+GL_EXT_misc_attribute\r
+GL_SGIS_generate_mipmap\r
+GL_SGIX_clipmap\r
+GL_SGIX_shadow\r
+GL_SGIS_texture_edge_clamp\r
+GL_SGIS_texture_border_clamp\r
+GL_EXT_blend_minmax\r
+GL_EXT_blend_subtract\r
+GL_EXT_blend_logic_op\r
+GL_SGIX_interlace\r
+GL_SGIX_pixel_tiles\r
+GL_SGIS_texture_select\r
+GL_SGIX_sprite\r
+GL_SGIX_texture_multi_buffer\r
+GL_EXT_point_parameters\r
+GL_SGIS_point_parameters\r
+GL_SGIX_instruments\r
+GL_SGIX_texture_scale_bias\r
+GL_SGIX_framezoom\r
+GL_SGIX_tag_sample_buffer\r
+GL_FfdMaskSGIX\r
+GL_SGIX_polynomial_ffd\r
+GL_SGIX_reference_plane\r
+GL_SGIX_flush_raster\r
+GL_SGIX_depth_texture\r
+GL_SGIS_fog_function\r
+GL_SGIX_fog_offset\r
+GL_HP_image_transform\r
+GL_HP_convolution_border_modes\r
+GL_INGR_palette_buffer\r
+GL_SGIX_texture_add_env\r
+GL_EXT_color_subtable\r
+GL_PGI_vertex_hints\r
+GL_PGI_misc_hints\r
+GL_EXT_paletted_texture\r
+GL_EXT_clip_volume_hint\r
+GL_SGIX_list_priority\r
+GL_SGIX_ir_instrument1\r
+GL_SGIX_calligraphic_fragment\r
+GL_SGIX_texture_lod_bias\r
+GL_SGIX_shadow_ambient\r
+GL_EXT_index_texture\r
+GL_EXT_index_material\r
+GL_EXT_index_func\r
+GL_EXT_index_array_formats\r
+GL_EXT_compiled_vertex_array\r
+GL_EXT_cull_vertex\r
+GL_SGIX_ycrcb\r
+GL_SGIX_fragment_lighting\r
+GL_IBM_rasterpos_clip\r
+GL_HP_texture_lighting\r
+GL_EXT_draw_range_elements\r
+GL_WIN_phong_shading\r
+GL_WIN_specular_fog\r
+GL_EXT_light_texture\r
+GL_SGIX_blend_alpha_minmax\r
+GL_SGIX_impact_pixel_texture\r
+GL_EXT_bgra\r
+GL_SGIX_async\r
+GL_SGIX_async_pixel\r
+GL_SGIX_async_histogram\r
+GL_INTEL_texture_scissor\r
+GL_INTEL_parallel_arrays\r
+GL_HP_occlusion_test\r
+GL_EXT_pixel_transform\r
+GL_EXT_pixel_transform_color_table\r
+GL_EXT_shared_texture_palette\r
+GL_EXT_separate_specular_color\r
+GL_EXT_secondary_color\r
+GL_EXT_texture_perturb_normal\r
+GL_EXT_multi_draw_arrays\r
+GL_EXT_fog_coord\r
+GL_REND_screen_coordinates\r
+GL_EXT_coordinate_frame\r
+GL_EXT_texture_env_combine\r
+GL_APPLE_specular_vector\r
+GL_APPLE_transform_hint\r
+GL_SGIX_fog_scale\r
+GL_SUNX_constant_data\r
+GL_SUN_global_alpha\r
+GL_SUN_triangle_list\r
+GL_SUN_vertex\r
+GL_EXT_blend_func_separate\r
+GL_INGR_color_clamp\r
+GL_INGR_interlace_read\r
+GL_EXT_stencil_wrap\r
+GL_EXT_422_pixels\r
+GL_NV_texgen_reflection\r
+GL_EXT_texture_cube_map\r
+GL_SUN_convolution_border_modes\r
+GL_EXT_texture_env_add\r
+GL_EXT_texture_lod_bias\r
+GL_EXT_texture_filter_anisotropic\r
+GL_EXT_vertex_weighting\r
+GL_NV_light_max_exponent\r
+GL_NV_vertex_array_range\r
+GL_NV_register_combiners\r
+GL_NV_fog_distance\r
+GL_NV_texgen_emboss\r
+GL_NV_blend_square\r
+GL_NV_texture_env_combine4\r
+GL_MESA_resize_buffers\r
+GL_MESA_window_pos\r
+GL_EXT_texture_compression_s3tc\r
+GL_IBM_cull_vertex\r
+GL_IBM_multimode_draw_arrays\r
+GL_IBM_vertex_array_lists\r
+GL_SGIX_subsample\r
+GL_SGIX_ycrcb_subsample\r
+GL_SGIX_ycrcba\r
+GL_SGI_depth_pass_instrument\r
+GL_3DFX_texture_compression_FXT1\r
+GL_3DFX_multisample\r
+GL_3DFX_tbuffer\r
+GL_EXT_multisample\r
+GL_SGIX_vertex_preclip\r
+GL_SGIX_convolution_accuracy\r
+GL_SGIX_resample\r
+GL_SGIS_point_line_texgen\r
+GL_SGIS_texture_color_mask\r
+GL_EXT_texture_env_dot3\r
+GL_ATI_texture_mirror_once\r
+GL_NV_fence\r
+GL_IBM_texture_mirrored_repeat\r
+GL_NV_evaluators\r
+GL_NV_packed_depth_stencil\r
+GL_NV_register_combiners2\r
+GL_NV_texture_compression_vtc\r
+GL_NV_texture_rectangle\r
+GL_NV_texture_shader\r
+GL_NV_texture_shader2\r
+GL_NV_vertex_array_range2\r
+GL_NV_vertex_program\r
+GL_SGIX_texture_coordinate_clamp\r
+GL_SGIX_scalebias_hint\r
+GL_OML_interlace\r
+GL_OML_subsample\r
+GL_OML_resample\r
+GL_NV_copy_depth_to_color\r
+GL_ATI_envmap_bumpmap\r
+GL_ATI_fragment_shader\r
+GL_ATI_pn_triangles\r
+GL_ATI_vertex_array_object\r
+GL_EXT_vertex_shader\r
+GL_ATI_vertex_streams\r
+GL_ATI_element_array\r
+GL_SUN_mesh_array\r
+GL_SUN_slice_accum\r
+GL_NV_multisample_filter_hint\r
+GL_NV_depth_clamp\r
+GL_NV_occlusion_query\r
+GL_NV_point_sprite\r
+GL_NV_texture_shader3\r
+GL_NV_vertex_program1_1\r
+GL_EXT_shadow_funcs\r
+GL_EXT_stencil_two_side\r
+GL_ATI_text_fragment_shader\r
+GL_APPLE_client_storage\r
+GL_APPLE_element_array\r
+GL_APPLE_fence\r
+GL_APPLE_vertex_array_object\r
+GL_APPLE_vertex_array_range\r
+GL_APPLE_ycbcr_422\r
+GL_S3_s3tc\r
+GL_ATI_draw_buffers\r
+GL_ATI_pixel_format_float\r
+GL_ATI_texture_env_combine3\r
+GL_ATI_texture_float\r
+GL_NV_float_buffer\r
+GL_NV_fragment_program\r
+GL_NV_half_float\r
+GL_NV_pixel_data_range\r
+GL_NV_primitive_restart\r
+GL_NV_texture_expand_normal\r
+GL_NV_vertex_program2\r
+GL_ATI_map_object_buffer\r
+GL_ATI_separate_stencil\r
+GL_ATI_vertex_attrib_array_object\r
+GL_OES_read_format\r
+GL_EXT_depth_bounds_test\r
+GL_EXT_texture_mirror_clamp\r
+GL_EXT_blend_equation_separate\r
+GL_MESA_pack_invert\r
+GL_MESA_ycbcr_texture\r
+GL_EXT_pixel_buffer_object\r
+GL_NV_fragment_program_option\r
+GL_NV_fragment_program2\r
+GL_NV_vertex_program2_option\r
+GL_NV_vertex_program3\r
+GL_EXT_framebuffer_object\r
+GL_GREMEDY_string_marker\r
+GL_EXT_packed_depth_stencil\r
+GL_EXT_stencil_clear_tag\r
+GL_EXT_texture_sRGB\r
+GL_EXT_framebuffer_blit\r
+GL_EXT_framebuffer_multisample\r
+GL_MESAX_texture_stack\r
+GL_EXT_timer_query\r
+GL_EXT_gpu_program_parameters\r
+GL_APPLE_flush_buffer_range\r
+GL_EXT_gpu_shader4\r
+GL_EXT_draw_instanced\r
+GL_EXT_packed_float\r
+GL_EXT_texture_array\r
+GL_EXT_texture_buffer_object\r
+GL_EXT_texture_compression_latc\r
+GL_EXT_texture_compression_rgtc\r
+GL_EXT_texture_shared_exponent\r
+GL_NV_depth_buffer_float\r
+GL_NV_framebuffer_multisample_coverage\r
+GL_EXT_framebuffer_sRGB\r
+GL_NV_geometry_shader4\r
+GL_NV_parameter_buffer_object\r
+GL_EXT_draw_buffers2\r
+GL_NV_transform_feedback\r
+GL_EXT_bindable_uniform\r
+GL_EXT_texture_integer\r
+GL_GREMEDY_frame_terminator\r
+GL_NV_conditional_render\r
+GL_NV_present_video\r
+GL_EXT_transform_feedback\r
+GL_EXT_direct_state_access\r
+GL_EXT_vertex_array_bgra\r
+GL_EXT_texture_swizzle\r
+GL_NV_explicit_multisample\r
+GL_NV_transform_feedback2\r
+GL_SGIX_texture_select\r
+GL_INGR_blend_func_separate\r
+GL_SGIX_depth_pass_instrument\r
+GL_SGIX_igloo_interface\r
+GL_EXT_fragment_lighting\r
+GL_EXT_geometry_shader4\r
+GL_EXT_scene_marker\r
+GL_EXT_texture_compression_dxt1\r
+GL_EXT_texture_env\r
+GL_IBM_static_data\r
+GL_NV_gpu_program4\r
+GL_OES_byte_coordinates\r
+GL_OES_compressed_paletted_texture\r
+GL_OES_single_precision\r
+GL_SGIX_pixel_texture_bits\r
+GL_SGIX_texture_range\r
+\r
+WGL Extensions\r
+------------------\r
+\r
+WGL_ARB_buffer_region\r
+WGL_ARB_multisample\r
+WGL_ARB_extensions_string\r
+WGL_ARB_pixel_format\r
+WGL_ARB_make_current_read\r
+WGL_ARB_pbuffer\r
+WGL_ARB_render_texture\r
+WGL_ARB_pixel_format_float\r
+WGL_ARB_create_context\r
+WGL_EXT_make_current_read\r
+WGL_EXT_pixel_format\r
+WGL_EXT_pbuffer\r
+WGL_EXT_depth_float\r
+WGL_3DFX_multisample\r
+WGL_EXT_multisample\r
+WGL_I3D_digital_video_control\r
+WGL_I3D_gamma\r
+WGL_I3D_genlock\r
+WGL_I3D_image_buffer\r
+WGL_I3D_swap_frame_lock\r
+WGL_NV_render_depth_texture\r
+WGL_NV_render_texture_rectangle\r
+WGL_ATI_pixel_format_float\r
+WGL_NV_float_buffer\r
+WGL_3DL_stereo_control\r
+WGL_EXT_pixel_format_packed_float\r
+WGL_EXT_framebuffer_sRGB\r
+WGL_NV_present_video\r
+WGL_NV_swap_group\r
+WGL_NV_gpu_affinity\r
+WGL_EXT_display_color_table\r
+WGL_EXT_extensions_string\r
+WGL_EXT_swap_control\r
+WGL_NV_vertex_array_range\r
+WGL_OML_sync_control\r
+WGL_I3D_swap_frame_usage\r
+WGL_NV_video_output\r
+\r
+GLX Extensions\r
+------------------\r
+\r
+GLX_VERSION_1_3\r
+GLX_VERSION_1_4\r
+GLX_ARB_multisample\r
+GLX_ARB_fbconfig_float\r
+GLX_ARB_create_context\r
+GLX_SGIS_multisample\r
+GLX_EXT_visual_info\r
+GLX_SGI_swap_control\r
+GLX_SGI_video_sync\r
+GLX_SGI_make_current_read\r
+GLX_EXT_visual_rating\r
+GLX_EXT_import_context\r
+GLX_SGIX_fbconfig\r
+GLX_SGIX_pbuffer\r
+GLX_SGI_cushion\r
+GLX_SGIX_video_resize\r
+GLX_SGIX_swap_group\r
+GLX_SGIX_swap_barrier\r
+GLX_SGIS_blended_overlay\r
+GLX_SGIS_shared_multisample\r
+GLX_SUN_get_transparent_index\r
+GLX_3DFX_multisample\r
+GLX_MESA_copy_sub_buffer\r
+GLX_MESA_pixmap_colormap\r
+GLX_MESA_release_buffers\r
+GLX_MESA_set_3dfx_mode\r
+GLX_SGIX_visual_select_group\r
+GLX_OML_swap_method\r
+GLX_OML_sync_control\r
+GLX_NV_float_buffer\r
+GLX_SGIX_hyperpipe\r
+GLX_MESA_agp_offset\r
+GLX_EXT_fbconfig_packed_float\r
+GLX_EXT_framebuffer_sRGB\r
+GLX_EXT_texture_from_pixmap\r
+GLX_NV_present_video\r
+GLX_NV_video_out\r
+GLX_NV_swap_group\r
+GLX_EXT_scene_marker\r
+GLX_NV_video_output\r
diff --git a/GLee5_4/readme.txt b/GLee5_4/readme.txt
new file mode 100644 (file)
index 0000000..72dd82f
--- /dev/null
@@ -0,0 +1,380 @@
+GLee\r
+GL Easy Extension Library\r
+Version 5.4\r
+\r
+By Ben Woodhouse\r
+http://elf-stone.com\r
+\r
+\r
+LICENSE\r
+\r
+Copyright (c)2009  Ben Woodhouse  All rights reserved.\r
+\r
+Redistribution and use in source and binary forms, with or without\r
+modification, are permitted provided that the following conditions are \r
+met:\r
+1. Redistributions of source code must retain the above copyright\r
+notice, this list of conditions and the following disclaimer as\r
+the first lines of this file unmodified.\r
+2. Redistributions in binary form must reproduce the above copyright\r
+notice, this list of conditions and the following disclaimer in the\r
+documentation and/or other materials provided with the distribution.\r
+\r
+THIS SOFTWARE IS PROVIDED BY BEN WOODHOUSE ``AS IS'' AND ANY EXPRESS OR\r
+IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\r
+OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
+IN NO EVENT SHALL BEN WOODHOUSE BE LIABLE FOR ANY DIRECT, INDIRECT,\r
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\r
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\r
+THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+\r
+\r
+\r
+CONTACT\r
+\r
+Send any general questions, bug reports etc to me (Ben Woodhouse):\r
+  bw [at] elf-stone.com\r
+\r
+Questions about the D port for GLee should go to Joel Anderson: \r
+  anderson [at] badmama.com.au\r
+  \r
+Questions about GLee on OS X should go to Tristam MacDonald\r
+  swiftcoder [at] gmail.com\r
+  \r
+\r
+\r
+INTRODUCTION\r
+\r
+GLee provides a simple interface for using extensions and core OpenGL \r
+functionality beyond OpenGL version 1.1, and automates the otherwise tedious \r
+process of linking function pointers. GLee works with both C and C++ \r
+compilers.\r
+\r
+Because the code is automatically generated, the latest extensions can \r
+be included rapidly in new versions. Currently there is support \r
+for OpenGL up to 3.0 and almost all registered extensions. For a complete \r
+list of extensions, please see the accompanying extensionList.txt file. \r
+\r
+For extension specifications, please visit: \r
+\r
+   http://www.opengl.org/registry/\r
+\r
+\r
+CREDITS\r
+\r
+Tristam MacDonald for adding OS-X compatibility.\r
+\r
+Martin Büchler (LousyPhreak on the GameDev.net forums) for \r
+a huge amount of testing, tweaking, suggestions and advice to get GLee to \r
+work properly with Linux. \r
+\r
+Daniel Jo (Ostsol on the OpenGL.org forums) for helping to get  \r
+GLEE 2.1 working with the OGLSL extensions (ARB_shader_objects, \r
+ARB_vertex_shader and ARB_fragment_shader). \r
+\r
+Joel Anderson for his for his D port of GLee 3.0\r
+\r
+Jacques Beaurain for pointing out a potential access violation in \r
+__GLeeGetExtensions. \r
+\r
+\r
+WHAT'S NEW IN GLEE 5.0\r
+\r
+GLeeGen, the program that generates the code for the GLee library, has been\r
+rewritten to support parsing of extension specifications. As a result, GLee 5.0 and upwards support \r
+all extensions for which there is a specification, regardless of that \r
+extension's inclusion in glext.h, wglext.h or glxext.h. \r
+\r
+GLee 5.0 adds support for forced extension loading through the \r
+GLeeForceLink function. This makes it possible to force the linking of \r
+extension functions (or core functions) which are not reported by the video driver. \r
+\r
+GLee now supports lazy loading of extensions, meaning it is no longer \r
+necessary to call GLeeInit() at initialisation time. \r
+\r
+\r
+\r
+HOW TO INSTALL \r
+\r
+MSVC 2003 binary version\r
+\r
+  1. Copy GLee.lib to your visual C++ lib directory \r
+  (eg C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\PlatformSDK\Lib)\r
+\r
+  2. Copy GLee.h to your visual C++ include\GL directory \r
+  (eg C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\PlatformSDK\include\gl)\r
+  \r
+\r
+Linux binary version (GLee-*-bin.tar.gz)\r
+  (Installation has to be done as root)\r
+\r
+  1. unpack GLee-*-bin.tar.gz\r
+  (tar -xzf GLee-2.0-bin.tar.gz)\r
+\r
+  2. Install with the inst script\r
+  (cd glee && ./inst)\r
+\r
+Linux source version (GLee-*-src.tar.gz)\r
+  1. unpack GLee-*-src.tar.gz\r
+  (tar -xzf GLee-2.0-src.tar.gz)\r
+\r
+  2. cd to "glee" and run the gnu build chain\r
+  (cd glee && ./configure && make)\r
+\r
+  3. Become root (password needed)\r
+  (su)\r
+\r
+  4. Install the lib\r
+  (make install)\r
+  \r
+\r
+\r
+HOW TO USE\r
+\r
+If you're using the binary version then you'll need to link to \r
+glee.lib and #include <gl\glee.h> in your project. Otherwise, \r
+just add glee.h and glee.c in your project and #include "glee.h".\r
+You can also build the library yourself using glee.c and glee.h. \r
+\r
+From this point onwards, you should have access to all OpenGL \r
+extensions and core functionality. \r
+\r
+You can query the availability of an extension like this:\r
+\r
+if (GLEE_ARB_point_parameters)\r
+{\r
+   //GL_ARB_point_parameters is supported\r
+   glPointParameterfARB(...);\r
+}\r
+\r
+WGL extensions have a GLEE_WGL_ prefix. For example, \r
+GLEE_WGL_ARB_pbuffer. GLX extensions work in a similar way. \r
+\r
+You can also query the OpenGL version:\r
+if (GLEE_VERSION_1_3)\r
+{\r
+  //OpenGL 1.3 is supported \r
+  glLoadTransposeMatrixf(...) ; \r
+  ...\r
+}\r
+\r
+\r
+\r
+ERROR CHECKING\r
+\r
+Optionally, you can add a call to GLeeInit() after your OpenGL \r
+initialisation code, however this is no longer required as of \r
+GLee 5.0. GLeeInit returns a boolean value to indicate success\r
+or failure. \r
+\r
+If GLeeInit returns false you can get more detailed error \r
+information by calling GLeeGetErrorString(). This returns a pointer \r
+to a string which contains error description(s). \r
+\r
+At any time you can call GLeeGetExtStrGL() or GLeeGetExtStrWGL() \r
+(win32) or GLeeGetExtStrGLX() (linux) to retrieve a pointer to the \r
+corresponding extension list string.  \r
+\r
+\r
+\r
+FORCED EXTENSION SUPPORT\r
+\r
+By default, only those extensions reported by OpenGL's \r
+glGetString(GL_EXTENSIONS) are loaded by GLeeInit(). Likewise, \r
+only core functions whose version doesn't exceed the version number \r
+returned by glGetString(GL_VERSION) are loaded.\r
+\r
+However, GLee 5.0 and above can load additional extension and core \r
+functions using the GLeeForceLink function:\r
+\r
+       GLint GLeeForceLink(const char * extensionName)\r
+\r
+For example, GLeeForceLink("GL_ARB_point_parameters") will attempt to \r
+load the ARB_point_parameters function. \r
+\r
+For core functions, you can use the GL version string for the version \r
+you wish to initialise. For example, GLeeForceLink( "GL_VERSION_2_0" ) \r
+will attempt to initialise OpenGL 2.0 core functions. \r
+       \r
+Return Value:\r
+  GLEE_LINK_COMPLETE is returned if all functions were \r
+  successfully linked.\r
+\r
+  GLEE_LINK_PARTIAL is returned if only some functions were \r
+  linked successfully.\r
+  \r
+  GLEE_LINK_FAIL is returned if no functions could be linked\r
+  successfully. \r
+  \r
+Functions which could not be linked will be set to NULL. \r
+\r
+A successful link does not guarantee that a function will work \r
+correctly. If you want to be safe, only use extensions which are\r
+reported by the driver. \r
+\r
+\r
+\r
+LINUX NOTES - by LousyPhreak\r
+\r
+The binary version was compiled with gcc 3.3 and was also tested \r
+with gcc 3.2, but if you still have gcc 2.x you need the source \r
+version. If you don't know which version you have on your system just \r
+look at the output of 'gcc --version'.\r
+\r
+You should be using the NVIDIA headers if you have the NVIDIA drivers\r
+installed, and the MESA headers otherwise.\r
+\r
+One more note:\r
+The binary version might complain about missing glXGetProcAddressARB\r
+on the linker stage, but if you get this error, use the source \r
+version and email me (lousyphreak [at] gmx.at).\r
+\r
+Compiling on linux:\r
+You just need to replace the linking of libGL by libGLee:\r
+gcc main.cpp whatever.cpp -lGLee -o myproject\r
+\r
+Everything else should be the same as on windows.\r
+\r
+\r
+\r
+NOTES ON THE GLEE 3.0 D PORT FOR WIN32 - by Joel Anderson\r
+\r
+1) Put the GLee.lib in the lib folder (ie C:\dmd\lib)\r
+2) Put glee.d and glConstants.d in the include folder (ie create c:\glee \r
+and use the -IC:\glee on the compiler.) \r
+3) The D code is pretty much the same as the C code but you need to specify:\r
+\r
+import glee; //Instead of #include "glee.h"\r
+\r
+Notes\r
+- The GLee.lib was built using dmc.  I did try the one that comes with the \r
+C version, but that doesn't work with D. You can compile the lib yourself \r
+using cbuild\go.bat\r
+- I haven't tested everything.\r
+\r
+You can contact me (Joel Anderson) at anderson@badmama.com.au\r
+\r
+(21/01/2004) - AU\r
+\r
+\r
+CHANGES\r
+\r
+5.4   : Added 5 new extensions : \r
+            GL_EXT_texture_swizzle\r
+            GL_NV_explicit_multisample\r
+            GL_NV_transform_feedback2\r
+            WGL_NV_gpu_affinity\r
+            GLX_ARB_create_context\r
+            \r
+        Removed some duplicate extensions:\r
+            GL_NV_geometry_program4 (use GL_NV_gpu_program4)\r
+            GL_NV_vertex_program4   (use GL_NV_gpu_program4)\r
+            GL_NV_fragment_program4 (use GL_NV_gpu_program4)\r
+            WGL_NV_video_out        (use WGL_NV_video_output)\r
+            \r
+        Fixed GL_NV_gpu_program4 by merging with GL_NV_geometry_program4, \r
+        GL_NV_vertex_program4 and GL_NV_fragment_program4. \r
+        \r
+        Added support for multiple extensions including the same functions, so \r
+        GL_EXT_geometry_shader4 and GL_NV_geometry_program4 can coexist without\r
+        compile errors.  \r
+          \r
+        Fixed GL_EXT_geometry_shader4 so it no longer has missing functions and constants. \r
+        These were excluded previously to avoid clashes with GL_NV_vertex_program4, which \r
+        included a bunch of functions with the same names.\r
+        \r
+        Various GLeeGen/GLeeXMLGen fixes, mainly to fix issues with NVidia extensions, most\r
+        notably:        \r
+          Added support for overriding extension spec files so we can manually fix \r
+          buggy specs which don't follow the standard (like GL_NV_gpu_program4).\r
+            \r
+\r
+Reworked GLeeGen and GLeeXMLGen to allow overriding of \r
+\r
+5.33  : Fixed some GCC warnings \r
+        Fixed some OS-X warnings\r
+        Fixed an issue in __GLeeGetExtensions which could cause two\r
+          extensions to go missing on some platforms\r
+\r
+5.32  : Fixed a potential access violation in __GLeeGetExtensions\r
+\r
+5.31  : Fixed GLX compile error\r
+\r
+5.3   : OpenGL 3.0 support\r
+\r
+5.21  : Nvidia geometry shader extensions \r
+\r
+5.2   : OS-X support\r
+\r
+5.1   : Fixed some ansi-C compatibility issues. \r
+               New GLeeGen version\r
+               Added 5 new GL extensions and 1 new WGL extension. \r
+\r
+5.04  : Added the latest extensions\r
+\r
+5.03  : Some minor compatibility fixes. \r
+\r
+               Malloc.h no longer used. \r
+               \r
+               GLee no longer fails if platform-specific (GLX or WGL) extensions \r
+               could not be loaded (a problem with some cards apparently).\r
+\r
+5.02  : Changed extension querying variable system. Removed GLEE_ENABLED() \r
+        extension checking macro introduced in 5.00, since it is no longer \r
+        needed\r
+\r
+5.01  : Fixed GLX_SGIX_HYPERPIPE bug\r
+\r
+5.00  : Rewrote GLeeGen to parse extension specs\r
+        \r
+        Added lazy loading for extensions\r
+        \r
+        Added experimental support\r
+\r
+4.00  : Updated using extensions from glext.h version 26, wglext.h version 6, \r
+        and glxext.h version 10. OpenGL 2.0 is now supported. \r
+\r
+3.05  : Updated with glExt.h version 23 extensions. \r
+\r
+3.04  : Updated with glExt.h version 22 extensions. \r
+\r
+3.03  : Another linux compatibility bug fixed\r
+\r
+3.02  : GLX typedef bug fixed\r
+\r
+3.01  : Minor linux compatibility bugs fixed\r
+\r
+3.0   : Removed STL and other C++ specific features to make GLee \r
+        compatible with C compilers \r
+        \r
+        Added a number of WGL extensions that had previously been\r
+        excluded due to a bug with GLeeGen (now fixed)\r
+\r
+2.21  : Fixed VC6 compilation bug\r
+\r
+2.2   : Added full OpenGL 1.5 support\r
+\r
+2.1   : Added the OpenGL shading language extensions: \r
+        ARB_shader_objects, ARB_vertex_shader and ARB_fragment_shader. \r
+               \r
+2.01  : Fixed missing description comment in header\r
+        Fixed include guard\r
+\r
+2.0   : Removed dependency on glext.h and wglext.h\r
+        Added cross-platform code for support with linux      \r
+        Fixed potential stability problems \r
+\r
+1.2   : Made library compatible with VC7 and VC7.1\r
+\r
+1.12  : Cleaned up some commenting errors in GLeeGen\r
+\r
+1.11  : Added functions to get WGL and GL extension strings.\r
+        Fixed minor formatting errors caused by a bug in GLeeGen (now fixed)\r
+\r
+1.1   : Added detailed error checking. \r
+        Fixed possible buffer overrun issue \r
+\r
+1.01  : GLeeInit no longer requires a device context handle.
\ No newline at end of file
diff --git a/WTL80/CPL.TXT b/WTL80/CPL.TXT
new file mode 100644 (file)
index 0000000..e887791
--- /dev/null
@@ -0,0 +1,94 @@
+Common Public License Version 1.0\r
+\r
+THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.\r
+\r
+\r
+1. DEFINITIONS \r
+\r
+"Contribution" means:\r
+\r
+a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and \r
+\r
+b) in the case of each subsequent Contributor:\r
+\r
+i) changes to the Program, and\r
+\r
+ii) additions to the Program;\r
+\r
+where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program.\r
+\r
+"Contributor" means any person or entity that distributes the Program. \r
+\r
+"Licensed Patents " mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program.\r
+\r
+"Program" means the Contributions distributed in accordance with this Agreement. \r
+\r
+"Recipient" means anyone who receives the Program under this Agreement, including all Contributors. \r
+\r
+\r
+2. GRANT OF RIGHTS\r
+\r
+a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form.\r
+\r
+b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder.\r
+\r
+c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program.\r
+\r
+d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement.\r
+\r
+\r
+3. REQUIREMENTS \r
+\r
+A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that: \r
+\r
+a) it complies with the terms and conditions of this Agreement; and\r
+\r
+b) its license agreement:\r
+\r
+i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose; \r
+\r
+ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits; \r
+\r
+iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and \r
+\r
+iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange. \r
+\r
+When the Program is made available in source code form:\r
+\r
+a) it must be made available under this Agreement; and\r
+\r
+b) a copy of this Agreement must be included with each copy of the Program. \r
+\r
+Contributors may not remove or alter any copyright notices contained within the Program.\r
+\r
+Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution. \r
+\r
+\r
+4. COMMERCIAL DISTRIBUTION \r
+\r
+Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense. \r
+\r
+For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages. \r
+\r
+\r
+5. NO WARRANTY\r
+\r
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations. \r
+\r
+\r
+6. DISCLAIMER OF LIABILITY \r
+\r
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. \r
+\r
+\r
+7. GENERAL\r
+\r
+If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. \r
+\r
+If Recipient institutes patent litigation against a Contributor with respect to a patent applicable to software (including a cross-claim or counterclaim in a lawsuit), then any patent licenses granted by that Contributor to such Recipient under this Agreement shall terminate as of the date such litigation is filed. In addition, if Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed.\r
+\r
+All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive. \r
+\r
+Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. IBM is the initial Agreement Steward. IBM may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved. \r
+\r
+This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation.\r
diff --git a/WTL80/include/atlapp.h b/WTL80/include/atlapp.h
new file mode 100644 (file)
index 0000000..b62e097
--- /dev/null
@@ -0,0 +1,1688 @@
+// Windows Template Library - WTL version 8.0\r
+// Copyright (C) Microsoft Corporation. All rights reserved.\r
+//\r
+// This file is a part of the Windows Template Library.\r
+// The use and distribution terms for this software are covered by the\r
+// Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php)\r
+// which can be found in the file CPL.TXT at the root of this distribution.\r
+// By using this software in any fashion, you are agreeing to be bound by\r
+// the terms of this license. You must not remove this notice, or\r
+// any other, from this software.\r
+\r
+#ifndef __ATLAPP_H__\r
+#define __ATLAPP_H__\r
+\r
+#pragma once\r
+\r
+#ifndef __cplusplus\r
+       #error ATL requires C++ compilation (use a .cpp suffix)\r
+#endif\r
+\r
+#ifndef __ATLBASE_H__\r
+       #error atlapp.h requires atlbase.h to be included first\r
+#endif\r
+\r
+#ifndef _WIN32_WCE\r
+  #if (WINVER < 0x0400)\r
+       #error WTL requires Windows version 4.0 or higher\r
+  #endif\r
+\r
+  #if (_WIN32_IE < 0x0300)\r
+       #error WTL requires IE version 3.0 or higher\r
+  #endif\r
+#endif\r
+\r
+#ifdef _ATL_NO_COMMODULE\r
+       #error WTL requires that _ATL_NO_COMMODULE is not defined\r
+#endif // _ATL_NO_COMMODULE\r
+\r
+#if defined(_WIN32_WCE) && defined(_ATL_MIN_CRT)\r
+       #pragma message("Warning: WTL for Windows CE doesn't use _ATL_MIN_CRT")\r
+#endif // defined(_WIN32_WCE) && defined(_ATL_MIN_CRT)\r
+\r
+#include <limits.h>\r
+#if !defined(_ATL_MIN_CRT) && defined(_MT) && !defined(_WIN32_WCE)\r
+  #include <process.h> // for _beginthreadex\r
+#endif\r
+\r
+#if (_ATL_VER < 0x0800) && !defined(_DEBUG)\r
+  #include <stdio.h>\r
+#endif\r
+\r
+#include <commctrl.h>\r
+#ifndef _WIN32_WCE\r
+#pragma comment(lib, "comctl32.lib")\r
+#endif // !_WIN32_WCE\r
+\r
+#ifndef _WIN32_WCE\r
+  #include "atlres.h"\r
+#else // CE specific\r
+  #include "atlresce.h"\r
+#endif // _WIN32_WCE\r
+\r
+// We need to disable this warning because of template class arguments\r
+#pragma warning(disable: 4127)\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// WTL version number\r
+\r
+#define _WTL_VER       0x0800\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Classes in this file:\r
+//\r
+// CMessageFilter\r
+// CIdleHandler\r
+// CMessageLoop\r
+//\r
+// CAppModule\r
+// CServerAppModule\r
+//\r
+// Global functions:\r
+//   AtlGetDefaultGuiFont()\r
+//   AtlCreateBoldFont()\r
+//   AtlInitCommonControls()\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Global support for Windows CE\r
+\r
+#ifdef _WIN32_WCE\r
+\r
+#ifndef SW_SHOWDEFAULT\r
+  #define SW_SHOWDEFAULT       SW_SHOWNORMAL\r
+#endif // !SW_SHOWDEFAULT\r
+\r
+// These get's OR-ed in a constant and will have no effect.\r
+// Defining them reduces the number of #ifdefs required for CE.\r
+#define LR_DEFAULTSIZE      0\r
+#define LR_LOADFROMFILE     0\r
+\r
+#ifndef SM_CXCURSOR\r
+  #define SM_CXCURSOR             13\r
+#endif\r
+#ifndef SM_CYCURSOR\r
+  #define SM_CYCURSOR             14\r
+#endif\r
+\r
+inline BOOL IsMenu(HMENU hMenu)\r
+{\r
+       MENUITEMINFO mii = { sizeof(MENUITEMINFO) };\r
+       ::SetLastError(0);\r
+       BOOL bRet = ::GetMenuItemInfo(hMenu, 0, TRUE, &mii);\r
+       if(!bRet)\r
+               bRet = (::GetLastError() != ERROR_INVALID_MENU_HANDLE) ? TRUE : FALSE;\r
+       return bRet;\r
+}\r
+\r
+#if (_WIN32_WCE >= 410)\r
+extern "C" void WINAPI ListView_SetItemSpacing(HWND hwndLV, int iHeight);\r
+#endif // (_WIN32_WCE >= 410)\r
+\r
+inline int MulDiv(IN int nNumber, IN int nNumerator, IN int nDenominator)\r
+{\r
+       __int64 multiple = nNumber * nNumerator;\r
+       return static_cast<int>(multiple / nDenominator);\r
+}\r
+\r
+#if (_ATL_VER >= 0x0800)\r
+\r
+#ifndef _WTL_KEEP_WS_OVERLAPPEDWINDOW\r
+  #ifdef WS_OVERLAPPEDWINDOW\r
+    #undef WS_OVERLAPPEDWINDOW\r
+    #define WS_OVERLAPPEDWINDOW        0\r
+  #endif // WS_OVERLAPPEDWINDOW\r
+#endif // !_WTL_KEEP_WS_OVERLAPPEDWINDOW\r
+\r
+#ifndef RDW_FRAME\r
+  #define RDW_FRAME    0\r
+#endif // !RDW_FRAME\r
+\r
+#ifndef WM_WINDOWPOSCHANGING\r
+  #define WM_WINDOWPOSCHANGING 0\r
+#endif // !WM_WINDOWPOSCHANGING\r
+\r
+#define FreeResource(x)\r
+#define UnlockResource(x)\r
+\r
+namespace ATL\r
+{\r
+  inline HRESULT CComModule::RegisterClassObjects(DWORD /*dwClsContext*/, DWORD /*dwFlags*/) throw()\r
+  { return E_NOTIMPL; }\r
+  inline HRESULT CComModule::RevokeClassObjects() throw()\r
+  { return E_NOTIMPL; }\r
+}; // namespace ATL\r
+\r
+#ifndef lstrlenW\r
+  #define lstrlenW     (int)ATL::lstrlenW\r
+#endif // lstrlenW\r
+\r
+inline int WINAPI lstrlenA(LPCSTR lpszString)\r
+{ return ATL::lstrlenA(lpszString); }\r
+\r
+#ifdef lstrcpyn\r
+  #undef lstrcpyn\r
+  #define lstrcpyn     ATL::lstrcpynW\r
+#endif // lstrcpyn\r
+\r
+#ifndef SetWindowLongPtrW\r
+  inline LONG_PTR tmp_SetWindowLongPtrW( HWND hWnd, int nIndex, LONG_PTR dwNewLong )\r
+  {\r
+       return( ::SetWindowLongW( hWnd, nIndex, LONG( dwNewLong ) ) );\r
+  }\r
+  #define SetWindowLongPtrW tmp_SetWindowLongPtrW\r
+#endif\r
+\r
+#ifndef GetWindowLongPtrW\r
+  inline LONG_PTR tmp_GetWindowLongPtrW( HWND hWnd, int nIndex )\r
+  {\r
+       return( ::GetWindowLongW( hWnd, nIndex ) );\r
+  }\r
+  #define GetWindowLongPtrW tmp_GetWindowLongPtrW\r
+#endif\r
+\r
+#ifndef LongToPtr\r
+  #define LongToPtr(x) ((void*)x)\r
+#endif\r
+\r
+#ifndef PtrToInt\r
+  #define PtrToInt( p ) ((INT)(INT_PTR) (p) )\r
+#endif\r
+\r
+#else // !(_ATL_VER >= 0x0800)\r
+\r
+#ifdef lstrlenW\r
+  #undef lstrlenW\r
+  #define lstrlenW (int)::wcslen\r
+#endif // lstrlenW\r
+\r
+#define lstrlenA (int)strlen\r
+\r
+#ifndef lstrcpyn\r
+  inline LPTSTR lstrcpyn(LPTSTR lpstrDest, LPCTSTR lpstrSrc, int nLength)\r
+  {\r
+       if(lpstrDest == NULL || lpstrSrc == NULL || nLength <= 0)\r
+               return NULL;\r
+       int nLen = min(lstrlen(lpstrSrc), nLength - 1);\r
+       LPTSTR lpstrRet = (LPTSTR)memcpy(lpstrDest, lpstrSrc, nLen * sizeof(TCHAR));\r
+       lpstrDest[nLen] = 0;\r
+       return lpstrRet;\r
+  }\r
+#endif // !lstrcpyn\r
+\r
+#ifndef lstrcpynW\r
+  inline LPWSTR lstrcpynW(LPWSTR lpstrDest, LPCWSTR lpstrSrc, int nLength)\r
+  {\r
+       return lstrcpyn(lpstrDest, lpstrSrc, nLength);   // WinCE is Unicode only\r
+  }\r
+#endif // !lstrcpynW\r
+\r
+#ifndef lstrcpynA\r
+  inline LPSTR lstrcpynA(LPSTR lpstrDest, LPCSTR lpstrSrc, int nLength)\r
+  {\r
+       if(lpstrDest == NULL || lpstrSrc == NULL || nLength <= 0)\r
+               return NULL;\r
+       int nLen = min(lstrlenA(lpstrSrc), nLength - 1);\r
+       LPSTR lpstrRet = (LPSTR)memcpy(lpstrDest, lpstrSrc, nLen * sizeof(char));\r
+       lpstrDest[nLen] = 0;\r
+       return lpstrRet;\r
+  }\r
+#endif // !lstrcpyn\r
+\r
+#ifdef TrackPopupMenu\r
+  #undef TrackPopupMenu\r
+#endif // TrackPopupMenu\r
+\r
+#define DECLARE_WND_CLASS_EX(WndClassName, style, bkgnd) \\r
+static CWndClassInfo& GetWndClassInfo() \\r
+{ \\r
+       static CWndClassInfo wc = \\r
+       { \\r
+               { style, StartWindowProc, \\r
+                 0, 0, NULL, NULL, NULL, (HBRUSH)(bkgnd + 1), NULL, WndClassName }, \\r
+               NULL, NULL, IDC_ARROW, TRUE, 0, _T("") \\r
+       }; \\r
+       return wc; \\r
+}\r
+\r
+#ifndef _MAX_FNAME\r
+  #define _MAX_FNAME   _MAX_PATH\r
+#endif // _MAX_FNAME\r
+\r
+#if (_WIN32_WCE < 400)\r
+  #define MAKEINTATOM(i)  (LPTSTR)((ULONG_PTR)((WORD)(i)))\r
+#endif // (_WIN32_WCE < 400)\r
+\r
+#if (_WIN32_WCE < 410)\r
+  #define WHEEL_PAGESCROLL                (UINT_MAX)\r
+  #define WHEEL_DELTA                     120\r
+#endif // (_WIN32_WCE < 410)\r
+\r
+#ifdef DrawIcon\r
+  #undef DrawIcon\r
+#endif\r
+\r
+#ifndef VARCMP_LT\r
+  #define VARCMP_LT   0\r
+#endif\r
+#ifndef VARCMP_EQ\r
+  #define VARCMP_EQ   1\r
+#endif\r
+#ifndef VARCMP_GT\r
+  #define VARCMP_GT   2\r
+#endif\r
+#ifndef VARCMP_NULL\r
+  #define VARCMP_NULL 3\r
+#endif\r
+\r
+#ifndef RDW_ALLCHILDREN\r
+  #define RDW_ALLCHILDREN   0\r
+#endif\r
+\r
+#endif // !(_ATL_VER >= 0x0800)\r
+\r
+#endif // _WIN32_WCE\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Global support for using original VC++ 6.0 headers with WTL\r
+\r
+#ifndef _ATL_NO_OLD_HEADERS_WIN64\r
+#if !defined(_WIN64) && (_ATL_VER < 0x0700)\r
+\r
+  #ifndef PSM_INSERTPAGE\r
+    #define PSM_INSERTPAGE          (WM_USER + 119)\r
+  #endif // !PSM_INSERTPAGE\r
+\r
+  #ifndef GetClassLongPtr\r
+    #define GetClassLongPtrA   GetClassLongA\r
+    #define GetClassLongPtrW   GetClassLongW\r
+    #ifdef UNICODE\r
+      #define GetClassLongPtr  GetClassLongPtrW\r
+    #else\r
+      #define GetClassLongPtr  GetClassLongPtrA\r
+    #endif // !UNICODE\r
+  #endif // !GetClassLongPtr\r
+\r
+  #ifndef GCLP_HICONSM\r
+    #define GCLP_HICONSM        (-34)\r
+  #endif // !GCLP_HICONSM\r
+\r
+  #ifndef GetWindowLongPtr\r
+    #define GetWindowLongPtrA   GetWindowLongA\r
+    #define GetWindowLongPtrW   GetWindowLongW\r
+    #ifdef UNICODE\r
+      #define GetWindowLongPtr  GetWindowLongPtrW\r
+    #else\r
+      #define GetWindowLongPtr  GetWindowLongPtrA\r
+    #endif // !UNICODE\r
+  #endif // !GetWindowLongPtr\r
+\r
+  #ifndef SetWindowLongPtr\r
+    #define SetWindowLongPtrA   SetWindowLongA\r
+    #define SetWindowLongPtrW   SetWindowLongW\r
+    #ifdef UNICODE\r
+      #define SetWindowLongPtr  SetWindowLongPtrW\r
+    #else\r
+      #define SetWindowLongPtr  SetWindowLongPtrA\r
+    #endif // !UNICODE\r
+  #endif // !SetWindowLongPtr\r
+\r
+  #ifndef GWLP_WNDPROC\r
+    #define GWLP_WNDPROC        (-4)\r
+  #endif\r
+  #ifndef GWLP_HINSTANCE\r
+    #define GWLP_HINSTANCE      (-6)\r
+  #endif\r
+  #ifndef GWLP_HWNDPARENT\r
+    #define GWLP_HWNDPARENT     (-8)\r
+  #endif\r
+  #ifndef GWLP_USERDATA\r
+    #define GWLP_USERDATA       (-21)\r
+  #endif\r
+  #ifndef GWLP_ID\r
+    #define GWLP_ID             (-12)\r
+  #endif\r
+\r
+  #ifndef DWLP_MSGRESULT\r
+    #define DWLP_MSGRESULT  0\r
+  #endif\r
+\r
+  typedef long LONG_PTR;\r
+  typedef unsigned long ULONG_PTR;\r
+  typedef ULONG_PTR DWORD_PTR;\r
+\r
+  #ifndef HandleToUlong\r
+    #define HandleToUlong( h ) ((ULONG)(ULONG_PTR)(h) )\r
+  #endif\r
+  #ifndef HandleToLong\r
+    #define HandleToLong( h ) ((LONG)(LONG_PTR) (h) )\r
+  #endif\r
+  #ifndef LongToHandle\r
+    #define LongToHandle( h) ((HANDLE)(LONG_PTR) (h))\r
+  #endif\r
+  #ifndef PtrToUlong\r
+    #define PtrToUlong( p ) ((ULONG)(ULONG_PTR) (p) )\r
+  #endif\r
+  #ifndef PtrToLong\r
+    #define PtrToLong( p ) ((LONG)(LONG_PTR) (p) )\r
+  #endif\r
+  #ifndef PtrToUint\r
+    #define PtrToUint( p ) ((UINT)(UINT_PTR) (p) )\r
+  #endif\r
+  #ifndef PtrToInt\r
+    #define PtrToInt( p ) ((INT)(INT_PTR) (p) )\r
+  #endif\r
+  #ifndef PtrToUshort\r
+    #define PtrToUshort( p ) ((unsigned short)(ULONG_PTR)(p) )\r
+  #endif\r
+  #ifndef PtrToShort\r
+    #define PtrToShort( p ) ((short)(LONG_PTR)(p) )\r
+  #endif\r
+  #ifndef IntToPtr\r
+    #define IntToPtr( i )    ((VOID *)(INT_PTR)((int)i))\r
+  #endif\r
+  #ifndef UIntToPtr\r
+    #define UIntToPtr( ui )  ((VOID *)(UINT_PTR)((unsigned int)ui))\r
+  #endif\r
+  #ifndef LongToPtr\r
+    #define LongToPtr( l )   ((VOID *)(LONG_PTR)((long)l))\r
+  #endif\r
+  #ifndef ULongToPtr\r
+    #define ULongToPtr( ul )  ((VOID *)(ULONG_PTR)((unsigned long)ul))\r
+  #endif\r
+\r
+#endif // !defined(_WIN64) && (_ATL_VER < 0x0700)\r
+#endif // !_ATL_NO_OLD_HEADERS_WIN64\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Global support for SecureHelper functions\r
+\r
+#ifndef _TRUNCATE\r
+  #define _TRUNCATE ((size_t)-1)\r
+#endif\r
+\r
+#ifndef _ERRCODE_DEFINED\r
+  #define _ERRCODE_DEFINED\r
+  typedef int errno_t;\r
+#endif\r
+\r
+#ifndef _SECURECRT_ERRCODE_VALUES_DEFINED\r
+  #define _SECURECRT_ERRCODE_VALUES_DEFINED\r
+  #define EINVAL          22\r
+  #define STRUNCATE       80\r
+#endif\r
+\r
+#ifndef _countof\r
+  #define _countof(_Array) (sizeof(_Array) / sizeof(_Array[0]))\r
+#endif\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Miscellaneous global support\r
+\r
+// define useful macros from winuser.h\r
+#ifndef IS_INTRESOURCE\r
+  #define IS_INTRESOURCE(_r) (((ULONG_PTR)(_r) >> 16) == 0)\r
+#endif // IS_INTRESOURCE\r
+\r
+// protect template members from windowsx.h macros\r
+#ifdef _INC_WINDOWSX\r
+  #undef SubclassWindow\r
+#endif // _INC_WINDOWSX\r
+\r
+// define useful macros from windowsx.h\r
+#ifndef GET_X_LPARAM\r
+  #define GET_X_LPARAM(lParam) ((int)(short)LOWORD(lParam))\r
+#endif\r
+#ifndef GET_Y_LPARAM\r
+  #define GET_Y_LPARAM(lParam) ((int)(short)HIWORD(lParam))\r
+#endif\r
+\r
+// Dummy structs for compiling with /CLR\r
+#if (_MSC_VER >= 1300) && defined(_MANAGED)\r
+  __if_not_exists(_IMAGELIST::_IMAGELIST) { struct _IMAGELIST { }; }\r
+  __if_not_exists(_TREEITEM::_TREEITEM) { struct _TREEITEM { }; }\r
+  __if_not_exists(_PSP::_PSP) { struct _PSP { }; }\r
+#endif\r
+\r
+// Define ATLVERIFY macro for ATL3\r
+#if (_ATL_VER < 0x0700)\r
+  #ifndef ATLVERIFY\r
+    #ifdef _DEBUG\r
+      #define ATLVERIFY(expr) ATLASSERT(expr)\r
+    #else\r
+      #define ATLVERIFY(expr) (expr)\r
+    #endif // DEBUG\r
+  #endif // ATLVERIFY\r
+#endif // (_ATL_VER < 0x0700)\r
+\r
+// Forward declaration for ATL3 fix\r
+#if (_ATL_VER < 0x0700) && defined(_ATL_DLL) && !defined(_WIN32_WCE)\r
+  namespace ATL { HRESULT AtlGetCommCtrlVersion(LPDWORD pdwMajor, LPDWORD pdwMinor); };\r
+#endif\r
+\r
+\r
+namespace WTL\r
+{\r
+\r
+#if (_ATL_VER >= 0x0700)\r
+  DECLARE_TRACE_CATEGORY(atlTraceUI);\r
+  #ifdef _DEBUG\r
+    __declspec(selectany) ATL::CTraceCategory atlTraceUI(_T("atlTraceUI"));\r
+  #endif // _DEBUG\r
+#else // !(_ATL_VER >= 0x0700)\r
+  enum wtlTraceFlags\r
+  {\r
+       atlTraceUI = 0x10000000\r
+  };\r
+#endif // !(_ATL_VER >= 0x0700)\r
+\r
+// Windows version helper\r
+inline bool AtlIsOldWindows()\r
+{\r
+       OSVERSIONINFO ovi = { 0 };\r
+       ovi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);\r
+       BOOL bRet = ::GetVersionEx(&ovi);\r
+       return (!bRet || !((ovi.dwMajorVersion >= 5) || (ovi.dwMajorVersion == 4 && ovi.dwMinorVersion >= 90)));\r
+}\r
+\r
+// default GUI font helper\r
+inline HFONT AtlGetDefaultGuiFont()\r
+{\r
+#ifndef _WIN32_WCE\r
+       return (HFONT)::GetStockObject(DEFAULT_GUI_FONT);\r
+#else // CE specific\r
+       return (HFONT)::GetStockObject(SYSTEM_FONT);\r
+#endif // _WIN32_WCE\r
+}\r
+\r
+// bold font helper (NOTE: Caller owns the font, and should destroy it when done using it)\r
+inline HFONT AtlCreateBoldFont(HFONT hFont = NULL)\r
+{\r
+       if(hFont == NULL)\r
+               hFont = AtlGetDefaultGuiFont();\r
+       ATLASSERT(hFont != NULL);\r
+       HFONT hFontBold = NULL;\r
+       LOGFONT lf = { 0 };\r
+       if(::GetObject(hFont, sizeof(LOGFONT), &lf) == sizeof(LOGFONT))\r
+       {\r
+               lf.lfWeight = FW_BOLD;\r
+               hFontBold =  ::CreateFontIndirect(&lf);\r
+               ATLASSERT(hFontBold != NULL);\r
+       }\r
+       else\r
+       {\r
+               ATLASSERT(FALSE);\r
+       }\r
+       return hFontBold;\r
+}\r
+\r
+// Common Controls initialization helper\r
+inline BOOL AtlInitCommonControls(DWORD dwFlags)\r
+{\r
+       INITCOMMONCONTROLSEX iccx = { sizeof(INITCOMMONCONTROLSEX), dwFlags };\r
+       BOOL bRet = ::InitCommonControlsEx(&iccx);\r
+       ATLASSERT(bRet);\r
+       return bRet;\r
+}\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// RunTimeHelper - helper functions for Windows version and structure sizes\r
+\r
+// Not for Windows CE\r
+#if defined(_WIN32_WCE) && !defined(_WTL_NO_RUNTIME_STRUCT_SIZE)\r
+  #define _WTL_NO_RUNTIME_STRUCT_SIZE\r
+#endif\r
+\r
+#ifndef _WTL_NO_RUNTIME_STRUCT_SIZE\r
+\r
+#ifndef _SIZEOF_STRUCT\r
+  #define _SIZEOF_STRUCT(structname, member)  (((int)((LPBYTE)(&((structname*)0)->member) - ((LPBYTE)((structname*)0)))) + sizeof(((structname*)0)->member))\r
+#endif\r
+\r
+#if (_WIN32_WINNT >= 0x0600) && !defined(REBARBANDINFO_V6_SIZE)\r
+  #define REBARBANDINFO_V6_SIZE   _SIZEOF_STRUCT(REBARBANDINFO, cxHeader)\r
+#endif // (_WIN32_WINNT >= 0x0600) && !defined(REBARBANDINFO_V6_SIZE)\r
+\r
+#if (_WIN32_WINNT >= 0x0600) && !defined(LVGROUP_V5_SIZE)\r
+  #define LVGROUP_V5_SIZE   _SIZEOF_STRUCT(LVGROUP, uAlign)\r
+#endif // (_WIN32_WINNT >= 0x0600) && !defined(LVGROUP_V5_SIZE)\r
+\r
+#if (_WIN32_WINNT >= 0x0600) && !defined(LVTILEINFO_V5_SIZE)\r
+  #define LVTILEINFO_V5_SIZE   _SIZEOF_STRUCT(LVTILEINFO, puColumns)\r
+#endif // (_WIN32_WINNT >= 0x0600) && !defined(LVTILEINFO_V5_SIZE)\r
+\r
+#if defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN) && !defined(MCHITTESTINFO_V1_SIZE)\r
+  #define MCHITTESTINFO_V1_SIZE   _SIZEOF_STRUCT(MCHITTESTINFO, st)\r
+#endif // defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN) && !defined(MCHITTESTINFO_V1_SIZE)\r
+\r
+#if !defined(_WIN32_WCE) && (WINVER >= 0x0600) && !defined(NONCLIENTMETRICS_V1_SIZE)\r
+  #define NONCLIENTMETRICS_V1_SIZE   _SIZEOF_STRUCT(NONCLIENTMETRICS, lfMessageFont)\r
+#endif // !defined(_WIN32_WCE) && (WINVER >= 0x0600) && !defined(NONCLIENTMETRICS_V1_SIZE)\r
+\r
+#endif // !_WTL_NO_RUNTIME_STRUCT_SIZE\r
+\r
+namespace RunTimeHelper\r
+{\r
+#ifndef _WIN32_WCE\r
+       inline bool IsCommCtrl6()\r
+       {\r
+               DWORD dwMajor = 0, dwMinor = 0;\r
+               HRESULT hRet = ATL::AtlGetCommCtrlVersion(&dwMajor, &dwMinor);\r
+               return (SUCCEEDED(hRet) && (dwMajor >= 6));\r
+       }\r
+\r
+       inline bool IsVista()\r
+       {\r
+               OSVERSIONINFO ovi = { sizeof(OSVERSIONINFO) };\r
+               BOOL bRet = ::GetVersionEx(&ovi);\r
+               return ((bRet != FALSE) && (ovi.dwMajorVersion >= 6));\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       inline int SizeOf_REBARBANDINFO()\r
+       {\r
+               int nSize = sizeof(REBARBANDINFO);\r
+#if !defined(_WTL_NO_RUNTIME_STRUCT_SIZE) && (_WIN32_WINNT >= 0x0600)\r
+               if(!(IsVista() && IsCommCtrl6()))\r
+                       nSize = REBARBANDINFO_V6_SIZE;\r
+#endif // !defined(_WTL_NO_RUNTIME_STRUCT_SIZE) && (_WIN32_WINNT >= 0x0600)\r
+               return nSize;\r
+       }\r
+\r
+#if (_WIN32_WINNT >= 0x501)\r
+       inline int SizeOf_LVGROUP()\r
+       {\r
+               int nSize = sizeof(LVGROUP);\r
+#if !defined(_WTL_NO_RUNTIME_STRUCT_SIZE) && (_WIN32_WINNT >= 0x0600)\r
+               if(!IsVista())\r
+                       nSize = LVGROUP_V5_SIZE;\r
+#endif // !defined(_WTL_NO_RUNTIME_STRUCT_SIZE) && (_WIN32_WINNT >= 0x0600)\r
+               return nSize;\r
+       }\r
+\r
+       inline int SizeOf_LVTILEINFO()\r
+       {\r
+               int nSize = sizeof(LVTILEINFO);\r
+#if !defined(_WTL_NO_RUNTIME_STRUCT_SIZE) && (_WIN32_WINNT >= 0x0600)\r
+               if(!IsVista())\r
+                       nSize = LVTILEINFO_V5_SIZE;\r
+#endif // !defined(_WTL_NO_RUNTIME_STRUCT_SIZE) && (_WIN32_WINNT >= 0x0600)\r
+               return nSize;\r
+       }\r
+#endif // (_WIN32_WINNT >= 0x501)\r
+\r
+       inline int SizeOf_MCHITTESTINFO()\r
+       {\r
+               int nSize = sizeof(MCHITTESTINFO);\r
+#if !defined(_WTL_NO_RUNTIME_STRUCT_SIZE) && defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN)\r
+               if(!(IsVista() && IsCommCtrl6()))\r
+                       nSize = MCHITTESTINFO_V1_SIZE;\r
+#endif // !defined(_WTL_NO_RUNTIME_STRUCT_SIZE) && defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN)\r
+               return nSize;\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       inline int SizeOf_NONCLIENTMETRICS()\r
+       {\r
+               int nSize = sizeof(NONCLIENTMETRICS);\r
+#if !defined(_WTL_NO_RUNTIME_STRUCT_SIZE) && (WINVER >= 0x0600)\r
+               if(!IsVista())\r
+                       nSize = NONCLIENTMETRICS_V1_SIZE;\r
+#endif // !defined(_WTL_NO_RUNTIME_STRUCT_SIZE) && (WINVER >= 0x0600)\r
+               return nSize;\r
+       }\r
+#endif // !_WIN32_WCE\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// ModuleHelper - helper functions for ATL3 and ATL7 module classes\r
+\r
+namespace ModuleHelper\r
+{\r
+       inline HINSTANCE GetModuleInstance()\r
+       {\r
+#if (_ATL_VER >= 0x0700)\r
+               return ATL::_AtlBaseModule.GetModuleInstance();\r
+#else // !(_ATL_VER >= 0x0700)\r
+               return ATL::_pModule->GetModuleInstance();\r
+#endif // !(_ATL_VER >= 0x0700)\r
+       }\r
+\r
+       inline HINSTANCE GetResourceInstance()\r
+       {\r
+#if (_ATL_VER >= 0x0700)\r
+               return ATL::_AtlBaseModule.GetResourceInstance();\r
+#else // !(_ATL_VER >= 0x0700)\r
+               return ATL::_pModule->GetResourceInstance();\r
+#endif // !(_ATL_VER >= 0x0700)\r
+       }\r
+\r
+       inline void AddCreateWndData(ATL::_AtlCreateWndData* pData, void* pObject)\r
+       {\r
+#if (_ATL_VER >= 0x0700)\r
+               ATL::_AtlWinModule.AddCreateWndData(pData, pObject);\r
+#else // !(_ATL_VER >= 0x0700)\r
+               ATL::_pModule->AddCreateWndData(pData, pObject);\r
+#endif // !(_ATL_VER >= 0x0700)\r
+       }\r
+\r
+       inline void* ExtractCreateWndData()\r
+       {\r
+#if (_ATL_VER >= 0x0700)\r
+               return ATL::_AtlWinModule.ExtractCreateWndData();\r
+#else // !(_ATL_VER >= 0x0700)\r
+               return ATL::_pModule->ExtractCreateWndData();\r
+#endif // !(_ATL_VER >= 0x0700)\r
+       }\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// SecureHelper - helper functions for VS2005 secure CRT\r
+\r
+namespace SecureHelper\r
+{\r
+       inline void strcpyA_x(char* lpstrDest, size_t cchDest, const char* lpstrSrc)\r
+       {\r
+#if _SECURE_ATL\r
+               ATL::Checked::strcpy_s(lpstrDest, cchDest, lpstrSrc);\r
+#else\r
+               if(cchDest > (size_t)lstrlenA(lpstrSrc))\r
+                       ATLVERIFY(lstrcpyA(lpstrDest, lpstrSrc) != NULL);\r
+               else\r
+                       ATLASSERT(FALSE);\r
+#endif\r
+       }\r
+\r
+       inline void strcpyW_x(wchar_t* lpstrDest, size_t cchDest, const wchar_t* lpstrSrc)\r
+       {\r
+#if _SECURE_ATL\r
+               ATL::Checked::wcscpy_s(lpstrDest, cchDest, lpstrSrc);\r
+#else\r
+               if(cchDest > (size_t)lstrlenW(lpstrSrc))\r
+                       ATLVERIFY(lstrcpyW(lpstrDest, lpstrSrc) != NULL);\r
+               else\r
+                       ATLASSERT(FALSE);\r
+#endif\r
+       }\r
+\r
+       inline void strcpy_x(LPTSTR lpstrDest, size_t cchDest, LPCTSTR lpstrSrc)\r
+       {\r
+#ifdef _UNICODE\r
+               strcpyW_x(lpstrDest, cchDest, lpstrSrc);\r
+#else\r
+               strcpyA_x(lpstrDest, cchDest, lpstrSrc);\r
+#endif\r
+       }\r
+\r
+       inline errno_t strncpyA_x(char* lpstrDest, size_t cchDest, const char* lpstrSrc, size_t cchCount)\r
+       {\r
+#if _SECURE_ATL\r
+               return ATL::Checked::strncpy_s(lpstrDest, cchDest, lpstrSrc, cchCount);\r
+#else\r
+               errno_t nRet = 0;\r
+               if(lpstrDest == NULL || cchDest == 0 || lpstrSrc == NULL)\r
+               {\r
+                       nRet = EINVAL;\r
+               }\r
+               else if(cchCount == _TRUNCATE)\r
+               {\r
+                       cchCount = min(cchDest - 1, size_t(lstrlenA(lpstrSrc)));\r
+                       nRet = STRUNCATE;\r
+               }\r
+               else if(cchDest <= cchCount)\r
+               {\r
+                       lpstrDest[0] = 0;\r
+                       nRet = EINVAL;\r
+               }\r
+               if(nRet == 0 || nRet == STRUNCATE)\r
+                       nRet = (lstrcpynA(lpstrDest, lpstrSrc, (int)cchCount + 1) != NULL) ? nRet : EINVAL;\r
+               ATLASSERT(nRet == 0 || nRet == STRUNCATE);\r
+               return nRet;\r
+#endif\r
+       }\r
+\r
+       inline errno_t strncpyW_x(wchar_t* lpstrDest, size_t cchDest, const wchar_t* lpstrSrc, size_t cchCount)\r
+       {\r
+#if _SECURE_ATL\r
+               return ATL::Checked::wcsncpy_s(lpstrDest, cchDest, lpstrSrc, cchCount);\r
+#else\r
+               errno_t nRet = 0;\r
+               if(lpstrDest == NULL || cchDest == 0 || lpstrSrc == NULL)\r
+               {\r
+                       nRet = EINVAL;\r
+               }\r
+               else if(cchCount == _TRUNCATE)\r
+               {\r
+                       cchCount = min(cchDest - 1, size_t(lstrlenW(lpstrSrc)));\r
+                       nRet = STRUNCATE;\r
+               }\r
+               else if(cchDest <= cchCount)\r
+               {\r
+                       lpstrDest[0] = 0;\r
+                       nRet = EINVAL;\r
+               }\r
+               if(nRet == 0 || nRet == STRUNCATE)\r
+                       nRet = (lstrcpynW(lpstrDest, lpstrSrc, (int)cchCount + 1) != NULL) ? nRet : EINVAL;\r
+               ATLASSERT(nRet == 0 || nRet == STRUNCATE);\r
+               return nRet;\r
+#endif\r
+       }\r
+\r
+       inline errno_t strncpy_x(LPTSTR lpstrDest, size_t cchDest, LPCTSTR lpstrSrc, size_t cchCount)\r
+       {\r
+#ifdef _UNICODE\r
+               return strncpyW_x(lpstrDest, cchDest, lpstrSrc, cchCount);\r
+#else\r
+               return strncpyA_x(lpstrDest, cchDest, lpstrSrc, cchCount);\r
+#endif\r
+       }\r
+\r
+       inline void strcatA_x(char* lpstrDest, size_t cchDest, const char* lpstrSrc)\r
+       {\r
+#if _SECURE_ATL\r
+               ATL::Checked::strcat_s(lpstrDest, cchDest, lpstrSrc);\r
+#else\r
+               if(cchDest > (size_t)lstrlenA(lpstrSrc))\r
+                       ATLVERIFY(lstrcatA(lpstrDest, lpstrSrc) != NULL);\r
+               else\r
+                       ATLASSERT(FALSE);\r
+#endif\r
+       }\r
+\r
+       inline void strcatW_x(wchar_t* lpstrDest, size_t cchDest, const wchar_t* lpstrSrc)\r
+       {\r
+#if _SECURE_ATL\r
+               ATL::Checked::wcscat_s(lpstrDest, cchDest, lpstrSrc);\r
+#else\r
+               if(cchDest > (size_t)lstrlenW(lpstrSrc))\r
+                       ATLVERIFY(lstrcatW(lpstrDest, lpstrSrc) != NULL);\r
+               else\r
+                       ATLASSERT(FALSE);\r
+#endif\r
+       }\r
+\r
+       inline void strcat_x(LPTSTR lpstrDest, size_t cchDest, LPCTSTR lpstrSrc)\r
+       {\r
+#ifdef _UNICODE\r
+               strcatW_x(lpstrDest, cchDest, lpstrSrc);\r
+#else\r
+               strcatA_x(lpstrDest, cchDest, lpstrSrc);\r
+#endif\r
+       }\r
+\r
+       inline void memcpy_x(void* pDest, size_t cbDest, const void* pSrc, size_t cbSrc)\r
+       {\r
+#if _SECURE_ATL\r
+               ATL::Checked::memcpy_s(pDest, cbDest, pSrc, cbSrc);\r
+#else\r
+               if(cbDest >= cbSrc)\r
+                       memcpy(pDest, pSrc, cbSrc);\r
+               else\r
+                       ATLASSERT(FALSE);\r
+#endif\r
+       }\r
+\r
+       inline void memmove_x(void* pDest, size_t cbDest, const void* pSrc, size_t cbSrc)\r
+       {\r
+#if _SECURE_ATL\r
+               ATL::Checked::memmove_s(pDest, cbDest, pSrc, cbSrc);\r
+#else\r
+               if(cbDest >= cbSrc)\r
+                       memmove(pDest, pSrc, cbSrc);\r
+               else\r
+                       ATLASSERT(FALSE);\r
+#endif\r
+       }\r
+\r
+       inline int vsprintf_x(LPTSTR lpstrBuff, size_t cchBuff, LPCTSTR lpstrFormat, va_list args)\r
+       {\r
+#if _SECURE_ATL && !defined(_ATL_MIN_CRT) && !defined(_WIN32_WCE)\r
+               return _vstprintf_s(lpstrBuff, cchBuff, lpstrFormat, args);\r
+#else\r
+               cchBuff;   // Avoid unused argument warning\r
+               return _vstprintf(lpstrBuff, lpstrFormat, args);\r
+#endif\r
+       }\r
+\r
+       inline int wvsprintf_x(LPTSTR lpstrBuff, size_t cchBuff, LPCTSTR lpstrFormat, va_list args)\r
+       {\r
+#if _SECURE_ATL && !defined(_ATL_MIN_CRT) && !defined(_WIN32_WCE)\r
+               return _vstprintf_s(lpstrBuff, cchBuff, lpstrFormat, args);\r
+#else\r
+               cchBuff;   // Avoid unused argument warning\r
+               return ::wvsprintf(lpstrBuff, lpstrFormat, args);\r
+#endif\r
+       }\r
+\r
+       inline int sprintf_x(LPTSTR lpstrBuff, size_t cchBuff, LPCTSTR lpstrFormat, ...)\r
+       {\r
+               va_list args;\r
+               va_start(args, lpstrFormat);\r
+               int nRes = vsprintf_x(lpstrBuff, cchBuff, lpstrFormat, args);\r
+               va_end(args);\r
+               return nRes;\r
+       }\r
+\r
+       inline int wsprintf_x(LPTSTR lpstrBuff, size_t cchBuff, LPCTSTR lpstrFormat, ...)\r
+       {\r
+               va_list args;\r
+               va_start(args, lpstrFormat);\r
+               int nRes = wvsprintf_x(lpstrBuff, cchBuff, lpstrFormat, args);\r
+               va_end(args);\r
+               return nRes;\r
+       }\r
+}; // namespace SecureHelper\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CMessageFilter - Interface for message filter support\r
+\r
+class CMessageFilter\r
+{\r
+public:\r
+       virtual BOOL PreTranslateMessage(MSG* pMsg) = 0;\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CIdleHandler - Interface for idle processing\r
+\r
+class CIdleHandler\r
+{\r
+public:\r
+       virtual BOOL OnIdle() = 0;\r
+};\r
+\r
+#ifndef _ATL_NO_OLD_NAMES\r
+  // for compatilibility with old names only\r
+  typedef CIdleHandler CUpdateUIObject;\r
+  #define DoUpdate OnIdle\r
+#endif // !_ATL_NO_OLD_NAMES\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CMessageLoop - message loop implementation\r
+\r
+class CMessageLoop\r
+{\r
+public:\r
+       ATL::CSimpleArray<CMessageFilter*> m_aMsgFilter;\r
+       ATL::CSimpleArray<CIdleHandler*> m_aIdleHandler;\r
+       MSG m_msg;\r
+\r
+// Message filter operations\r
+       BOOL AddMessageFilter(CMessageFilter* pMessageFilter)\r
+       {\r
+               return m_aMsgFilter.Add(pMessageFilter);\r
+       }\r
+\r
+       BOOL RemoveMessageFilter(CMessageFilter* pMessageFilter)\r
+       {\r
+               return m_aMsgFilter.Remove(pMessageFilter);\r
+       }\r
+\r
+// Idle handler operations\r
+       BOOL AddIdleHandler(CIdleHandler* pIdleHandler)\r
+       {\r
+               return m_aIdleHandler.Add(pIdleHandler);\r
+       }\r
+\r
+       BOOL RemoveIdleHandler(CIdleHandler* pIdleHandler)\r
+       {\r
+               return m_aIdleHandler.Remove(pIdleHandler);\r
+       }\r
+\r
+#ifndef _ATL_NO_OLD_NAMES\r
+       // for compatilibility with old names only\r
+       BOOL AddUpdateUI(CIdleHandler* pIdleHandler)\r
+       {\r
+               ATLTRACE2(atlTraceUI, 0, _T("CUpdateUIObject and AddUpdateUI are deprecated. Please change your code to use CIdleHandler and OnIdle\n"));\r
+               return AddIdleHandler(pIdleHandler);\r
+       }\r
+\r
+       BOOL RemoveUpdateUI(CIdleHandler* pIdleHandler)\r
+       {\r
+               ATLTRACE2(atlTraceUI, 0, _T("CUpdateUIObject and RemoveUpdateUI are deprecated. Please change your code to use CIdleHandler and OnIdle\n"));\r
+               return RemoveIdleHandler(pIdleHandler);\r
+       }\r
+#endif // !_ATL_NO_OLD_NAMES\r
+\r
+// message loop\r
+       int Run()\r
+       {\r
+               BOOL bDoIdle = TRUE;\r
+               int nIdleCount = 0;\r
+               BOOL bRet;\r
+\r
+               for(;;)\r
+               {\r
+                       while(bDoIdle && !::PeekMessage(&m_msg, NULL, 0, 0, PM_NOREMOVE))\r
+                       {\r
+                               if(!OnIdle(nIdleCount++))\r
+                                       bDoIdle = FALSE;\r
+                       }\r
+\r
+                       bRet = ::GetMessage(&m_msg, NULL, 0, 0);\r
+\r
+                       if(bRet == -1)\r
+                       {\r
+                               ATLTRACE2(atlTraceUI, 0, _T("::GetMessage returned -1 (error)\n"));\r
+                               continue;   // error, don't process\r
+                       }\r
+                       else if(!bRet)\r
+                       {\r
+                               ATLTRACE2(atlTraceUI, 0, _T("CMessageLoop::Run - exiting\n"));\r
+                               break;   // WM_QUIT, exit message loop\r
+                       }\r
+\r
+                       if(!PreTranslateMessage(&m_msg))\r
+                       {\r
+                               ::TranslateMessage(&m_msg);\r
+                               ::DispatchMessage(&m_msg);\r
+                       }\r
+\r
+                       if(IsIdleMessage(&m_msg))\r
+                       {\r
+                               bDoIdle = TRUE;\r
+                               nIdleCount = 0;\r
+                       }\r
+               }\r
+\r
+               return (int)m_msg.wParam;\r
+       }\r
+\r
+       static BOOL IsIdleMessage(MSG* pMsg)\r
+       {\r
+               // These messages should NOT cause idle processing\r
+               switch(pMsg->message)\r
+               {\r
+               case WM_MOUSEMOVE:\r
+#ifndef _WIN32_WCE\r
+               case WM_NCMOUSEMOVE:\r
+#endif // !_WIN32_WCE\r
+               case WM_PAINT:\r
+               case 0x0118:    // WM_SYSTIMER (caret blink)\r
+                       return FALSE;\r
+               }\r
+\r
+               return TRUE;\r
+       }\r
+\r
+// Overrideables\r
+       // Override to change message filtering\r
+       virtual BOOL PreTranslateMessage(MSG* pMsg)\r
+       {\r
+               // loop backwards\r
+               for(int i = m_aMsgFilter.GetSize() - 1; i >= 0; i--)\r
+               {\r
+                       CMessageFilter* pMessageFilter = m_aMsgFilter[i];\r
+                       if(pMessageFilter != NULL && pMessageFilter->PreTranslateMessage(pMsg))\r
+                               return TRUE;\r
+               }\r
+               return FALSE;   // not translated\r
+       }\r
+\r
+       // override to change idle processing\r
+       virtual BOOL OnIdle(int /*nIdleCount*/)\r
+       {\r
+               for(int i = 0; i < m_aIdleHandler.GetSize(); i++)\r
+               {\r
+                       CIdleHandler* pIdleHandler = m_aIdleHandler[i];\r
+                       if(pIdleHandler != NULL)\r
+                               pIdleHandler->OnIdle();\r
+               }\r
+               return FALSE;   // don't continue\r
+       }\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CStaticDataInitCriticalSectionLock and CWindowCreateCriticalSectionLock\r
+// internal classes to manage critical sections for both ATL3 and ATL7\r
+\r
+class CStaticDataInitCriticalSectionLock\r
+{\r
+public:\r
+#if (_ATL_VER >= 0x0700)\r
+       ATL::CComCritSecLock<ATL::CComCriticalSection> m_cslock;\r
+\r
+       CStaticDataInitCriticalSectionLock() : m_cslock(ATL::_pAtlModule->m_csStaticDataInitAndTypeInfo, false)\r
+       { }\r
+#endif // (_ATL_VER >= 0x0700)\r
+\r
+       HRESULT Lock()\r
+       {\r
+#if (_ATL_VER >= 0x0700)\r
+               return m_cslock.Lock();\r
+#else // !(_ATL_VER >= 0x0700)\r
+               ::EnterCriticalSection(&ATL::_pModule->m_csStaticDataInit);\r
+               return S_OK;\r
+#endif // !(_ATL_VER >= 0x0700)\r
+       }\r
+\r
+       void Unlock()\r
+       {\r
+#if (_ATL_VER >= 0x0700)\r
+               m_cslock.Unlock();\r
+#else // !(_ATL_VER >= 0x0700)\r
+               ::LeaveCriticalSection(&ATL::_pModule->m_csStaticDataInit);\r
+#endif // !(_ATL_VER >= 0x0700)\r
+       }\r
+};\r
+\r
+\r
+class CWindowCreateCriticalSectionLock\r
+{\r
+public:\r
+#if (_ATL_VER >= 0x0700)\r
+       ATL::CComCritSecLock<ATL::CComCriticalSection> m_cslock;\r
+\r
+       CWindowCreateCriticalSectionLock() : m_cslock(ATL::_AtlWinModule.m_csWindowCreate, false)\r
+       { }\r
+#endif // (_ATL_VER >= 0x0700)\r
+\r
+       HRESULT Lock()\r
+       {\r
+#if (_ATL_VER >= 0x0700)\r
+               return m_cslock.Lock();\r
+#else // !(_ATL_VER >= 0x0700)\r
+               ::EnterCriticalSection(&ATL::_pModule->m_csWindowCreate);\r
+               return S_OK;\r
+#endif // !(_ATL_VER >= 0x0700)\r
+       }\r
+\r
+       void Unlock()\r
+       {\r
+#if (_ATL_VER >= 0x0700)\r
+               m_cslock.Unlock();\r
+#else // !(_ATL_VER >= 0x0700)\r
+               ::LeaveCriticalSection(&ATL::_pModule->m_csWindowCreate);\r
+#endif // !(_ATL_VER >= 0x0700)\r
+       }\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CTempBuffer - helper class for stack allocations for ATL3\r
+\r
+#ifndef _WTL_STACK_ALLOC_THRESHOLD\r
+  #define _WTL_STACK_ALLOC_THRESHOLD   512\r
+#endif\r
+\r
+#if (_ATL_VER >= 0x0700)\r
+\r
+using ATL::CTempBuffer;\r
+\r
+#else // !(_ATL_VER >= 0x0700)\r
+\r
+#ifndef SIZE_MAX\r
+  #ifdef _WIN64 \r
+    #define SIZE_MAX _UI64_MAX\r
+  #else\r
+    #define SIZE_MAX UINT_MAX\r
+  #endif\r
+#endif\r
+\r
+#pragma warning(disable: 4284)   // warning for operator ->\r
+\r
+template<typename T, int t_nFixedBytes = 128>\r
+class CTempBuffer\r
+{\r
+public:\r
+       CTempBuffer() : m_p(NULL)\r
+       {\r
+       }\r
+\r
+       CTempBuffer(size_t nElements) : m_p(NULL)\r
+       {\r
+               Allocate(nElements);\r
+       }\r
+\r
+       ~CTempBuffer()\r
+       {\r
+               if(m_p != reinterpret_cast<T*>(m_abFixedBuffer))\r
+                       free(m_p);\r
+       }\r
+\r
+       operator T*() const\r
+       {\r
+               return m_p;\r
+       }\r
+\r
+       T* operator ->() const\r
+       {\r
+               ATLASSERT(m_p != NULL);\r
+               return m_p;\r
+       }\r
+\r
+       T* Allocate(size_t nElements)\r
+       {\r
+               ATLASSERT(nElements <= (SIZE_MAX / sizeof(T)));\r
+               return AllocateBytes(nElements * sizeof(T));\r
+       }\r
+\r
+       T* AllocateBytes(size_t nBytes)\r
+       {\r
+               ATLASSERT(m_p == NULL);\r
+               if(nBytes > t_nFixedBytes)\r
+                       m_p = static_cast<T*>(malloc(nBytes));\r
+               else\r
+                       m_p = reinterpret_cast<T*>(m_abFixedBuffer);\r
+\r
+               return m_p;\r
+       }\r
+\r
+private:\r
+       T* m_p;\r
+       BYTE m_abFixedBuffer[t_nFixedBytes];\r
+};\r
+\r
+#pragma warning(default: 4284)\r
+\r
+#endif // !(_ATL_VER >= 0x0700)\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CAppModule - module class for an application\r
+\r
+class CAppModule : public ATL::CComModule\r
+{\r
+public:\r
+       DWORD m_dwMainThreadID;\r
+       ATL::CSimpleMap<DWORD, CMessageLoop*>* m_pMsgLoopMap;\r
+       ATL::CSimpleArray<HWND>* m_pSettingChangeNotify;\r
+\r
+// Overrides of CComModule::Init and Term\r
+       HRESULT Init(ATL::_ATL_OBJMAP_ENTRY* pObjMap, HINSTANCE hInstance, const GUID* pLibID = NULL)\r
+       {\r
+               HRESULT hRet = CComModule::Init(pObjMap, hInstance, pLibID);\r
+               if(FAILED(hRet))\r
+                       return hRet;\r
+\r
+               m_dwMainThreadID = ::GetCurrentThreadId();\r
+               typedef ATL::CSimpleMap<DWORD, CMessageLoop*>   _mapClass;\r
+               m_pMsgLoopMap = NULL;\r
+               ATLTRY(m_pMsgLoopMap = new _mapClass);\r
+               if(m_pMsgLoopMap == NULL)\r
+                       return E_OUTOFMEMORY;\r
+               m_pSettingChangeNotify = NULL;\r
+\r
+               return hRet;\r
+       }\r
+\r
+       void Term()\r
+       {\r
+               TermSettingChangeNotify();\r
+               delete m_pMsgLoopMap;\r
+               CComModule::Term();\r
+       }\r
+\r
+// Message loop map methods\r
+       BOOL AddMessageLoop(CMessageLoop* pMsgLoop)\r
+       {\r
+               CStaticDataInitCriticalSectionLock lock;\r
+               if(FAILED(lock.Lock()))\r
+               {\r
+                       ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CAppModule::AddMessageLoop.\n"));\r
+                       ATLASSERT(FALSE);\r
+                       return FALSE;\r
+               }\r
+\r
+               ATLASSERT(pMsgLoop != NULL);\r
+               ATLASSERT(m_pMsgLoopMap->Lookup(::GetCurrentThreadId()) == NULL);   // not in map yet\r
+\r
+               BOOL bRet = m_pMsgLoopMap->Add(::GetCurrentThreadId(), pMsgLoop);\r
+\r
+               lock.Unlock();\r
+\r
+               return bRet;\r
+       }\r
+\r
+       BOOL RemoveMessageLoop()\r
+       {\r
+               CStaticDataInitCriticalSectionLock lock;\r
+               if(FAILED(lock.Lock()))\r
+               {\r
+                       ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CAppModule::RemoveMessageLoop.\n"));\r
+                       ATLASSERT(FALSE);\r
+                       return FALSE;\r
+               }\r
+\r
+               BOOL bRet = m_pMsgLoopMap->Remove(::GetCurrentThreadId());\r
+\r
+               lock.Unlock();\r
+\r
+               return bRet;\r
+       }\r
+\r
+       CMessageLoop* GetMessageLoop(DWORD dwThreadID = ::GetCurrentThreadId()) const\r
+       {\r
+               CStaticDataInitCriticalSectionLock lock;\r
+               if(FAILED(lock.Lock()))\r
+               {\r
+                       ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CAppModule::GetMessageLoop.\n"));\r
+                       ATLASSERT(FALSE);\r
+                       return NULL;\r
+               }\r
+\r
+               CMessageLoop* pLoop =  m_pMsgLoopMap->Lookup(dwThreadID);\r
+\r
+               lock.Unlock();\r
+\r
+               return pLoop;\r
+       }\r
+\r
+// Setting change notify methods\r
+       // Note: Call this from the main thread for MSDI apps\r
+       BOOL InitSettingChangeNotify(DLGPROC pfnDlgProc = _SettingChangeDlgProc)\r
+       {\r
+               CStaticDataInitCriticalSectionLock lock;\r
+               if(FAILED(lock.Lock()))\r
+               {\r
+                       ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CAppModule::InitSettingChangeNotify.\n"));\r
+                       ATLASSERT(FALSE);\r
+                       return FALSE;\r
+               }\r
+\r
+               if(m_pSettingChangeNotify == NULL)\r
+               {\r
+                       typedef ATL::CSimpleArray<HWND>   _notifyClass;\r
+                       ATLTRY(m_pSettingChangeNotify = new _notifyClass);\r
+                       ATLASSERT(m_pSettingChangeNotify != NULL);\r
+               }\r
+\r
+               BOOL bRet = (m_pSettingChangeNotify != NULL);\r
+               if(bRet && m_pSettingChangeNotify->GetSize() == 0)\r
+               {\r
+                       // init everything\r
+                       _ATL_EMPTY_DLGTEMPLATE templ;\r
+                       HWND hNtfWnd = ::CreateDialogIndirect(GetModuleInstance(), &templ, NULL, pfnDlgProc);\r
+                       ATLASSERT(::IsWindow(hNtfWnd));\r
+                       if(::IsWindow(hNtfWnd))\r
+                       {\r
+// need conditional code because types don't match in winuser.h\r
+#ifdef _WIN64\r
+                               ::SetWindowLongPtr(hNtfWnd, GWLP_USERDATA, (LONG_PTR)this);\r
+#else\r
+                               ::SetWindowLongPtr(hNtfWnd, GWLP_USERDATA, PtrToLong(this));\r
+#endif\r
+                               bRet = m_pSettingChangeNotify->Add(hNtfWnd);\r
+                       }\r
+                       else\r
+                       {\r
+                               bRet = FALSE;\r
+                       }\r
+               }\r
+\r
+               lock.Unlock();\r
+\r
+               return bRet;\r
+       }\r
+\r
+       void TermSettingChangeNotify()\r
+       {\r
+               CStaticDataInitCriticalSectionLock lock;\r
+               if(FAILED(lock.Lock()))\r
+               {\r
+                       ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CAppModule::TermSettingChangeNotify.\n"));\r
+                       ATLASSERT(FALSE);\r
+                       return;\r
+               }\r
+\r
+               if(m_pSettingChangeNotify != NULL && m_pSettingChangeNotify->GetSize() > 0)\r
+                       ::DestroyWindow((*m_pSettingChangeNotify)[0]);\r
+               delete m_pSettingChangeNotify;\r
+               m_pSettingChangeNotify = NULL;\r
+\r
+               lock.Unlock();\r
+       }\r
+\r
+       BOOL AddSettingChangeNotify(HWND hWnd)\r
+       {\r
+               CStaticDataInitCriticalSectionLock lock;\r
+               if(FAILED(lock.Lock()))\r
+               {\r
+                       ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CAppModule::AddSettingChangeNotify.\n"));\r
+                       ATLASSERT(FALSE);\r
+                       return FALSE;\r
+               }\r
+\r
+               ATLASSERT(::IsWindow(hWnd));\r
+               BOOL bRet = FALSE;\r
+               if(InitSettingChangeNotify() != FALSE)\r
+                       bRet = m_pSettingChangeNotify->Add(hWnd);\r
+\r
+               lock.Unlock();\r
+\r
+               return bRet;\r
+       }\r
+\r
+       BOOL RemoveSettingChangeNotify(HWND hWnd)\r
+       {\r
+               CStaticDataInitCriticalSectionLock lock;\r
+               if(FAILED(lock.Lock()))\r
+               {\r
+                       ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CAppModule::RemoveSettingChangeNotify.\n"));\r
+                       ATLASSERT(FALSE);\r
+                       return FALSE;\r
+               }\r
+\r
+               BOOL bRet = FALSE;\r
+               if(m_pSettingChangeNotify != NULL)\r
+                       bRet = m_pSettingChangeNotify->Remove(hWnd);\r
+\r
+               lock.Unlock();\r
+\r
+               return bRet;\r
+       }\r
+\r
+// Implementation - setting change notify dialog template and dialog procedure\r
+       struct _ATL_EMPTY_DLGTEMPLATE : DLGTEMPLATE\r
+       {\r
+               _ATL_EMPTY_DLGTEMPLATE()\r
+               {\r
+                       memset(this, 0, sizeof(_ATL_EMPTY_DLGTEMPLATE));\r
+                       style = WS_POPUP;\r
+               }\r
+               WORD wMenu, wClass, wTitle;\r
+       };\r
+\r
+#ifdef _WIN64\r
+       static INT_PTR CALLBACK _SettingChangeDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)\r
+#else\r
+       static BOOL CALLBACK _SettingChangeDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)\r
+#endif\r
+       {\r
+               if(uMsg == WM_SETTINGCHANGE)\r
+               {\r
+// need conditional code because types don't match in winuser.h\r
+#ifdef _WIN64\r
+                       CAppModule* pModule = (CAppModule*)::GetWindowLongPtr(hWnd, GWLP_USERDATA);\r
+#else\r
+                       CAppModule* pModule = (CAppModule*)LongToPtr(::GetWindowLongPtr(hWnd, GWLP_USERDATA));\r
+#endif\r
+                       ATLASSERT(pModule != NULL);\r
+                       ATLASSERT(pModule->m_pSettingChangeNotify != NULL);\r
+                       const UINT uTimeout = 1500;   // ms\r
+                       for(int i = 1; i < pModule->m_pSettingChangeNotify->GetSize(); i++)\r
+                       {\r
+#if !defined(_WIN32_WCE)\r
+                               ::SendMessageTimeout((*pModule->m_pSettingChangeNotify)[i], uMsg, wParam, lParam, SMTO_ABORTIFHUNG, uTimeout, NULL);\r
+#elif(_WIN32_WCE >= 400) // CE specific\r
+                               ::SendMessageTimeout((*pModule->m_pSettingChangeNotify)[i], uMsg, wParam, lParam, SMTO_NORMAL, uTimeout, NULL);\r
+#else // _WIN32_WCE < 400 specific\r
+                               uTimeout;\r
+                               ::SendMessage((*pModule->m_pSettingChangeNotify)[i], uMsg, wParam, lParam);\r
+#endif\r
+                       }\r
+                       return TRUE;\r
+               }\r
+               return FALSE;\r
+       }\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CServerAppModule - module class for a COM server application\r
+\r
+class CServerAppModule : public CAppModule\r
+{\r
+public:\r
+       HANDLE m_hEventShutdown;\r
+       bool m_bActivity;\r
+       DWORD m_dwTimeOut;\r
+       DWORD m_dwPause;\r
+\r
+// Override of CAppModule::Init\r
+       HRESULT Init(ATL::_ATL_OBJMAP_ENTRY* pObjMap, HINSTANCE hInstance, const GUID* pLibID = NULL)\r
+       {\r
+               m_dwTimeOut = 5000;\r
+               m_dwPause = 1000;\r
+               return CAppModule::Init(pObjMap, hInstance, pLibID);\r
+       }\r
+\r
+       void Term()\r
+       {\r
+               if(m_hEventShutdown != NULL && ::CloseHandle(m_hEventShutdown))\r
+                       m_hEventShutdown = NULL;\r
+               CAppModule::Term();\r
+       }\r
+\r
+// COM Server methods\r
+       LONG Unlock()\r
+       {\r
+               LONG lRet = CComModule::Unlock();\r
+               if(lRet == 0)\r
+               {\r
+                       m_bActivity = true;\r
+                       ::SetEvent(m_hEventShutdown); // tell monitor that we transitioned to zero\r
+               }\r
+               return lRet;\r
+       }\r
+\r
+       void MonitorShutdown()\r
+       {\r
+               for(;;)\r
+               {\r
+                       ::WaitForSingleObject(m_hEventShutdown, INFINITE);\r
+                       DWORD dwWait = 0;\r
+                       do\r
+                       {\r
+                               m_bActivity = false;\r
+                               dwWait = ::WaitForSingleObject(m_hEventShutdown, m_dwTimeOut);\r
+                       }\r
+                       while(dwWait == WAIT_OBJECT_0);\r
+                       // timed out\r
+                       if(!m_bActivity && m_nLockCnt == 0) // if no activity let's really bail\r
+                       {\r
+#if ((_WIN32_WINNT >= 0x0400 ) || defined(_WIN32_DCOM)) && defined(_ATL_FREE_THREADED) && !defined(_WIN32_WCE)\r
+                               ::CoSuspendClassObjects();\r
+                               if(!m_bActivity && m_nLockCnt == 0)\r
+#endif\r
+                                       break;\r
+                       }\r
+               }\r
+               // This handle should be valid now. If it isn't, \r
+               // check if _Module.Term was called first (it shouldn't)\r
+               if(::CloseHandle(m_hEventShutdown))\r
+                       m_hEventShutdown = NULL;\r
+               ::PostThreadMessage(m_dwMainThreadID, WM_QUIT, 0, 0);\r
+       }\r
+\r
+       bool StartMonitor()\r
+       {\r
+               m_hEventShutdown = ::CreateEvent(NULL, false, false, NULL);\r
+               if(m_hEventShutdown == NULL)\r
+                       return false;\r
+               DWORD dwThreadID = 0;\r
+#if !defined(_ATL_MIN_CRT) && defined(_MT) && !defined(_WIN32_WCE)\r
+               HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, (UINT (WINAPI*)(void*))MonitorProc, this, 0, (UINT*)&dwThreadID);\r
+#else\r
+               HANDLE hThread = ::CreateThread(NULL, 0, MonitorProc, this, 0, &dwThreadID);\r
+#endif\r
+               bool bRet = (hThread != NULL);\r
+               if(bRet)\r
+                       ::CloseHandle(hThread);\r
+               return bRet;\r
+       }\r
+\r
+       static DWORD WINAPI MonitorProc(void* pv)\r
+       {\r
+               CServerAppModule* p = (CServerAppModule*)pv;\r
+               p->MonitorShutdown();\r
+               return 0;\r
+       }\r
+\r
+#if (_ATL_VER < 0x0700)\r
+       // search for an occurence of string p2 in string p1\r
+       static LPCTSTR FindOneOf(LPCTSTR p1, LPCTSTR p2)\r
+       {\r
+               while(p1 != NULL && *p1 != NULL)\r
+               {\r
+                       LPCTSTR p = p2;\r
+                       while(p != NULL && *p != NULL)\r
+                       {\r
+                               if(*p1 == *p)\r
+                                       return ::CharNext(p1);\r
+                               p = ::CharNext(p);\r
+                       }\r
+                       p1 = ::CharNext(p1);\r
+               }\r
+               return NULL;\r
+       }\r
+#endif // (_ATL_VER < 0x0700)\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CString forward reference (enables CString use in atluser.h and atlgdi.h)\r
+\r
+#if defined(_WTL_FORWARD_DECLARE_CSTRING) && !defined(_WTL_USE_CSTRING)\r
+  #define _WTL_USE_CSTRING\r
+#endif // defined(_WTL_FORWARD_DECLARE_CSTRING) && !defined(_WTL_USE_CSTRING)\r
+\r
+#ifdef _WTL_USE_CSTRING\r
+  class CString;   // forward declaration (include atlmisc.h for the whole class)\r
+#endif // _WTL_USE_CSTRING\r
+\r
+// CString namespace\r
+#ifndef _CSTRING_NS\r
+  #ifdef __ATLSTR_H__\r
+    #define _CSTRING_NS        ATL\r
+  #else\r
+    #define _CSTRING_NS        WTL\r
+  #endif\r
+#endif // _CSTRING_NS\r
+\r
+// Type classes namespace\r
+#ifndef _WTYPES_NS\r
+  #ifdef __ATLTYPES_H__\r
+    #define _WTYPES_NS\r
+  #else\r
+    #define _WTYPES_NS WTL\r
+  #endif\r
+#endif // _WTYPES_NS\r
+\r
+}; // namespace WTL\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// General DLL version helpers (excluded from atlbase.h if _ATL_DLL is defined)\r
+\r
+#if (_ATL_VER < 0x0700) && defined(_ATL_DLL) && !defined(_WIN32_WCE)\r
+\r
+namespace ATL\r
+{\r
+\r
+inline HRESULT AtlGetDllVersion(HINSTANCE hInstDLL, DLLVERSIONINFO* pDllVersionInfo)\r
+{\r
+       ATLASSERT(pDllVersionInfo != NULL);\r
+       if(pDllVersionInfo == NULL)\r
+               return E_INVALIDARG;\r
+\r
+       // We must get this function explicitly because some DLLs don't implement it.\r
+       DLLGETVERSIONPROC pfnDllGetVersion = (DLLGETVERSIONPROC)::GetProcAddress(hInstDLL, "DllGetVersion");\r
+       if(pfnDllGetVersion == NULL)\r
+               return E_NOTIMPL;\r
+\r
+       return (*pfnDllGetVersion)(pDllVersionInfo);\r
+}\r
+\r
+inline HRESULT AtlGetDllVersion(LPCTSTR lpstrDllName, DLLVERSIONINFO* pDllVersionInfo)\r
+{\r
+       HINSTANCE hInstDLL = ::LoadLibrary(lpstrDllName);\r
+       if(hInstDLL == NULL)\r
+               return E_FAIL;\r
+       HRESULT hRet = AtlGetDllVersion(hInstDLL, pDllVersionInfo);\r
+       ::FreeLibrary(hInstDLL);\r
+       return hRet;\r
+}\r
+\r
+// Common Control Versions:\r
+//   Win95/WinNT 4.0    maj=4 min=00\r
+//   IE 3.x     maj=4 min=70\r
+//   IE 4.0     maj=4 min=71\r
+inline HRESULT AtlGetCommCtrlVersion(LPDWORD pdwMajor, LPDWORD pdwMinor)\r
+{\r
+       ATLASSERT(pdwMajor != NULL && pdwMinor != NULL);\r
+       if(pdwMajor == NULL || pdwMinor == NULL)\r
+               return E_INVALIDARG;\r
+\r
+       DLLVERSIONINFO dvi;\r
+       ::ZeroMemory(&dvi, sizeof(dvi));\r
+       dvi.cbSize = sizeof(dvi);\r
+       HRESULT hRet = AtlGetDllVersion(_T("comctl32.dll"), &dvi);\r
+\r
+       if(SUCCEEDED(hRet))\r
+       {\r
+               *pdwMajor = dvi.dwMajorVersion;\r
+               *pdwMinor = dvi.dwMinorVersion;\r
+       }\r
+       else if(hRet == E_NOTIMPL)\r
+       {\r
+               // If DllGetVersion is not there, then the DLL is a version\r
+               // previous to the one shipped with IE 3.x\r
+               *pdwMajor = 4;\r
+               *pdwMinor = 0;\r
+               hRet = S_OK;\r
+       }\r
+\r
+       return hRet;\r
+}\r
+\r
+// Shell Versions:\r
+//   Win95/WinNT 4.0                    maj=4 min=00\r
+//   IE 3.x, IE 4.0 without Web Integrated Desktop  maj=4 min=00\r
+//   IE 4.0 with Web Integrated Desktop         maj=4 min=71\r
+//   IE 4.01 with Web Integrated Desktop        maj=4 min=72\r
+inline HRESULT AtlGetShellVersion(LPDWORD pdwMajor, LPDWORD pdwMinor)\r
+{\r
+       ATLASSERT(pdwMajor != NULL && pdwMinor != NULL);\r
+       if(pdwMajor == NULL || pdwMinor == NULL)\r
+               return E_INVALIDARG;\r
+\r
+       DLLVERSIONINFO dvi;\r
+       ::ZeroMemory(&dvi, sizeof(dvi));\r
+       dvi.cbSize = sizeof(dvi);\r
+       HRESULT hRet = AtlGetDllVersion(_T("shell32.dll"), &dvi);\r
+\r
+       if(SUCCEEDED(hRet))\r
+       {\r
+               *pdwMajor = dvi.dwMajorVersion;\r
+               *pdwMinor = dvi.dwMinorVersion;\r
+       }\r
+       else if(hRet == E_NOTIMPL)\r
+       {\r
+               // If DllGetVersion is not there, then the DLL is a version\r
+               // previous to the one shipped with IE 4.x\r
+               *pdwMajor = 4;\r
+               *pdwMinor = 0;\r
+               hRet = S_OK;\r
+       }\r
+\r
+       return hRet;\r
+}\r
+\r
+}; // namespace ATL\r
+\r
+#endif // (_ATL_VER < 0x0700) && defined(_ATL_DLL) && !defined(_WIN32_WCE)\r
+\r
+\r
+// These are always included\r
+#include "atlwinx.h"\r
+#include "atluser.h"\r
+#include "atlgdi.h"\r
+\r
+#ifndef _WTL_NO_AUTOMATIC_NAMESPACE\r
+using namespace WTL;\r
+#endif // !_WTL_NO_AUTOMATIC_NAMESPACE\r
+\r
+#endif // __ATLAPP_H__\r
diff --git a/WTL80/include/atlcrack.h b/WTL80/include/atlcrack.h
new file mode 100644 (file)
index 0000000..f92b35a
--- /dev/null
@@ -0,0 +1,2380 @@
+// Windows Template Library - WTL version 8.0\r
+// Copyright (C) Microsoft Corporation. All rights reserved.\r
+//\r
+// This file is a part of the Windows Template Library.\r
+// The use and distribution terms for this software are covered by the\r
+// Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php)\r
+// which can be found in the file CPL.TXT at the root of this distribution.\r
+// By using this software in any fashion, you are agreeing to be bound by\r
+// the terms of this license. You must not remove this notice, or\r
+// any other, from this software.\r
+\r
+#ifndef __ATLCRACK_H__\r
+#define __ATLCRACK_H__\r
+\r
+#pragma once\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Message map macro for cracked handlers\r
+\r
+// Note about message maps with cracked handlers:\r
+// For ATL 3.0, a message map using cracked handlers MUST use BEGIN_MSG_MAP_EX.\r
+// For ATL 7.0 or higher, you can use BEGIN_MSG_MAP for CWindowImpl/CDialogImpl derived classes,\r
+// but must use BEGIN_MSG_MAP_EX for classes that don't derive from CWindowImpl/CDialogImpl.\r
+\r
+#define BEGIN_MSG_MAP_EX(theClass) \\r
+public: \\r
+       BOOL m_bMsgHandled; \\r
+       /* "handled" management for cracked handlers */ \\r
+       BOOL IsMsgHandled() const \\r
+       { \\r
+               return m_bMsgHandled; \\r
+       } \\r
+       void SetMsgHandled(BOOL bHandled) \\r
+       { \\r
+               m_bMsgHandled = bHandled; \\r
+       } \\r
+       BOOL ProcessWindowMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT& lResult, DWORD dwMsgMapID = 0) \\r
+       { \\r
+               BOOL bOldMsgHandled = m_bMsgHandled; \\r
+               BOOL bRet = _ProcessWindowMessage(hWnd, uMsg, wParam, lParam, lResult, dwMsgMapID); \\r
+               m_bMsgHandled = bOldMsgHandled; \\r
+               return bRet; \\r
+       } \\r
+       BOOL _ProcessWindowMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT& lResult, DWORD dwMsgMapID) \\r
+       { \\r
+               BOOL bHandled = TRUE; \\r
+               hWnd; \\r
+               uMsg; \\r
+               wParam; \\r
+               lParam; \\r
+               lResult; \\r
+               bHandled; \\r
+               switch(dwMsgMapID) \\r
+               { \\r
+               case 0:\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Standard Windows message macros\r
+\r
+// int OnCreate(LPCREATESTRUCT lpCreateStruct)\r
+#define MSG_WM_CREATE(func) \\r
+       if (uMsg == WM_CREATE) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = (LRESULT)func((LPCREATESTRUCT)lParam); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// BOOL OnInitDialog(CWindow wndFocus, LPARAM lInitParam)\r
+#define MSG_WM_INITDIALOG(func) \\r
+       if (uMsg == WM_INITDIALOG) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = (LRESULT)func((HWND)wParam, lParam); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// BOOL OnCopyData(CWindow wnd, PCOPYDATASTRUCT pCopyDataStruct)\r
+#define MSG_WM_COPYDATA(func) \\r
+       if (uMsg == WM_COPYDATA) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = (LRESULT)func((HWND)wParam, (PCOPYDATASTRUCT)lParam); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnDestroy()\r
+#define MSG_WM_DESTROY(func) \\r
+       if (uMsg == WM_DESTROY) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func(); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnMove(CPoint ptPos)\r
+#define MSG_WM_MOVE(func) \\r
+       if (uMsg == WM_MOVE) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func(_WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnSize(UINT nType, CSize size)\r
+#define MSG_WM_SIZE(func) \\r
+       if (uMsg == WM_SIZE) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((UINT)wParam, _WTYPES_NS::CSize(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnActivate(UINT nState, BOOL bMinimized, CWindow wndOther)\r
+#define MSG_WM_ACTIVATE(func) \\r
+       if (uMsg == WM_ACTIVATE) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((UINT)LOWORD(wParam), (BOOL)HIWORD(wParam), (HWND)lParam); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnSetFocus(CWindow wndOld)\r
+#define MSG_WM_SETFOCUS(func) \\r
+       if (uMsg == WM_SETFOCUS) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((HWND)wParam); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnKillFocus(CWindow wndFocus)\r
+#define MSG_WM_KILLFOCUS(func) \\r
+       if (uMsg == WM_KILLFOCUS) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((HWND)wParam); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnEnable(BOOL bEnable)\r
+#define MSG_WM_ENABLE(func) \\r
+       if (uMsg == WM_ENABLE) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((BOOL)wParam); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnPaint(CDCHandle dc)\r
+#define MSG_WM_PAINT(func) \\r
+       if (uMsg == WM_PAINT) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((HDC)wParam); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnClose()\r
+#define MSG_WM_CLOSE(func) \\r
+       if (uMsg == WM_CLOSE) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func(); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// BOOL OnQueryEndSession(UINT nSource, UINT uLogOff)\r
+#define MSG_WM_QUERYENDSESSION(func) \\r
+       if (uMsg == WM_QUERYENDSESSION) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = (LRESULT)func((UINT)wParam, (UINT)lParam); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// BOOL OnQueryOpen()\r
+#define MSG_WM_QUERYOPEN(func) \\r
+       if (uMsg == WM_QUERYOPEN) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = (LRESULT)func(); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// BOOL OnEraseBkgnd(CDCHandle dc)\r
+#define MSG_WM_ERASEBKGND(func) \\r
+       if (uMsg == WM_ERASEBKGND) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = (LRESULT)func((HDC)wParam); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnSysColorChange()\r
+#define MSG_WM_SYSCOLORCHANGE(func) \\r
+       if (uMsg == WM_SYSCOLORCHANGE) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func(); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnEndSession(BOOL bEnding, UINT uLogOff)\r
+#define MSG_WM_ENDSESSION(func) \\r
+       if (uMsg == WM_ENDSESSION) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((BOOL)wParam, (UINT)lParam); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnShowWindow(BOOL bShow, UINT nStatus)\r
+#define MSG_WM_SHOWWINDOW(func) \\r
+       if (uMsg == WM_SHOWWINDOW) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((BOOL)wParam, (int)lParam); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// HBRUSH OnCtlColorEdit(CDCHandle dc, CEdit edit)\r
+#define MSG_WM_CTLCOLOREDIT(func) \\r
+       if (uMsg == WM_CTLCOLOREDIT) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = (LRESULT)func((HDC)wParam, (HWND)lParam); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// HBRUSH OnCtlColorListBox(CDCHandle dc, CListBox listBox)\r
+#define MSG_WM_CTLCOLORLISTBOX(func) \\r
+       if (uMsg == WM_CTLCOLORLISTBOX) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = (LRESULT)func((HDC)wParam, (HWND)lParam); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// HBRUSH OnCtlColorBtn(CDCHandle dc, CButton button)\r
+#define MSG_WM_CTLCOLORBTN(func) \\r
+       if (uMsg == WM_CTLCOLORBTN) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = (LRESULT)func((HDC)wParam, (HWND)lParam); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// HBRUSH OnCtlColorDlg(CDCHandle dc, CWindow wnd)\r
+#define MSG_WM_CTLCOLORDLG(func) \\r
+       if (uMsg == WM_CTLCOLORDLG) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = (LRESULT)func((HDC)wParam, (HWND)lParam); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// HBRUSH OnCtlColorScrollBar(CDCHandle dc, CScrollBar scrollBar)\r
+#define MSG_WM_CTLCOLORSCROLLBAR(func) \\r
+       if (uMsg == WM_CTLCOLORSCROLLBAR) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = (LRESULT)func((HDC)wParam, (HWND)lParam); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// HBRUSH OnCtlColorStatic(CDCHandle dc, CStatic wndStatic)\r
+#define MSG_WM_CTLCOLORSTATIC(func) \\r
+       if (uMsg == WM_CTLCOLORSTATIC) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = (LRESULT)func((HDC)wParam, (HWND)lParam); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnSettingChange(UINT uFlags, LPCTSTR lpszSection)\r
+#define MSG_WM_SETTINGCHANGE(func) \\r
+       if (uMsg == WM_SETTINGCHANGE) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((UINT)wParam, (LPCTSTR)lParam); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnDevModeChange(LPCTSTR lpDeviceName)\r
+#define MSG_WM_DEVMODECHANGE(func) \\r
+       if (uMsg == WM_DEVMODECHANGE) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((LPCTSTR)lParam); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnActivateApp(BOOL bActive, DWORD dwThreadID)\r
+#define MSG_WM_ACTIVATEAPP(func) \\r
+       if (uMsg == WM_ACTIVATEAPP) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((BOOL)wParam, (DWORD)lParam); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnFontChange()\r
+#define MSG_WM_FONTCHANGE(func) \\r
+       if (uMsg == WM_FONTCHANGE) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func(); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnTimeChange()\r
+#define MSG_WM_TIMECHANGE(func) \\r
+       if (uMsg == WM_TIMECHANGE) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func(); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnCancelMode()\r
+#define MSG_WM_CANCELMODE(func) \\r
+       if (uMsg == WM_CANCELMODE) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func(); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// BOOL OnSetCursor(CWindow wnd, UINT nHitTest, UINT message)\r
+#define MSG_WM_SETCURSOR(func) \\r
+       if (uMsg == WM_SETCURSOR) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = (LRESULT)func((HWND)wParam, (UINT)LOWORD(lParam), (UINT)HIWORD(lParam)); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// int OnMouseActivate(CWindow wndTopLevel, UINT nHitTest, UINT message)\r
+#define MSG_WM_MOUSEACTIVATE(func) \\r
+       if (uMsg == WM_MOUSEACTIVATE) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = (LRESULT)func((HWND)wParam, (UINT)LOWORD(lParam), (UINT)HIWORD(lParam)); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnChildActivate()\r
+#define MSG_WM_CHILDACTIVATE(func) \\r
+       if (uMsg == WM_CHILDACTIVATE) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func(); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnGetMinMaxInfo(LPMINMAXINFO lpMMI)\r
+#define MSG_WM_GETMINMAXINFO(func) \\r
+       if (uMsg == WM_GETMINMAXINFO) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((LPMINMAXINFO)lParam); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnIconEraseBkgnd(CDCHandle dc)\r
+#define MSG_WM_ICONERASEBKGND(func) \\r
+       if (uMsg == WM_ICONERASEBKGND) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((HDC)wParam); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnSpoolerStatus(UINT nStatus, UINT nJobs)\r
+#define MSG_WM_SPOOLERSTATUS(func) \\r
+       if (uMsg == WM_SPOOLERSTATUS) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((UINT)wParam, (UINT)LOWORD(lParam)); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)\r
+#define MSG_WM_DRAWITEM(func) \\r
+       if (uMsg == WM_DRAWITEM) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((UINT)wParam, (LPDRAWITEMSTRUCT)lParam); \\r
+               lResult = TRUE; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct)\r
+#define MSG_WM_MEASUREITEM(func) \\r
+       if (uMsg == WM_MEASUREITEM) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((UINT)wParam, (LPMEASUREITEMSTRUCT)lParam); \\r
+               lResult = TRUE; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnDeleteItem(int nIDCtl, LPDELETEITEMSTRUCT lpDeleteItemStruct)\r
+#define MSG_WM_DELETEITEM(func) \\r
+       if (uMsg == WM_DELETEITEM) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((UINT)wParam, (LPDELETEITEMSTRUCT)lParam); \\r
+               lResult = TRUE; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+//int OnCharToItem(UINT nChar, UINT nIndex, CListBox listBox)\r
+#define MSG_WM_CHARTOITEM(func) \\r
+       if (uMsg == WM_CHARTOITEM) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = (LRESULT)func((UINT)LOWORD(wParam), (UINT)HIWORD(wParam), (HWND)lParam); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// int OnVKeyToItem(UINT nKey, UINT nIndex, CListBox listBox)\r
+#define MSG_WM_VKEYTOITEM(func) \\r
+       if (uMsg == WM_VKEYTOITEM) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = (LRESULT)func((UINT)LOWORD(wParam), (UINT)HIWORD(wParam), (HWND)lParam); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// HCURSOR OnQueryDragIcon()\r
+#define MSG_WM_QUERYDRAGICON(func) \\r
+       if (uMsg == WM_QUERYDRAGICON) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = (LRESULT)func(); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// int OnCompareItem(int nIDCtl, LPCOMPAREITEMSTRUCT lpCompareItemStruct)\r
+#define MSG_WM_COMPAREITEM(func) \\r
+       if (uMsg == WM_COMPAREITEM) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = (LRESULT)func((UINT)wParam, (LPCOMPAREITEMSTRUCT)lParam); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnCompacting(UINT nCpuTime)\r
+#define MSG_WM_COMPACTING(func) \\r
+       if (uMsg == WM_COMPACTING) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((UINT)wParam); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// BOOL OnNcCreate(LPCREATESTRUCT lpCreateStruct)\r
+#define MSG_WM_NCCREATE(func) \\r
+       if (uMsg == WM_NCCREATE) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = (LRESULT)func((LPCREATESTRUCT)lParam); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnNcDestroy()\r
+#define MSG_WM_NCDESTROY(func) \\r
+       if (uMsg == WM_NCDESTROY) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func(); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// LRESULT OnNcCalcSize(BOOL bCalcValidRects, LPARAM lParam)\r
+#define MSG_WM_NCCALCSIZE(func) \\r
+       if (uMsg == WM_NCCALCSIZE) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = func((BOOL)wParam, lParam); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// UINT OnNcHitTest(CPoint point)\r
+#define MSG_WM_NCHITTEST(func) \\r
+       if (uMsg == WM_NCHITTEST) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = (LRESULT)func(_WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnNcPaint(CRgn rgn)\r
+#define MSG_WM_NCPAINT(func) \\r
+       if (uMsg == WM_NCPAINT) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((HRGN)wParam); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// BOOL OnNcActivate(BOOL bActive)\r
+#define MSG_WM_NCACTIVATE(func) \\r
+       if (uMsg == WM_NCACTIVATE) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = (LRESULT)func((BOOL)wParam); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// UINT OnGetDlgCode(LPMSG lpMsg)\r
+#define MSG_WM_GETDLGCODE(func) \\r
+       if (uMsg == WM_GETDLGCODE) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = (LRESULT)func((LPMSG)lParam); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnNcMouseMove(UINT nHitTest, CPoint point)\r
+#define MSG_WM_NCMOUSEMOVE(func) \\r
+       if (uMsg == WM_NCMOUSEMOVE) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnNcLButtonDown(UINT nHitTest, CPoint point)\r
+#define MSG_WM_NCLBUTTONDOWN(func) \\r
+       if (uMsg == WM_NCLBUTTONDOWN) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnNcLButtonUp(UINT nHitTest, CPoint point)\r
+#define MSG_WM_NCLBUTTONUP(func) \\r
+       if (uMsg == WM_NCLBUTTONUP) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnNcLButtonDblClk(UINT nHitTest, CPoint point)\r
+#define MSG_WM_NCLBUTTONDBLCLK(func) \\r
+       if (uMsg == WM_NCLBUTTONDBLCLK) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnNcRButtonDown(UINT nHitTest, CPoint point)\r
+#define MSG_WM_NCRBUTTONDOWN(func) \\r
+       if (uMsg == WM_NCRBUTTONDOWN) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnNcRButtonUp(UINT nHitTest, CPoint point)\r
+#define MSG_WM_NCRBUTTONUP(func) \\r
+       if (uMsg == WM_NCRBUTTONUP) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnNcRButtonDblClk(UINT nHitTest, CPoint point)\r
+#define MSG_WM_NCRBUTTONDBLCLK(func) \\r
+       if (uMsg == WM_NCRBUTTONDBLCLK) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnNcMButtonDown(UINT nHitTest, CPoint point)\r
+#define MSG_WM_NCMBUTTONDOWN(func) \\r
+       if (uMsg == WM_NCMBUTTONDOWN) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnNcMButtonUp(UINT nHitTest, CPoint point)\r
+#define MSG_WM_NCMBUTTONUP(func) \\r
+       if (uMsg == WM_NCMBUTTONUP) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnNcMButtonDblClk(UINT nHitTest, CPoint point)\r
+#define MSG_WM_NCMBUTTONDBLCLK(func) \\r
+       if (uMsg == WM_NCMBUTTONDBLCLK) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)\r
+#define MSG_WM_KEYDOWN(func) \\r
+       if (uMsg == WM_KEYDOWN) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((TCHAR)wParam, (UINT)lParam & 0xFFFF, (UINT)((lParam & 0xFFFF0000) >> 16)); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)\r
+#define MSG_WM_KEYUP(func) \\r
+       if (uMsg == WM_KEYUP) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((TCHAR)wParam, (UINT)lParam & 0xFFFF, (UINT)((lParam & 0xFFFF0000) >> 16)); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)\r
+#define MSG_WM_CHAR(func) \\r
+       if (uMsg == WM_CHAR) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((TCHAR)wParam, (UINT)lParam & 0xFFFF, (UINT)((lParam & 0xFFFF0000) >> 16)); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnDeadChar(UINT nChar, UINT nRepCnt, UINT nFlags)\r
+#define MSG_WM_DEADCHAR(func) \\r
+       if (uMsg == WM_DEADCHAR) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((TCHAR)wParam, (UINT)lParam & 0xFFFF, (UINT)((lParam & 0xFFFF0000) >> 16)); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnSysKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)\r
+#define MSG_WM_SYSKEYDOWN(func) \\r
+       if (uMsg == WM_SYSKEYDOWN) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((TCHAR)wParam, (UINT)lParam & 0xFFFF, (UINT)((lParam & 0xFFFF0000) >> 16)); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnSysKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)\r
+#define MSG_WM_SYSKEYUP(func) \\r
+       if (uMsg == WM_SYSKEYUP) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((TCHAR)wParam, (UINT)lParam & 0xFFFF, (UINT)((lParam & 0xFFFF0000) >> 16)); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnSysChar(UINT nChar, UINT nRepCnt, UINT nFlags)\r
+#define MSG_WM_SYSCHAR(func) \\r
+       if (uMsg == WM_SYSCHAR) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((TCHAR)wParam, (UINT)lParam & 0xFFFF, (UINT)((lParam & 0xFFFF0000) >> 16)); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnSysDeadChar(UINT nChar, UINT nRepCnt, UINT nFlags)\r
+#define MSG_WM_SYSDEADCHAR(func) \\r
+       if (uMsg == WM_SYSDEADCHAR) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((TCHAR)wParam, (UINT)lParam & 0xFFFF, (UINT)((lParam & 0xFFFF0000) >> 16)); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnSysCommand(UINT nID, LPARAM lParam)\r
+#define MSG_WM_SYSCOMMAND(func) \\r
+       if (uMsg == WM_SYSCOMMAND) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnTCard(UINT idAction, DWORD dwActionData)\r
+#define MSG_WM_TCARD(func) \\r
+       if (uMsg == WM_TCARD) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((UINT)wParam, (DWORD)lParam); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnTimer(UINT_PTR nIDEvent)\r
+#define MSG_WM_TIMER(func) \\r
+       if (uMsg == WM_TIMER) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((UINT_PTR)wParam); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar pScrollBar)\r
+#define MSG_WM_HSCROLL(func) \\r
+       if (uMsg == WM_HSCROLL) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((int)LOWORD(wParam), (short)HIWORD(wParam), (HWND)lParam); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar pScrollBar)\r
+#define MSG_WM_VSCROLL(func) \\r
+       if (uMsg == WM_VSCROLL) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((int)LOWORD(wParam), (short)HIWORD(wParam), (HWND)lParam); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnInitMenu(CMenu menu)\r
+#define MSG_WM_INITMENU(func) \\r
+       if (uMsg == WM_INITMENU) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((HMENU)wParam); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnInitMenuPopup(CMenu menuPopup, UINT nIndex, BOOL bSysMenu)\r
+#define MSG_WM_INITMENUPOPUP(func) \\r
+       if (uMsg == WM_INITMENUPOPUP) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((HMENU)wParam, (UINT)LOWORD(lParam), (BOOL)HIWORD(lParam)); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnMenuSelect(UINT nItemID, UINT nFlags, CMenu menu)\r
+#define MSG_WM_MENUSELECT(func) \\r
+       if (uMsg == WM_MENUSELECT) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((UINT)LOWORD(wParam), (UINT)HIWORD(wParam), (HMENU)lParam); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// LRESULT OnMenuChar(UINT nChar, UINT nFlags, CMenu menu)\r
+#define MSG_WM_MENUCHAR(func) \\r
+       if (uMsg == WM_MENUCHAR) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = func((TCHAR)LOWORD(wParam), (UINT)HIWORD(wParam), (HMENU)lParam); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// LRESULT OnNotify(int idCtrl, LPNMHDR pnmh)\r
+#define MSG_WM_NOTIFY(func) \\r
+       if (uMsg == WM_NOTIFY) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = func((int)wParam, (LPNMHDR)lParam); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnEnterIdle(UINT nWhy, CWindow wndWho)\r
+#define MSG_WM_ENTERIDLE(func) \\r
+       if (uMsg == WM_ENTERIDLE) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((UINT)wParam, (HWND)lParam); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnMouseMove(UINT nFlags, CPoint point)\r
+#define MSG_WM_MOUSEMOVE(func) \\r
+       if (uMsg == WM_MOUSEMOVE) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)\r
+#define MSG_WM_MOUSEWHEEL(func) \\r
+       if (uMsg == WM_MOUSEWHEEL) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = (LRESULT)func((UINT)LOWORD(wParam), (short)HIWORD(wParam), _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnLButtonDown(UINT nFlags, CPoint point)\r
+#define MSG_WM_LBUTTONDOWN(func) \\r
+       if (uMsg == WM_LBUTTONDOWN) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnLButtonUp(UINT nFlags, CPoint point)\r
+#define MSG_WM_LBUTTONUP(func) \\r
+       if (uMsg == WM_LBUTTONUP) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnLButtonDblClk(UINT nFlags, CPoint point)\r
+#define MSG_WM_LBUTTONDBLCLK(func) \\r
+       if (uMsg == WM_LBUTTONDBLCLK) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnRButtonDown(UINT nFlags, CPoint point)\r
+#define MSG_WM_RBUTTONDOWN(func) \\r
+       if (uMsg == WM_RBUTTONDOWN) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnRButtonUp(UINT nFlags, CPoint point)\r
+#define MSG_WM_RBUTTONUP(func) \\r
+       if (uMsg == WM_RBUTTONUP) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnRButtonDblClk(UINT nFlags, CPoint point)\r
+#define MSG_WM_RBUTTONDBLCLK(func) \\r
+       if (uMsg == WM_RBUTTONDBLCLK) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnMButtonDown(UINT nFlags, CPoint point)\r
+#define MSG_WM_MBUTTONDOWN(func) \\r
+       if (uMsg == WM_MBUTTONDOWN) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnMButtonUp(UINT nFlags, CPoint point)\r
+#define MSG_WM_MBUTTONUP(func) \\r
+       if (uMsg == WM_MBUTTONUP) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnMButtonDblClk(UINT nFlags, CPoint point)\r
+#define MSG_WM_MBUTTONDBLCLK(func) \\r
+       if (uMsg == WM_MBUTTONDBLCLK) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnParentNotify(UINT message, UINT nChildID, LPARAM lParam)\r
+#define MSG_WM_PARENTNOTIFY(func) \\r
+       if (uMsg == WM_PARENTNOTIFY) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((UINT)LOWORD(wParam), (UINT)HIWORD(wParam), lParam); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnMDIActivate(CWindow wndActivate, CWindow wndDeactivate)\r
+#define MSG_WM_MDIACTIVATE(func) \\r
+       if (uMsg == WM_MDIACTIVATE) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((HWND)wParam, (HWND)lParam); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnRenderFormat(UINT nFormat)\r
+#define MSG_WM_RENDERFORMAT(func) \\r
+       if (uMsg == WM_RENDERFORMAT) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((UINT)wParam); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnRenderAllFormats()\r
+#define MSG_WM_RENDERALLFORMATS(func) \\r
+       if (uMsg == WM_RENDERALLFORMATS) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func(); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnDestroyClipboard()\r
+#define MSG_WM_DESTROYCLIPBOARD(func) \\r
+       if (uMsg == WM_DESTROYCLIPBOARD) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func(); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnDrawClipboard()\r
+#define MSG_WM_DRAWCLIPBOARD(func) \\r
+       if (uMsg == WM_DRAWCLIPBOARD) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func(); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnPaintClipboard(CWindow wndViewer, const LPPAINTSTRUCT lpPaintStruct)\r
+#define MSG_WM_PAINTCLIPBOARD(func) \\r
+       if (uMsg == WM_PAINTCLIPBOARD) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((HWND)wParam, (const LPPAINTSTRUCT)::GlobalLock((HGLOBAL)lParam)); \\r
+               ::GlobalUnlock((HGLOBAL)lParam); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnVScrollClipboard(CWindow wndViewer, UINT nSBCode, UINT nPos)\r
+#define MSG_WM_VSCROLLCLIPBOARD(func) \\r
+       if (uMsg == WM_VSCROLLCLIPBOARD) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((HWND)wParam, (UINT)LOWORD(lParam), (UINT)HIWORD(lParam)); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnContextMenu(CWindow wnd, CPoint point)\r
+#define MSG_WM_CONTEXTMENU(func) \\r
+       if (uMsg == WM_CONTEXTMENU) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((HWND)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnSizeClipboard(CWindow wndViewer, const LPRECT lpRect)\r
+#define MSG_WM_SIZECLIPBOARD(func) \\r
+       if (uMsg == WM_SIZECLIPBOARD) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((HWND)wParam, (const LPRECT)::GlobalLock((HGLOBAL)lParam)); \\r
+               ::GlobalUnlock((HGLOBAL)lParam); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnAskCbFormatName(UINT nMaxCount, LPTSTR lpszString)\r
+#define MSG_WM_ASKCBFORMATNAME(func) \\r
+       if (uMsg == WM_ASKCBFORMATNAME) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((DWORD)wParam, (LPTSTR)lParam); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnChangeCbChain(CWindow wndRemove, CWindow wndAfter)\r
+#define MSG_WM_CHANGECBCHAIN(func) \\r
+       if (uMsg == WM_CHANGECBCHAIN) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((HWND)wParam, (HWND)lParam); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnHScrollClipboard(CWindow wndViewer, UINT nSBCode, UINT nPos)\r
+#define MSG_WM_HSCROLLCLIPBOARD(func) \\r
+       if (uMsg == WM_HSCROLLCLIPBOARD) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((HWND)wParam, (UINT)LOWORD(lParam), (UINT)HIWORD(lParam)); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// BOOL OnQueryNewPalette()\r
+#define MSG_WM_QUERYNEWPALETTE(func) \\r
+       if (uMsg == WM_QUERYNEWPALETTE) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = (LRESULT)func(); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnPaletteChanged(CWindow wndFocus)\r
+#define MSG_WM_PALETTECHANGED(func) \\r
+       if (uMsg == WM_PALETTECHANGED) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((HWND)wParam); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnPaletteIsChanging(CWindow wndPalChg)\r
+#define MSG_WM_PALETTEISCHANGING(func) \\r
+       if (uMsg == WM_PALETTEISCHANGING) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((HWND)wParam); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnDropFiles(HDROP hDropInfo)\r
+#define MSG_WM_DROPFILES(func) \\r
+       if (uMsg == WM_DROPFILES) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((HDROP)wParam); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnWindowPosChanging(LPWINDOWPOS lpWndPos)\r
+#define MSG_WM_WINDOWPOSCHANGING(func) \\r
+       if (uMsg == WM_WINDOWPOSCHANGING) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((LPWINDOWPOS)lParam); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnWindowPosChanged(LPWINDOWPOS lpWndPos)\r
+#define MSG_WM_WINDOWPOSCHANGED(func) \\r
+       if (uMsg == WM_WINDOWPOSCHANGED) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((LPWINDOWPOS)lParam); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnExitMenuLoop(BOOL fIsTrackPopupMenu)\r
+#define MSG_WM_EXITMENULOOP(func) \\r
+       if (uMsg == WM_EXITMENULOOP) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((BOOL)wParam); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnEnterMenuLoop(BOOL fIsTrackPopupMenu)\r
+#define MSG_WM_ENTERMENULOOP(func) \\r
+       if (uMsg == WM_ENTERMENULOOP) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((BOOL)wParam); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnStyleChanged(int nStyleType, LPSTYLESTRUCT lpStyleStruct)\r
+#define MSG_WM_STYLECHANGED(func) \\r
+       if (uMsg == WM_STYLECHANGED) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((UINT)wParam, (LPSTYLESTRUCT)lParam); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnStyleChanging(int nStyleType, LPSTYLESTRUCT lpStyleStruct)\r
+#define MSG_WM_STYLECHANGING(func) \\r
+       if (uMsg == WM_STYLECHANGING) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((UINT)wParam, (LPSTYLESTRUCT)lParam); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnSizing(UINT fwSide, LPRECT pRect)\r
+#define MSG_WM_SIZING(func) \\r
+       if (uMsg == WM_SIZING) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((UINT)wParam, (LPRECT)lParam); \\r
+               lResult = TRUE; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnMoving(UINT fwSide, LPRECT pRect)\r
+#define MSG_WM_MOVING(func) \\r
+       if (uMsg == WM_MOVING) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((UINT)wParam, (LPRECT)lParam); \\r
+               lResult = TRUE; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnCaptureChanged(CWindow wnd)\r
+#define MSG_WM_CAPTURECHANGED(func) \\r
+       if (uMsg == WM_CAPTURECHANGED) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((HWND)lParam); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// BOOL OnDeviceChange(UINT nEventType, DWORD dwData)\r
+#define MSG_WM_DEVICECHANGE(func) \\r
+       if (uMsg == WM_DEVICECHANGE) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = (LRESULT)func((UINT)wParam, (DWORD)lParam); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnCommand(UINT uNotifyCode, int nID, CWindow wndCtl)\r
+#define MSG_WM_COMMAND(func) \\r
+       if (uMsg == WM_COMMAND) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((UINT)HIWORD(wParam), (int)LOWORD(wParam), (HWND)lParam); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnDisplayChange(UINT uBitsPerPixel, CSize sizeScreen)\r
+#define MSG_WM_DISPLAYCHANGE(func) \\r
+       if (uMsg == WM_DISPLAYCHANGE) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((UINT)wParam, _WTYPES_NS::CSize(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnEnterSizeMove()\r
+#define MSG_WM_ENTERSIZEMOVE(func) \\r
+       if (uMsg == WM_ENTERSIZEMOVE) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func(); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnExitSizeMove()\r
+#define MSG_WM_EXITSIZEMOVE(func) \\r
+       if (uMsg == WM_EXITSIZEMOVE) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func(); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// HFONT OnGetFont()\r
+#define MSG_WM_GETFONT(func) \\r
+       if (uMsg == WM_GETFONT) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = (LRESULT)func(); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// LRESULT OnGetHotKey()\r
+#define MSG_WM_GETHOTKEY(func) \\r
+       if (uMsg == WM_GETHOTKEY) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = func(); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// HICON OnGetIcon()\r
+#define MSG_WM_GETICON(func) \\r
+       if (uMsg == WM_GETICON) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = (LRESULT)func((UINT)wParam); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// int OnGetText(int cchTextMax, LPTSTR lpszText)\r
+#define MSG_WM_GETTEXT(func) \\r
+       if (uMsg == WM_GETTEXT) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = (LRESULT)func((int)wParam, (LPTSTR)lParam); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// int OnGetTextLength()\r
+#define MSG_WM_GETTEXTLENGTH(func) \\r
+       if (uMsg == WM_GETTEXTLENGTH) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = (LRESULT)func(); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnHelp(LPHELPINFO lpHelpInfo)\r
+#define MSG_WM_HELP(func) \\r
+       if (uMsg == WM_HELP) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((LPHELPINFO)lParam); \\r
+               lResult = TRUE; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnHotKey(int nHotKeyID, UINT uModifiers, UINT uVirtKey)\r
+#define MSG_WM_HOTKEY(func) \\r
+       if (uMsg == WM_HOTKEY) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((int)wParam, (UINT)LOWORD(lParam), (UINT)HIWORD(lParam)); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnInputLangChange(DWORD dwCharSet, HKL hKbdLayout)\r
+#define MSG_WM_INPUTLANGCHANGE(func) \\r
+       if (uMsg == WM_INPUTLANGCHANGE) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((DWORD)wParam, (HKL)lParam); \\r
+               lResult = TRUE; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnInputLangChangeRequest(BOOL bSysCharSet, HKL hKbdLayout)\r
+#define MSG_WM_INPUTLANGCHANGEREQUEST(func) \\r
+       if (uMsg == WM_INPUTLANGCHANGEREQUEST) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((BOOL)wParam, (HKL)lParam); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnNextDlgCtl(BOOL bHandle, WPARAM wCtlFocus)\r
+#define MSG_WM_NEXTDLGCTL(func) \\r
+       if (uMsg == WM_NEXTDLGCTL) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((BOOL)LOWORD(lParam), wParam); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnNextMenu(int nVirtKey, LPMDINEXTMENU lpMdiNextMenu)\r
+#define MSG_WM_NEXTMENU(func) \\r
+       if (uMsg == WM_NEXTMENU) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((int)wParam, (LPMDINEXTMENU)lParam); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// int OnNotifyFormat(CWindow wndFrom, int nCommand)\r
+#define MSG_WM_NOTIFYFORMAT(func) \\r
+       if (uMsg == WM_NOTIFYFORMAT) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = (LRESULT)func((HWND)wParam, (int)lParam); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// BOOL OnPowerBroadcast(DWORD dwPowerEvent, DWORD dwData)\r
+#define MSG_WM_POWERBROADCAST(func) \\r
+       if (uMsg == WM_POWERBROADCAST) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = (LRESULT)func((DWORD)wParam, (DWORD)lParam); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnPrint(CDCHandle dc, UINT uFlags)\r
+#define MSG_WM_PRINT(func) \\r
+       if (uMsg == WM_PRINT) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((HDC)wParam, (UINT)lParam); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnPrintClient(CDCHandle dc, UINT uFlags)\r
+#define MSG_WM_PRINTCLIENT(func) \\r
+       if (uMsg == WM_PRINTCLIENT) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((HDC)wParam, (UINT)lParam); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnRasDialEvent(RASCONNSTATE rasconnstate, DWORD dwError)\r
+#define MSG_WM_RASDIALEVENT(func) \\r
+       if (uMsg == WM_RASDIALEVENT) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((RASCONNSTATE)wParam, (DWORD)lParam); \\r
+               lResult = TRUE; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnSetFont(CFont font, BOOL bRedraw)\r
+#define MSG_WM_SETFONT(func) \\r
+       if (uMsg == WM_SETFONT) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((HFONT)wParam, (BOOL)LOWORD(lParam)); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// int OnSetHotKey(int nVirtKey, UINT uFlags)\r
+#define MSG_WM_SETHOTKEY(func) \\r
+       if (uMsg == WM_SETHOTKEY) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = (LRESULT)func((int)LOBYTE(LOWORD(wParam)), (UINT)HIBYTE(LOWORD(wParam))); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// HICON OnSetIcon(UINT uType, HICON hIcon)\r
+#define MSG_WM_SETICON(func) \\r
+       if (uMsg == WM_SETICON) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = (LRESULT)func((UINT)wParam, (HICON)lParam); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnSetRedraw(BOOL bRedraw)\r
+#define MSG_WM_SETREDRAW(func) \\r
+       if (uMsg == WM_SETREDRAW) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((BOOL)wParam); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// int OnSetText(LPCTSTR lpstrText)\r
+#define MSG_WM_SETTEXT(func) \\r
+       if (uMsg == WM_SETTEXT) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = (LRESULT)func((LPCTSTR)lParam); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnUserChanged()\r
+#define MSG_WM_USERCHANGED(func) \\r
+       if (uMsg == WM_USERCHANGED) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func(); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// New NT4 & NT5 messages\r
+\r
+#if(_WIN32_WINNT >= 0x0400)\r
+\r
+// void OnMouseHover(WPARAM wParam, CPoint ptPos)\r
+#define MSG_WM_MOUSEHOVER(func) \\r
+       if (uMsg == WM_MOUSEHOVER) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func(wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnMouseLeave()\r
+#define MSG_WM_MOUSELEAVE(func) \\r
+       if (uMsg == WM_MOUSELEAVE) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func(); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+#endif /* _WIN32_WINNT >= 0x0400 */\r
+\r
+#if(WINVER >= 0x0500)\r
+\r
+// void OnMenuRButtonUp(WPARAM wParam, CMenu menu)\r
+#define MSG_WM_MENURBUTTONUP(func) \\r
+       if (uMsg == WM_MENURBUTTONUP) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func(wParam, (HMENU)lParam); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// LRESULT OnMenuDrag(WPARAM wParam, CMenu menu)\r
+#define MSG_WM_MENUDRAG(func) \\r
+       if (uMsg == WM_MENUDRAG) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = func(wParam, (HMENU)lParam); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// LRESULT OnMenuGetObject(PMENUGETOBJECTINFO info)\r
+#define MSG_WM_MENUGETOBJECT(func) \\r
+       if (uMsg == WM_MENUGETOBJECT) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = func((PMENUGETOBJECTINFO)lParam); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnUnInitMenuPopup(UINT nID, CMenu menu)\r
+#define MSG_WM_UNINITMENUPOPUP(func) \\r
+       if (uMsg == WM_UNINITMENUPOPUP) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((UINT)HIWORD(lParam), (HMENU)wParam); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnMenuCommand(WPARAM nIndex, CMenu menu)\r
+#define MSG_WM_MENUCOMMAND(func) \\r
+       if (uMsg == WM_MENUCOMMAND) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func(wParam, (HMENU)lParam); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+#endif /* WINVER >= 0x0500 */\r
+\r
+#if(_WIN32_WINNT >= 0x0500)\r
+\r
+// BOOL OnAppCommand(CWindow wndFocus, short cmd, WORD uDevice, int dwKeys)\r
+#define MSG_WM_APPCOMMAND(func) \\r
+       if (uMsg == WM_APPCOMMAND) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = (LRESULT)func((HWND)wParam, GET_APPCOMMAND_LPARAM(lParam), GET_DEVICE_LPARAM(lParam), GET_KEYSTATE_LPARAM(lParam)); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnNCXButtonDown(int fwButton, short nHittest, CPoint ptPos)\r
+#define MSG_WM_NCXBUTTONDOWN(func) \\r
+       if (uMsg == WM_NCXBUTTONDOWN) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func(GET_XBUTTON_WPARAM(wParam), GET_NCHITTEST_WPARAM(wParam), _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnNCXButtonUp(int fwButton, short nHittest, CPoint ptPos)\r
+#define MSG_WM_NCXBUTTONUP(func) \\r
+       if (uMsg == WM_NCXBUTTONUP) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func(GET_XBUTTON_WPARAM(wParam), GET_NCHITTEST_WPARAM(wParam), _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnNCXButtonDblClk(int fwButton, short nHittest, CPoint ptPos)\r
+#define MSG_WM_NCXBUTTONDBLCLK(func) \\r
+       if (uMsg == WM_NCXBUTTONDBLCLK) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func(GET_XBUTTON_WPARAM(wParam), GET_NCHITTEST_WPARAM(wParam), _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnXButtonDown(int fwButton, int dwKeys, CPoint ptPos)\r
+#define MSG_WM_XBUTTONDOWN(func) \\r
+       if (uMsg == WM_XBUTTONDOWN) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func(GET_XBUTTON_WPARAM(wParam), GET_KEYSTATE_WPARAM(wParam), _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnXButtonUp(int fwButton, int dwKeys, CPoint ptPos)\r
+#define MSG_WM_XBUTTONUP(func) \\r
+       if (uMsg == WM_XBUTTONUP) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func(GET_XBUTTON_WPARAM(wParam), GET_KEYSTATE_WPARAM(wParam), _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnXButtonDblClk(int fwButton, int dwKeys, CPoint ptPos)\r
+#define MSG_WM_XBUTTONDBLCLK(func) \\r
+       if (uMsg == WM_XBUTTONDBLCLK) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func(GET_XBUTTON_WPARAM(wParam), GET_KEYSTATE_WPARAM(wParam), _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnChangeUIState(WORD nAction, WORD nState)\r
+#define MSG_WM_CHANGEUISTATE(func) \\r
+       if (uMsg == WM_CHANGEUISTATE) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func(LOWORD(wParam), HIWORD(wParam)); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnUpdateUIState(WORD nAction, WORD nState)\r
+#define MSG_WM_UPDATEUISTATE(func) \\r
+       if (uMsg == WM_UPDATEUISTATE) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func(LOWORD(wParam), HIWORD(wParam)); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// LRESULT OnQueryUIState()\r
+#define MSG_WM_QUERYUISTATE(func) \\r
+       if (uMsg == WM_QUERYUISTATE) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = func(); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+#endif // (_WIN32_WINNT >= 0x0500)\r
+\r
+#if(_WIN32_WINNT >= 0x0501)\r
+\r
+// void OnInput(WPARAM RawInputCode, HRAWINPUT hRawInput)\r
+#define MSG_WM_INPUT(func) \\r
+       if (uMsg == WM_INPUT) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func(GET_RAWINPUT_CODE_WPARAM(wParam), (HRAWINPUT)lParam); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnUniChar(TCHAR nChar, UINT nRepCnt, UINT nFlags)\r
+#define MSG_WM_UNICHAR(func) \\r
+       if (uMsg == WM_UNICHAR) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((TCHAR)wParam, (UINT)lParam & 0xFFFF, (UINT)((lParam & 0xFFFF0000) >> 16)); \\r
+               if(IsMsgHandled()) \\r
+               { \\r
+                       lResult = (wParam == UNICODE_NOCHAR) ? TRUE : FALSE; \\r
+                       return TRUE; \\r
+               } \\r
+       }\r
+\r
+// void OnWTSSessionChange(WPARAM nStatusCode, PWTSSESSION_NOTIFICATION nSessionID)\r
+#define MSG_WM_WTSSESSION_CHANGE(func) \\r
+       if (uMsg == WM_WTSSESSION_CHANGE) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func(wParam, (PWTSSESSION_NOTIFICATION)lParam); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// OnThemeChanged()\r
+#define MSG_WM_THEMECHANGED(func) \\r
+       if (uMsg == WM_THEMECHANGED) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func(); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+#endif /* _WIN32_WINNT >= 0x0501 */\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// ATL defined messages\r
+\r
+// BOOL OnForwardMsg(LPMSG Msg, DWORD nUserData)\r
+#define MSG_WM_FORWARDMSG(func) \\r
+       if (uMsg == WM_FORWARDMSG) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = (LRESULT)func((LPMSG)lParam, (DWORD)wParam); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Dialog specific messages\r
+\r
+// LRESULT OnDMGetDefID()\r
+#define MSG_DM_GETDEFID(func) \\r
+       if (uMsg == DM_GETDEFID) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = func(); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnDMSetDefID(UINT DefID)\r
+#define MSG_DM_SETDEFID(func) \\r
+       if (uMsg == DM_SETDEFID) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((UINT)wParam); \\r
+               lResult = TRUE; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnDMReposition()\r
+#define MSG_DM_REPOSITION(func) \\r
+       if (uMsg == DM_REPOSITION) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func(); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Reflected messages\r
+\r
+// void OnReflectedCommand(UINT uNotifyCode, int nID, CWindow wndCtl)\r
+#define MSG_OCM_COMMAND(func) \\r
+       if (uMsg == OCM_COMMAND) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((UINT)HIWORD(wParam), (int)LOWORD(wParam), (HWND)lParam); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// LRESULT OnReflectedNotify(int idCtrl, LPNMHDR pnmh)\r
+#define MSG_OCM_NOTIFY(func) \\r
+       if (uMsg == OCM_NOTIFY) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = func((int)wParam, (LPNMHDR)lParam); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnReflectedParentNotify(UINT message, UINT nChildID, LPARAM lParam)\r
+#define MSG_OCM_PARENTNOTIFY(func) \\r
+       if (uMsg == OCM_PARENTNOTIFY) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((UINT)LOWORD(wParam), (UINT)HIWORD(wParam), lParam); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnReflectedDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)\r
+#define MSG_OCM_DRAWITEM(func) \\r
+       if (uMsg == OCM_DRAWITEM) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((UINT)wParam, (LPDRAWITEMSTRUCT)lParam); \\r
+               lResult = TRUE; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnReflectedMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct)\r
+#define MSG_OCM_MEASUREITEM(func) \\r
+       if (uMsg == OCM_MEASUREITEM) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((UINT)wParam, (LPMEASUREITEMSTRUCT)lParam); \\r
+               lResult = TRUE; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// int OnReflectedCompareItem(int nIDCtl, LPCOMPAREITEMSTRUCT lpCompareItemStruct)\r
+#define MSG_OCM_COMPAREITEM(func) \\r
+       if (uMsg == OCM_COMPAREITEM) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = (LRESULT)func((UINT)wParam, (LPCOMPAREITEMSTRUCT)lParam); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnReflectedDeleteItem(int nIDCtl, LPDELETEITEMSTRUCT lpDeleteItemStruct)\r
+#define MSG_OCM_DELETEITEM(func) \\r
+       if (uMsg == OCM_DELETEITEM) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((UINT)wParam, (LPDELETEITEMSTRUCT)lParam); \\r
+               lResult = TRUE; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// int OnReflectedVKeyToItem(UINT nKey, UINT nIndex, CListBox listBox)\r
+#define MSG_OCM_VKEYTOITEM(func) \\r
+       if (uMsg == OCM_VKEYTOITEM) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = (LRESULT)func((UINT)LOWORD(wParam), (UINT)HIWORD(wParam), (HWND)lParam); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+//int OnReflectedCharToItem(UINT nChar, UINT nIndex, CListBox listBox)\r
+#define MSG_OCM_CHARTOITEM(func) \\r
+       if (uMsg == OCM_CHARTOITEM) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = (LRESULT)func((UINT)LOWORD(wParam), (UINT)HIWORD(wParam), (HWND)lParam); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnReflectedHScroll(UINT nSBCode, UINT nPos, CScrollBar pScrollBar)\r
+#define MSG_OCM_HSCROLL(func) \\r
+       if (uMsg == OCM_HSCROLL) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((int)LOWORD(wParam), (short)HIWORD(wParam), (HWND)lParam); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnReflectedVScroll(UINT nSBCode, UINT nPos, CScrollBar pScrollBar)\r
+#define MSG_OCM_VSCROLL(func) \\r
+       if (uMsg == OCM_VSCROLL) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((int)LOWORD(wParam), (short)HIWORD(wParam), (HWND)lParam); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// HBRUSH OnReflectedCtlColorEdit(CDCHandle dc, CEdit edit)\r
+#define MSG_OCM_CTLCOLOREDIT(func) \\r
+       if (uMsg == OCM_CTLCOLOREDIT) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = (LRESULT)func((HDC)wParam, (HWND)lParam); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// HBRUSH OnReflectedCtlColorListBox(CDCHandle dc, CListBox listBox)\r
+#define MSG_OCM_CTLCOLORLISTBOX(func) \\r
+       if (uMsg == OCM_CTLCOLORLISTBOX) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = (LRESULT)func((HDC)wParam, (HWND)lParam); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// HBRUSH OnReflectedCtlColorBtn(CDCHandle dc, CButton button)\r
+#define MSG_OCM_CTLCOLORBTN(func) \\r
+       if (uMsg == OCM_CTLCOLORBTN) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = (LRESULT)func((HDC)wParam, (HWND)lParam); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// HBRUSH OnReflectedCtlColorDlg(CDCHandle dc, CWindow wnd)\r
+#define MSG_OCM_CTLCOLORDLG(func) \\r
+       if (uMsg == OCM_CTLCOLORDLG) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = (LRESULT)func((HDC)wParam, (HWND)lParam); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// HBRUSH OnReflectedCtlColorScrollBar(CDCHandle dc, CScrollBar scrollBar)\r
+#define MSG_OCM_CTLCOLORSCROLLBAR(func) \\r
+       if (uMsg == OCM_CTLCOLORSCROLLBAR) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = (LRESULT)func((HDC)wParam, (HWND)lParam); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// HBRUSH OnReflectedCtlColorStatic(CDCHandle dc, CStatic wndStatic)\r
+#define MSG_OCM_CTLCOLORSTATIC(func) \\r
+       if (uMsg == OCM_CTLCOLORSTATIC) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = (LRESULT)func((HDC)wParam, (HWND)lParam); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Edit specific messages\r
+\r
+// void OnClear()\r
+#define MSG_WM_CLEAR(func) \\r
+       if (uMsg == WM_CLEAR) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func(); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnCopy()\r
+#define MSG_WM_COPY(func) \\r
+       if (uMsg == WM_COPY) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func(); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnCut()\r
+#define MSG_WM_CUT(func) \\r
+       if (uMsg == WM_CUT) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func(); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnPaste()\r
+#define MSG_WM_PASTE(func) \\r
+       if (uMsg == WM_PASTE) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func(); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnUndo()\r
+#define MSG_WM_UNDO(func) \\r
+       if (uMsg == WM_UNDO) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func(); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Generic message handlers\r
+\r
+// LRESULT OnMessageHandlerEX(UINT uMsg, WPARAM wParam, LPARAM lParam)\r
+#define MESSAGE_HANDLER_EX(msg, func) \\r
+       if(uMsg == msg) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = func(uMsg, wParam, lParam); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// LRESULT OnMessageRangeHandlerEX(UINT uMsg, WPARAM wParam, LPARAM lParam)\r
+#define MESSAGE_RANGE_HANDLER_EX(msgFirst, msgLast, func) \\r
+       if(uMsg >= msgFirst && uMsg <= msgLast) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = func(uMsg, wParam, lParam); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Commands and notifications\r
+\r
+// void OnCommandHandlerEX(UINT uNotifyCode, int nID, CWindow wndCtl)\r
+#define COMMAND_HANDLER_EX(id, code, func) \\r
+       if (uMsg == WM_COMMAND && code == HIWORD(wParam) && id == LOWORD(wParam)) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((UINT)HIWORD(wParam), (int)LOWORD(wParam), (HWND)lParam); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnCommandIDHandlerEX(UINT uNotifyCode, int nID, CWindow wndCtl)\r
+#define COMMAND_ID_HANDLER_EX(id, func) \\r
+       if (uMsg == WM_COMMAND && id == LOWORD(wParam)) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((UINT)HIWORD(wParam), (int)LOWORD(wParam), (HWND)lParam); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnCommandCodeHandlerEX(UINT uNotifyCode, int nID, CWindow wndCtl)\r
+#define COMMAND_CODE_HANDLER_EX(code, func) \\r
+       if (uMsg == WM_COMMAND && code == HIWORD(wParam)) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((UINT)HIWORD(wParam), (int)LOWORD(wParam), (HWND)lParam); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// LRESULT OnNotifyHandlerEX(LPNMHDR pnmh)\r
+#define NOTIFY_HANDLER_EX(id, cd, func) \\r
+       if (uMsg == WM_NOTIFY && cd == ((LPNMHDR)lParam)->code && id == ((LPNMHDR)lParam)->idFrom) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = func((LPNMHDR)lParam); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// LRESULT OnNotifyIDHandlerEX(LPNMHDR pnmh)\r
+#define NOTIFY_ID_HANDLER_EX(id, func) \\r
+       if (uMsg == WM_NOTIFY && id == ((LPNMHDR)lParam)->idFrom) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = func((LPNMHDR)lParam); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// LRESULT OnNotifyCodeHandlerEX(LPNMHDR pnmh)\r
+#define NOTIFY_CODE_HANDLER_EX(cd, func) \\r
+       if (uMsg == WM_NOTIFY && cd == ((LPNMHDR)lParam)->code) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = func((LPNMHDR)lParam); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnCommandRangeHandlerEX(UINT uNotifyCode, int nID, CWindow wndCtl)\r
+#define COMMAND_RANGE_HANDLER_EX(idFirst, idLast, func) \\r
+       if(uMsg == WM_COMMAND && LOWORD(wParam) >= idFirst && LOWORD(wParam) <= idLast) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((UINT)HIWORD(wParam), (int)LOWORD(wParam), (HWND)lParam); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnCommandRangeCodeHandlerEX(UINT uNotifyCode, int nID, CWindow wndCtl)\r
+#define COMMAND_RANGE_CODE_HANDLER_EX(idFirst, idLast, code, func) \\r
+       if(uMsg == WM_COMMAND && code == HIWORD(wParam) && LOWORD(wParam) >= idFirst && LOWORD(wParam) <= idLast) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((UINT)HIWORD(wParam), (int)LOWORD(wParam), (HWND)lParam); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// LRESULT OnNotifyRangeHandlerEX(LPNMHDR pnmh)\r
+#define NOTIFY_RANGE_HANDLER_EX(idFirst, idLast, func) \\r
+       if(uMsg == WM_NOTIFY && ((LPNMHDR)lParam)->idFrom >= idFirst && ((LPNMHDR)lParam)->idFrom <= idLast) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = func((LPNMHDR)lParam); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// LRESULT OnNotifyRangeCodeHandlerEX(LPNMHDR pnmh)\r
+#define NOTIFY_RANGE_CODE_HANDLER_EX(idFirst, idLast, cd, func) \\r
+       if(uMsg == WM_NOTIFY && cd == ((LPNMHDR)lParam)->code && ((LPNMHDR)lParam)->idFrom >= idFirst && ((LPNMHDR)lParam)->idFrom <= idLast) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = func((LPNMHDR)lParam); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// LRESULT OnReflectedCommandHandlerEX(UINT uNotifyCode, int nID, CWindow wndCtl)\r
+#define REFLECTED_COMMAND_HANDLER_EX(id, code, func) \\r
+       if (uMsg == OCM_COMMAND && code == HIWORD(wParam) && id == LOWORD(wParam)) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((UINT)HIWORD(wParam), (int)LOWORD(wParam), (HWND)lParam); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// LRESULT OnReflectedCommandIDHandlerEX(UINT uNotifyCode, int nID, CWindow wndCtl)\r
+#define REFLECTED_COMMAND_ID_HANDLER_EX(id, func) \\r
+       if (uMsg == OCM_COMMAND && id == LOWORD(wParam)) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((UINT)HIWORD(wParam), (int)LOWORD(wParam), (HWND)lParam); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// LRESULT OnReflectedCommandCodeHandlerEX(UINT uNotifyCode, int nID, CWindow wndCtl)\r
+#define REFLECTED_COMMAND_CODE_HANDLER_EX(code, func) \\r
+       if (uMsg == OCM_COMMAND && code == HIWORD(wParam)) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((UINT)HIWORD(wParam), (int)LOWORD(wParam), (HWND)lParam); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// LRESULT OnReflectedNotifyHandlerEX(LPNMHDR pnmh)\r
+#define REFLECTED_NOTIFY_HANDLER_EX(id, cd, func) \\r
+       if (uMsg == OCM_NOTIFY && cd == ((LPNMHDR)lParam)->code && id == ((LPNMHDR)lParam)->idFrom) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = func((LPNMHDR)lParam); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// LRESULT OnReflectedNotifyIDHandlerEX(LPNMHDR pnmh)\r
+#define REFLECTED_NOTIFY_ID_HANDLER_EX(id, func) \\r
+       if (uMsg == OCM_NOTIFY && id == ((LPNMHDR)lParam)->idFrom) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = func((LPNMHDR)lParam); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// LRESULT OnReflectedNotifyCodeHandlerEX(LPNMHDR pnmh)\r
+#define REFLECTED_NOTIFY_CODE_HANDLER_EX(cd, func) \\r
+       if (uMsg == OCM_NOTIFY && cd == ((LPNMHDR)lParam)->code) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = func((LPNMHDR)lParam); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnReflectedCommandRangeHandlerEX(UINT uNotifyCode, int nID, CWindow wndCtl)\r
+#define REFLECTED_COMMAND_RANGE_HANDLER_EX(idFirst, idLast, func) \\r
+       if(uMsg == OCM_COMMAND && LOWORD(wParam) >= idFirst && LOWORD(wParam) <= idLast) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((UINT)HIWORD(wParam), (int)LOWORD(wParam), (HWND)lParam); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// void OnReflectedCommandRangeCodeHandlerEX(UINT uNotifyCode, int nID, CWindow wndCtl)\r
+#define REFLECTED_COMMAND_RANGE_CODE_HANDLER_EX(idFirst, idLast, code, func) \\r
+       if(uMsg == OCM_COMMAND && code == HIWORD(wParam) && LOWORD(wParam) >= idFirst && LOWORD(wParam) <= idLast) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               func((UINT)HIWORD(wParam), (int)LOWORD(wParam), (HWND)lParam); \\r
+               lResult = 0; \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// LRESULT OnReflectedNotifyRangeHandlerEX(LPNMHDR pnmh)\r
+#define REFLECTED_NOTIFY_RANGE_HANDLER_EX(idFirst, idLast, func) \\r
+       if(uMsg == OCM_NOTIFY && ((LPNMHDR)lParam)->idFrom >= idFirst && ((LPNMHDR)lParam)->idFrom <= idLast) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = func((LPNMHDR)lParam); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+// LRESULT OnReflectedNotifyRangeCodeHandlerEX(LPNMHDR pnmh)\r
+#define REFLECTED_NOTIFY_RANGE_CODE_HANDLER_EX(idFirst, idLast, cd, func) \\r
+       if(uMsg == OCM_NOTIFY && cd == ((LPNMHDR)lParam)->code && ((LPNMHDR)lParam)->idFrom >= idFirst && ((LPNMHDR)lParam)->idFrom <= idLast) \\r
+       { \\r
+               SetMsgHandled(TRUE); \\r
+               lResult = func((LPNMHDR)lParam); \\r
+               if(IsMsgHandled()) \\r
+                       return TRUE; \\r
+       }\r
+\r
+#endif // __ATLCRACK_H__\r
diff --git a/WTL80/include/atlctrls.h b/WTL80/include/atlctrls.h
new file mode 100644 (file)
index 0000000..338f51d
--- /dev/null
@@ -0,0 +1,10039 @@
+// Windows Template Library - WTL version 8.0\r
+// Copyright (C) Microsoft Corporation. All rights reserved.\r
+//\r
+// This file is a part of the Windows Template Library.\r
+// The use and distribution terms for this software are covered by the\r
+// Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php)\r
+// which can be found in the file CPL.TXT at the root of this distribution.\r
+// By using this software in any fashion, you are agreeing to be bound by\r
+// the terms of this license. You must not remove this notice, or\r
+// any other, from this software.\r
+\r
+#ifndef __ATLCTRLS_H__\r
+#define __ATLCTRLS_H__\r
+\r
+#pragma once\r
+\r
+#ifndef __cplusplus\r
+       #error ATL requires C++ compilation (use a .cpp suffix)\r
+#endif\r
+\r
+#ifndef __ATLAPP_H__\r
+       #error atlctrls.h requires atlapp.h to be included first\r
+#endif\r
+\r
+#ifndef __ATLWIN_H__\r
+       #error atlctrls.h requires atlwin.h to be included first\r
+#endif\r
+\r
+#if (_WIN32_IE < 0x0300)\r
+       #error atlctrls.h requires IE Version 3.0 or higher\r
+#endif\r
+\r
+#ifndef _WIN32_WCE\r
+  #include <richedit.h>\r
+  #include <richole.h>\r
+#elif defined(WIN32_PLATFORM_WFSP) && !defined(_WINUSERM_H_)\r
+  #include <winuserm.h>\r
+#endif // !_WIN32_WCE\r
+\r
+// protect template members from windowsx.h macros\r
+#ifdef _INC_WINDOWSX\r
+  #undef GetNextSibling\r
+  #undef GetPrevSibling\r
+#endif // _INC_WINDOWSX\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Classes in this file:\r
+//\r
+// CStaticT<TBase> - CStatic\r
+// CButtonT<TBase> - CButton\r
+// CListBoxT<TBase> - CListBox\r
+// CComboBoxT<TBase> - CComboBox\r
+// CEditT<TBase> - CEdit\r
+// CEditCommands<T>\r
+// CScrollBarT<TBase> - CScrollBar\r
+//\r
+// CImageList\r
+// CListViewCtrlT<TBase> - CListViewCtrl\r
+// CTreeViewCtrlT<TBase> - CTreeViewCtrl\r
+// CTreeItemT<TBase> - CTreeItem\r
+// CTreeViewCtrlExT<TBase> - CTreeViewCtrlEx\r
+// CHeaderCtrlT<TBase> - CHeaderCtrl\r
+// CToolBarCtrlT<TBase> - CToolBarCtrl\r
+// CStatusBarCtrlT<TBase> - CStatusBarCtrl\r
+// CTabCtrlT<TBase> - CTabCtrl\r
+// CToolInfo\r
+// CToolTipCtrlT<TBase> - CToolTipCtrl\r
+// CTrackBarCtrlT<TBase> - CTrackBarCtrl\r
+// CUpDownCtrlT<TBase> - CUpDownCtrl\r
+// CProgressBarCtrlT<TBase> - CProgressBarCtrl\r
+// CHotKeyCtrlT<TBase> - CHotKeyCtrl\r
+// CAnimateCtrlT<TBase> - CAnimateCtrl\r
+// CRichEditCtrlT<TBase> - CRichEditCtrl\r
+// CRichEditCommands<T>\r
+// CDragListBoxT<TBase> - CDragListBox\r
+// CDragListNotifyImpl<T>\r
+// CReBarCtrlT<TBase> - CReBarCtrl\r
+// CComboBoxExT<TBase> - CComboBoxEx\r
+// CDateTimePickerCtrlT<TBase> - CDateTimePickerCtrl\r
+// CMonthCalendarCtrlT<TBase> - CMonthCalendarCtrl\r
+// CFlatScrollBarImpl<T>\r
+// CFlatScrollBarT<TBase> - CFlatScrollBar\r
+// CIPAddressCtrlT<TBase> - CIPAddressCtrl\r
+// CPagerCtrlT<TBase> - CPagerCtrl\r
+// CLinkCtrlT<TBase> - CLinkCtrl\r
+//\r
+// CCustomDraw<T>\r
+//\r
+// CCECommandBarCtrlT<TBase> - CCECommandBarCtrl\r
+// CCECommandBandsCtrlT<TBase> - CCECommandBandsCtrl\r
+\r
+\r
+namespace WTL\r
+{\r
+\r
+// These are wrapper classes for Windows standard and common controls.\r
+// To implement a window based on a control, use following:\r
+// Example: Implementing a window based on a list box\r
+//\r
+// class CMyListBox : CWindowImpl<CMyListBox, CListBox>\r
+// {\r
+// public:\r
+//      BEGIN_MSG_MAP(CMyListBox)\r
+//          // put your message handler entries here\r
+//      END_MSG_MAP()\r
+// };\r
+\r
+\r
+\r
+// --- Standard Windows controls ---\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CStatic - client side for a Windows STATIC control\r
+\r
+template <class TBase>\r
+class CStaticT : public TBase\r
+{\r
+public:\r
+// Constructors\r
+       CStaticT(HWND hWnd = NULL) : TBase(hWnd)\r
+       { }\r
+\r
+       CStaticT< TBase >& operator =(HWND hWnd)\r
+       {\r
+               m_hWnd = hWnd;\r
+               return *this;\r
+       }\r
+\r
+       HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,\r
+                       DWORD dwStyle = 0, DWORD dwExStyle = 0,\r
+                       ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)\r
+       {\r
+               return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);\r
+       }\r
+\r
+// Attributes\r
+       static LPCTSTR GetWndClassName()\r
+       {\r
+               return _T("STATIC");\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       HICON GetIcon() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (HICON)::SendMessage(m_hWnd, STM_GETICON, 0, 0L);\r
+       }\r
+\r
+       HICON SetIcon(HICON hIcon)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (HICON)::SendMessage(m_hWnd, STM_SETICON, (WPARAM)hIcon, 0L);\r
+       }\r
+\r
+       HENHMETAFILE GetEnhMetaFile() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (HENHMETAFILE)::SendMessage(m_hWnd, STM_GETIMAGE, IMAGE_ENHMETAFILE, 0L);\r
+       }\r
+\r
+       HENHMETAFILE SetEnhMetaFile(HENHMETAFILE hMetaFile)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (HENHMETAFILE)::SendMessage(m_hWnd, STM_SETIMAGE, IMAGE_ENHMETAFILE, (LPARAM)hMetaFile);\r
+       }\r
+#else // CE specific\r
+       HICON GetIcon() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (HICON)::SendMessage(m_hWnd, STM_GETIMAGE, IMAGE_ICON, 0L);\r
+       }\r
+\r
+       HICON SetIcon(HICON hIcon)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (HICON)::SendMessage(m_hWnd, STM_SETIMAGE, IMAGE_ICON, (LPARAM)hIcon);\r
+       }\r
+#endif // _WIN32_WCE\r
+\r
+       CBitmapHandle GetBitmap() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return CBitmapHandle((HBITMAP)::SendMessage(m_hWnd, STM_GETIMAGE, IMAGE_BITMAP, 0L));\r
+       }\r
+\r
+       CBitmapHandle SetBitmap(HBITMAP hBitmap)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return CBitmapHandle((HBITMAP)::SendMessage(m_hWnd, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBitmap));\r
+       }\r
+\r
+       HCURSOR GetCursor() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (HCURSOR)::SendMessage(m_hWnd, STM_GETIMAGE, IMAGE_CURSOR, 0L);\r
+       }\r
+\r
+       HCURSOR SetCursor(HCURSOR hCursor)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (HCURSOR)::SendMessage(m_hWnd, STM_SETIMAGE, IMAGE_CURSOR, (LPARAM)hCursor);\r
+       }\r
+};\r
+\r
+typedef CStaticT<ATL::CWindow>   CStatic;\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CButton - client side for a Windows BUTTON control\r
+\r
+template <class TBase>\r
+class CButtonT : public TBase\r
+{\r
+public:\r
+// Constructors\r
+       CButtonT(HWND hWnd = NULL) : TBase(hWnd)\r
+       { }\r
+\r
+       CButtonT< TBase >& operator =(HWND hWnd)\r
+       {\r
+               m_hWnd = hWnd;\r
+               return *this;\r
+       }\r
+\r
+       HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,\r
+                       DWORD dwStyle = 0, DWORD dwExStyle = 0,\r
+                       ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)\r
+       {\r
+               return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);\r
+       }\r
+\r
+// Attributes\r
+       static LPCTSTR GetWndClassName()\r
+       {\r
+               return _T("BUTTON");\r
+       }\r
+\r
+       UINT GetState() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (UINT)::SendMessage(m_hWnd, BM_GETSTATE, 0, 0L);\r
+       }\r
+\r
+       void SetState(BOOL bHighlight)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, BM_SETSTATE, bHighlight, 0L);\r
+       }\r
+\r
+       int GetCheck() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, BM_GETCHECK, 0, 0L);\r
+       }\r
+\r
+       void SetCheck(int nCheck)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, BM_SETCHECK, nCheck, 0L);\r
+       }\r
+\r
+       UINT GetButtonStyle() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (UINT)::GetWindowLong(m_hWnd, GWL_STYLE) & 0xFFFF;\r
+       }\r
+\r
+       void SetButtonStyle(UINT nStyle, BOOL bRedraw = TRUE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, BM_SETSTYLE, nStyle, (LPARAM)bRedraw);\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       HICON GetIcon() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (HICON)::SendMessage(m_hWnd, BM_GETIMAGE, IMAGE_ICON, 0L);\r
+       }\r
+\r
+       HICON SetIcon(HICON hIcon)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (HICON)::SendMessage(m_hWnd, BM_SETIMAGE, IMAGE_ICON, (LPARAM)hIcon);\r
+       }\r
+\r
+       CBitmapHandle GetBitmap() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return CBitmapHandle((HBITMAP)::SendMessage(m_hWnd, BM_GETIMAGE, IMAGE_BITMAP, 0L));\r
+       }\r
+\r
+       CBitmapHandle SetBitmap(HBITMAP hBitmap)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return CBitmapHandle((HBITMAP)::SendMessage(m_hWnd, BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBitmap));\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+#if (_WIN32_WINNT >= 0x0501)\r
+       BOOL GetIdealSize(LPSIZE lpSize) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, BCM_GETIDEALSIZE, 0, (LPARAM)lpSize);\r
+       }\r
+\r
+       BOOL GetImageList(PBUTTON_IMAGELIST pButtonImagelist) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, BCM_GETIMAGELIST, 0, (LPARAM)pButtonImagelist);\r
+       }\r
+\r
+       BOOL SetImageList(PBUTTON_IMAGELIST pButtonImagelist)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, BCM_SETIMAGELIST, 0, (LPARAM)pButtonImagelist);\r
+       }\r
+\r
+       BOOL GetTextMargin(LPRECT lpRect) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, BCM_GETTEXTMARGIN, 0, (LPARAM)lpRect);\r
+       }\r
+\r
+       BOOL SetTextMargin(LPRECT lpRect)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, BCM_SETTEXTMARGIN, 0, (LPARAM)lpRect);\r
+       }\r
+#endif // (_WIN32_WINNT >= 0x0501)\r
+\r
+#if (WINVER >= 0x0600)\r
+       void SetDontClick(BOOL bDontClick)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, BM_SETDONTCLICK, (WPARAM)bDontClick, 0L);\r
+       }\r
+#endif // (WINVER >= 0x0600)\r
+\r
+#if (_WIN32_WINNT >= 0x0600)\r
+       BOOL SetDropDownState(BOOL bDropDown)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT((GetStyle() & (BS_SPLITBUTTON | BS_DEFSPLITBUTTON)) != 0);\r
+               return (BOOL)::SendMessage(m_hWnd, BCM_SETDROPDOWNSTATE, (WPARAM)bDropDown, 0L);\r
+       }\r
+\r
+       BOOL GetSplitInfo(PBUTTON_SPLITINFO pSplitInfo) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT((GetStyle() & (BS_SPLITBUTTON | BS_DEFSPLITBUTTON)) != 0);\r
+               return (BOOL)::SendMessage(m_hWnd, BCM_GETSPLITINFO, 0, (LPARAM)pSplitInfo);\r
+       }\r
+\r
+       BOOL SetSplitInfo(PBUTTON_SPLITINFO pSplitInfo)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT((GetStyle() & (BS_SPLITBUTTON | BS_DEFSPLITBUTTON)) != 0);\r
+               return (BOOL)::SendMessage(m_hWnd, BCM_SETSPLITINFO, 0, (LPARAM)pSplitInfo);\r
+       }\r
+\r
+       int GetNoteLength() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT((GetStyle() & (BS_COMMANDLINK | BS_DEFCOMMANDLINK)) != 0);\r
+               return (int)::SendMessage(m_hWnd, BCM_GETNOTELENGTH, 0, 0L);\r
+       }\r
+\r
+       BOOL GetNote(LPWSTR lpstrNoteText, int cchNoteText) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT((GetStyle() & (BS_COMMANDLINK | BS_DEFCOMMANDLINK)) != 0);\r
+               return (BOOL)::SendMessage(m_hWnd, BCM_GETNOTE, cchNoteText, (LPARAM)lpstrNoteText);\r
+       }\r
+\r
+       BOOL SetNote(LPCWSTR lpstrNoteText)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT((GetStyle() & (BS_COMMANDLINK | BS_DEFCOMMANDLINK)) != 0);\r
+               return (BOOL)::SendMessage(m_hWnd, BCM_SETNOTE, 0, (LPARAM)lpstrNoteText);\r
+       }\r
+\r
+       LRESULT SetElevationRequiredState(BOOL bSet)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return ::SendMessage(m_hWnd, BCM_SETSHIELD, 0, (LPARAM)bSet);\r
+       }\r
+#endif // (_WIN32_WINNT >= 0x0600)\r
+\r
+// Operations\r
+       void Click()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, BM_CLICK, 0, 0L);\r
+       }\r
+};\r
+\r
+typedef CButtonT<ATL::CWindow>   CButton;\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CListBox - client side for a Windows LISTBOX control\r
+\r
+template <class TBase>\r
+class CListBoxT : public TBase\r
+{\r
+public:\r
+// Constructors\r
+       CListBoxT(HWND hWnd = NULL) : TBase(hWnd)\r
+       { }\r
+\r
+       CListBoxT< TBase >& operator =(HWND hWnd)\r
+       {\r
+               m_hWnd = hWnd;\r
+               return *this;\r
+       }\r
+\r
+       HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,\r
+                       DWORD dwStyle = 0, DWORD dwExStyle = 0,\r
+                       ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)\r
+       {\r
+               return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);\r
+       }\r
+\r
+// Attributes\r
+       static LPCTSTR GetWndClassName()\r
+       {\r
+               return _T("LISTBOX");\r
+       }\r
+\r
+       // for entire listbox\r
+       int GetCount() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, LB_GETCOUNT, 0, 0L);\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       int SetCount(int cItems)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(((GetStyle() & LBS_NODATA) != 0) && ((GetStyle() & LBS_HASSTRINGS) == 0));\r
+               return (int)::SendMessage(m_hWnd, LB_SETCOUNT, cItems, 0L);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       int GetHorizontalExtent() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, LB_GETHORIZONTALEXTENT, 0, 0L);\r
+       }\r
+\r
+       void SetHorizontalExtent(int cxExtent)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, LB_SETHORIZONTALEXTENT, cxExtent, 0L);\r
+       }\r
+\r
+       int GetTopIndex() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, LB_GETTOPINDEX, 0, 0L);\r
+       }\r
+\r
+       int SetTopIndex(int nIndex)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, LB_SETTOPINDEX, nIndex, 0L);\r
+       }\r
+\r
+       LCID GetLocale() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (LCID)::SendMessage(m_hWnd, LB_GETLOCALE, 0, 0L);\r
+       }\r
+\r
+       LCID SetLocale(LCID nNewLocale)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (LCID)::SendMessage(m_hWnd, LB_SETLOCALE, (WPARAM)nNewLocale, 0L);\r
+       }\r
+\r
+#if (WINVER >= 0x0500) && !defined(_WIN32_WCE)\r
+       DWORD GetListBoxInfo() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+#if (_WIN32_WINNT >= 0x0501)\r
+               return (DWORD)::SendMessage(m_hWnd, LB_GETLISTBOXINFO, 0, 0L);\r
+#else // !(_WIN32_WINNT >= 0x0501)\r
+               return ::GetListBoxInfo(m_hWnd);\r
+#endif // !(_WIN32_WINNT >= 0x0501)\r
+       }\r
+#endif // (WINVER >= 0x0500) && !defined(_WIN32_WCE)\r
+\r
+       // for single-selection listboxes\r
+       int GetCurSel() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT((GetStyle() & (LBS_MULTIPLESEL | LBS_EXTENDEDSEL)) == 0);\r
+               return (int)::SendMessage(m_hWnd, LB_GETCURSEL, 0, 0L);\r
+       }\r
+\r
+       int SetCurSel(int nSelect)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT((GetStyle() & (LBS_MULTIPLESEL | LBS_EXTENDEDSEL)) == 0);\r
+               return (int)::SendMessage(m_hWnd, LB_SETCURSEL, nSelect, 0L);\r
+       }\r
+\r
+       // for multiple-selection listboxes\r
+       int GetSel(int nIndex) const           // also works for single-selection\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, LB_GETSEL, nIndex, 0L);\r
+       }\r
+\r
+       int SetSel(int nIndex, BOOL bSelect = TRUE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT((GetStyle() & (LBS_MULTIPLESEL | LBS_EXTENDEDSEL)) != 0);\r
+               return (int)::SendMessage(m_hWnd, LB_SETSEL, bSelect, nIndex);\r
+       }\r
+\r
+       int GetSelCount() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT((GetStyle() & (LBS_MULTIPLESEL | LBS_EXTENDEDSEL)) != 0);\r
+               return (int)::SendMessage(m_hWnd, LB_GETSELCOUNT, 0, 0L);\r
+       }\r
+\r
+       int GetSelItems(int nMaxItems, LPINT rgIndex) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT((GetStyle() & (LBS_MULTIPLESEL | LBS_EXTENDEDSEL)) != 0);\r
+               return (int)::SendMessage(m_hWnd, LB_GETSELITEMS, nMaxItems, (LPARAM)rgIndex);\r
+       }\r
+\r
+       int GetAnchorIndex() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT((GetStyle() & (LBS_MULTIPLESEL | LBS_EXTENDEDSEL)) != 0);\r
+               return (int)::SendMessage(m_hWnd, LB_GETANCHORINDEX, 0, 0L);\r
+       }\r
+\r
+       void SetAnchorIndex(int nIndex)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT((GetStyle() & (LBS_MULTIPLESEL | LBS_EXTENDEDSEL)) != 0);\r
+               ::SendMessage(m_hWnd, LB_SETANCHORINDEX, nIndex, 0L);\r
+       }\r
+\r
+       int GetCaretIndex() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, LB_GETCARETINDEX, 0, 0);\r
+       }\r
+\r
+       int SetCaretIndex(int nIndex, BOOL bScroll = TRUE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, LB_SETCARETINDEX, nIndex, MAKELONG(bScroll, 0));\r
+       }\r
+\r
+       // for listbox items\r
+       DWORD_PTR GetItemData(int nIndex) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (DWORD_PTR)::SendMessage(m_hWnd, LB_GETITEMDATA, nIndex, 0L);\r
+       }\r
+\r
+       int SetItemData(int nIndex, DWORD_PTR dwItemData)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, LB_SETITEMDATA, nIndex, (LPARAM)dwItemData);\r
+       }\r
+\r
+       void* GetItemDataPtr(int nIndex) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (void*)::SendMessage(m_hWnd, LB_GETITEMDATA, nIndex, 0L);\r
+       }\r
+\r
+       int SetItemDataPtr(int nIndex, void* pData)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return SetItemData(nIndex, (DWORD_PTR)pData);\r
+       }\r
+\r
+       int GetItemRect(int nIndex, LPRECT lpRect) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, LB_GETITEMRECT, nIndex, (LPARAM)lpRect);\r
+       }\r
+\r
+       int GetText(int nIndex, LPTSTR lpszBuffer) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, LB_GETTEXT, nIndex, (LPARAM)lpszBuffer);\r
+       }\r
+\r
+#ifndef _ATL_NO_COM\r
+#ifdef _OLEAUTO_H_\r
+       BOOL GetTextBSTR(int nIndex, BSTR& bstrText) const\r
+       {\r
+               USES_CONVERSION;\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(bstrText == NULL);\r
+\r
+               int nLen = GetTextLen(nIndex);\r
+               if(nLen == LB_ERR)\r
+                       return FALSE;\r
+\r
+               CTempBuffer<TCHAR, _WTL_STACK_ALLOC_THRESHOLD> buff;\r
+               LPTSTR lpstrText = buff.Allocate(nLen + 1);\r
+               if(lpstrText == NULL)\r
+                       return FALSE;\r
+\r
+               if(GetText(nIndex, lpstrText) == LB_ERR)\r
+                       return FALSE;\r
+\r
+               bstrText = ::SysAllocString(T2OLE(lpstrText));\r
+               return (bstrText != NULL) ? TRUE : FALSE;\r
+       }\r
+#endif // _OLEAUTO_H_\r
+#endif // !_ATL_NO_COM\r
+\r
+#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)\r
+       int GetText(int nIndex, _CSTRING_NS::CString& strText) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               int cchLen = GetTextLen(nIndex);\r
+               if(cchLen == LB_ERR)\r
+                       return LB_ERR;\r
+               int nRet = LB_ERR;\r
+               LPTSTR lpstr = strText.GetBufferSetLength(cchLen);\r
+               if(lpstr != NULL)\r
+               {\r
+                       nRet = GetText(nIndex, lpstr);\r
+                       strText.ReleaseBuffer();\r
+               }\r
+               return nRet;\r
+       }\r
+#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)\r
+\r
+       int GetTextLen(int nIndex) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, LB_GETTEXTLEN, nIndex, 0L);\r
+       }\r
+\r
+       int GetItemHeight(int nIndex) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, LB_GETITEMHEIGHT, nIndex, 0L);\r
+       }\r
+\r
+       int SetItemHeight(int nIndex, UINT cyItemHeight)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, LB_SETITEMHEIGHT, nIndex, MAKELONG(cyItemHeight, 0));\r
+       }\r
+\r
+       // Settable only attributes\r
+       void SetColumnWidth(int cxWidth)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, LB_SETCOLUMNWIDTH, cxWidth, 0L);\r
+       }\r
+\r
+       BOOL SetTabStops(int nTabStops, LPINT rgTabStops)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT((GetStyle() & LBS_USETABSTOPS) != 0);\r
+               return (BOOL)::SendMessage(m_hWnd, LB_SETTABSTOPS, nTabStops, (LPARAM)rgTabStops);\r
+       }\r
+\r
+       BOOL SetTabStops()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT((GetStyle() & LBS_USETABSTOPS) != 0);\r
+               return (BOOL)::SendMessage(m_hWnd, LB_SETTABSTOPS, 0, 0L);\r
+       }\r
+\r
+       BOOL SetTabStops(const int& cxEachStop)    // takes an 'int'\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT((GetStyle() & LBS_USETABSTOPS) != 0);\r
+               return (BOOL)::SendMessage(m_hWnd, LB_SETTABSTOPS, 1, (LPARAM)(LPINT)&cxEachStop);\r
+       }\r
+\r
+// Operations\r
+       int InitStorage(int nItems, UINT nBytes)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, LB_INITSTORAGE, (WPARAM)nItems, nBytes);\r
+       }\r
+\r
+       void ResetContent()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, LB_RESETCONTENT, 0, 0L);\r
+       }\r
+\r
+       UINT ItemFromPoint(POINT pt, BOOL& bOutside) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               DWORD dw = (DWORD)::SendMessage(m_hWnd, LB_ITEMFROMPOINT, 0, MAKELPARAM(pt.x, pt.y));\r
+               bOutside = (BOOL)HIWORD(dw);\r
+               return (UINT)LOWORD(dw);\r
+       }\r
+\r
+       // manipulating listbox items\r
+       int AddString(LPCTSTR lpszItem)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, LB_ADDSTRING, 0, (LPARAM)lpszItem);\r
+       }\r
+\r
+       int DeleteString(UINT nIndex)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, LB_DELETESTRING, nIndex, 0L);\r
+       }\r
+\r
+       int InsertString(int nIndex, LPCTSTR lpszItem)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, LB_INSERTSTRING, nIndex, (LPARAM)lpszItem);\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       int Dir(UINT attr, LPCTSTR lpszWildCard)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, LB_DIR, attr, (LPARAM)lpszWildCard);\r
+       }\r
+\r
+       int AddFile(LPCTSTR lpstrFileName)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, LB_ADDFILE, 0, (LPARAM)lpstrFileName);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       // selection helpers\r
+       int FindString(int nStartAfter, LPCTSTR lpszItem) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, LB_FINDSTRING, nStartAfter, (LPARAM)lpszItem);\r
+       }\r
+\r
+       int FindStringExact(int nIndexStart, LPCTSTR lpszFind) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, LB_FINDSTRINGEXACT, nIndexStart, (LPARAM)lpszFind);\r
+       }\r
+\r
+       int SelectString(int nStartAfter, LPCTSTR lpszItem)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, LB_SELECTSTRING, nStartAfter, (LPARAM)lpszItem);\r
+       }\r
+\r
+       int SelItemRange(BOOL bSelect, int nFirstItem, int nLastItem)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT((GetStyle() & (LBS_MULTIPLESEL | LBS_EXTENDEDSEL)) != 0);\r
+               ATLASSERT(nFirstItem <= nLastItem);\r
+               return bSelect ? (int)::SendMessage(m_hWnd, LB_SELITEMRANGEEX, nFirstItem, nLastItem) : (int)::SendMessage(m_hWnd, LB_SELITEMRANGEEX, nLastItem, nFirstItem);\r
+       }\r
+\r
+#ifdef WIN32_PLATFORM_WFSP   // SmartPhone only messages\r
+       DWORD GetInputMode(BOOL bCurrentMode = TRUE)\r
+       {\r
+               return SendMessage(LB_GETINPUTMODE, 0, (LPARAM)bCurrentMode);\r
+       }\r
+\r
+       BOOL SetInputMode(DWORD dwMode)\r
+       {\r
+               return SendMessage(LB_SETINPUTMODE, 0, (LPARAM)dwMode);\r
+       }\r
+#endif // WIN32_PLATFORM_WFSP\r
+};\r
+\r
+typedef CListBoxT<ATL::CWindow>   CListBox;\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CComboBox - client side for a Windows COMBOBOX control\r
+\r
+#ifndef WIN32_PLATFORM_WFSP   // No COMBOBOX on SmartPhones\r
+\r
+template <class TBase>\r
+class CComboBoxT : public TBase\r
+{\r
+public:\r
+// Constructors\r
+       CComboBoxT(HWND hWnd = NULL) : TBase(hWnd)\r
+       { }\r
+\r
+       CComboBoxT< TBase >& operator =(HWND hWnd)\r
+       {\r
+               m_hWnd = hWnd;\r
+               return *this;\r
+       }\r
+\r
+       HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,\r
+                       DWORD dwStyle = 0, DWORD dwExStyle = 0,\r
+                       ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)\r
+       {\r
+               return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);\r
+       }\r
+\r
+// Attributes\r
+       static LPCTSTR GetWndClassName()\r
+       {\r
+               return _T("COMBOBOX");\r
+       }\r
+\r
+       // for entire combo box\r
+       int GetCount() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, CB_GETCOUNT, 0, 0L);\r
+       }\r
+\r
+       int GetCurSel() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, CB_GETCURSEL, 0, 0L);\r
+       }\r
+\r
+       int SetCurSel(int nSelect)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, CB_SETCURSEL, nSelect, 0L);\r
+       }\r
+\r
+       LCID GetLocale() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (LCID)::SendMessage(m_hWnd, CB_GETLOCALE, 0, 0L);\r
+       }\r
+\r
+       LCID SetLocale(LCID nNewLocale)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (LCID)::SendMessage(m_hWnd, CB_SETLOCALE, (WPARAM)nNewLocale, 0L);\r
+       }\r
+\r
+       int GetTopIndex() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, CB_GETTOPINDEX, 0, 0L);\r
+       }\r
+\r
+       int SetTopIndex(int nIndex)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, CB_SETTOPINDEX, nIndex, 0L);\r
+       }\r
+\r
+       UINT GetHorizontalExtent() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (UINT)::SendMessage(m_hWnd, CB_GETHORIZONTALEXTENT, 0, 0L);\r
+       }\r
+\r
+       void SetHorizontalExtent(UINT nExtent)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, CB_SETHORIZONTALEXTENT, nExtent, 0L);\r
+       }\r
+\r
+       int GetDroppedWidth() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, CB_GETDROPPEDWIDTH, 0, 0L);\r
+       }\r
+\r
+       int SetDroppedWidth(UINT nWidth)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, CB_SETDROPPEDWIDTH, nWidth, 0L);\r
+       }\r
+\r
+#if ((WINVER >= 0x0500) && !defined(_WIN32_WCE)) || (defined(_WIN32_WCE) && (_WIN32_WCE >= 420))\r
+       BOOL GetComboBoxInfo(PCOMBOBOXINFO pComboBoxInfo) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+#if ((_WIN32_WINNT >= 0x0501) && !defined(_WIN32_WCE)) || (defined(_WIN32_WCE) && (_WIN32_WCE >= 420))\r
+               return (BOOL)::SendMessage(m_hWnd, CB_GETCOMBOBOXINFO, 0, (LPARAM)pComboBoxInfo);\r
+#else // !((_WIN32_WINNT >= 0x0501) && !defined(_WIN32_WCE)) || (defined(_WIN32_WCE) && (_WIN32_WCE >= 420))\r
+               return ::GetComboBoxInfo(m_hWnd, pComboBoxInfo);\r
+#endif // !((_WIN32_WINNT >= 0x0501) && !defined(_WIN32_WCE)) || (defined(_WIN32_WCE) && (_WIN32_WCE >= 420))\r
+       }\r
+#endif // ((WINVER >= 0x0500) && !defined(_WIN32_WCE)) || (defined(_WIN32_WCE) && (_WIN32_WCE >= 420))\r
+\r
+       // for edit control\r
+       DWORD GetEditSel() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (DWORD)::SendMessage(m_hWnd, CB_GETEDITSEL, 0, 0L);\r
+       }\r
+\r
+       BOOL SetEditSel(int nStartChar, int nEndChar)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, CB_SETEDITSEL, 0, MAKELONG(nStartChar, nEndChar));\r
+       }\r
+\r
+       // for combobox item\r
+       DWORD_PTR GetItemData(int nIndex) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (DWORD_PTR)::SendMessage(m_hWnd, CB_GETITEMDATA, nIndex, 0L);\r
+       }\r
+\r
+       int SetItemData(int nIndex, DWORD_PTR dwItemData)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, CB_SETITEMDATA, nIndex, (LPARAM)dwItemData);\r
+       }\r
+\r
+       void* GetItemDataPtr(int nIndex) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (void*)GetItemData(nIndex);\r
+       }\r
+\r
+       int SetItemDataPtr(int nIndex, void* pData)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return SetItemData(nIndex, (DWORD_PTR)pData);\r
+       }\r
+\r
+       int GetLBText(int nIndex, LPTSTR lpszText) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, CB_GETLBTEXT, nIndex, (LPARAM)lpszText);\r
+       }\r
+\r
+#ifndef _ATL_NO_COM\r
+       BOOL GetLBTextBSTR(int nIndex, BSTR& bstrText) const\r
+       {\r
+               USES_CONVERSION;\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(bstrText == NULL);\r
+\r
+               int nLen = GetLBTextLen(nIndex);\r
+               if(nLen == CB_ERR)\r
+                       return FALSE;\r
+\r
+               CTempBuffer<TCHAR, _WTL_STACK_ALLOC_THRESHOLD> buff;\r
+               LPTSTR lpstrText = buff.Allocate(nLen + 1);\r
+               if(lpstrText == NULL)\r
+                       return FALSE;\r
+\r
+               if(GetLBText(nIndex, lpstrText) == CB_ERR)\r
+                       return FALSE;\r
+\r
+               bstrText = ::SysAllocString(T2OLE(lpstrText));\r
+               return (bstrText != NULL) ? TRUE : FALSE;\r
+       }\r
+#endif // !_ATL_NO_COM\r
+\r
+#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)\r
+       int GetLBText(int nIndex, _CSTRING_NS::CString& strText) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               int cchLen = GetLBTextLen(nIndex);\r
+               if(cchLen == CB_ERR)\r
+                       return CB_ERR;\r
+               int nRet = CB_ERR;\r
+               LPTSTR lpstr = strText.GetBufferSetLength(cchLen);\r
+               if(lpstr != NULL)\r
+               {\r
+                       nRet = GetLBText(nIndex, lpstr);\r
+                       strText.ReleaseBuffer();\r
+               }\r
+               return nRet;\r
+       }\r
+#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)\r
+\r
+       int GetLBTextLen(int nIndex) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, CB_GETLBTEXTLEN, nIndex, 0L);\r
+       }\r
+\r
+       int GetItemHeight(int nIndex) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, CB_GETITEMHEIGHT, nIndex, 0L);\r
+       }\r
+\r
+       int SetItemHeight(int nIndex, UINT cyItemHeight)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, CB_SETITEMHEIGHT, nIndex, MAKELONG(cyItemHeight, 0));\r
+       }\r
+\r
+       BOOL GetExtendedUI() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, CB_GETEXTENDEDUI, 0, 0L);\r
+       }\r
+\r
+       int SetExtendedUI(BOOL bExtended = TRUE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, CB_SETEXTENDEDUI, bExtended, 0L);\r
+       }\r
+\r
+       void GetDroppedControlRect(LPRECT lprect) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, CB_GETDROPPEDCONTROLRECT, 0, (LPARAM)lprect);\r
+       }\r
+\r
+       BOOL GetDroppedState() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, CB_GETDROPPEDSTATE, 0, 0L);\r
+       }\r
+\r
+#if (_WIN32_WINNT >= 0x0501)\r
+       int GetMinVisible() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, CB_GETMINVISIBLE, 0, 0L);\r
+       }\r
+\r
+       BOOL SetMinVisible(int nMinVisible)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, CB_SETMINVISIBLE, nMinVisible, 0L);\r
+       }\r
+\r
+       // Vista only\r
+       BOOL GetCueBannerText(LPWSTR lpwText, int cchText) const\r
+       {\r
+#ifndef CB_GETCUEBANNER\r
+               const UINT CB_GETCUEBANNER = (CBM_FIRST + 4);\r
+#endif\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, CB_GETCUEBANNER, (WPARAM)lpwText, cchText);\r
+       }\r
+\r
+       // Vista only\r
+       BOOL SetCueBannerText(LPCWSTR lpcwText)\r
+       {\r
+#ifndef CB_SETCUEBANNER\r
+               const UINT CB_SETCUEBANNER = (CBM_FIRST + 3);\r
+#endif\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, CB_SETCUEBANNER, 0, (LPARAM)lpcwText);\r
+       }\r
+#endif // (_WIN32_WINNT >= 0x0501)\r
+\r
+// Operations\r
+       int InitStorage(int nItems, UINT nBytes)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, CB_INITSTORAGE, (WPARAM)nItems, nBytes);\r
+       }\r
+\r
+       void ResetContent()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, CB_RESETCONTENT, 0, 0L);\r
+       }\r
+\r
+       // for edit control\r
+       BOOL LimitText(int nMaxChars)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, CB_LIMITTEXT, nMaxChars, 0L);\r
+       }\r
+\r
+       // for drop-down combo boxes\r
+       void ShowDropDown(BOOL bShowIt = TRUE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, CB_SHOWDROPDOWN, bShowIt, 0L);\r
+       }\r
+\r
+       // manipulating listbox items\r
+       int AddString(LPCTSTR lpszString)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, CB_ADDSTRING, 0, (LPARAM)lpszString);\r
+       }\r
+\r
+       int DeleteString(UINT nIndex)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, CB_DELETESTRING, nIndex, 0L);\r
+       }\r
+\r
+       int InsertString(int nIndex, LPCTSTR lpszString)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, CB_INSERTSTRING, nIndex, (LPARAM)lpszString);\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       int Dir(UINT attr, LPCTSTR lpszWildCard)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, CB_DIR, attr, (LPARAM)lpszWildCard);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       // selection helpers\r
+       int FindString(int nStartAfter, LPCTSTR lpszString) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, CB_FINDSTRING, nStartAfter, (LPARAM)lpszString);\r
+       }\r
+\r
+       int FindStringExact(int nIndexStart, LPCTSTR lpszFind) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, CB_FINDSTRINGEXACT, nIndexStart, (LPARAM)lpszFind);\r
+       }\r
+\r
+       int SelectString(int nStartAfter, LPCTSTR lpszString)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, CB_SELECTSTRING, nStartAfter, (LPARAM)lpszString);\r
+       }\r
+\r
+       // Clipboard operations\r
+       void Clear()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, WM_CLEAR, 0, 0L);\r
+       }\r
+\r
+       void Copy()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, WM_COPY, 0, 0L);\r
+       }\r
+\r
+       void Cut()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, WM_CUT, 0, 0L);\r
+       }\r
+\r
+       void Paste()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, WM_PASTE, 0, 0L);\r
+       }\r
+};\r
+\r
+typedef CComboBoxT<ATL::CWindow>   CComboBox;\r
+\r
+#endif // !WIN32_PLATFORM_WFSP\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CEdit - client side for a Windows EDIT control\r
+\r
+template <class TBase>\r
+class CEditT : public TBase\r
+{\r
+public:\r
+// Constructors\r
+       CEditT(HWND hWnd = NULL) : TBase(hWnd)\r
+       { }\r
+\r
+       CEditT< TBase >& operator =(HWND hWnd)\r
+       {\r
+               m_hWnd = hWnd;\r
+               return *this;\r
+       }\r
+\r
+       HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,\r
+                       DWORD dwStyle = 0, DWORD dwExStyle = 0,\r
+                       ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)\r
+       {\r
+               return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);\r
+       }\r
+\r
+// Attributes\r
+       static LPCTSTR GetWndClassName()\r
+       {\r
+               return _T("EDIT");\r
+       }\r
+\r
+       BOOL CanUndo() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, EM_CANUNDO, 0, 0L);\r
+       }\r
+\r
+       int GetLineCount() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, EM_GETLINECOUNT, 0, 0L);\r
+       }\r
+\r
+       BOOL GetModify() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, EM_GETMODIFY, 0, 0L);\r
+       }\r
+\r
+       void SetModify(BOOL bModified = TRUE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, EM_SETMODIFY, bModified, 0L);\r
+       }\r
+\r
+       void GetRect(LPRECT lpRect) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, EM_GETRECT, 0, (LPARAM)lpRect);\r
+       }\r
+\r
+       DWORD GetSel() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (DWORD)::SendMessage(m_hWnd, EM_GETSEL, 0, 0L);\r
+       }\r
+\r
+       void GetSel(int& nStartChar, int& nEndChar) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, EM_GETSEL, (WPARAM)&nStartChar, (LPARAM)&nEndChar);\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       HLOCAL GetHandle() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (HLOCAL)::SendMessage(m_hWnd, EM_GETHANDLE, 0, 0L);\r
+       }\r
+\r
+       void SetHandle(HLOCAL hBuffer)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, EM_SETHANDLE, (WPARAM)hBuffer, 0L);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       DWORD GetMargins() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (DWORD)::SendMessage(m_hWnd, EM_GETMARGINS, 0, 0L);\r
+       }\r
+\r
+       void SetMargins(UINT nLeft, UINT nRight)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, EM_SETMARGINS, EC_LEFTMARGIN|EC_RIGHTMARGIN, MAKELONG(nLeft, nRight));\r
+       }\r
+\r
+       UINT GetLimitText() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (UINT)::SendMessage(m_hWnd, EM_GETLIMITTEXT, 0, 0L);\r
+       }\r
+\r
+       void SetLimitText(UINT nMax)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, EM_SETLIMITTEXT, nMax, 0L);\r
+       }\r
+\r
+       POINT PosFromChar(UINT nChar) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               DWORD dwRet = (DWORD)::SendMessage(m_hWnd, EM_POSFROMCHAR, nChar, 0);\r
+               POINT point = { GET_X_LPARAM(dwRet), GET_Y_LPARAM(dwRet) };\r
+               return point;\r
+       }\r
+\r
+       int CharFromPos(POINT pt, int* pLine = NULL) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               DWORD dwRet = (DWORD)::SendMessage(m_hWnd, EM_CHARFROMPOS, 0, MAKELPARAM(pt.x, pt.y));\r
+               if(pLine != NULL)\r
+                       *pLine = (int)(short)HIWORD(dwRet);\r
+               return (int)(short)LOWORD(dwRet);\r
+       }\r
+\r
+       // NOTE: first word in lpszBuffer must contain the size of the buffer!\r
+       int GetLine(int nIndex, LPTSTR lpszBuffer) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, EM_GETLINE, nIndex, (LPARAM)lpszBuffer);\r
+       }\r
+\r
+       int GetLine(int nIndex, LPTSTR lpszBuffer, int nMaxLength) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               *(LPWORD)lpszBuffer = (WORD)nMaxLength;\r
+               return (int)::SendMessage(m_hWnd, EM_GETLINE, nIndex, (LPARAM)lpszBuffer);\r
+       }\r
+\r
+       TCHAR GetPasswordChar() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (TCHAR)::SendMessage(m_hWnd, EM_GETPASSWORDCHAR, 0, 0L);\r
+       }\r
+\r
+       void SetPasswordChar(TCHAR ch)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, EM_SETPASSWORDCHAR, ch, 0L);\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       EDITWORDBREAKPROC GetWordBreakProc() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (EDITWORDBREAKPROC)::SendMessage(m_hWnd, EM_GETWORDBREAKPROC, 0, 0L);\r
+       }\r
+\r
+       void SetWordBreakProc(EDITWORDBREAKPROC ewbprc)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, EM_SETWORDBREAKPROC, 0, (LPARAM)ewbprc);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       int GetFirstVisibleLine() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, EM_GETFIRSTVISIBLELINE, 0, 0L);\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       int GetThumb() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT((GetStyle() & ES_MULTILINE) != 0);\r
+               return (int)::SendMessage(m_hWnd, EM_GETTHUMB, 0, 0L);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       BOOL SetReadOnly(BOOL bReadOnly = TRUE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, EM_SETREADONLY, bReadOnly, 0L);\r
+       }\r
+\r
+#if (WINVER >= 0x0500) && !defined(_WIN32_WCE)\r
+       UINT GetImeStatus(UINT uStatus) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (UINT)::SendMessage(m_hWnd, EM_GETIMESTATUS, uStatus, 0L);\r
+       }\r
+\r
+       UINT SetImeStatus(UINT uStatus, UINT uData)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (UINT)::SendMessage(m_hWnd, EM_SETIMESTATUS, uStatus, uData);\r
+       }\r
+#endif // (WINVER >= 0x0500) && !defined(_WIN32_WCE)\r
+\r
+#if (_WIN32_WINNT >= 0x0501)\r
+       BOOL GetCueBannerText(LPCWSTR lpstrText, int cchText) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, EM_GETCUEBANNER, (WPARAM)lpstrText, cchText);\r
+       }\r
+\r
+       // bKeepWithFocus - Vista only\r
+       BOOL SetCueBannerText(LPCWSTR lpstrText, BOOL bKeepWithFocus = FALSE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, EM_SETCUEBANNER, (WPARAM)bKeepWithFocus, (LPARAM)(lpstrText));\r
+       }\r
+#endif // (_WIN32_WINNT >= 0x0501)\r
+\r
+// Operations\r
+       void EmptyUndoBuffer()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, EM_EMPTYUNDOBUFFER, 0, 0L);\r
+       }\r
+\r
+       BOOL FmtLines(BOOL bAddEOL)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, EM_FMTLINES, bAddEOL, 0L);\r
+       }\r
+\r
+       void LimitText(int nChars = 0)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, EM_LIMITTEXT, nChars, 0L);\r
+       }\r
+\r
+       int LineFromChar(int nIndex = -1) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, EM_LINEFROMCHAR, nIndex, 0L);\r
+       }\r
+\r
+       int LineIndex(int nLine = -1) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, EM_LINEINDEX, nLine, 0L);\r
+       }\r
+\r
+       int LineLength(int nLine = -1) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, EM_LINELENGTH, nLine, 0L);\r
+       }\r
+\r
+       void LineScroll(int nLines, int nChars = 0)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, EM_LINESCROLL, nChars, nLines);\r
+       }\r
+\r
+       void ReplaceSel(LPCTSTR lpszNewText, BOOL bCanUndo = FALSE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, EM_REPLACESEL, (WPARAM) bCanUndo, (LPARAM)lpszNewText);\r
+       }\r
+\r
+       void SetRect(LPCRECT lpRect)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, EM_SETRECT, 0, (LPARAM)lpRect);\r
+       }\r
+\r
+       void SetRectNP(LPCRECT lpRect)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, EM_SETRECTNP, 0, (LPARAM)lpRect);\r
+       }\r
+\r
+       void SetSel(DWORD dwSelection, BOOL bNoScroll = FALSE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, EM_SETSEL, LOWORD(dwSelection), HIWORD(dwSelection));\r
+               if(!bNoScroll)\r
+                       ::SendMessage(m_hWnd, EM_SCROLLCARET, 0, 0L);\r
+       }\r
+\r
+       void SetSel(int nStartChar, int nEndChar, BOOL bNoScroll = FALSE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, EM_SETSEL, nStartChar, nEndChar);\r
+               if(!bNoScroll)\r
+                       ::SendMessage(m_hWnd, EM_SCROLLCARET, 0, 0L);\r
+       }\r
+\r
+       void SetSelAll(BOOL bNoScroll = FALSE)\r
+       {\r
+               SetSel(0, -1, bNoScroll);\r
+       }\r
+\r
+       void SetSelNone(BOOL bNoScroll = FALSE)\r
+       {\r
+               SetSel(-1, 0, bNoScroll);\r
+       }\r
+\r
+       BOOL SetTabStops(int nTabStops, LPINT rgTabStops)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, EM_SETTABSTOPS, nTabStops, (LPARAM)rgTabStops);\r
+       }\r
+\r
+       BOOL SetTabStops()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, EM_SETTABSTOPS, 0, 0L);\r
+       }\r
+\r
+       BOOL SetTabStops(const int& cxEachStop)    // takes an 'int'\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, EM_SETTABSTOPS, 1, (LPARAM)(LPINT)&cxEachStop);\r
+       }\r
+\r
+       void ScrollCaret()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, EM_SCROLLCARET, 0, 0L);\r
+       }\r
+\r
+       int Scroll(int nScrollAction)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT((GetStyle() & ES_MULTILINE) != 0);\r
+               LRESULT lRet = ::SendMessage(m_hWnd, EM_SCROLL, nScrollAction, 0L);\r
+               if(!(BOOL)HIWORD(lRet))\r
+                       return -1;   // failed\r
+               return (int)(short)LOWORD(lRet);\r
+               \r
+       }\r
+\r
+       void InsertText(int nInsertAfterChar, LPCTSTR lpstrText, BOOL bNoScroll = FALSE, BOOL bCanUndo = FALSE)\r
+       {\r
+               SetSel(nInsertAfterChar, nInsertAfterChar, bNoScroll);\r
+               ReplaceSel(lpstrText, bCanUndo);\r
+       }\r
+\r
+       void AppendText(LPCTSTR lpstrText, BOOL bNoScroll = FALSE, BOOL bCanUndo = FALSE)\r
+       {\r
+               InsertText(GetWindowTextLength(), lpstrText, bNoScroll, bCanUndo);\r
+       }\r
+\r
+#if (_WIN32_WINNT >= 0x0501)\r
+       BOOL ShowBalloonTip(PEDITBALLOONTIP pEditBaloonTip)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, EM_SHOWBALLOONTIP, 0, (LPARAM)pEditBaloonTip);\r
+       }\r
+\r
+       BOOL HideBalloonTip()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, EM_HIDEBALLOONTIP, 0, 0L);\r
+       }\r
+#endif // (_WIN32_WINNT >= 0x0501)\r
+\r
+#if (_WIN32_WINNT >= 0x0600)\r
+       DWORD GetHilite() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (DWORD)::SendMessage(m_hWnd, EM_GETHILITE, 0, 0L);\r
+       }\r
+\r
+       void GetHilite(int& nStartChar, int& nEndChar) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               DWORD dwRet = (DWORD)::SendMessage(m_hWnd, EM_GETHILITE, 0, 0L);\r
+               nStartChar = (int)(short)LOWORD(dwRet);\r
+               nEndChar = (int)(short)HIWORD(dwRet);\r
+       }\r
+\r
+       void SetHilite(int nStartChar, int nEndChar)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, EM_SETHILITE, nStartChar, nEndChar);\r
+       }\r
+#endif // (_WIN32_WINNT >= 0x0600)\r
+\r
+       // Clipboard operations\r
+       BOOL Undo()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, EM_UNDO, 0, 0L);\r
+       }\r
+\r
+       void Clear()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, WM_CLEAR, 0, 0L);\r
+       }\r
+\r
+       void Copy()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, WM_COPY, 0, 0L);\r
+       }\r
+\r
+       void Cut()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, WM_CUT, 0, 0L);\r
+       }\r
+\r
+       void Paste()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, WM_PASTE, 0, 0L);\r
+       }\r
+\r
+#ifdef WIN32_PLATFORM_WFSP   // SmartPhone only messages\r
+       DWORD GetExtendedStyle()\r
+       {\r
+               return SendMessage(EM_GETEXTENDEDSTYLE);\r
+       }\r
+\r
+       DWORD SetExtendedStyle(DWORD dwMask, DWORD dwExStyle)\r
+       {\r
+               return SendMessage(EM_SETEXTENDEDSTYLE, (WPARAM)dwMask, (LPARAM)dwExStyle);\r
+       }\r
+\r
+       DWORD GetInputMode(BOOL bCurrentMode = TRUE)\r
+       {\r
+               return SendMessage(EM_GETINPUTMODE, 0, (LPARAM)bCurrentMode);\r
+       }\r
+\r
+       BOOL SetInputMode(DWORD dwMode)\r
+       {\r
+               return SendMessage(EM_SETINPUTMODE, 0, (LPARAM)dwMode);\r
+       }\r
+\r
+       BOOL SetSymbols(LPCTSTR szSymbols)\r
+       {\r
+               return SendMessage(EM_SETSYMBOLS, 0, (LPARAM)szSymbols);\r
+       }\r
+\r
+       BOOL ResetSymbols()\r
+       {\r
+               return SendMessage(EM_SETSYMBOLS);\r
+       }\r
+#endif // WIN32_PLATFORM_WFSP\r
+};\r
+\r
+typedef CEditT<ATL::CWindow>   CEdit;\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CEditCommands - message handlers for standard EDIT commands\r
+\r
+// Chain to CEditCommands message map. Your class must also derive from CEdit.\r
+// Example:\r
+// class CMyEdit : public CWindowImpl<CMyEdit, CEdit>,\r
+//                 public CEditCommands<CMyEdit>\r
+// {\r
+// public:\r
+//      BEGIN_MSG_MAP(CMyEdit)\r
+//              // your handlers...\r
+//              CHAIN_MSG_MAP_ALT(CEditCommands<CMyEdit>, 1)\r
+//      END_MSG_MAP()\r
+//      // other stuff...\r
+// };\r
+\r
+template <class T>\r
+class CEditCommands\r
+{\r
+public:\r
+       BEGIN_MSG_MAP(CEditCommands< T >)\r
+       ALT_MSG_MAP(1)\r
+               COMMAND_ID_HANDLER(ID_EDIT_CLEAR, OnEditClear)\r
+               COMMAND_ID_HANDLER(ID_EDIT_CLEAR_ALL, OnEditClearAll)\r
+               COMMAND_ID_HANDLER(ID_EDIT_COPY, OnEditCopy)\r
+               COMMAND_ID_HANDLER(ID_EDIT_CUT, OnEditCut)\r
+               COMMAND_ID_HANDLER(ID_EDIT_PASTE, OnEditPaste)\r
+               COMMAND_ID_HANDLER(ID_EDIT_SELECT_ALL, OnEditSelectAll)\r
+               COMMAND_ID_HANDLER(ID_EDIT_UNDO, OnEditUndo)\r
+       END_MSG_MAP()\r
+\r
+       LRESULT OnEditClear(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               pT->Clear();\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnEditClearAll(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               pT->SetSel(0, -1);\r
+               pT->Clear();\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnEditCopy(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               pT->Copy();\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnEditCut(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               pT->Cut();\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnEditPaste(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               pT->Paste();\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnEditSelectAll(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               pT->SetSel(0, -1);\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnEditUndo(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               pT->Undo();\r
+               return 0;\r
+       }\r
+\r
+// State (update UI) helpers\r
+       BOOL CanCut() const\r
+       { return HasSelection(); }\r
+\r
+       BOOL CanCopy() const\r
+       { return HasSelection(); }\r
+\r
+       BOOL CanClear() const\r
+       { return HasSelection(); }\r
+\r
+       BOOL CanSelectAll() const\r
+       { return HasText(); }\r
+\r
+       BOOL CanFind() const\r
+       { return HasText(); }\r
+\r
+       BOOL CanRepeat() const\r
+       { return HasText(); }\r
+\r
+       BOOL CanReplace() const\r
+       { return HasText(); }\r
+\r
+       BOOL CanClearAll() const\r
+       { return HasText(); }\r
+\r
+// Implementation\r
+       BOOL HasSelection() const\r
+       {\r
+               const T* pT = static_cast<const T*>(this);\r
+               int nMin, nMax;\r
+               ::SendMessage(pT->m_hWnd, EM_GETSEL, (WPARAM)&nMin, (LPARAM)&nMax);\r
+               return (nMin != nMax);\r
+       }\r
+\r
+       BOOL HasText() const\r
+       {\r
+               const T* pT = static_cast<const T*>(this);\r
+               return (pT->GetWindowTextLength() > 0);\r
+       }\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CScrollBar - client side for a Windows SCROLLBAR control\r
+\r
+template <class TBase>\r
+class CScrollBarT : public TBase\r
+{\r
+public:\r
+// Constructors\r
+       CScrollBarT(HWND hWnd = NULL) : TBase(hWnd)\r
+       { }\r
+\r
+       CScrollBarT< TBase >& operator =(HWND hWnd)\r
+       {\r
+               m_hWnd = hWnd;\r
+               return *this;\r
+       }\r
+\r
+       HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,\r
+                       DWORD dwStyle = 0, DWORD dwExStyle = 0,\r
+                       ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)\r
+       {\r
+               return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);\r
+       }\r
+\r
+// Attributes\r
+       static LPCTSTR GetWndClassName()\r
+       {\r
+               return _T("SCROLLBAR");\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       int GetScrollPos() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return ::GetScrollPos(m_hWnd, SB_CTL);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       int SetScrollPos(int nPos, BOOL bRedraw = TRUE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return ::SetScrollPos(m_hWnd, SB_CTL, nPos, bRedraw);\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       void GetScrollRange(LPINT lpMinPos, LPINT lpMaxPos) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::GetScrollRange(m_hWnd, SB_CTL, lpMinPos, lpMaxPos);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       void SetScrollRange(int nMinPos, int nMaxPos, BOOL bRedraw = TRUE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SetScrollRange(m_hWnd, SB_CTL, nMinPos, nMaxPos, bRedraw);\r
+       }\r
+\r
+       BOOL GetScrollInfo(LPSCROLLINFO lpScrollInfo) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return ::GetScrollInfo(m_hWnd, SB_CTL, lpScrollInfo);\r
+       }\r
+\r
+       int SetScrollInfo(LPSCROLLINFO lpScrollInfo, BOOL bRedraw = TRUE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return ::SetScrollInfo(m_hWnd, SB_CTL, lpScrollInfo, bRedraw);\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       int GetScrollLimit() const\r
+       {\r
+               int nMin = 0, nMax = 0;\r
+               ::GetScrollRange(m_hWnd, SB_CTL, &nMin, &nMax);\r
+               SCROLLINFO info = { 0 };\r
+               info.cbSize = sizeof(SCROLLINFO);\r
+               info.fMask = SIF_PAGE;\r
+               if(::GetScrollInfo(m_hWnd, SB_CTL, &info))\r
+                       nMax -= ((info.nPage - 1) > 0) ? (info.nPage - 1) : 0;\r
+\r
+               return nMax;\r
+       }\r
+\r
+#if (WINVER >= 0x0500)\r
+       BOOL GetScrollBarInfo(PSCROLLBARINFO pScrollBarInfo) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+#if (_WIN32_WINNT >= 0x0501)\r
+               return (BOOL)::SendMessage(m_hWnd, SBM_GETSCROLLBARINFO, 0, (LPARAM)pScrollBarInfo);\r
+#else // !(_WIN32_WINNT >= 0x0501)\r
+               return ::GetScrollBarInfo(m_hWnd, OBJID_CLIENT, pScrollBarInfo);\r
+#endif // !(_WIN32_WINNT >= 0x0501)\r
+       }\r
+#endif // (WINVER >= 0x0500)\r
+\r
+// Operations\r
+       void ShowScrollBar(BOOL bShow = TRUE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::ShowScrollBar(m_hWnd, SB_CTL, bShow);\r
+       }\r
+\r
+       BOOL EnableScrollBar(UINT nArrowFlags = ESB_ENABLE_BOTH)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return ::EnableScrollBar(m_hWnd, SB_CTL, nArrowFlags);\r
+       }\r
+#endif // !_WIN32_WCE\r
+};\r
+\r
+typedef CScrollBarT<ATL::CWindow>   CScrollBar;\r
+\r
+\r
+// --- Windows Common Controls ---\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CImageList\r
+\r
+class CImageList\r
+{\r
+public:\r
+       HIMAGELIST m_hImageList;\r
+\r
+// Constructor\r
+       CImageList(HIMAGELIST hImageList = NULL) : m_hImageList(hImageList)\r
+       { }\r
+\r
+// Operators, etc.\r
+       CImageList& operator =(HIMAGELIST hImageList)\r
+       {\r
+               m_hImageList = hImageList;\r
+               return *this;\r
+       }\r
+\r
+       operator HIMAGELIST() const { return m_hImageList; }\r
+\r
+       void Attach(HIMAGELIST hImageList)\r
+       {\r
+               ATLASSERT(m_hImageList == NULL);\r
+               ATLASSERT(hImageList != NULL);\r
+               m_hImageList = hImageList;\r
+       }\r
+\r
+       HIMAGELIST Detach()\r
+       {\r
+               HIMAGELIST hImageList = m_hImageList;\r
+               m_hImageList = NULL;\r
+               return hImageList;\r
+       }\r
+\r
+       bool IsNull() const { return (m_hImageList == NULL); }\r
+\r
+// Attributes\r
+       int GetImageCount() const\r
+       {\r
+               ATLASSERT(m_hImageList != NULL);\r
+               return ImageList_GetImageCount(m_hImageList);\r
+       }\r
+\r
+       COLORREF GetBkColor() const\r
+       {\r
+               ATLASSERT(m_hImageList != NULL);\r
+               return ImageList_GetBkColor(m_hImageList);\r
+       }\r
+\r
+       COLORREF SetBkColor(COLORREF cr)\r
+       {\r
+               ATLASSERT(m_hImageList != NULL);\r
+               return ImageList_SetBkColor(m_hImageList, cr);\r
+       }\r
+\r
+       BOOL GetImageInfo(int nImage, IMAGEINFO* pImageInfo) const\r
+       {\r
+               ATLASSERT(m_hImageList != NULL);\r
+               return ImageList_GetImageInfo(m_hImageList, nImage, pImageInfo);\r
+       }\r
+\r
+       HICON GetIcon(int nIndex, UINT uFlags = ILD_NORMAL) const\r
+       {\r
+               ATLASSERT(m_hImageList != NULL);\r
+               return ImageList_GetIcon(m_hImageList, nIndex, uFlags);\r
+       }\r
+\r
+       BOOL GetIconSize(int& cx, int& cy) const\r
+       {\r
+               ATLASSERT(m_hImageList != NULL);\r
+               return ImageList_GetIconSize(m_hImageList, &cx, &cy);\r
+       }\r
+\r
+       BOOL GetIconSize(SIZE& size) const\r
+       {\r
+               ATLASSERT(m_hImageList != NULL);\r
+               return ImageList_GetIconSize(m_hImageList, (int*)&size.cx, (int*)&size.cy);\r
+       }\r
+\r
+       BOOL SetIconSize(int cx, int cy)\r
+       {\r
+               ATLASSERT(m_hImageList != NULL);\r
+               return ImageList_SetIconSize(m_hImageList, cx, cy);\r
+       }\r
+\r
+       BOOL SetIconSize(SIZE size)\r
+       {\r
+               ATLASSERT(m_hImageList != NULL);\r
+               return ImageList_SetIconSize(m_hImageList, size.cx, size.cy);\r
+       }\r
+\r
+       BOOL SetImageCount(UINT uNewCount)\r
+       {\r
+               ATLASSERT(m_hImageList != NULL);\r
+               return ImageList_SetImageCount(m_hImageList, uNewCount);\r
+       }\r
+\r
+       BOOL SetOverlayImage(int nImage, int nOverlay)\r
+       {\r
+               ATLASSERT(m_hImageList != NULL);\r
+               return ImageList_SetOverlayImage(m_hImageList, nImage, nOverlay);\r
+       }\r
+\r
+// Operations\r
+       BOOL Create(int cx, int cy, UINT nFlags, int nInitial, int nGrow)\r
+       {\r
+               ATLASSERT(m_hImageList == NULL);\r
+               m_hImageList = ImageList_Create(cx, cy, nFlags, nInitial, nGrow);\r
+               return (m_hImageList != NULL) ? TRUE : FALSE;\r
+       }\r
+\r
+       BOOL Create(ATL::_U_STRINGorID bitmap, int cx, int nGrow, COLORREF crMask)\r
+       {\r
+               ATLASSERT(m_hImageList == NULL);\r
+               m_hImageList = ImageList_LoadBitmap(ModuleHelper::GetResourceInstance(), bitmap.m_lpstr, cx, nGrow, crMask);\r
+               return (m_hImageList != NULL) ? TRUE : FALSE;\r
+       }\r
+\r
+       BOOL CreateFromImage(ATL::_U_STRINGorID image, int cx, int nGrow, COLORREF crMask, UINT uType, UINT uFlags = LR_DEFAULTCOLOR | LR_DEFAULTSIZE)\r
+       {\r
+               ATLASSERT(m_hImageList == NULL);\r
+               m_hImageList = ImageList_LoadImage(ModuleHelper::GetResourceInstance(), image.m_lpstr, cx, nGrow, crMask, uType, uFlags);\r
+               return (m_hImageList != NULL) ? TRUE : FALSE;\r
+       }\r
+\r
+       BOOL Merge(HIMAGELIST hImageList1, int nImage1, HIMAGELIST hImageList2, int nImage2, int dx, int dy)\r
+       {\r
+               ATLASSERT(m_hImageList == NULL);\r
+               m_hImageList = ImageList_Merge(hImageList1, nImage1, hImageList2, nImage2, dx, dy);\r
+               return (m_hImageList != NULL) ? TRUE : FALSE;\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+#ifdef __IStream_INTERFACE_DEFINED__\r
+       BOOL CreateFromStream(LPSTREAM lpStream)\r
+       {\r
+               ATLASSERT(m_hImageList == NULL);\r
+               m_hImageList = ImageList_Read(lpStream);\r
+               return (m_hImageList != NULL) ? TRUE : FALSE;\r
+       }\r
+#endif // __IStream_INTERFACE_DEFINED__\r
+#endif // !_WIN32_WCE\r
+\r
+       BOOL Destroy()\r
+       {\r
+               if (m_hImageList == NULL)\r
+                       return FALSE;\r
+               BOOL bRet = ImageList_Destroy(m_hImageList);\r
+               if(bRet)\r
+                       m_hImageList = NULL;\r
+               return bRet;\r
+       }\r
+\r
+       int Add(HBITMAP hBitmap, HBITMAP hBitmapMask = NULL)\r
+       {\r
+               ATLASSERT(m_hImageList != NULL);\r
+               return ImageList_Add(m_hImageList, hBitmap, hBitmapMask);\r
+       }\r
+\r
+       int Add(HBITMAP hBitmap, COLORREF crMask)\r
+       {\r
+               ATLASSERT(m_hImageList != NULL);\r
+               return ImageList_AddMasked(m_hImageList, hBitmap, crMask);\r
+       }\r
+\r
+       BOOL Remove(int nImage)\r
+       {\r
+               ATLASSERT(m_hImageList != NULL);\r
+               return ImageList_Remove(m_hImageList, nImage);\r
+       }\r
+\r
+       BOOL RemoveAll()\r
+       {\r
+               ATLASSERT(m_hImageList != NULL);\r
+               return ImageList_RemoveAll(m_hImageList);\r
+       }\r
+\r
+       BOOL Replace(int nImage, HBITMAP hBitmap, HBITMAP hBitmapMask)\r
+       {\r
+               ATLASSERT(m_hImageList != NULL);\r
+               return ImageList_Replace(m_hImageList, nImage, hBitmap, hBitmapMask);\r
+       }\r
+\r
+       int AddIcon(HICON hIcon)\r
+       {\r
+               ATLASSERT(m_hImageList != NULL);\r
+               return ImageList_AddIcon(m_hImageList, hIcon);\r
+       }\r
+\r
+       int ReplaceIcon(int nImage, HICON hIcon)\r
+       {\r
+               ATLASSERT(m_hImageList != NULL);\r
+               return ImageList_ReplaceIcon(m_hImageList, nImage, hIcon);\r
+       }\r
+\r
+       HICON ExtractIcon(int nImage)\r
+       {\r
+               ATLASSERT(m_hImageList != NULL);\r
+               return ImageList_ExtractIcon(NULL, m_hImageList, nImage);\r
+       }\r
+\r
+       BOOL Draw(HDC hDC, int nImage, int x, int y, UINT nStyle)\r
+       {\r
+               ATLASSERT(m_hImageList != NULL);\r
+               ATLASSERT(hDC != NULL);\r
+               return ImageList_Draw(m_hImageList, nImage, hDC, x, y, nStyle);\r
+       }\r
+\r
+       BOOL Draw(HDC hDC, int nImage, POINT pt, UINT nStyle)\r
+       {\r
+               ATLASSERT(m_hImageList != NULL);\r
+               ATLASSERT(hDC != NULL);\r
+               return ImageList_Draw(m_hImageList, nImage, hDC, pt.x, pt.y, nStyle);\r
+       }\r
+\r
+       BOOL DrawEx(int nImage, HDC hDC, int x, int y, int dx, int dy, COLORREF rgbBk, COLORREF rgbFg, UINT fStyle)\r
+       {\r
+               ATLASSERT(m_hImageList != NULL);\r
+               ATLASSERT(hDC != NULL);\r
+               return ImageList_DrawEx(m_hImageList, nImage, hDC, x, y, dx, dy, rgbBk, rgbFg, fStyle);\r
+       }\r
+\r
+       BOOL DrawEx(int nImage, HDC hDC, RECT& rect, COLORREF rgbBk, COLORREF rgbFg, UINT fStyle)\r
+       {\r
+               ATLASSERT(m_hImageList != NULL);\r
+               ATLASSERT(hDC != NULL);\r
+               return ImageList_DrawEx(m_hImageList, nImage, hDC, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, rgbBk, rgbFg, fStyle);\r
+       }\r
+\r
+       static BOOL DrawIndirect(IMAGELISTDRAWPARAMS* pimldp)\r
+       {\r
+               return ImageList_DrawIndirect(pimldp);\r
+       }\r
+\r
+       BOOL Copy(int nSrc, int nDst, UINT uFlags = ILCF_MOVE)\r
+       {\r
+               ATLASSERT(m_hImageList != NULL);\r
+               return ImageList_Copy(m_hImageList, nDst, m_hImageList, nSrc, uFlags);\r
+       }\r
+\r
+#ifdef __IStream_INTERFACE_DEFINED__\r
+#ifndef _WIN32_WCE\r
+       static HIMAGELIST Read(LPSTREAM lpStream)\r
+       {\r
+               return ImageList_Read(lpStream);\r
+       }\r
+\r
+       BOOL Write(LPSTREAM lpStream)\r
+       {\r
+               ATLASSERT(m_hImageList != NULL);\r
+               return ImageList_Write(m_hImageList, lpStream);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+#if (_WIN32_WINNT >= 0x0501)\r
+       static HRESULT ReadEx(DWORD dwFlags, LPSTREAM lpStream, REFIID riid, PVOID* ppv)\r
+       {\r
+               return ImageList_ReadEx(dwFlags, lpStream, riid, ppv);\r
+       }\r
+\r
+       HRESULT WriteEx(DWORD dwFlags, LPSTREAM lpStream)\r
+       {\r
+               ATLASSERT(m_hImageList != NULL);\r
+               return ImageList_WriteEx(m_hImageList, dwFlags, lpStream);\r
+       }\r
+#endif // (_WIN32_WINNT >= 0x0501)\r
+#endif // __IStream_INTERFACE_DEFINED__\r
+\r
+       // Drag operations\r
+       BOOL BeginDrag(int nImage, POINT ptHotSpot)\r
+       {\r
+               ATLASSERT(m_hImageList != NULL);\r
+               return ImageList_BeginDrag(m_hImageList, nImage, ptHotSpot.x, ptHotSpot.y);\r
+       }\r
+\r
+       BOOL BeginDrag(int nImage, int xHotSpot, int yHotSpot)\r
+       {\r
+               ATLASSERT(m_hImageList != NULL);\r
+               return ImageList_BeginDrag(m_hImageList, nImage, xHotSpot, yHotSpot);\r
+       }\r
+\r
+       static void EndDrag()\r
+       {\r
+               ImageList_EndDrag();\r
+       }\r
+\r
+       static BOOL DragMove(POINT pt)\r
+       {\r
+               return ImageList_DragMove(pt.x, pt.y);\r
+       }\r
+\r
+       static BOOL DragMove(int x, int y)\r
+       {\r
+               return ImageList_DragMove(x, y);\r
+       }\r
+\r
+       BOOL SetDragCursorImage(int nDrag, POINT ptHotSpot)\r
+       {\r
+               ATLASSERT(m_hImageList != NULL);\r
+               return ImageList_SetDragCursorImage(m_hImageList, nDrag, ptHotSpot.x, ptHotSpot.y);\r
+       }\r
+\r
+       BOOL SetDragCursorImage(int nDrag, int xHotSpot, int yHotSpot)\r
+       {\r
+               ATLASSERT(m_hImageList != NULL);\r
+               return ImageList_SetDragCursorImage(m_hImageList, nDrag, xHotSpot, yHotSpot);\r
+       }\r
+\r
+       static BOOL DragShowNolock(BOOL bShow = TRUE)\r
+       {\r
+               return ImageList_DragShowNolock(bShow);\r
+       }\r
+\r
+       static CImageList GetDragImage(LPPOINT lpPoint, LPPOINT lpPointHotSpot)\r
+       {\r
+               return CImageList(ImageList_GetDragImage(lpPoint, lpPointHotSpot));\r
+       }\r
+\r
+       static BOOL DragEnter(HWND hWnd, POINT point)\r
+       {\r
+               return ImageList_DragEnter(hWnd, point.x, point.y);\r
+       }\r
+\r
+       static BOOL DragEnter(HWND hWnd, int x, int y)\r
+       {\r
+               return ImageList_DragEnter(hWnd, x, y);\r
+       }\r
+\r
+       static BOOL DragLeave(HWND hWnd)\r
+       {\r
+               return ImageList_DragLeave(hWnd);\r
+       }\r
+\r
+#if (_WIN32_IE >= 0x0400)\r
+       CImageList Duplicate() const\r
+       {\r
+               ATLASSERT(m_hImageList != NULL);\r
+               return CImageList(ImageList_Duplicate(m_hImageList));\r
+       }\r
+\r
+       static CImageList Duplicate(HIMAGELIST hImageList)\r
+       {\r
+               ATLASSERT(hImageList != NULL);\r
+               return CImageList(ImageList_Duplicate(hImageList));\r
+       }\r
+#endif // (_WIN32_IE >= 0x0400)\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CToolTipCtrl\r
+\r
+#ifndef _WIN32_WCE\r
+\r
+class CToolInfo : public TOOLINFO\r
+{\r
+public:\r
+       CToolInfo(UINT nFlags, HWND hWnd, UINT nIDTool = 0, LPRECT lpRect = NULL, LPTSTR lpstrText = LPSTR_TEXTCALLBACK, LPARAM lUserParam = NULL)\r
+       {\r
+               Init(nFlags, hWnd, nIDTool, lpRect, lpstrText, lUserParam);\r
+       }\r
+\r
+       operator LPTOOLINFO() { return this; }\r
+\r
+       operator LPARAM() { return (LPARAM)this; }\r
+\r
+       void Init(UINT nFlags, HWND hWnd, UINT nIDTool = 0, LPRECT lpRect = NULL, LPTSTR lpstrText = LPSTR_TEXTCALLBACK, LPARAM lUserParam = NULL)\r
+       {\r
+               ATLASSERT(::IsWindow(hWnd));\r
+               memset(this, 0, sizeof(TOOLINFO));\r
+               cbSize = sizeof(TOOLINFO);\r
+               uFlags = nFlags;\r
+               if(nIDTool == 0)\r
+               {\r
+                       hwnd = ::GetParent(hWnd);\r
+                       uFlags |= TTF_IDISHWND;\r
+                       uId = (UINT_PTR)hWnd;\r
+               }\r
+               else\r
+               {\r
+                       hwnd = hWnd;\r
+                       uId = nIDTool;\r
+               }\r
+               if(lpRect != NULL)\r
+                       rect = *lpRect;\r
+               hinst = ModuleHelper::GetResourceInstance();\r
+               lpszText = lpstrText;\r
+               lParam = lUserParam;\r
+       }\r
+};\r
+\r
+template <class TBase>\r
+class CToolTipCtrlT : public TBase\r
+{\r
+public:\r
+// Constructors\r
+       CToolTipCtrlT(HWND hWnd = NULL) : TBase(hWnd)\r
+       { }\r
+\r
+       CToolTipCtrlT< TBase >& operator =(HWND hWnd)\r
+       {\r
+               m_hWnd = hWnd;\r
+               return *this;\r
+       }\r
+\r
+       HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,\r
+                       DWORD dwStyle = 0, DWORD dwExStyle = 0,\r
+                       ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)\r
+       {\r
+               return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);\r
+       }\r
+\r
+// Attributes\r
+       static LPCTSTR GetWndClassName()\r
+       {\r
+               return TOOLTIPS_CLASS;\r
+       }\r
+\r
+       void GetText(LPTOOLINFO lpToolInfo) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, TTM_GETTEXT, 0, (LPARAM)&lpToolInfo);\r
+       }\r
+\r
+       void GetText(LPTSTR lpstrText, HWND hWnd, UINT nIDTool = 0) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(hWnd != NULL);\r
+               CToolInfo ti(0, hWnd, nIDTool, NULL, lpstrText);\r
+               ::SendMessage(m_hWnd, TTM_GETTEXT, 0, ti);\r
+       }\r
+\r
+       BOOL GetToolInfo(LPTOOLINFO lpToolInfo) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TTM_GETTOOLINFO, 0, (LPARAM)lpToolInfo);\r
+       }\r
+\r
+       BOOL GetToolInfo(HWND hWnd, UINT nIDTool, UINT* puFlags, LPRECT lpRect, LPTSTR lpstrText) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(hWnd != NULL);\r
+               ATLASSERT(puFlags != NULL);\r
+               ATLASSERT(lpRect != NULL);\r
+               CToolInfo ti(0, hWnd, nIDTool, NULL, lpstrText);\r
+               BOOL bRet = (BOOL)::SendMessage(m_hWnd, TTM_GETTOOLINFO, 0, ti);\r
+               if(bRet != FALSE)\r
+               {\r
+                       *puFlags = ti.uFlags;\r
+                       *lpRect = ti.rect;\r
+               }\r
+               return bRet;\r
+       }\r
+\r
+       void SetToolInfo(LPTOOLINFO lpToolInfo)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, TTM_SETTOOLINFO, 0, (LPARAM)lpToolInfo);\r
+       }\r
+\r
+       void SetToolRect(LPTOOLINFO lpToolInfo)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, TTM_NEWTOOLRECT, 0, (LPARAM)lpToolInfo);\r
+       }\r
+\r
+       void SetToolRect(HWND hWnd, UINT nIDTool, LPCRECT lpRect)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(hWnd != NULL);\r
+               ATLASSERT(nIDTool != 0);\r
+\r
+               CToolInfo ti(0, hWnd, nIDTool, (LPRECT)lpRect, NULL);\r
+               ::SendMessage(m_hWnd, TTM_NEWTOOLRECT, 0, ti);\r
+       }\r
+\r
+       int GetToolCount() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, TTM_GETTOOLCOUNT, 0, 0L);\r
+       }\r
+\r
+       int GetDelayTime(DWORD dwType) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, TTM_GETDELAYTIME, dwType, 0L);\r
+       }\r
+\r
+       void SetDelayTime(DWORD dwType, int nTime)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, TTM_SETDELAYTIME, dwType, MAKELPARAM(nTime, 0));\r
+       }\r
+\r
+       void GetMargin(LPRECT lpRect) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, TTM_GETMARGIN, 0, (LPARAM)lpRect);\r
+       }\r
+\r
+       void SetMargin(LPRECT lpRect)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, TTM_SETMARGIN, 0, (LPARAM)lpRect);\r
+       }\r
+\r
+       int GetMaxTipWidth() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, TTM_GETMAXTIPWIDTH, 0, 0L);\r
+       }\r
+\r
+       int SetMaxTipWidth(int nWidth)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, TTM_SETMAXTIPWIDTH, 0, nWidth);\r
+       }\r
+\r
+       COLORREF GetTipBkColor() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (COLORREF)::SendMessage(m_hWnd, TTM_GETTIPBKCOLOR, 0, 0L);\r
+       }\r
+\r
+       void SetTipBkColor(COLORREF clr)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, TTM_SETTIPBKCOLOR, (WPARAM)clr, 0L);\r
+       }\r
+\r
+       COLORREF GetTipTextColor() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (COLORREF)::SendMessage(m_hWnd, TTM_GETTIPTEXTCOLOR, 0, 0L);\r
+       }\r
+\r
+       void SetTipTextColor(COLORREF clr)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, TTM_SETTIPTEXTCOLOR, (WPARAM)clr, 0L);\r
+       }\r
+\r
+       BOOL GetCurrentTool(LPTOOLINFO lpToolInfo) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TTM_GETCURRENTTOOL, 0, (LPARAM)lpToolInfo);\r
+       }\r
+\r
+#if (_WIN32_IE >= 0x0500)\r
+       SIZE GetBubbleSize(LPTOOLINFO lpToolInfo) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               DWORD dwRet = (DWORD)::SendMessage(m_hWnd, TTM_GETBUBBLESIZE, 0, (LPARAM)lpToolInfo);\r
+               SIZE size = { GET_X_LPARAM(dwRet), GET_Y_LPARAM(dwRet) };\r
+               return size;\r
+       }\r
+\r
+       BOOL SetTitle(UINT uIcon, LPCTSTR lpstrTitle)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TTM_SETTITLE, uIcon, (LPARAM)lpstrTitle);\r
+       }\r
+#endif // (_WIN32_IE >= 0x0500)\r
+\r
+#if (_WIN32_WINNT >= 0x0501)\r
+       void GetTitle(PTTGETTITLE pTTGetTitle) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, TTM_GETTITLE, 0, (LPARAM)pTTGetTitle);\r
+       }\r
+\r
+       void SetWindowTheme(LPCWSTR lpstrTheme)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, TTM_SETWINDOWTHEME, 0, (LPARAM)lpstrTheme);\r
+       }\r
+#endif // (_WIN32_WINNT >= 0x0501)\r
+\r
+// Operations\r
+       void Activate(BOOL bActivate)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, TTM_ACTIVATE, bActivate, 0L);\r
+       }\r
+\r
+       BOOL AddTool(LPTOOLINFO lpToolInfo)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TTM_ADDTOOL, 0, (LPARAM)lpToolInfo);\r
+       }\r
+\r
+       BOOL AddTool(HWND hWnd, ATL::_U_STRINGorID text = LPSTR_TEXTCALLBACK, LPCRECT lpRectTool = NULL, UINT nIDTool = 0)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(hWnd != NULL);\r
+               // the toolrect and toolid must both be zero or both valid\r
+               ATLASSERT((lpRectTool != NULL && nIDTool != 0) || (lpRectTool == NULL && nIDTool == 0));\r
+\r
+               CToolInfo ti(0, hWnd, nIDTool, (LPRECT)lpRectTool, (LPTSTR)text.m_lpstr);\r
+               return (BOOL)::SendMessage(m_hWnd, TTM_ADDTOOL, 0, ti);\r
+       }\r
+\r
+       void DelTool(LPTOOLINFO lpToolInfo)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, TTM_DELTOOL, 0, (LPARAM)lpToolInfo);\r
+       }\r
+\r
+       void DelTool(HWND hWnd, UINT nIDTool = 0)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(hWnd != NULL);\r
+\r
+               CToolInfo ti(0, hWnd, nIDTool, NULL, NULL);\r
+               ::SendMessage(m_hWnd, TTM_DELTOOL, 0, ti);\r
+       }\r
+\r
+       BOOL HitTest(LPTTHITTESTINFO lpHitTestInfo) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TTM_HITTEST, 0, (LPARAM)lpHitTestInfo);\r
+       }\r
+\r
+       BOOL HitTest(HWND hWnd, POINT pt, LPTOOLINFO lpToolInfo) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(hWnd != NULL);\r
+               ATLASSERT(lpToolInfo != NULL);\r
+\r
+               TTHITTESTINFO hti = { 0 };\r
+               hti.ti.cbSize = sizeof(TOOLINFO);\r
+               hti.hwnd = hWnd;\r
+               hti.pt.x = pt.x;\r
+               hti.pt.y = pt.y;\r
+               if((BOOL)::SendMessage(m_hWnd, TTM_HITTEST, 0, (LPARAM)&hti) != FALSE)\r
+               {\r
+                       *lpToolInfo = hti.ti;\r
+                       return TRUE;\r
+               }\r
+               return FALSE;\r
+       }\r
+\r
+       void RelayEvent(LPMSG lpMsg)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, TTM_RELAYEVENT, 0, (LPARAM)lpMsg);\r
+       }\r
+\r
+       void UpdateTipText(LPTOOLINFO lpToolInfo)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, TTM_UPDATETIPTEXT, 0, (LPARAM)lpToolInfo);\r
+       }\r
+\r
+       void UpdateTipText(ATL::_U_STRINGorID text, HWND hWnd, UINT nIDTool = 0)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(hWnd != NULL);\r
+\r
+               CToolInfo ti(0, hWnd, nIDTool, NULL, (LPTSTR)text.m_lpstr);\r
+               ::SendMessage(m_hWnd, TTM_UPDATETIPTEXT, 0, ti);\r
+       }\r
+\r
+       BOOL EnumTools(UINT nTool, LPTOOLINFO lpToolInfo) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TTM_ENUMTOOLS, nTool, (LPARAM)lpToolInfo);\r
+       }\r
+\r
+       void Pop()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, TTM_POP, 0, 0L);\r
+       }\r
+\r
+       void TrackActivate(LPTOOLINFO lpToolInfo, BOOL bActivate)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, TTM_TRACKACTIVATE, bActivate, (LPARAM)lpToolInfo);\r
+       }\r
+\r
+       void TrackPosition(int xPos, int yPos)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, TTM_TRACKPOSITION, 0, MAKELPARAM(xPos, yPos));\r
+       }\r
+\r
+#if (_WIN32_IE >= 0x0400)\r
+       void Update()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, TTM_UPDATE, 0, 0L);\r
+       }\r
+#endif // (_WIN32_IE >= 0x0400)\r
+\r
+#if (_WIN32_IE >= 0x0500)\r
+       BOOL AdjustRect(LPRECT lpRect, BOOL bLarger /*= TRUE*/)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TTM_ADJUSTRECT, bLarger, (LPARAM)lpRect);\r
+       }\r
+#endif // (_WIN32_IE >= 0x0500)\r
+\r
+#if (_WIN32_WINNT >= 0x0501)\r
+       void Popup()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, TTM_POPUP, 0, 0L);\r
+       }\r
+#endif // (_WIN32_WINNT >= 0x0501)\r
+};\r
+\r
+typedef CToolTipCtrlT<ATL::CWindow>   CToolTipCtrl;\r
+\r
+#endif // !_WIN32_WCE\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CHeaderCtrl\r
+\r
+template <class TBase>\r
+class CHeaderCtrlT : public TBase\r
+{\r
+public:\r
+// Constructors\r
+       CHeaderCtrlT(HWND hWnd = NULL) : TBase(hWnd)\r
+       { }\r
+\r
+       CHeaderCtrlT< TBase >& operator =(HWND hWnd)\r
+       {\r
+               m_hWnd = hWnd;\r
+               return *this;\r
+       }\r
+\r
+       HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,\r
+                       DWORD dwStyle = 0, DWORD dwExStyle = 0,\r
+                       ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)\r
+       {\r
+               return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);\r
+       }\r
+\r
+// Attributes\r
+       static LPCTSTR GetWndClassName()\r
+       {\r
+               return WC_HEADER;\r
+       }\r
+\r
+       int GetItemCount() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, HDM_GETITEMCOUNT, 0, 0L);\r
+       }\r
+\r
+       BOOL GetItem(int nIndex, LPHDITEM pHeaderItem) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, HDM_GETITEM, nIndex, (LPARAM)pHeaderItem);\r
+       }\r
+\r
+       BOOL SetItem(int nIndex, LPHDITEM pHeaderItem)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, HDM_SETITEM, nIndex, (LPARAM)pHeaderItem);\r
+       }\r
+\r
+       CImageList GetImageList() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return CImageList((HIMAGELIST)::SendMessage(m_hWnd, HDM_GETIMAGELIST, 0, 0L));\r
+       }\r
+\r
+       CImageList SetImageList(HIMAGELIST hImageList)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return CImageList((HIMAGELIST)::SendMessage(m_hWnd, HDM_SETIMAGELIST, 0, (LPARAM)hImageList));\r
+       }\r
+\r
+       BOOL GetOrderArray(int nSize, int* lpnArray) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, HDM_GETORDERARRAY, nSize, (LPARAM)lpnArray);\r
+       }\r
+\r
+       BOOL SetOrderArray(int nSize, int* lpnArray)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, HDM_SETORDERARRAY, nSize, (LPARAM)lpnArray);\r
+       }\r
+\r
+       BOOL GetItemRect(int nIndex, LPRECT lpItemRect) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, HDM_GETITEMRECT, nIndex, (LPARAM)lpItemRect);\r
+       }\r
+\r
+       int SetHotDivider(BOOL bPos, DWORD dwInputValue)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, HDM_SETHOTDIVIDER, bPos, dwInputValue);\r
+       }\r
+\r
+#if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)\r
+       BOOL GetUnicodeFormat() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, HDM_GETUNICODEFORMAT, 0, 0L);\r
+       }\r
+\r
+       BOOL SetUnicodeFormat(BOOL bUnicode = TRUE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, HDM_SETUNICODEFORMAT, bUnicode, 0L);\r
+       }\r
+#endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)\r
+\r
+#if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)\r
+       int GetBitmapMargin() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, HDM_GETBITMAPMARGIN, 0, 0L);\r
+       }\r
+\r
+       int SetBitmapMargin(int nWidth)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, HDM_SETBITMAPMARGIN, nWidth, 0L);\r
+       }\r
+\r
+       int SetFilterChangeTimeout(DWORD dwTimeOut)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, HDM_SETFILTERCHANGETIMEOUT, 0, dwTimeOut);\r
+       }\r
+#endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)\r
+\r
+#if (_WIN32_WINNT >= 0x0600)\r
+       BOOL GetItemDropDownRect(int nIndex, LPRECT lpRect) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, HDM_GETITEMDROPDOWNRECT, nIndex, (LPARAM)lpRect);\r
+       }\r
+\r
+       BOOL GetOverflowRect(LPRECT lpRect) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, HDM_GETOVERFLOWRECT, 0, (LPARAM)lpRect);\r
+       }\r
+\r
+       int GetFocusedItem() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, HDM_GETFOCUSEDITEM, 0, 0L);\r
+       }\r
+\r
+       BOOL SetFocusedItem(int nIndex)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, HDM_SETFOCUSEDITEM, 0, nIndex);\r
+       }\r
+#endif // (_WIN32_WINNT >= 0x0600)\r
+\r
+// Operations\r
+       int InsertItem(int nIndex, LPHDITEM phdi)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, HDM_INSERTITEM, nIndex, (LPARAM)phdi);\r
+       }\r
+\r
+       int AddItem(LPHDITEM phdi)\r
+       {\r
+               return InsertItem(GetItemCount(), phdi);\r
+       }\r
+\r
+       BOOL DeleteItem(int nIndex)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, HDM_DELETEITEM, nIndex, 0L);\r
+       }\r
+\r
+       BOOL Layout(HD_LAYOUT* pHeaderLayout)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, HDM_LAYOUT, 0, (LPARAM)pHeaderLayout);\r
+       }\r
+\r
+       int HitTest(LPHDHITTESTINFO lpHitTestInfo) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, HDM_HITTEST, 0, (LPARAM)lpHitTestInfo);\r
+       }\r
+\r
+       int OrderToIndex(int nOrder)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, HDM_ORDERTOINDEX, nOrder, 0L);\r
+       }\r
+\r
+       CImageList CreateDragImage(int nIndex)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return CImageList((HIMAGELIST)::SendMessage(m_hWnd, HDM_CREATEDRAGIMAGE, nIndex, 0L));\r
+       }\r
+\r
+#if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)\r
+       int EditFilter(int nColumn, BOOL bDiscardChanges)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, HDM_EDITFILTER, nColumn, MAKELPARAM(bDiscardChanges, 0));\r
+       }\r
+\r
+       int ClearFilter(int nColumn)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, HDM_CLEARFILTER, nColumn, 0L);\r
+       }\r
+\r
+       int ClearAllFilters()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, HDM_CLEARFILTER, (WPARAM)-1, 0L);\r
+       }\r
+#endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)\r
+};\r
+\r
+typedef CHeaderCtrlT<ATL::CWindow>   CHeaderCtrl;\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CListViewCtrl\r
+\r
+template <class TBase>\r
+class CListViewCtrlT : public TBase\r
+{\r
+public:\r
+// Constructors\r
+       CListViewCtrlT(HWND hWnd = NULL) : TBase(hWnd)\r
+       { }\r
+\r
+       CListViewCtrlT< TBase >& operator =(HWND hWnd)\r
+       {\r
+               m_hWnd = hWnd;\r
+               return *this;\r
+       }\r
+\r
+       HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,\r
+                       DWORD dwStyle = 0, DWORD dwExStyle = 0,\r
+                       ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)\r
+       {\r
+               return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);\r
+       }\r
+\r
+// Attributes\r
+       static LPCTSTR GetWndClassName()\r
+       {\r
+               return WC_LISTVIEW;\r
+       }\r
+\r
+       COLORREF GetBkColor() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (COLORREF)::SendMessage(m_hWnd, LVM_GETBKCOLOR, 0, 0L);\r
+       }\r
+\r
+       BOOL SetBkColor(COLORREF cr)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, LVM_SETBKCOLOR, 0, cr);\r
+       }\r
+\r
+       CImageList GetImageList(int nImageListType) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return CImageList((HIMAGELIST)::SendMessage(m_hWnd, LVM_GETIMAGELIST, nImageListType, 0L));\r
+       }\r
+\r
+       CImageList SetImageList(HIMAGELIST hImageList, int nImageList)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd)); \r
+               return CImageList((HIMAGELIST)::SendMessage(m_hWnd, LVM_SETIMAGELIST, nImageList, (LPARAM)hImageList));\r
+       }\r
+\r
+       int GetItemCount() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, LVM_GETITEMCOUNT, 0, 0L);\r
+       }\r
+\r
+       BOOL SetItemCount(int nItems)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, LVM_SETITEMCOUNT, nItems, 0L);\r
+       }\r
+\r
+       BOOL GetItem(LPLVITEM pItem) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, LVM_GETITEM, 0, (LPARAM)pItem);\r
+       }\r
+\r
+       BOOL SetItem(const LVITEM* pItem)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, LVM_SETITEM, 0, (LPARAM)pItem);\r
+       }\r
+\r
+       BOOL SetItem(int nItem, int nSubItem, UINT nMask, LPCTSTR lpszItem,\r
+               int nImage, UINT nState, UINT nStateMask, LPARAM lParam)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               LVITEM lvi = { 0 };\r
+               lvi.mask = nMask;\r
+               lvi.iItem = nItem;\r
+               lvi.iSubItem = nSubItem;\r
+               lvi.stateMask = nStateMask;\r
+               lvi.state = nState;\r
+               lvi.pszText = (LPTSTR) lpszItem;\r
+               lvi.iImage = nImage;\r
+               lvi.lParam = lParam;\r
+               return (BOOL)::SendMessage(m_hWnd, LVM_SETITEM, 0, (LPARAM)&lvi);\r
+       }\r
+\r
+       UINT GetItemState(int nItem, UINT nMask) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (UINT)::SendMessage(m_hWnd, LVM_GETITEMSTATE, nItem, nMask);\r
+       }\r
+\r
+       BOOL SetItemState(int nItem, UINT nState, UINT nStateMask)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               LVITEM lvi = { 0 };\r
+               lvi.state = nState;\r
+               lvi.stateMask = nStateMask;\r
+               return (BOOL)::SendMessage(m_hWnd, LVM_SETITEMSTATE, nItem, (LPARAM)&lvi);\r
+       }\r
+\r
+       BOOL SetItemState(int nItem, LPLVITEM pItem)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, LVM_SETITEMSTATE, nItem, (LPARAM)pItem);\r
+       }\r
+\r
+#ifndef _ATL_NO_COM\r
+       BOOL GetItemText(int nItem, int nSubItem, BSTR& bstrText) const\r
+       {\r
+               USES_CONVERSION;\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(bstrText == NULL);\r
+               LVITEM lvi = { 0 };\r
+               lvi.iSubItem = nSubItem;\r
+\r
+               LPTSTR lpstrText = NULL;\r
+               int nRes = 0;\r
+               for(int nLen = 256; ; nLen *= 2)\r
+               {\r
+                       ATLTRY(lpstrText = new TCHAR[nLen]);\r
+                       if(lpstrText == NULL)\r
+                               break;\r
+                       lpstrText[0] = NULL;\r
+                       lvi.cchTextMax = nLen;\r
+                       lvi.pszText = lpstrText;\r
+                       nRes  = (int)::SendMessage(m_hWnd, LVM_GETITEMTEXT, (WPARAM)nItem, (LPARAM)&lvi);\r
+                       if(nRes < nLen - 1)\r
+                               break;\r
+                       delete [] lpstrText;\r
+                       lpstrText = NULL;\r
+               }\r
+\r
+               if(lpstrText != NULL)\r
+               {\r
+                       if(nRes != 0)\r
+                               bstrText = ::SysAllocString(T2OLE(lpstrText));\r
+                       delete [] lpstrText;\r
+               }\r
+\r
+               return (bstrText != NULL) ? TRUE : FALSE;\r
+       }\r
+#endif // !_ATL_NO_COM\r
+\r
+#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)\r
+       int GetItemText(int nItem, int nSubItem, _CSTRING_NS::CString& strText) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               LVITEM lvi = { 0 };\r
+               lvi.iSubItem = nSubItem;\r
+\r
+               strText.Empty();\r
+               int nRes = 0;\r
+               for(int nLen = 256; ; nLen *= 2)\r
+               {\r
+                       lvi.cchTextMax = nLen;\r
+                       lvi.pszText = strText.GetBufferSetLength(nLen);\r
+                       if(lvi.pszText == NULL)\r
+                       {\r
+                               nRes = 0;\r
+                               break;\r
+                       }\r
+                       nRes  = (int)::SendMessage(m_hWnd, LVM_GETITEMTEXT, (WPARAM)nItem, (LPARAM)&lvi);\r
+                       if(nRes < nLen - 1)\r
+                               break;\r
+               }\r
+               strText.ReleaseBuffer();\r
+               return nRes;\r
+       }\r
+#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)\r
+\r
+       int GetItemText(int nItem, int nSubItem, LPTSTR lpszText, int nLen) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               LVITEM lvi = { 0 };\r
+               lvi.iSubItem = nSubItem;\r
+               lvi.cchTextMax = nLen;\r
+               lvi.pszText = lpszText;\r
+               return (int)::SendMessage(m_hWnd, LVM_GETITEMTEXT, (WPARAM)nItem, (LPARAM)&lvi);\r
+       }\r
+\r
+       BOOL SetItemText(int nItem, int nSubItem, LPCTSTR lpszText)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return SetItem(nItem, nSubItem, LVIF_TEXT, lpszText, 0, 0, 0, 0);\r
+       }\r
+\r
+       DWORD_PTR GetItemData(int nItem) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               LVITEM lvi = { 0 };\r
+               lvi.iItem = nItem;\r
+               lvi.mask = LVIF_PARAM;\r
+               BOOL bRet = (BOOL)::SendMessage(m_hWnd, LVM_GETITEM, 0, (LPARAM)&lvi);\r
+               return (DWORD_PTR)(bRet ? lvi.lParam : NULL);\r
+       }\r
+\r
+       BOOL SetItemData(int nItem, DWORD_PTR dwData)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return SetItem(nItem, 0, LVIF_PARAM, NULL, 0, 0, 0, (LPARAM)dwData);\r
+       }\r
+\r
+       UINT GetCallbackMask() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (UINT)::SendMessage(m_hWnd, LVM_GETCALLBACKMASK, 0, 0L);\r
+       }\r
+\r
+       BOOL SetCallbackMask(UINT nMask)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, LVM_SETCALLBACKMASK, nMask, 0L);\r
+       }\r
+\r
+       BOOL GetItemPosition(int nItem, LPPOINT lpPoint) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, LVM_GETITEMPOSITION, nItem, (LPARAM)lpPoint);\r
+       }\r
+\r
+       BOOL SetItemPosition(int nItem, POINT pt)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(((GetStyle() & LVS_TYPEMASK) == LVS_ICON) || ((GetStyle() & LVS_TYPEMASK) == LVS_SMALLICON));\r
+               return (BOOL)::SendMessage(m_hWnd, LVM_SETITEMPOSITION32, nItem, (LPARAM)&pt);\r
+       }\r
+\r
+       BOOL SetItemPosition(int nItem, int x, int y)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(((GetStyle() & LVS_TYPEMASK) == LVS_ICON) || ((GetStyle() & LVS_TYPEMASK) == LVS_SMALLICON));\r
+               POINT pt = { x, y };\r
+               return (BOOL)::SendMessage(m_hWnd, LVM_SETITEMPOSITION32, nItem, (LPARAM)&pt);\r
+       }\r
+\r
+       int GetStringWidth(LPCTSTR lpsz) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, LVM_GETSTRINGWIDTH, 0, (LPARAM)lpsz);\r
+       }\r
+\r
+       CEdit GetEditControl() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return CEdit((HWND)::SendMessage(m_hWnd, LVM_GETEDITCONTROL, 0, 0L));\r
+       }\r
+\r
+       BOOL GetColumn(int nCol, LVCOLUMN* pColumn) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, LVM_GETCOLUMN, nCol, (LPARAM)pColumn);\r
+       }\r
+\r
+       BOOL SetColumn(int nCol, const LVCOLUMN* pColumn)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, LVM_SETCOLUMN, nCol, (LPARAM)pColumn);\r
+       }\r
+\r
+       int GetColumnWidth(int nCol) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, LVM_GETCOLUMNWIDTH, nCol, 0L);\r
+       }\r
+\r
+       BOOL SetColumnWidth(int nCol, int cx)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, LVM_SETCOLUMNWIDTH, nCol, MAKELPARAM(cx, 0));\r
+       }\r
+\r
+       BOOL GetViewRect(LPRECT lpRect) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, LVM_GETVIEWRECT, 0, (LPARAM)lpRect);\r
+       }\r
+\r
+       COLORREF GetTextColor() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (COLORREF)::SendMessage(m_hWnd, LVM_GETTEXTCOLOR, 0, 0L);\r
+       }\r
+\r
+       BOOL SetTextColor(COLORREF cr)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, LVM_SETTEXTCOLOR, 0, cr);\r
+       }\r
+\r
+       COLORREF GetTextBkColor() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (COLORREF)::SendMessage(m_hWnd, LVM_GETTEXTBKCOLOR, 0, 0L);\r
+       }\r
+\r
+       BOOL SetTextBkColor(COLORREF cr)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, LVM_SETTEXTBKCOLOR, 0, cr);\r
+       }\r
+\r
+       int GetTopIndex() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, LVM_GETTOPINDEX, 0, 0L);\r
+       }\r
+\r
+       int GetCountPerPage() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, LVM_GETCOUNTPERPAGE, 0, 0L);\r
+       }\r
+\r
+       BOOL GetOrigin(LPPOINT lpPoint) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, LVM_GETORIGIN, 0, (LPARAM)lpPoint);\r
+       }\r
+\r
+       UINT GetSelectedCount() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (UINT)::SendMessage(m_hWnd, LVM_GETSELECTEDCOUNT, 0, 0L);\r
+       }\r
+\r
+       BOOL GetItemRect(int nItem, LPRECT lpRect, UINT nCode) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               lpRect->left = nCode;\r
+               return (BOOL)::SendMessage(m_hWnd, LVM_GETITEMRECT, (WPARAM)nItem, (LPARAM)lpRect);\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       HCURSOR GetHotCursor() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (HCURSOR)::SendMessage(m_hWnd, LVM_GETHOTCURSOR, 0, 0L);\r
+       }\r
+\r
+       HCURSOR SetHotCursor(HCURSOR hHotCursor)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (HCURSOR)::SendMessage(m_hWnd, LVM_SETHOTCURSOR, 0, (LPARAM)hHotCursor);\r
+       }\r
+\r
+       int GetHotItem() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, LVM_GETHOTITEM, 0, 0L);\r
+       }\r
+\r
+       int SetHotItem(int nIndex)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, LVM_SETHOTITEM, nIndex, 0L);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       BOOL GetColumnOrderArray(int nCount, int* lpnArray) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, LVM_GETCOLUMNORDERARRAY, nCount, (LPARAM)lpnArray);\r
+       }\r
+\r
+       BOOL SetColumnOrderArray(int nCount, int* lpnArray)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, LVM_SETCOLUMNORDERARRAY, nCount, (LPARAM)lpnArray);\r
+       }\r
+\r
+       CHeaderCtrl GetHeader() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return CHeaderCtrl((HWND)::SendMessage(m_hWnd, LVM_GETHEADER, 0, 0L));\r
+       }\r
+\r
+       BOOL GetSubItemRect(int nItem, int nSubItem, int nFlag, LPRECT lpRect) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT((GetStyle() & LVS_TYPEMASK) == LVS_REPORT);\r
+               ATLASSERT(lpRect != NULL);\r
+               lpRect->top = nSubItem;\r
+               lpRect->left = nFlag;\r
+               return (BOOL)::SendMessage(m_hWnd, LVM_GETSUBITEMRECT, nItem, (LPARAM)lpRect);\r
+       }\r
+\r
+       DWORD SetIconSpacing(int cx, int cy)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT((GetStyle() & LVS_TYPEMASK) == LVS_ICON);\r
+               return (DWORD)::SendMessage(m_hWnd, LVM_SETICONSPACING, 0, MAKELPARAM(cx, cy));\r
+       }\r
+\r
+       int GetISearchString(LPTSTR lpstr) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, LVM_GETISEARCHSTRING, 0, (LPARAM)lpstr);\r
+       }\r
+\r
+       void GetItemSpacing(SIZE& sizeSpacing, BOOL bSmallIconView = FALSE) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               DWORD dwRet = (DWORD)::SendMessage(m_hWnd, LVM_GETITEMSPACING, bSmallIconView, 0L);\r
+               sizeSpacing.cx = GET_X_LPARAM(dwRet);\r
+               sizeSpacing.cy = GET_Y_LPARAM(dwRet);\r
+       }\r
+\r
+#if (_WIN32_WCE >= 410)\r
+       void SetItemSpacing(INT cySpacing)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ListView_SetItemSpacing(m_hWnd, cySpacing);\r
+       }\r
+#endif // (_WIN32_WCE >= 410)\r
+\r
+       // single-selection only\r
+       int GetSelectedIndex() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT((GetStyle() & LVS_SINGLESEL) != 0);\r
+               return (int)::SendMessage(m_hWnd, LVM_GETNEXTITEM, (WPARAM)-1, MAKELPARAM(LVNI_ALL | LVNI_SELECTED, 0));\r
+       }\r
+\r
+       BOOL GetSelectedItem(LPLVITEM pItem) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT((GetStyle() & LVS_SINGLESEL) != 0);\r
+               ATLASSERT(pItem != NULL);\r
+               pItem->iItem = (int)::SendMessage(m_hWnd, LVM_GETNEXTITEM, (WPARAM)-1, MAKELPARAM(LVNI_ALL | LVNI_SELECTED, 0));\r
+               if(pItem->iItem == -1)\r
+                       return FALSE;\r
+               return (BOOL)::SendMessage(m_hWnd, LVM_GETITEM, 0, (LPARAM)pItem);\r
+       }\r
+\r
+       // extended list view styles\r
+       DWORD GetExtendedListViewStyle() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (DWORD)::SendMessage(m_hWnd, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0L);\r
+       }\r
+\r
+       // dwExMask = 0 means all styles\r
+       DWORD SetExtendedListViewStyle(DWORD dwExStyle, DWORD dwExMask = 0)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (DWORD)::SendMessage(m_hWnd, LVM_SETEXTENDEDLISTVIEWSTYLE, dwExMask, dwExStyle);\r
+       }\r
+\r
+       // checkboxes only\r
+       BOOL GetCheckState(int nIndex) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT((GetExtendedListViewStyle() & LVS_EX_CHECKBOXES) != 0);\r
+               UINT uRet = GetItemState(nIndex, LVIS_STATEIMAGEMASK);\r
+               return (uRet >> 12) - 1;\r
+       }\r
+\r
+       BOOL SetCheckState(int nItem, BOOL bCheck)\r
+       {\r
+               int nCheck = bCheck ? 2 : 1;   // one based index\r
+               return SetItemState(nItem, INDEXTOSTATEIMAGEMASK(nCheck), LVIS_STATEIMAGEMASK);\r
+       }\r
+\r
+       // view type\r
+       DWORD GetViewType() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (GetStyle() & LVS_TYPEMASK);\r
+       }\r
+\r
+       DWORD SetViewType(DWORD dwType)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(dwType == LVS_ICON || dwType == LVS_SMALLICON || dwType == LVS_LIST || dwType == LVS_REPORT);\r
+               DWORD dwOldType = GetViewType();\r
+               if(dwType != dwOldType)\r
+                       ModifyStyle(LVS_TYPEMASK, (dwType & LVS_TYPEMASK));\r
+               return dwOldType;\r
+       }\r
+\r
+#if (_WIN32_IE >= 0x0400)\r
+#ifndef _WIN32_WCE\r
+       BOOL GetBkImage(LPLVBKIMAGE plvbki) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, LVM_GETBKIMAGE, 0, (LPARAM)plvbki);\r
+       }\r
+\r
+       BOOL SetBkImage(LPLVBKIMAGE plvbki)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, LVM_SETBKIMAGE, 0, (LPARAM)plvbki);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       int GetSelectionMark() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, LVM_GETSELECTIONMARK, 0, 0L);\r
+       }\r
+\r
+       int SetSelectionMark(int nIndex)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, LVM_SETSELECTIONMARK, 0, nIndex);\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       BOOL GetWorkAreas(int nWorkAreas, LPRECT lpRect) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, LVM_GETWORKAREAS, nWorkAreas, (LPARAM)lpRect);\r
+       }\r
+\r
+       BOOL SetWorkAreas(int nWorkAreas, LPRECT lpRect)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, LVM_SETWORKAREAS, nWorkAreas, (LPARAM)lpRect);\r
+       }\r
+\r
+       DWORD GetHoverTime() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT((GetExtendedListViewStyle() & (LVS_EX_TRACKSELECT | LVS_EX_ONECLICKACTIVATE | LVS_EX_TWOCLICKACTIVATE)) != 0);\r
+               return (DWORD)::SendMessage(m_hWnd, LVM_GETHOVERTIME, 0, 0L);\r
+       }\r
+\r
+       DWORD SetHoverTime(DWORD dwHoverTime)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT((GetExtendedListViewStyle() & (LVS_EX_TRACKSELECT | LVS_EX_ONECLICKACTIVATE | LVS_EX_TWOCLICKACTIVATE)) != 0);\r
+               return (DWORD)::SendMessage(m_hWnd, LVM_SETHOVERTIME, 0, dwHoverTime);\r
+       }\r
+\r
+       BOOL GetNumberOfWorkAreas(int* pnWorkAreas) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, LVM_GETNUMBEROFWORKAREAS, 0, (LPARAM)pnWorkAreas);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       BOOL SetItemCountEx(int nItems, DWORD dwFlags)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(((GetStyle() & LVS_OWNERDATA) != 0) && (((GetStyle() & LVS_TYPEMASK) == LVS_REPORT) || ((GetStyle() & LVS_TYPEMASK) == LVS_LIST)));\r
+               return (BOOL)::SendMessage(m_hWnd, LVM_SETITEMCOUNT, nItems, dwFlags);\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       CToolTipCtrl GetToolTips() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return CToolTipCtrl((HWND)::SendMessage(m_hWnd, LVM_GETTOOLTIPS, 0, 0L));\r
+       }\r
+\r
+       CToolTipCtrl SetToolTips(HWND hWndTT)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return CToolTipCtrl((HWND)::SendMessage(m_hWnd, LVM_SETTOOLTIPS, (WPARAM)hWndTT, 0L));\r
+       }\r
+\r
+       BOOL GetUnicodeFormat() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, LVM_GETUNICODEFORMAT, 0, 0L);\r
+       }\r
+\r
+       BOOL SetUnicodeFormat(BOOL bUnicode = TRUE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, LVM_SETUNICODEFORMAT, bUnicode, 0L);\r
+       }\r
+#endif // !_WIN32_WCE\r
+#endif // (_WIN32_IE >= 0x0400)\r
+\r
+#if (_WIN32_WINNT >= 0x0501)\r
+       int GetSelectedColumn() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, LVM_GETSELECTEDCOLUMN, 0, 0L);\r
+       }\r
+\r
+       void SetSelectedColumn(int nColumn)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, LVM_SETSELECTEDCOLUMN, nColumn, 0L);\r
+       }\r
+\r
+       DWORD GetView() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (DWORD)::SendMessage(m_hWnd, LVM_GETVIEW, 0, 0L);\r
+       }\r
+\r
+       int SetView(DWORD dwView)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, LVM_SETVIEW, dwView, 0L);\r
+       }\r
+\r
+       BOOL IsGroupViewEnabled() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, LVM_ISGROUPVIEWENABLED, 0, 0L);\r
+       }\r
+\r
+       int GetGroupInfo(int nGroupID, PLVGROUP pGroup) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, LVM_GETGROUPINFO, nGroupID, (LPARAM)pGroup);\r
+       }\r
+\r
+       int SetGroupInfo(int nGroupID, PLVGROUP pGroup)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, LVM_SETGROUPINFO, nGroupID, (LPARAM)pGroup);\r
+       }\r
+\r
+       void GetGroupMetrics(PLVGROUPMETRICS pGroupMetrics) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, LVM_GETGROUPMETRICS, 0, (LPARAM)pGroupMetrics);\r
+       }\r
+\r
+       void SetGroupMetrics(PLVGROUPMETRICS pGroupMetrics)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, LVM_SETGROUPMETRICS, 0, (LPARAM)pGroupMetrics);\r
+       }\r
+\r
+       void GetTileViewInfo(PLVTILEVIEWINFO pTileViewInfo) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, LVM_GETTILEVIEWINFO, 0, (LPARAM)pTileViewInfo);\r
+       }\r
+\r
+       BOOL SetTileViewInfo(PLVTILEVIEWINFO pTileViewInfo)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, LVM_SETTILEVIEWINFO, 0, (LPARAM)pTileViewInfo);\r
+       }\r
+\r
+       void GetTileInfo(PLVTILEINFO pTileInfo) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, LVM_GETTILEINFO, 0, (LPARAM)pTileInfo);\r
+       }\r
+\r
+       BOOL SetTileInfo(PLVTILEINFO pTileInfo)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, LVM_SETTILEINFO, 0, (LPARAM)pTileInfo);\r
+       }\r
+\r
+       BOOL GetInsertMark(LPLVINSERTMARK pInsertMark) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, LVM_GETINSERTMARK, 0, (LPARAM)pInsertMark);\r
+       }\r
+\r
+       BOOL SetInsertMark(LPLVINSERTMARK pInsertMark)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, LVM_SETINSERTMARK, 0, (LPARAM)pInsertMark);\r
+       }\r
+\r
+       int GetInsertMarkRect(LPRECT lpRect) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, LVM_GETINSERTMARKRECT, 0, (LPARAM)lpRect);\r
+       }\r
+\r
+       COLORREF GetInsertMarkColor() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (COLORREF)::SendMessage(m_hWnd, LVM_GETINSERTMARKCOLOR, 0, 0L);\r
+       }\r
+\r
+       COLORREF SetInsertMarkColor(COLORREF clr)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (COLORREF)::SendMessage(m_hWnd, LVM_SETINSERTMARKCOLOR, 0, clr);\r
+       }\r
+\r
+       COLORREF GetOutlineColor() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (COLORREF)::SendMessage(m_hWnd, LVM_GETOUTLINECOLOR, 0, 0L);\r
+       }\r
+\r
+       COLORREF SetOutlineColor(COLORREF clr)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (COLORREF)::SendMessage(m_hWnd, LVM_SETOUTLINECOLOR, 0, clr);\r
+       }\r
+#endif // (_WIN32_WINNT >= 0x0501)\r
+\r
+#if (_WIN32_WINNT >= 0x0600)\r
+       int GetGroupCount() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, LVM_GETGROUPCOUNT, 0, 0L);\r
+       }\r
+\r
+       BOOL GetGroupInfoByIndex(int nIndex, PLVGROUP pGroup) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, LVM_GETGROUPINFOBYINDEX, nIndex, (LPARAM)pGroup);\r
+       }\r
+\r
+       BOOL GetGroupRect(int nGroupID, int nType, LPRECT lpRect) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(lpRect != NULL);\r
+               if(lpRect != NULL)\r
+                       lpRect->top = nType;\r
+               return (BOOL)::SendMessage(m_hWnd, LVM_GETGROUPRECT, nGroupID, (LPARAM)lpRect);\r
+       }\r
+\r
+       UINT GetGroupState(int nGroupID, UINT uMask) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (UINT)::SendMessage(m_hWnd, LVM_GETGROUPSTATE, nGroupID, (LPARAM)uMask);\r
+       }\r
+\r
+       int GetFocusedGroup() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, LVM_GETFOCUSEDGROUP, 0, 0L);\r
+       }\r
+\r
+       BOOL GetEmptyText(LPWSTR lpstrText, int cchText) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, LVM_GETEMPTYTEXT, cchText, (LPARAM)lpstrText);\r
+       }\r
+\r
+       BOOL GetFooterRect(LPRECT lpRect) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, LVM_GETFOOTERRECT, 0, (LPARAM)lpRect);\r
+       }\r
+\r
+       BOOL GetFooterInfo(LPLVFOOTERINFO lpFooterInfo) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, LVM_GETFOOTERINFO, 0, (LPARAM)lpFooterInfo);\r
+       }\r
+\r
+       BOOL GetFooterItemRect(int nItem, LPRECT lpRect) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, LVM_GETFOOTERITEMRECT, nItem, (LPARAM)lpRect);\r
+       }\r
+\r
+       BOOL GetFooterItem(int nItem, LPLVFOOTERITEM lpFooterItem) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, LVM_GETFOOTERITEM, nItem, (LPARAM)lpFooterItem);\r
+       }\r
+\r
+       BOOL GetItemIndexRect(PLVITEMINDEX pItemIndex, int nSubItem, int nType, LPRECT lpRect) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(pItemIndex != NULL);\r
+               ATLASSERT(lpRect != NULL);\r
+               if(lpRect != NULL)\r
+               {\r
+                       lpRect->top = nSubItem;\r
+                       lpRect->left = nType;\r
+               }\r
+               return (BOOL)::SendMessage(m_hWnd, LVM_GETITEMINDEXRECT, (WPARAM)pItemIndex, (LPARAM)lpRect);\r
+       }\r
+\r
+       BOOL SetItemIndexState(PLVITEMINDEX pItemIndex, UINT uState, UINT dwMask)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               LVITEM lvi = { 0 };\r
+               lvi.state = uState;\r
+               lvi.stateMask = dwMask;\r
+               return (BOOL)::SendMessage(m_hWnd, LVM_SETITEMINDEXSTATE, (WPARAM)pItemIndex, (LPARAM)&lvi);\r
+       }\r
+\r
+       BOOL GetNextItemIndex(PLVITEMINDEX pItemIndex, WORD wFlags) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, LVM_GETNEXTITEMINDEX, (WPARAM)pItemIndex, MAKELPARAM(wFlags, 0));\r
+       }\r
+#endif // (_WIN32_WINNT >= 0x0600)\r
+\r
+// Operations\r
+       int InsertColumn(int nCol, const LVCOLUMN* pColumn)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, LVM_INSERTCOLUMN, nCol, (LPARAM)pColumn);\r
+       }\r
+\r
+       int InsertColumn(int nCol, LPCTSTR lpszColumnHeading, int nFormat = LVCFMT_LEFT, \r
+                       int nWidth = -1, int nSubItem = -1, int iImage = -1, int iOrder = -1)\r
+       {\r
+               LVCOLUMN column = { 0 };\r
+               column.mask = LVCF_TEXT|LVCF_FMT;\r
+               column.pszText = (LPTSTR)lpszColumnHeading;\r
+               column.fmt = nFormat;\r
+               if (nWidth != -1)\r
+               {\r
+                       column.mask |= LVCF_WIDTH;\r
+                       column.cx = nWidth;\r
+               }\r
+               if (nSubItem != -1)\r
+               {\r
+                       column.mask |= LVCF_SUBITEM;\r
+                       column.iSubItem = nSubItem;\r
+               }\r
+               if (iImage != -1)\r
+               {\r
+                       column.mask |= LVCF_IMAGE;\r
+                       column.iImage = iImage;\r
+               }\r
+               if (iOrder != -1)\r
+               {\r
+                       column.mask |= LVCF_ORDER;\r
+                       column.iOrder = iOrder;\r
+               }\r
+               return InsertColumn(nCol, &column);\r
+       }\r
+\r
+       BOOL DeleteColumn(int nCol)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, LVM_DELETECOLUMN, nCol, 0L);\r
+       }\r
+\r
+       int InsertItem(UINT nMask, int nItem, LPCTSTR lpszItem, UINT nState, UINT nStateMask, int nImage, LPARAM lParam)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               LVITEM item = { 0 };\r
+               item.mask = nMask;\r
+               item.iItem = nItem;\r
+               item.iSubItem = 0;\r
+               item.pszText = (LPTSTR)lpszItem;\r
+               item.state = nState;\r
+               item.stateMask = nStateMask;\r
+               item.iImage = nImage;\r
+               item.lParam = lParam;\r
+               return InsertItem(&item);\r
+       }\r
+\r
+       int InsertItem(const LVITEM* pItem)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, LVM_INSERTITEM, 0, (LPARAM)pItem);\r
+       }\r
+\r
+       int InsertItem(int nItem, LPCTSTR lpszItem)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return InsertItem(LVIF_TEXT, nItem, lpszItem, 0, 0, 0, 0);\r
+       }\r
+\r
+       int InsertItem(int nItem, LPCTSTR lpszItem, int nImage)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return InsertItem(LVIF_TEXT|LVIF_IMAGE, nItem, lpszItem, 0, 0, nImage, 0);\r
+       }\r
+\r
+       int GetNextItem(int nItem, int nFlags) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, LVM_GETNEXTITEM, nItem, MAKELPARAM(nFlags, 0));\r
+       }\r
+\r
+       BOOL DeleteItem(int nItem)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, LVM_DELETEITEM, nItem, 0L);\r
+       }\r
+\r
+       BOOL DeleteAllItems()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, LVM_DELETEALLITEMS, 0, 0L);\r
+       }\r
+\r
+       int FindItem(LVFINDINFO* pFindInfo, int nStart) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, LVM_FINDITEM, nStart, (LPARAM)pFindInfo);\r
+       }\r
+\r
+       int HitTest(LVHITTESTINFO* pHitTestInfo) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, LVM_HITTEST, 0, (LPARAM)pHitTestInfo);\r
+       }\r
+\r
+       int HitTest(POINT pt, UINT* pFlags) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               LVHITTESTINFO hti = { 0 };\r
+               hti.pt = pt;\r
+               int nRes = (int)::SendMessage(m_hWnd, LVM_HITTEST, 0, (LPARAM)&hti);\r
+               if (pFlags != NULL)\r
+                       *pFlags = hti.flags;\r
+               return nRes;\r
+       }\r
+\r
+       BOOL EnsureVisible(int nItem, BOOL bPartialOK)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, LVM_ENSUREVISIBLE, nItem, MAKELPARAM(bPartialOK, 0));\r
+       }\r
+\r
+       BOOL Scroll(SIZE size)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, LVM_SCROLL, size.cx, size.cy);\r
+       }\r
+\r
+       BOOL RedrawItems(int nFirst, int nLast)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, LVM_REDRAWITEMS, nFirst, nLast);\r
+       }\r
+\r
+       BOOL Arrange(UINT nCode)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, LVM_ARRANGE, nCode, 0L);\r
+       }\r
+\r
+       CEdit EditLabel(int nItem)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return CEdit((HWND)::SendMessage(m_hWnd, LVM_EDITLABEL, nItem, 0L));\r
+       }\r
+\r
+       BOOL Update(int nItem)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, LVM_UPDATE, nItem, 0L);\r
+       }\r
+\r
+       BOOL SortItems(PFNLVCOMPARE pfnCompare, LPARAM lParamSort)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, LVM_SORTITEMS, (WPARAM)lParamSort, (LPARAM)pfnCompare);\r
+       }\r
+\r
+       CImageList RemoveImageList(int nImageList)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return CImageList((HIMAGELIST)::SendMessage(m_hWnd, LVM_SETIMAGELIST, (WPARAM)nImageList, NULL));\r
+       }\r
+\r
+       CImageList CreateDragImage(int nItem, LPPOINT lpPoint)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return CImageList((HIMAGELIST)::SendMessage(m_hWnd, LVM_CREATEDRAGIMAGE, nItem, (LPARAM)lpPoint));\r
+       }\r
+\r
+       DWORD ApproximateViewRect(int cx = -1, int cy = -1, int nCount = -1)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (DWORD)::SendMessage(m_hWnd, LVM_APPROXIMATEVIEWRECT, nCount, MAKELPARAM(cx, cy));\r
+       }\r
+\r
+       int SubItemHitTest(LPLVHITTESTINFO lpInfo) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, LVM_SUBITEMHITTEST, 0, (LPARAM)lpInfo);\r
+       }\r
+\r
+       int AddColumn(LPCTSTR strItem, int nItem, int nSubItem = -1,\r
+                       int nMask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM,\r
+                       int nFmt = LVCFMT_LEFT)\r
+       {\r
+               const int cxOffset = 15;\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               LVCOLUMN lvc = { 0 };\r
+               lvc.mask = nMask;\r
+               lvc.fmt = nFmt;\r
+               lvc.pszText = (LPTSTR)strItem;\r
+               lvc.cx = GetStringWidth(lvc.pszText) + cxOffset;\r
+               if(nMask & LVCF_SUBITEM)\r
+                       lvc.iSubItem = (nSubItem != -1) ? nSubItem : nItem;\r
+               return InsertColumn(nItem, &lvc);\r
+       }\r
+\r
+       int AddItem(int nItem, int nSubItem, LPCTSTR strItem, int nImageIndex = -1)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               LVITEM lvItem = { 0 };\r
+               lvItem.mask = LVIF_TEXT;\r
+               lvItem.iItem = nItem;\r
+               lvItem.iSubItem = nSubItem;\r
+               lvItem.pszText = (LPTSTR)strItem;\r
+               if(nImageIndex != -1)\r
+               {\r
+                       lvItem.mask |= LVIF_IMAGE;\r
+                       lvItem.iImage = nImageIndex;\r
+               }\r
+               if(nSubItem == 0)\r
+                       return InsertItem(&lvItem);\r
+               return SetItem(&lvItem) ? nItem : -1;\r
+       }\r
+\r
+#if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)\r
+       BOOL SortItemsEx(PFNLVCOMPARE pfnCompare, LPARAM lParamSort)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, LVM_SORTITEMSEX, (WPARAM)lParamSort, (LPARAM)pfnCompare);\r
+       }\r
+#endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)\r
+\r
+#if (_WIN32_WINNT >= 0x0501)\r
+       int InsertGroup(int nItem, PLVGROUP pGroup)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, LVM_INSERTGROUP, nItem, (LPARAM)pGroup);\r
+       }\r
+\r
+       int AddGroup(PLVGROUP pGroup)\r
+       {\r
+               return InsertGroup(-1, pGroup);\r
+       }\r
+\r
+       int RemoveGroup(int nGroupID)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, LVM_REMOVEGROUP, nGroupID, 0L);\r
+       }\r
+\r
+       void MoveGroup(int nGroupID, int nItem)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, LVM_MOVEGROUP, nGroupID, nItem);\r
+       }\r
+\r
+       void MoveItemToGroup(int nItem, int nGroupID)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, LVM_MOVEITEMTOGROUP, nItem, nGroupID);\r
+       }\r
+\r
+       int EnableGroupView(BOOL bEnable)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, LVM_ENABLEGROUPVIEW, bEnable, 0L);\r
+       }\r
+\r
+       int SortGroups(PFNLVGROUPCOMPARE pCompareFunc, LPVOID lpVoid = NULL)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, LVM_SORTGROUPS, (WPARAM)pCompareFunc, (LPARAM)lpVoid);\r
+       }\r
+\r
+       void InsertGroupSorted(PLVINSERTGROUPSORTED pInsertGroupSorted)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, LVM_INSERTGROUPSORTED, (WPARAM)pInsertGroupSorted, 0L);\r
+       }\r
+\r
+       void RemoveAllGroups()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, LVM_REMOVEALLGROUPS, 0, 0L);\r
+       }\r
+\r
+       BOOL HasGroup(int nGroupID)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, LVM_HASGROUP, nGroupID, 0L);\r
+       }\r
+\r
+       BOOL InsertMarkHitTest(LPPOINT lpPoint, LPLVINSERTMARK pInsertMark) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, LVM_INSERTMARKHITTEST, (WPARAM)lpPoint, (LPARAM)pInsertMark);\r
+       }\r
+\r
+       BOOL SetInfoTip(PLVSETINFOTIP pSetInfoTip)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, LVM_SETINFOTIP, 0, (LPARAM)pSetInfoTip);\r
+       }\r
+\r
+       void CancelEditLabel()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, LVM_CANCELEDITLABEL, 0, 0L);\r
+       }\r
+\r
+       UINT MapIndexToID(int nIndex) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (UINT)::SendMessage(m_hWnd, LVM_MAPINDEXTOID, nIndex, 0L);\r
+       }\r
+\r
+       int MapIDToIndex(UINT uID) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, LVM_MAPIDTOINDEX, uID, 0L);\r
+       }\r
+#endif // (_WIN32_WINNT >= 0x0501)\r
+\r
+#if (_WIN32_WINNT >= 0x0600)\r
+       int HitTestEx(LPLVHITTESTINFO lpHitTestInfo) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, LVM_HITTEST, (WPARAM)-1, (LPARAM)lpHitTestInfo);\r
+       }\r
+\r
+       int HitTestEx(POINT pt, UINT* pFlags) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               LVHITTESTINFO hti = { 0 };\r
+               hti.pt = pt;\r
+               int nRes = (int)::SendMessage(m_hWnd, LVM_HITTEST, (WPARAM)-1, (LPARAM)&hti);\r
+               if (pFlags != NULL)\r
+                       *pFlags = hti.flags;\r
+               return nRes;\r
+       }\r
+\r
+       int SubItemHitTestEx(LPLVHITTESTINFO lpHitTestInfo) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, LVM_SUBITEMHITTEST, (WPARAM)-1, (LPARAM)lpHitTestInfo);\r
+       }\r
+#endif // (_WIN32_WINNT >= 0x0600)\r
+\r
+       // single-selection only\r
+       BOOL SelectItem(int nIndex)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT((GetStyle() & LVS_SINGLESEL) != 0);\r
+\r
+               BOOL bRet = SetItemState(nIndex, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED);\r
+               if(bRet)\r
+                       bRet = EnsureVisible(nIndex, FALSE);\r
+               return bRet;\r
+       }\r
+};\r
+\r
+typedef CListViewCtrlT<ATL::CWindow>   CListViewCtrl;\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CTreeViewCtrl\r
+\r
+template <class TBase>\r
+class CTreeViewCtrlT : public TBase\r
+{\r
+public:\r
+// Constructors\r
+       CTreeViewCtrlT(HWND hWnd = NULL) : TBase(hWnd)\r
+       { }\r
+\r
+       CTreeViewCtrlT< TBase >& operator =(HWND hWnd)\r
+       {\r
+               m_hWnd = hWnd;\r
+               return *this;\r
+       }\r
+\r
+       HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,\r
+                       DWORD dwStyle = 0, DWORD dwExStyle = 0,\r
+                       ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)\r
+       {\r
+               return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);\r
+       }\r
+\r
+// Attributes\r
+       static LPCTSTR GetWndClassName()\r
+       {\r
+               return WC_TREEVIEW;\r
+       }\r
+\r
+       UINT GetCount() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (UINT)::SendMessage(m_hWnd, TVM_GETCOUNT, 0, 0L);\r
+       }\r
+\r
+       UINT GetIndent() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (UINT)::SendMessage(m_hWnd, TVM_GETINDENT, 0, 0L);\r
+       }\r
+\r
+       void SetIndent(UINT nIndent)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, TVM_SETINDENT, nIndent, 0L);\r
+       }\r
+\r
+       CImageList GetImageList(int nImageListType = TVSIL_NORMAL) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TVM_GETIMAGELIST, (WPARAM)nImageListType, 0L));\r
+       }\r
+\r
+       CImageList SetImageList(HIMAGELIST hImageList, int nImageListType = TVSIL_NORMAL)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TVM_SETIMAGELIST, (WPARAM)nImageListType, (LPARAM)hImageList));\r
+       }\r
+\r
+       BOOL GetItem(LPTVITEM pItem) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TVM_GETITEM, 0, (LPARAM)pItem);\r
+       }\r
+\r
+       BOOL SetItem(LPTVITEM pItem)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TVM_SETITEM, 0, (LPARAM)pItem);\r
+       }\r
+\r
+       BOOL SetItem(HTREEITEM hItem, UINT nMask, LPCTSTR lpszItem, int nImage,\r
+               int nSelectedImage, UINT nState, UINT nStateMask, LPARAM lParam)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               TVITEM item = { 0 };\r
+               item.hItem = hItem;\r
+               item.mask = nMask;\r
+               item.pszText = (LPTSTR) lpszItem;\r
+               item.iImage = nImage;\r
+               item.iSelectedImage = nSelectedImage;\r
+               item.state = nState;\r
+               item.stateMask = nStateMask;\r
+               item.lParam = lParam;\r
+               return (BOOL)::SendMessage(m_hWnd, TVM_SETITEM, 0, (LPARAM)&item);\r
+       }\r
+\r
+       BOOL GetItemText(HTREEITEM hItem, LPTSTR lpstrText, int nLen) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(lpstrText != NULL);\r
+\r
+               TVITEM item = { 0 };\r
+               item.hItem = hItem;\r
+               item.mask = TVIF_TEXT;\r
+               item.pszText = lpstrText;\r
+               item.cchTextMax = nLen;\r
+\r
+               return (BOOL)::SendMessage(m_hWnd, TVM_GETITEM, 0, (LPARAM)&item);\r
+       }\r
+\r
+#ifndef _ATL_NO_COM\r
+       BOOL GetItemText(HTREEITEM hItem, BSTR& bstrText) const\r
+       {\r
+               USES_CONVERSION;\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(bstrText == NULL);\r
+               TVITEM item = { 0 };\r
+               item.hItem = hItem;\r
+               item.mask = TVIF_TEXT;\r
+\r
+               LPTSTR lpstrText = NULL;\r
+               BOOL bRet = FALSE;\r
+               for(int nLen = 256; ; nLen *= 2)\r
+               {\r
+                       ATLTRY(lpstrText = new TCHAR[nLen]);\r
+                       if(lpstrText == NULL)\r
+                               break;\r
+                       lpstrText[0] = NULL;\r
+                       item.pszText = lpstrText;\r
+                       item.cchTextMax = nLen;\r
+                       bRet = (BOOL)::SendMessage(m_hWnd, TVM_GETITEM, 0, (LPARAM)&item);\r
+                       if(!bRet || (lstrlen(item.pszText) < nLen - 1))\r
+                               break;\r
+                       delete [] lpstrText;\r
+                       lpstrText = NULL;\r
+               }\r
+\r
+               if(lpstrText != NULL)\r
+               {\r
+                       if(bRet)\r
+                               bstrText = ::SysAllocString(T2OLE(lpstrText));\r
+                       delete [] lpstrText;\r
+               }\r
+\r
+               return (bstrText != NULL) ? TRUE : FALSE;\r
+       }\r
+#endif // !_ATL_NO_COM\r
+\r
+#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)\r
+       BOOL GetItemText(HTREEITEM hItem, _CSTRING_NS::CString& strText) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               TVITEM item = { 0 };\r
+               item.hItem = hItem;\r
+               item.mask = TVIF_TEXT;\r
+\r
+               strText.Empty();\r
+               BOOL bRet = FALSE;\r
+               for(int nLen = 256; ; nLen *= 2)\r
+               {\r
+                       item.pszText = strText.GetBufferSetLength(nLen);\r
+                       if(item.pszText == NULL)\r
+                       {\r
+                               bRet = FALSE;\r
+                               break;\r
+                       }\r
+                       item.cchTextMax = nLen;\r
+                       bRet = (BOOL)::SendMessage(m_hWnd, TVM_GETITEM, 0, (LPARAM)&item);\r
+                       if(!bRet || (lstrlen(item.pszText) < nLen - 1))\r
+                               break;\r
+               }\r
+               strText.ReleaseBuffer();\r
+               return bRet;\r
+       }\r
+#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)\r
+\r
+       BOOL SetItemText(HTREEITEM hItem, LPCTSTR lpszItem)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return SetItem(hItem, TVIF_TEXT, lpszItem, 0, 0, 0, 0, NULL);\r
+       }\r
+\r
+       BOOL GetItemImage(HTREEITEM hItem, int& nImage, int& nSelectedImage) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               TVITEM item = { 0 };\r
+               item.hItem = hItem;\r
+               item.mask = TVIF_IMAGE|TVIF_SELECTEDIMAGE;\r
+               BOOL bRes = (BOOL)::SendMessage(m_hWnd, TVM_GETITEM, 0, (LPARAM)&item);\r
+               if (bRes)\r
+               {\r
+                       nImage = item.iImage;\r
+                       nSelectedImage = item.iSelectedImage;\r
+               }\r
+               return bRes;\r
+       }\r
+\r
+       BOOL SetItemImage(HTREEITEM hItem, int nImage, int nSelectedImage)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return SetItem(hItem, TVIF_IMAGE|TVIF_SELECTEDIMAGE, NULL, nImage, nSelectedImage, 0, 0, NULL);\r
+       }\r
+\r
+       UINT GetItemState(HTREEITEM hItem, UINT nStateMask) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+#if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)\r
+               return (((UINT)::SendMessage(m_hWnd, TVM_GETITEMSTATE, (WPARAM)hItem, (LPARAM)nStateMask)) & nStateMask);\r
+#else // !((_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE))\r
+               TVITEM item = { 0 };\r
+               item.hItem = hItem;\r
+               item.mask = TVIF_STATE;\r
+               item.state = 0;\r
+               item.stateMask = nStateMask;\r
+               ::SendMessage(m_hWnd, TVM_GETITEM, 0, (LPARAM)&item);\r
+               return (item.state & nStateMask);\r
+#endif // !((_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE))\r
+       }\r
+\r
+       BOOL SetItemState(HTREEITEM hItem, UINT nState, UINT nStateMask)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return SetItem(hItem, TVIF_STATE, NULL, 0, 0, nState, nStateMask, NULL);\r
+       }\r
+\r
+       DWORD_PTR GetItemData(HTREEITEM hItem) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               TVITEM item = { 0 };\r
+               item.hItem = hItem;\r
+               item.mask = TVIF_PARAM;\r
+               BOOL bRet = (BOOL)::SendMessage(m_hWnd, TVM_GETITEM, 0, (LPARAM)&item);\r
+               return (DWORD_PTR)(bRet ? item.lParam : NULL);\r
+       }\r
+\r
+       BOOL SetItemData(HTREEITEM hItem, DWORD_PTR dwData)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return SetItem(hItem, TVIF_PARAM, NULL, 0, 0, 0, 0, (LPARAM)dwData);\r
+       }\r
+\r
+       CEdit GetEditControl() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return CEdit((HWND)::SendMessage(m_hWnd, TVM_GETEDITCONTROL, 0, 0L));\r
+       }\r
+\r
+       UINT GetVisibleCount() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (UINT)::SendMessage(m_hWnd, TVM_GETVISIBLECOUNT, 0, 0L);\r
+       }\r
+\r
+       BOOL GetItemRect(HTREEITEM hItem, LPRECT lpRect, BOOL bTextOnly) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               *(HTREEITEM*)lpRect = hItem;\r
+               return (BOOL)::SendMessage(m_hWnd, TVM_GETITEMRECT, (WPARAM)bTextOnly, (LPARAM)lpRect);\r
+       }\r
+\r
+       BOOL ItemHasChildren(HTREEITEM hItem) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               TVITEM item = { 0 };\r
+               item.hItem = hItem;\r
+               item.mask = TVIF_CHILDREN;\r
+               ::SendMessage(m_hWnd, TVM_GETITEM, 0, (LPARAM)&item);\r
+               return item.cChildren;\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       CToolTipCtrl GetToolTips() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return CToolTipCtrl((HWND)::SendMessage(m_hWnd, TVM_GETTOOLTIPS, 0, 0L));\r
+       }\r
+\r
+       CToolTipCtrl SetToolTips(HWND hWndTT)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return CToolTipCtrl((HWND)::SendMessage(m_hWnd, TVM_SETTOOLTIPS, (WPARAM)hWndTT, 0L));\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       int GetISearchString(LPTSTR lpstr) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, TVM_GETISEARCHSTRING, 0, (LPARAM)lpstr);\r
+       }\r
+\r
+       // checkboxes only\r
+       BOOL GetCheckState(HTREEITEM hItem) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT((GetStyle() & TVS_CHECKBOXES) != 0);\r
+               UINT uRet = GetItemState(hItem, TVIS_STATEIMAGEMASK);\r
+               return (uRet >> 12) - 1;\r
+       }\r
+\r
+       BOOL SetCheckState(HTREEITEM hItem, BOOL bCheck)\r
+       {\r
+               int nCheck = bCheck ? 2 : 1;   // one based index\r
+               return SetItemState(hItem, INDEXTOSTATEIMAGEMASK(nCheck), TVIS_STATEIMAGEMASK);\r
+       }\r
+\r
+#if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)\r
+       COLORREF GetBkColor() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (COLORREF)::SendMessage(m_hWnd, TVM_GETBKCOLOR, 0, 0L);\r
+       }\r
+\r
+       COLORREF SetBkColor(COLORREF clr)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (COLORREF)::SendMessage(m_hWnd, TVM_SETBKCOLOR, 0, (LPARAM)clr);\r
+       }\r
+\r
+       COLORREF GetInsertMarkColor() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (COLORREF)::SendMessage(m_hWnd, TVM_GETINSERTMARKCOLOR, 0, 0L);\r
+       }\r
+\r
+       COLORREF SetInsertMarkColor(COLORREF clr)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (COLORREF)::SendMessage(m_hWnd, TVM_SETINSERTMARKCOLOR, 0, (LPARAM)clr);\r
+       }\r
+\r
+       int GetItemHeight() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, TVM_GETITEMHEIGHT, 0, 0L);\r
+       }\r
+\r
+       int SetItemHeight(int cyHeight)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, TVM_SETITEMHEIGHT, cyHeight, 0L);\r
+       }\r
+\r
+       int GetScrollTime() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, TVM_GETSCROLLTIME, 0, 0L);\r
+       }\r
+\r
+       int SetScrollTime(int nScrollTime)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, TVM_SETSCROLLTIME, nScrollTime, 0L);\r
+       }\r
+\r
+       COLORREF GetTextColor() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (COLORREF)::SendMessage(m_hWnd, TVM_GETTEXTCOLOR, 0, 0L);\r
+       }\r
+\r
+       COLORREF SetTextColor(COLORREF clr)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (COLORREF)::SendMessage(m_hWnd, TVM_SETTEXTCOLOR, 0, (LPARAM)clr);\r
+       }\r
+\r
+       BOOL GetUnicodeFormat() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TVM_GETUNICODEFORMAT, 0, 0L);\r
+       }\r
+\r
+       BOOL SetUnicodeFormat(BOOL bUnicode = TRUE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TVM_SETUNICODEFORMAT, bUnicode, 0L);\r
+       }\r
+#endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)\r
+\r
+#if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)\r
+       COLORREF GetLineColor() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (COLORREF)::SendMessage(m_hWnd, TVM_GETLINECOLOR, 0, 0L);\r
+       }\r
+\r
+       COLORREF SetLineColor(COLORREF clrNew /*= CLR_DEFAULT*/)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (COLORREF)::SendMessage(m_hWnd, TVM_SETLINECOLOR, 0, (LPARAM)clrNew);\r
+       }\r
+#endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)\r
+\r
+#if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)\r
+       BOOL GetItem(LPTVITEMEX pItem) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TVM_GETITEM, 0, (LPARAM)pItem);\r
+       }\r
+\r
+       BOOL SetItem(LPTVITEMEX pItem)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TVM_SETITEM, 0, (LPARAM)pItem);\r
+       }\r
+#endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)\r
+\r
+       DWORD GetExtendedStyle() const\r
+       {\r
+#ifndef TVM_GETEXTENDEDSTYLE\r
+               const UINT TVM_GETEXTENDEDSTYLE = (TV_FIRST + 45);\r
+#endif\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (DWORD)::SendMessage(m_hWnd, TVM_GETEXTENDEDSTYLE, 0, 0L);\r
+       }\r
+\r
+       DWORD SetExtendedStyle(DWORD dwStyle, DWORD dwMask)\r
+       {\r
+#ifndef TVM_SETEXTENDEDSTYLE\r
+               const UINT TVM_SETEXTENDEDSTYLE = (TV_FIRST + 44);\r
+#endif\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (DWORD)::SendMessage(m_hWnd, TVM_SETEXTENDEDSTYLE, dwMask, dwStyle);\r
+       }\r
+\r
+#if (_WIN32_WINNT >= 0x0600)\r
+       BOOL SetAutoScrollInfo(UINT uPixPerSec, UINT uUpdateTime)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TVM_SETAUTOSCROLLINFO, (WPARAM)uPixPerSec, (LPARAM)uUpdateTime);\r
+       }\r
+\r
+       DWORD GetSelectedCount() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (DWORD)::SendMessage(m_hWnd, TVM_GETSELECTEDCOUNT, 0, 0L);\r
+       }\r
+\r
+       BOOL GetItemPartRect(HTREEITEM hItem, TVITEMPART partID, LPRECT lpRect) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               TVGETITEMPARTRECTINFO gipri = { hItem, lpRect, partID };\r
+               return (BOOL)::SendMessage(m_hWnd, TVM_GETITEMPARTRECT, 0, (LPARAM)&gipri);\r
+       }\r
+#endif // (_WIN32_WINNT >= 0x0600)\r
+\r
+// Operations\r
+       HTREEITEM InsertItem(LPTVINSERTSTRUCT lpInsertStruct)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (HTREEITEM)::SendMessage(m_hWnd, TVM_INSERTITEM, 0, (LPARAM)lpInsertStruct);\r
+       }\r
+\r
+       HTREEITEM InsertItem(LPCTSTR lpszItem, int nImage,\r
+               int nSelectedImage, HTREEITEM hParent, HTREEITEM hInsertAfter)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return InsertItem(TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE, lpszItem, nImage, nSelectedImage, 0, 0, 0, hParent, hInsertAfter); \r
+       }\r
+\r
+       HTREEITEM InsertItem(LPCTSTR lpszItem, HTREEITEM hParent, HTREEITEM hInsertAfter)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return InsertItem(TVIF_TEXT, lpszItem, 0, 0, 0, 0, 0, hParent, hInsertAfter);\r
+       }\r
+\r
+       HTREEITEM InsertItem(UINT nMask, LPCTSTR lpszItem, int nImage,\r
+               int nSelectedImage, UINT nState, UINT nStateMask, LPARAM lParam,\r
+               HTREEITEM hParent, HTREEITEM hInsertAfter)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               TVINSERTSTRUCT tvis = { 0 };\r
+               tvis.hParent = hParent;\r
+               tvis.hInsertAfter = hInsertAfter;\r
+               tvis.item.mask = nMask;\r
+               tvis.item.pszText = (LPTSTR) lpszItem;\r
+               tvis.item.iImage = nImage;\r
+               tvis.item.iSelectedImage = nSelectedImage;\r
+               tvis.item.state = nState;\r
+               tvis.item.stateMask = nStateMask;\r
+               tvis.item.lParam = lParam;\r
+               return (HTREEITEM)::SendMessage(m_hWnd, TVM_INSERTITEM, 0, (LPARAM)&tvis);\r
+       }\r
+\r
+       BOOL DeleteItem(HTREEITEM hItem)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TVM_DELETEITEM, 0, (LPARAM)hItem);\r
+       }\r
+\r
+       BOOL DeleteAllItems()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TVM_DELETEITEM, 0, (LPARAM)TVI_ROOT);\r
+       }\r
+\r
+       BOOL Expand(HTREEITEM hItem, UINT nCode = TVE_EXPAND)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TVM_EXPAND, nCode, (LPARAM)hItem);\r
+       }\r
+\r
+       HTREEITEM GetNextItem(HTREEITEM hItem, UINT nCode) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd)); \r
+               return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, nCode, (LPARAM)hItem);\r
+       }\r
+\r
+       HTREEITEM GetChildItem(HTREEITEM hItem) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd)); \r
+               return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_CHILD, (LPARAM)hItem);\r
+       }\r
+\r
+       HTREEITEM GetNextSiblingItem(HTREEITEM hItem) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd)); \r
+               return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_NEXT, (LPARAM)hItem); \r
+       }\r
+\r
+       HTREEITEM GetPrevSiblingItem(HTREEITEM hItem) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd)); \r
+               return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_PREVIOUS, (LPARAM)hItem);\r
+       }\r
+\r
+       HTREEITEM GetParentItem(HTREEITEM hItem) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd)); \r
+               return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_PARENT, (LPARAM)hItem); \r
+       }\r
+\r
+       HTREEITEM GetFirstVisibleItem() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd)); \r
+               return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_FIRSTVISIBLE, 0L);\r
+       }\r
+\r
+       HTREEITEM GetNextVisibleItem(HTREEITEM hItem) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_NEXTVISIBLE, (LPARAM)hItem);\r
+       }\r
+\r
+       HTREEITEM GetPrevVisibleItem(HTREEITEM hItem) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_PREVIOUSVISIBLE, (LPARAM)hItem);\r
+       }\r
+\r
+       HTREEITEM GetSelectedItem() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_CARET, 0L);\r
+       }\r
+\r
+       HTREEITEM GetDropHilightItem() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_DROPHILITE, 0L);\r
+       }\r
+\r
+       HTREEITEM GetRootItem() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_ROOT, 0L);\r
+       }\r
+\r
+#if !defined(_WIN32_WCE) && (_WIN32_IE >= 0x0400)\r
+       HTREEITEM GetLastVisibleItem() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_LASTVISIBLE, 0L);\r
+       }\r
+#endif // !defined(_WIN32_WCE) && (_WIN32_IE >= 0x0400)\r
+\r
+#if (_WIN32_IE >= 0x0600)\r
+       HTREEITEM GetNextSelectedItem() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_NEXTSELECTED, 0L);\r
+       }\r
+#endif // (_WIN32_IE >= 0x0600)\r
+\r
+       BOOL Select(HTREEITEM hItem, UINT nCode)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TVM_SELECTITEM, nCode, (LPARAM)hItem);\r
+       }\r
+\r
+       BOOL SelectItem(HTREEITEM hItem)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TVM_SELECTITEM, TVGN_CARET, (LPARAM)hItem);\r
+       }\r
+\r
+       BOOL SelectDropTarget(HTREEITEM hItem)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TVM_SELECTITEM, TVGN_DROPHILITE, (LPARAM)hItem);\r
+       }\r
+\r
+       BOOL SelectSetFirstVisible(HTREEITEM hItem)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TVM_SELECTITEM, TVGN_FIRSTVISIBLE, (LPARAM)hItem);\r
+       }\r
+\r
+       CEdit EditLabel(HTREEITEM hItem)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return CEdit((HWND)::SendMessage(m_hWnd, TVM_EDITLABEL, 0, (LPARAM)hItem));\r
+       }\r
+\r
+       BOOL EndEditLabelNow(BOOL bCancel)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TVM_ENDEDITLABELNOW, bCancel, 0L);\r
+       }\r
+\r
+       HTREEITEM HitTest(TVHITTESTINFO* pHitTestInfo) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (HTREEITEM)::SendMessage(m_hWnd, TVM_HITTEST, 0, (LPARAM)pHitTestInfo);\r
+       }\r
+\r
+       HTREEITEM HitTest(POINT pt, UINT* pFlags) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               TVHITTESTINFO hti = { 0 };\r
+               hti.pt = pt;\r
+               HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_HITTEST, 0, (LPARAM)&hti);\r
+               if (pFlags != NULL)\r
+                       *pFlags = hti.flags;\r
+               return hTreeItem;\r
+       }\r
+\r
+       BOOL SortChildren(HTREEITEM hItem, BOOL bRecurse = FALSE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TVM_SORTCHILDREN, (WPARAM)bRecurse, (LPARAM)hItem);\r
+       }\r
+\r
+       BOOL EnsureVisible(HTREEITEM hItem)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TVM_ENSUREVISIBLE, 0, (LPARAM)hItem);\r
+       }\r
+\r
+       BOOL SortChildrenCB(LPTVSORTCB pSort, BOOL bRecurse = FALSE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TVM_SORTCHILDRENCB, (WPARAM)bRecurse, (LPARAM)pSort);\r
+       }\r
+\r
+       CImageList RemoveImageList(int nImageList)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TVM_SETIMAGELIST, (WPARAM)nImageList, NULL));\r
+       }\r
+\r
+       CImageList CreateDragImage(HTREEITEM hItem)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TVM_CREATEDRAGIMAGE, 0, (LPARAM)hItem));\r
+       }\r
+\r
+#if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)\r
+       BOOL SetInsertMark(HTREEITEM hTreeItem, BOOL bAfter)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TVM_SETINSERTMARK, bAfter, (LPARAM)hTreeItem);\r
+       }\r
+\r
+       BOOL RemoveInsertMark()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TVM_SETINSERTMARK, 0, 0L);\r
+       }\r
+#endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)\r
+\r
+#if (_WIN32_WINNT >= 0x0501)\r
+       HTREEITEM MapAccIDToHTREEITEM(UINT uID) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (HTREEITEM)::SendMessage(m_hWnd, TVM_MAPACCIDTOHTREEITEM, uID, 0L);\r
+       }\r
+\r
+       UINT MapHTREEITEMToAccID(HTREEITEM hTreeItem) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (UINT)::SendMessage(m_hWnd, TVM_MAPHTREEITEMTOACCID, (WPARAM)hTreeItem, 0L);\r
+       }\r
+#endif // (_WIN32_WINNT >= 0x0501)\r
+\r
+#if (_WIN32_WINNT >= 0x0600)\r
+       void ShowInfoTip(HTREEITEM hItem)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, TVM_SHOWINFOTIP, 0, (LPARAM)hItem);\r
+       }\r
+#endif // (_WIN32_WINNT >= 0x0600)\r
+};\r
+\r
+typedef CTreeViewCtrlT<ATL::CWindow>   CTreeViewCtrl;\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CTreeViewCtrlEx\r
+\r
+// forward declaration\r
+template <class TBase> class CTreeViewCtrlExT;\r
+\r
+// Note: TBase here is for CTreeViewCtrlExT, and not for CTreeItemT itself\r
+template <class TBase>\r
+class CTreeItemT\r
+{\r
+public:\r
+       HTREEITEM m_hTreeItem;\r
+       CTreeViewCtrlExT<TBase>* m_pTreeView;\r
+\r
+// Construction\r
+       CTreeItemT(HTREEITEM hTreeItem = NULL, CTreeViewCtrlExT<TBase>* pTreeView = NULL) : m_hTreeItem(hTreeItem), m_pTreeView(pTreeView)\r
+       { }\r
\r
+       CTreeItemT(const CTreeItemT<TBase>& posSrc)\r
+       {\r
+               *this = posSrc;\r
+       }\r
+\r
+       operator HTREEITEM() { return m_hTreeItem; }\r
+\r
+       CTreeItemT<TBase>& operator =(const CTreeItemT<TBase>& itemSrc)\r
+       {\r
+               m_hTreeItem = itemSrc.m_hTreeItem;\r
+               m_pTreeView = itemSrc.m_pTreeView;\r
+               return *this;\r
+       }\r
+\r
+// Attributes\r
+       CTreeViewCtrlExT<TBase>* GetTreeView() const { return m_pTreeView; }\r
+\r
+       BOOL operator !() const { return m_hTreeItem == NULL; }\r
+\r
+       BOOL IsNull() const { return m_hTreeItem == NULL; }\r
+       \r
+       BOOL GetRect(LPRECT lpRect, BOOL bTextOnly) const;\r
+       BOOL GetText(LPTSTR lpstrText, int nLen) const;\r
+#ifndef _ATL_NO_COM\r
+       BOOL GetText(BSTR& bstrText) const;\r
+#endif // !_ATL_NO_COM\r
+#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)\r
+       BOOL GetText(_CSTRING_NS::CString& strText) const;\r
+#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)\r
+       BOOL SetText(LPCTSTR lpszItem);\r
+       BOOL GetImage(int& nImage, int& nSelectedImage) const;\r
+       BOOL SetImage(int nImage, int nSelectedImage);\r
+       UINT GetState(UINT nStateMask) const;\r
+       BOOL SetState(UINT nState, UINT nStateMask);\r
+       DWORD_PTR GetData() const;\r
+       BOOL SetData(DWORD_PTR dwData);\r
+       BOOL SetItem(UINT nMask, LPCTSTR lpszItem, int nImage, int nSelectedImage, UINT nState, UINT nStateMask, LPARAM lParam);\r
+\r
+// Operations\r
+       CTreeItemT<TBase> InsertAfter(LPCTSTR lpstrItem, HTREEITEM hItemAfter, int nImageIndex)\r
+       {\r
+               return _Insert(lpstrItem, nImageIndex, hItemAfter);\r
+       }\r
+\r
+       CTreeItemT<TBase> AddHead(LPCTSTR lpstrItem, int nImageIndex)\r
+       {\r
+               return _Insert(lpstrItem, nImageIndex, TVI_FIRST);\r
+       }\r
+\r
+       CTreeItemT<TBase> AddTail(LPCTSTR lpstrItem, int nImageIndex)\r
+       {\r
+               return _Insert(lpstrItem, nImageIndex, TVI_LAST);\r
+       }\r
+\r
+       CTreeItemT<TBase> GetChild() const;\r
+       CTreeItemT<TBase> GetNext(UINT nCode) const;\r
+       CTreeItemT<TBase> GetNextSibling() const;\r
+       CTreeItemT<TBase> GetPrevSibling() const;\r
+       CTreeItemT<TBase> GetParent() const;\r
+       CTreeItemT<TBase> GetFirstVisible() const;\r
+       CTreeItemT<TBase> GetNextVisible() const;\r
+       CTreeItemT<TBase> GetPrevVisible() const;\r
+       CTreeItemT<TBase> GetSelected() const;\r
+       CTreeItemT<TBase> GetDropHilight() const;\r
+       CTreeItemT<TBase> GetRoot() const;\r
+#if !defined(_WIN32_WCE) && (_WIN32_IE >= 0x0400)\r
+       CTreeItemT<TBase> GetLastVisible() const;\r
+#endif // !defined(_WIN32_WCE) && (_WIN32_IE >= 0x0400)\r
+#if (_WIN32_IE >= 0x0600)\r
+       CTreeItemT<TBase> GetNextSelected() const;\r
+#endif // (_WIN32_IE >= 0x0600)\r
+       BOOL HasChildren() const;\r
+       BOOL Delete();\r
+       BOOL Expand(UINT nCode = TVE_EXPAND);\r
+       BOOL Select(UINT nCode);\r
+       BOOL Select();\r
+       BOOL SelectDropTarget();\r
+       BOOL SelectSetFirstVisible();\r
+       HWND EditLabel();\r
+       HIMAGELIST CreateDragImage();\r
+       BOOL SortChildren(BOOL bRecurse = FALSE);\r
+       BOOL EnsureVisible();\r
+       CTreeItemT<TBase> _Insert(LPCTSTR lpstrItem, int nImageIndex, HTREEITEM hItemAfter);\r
+       int GetImageIndex() const;\r
+#if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)\r
+       BOOL SetInsertMark(BOOL bAfter);\r
+#endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)\r
+#if (_WIN32_WINNT >= 0x0501)\r
+       UINT MapHTREEITEMToAccID() const;\r
+#endif // (_WIN32_WINNT >= 0x0501)\r
+#if (_WIN32_WINNT >= 0x0600)\r
+       void ShowInfoTip();\r
+       BOOL GetPartRect(TVITEMPART partID, LPRECT lpRect) const;\r
+#endif // (_WIN32_WINNT >= 0x0600)\r
+};\r
+\r
+typedef CTreeItemT<ATL::CWindow>   CTreeItem;\r
+\r
+\r
+template <class TBase>\r
+class CTreeViewCtrlExT : public CTreeViewCtrlT< TBase >\r
+{\r
+public:\r
+// Constructors\r
+       CTreeViewCtrlExT(HWND hWnd = NULL) : CTreeViewCtrlT< TBase >(hWnd)\r
+       { }\r
+\r
+       CTreeViewCtrlExT< TBase >& operator =(HWND hWnd)\r
+       {\r
+               m_hWnd = hWnd;\r
+               return *this;\r
+       }\r
+\r
+// Operations (overides that return CTreeItem)\r
+       CTreeItemT<TBase> InsertItem(LPTVINSERTSTRUCT lpInsertStruct)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_INSERTITEM, 0, (LPARAM)lpInsertStruct);\r
+               return CTreeItemT<TBase>(hTreeItem, this);\r
+       }\r
+\r
+       CTreeItemT<TBase> InsertItem(LPCTSTR lpszItem, int nImage,\r
+               int nSelectedImage, HTREEITEM hParent, HTREEITEM hInsertAfter)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return InsertItem(TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE, lpszItem, nImage, nSelectedImage, 0, 0, 0, hParent, hInsertAfter); \r
+       }\r
+\r
+       CTreeItemT<TBase> InsertItem(LPCTSTR lpszItem, HTREEITEM hParent, HTREEITEM hInsertAfter)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return InsertItem(TVIF_TEXT, lpszItem, 0, 0, 0, 0, 0, hParent, hInsertAfter);\r
+       }\r
+\r
+       CTreeItemT<TBase> GetNextItem(HTREEITEM hItem, UINT nCode) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd)); \r
+               HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, nCode, (LPARAM)hItem);\r
+               return CTreeItemT<TBase>(hTreeItem, (CTreeViewCtrlExT<TBase>*)this);\r
+       }\r
+\r
+       CTreeItemT<TBase> GetChildItem(HTREEITEM hItem) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd)); \r
+               HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_CHILD, (LPARAM)hItem);\r
+               return CTreeItemT<TBase>(hTreeItem, (CTreeViewCtrlExT<TBase>*)this); \r
+       }\r
+\r
+       CTreeItemT<TBase> GetNextSiblingItem(HTREEITEM hItem) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd)); \r
+               HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_NEXT, (LPARAM)hItem); \r
+               return CTreeItemT<TBase>(hTreeItem, (CTreeViewCtrlExT<TBase>*)this);\r
+       }\r
+\r
+       CTreeItemT<TBase> GetPrevSiblingItem(HTREEITEM hItem) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd)); \r
+               HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_PREVIOUS, (LPARAM)hItem);\r
+               return CTreeItemT<TBase>(hTreeItem, (CTreeViewCtrlExT<TBase>*)this);\r
+       }\r
+\r
+       CTreeItemT<TBase> GetParentItem(HTREEITEM hItem) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd)); \r
+               HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_PARENT, (LPARAM)hItem); \r
+               return CTreeItemT<TBase>(hTreeItem, (CTreeViewCtrlExT<TBase>*)this);\r
+       }\r
+\r
+       CTreeItemT<TBase> GetFirstVisibleItem() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd)); \r
+               HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_FIRSTVISIBLE, 0L);\r
+               return CTreeItemT<TBase>(hTreeItem, (CTreeViewCtrlExT<TBase>*)this);\r
+       }\r
+\r
+       CTreeItemT<TBase> GetNextVisibleItem(HTREEITEM hItem) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_NEXTVISIBLE, (LPARAM)hItem);\r
+               return CTreeItemT<TBase>(hTreeItem, (CTreeViewCtrlExT<TBase>*)this);\r
+       }\r
+\r
+       CTreeItemT<TBase> GetPrevVisibleItem(HTREEITEM hItem) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_PREVIOUSVISIBLE, (LPARAM)hItem);\r
+               return CTreeItemT<TBase>(hTreeItem, (CTreeViewCtrlExT<TBase>*)this);\r
+       }\r
+\r
+       CTreeItemT<TBase> GetSelectedItem() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_CARET, 0L);\r
+               return CTreeItemT<TBase>(hTreeItem, (CTreeViewCtrlExT<TBase>*)this);\r
+       }\r
+\r
+       CTreeItemT<TBase> GetDropHilightItem() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_DROPHILITE, 0L);\r
+               return CTreeItemT<TBase>(hTreeItem, (CTreeViewCtrlExT<TBase>*)this);\r
+       }\r
+\r
+       CTreeItemT<TBase> GetRootItem() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_ROOT, 0L);\r
+               return CTreeItemT<TBase>(hTreeItem, (CTreeViewCtrlExT<TBase>*)this);\r
+       }\r
+\r
+#if !defined(_WIN32_WCE) && (_WIN32_IE >= 0x0400)\r
+       CTreeItemT<TBase> GetLastVisibleItem() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_LASTVISIBLE, 0L);\r
+               return CTreeItemT<TBase>(hTreeItem, (CTreeViewCtrlExT<TBase>*)this);\r
+       }\r
+#endif // !defined(_WIN32_WCE) && (_WIN32_IE >= 0x0400)\r
+\r
+#if (_WIN32_IE >= 0x0600)\r
+       CTreeItemT<TBase> GetNextSelectedItem() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_NEXTSELECTED, 0L);\r
+               return CTreeItemT<TBase>(hTreeItem, (CTreeViewCtrlExT<TBase>*)this);\r
+       }\r
+#endif // (_WIN32_IE >= 0x0600)\r
+\r
+       CTreeItemT<TBase> HitTest(TVHITTESTINFO* pHitTestInfo) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_HITTEST, 0, (LPARAM)pHitTestInfo);\r
+               return CTreeItemT<TBase>(hTreeItem, (CTreeViewCtrlExT<TBase>*)this);\r
+       }\r
+\r
+       CTreeItemT<TBase> InsertItem(UINT nMask, LPCTSTR lpszItem, int nImage,\r
+               int nSelectedImage, UINT nState, UINT nStateMask, LPARAM lParam,\r
+               HTREEITEM hParent, HTREEITEM hInsertAfter)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               TVINSERTSTRUCT tvis = { 0 };\r
+               tvis.hParent = hParent;\r
+               tvis.hInsertAfter = hInsertAfter;\r
+               tvis.item.mask = nMask;\r
+               tvis.item.pszText = (LPTSTR) lpszItem;\r
+               tvis.item.iImage = nImage;\r
+               tvis.item.iSelectedImage = nSelectedImage;\r
+               tvis.item.state = nState;\r
+               tvis.item.stateMask = nStateMask;\r
+               tvis.item.lParam = lParam;\r
+               HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_INSERTITEM, 0, (LPARAM)&tvis);\r
+               return CTreeItemT<TBase>(hTreeItem, this);\r
+       }\r
+\r
+       CTreeItemT<TBase> HitTest(POINT pt, UINT* pFlags) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               TVHITTESTINFO hti = { 0 };\r
+               hti.pt = pt;\r
+               HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_HITTEST, 0, (LPARAM)&hti);\r
+               if (pFlags != NULL)\r
+                       *pFlags = hti.flags;\r
+               return CTreeItemT<TBase>(hTreeItem, (CTreeViewCtrlExT<TBase>*)this);\r
+       }\r
+\r
+#if (_WIN32_WINNT >= 0x0501)\r
+       CTreeItemT<TBase> MapAccIDToHTREEITEM(UINT uID) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_MAPACCIDTOHTREEITEM, uID, 0L);\r
+               return CTreeItemT<TBase>(hTreeItem, (CTreeViewCtrlExT<TBase>*)this);\r
+       }\r
+#endif // (_WIN32_WINNT >= 0x0501)\r
+};\r
+\r
+typedef CTreeViewCtrlExT<ATL::CWindow>   CTreeViewCtrlEx;\r
+\r
+\r
+// CTreeItem inline methods\r
+template <class TBase>\r
+inline BOOL CTreeItemT<TBase>::GetRect(LPRECT lpRect, BOOL bTextOnly) const\r
+{\r
+       ATLASSERT(m_pTreeView != NULL);\r
+       return m_pTreeView->GetItemRect(m_hTreeItem,lpRect,bTextOnly);\r
+}\r
+\r
+template <class TBase>\r
+inline CTreeItemT<TBase> CTreeItemT<TBase>::GetNext(UINT nCode) const\r
+{\r
+       ATLASSERT(m_pTreeView != NULL);\r
+       return m_pTreeView->GetNextItem(m_hTreeItem,nCode);\r
+}\r
+\r
+template <class TBase>\r
+inline CTreeItemT<TBase> CTreeItemT<TBase>::GetChild() const\r
+{\r
+       ATLASSERT(m_pTreeView != NULL);\r
+       return m_pTreeView->GetChildItem(m_hTreeItem);\r
+}\r
+\r
+template <class TBase>\r
+inline CTreeItemT<TBase> CTreeItemT<TBase>::GetNextSibling() const\r
+{\r
+       ATLASSERT(m_pTreeView != NULL);\r
+       return m_pTreeView->GetNextSiblingItem(m_hTreeItem);\r
+}\r
+\r
+template <class TBase>\r
+inline CTreeItemT<TBase> CTreeItemT<TBase>::GetPrevSibling() const\r
+{\r
+       ATLASSERT(m_pTreeView != NULL);\r
+       return m_pTreeView->GetPrevSiblingItem(m_hTreeItem);\r
+}\r
+\r
+template <class TBase>\r
+inline CTreeItemT<TBase> CTreeItemT<TBase>::GetParent() const\r
+{\r
+       ATLASSERT(m_pTreeView != NULL);\r
+       return m_pTreeView->GetParentItem(m_hTreeItem);\r
+}\r
+\r
+template <class TBase>\r
+inline CTreeItemT<TBase> CTreeItemT<TBase>::GetFirstVisible() const\r
+{\r
+       ATLASSERT(m_pTreeView != NULL);\r
+       return m_pTreeView->GetFirstVisibleItem();\r
+}\r
+\r
+template <class TBase>\r
+inline CTreeItemT<TBase> CTreeItemT<TBase>::GetNextVisible() const\r
+{\r
+       ATLASSERT(m_pTreeView != NULL);\r
+       return m_pTreeView->GetNextVisibleItem(m_hTreeItem);\r
+}\r
+\r
+template <class TBase>\r
+inline CTreeItemT<TBase> CTreeItemT<TBase>::GetPrevVisible() const\r
+{\r
+       ATLASSERT(m_pTreeView != NULL);\r
+       return m_pTreeView->GetPrevVisibleItem(m_hTreeItem);\r
+}\r
+\r
+template <class TBase>\r
+inline CTreeItemT<TBase> CTreeItemT<TBase>::GetSelected() const\r
+{\r
+       ATLASSERT(m_pTreeView != NULL);\r
+       return m_pTreeView->GetSelectedItem();\r
+}\r
+\r
+template <class TBase>\r
+inline CTreeItemT<TBase> CTreeItemT<TBase>::GetDropHilight() const\r
+{\r
+       ATLASSERT(m_pTreeView != NULL);\r
+       return m_pTreeView->GetDropHilightItem();\r
+}\r
+\r
+template <class TBase>\r
+inline CTreeItemT<TBase> CTreeItemT<TBase>::GetRoot() const\r
+{\r
+       ATLASSERT(m_pTreeView != NULL);\r
+       return m_pTreeView->GetRootItem();\r
+}\r
+\r
+#if !defined(_WIN32_WCE) && (_WIN32_IE >= 0x0400)\r
+template <class TBase>\r
+inline CTreeItemT<TBase> CTreeItemT<TBase>::GetLastVisible() const\r
+{\r
+       ATLASSERT(m_pTreeView != NULL);\r
+       return m_pTreeView->GetLastVisibleItem();\r
+}\r
+#endif // !defined(_WIN32_WCE) && (_WIN32_IE >= 0x0400)\r
+\r
+#if (_WIN32_IE >= 0x0600)\r
+template <class TBase>\r
+inline CTreeItemT<TBase> CTreeItemT<TBase>::GetNextSelected() const\r
+{\r
+       ATLASSERT(m_pTreeView != NULL);\r
+       return m_pTreeView->GetNextSelectedItem();\r
+}\r
+#endif // (_WIN32_IE >= 0x0600)\r
+\r
+template <class TBase>\r
+inline BOOL CTreeItemT<TBase>::GetText(LPTSTR lpstrText, int nLen) const\r
+{\r
+       ATLASSERT(m_pTreeView != NULL);\r
+       return m_pTreeView->GetItemText(m_hTreeItem, lpstrText, nLen);\r
+}\r
+\r
+#ifndef _ATL_NO_COM\r
+#ifdef _OLEAUTO_H_\r
+template <class TBase>\r
+inline BOOL CTreeItemT<TBase>::GetText(BSTR& bstrText) const\r
+{\r
+       ATLASSERT(m_pTreeView != NULL);\r
+       return m_pTreeView->GetItemText(m_hTreeItem, bstrText);\r
+}\r
+#endif // _OLEAUTO_H_\r
+#endif // !_ATL_NO_COM\r
+\r
+#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)\r
+template <class TBase>\r
+inline BOOL CTreeItemT<TBase>::GetText(_CSTRING_NS::CString& strText) const\r
+{\r
+       ATLASSERT(m_pTreeView != NULL);\r
+       return m_pTreeView->GetItemText(m_hTreeItem, strText);\r
+}\r
+#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)\r
+\r
+template <class TBase>\r
+inline BOOL CTreeItemT<TBase>::GetImage(int& nImage, int& nSelectedImage) const\r
+{\r
+       ATLASSERT(m_pTreeView != NULL);\r
+       return m_pTreeView->GetItemImage(m_hTreeItem,nImage,nSelectedImage);\r
+}\r
+\r
+template <class TBase>\r
+inline UINT CTreeItemT<TBase>::GetState(UINT nStateMask) const\r
+{\r
+       ATLASSERT(m_pTreeView != NULL);\r
+       return m_pTreeView->GetItemState(m_hTreeItem,nStateMask);\r
+}\r
+\r
+template <class TBase>\r
+inline DWORD_PTR CTreeItemT<TBase>::GetData() const\r
+{\r
+       ATLASSERT(m_pTreeView != NULL);\r
+       return m_pTreeView->GetItemData(m_hTreeItem);\r
+}\r
+\r
+template <class TBase>\r
+inline BOOL CTreeItemT<TBase>::SetItem(UINT nMask, LPCTSTR lpszItem, int nImage,\r
+               int nSelectedImage, UINT nState, UINT nStateMask, LPARAM lParam)\r
+{\r
+       ATLASSERT(m_pTreeView != NULL);\r
+       return m_pTreeView->SetItem(m_hTreeItem, nMask, lpszItem, nImage, nSelectedImage, nState, nStateMask, lParam);\r
+}\r
+\r
+template <class TBase>\r
+inline BOOL CTreeItemT<TBase>::SetText(LPCTSTR lpszItem)\r
+{\r
+       ATLASSERT(m_pTreeView != NULL);\r
+       return m_pTreeView->SetItemText(m_hTreeItem,lpszItem);\r
+}\r
+\r
+template <class TBase>\r
+inline BOOL CTreeItemT<TBase>::SetImage(int nImage, int nSelectedImage)\r
+{\r
+       ATLASSERT(m_pTreeView != NULL);\r
+       return m_pTreeView->SetItemImage(m_hTreeItem,nImage,nSelectedImage);\r
+}\r
+\r
+template <class TBase>\r
+inline BOOL CTreeItemT<TBase>::SetState(UINT nState, UINT nStateMask)\r
+{\r
+       ATLASSERT(m_pTreeView != NULL);\r
+       return m_pTreeView->SetItemState(m_hTreeItem,nState,nStateMask);\r
+}\r
+\r
+template <class TBase>\r
+inline BOOL CTreeItemT<TBase>::SetData(DWORD_PTR dwData)\r
+{\r
+       ATLASSERT(m_pTreeView != NULL);\r
+       return m_pTreeView->SetItemData(m_hTreeItem,dwData);\r
+}\r
+\r
+template <class TBase>\r
+inline BOOL CTreeItemT<TBase>::HasChildren() const\r
+{\r
+       ATLASSERT(m_pTreeView != NULL);\r
+       return m_pTreeView->ItemHasChildren(m_hTreeItem);\r
+}\r
+\r
+template <class TBase>\r
+inline BOOL CTreeItemT<TBase>::Delete()\r
+{\r
+       ATLASSERT(m_pTreeView != NULL);\r
+       return m_pTreeView->DeleteItem(m_hTreeItem);\r
+}\r
+\r
+template <class TBase>\r
+inline BOOL CTreeItemT<TBase>::Expand(UINT nCode /*= TVE_EXPAND*/)\r
+{\r
+       ATLASSERT(m_pTreeView != NULL);\r
+       return m_pTreeView->Expand(m_hTreeItem,nCode);\r
+}\r
+\r
+template <class TBase>\r
+inline BOOL CTreeItemT<TBase>::Select(UINT nCode)\r
+{\r
+       ATLASSERT(m_pTreeView != NULL);\r
+       return m_pTreeView->Select(m_hTreeItem,nCode);\r
+}\r
+\r
+template <class TBase>\r
+inline BOOL CTreeItemT<TBase>::Select()\r
+{\r
+       ATLASSERT(m_pTreeView != NULL);\r
+       return m_pTreeView->SelectItem(m_hTreeItem);\r
+}\r
+\r
+template <class TBase>\r
+inline BOOL CTreeItemT<TBase>::SelectDropTarget()\r
+{\r
+       ATLASSERT(m_pTreeView != NULL);\r
+       return m_pTreeView->SelectDropTarget(m_hTreeItem);\r
+}\r
+\r
+template <class TBase>\r
+inline BOOL CTreeItemT<TBase>::SelectSetFirstVisible()\r
+{\r
+       ATLASSERT(m_pTreeView != NULL);\r
+       return m_pTreeView->SelectSetFirstVisible(m_hTreeItem);\r
+}\r
+\r
+template <class TBase>\r
+inline HWND CTreeItemT<TBase>::EditLabel()\r
+{\r
+       ATLASSERT(m_pTreeView != NULL);\r
+       return m_pTreeView->EditLabel(m_hTreeItem);\r
+}\r
+\r
+template <class TBase>\r
+inline HIMAGELIST CTreeItemT<TBase>::CreateDragImage()\r
+{\r
+       ATLASSERT(m_pTreeView != NULL);\r
+       return m_pTreeView->CreateDragImage(m_hTreeItem);\r
+}\r
+\r
+template <class TBase>\r
+inline BOOL CTreeItemT<TBase>::SortChildren(BOOL bRecurse /*= FALSE*/)\r
+{\r
+       ATLASSERT(m_pTreeView != NULL);\r
+       return m_pTreeView->SortChildren(m_hTreeItem, bRecurse);\r
+}\r
+\r
+template <class TBase>\r
+inline BOOL CTreeItemT<TBase>::EnsureVisible()\r
+{\r
+       ATLASSERT(m_pTreeView != NULL);\r
+       return m_pTreeView->EnsureVisible(m_hTreeItem);\r
+}\r
+\r
+template <class TBase>\r
+inline CTreeItemT<TBase> CTreeItemT<TBase>::_Insert(LPCTSTR lpstrItem, int nImageIndex, HTREEITEM hItemAfter)\r
+{\r
+       ATLASSERT(m_pTreeView != NULL);\r
+       TVINSERTSTRUCT ins = { 0 };\r
+       ins.hParent = m_hTreeItem;\r
+       ins.hInsertAfter = hItemAfter;\r
+       ins.item.mask = TVIF_TEXT;\r
+       ins.item.pszText = (LPTSTR)lpstrItem;\r
+       if(nImageIndex != -1)\r
+       {\r
+               ins.item.mask |= TVIF_IMAGE | TVIF_SELECTEDIMAGE;\r
+               ins.item.iImage = nImageIndex;\r
+               ins.item.iSelectedImage = nImageIndex;\r
+       }\r
+       return CTreeItemT<TBase>(m_pTreeView->InsertItem(&ins), m_pTreeView);\r
+}\r
+\r
+template <class TBase>\r
+inline int CTreeItemT<TBase>::GetImageIndex() const\r
+{\r
+       ATLASSERT(m_pTreeView != NULL);\r
+       TVITEM item = { 0 };\r
+       item.mask = TVIF_HANDLE | TVIF_IMAGE;\r
+       item.hItem = m_hTreeItem;\r
+       m_pTreeView->GetItem(&item);\r
+       return item.iImage;\r
+}\r
+\r
+#if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)\r
+template <class TBase>\r
+inline BOOL CTreeItemT<TBase>::SetInsertMark(BOOL bAfter)\r
+{\r
+       ATLASSERT(m_pTreeView != NULL);\r
+       return m_pTreeView->SetInsertMark(m_hTreeItem, bAfter);\r
+}\r
+#endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)\r
+\r
+#if (_WIN32_WINNT >= 0x0501)\r
+template <class TBase>\r
+inline UINT CTreeItemT<TBase>::MapHTREEITEMToAccID() const\r
+{\r
+       ATLASSERT(m_pTreeView != NULL);\r
+       return m_pTreeView->MapHTREEITEMToAccID(m_hTreeItem);\r
+}\r
+#endif // (_WIN32_WINNT >= 0x0501)\r
+\r
+#if (_WIN32_WINNT >= 0x0600)\r
+template <class TBase>\r
+inline void CTreeItemT<TBase>::ShowInfoTip()\r
+{\r
+       ATLASSERT(m_pTreeView != NULL);\r
+       m_pTreeView->ShowInfoTip(m_hTreeItem);\r
+}\r
+\r
+template <class TBase>\r
+inline BOOL CTreeItemT<TBase>::GetPartRect(TVITEMPART partID, LPRECT lpRect) const\r
+{\r
+       ATLASSERT(m_pTreeView != NULL);\r
+       return m_pTreeView->GetItemPartRect(m_hTreeItem, partID, lpRect);\r
+}\r
+#endif // (_WIN32_WINNT >= 0x0600)\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CToolBarCtrl\r
+\r
+template <class TBase>\r
+class CToolBarCtrlT : public TBase\r
+{\r
+public:\r
+// Construction\r
+       CToolBarCtrlT(HWND hWnd = NULL) : TBase(hWnd)\r
+       { }\r
+\r
+       CToolBarCtrlT< TBase >& operator =(HWND hWnd)\r
+       {\r
+               m_hWnd = hWnd;\r
+               return *this;\r
+       }\r
+\r
+       HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,\r
+                       DWORD dwStyle = 0, DWORD dwExStyle = 0,\r
+                       ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)\r
+       {\r
+               return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);\r
+       }\r
+\r
+// Attributes\r
+       static LPCTSTR GetWndClassName()\r
+       {\r
+               return TOOLBARCLASSNAME;\r
+       }\r
+\r
+       BOOL IsButtonEnabled(int nID) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TB_ISBUTTONENABLED, nID, 0L);\r
+       }\r
+\r
+       BOOL IsButtonChecked(int nID) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TB_ISBUTTONCHECKED, nID, 0L);\r
+       }\r
+\r
+       BOOL IsButtonPressed(int nID) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TB_ISBUTTONPRESSED, nID, 0L);\r
+       }\r
+\r
+       BOOL IsButtonHidden(int nID) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return(BOOL) ::SendMessage(m_hWnd, TB_ISBUTTONHIDDEN, nID, 0L);\r
+       }\r
+\r
+       BOOL IsButtonIndeterminate(int nID) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TB_ISBUTTONINDETERMINATE, nID, 0L);\r
+       }\r
+\r
+       int GetState(int nID) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, TB_GETSTATE, nID, 0L);\r
+       }\r
+\r
+       BOOL SetState(int nID, UINT nState)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TB_SETSTATE, nID, MAKELPARAM(nState, 0));\r
+       }\r
+\r
+       BOOL GetButton(int nIndex, LPTBBUTTON lpButton) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TB_GETBUTTON, nIndex, (LPARAM)lpButton);\r
+       }\r
+\r
+       int GetButtonCount() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, TB_BUTTONCOUNT, 0, 0L);\r
+       }\r
+\r
+       BOOL GetItemRect(int nIndex, LPRECT lpRect) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TB_GETITEMRECT, nIndex, (LPARAM)lpRect);\r
+       }\r
+\r
+       void SetButtonStructSize(int nSize = sizeof(TBBUTTON))\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, TB_BUTTONSTRUCTSIZE, nSize, 0L);\r
+       }\r
+\r
+       BOOL SetButtonSize(SIZE size)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TB_SETBUTTONSIZE, 0, MAKELPARAM(size.cx, size.cy));\r
+       }\r
+\r
+       BOOL SetButtonSize(int cx, int cy)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TB_SETBUTTONSIZE, 0, MAKELPARAM(cx, cy));\r
+       }\r
+\r
+       BOOL SetBitmapSize(SIZE size)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TB_SETBITMAPSIZE, 0, MAKELPARAM(size.cx, size.cy));\r
+       }\r
+\r
+       BOOL SetBitmapSize(int cx, int cy)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TB_SETBITMAPSIZE, 0, MAKELPARAM(cx, cy));\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       CToolTipCtrl GetToolTips() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return CToolTipCtrl((HWND)::SendMessage(m_hWnd, TB_GETTOOLTIPS, 0, 0L));\r
+       }\r
+\r
+       void SetToolTips(HWND hWndToolTip)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, TB_SETTOOLTIPS, (WPARAM)hWndToolTip, 0L);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       void SetNotifyWnd(HWND hWnd)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, TB_SETPARENT, (WPARAM)hWnd, 0L);\r
+       }\r
+\r
+       int GetRows() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, TB_GETROWS, 0, 0L);\r
+       }\r
+\r
+       void SetRows(int nRows, BOOL bLarger, LPRECT lpRect)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, TB_SETROWS, MAKELPARAM(nRows, bLarger), (LPARAM)lpRect);\r
+       }\r
+\r
+       BOOL SetCmdID(int nIndex, UINT nID)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TB_SETCMDID, nIndex, nID);\r
+       }\r
+\r
+       DWORD GetBitmapFlags() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (DWORD)::SendMessage(m_hWnd, TB_GETBITMAPFLAGS, 0, 0L);\r
+       }\r
+\r
+       int GetBitmap(int nID) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, TB_GETBITMAP, nID, 0L);\r
+       }\r
+\r
+       int GetButtonText(int nID, LPTSTR lpstrText) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, TB_GETBUTTONTEXT, nID, (LPARAM)lpstrText);\r
+       }\r
+\r
+       // nIndex - IE5 or higher only\r
+       CImageList GetImageList(int nIndex = 0) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TB_GETIMAGELIST, nIndex, 0L));\r
+       }\r
+\r
+       // nIndex - IE5 or higher only\r
+       CImageList SetImageList(HIMAGELIST hImageList, int nIndex = 0)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TB_SETIMAGELIST, nIndex, (LPARAM)hImageList));\r
+       }\r
+\r
+       // nIndex - IE5 or higher only\r
+       CImageList GetDisabledImageList(int nIndex = 0) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TB_GETDISABLEDIMAGELIST, nIndex, 0L));\r
+       }\r
+\r
+       // nIndex - IE5 or higher only\r
+       CImageList SetDisabledImageList(HIMAGELIST hImageList, int nIndex = 0)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TB_SETDISABLEDIMAGELIST, nIndex, (LPARAM)hImageList));\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       // nIndex - IE5 or higher only\r
+       CImageList GetHotImageList(int nIndex = 0) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TB_GETHOTIMAGELIST, nIndex, 0L));\r
+       }\r
+\r
+       // nIndex - IE5 or higher only\r
+       CImageList SetHotImageList(HIMAGELIST hImageList, int nIndex = 0)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TB_SETHOTIMAGELIST, nIndex, (LPARAM)hImageList));\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       DWORD GetStyle() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (DWORD)::SendMessage(m_hWnd, TB_GETSTYLE, 0, 0L);\r
+       }\r
+\r
+       void SetStyle(DWORD dwStyle)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, TB_SETSTYLE, 0, dwStyle);\r
+       }\r
+\r
+       DWORD GetButtonSize() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (DWORD)::SendMessage(m_hWnd, TB_GETBUTTONSIZE, 0, 0L);\r
+       }\r
+\r
+       void GetButtonSize(SIZE& size) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               DWORD dwRet = (DWORD)::SendMessage(m_hWnd, TB_GETBUTTONSIZE, 0, 0L);\r
+               size.cx = LOWORD(dwRet);\r
+               size.cy = HIWORD(dwRet);\r
+       }\r
+\r
+       BOOL GetRect(int nID, LPRECT lpRect) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TB_GETRECT, nID, (LPARAM)lpRect);\r
+       }\r
+\r
+       int GetTextRows() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, TB_GETTEXTROWS, 0, 0L);\r
+       }\r
+\r
+       BOOL SetButtonWidth(int cxMin, int cxMax)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TB_SETBUTTONWIDTH, 0, MAKELPARAM(cxMin, cxMax));\r
+       }\r
+\r
+       BOOL SetIndent(int nIndent)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TB_SETINDENT, nIndent, 0L);\r
+       }\r
+\r
+       BOOL SetMaxTextRows(int nMaxTextRows)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TB_SETMAXTEXTROWS, nMaxTextRows, 0L);\r
+       }\r
+\r
+#if (_WIN32_IE >= 0x0400)\r
+#ifndef _WIN32_WCE\r
+       BOOL GetAnchorHighlight() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TB_GETANCHORHIGHLIGHT, 0, 0L);\r
+       }\r
+\r
+       BOOL SetAnchorHighlight(BOOL bEnable = TRUE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TB_SETANCHORHIGHLIGHT, bEnable, 0L);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       int GetButtonInfo(int nID, LPTBBUTTONINFO lptbbi) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, TB_GETBUTTONINFO, nID, (LPARAM)lptbbi);\r
+       }\r
+\r
+       BOOL SetButtonInfo(int nID, LPTBBUTTONINFO lptbbi)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TB_SETBUTTONINFO, nID, (LPARAM)lptbbi);\r
+       }\r
+\r
+       BOOL SetButtonInfo(int nID, DWORD dwMask, BYTE Style, BYTE State, LPCTSTR lpszItem, \r
+                          int iImage, WORD cx, int iCommand, DWORD_PTR lParam)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               TBBUTTONINFO tbbi = { 0 };\r
+               tbbi.cbSize = sizeof(TBBUTTONINFO);\r
+               tbbi.dwMask = dwMask;\r
+               tbbi.idCommand = iCommand;\r
+               tbbi.iImage = iImage;\r
+               tbbi.fsState = State;\r
+               tbbi.fsStyle = Style;\r
+               tbbi.cx = cx;\r
+               tbbi.pszText = (LPTSTR) lpszItem;\r
+               tbbi.lParam = lParam;\r
+               return (BOOL)::SendMessage(m_hWnd, TB_SETBUTTONINFO, nID, (LPARAM)&tbbi);\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       int GetHotItem() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, TB_GETHOTITEM, 0, 0L);\r
+       }\r
+\r
+       int SetHotItem(int nItem)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, TB_SETHOTITEM, nItem, 0L);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       BOOL IsButtonHighlighted(int nButtonID) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TB_ISBUTTONHIGHLIGHTED, nButtonID, 0L);\r
+       }\r
+\r
+       DWORD SetDrawTextFlags(DWORD dwMask, DWORD dwFlags)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (DWORD)::SendMessage(m_hWnd, TB_SETDRAWTEXTFLAGS, dwMask, dwFlags);\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       BOOL GetColorScheme(LPCOLORSCHEME lpcs) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TB_GETCOLORSCHEME, 0, (LPARAM)lpcs);\r
+       }\r
+\r
+       void SetColorScheme(LPCOLORSCHEME lpcs)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, TB_SETCOLORSCHEME, 0, (LPARAM)lpcs);\r
+       }\r
+\r
+       DWORD GetExtendedStyle() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (DWORD)::SendMessage(m_hWnd, TB_GETEXTENDEDSTYLE, 0, 0L);\r
+       }\r
+\r
+       DWORD SetExtendedStyle(DWORD dwStyle)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (DWORD)::SendMessage(m_hWnd, TB_SETEXTENDEDSTYLE, 0, dwStyle);\r
+       }\r
+\r
+       void GetInsertMark(LPTBINSERTMARK lptbim) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, TB_GETINSERTMARK, 0, (LPARAM)lptbim);\r
+       }\r
+\r
+       void SetInsertMark(LPTBINSERTMARK lptbim)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, TB_SETINSERTMARK, 0, (LPARAM)lptbim);\r
+       }\r
+\r
+       COLORREF GetInsertMarkColor() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (COLORREF)::SendMessage(m_hWnd, TB_GETINSERTMARKCOLOR, 0, 0L);\r
+       }\r
+\r
+       COLORREF SetInsertMarkColor(COLORREF clr)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (COLORREF)::SendMessage(m_hWnd, TB_SETINSERTMARKCOLOR, 0, (LPARAM)clr);\r
+       }\r
+\r
+       BOOL GetMaxSize(LPSIZE lpSize) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TB_GETMAXSIZE, 0, (LPARAM)lpSize);\r
+       }\r
+\r
+       void GetPadding(LPSIZE lpSizePadding) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(lpSizePadding != NULL);\r
+               DWORD dwRet = (DWORD)::SendMessage(m_hWnd, TB_GETPADDING, 0, 0L);\r
+               lpSizePadding->cx = GET_X_LPARAM(dwRet);\r
+               lpSizePadding->cy = GET_Y_LPARAM(dwRet);\r
+       }\r
+\r
+       void SetPadding(int cx, int cy, LPSIZE lpSizePadding = NULL)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               DWORD dwRet = (DWORD)::SendMessage(m_hWnd, TB_SETPADDING, 0, MAKELPARAM(cx, cy));\r
+               if(lpSizePadding != NULL)\r
+               {\r
+                       lpSizePadding->cx = GET_X_LPARAM(dwRet);\r
+                       lpSizePadding->cy = GET_Y_LPARAM(dwRet);\r
+               }\r
+       }\r
+\r
+       BOOL GetUnicodeFormat() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TB_GETUNICODEFORMAT, 0, 0L);\r
+       }\r
+\r
+       BOOL SetUnicodeFormat(BOOL bUnicode = TRUE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TB_SETUNICODEFORMAT, bUnicode, 0L);\r
+       }\r
+#endif // !_WIN32_WCE\r
+#endif // (_WIN32_IE >= 0x0400)\r
+\r
+#if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)\r
+       int GetString(int nString, LPTSTR lpstrString, int cchMaxLen) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, TB_GETSTRING, MAKEWPARAM(cchMaxLen, nString), (LPARAM)lpstrString);\r
+       }\r
+\r
+       int GetStringBSTR(int nString, BSTR& bstrString) const\r
+       {\r
+               USES_CONVERSION;\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(bstrString == NULL);\r
+               int nLength = (int)(short)LOWORD(::SendMessage(m_hWnd, TB_GETSTRING, MAKEWPARAM(0, nString), NULL));\r
+               if(nLength != -1)\r
+               {\r
+                       CTempBuffer<TCHAR, _WTL_STACK_ALLOC_THRESHOLD> buff;\r
+                       LPTSTR lpstrText = buff.Allocate(nLength + 1);\r
+                       if(lpstrText != NULL)\r
+                       {\r
+                               nLength = (int)::SendMessage(m_hWnd, TB_GETSTRING, MAKEWPARAM(nLength + 1, nString), (LPARAM)lpstrText);\r
+                               if(nLength != -1)\r
+                                       bstrString = ::SysAllocString(T2OLE(lpstrText));\r
+                       }\r
+                       else\r
+                       {\r
+                               nLength = -1;\r
+                       }\r
+               }\r
+\r
+               return nLength;\r
+       }\r
+\r
+#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)\r
+       int GetString(int nString, _CSTRING_NS::CString& str) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               int nLength = (int)(short)LOWORD(::SendMessage(m_hWnd, TB_GETSTRING, MAKEWPARAM(0, nString), NULL));\r
+               if(nLength != -1)\r
+               {\r
+                       LPTSTR lpstr = str.GetBufferSetLength(nLength + 1);\r
+                       if(lpstr != NULL)\r
+                               nLength = (int)::SendMessage(m_hWnd, TB_GETSTRING, MAKEWPARAM(nLength + 1, nString), (LPARAM)lpstr);\r
+                       else\r
+                               nLength = -1;\r
+                       str.ReleaseBuffer();\r
+               }\r
+               return nLength;\r
+       }\r
+#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)\r
+#endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)\r
+\r
+#if (_WIN32_WINNT >= 0x0501)\r
+       void GetMetrics(LPTBMETRICS lptbm) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, TB_GETMETRICS, 0, (LPARAM)lptbm);\r
+       }\r
+\r
+       void SetMetrics(LPTBMETRICS lptbm)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, TB_SETMETRICS, 0, (LPARAM)lptbm);\r
+       }\r
+\r
+       void SetWindowTheme(LPCWSTR lpstrTheme)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, TB_SETWINDOWTHEME, 0, (LPARAM)lpstrTheme);\r
+       }\r
+#endif // (_WIN32_WINNT >= 0x0501)\r
+\r
+#if (_WIN32_WINNT >= 0x0600)\r
+       CImageList GetPressedImageList(int nIndex = 0) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TB_GETPRESSEDIMAGELIST, nIndex, 0L));\r
+       }\r
+\r
+       CImageList SetPressedImageList(HIMAGELIST hImageList, int nIndex = 0)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TB_SETPRESSEDIMAGELIST, nIndex, (LPARAM)hImageList));\r
+       }\r
+#endif // (_WIN32_WINNT >= 0x0600)\r
+\r
+// Operations\r
+       BOOL EnableButton(int nID, BOOL bEnable = TRUE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TB_ENABLEBUTTON, nID, MAKELPARAM(bEnable, 0));\r
+       }\r
+\r
+       BOOL CheckButton(int nID, BOOL bCheck = TRUE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TB_CHECKBUTTON, nID, MAKELPARAM(bCheck, 0));\r
+       }\r
+\r
+       BOOL PressButton(int nID, BOOL bPress = TRUE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TB_PRESSBUTTON, nID, MAKELPARAM(bPress, 0));\r
+       }\r
+\r
+       BOOL HideButton(int nID, BOOL bHide = TRUE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TB_HIDEBUTTON, nID, MAKELPARAM(bHide, 0));\r
+       }\r
+\r
+       BOOL Indeterminate(int nID, BOOL bIndeterminate = TRUE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TB_INDETERMINATE, nID, MAKELPARAM(bIndeterminate, 0));\r
+       }\r
+\r
+       int AddBitmap(int nNumButtons, UINT nBitmapID)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               TBADDBITMAP tbab = { 0 };\r
+               tbab.hInst = ModuleHelper::GetResourceInstance();\r
+               ATLASSERT(tbab.hInst != NULL);\r
+               tbab.nID = nBitmapID;\r
+               return (int)::SendMessage(m_hWnd, TB_ADDBITMAP, (WPARAM)nNumButtons, (LPARAM)&tbab);\r
+       }\r
+\r
+       int AddBitmap(int nNumButtons, HBITMAP hBitmap)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               TBADDBITMAP tbab = { 0 };\r
+               tbab.hInst = NULL;\r
+               tbab.nID = (UINT_PTR)hBitmap;\r
+               return (int)::SendMessage(m_hWnd, TB_ADDBITMAP, (WPARAM)nNumButtons, (LPARAM)&tbab);\r
+       }\r
+\r
+       BOOL AddButtons(int nNumButtons, LPTBBUTTON lpButtons)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TB_ADDBUTTONS, nNumButtons, (LPARAM)lpButtons);\r
+       }\r
+\r
+       BOOL InsertButton(int nIndex, LPTBBUTTON lpButton)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TB_INSERTBUTTON, nIndex, (LPARAM)lpButton);\r
+       }\r
+\r
+       BOOL InsertButton(int nIndex, int iCommand, BYTE Style, BYTE State, int iBitmap, \r
+                         INT_PTR iString, DWORD_PTR lParam)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               TBBUTTON tbb = { 0 };\r
+               tbb.fsStyle = Style;\r
+               tbb.fsState = State;\r
+               tbb.idCommand = iCommand;\r
+               tbb.iBitmap = iBitmap;\r
+               tbb.iString = iString;\r
+               tbb.dwData = lParam;\r
+               return (BOOL)::SendMessage(m_hWnd, TB_INSERTBUTTON, nIndex, (LPARAM)&tbb);\r
+       }\r
+\r
+       BOOL InsertButton(int nIndex, int iCommand, BYTE Style, BYTE State, int iBitmap, \r
+                         LPCTSTR lpszItem, DWORD_PTR lParam)\r
+       {\r
+               return InsertButton(nIndex, iCommand, Style, State, iBitmap, (INT_PTR)lpszItem, lParam);\r
+       }\r
+\r
+       BOOL AddButton(LPTBBUTTON lpButton)\r
+       {\r
+               return InsertButton(-1, lpButton);\r
+       }\r
+\r
+       BOOL AddButton(int iCommand, BYTE Style, BYTE State, int iBitmap, INT_PTR iString, DWORD_PTR lParam)\r
+       {\r
+               return InsertButton(-1, iCommand, Style, State, iBitmap, iString, lParam);\r
+       }\r
+\r
+       BOOL AddButton(int iCommand, BYTE Style, BYTE State, int iBitmap, LPCTSTR lpszItem, DWORD_PTR lParam)\r
+       {\r
+               return InsertButton(-1, iCommand, Style, State, iBitmap, lpszItem, lParam);\r
+       }\r
+\r
+       BOOL DeleteButton(int nIndex)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TB_DELETEBUTTON, nIndex, 0L);\r
+       }\r
+\r
+       UINT CommandToIndex(UINT nID) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (UINT)::SendMessage(m_hWnd, TB_COMMANDTOINDEX, nID, 0L);\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       void SaveState(HKEY hKeyRoot, LPCTSTR lpszSubKey, LPCTSTR lpszValueName)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               TBSAVEPARAMS tbs = { 0 };\r
+               tbs.hkr = hKeyRoot;\r
+               tbs.pszSubKey = lpszSubKey;\r
+               tbs.pszValueName = lpszValueName;\r
+               ::SendMessage(m_hWnd, TB_SAVERESTORE, (WPARAM)TRUE, (LPARAM)&tbs);\r
+       }\r
+\r
+       void RestoreState(HKEY hKeyRoot, LPCTSTR lpszSubKey, LPCTSTR lpszValueName)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               TBSAVEPARAMS tbs = { 0 };\r
+               tbs.hkr = hKeyRoot;\r
+               tbs.pszSubKey = lpszSubKey;\r
+               tbs.pszValueName = lpszValueName;\r
+               ::SendMessage(m_hWnd, TB_SAVERESTORE, (WPARAM)FALSE, (LPARAM)&tbs);\r
+       }\r
+\r
+       void Customize()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, TB_CUSTOMIZE, 0, 0L);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       int AddString(UINT nStringID)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, TB_ADDSTRING, (WPARAM)ModuleHelper::GetResourceInstance(), (LPARAM)nStringID);\r
+       }\r
+\r
+       int AddStrings(LPCTSTR lpszStrings)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, TB_ADDSTRING, 0, (LPARAM)lpszStrings);\r
+       }\r
+\r
+       void AutoSize()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, TB_AUTOSIZE, 0, 0L);\r
+       }\r
+\r
+       BOOL ChangeBitmap(int nID, int nBitmap)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TB_CHANGEBITMAP, nID, MAKELPARAM(nBitmap, 0));\r
+       }\r
+\r
+       int LoadImages(int nBitmapID)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, TB_LOADIMAGES, nBitmapID, (LPARAM)ModuleHelper::GetResourceInstance());\r
+       }\r
+\r
+       int LoadStdImages(int nBitmapID)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, TB_LOADIMAGES, nBitmapID, (LPARAM)HINST_COMMCTRL);\r
+       }\r
+\r
+       BOOL ReplaceBitmap(LPTBREPLACEBITMAP ptbrb)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TB_REPLACEBITMAP, 0, (LPARAM)ptbrb);\r
+       }\r
+\r
+#if (_WIN32_IE >= 0x0400)\r
+       int HitTest(LPPOINT lpPoint) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, TB_HITTEST, 0, (LPARAM)lpPoint);\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       BOOL InsertMarkHitTest(LPPOINT lpPoint, LPTBINSERTMARK lptbim) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TB_INSERTMARKHITTEST, (WPARAM)lpPoint, (LPARAM)lptbim);\r
+       }\r
+\r
+       BOOL InsertMarkHitTest(int x, int y, LPTBINSERTMARK lptbim) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               POINT pt = { x, y };\r
+               return (BOOL)::SendMessage(m_hWnd, TB_INSERTMARKHITTEST, (WPARAM)&pt, (LPARAM)lptbim);\r
+       }\r
+\r
+       BOOL MapAccelerator(TCHAR chAccel, int& nID) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TB_MAPACCELERATOR, (WPARAM)chAccel, (LPARAM)&nID);\r
+       }\r
+\r
+       BOOL MarkButton(int nID, BOOL bHighlight = TRUE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TB_MARKBUTTON, nID, MAKELPARAM(bHighlight, 0));\r
+       }\r
+\r
+       BOOL MoveButton(int nOldPos, int nNewPos)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TB_MOVEBUTTON, nOldPos, nNewPos);\r
+       }\r
+\r
+       HRESULT GetObject(REFIID iid, LPVOID* ppvObject)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (HRESULT)::SendMessage(m_hWnd, TB_GETOBJECT, (WPARAM)&iid, (LPARAM)ppvObject);\r
+       }\r
+#endif // !_WIN32_WCE\r
+#endif // (_WIN32_IE >= 0x0400)\r
+};\r
+\r
+typedef CToolBarCtrlT<ATL::CWindow>   CToolBarCtrl;\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CStatusBarCtrl\r
+\r
+template <class TBase>\r
+class CStatusBarCtrlT : public TBase\r
+{\r
+public:\r
+// Constructors\r
+       CStatusBarCtrlT(HWND hWnd = NULL) : TBase(hWnd)\r
+       { }\r
+\r
+       CStatusBarCtrlT< TBase >& operator =(HWND hWnd)\r
+       {\r
+               m_hWnd = hWnd;\r
+               return *this;\r
+       }\r
+\r
+       HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,\r
+                       DWORD dwStyle = 0, DWORD dwExStyle = 0,\r
+                       ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)\r
+       {\r
+               return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);\r
+       }\r
+\r
+// Methods\r
+       static LPCTSTR GetWndClassName()\r
+       {\r
+               return STATUSCLASSNAME;\r
+       }\r
+\r
+       int GetParts(int nParts, int* pParts) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, SB_GETPARTS, nParts, (LPARAM)pParts);\r
+       }\r
+\r
+       BOOL SetParts(int nParts, int* pWidths)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, SB_SETPARTS, nParts, (LPARAM)pWidths);\r
+       }\r
+\r
+       int GetTextLength(int nPane, int* pType = NULL) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(nPane < 256);\r
+               DWORD dwRet = (DWORD)::SendMessage(m_hWnd, SB_GETTEXTLENGTH, (WPARAM)nPane, 0L);\r
+               if (pType != NULL)\r
+                       *pType = (int)(short)HIWORD(dwRet);\r
+               return (int)(short)LOWORD(dwRet);\r
+       }\r
+\r
+       int GetText(int nPane, LPTSTR lpszText, int* pType = NULL) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(nPane < 256);\r
+               DWORD dwRet = (DWORD)::SendMessage(m_hWnd, SB_GETTEXT, (WPARAM)nPane, (LPARAM)lpszText);\r
+               if(pType != NULL)\r
+                       *pType = (int)(short)HIWORD(dwRet);\r
+               return (int)(short)LOWORD(dwRet);\r
+       }\r
+\r
+#ifndef _ATL_NO_COM\r
+       BOOL GetTextBSTR(int nPane, BSTR& bstrText, int* pType = NULL) const\r
+       {\r
+               USES_CONVERSION;\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(nPane < 256);\r
+               ATLASSERT(bstrText == NULL);\r
+               int nLength = (int)(short)LOWORD(::SendMessage(m_hWnd, SB_GETTEXTLENGTH, (WPARAM)nPane, 0L));\r
+               if(nLength == 0)\r
+                       return FALSE;\r
+\r
+               CTempBuffer<TCHAR, _WTL_STACK_ALLOC_THRESHOLD> buff;\r
+               LPTSTR lpstrText = buff.Allocate(nLength + 1);\r
+               if(lpstrText == NULL)\r
+                       return FALSE;\r
+\r
+               if(!GetText(nPane, lpstrText, pType))\r
+                       return FALSE;\r
+\r
+               bstrText = ::SysAllocString(T2OLE(lpstrText));\r
+               return (bstrText != NULL) ? TRUE : FALSE;\r
+       }\r
+#endif // !_ATL_NO_COM\r
+\r
+#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)\r
+       int GetText(int nPane, _CSTRING_NS::CString& strText, int* pType = NULL) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(nPane < 256);\r
+               int nLength = (int)(short)LOWORD(::SendMessage(m_hWnd, SB_GETTEXTLENGTH, (WPARAM)nPane, 0L));\r
+               if(nLength == 0)\r
+                       return 0;\r
+\r
+               LPTSTR lpstr = strText.GetBufferSetLength(nLength);\r
+               if(lpstr == NULL)\r
+                       return 0;\r
+               return GetText(nPane, lpstr, pType);\r
+       }\r
+#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)\r
+\r
+       BOOL SetText(int nPane, LPCTSTR lpszText, int nType = 0)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(nPane < 256);\r
+               return (BOOL)::SendMessage(m_hWnd, SB_SETTEXT, (nPane | nType), (LPARAM)lpszText);\r
+       }\r
+\r
+       BOOL GetRect(int nPane, LPRECT lpRect) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(nPane < 256);\r
+               return (BOOL)::SendMessage(m_hWnd, SB_GETRECT, nPane, (LPARAM)lpRect);\r
+       }\r
+\r
+       BOOL GetBorders(int* pBorders) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, SB_GETBORDERS, 0, (LPARAM)pBorders);\r
+       }\r
+\r
+       BOOL GetBorders(int& nHorz, int& nVert, int& nSpacing) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               int borders[3] = { 0, 0, 0 };\r
+               BOOL bResult = (BOOL)::SendMessage(m_hWnd, SB_GETBORDERS, 0, (LPARAM)&borders);\r
+               if(bResult)\r
+               {\r
+                       nHorz = borders[0];\r
+                       nVert = borders[1];\r
+                       nSpacing = borders[2];\r
+               }\r
+               return bResult;\r
+       }\r
+\r
+       void SetMinHeight(int nMin)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, SB_SETMINHEIGHT, nMin, 0L);\r
+       }\r
+\r
+       BOOL SetSimple(BOOL bSimple = TRUE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, SB_SIMPLE, bSimple, 0L);\r
+       }\r
+\r
+       BOOL IsSimple() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, SB_ISSIMPLE, 0, 0L);\r
+       }\r
+\r
+#if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)\r
+       BOOL GetUnicodeFormat() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, SB_GETUNICODEFORMAT, 0, 0L);\r
+       }\r
+\r
+       BOOL SetUnicodeFormat(BOOL bUnicode = TRUE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, SB_SETUNICODEFORMAT, bUnicode, 0L);\r
+       }\r
+\r
+       void GetTipText(int nPane, LPTSTR lpstrText, int nSize) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(nPane < 256);\r
+               ::SendMessage(m_hWnd, SB_GETTIPTEXT, MAKEWPARAM(nPane, nSize), (LPARAM)lpstrText);\r
+       }\r
+\r
+       void SetTipText(int nPane, LPCTSTR lpstrText)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(nPane < 256);\r
+               ::SendMessage(m_hWnd, SB_SETTIPTEXT, nPane, (LPARAM)lpstrText);\r
+       }\r
+#endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)\r
+\r
+#if ((_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)) || (defined(_WIN32_WCE) && (_WIN32_WCE >= 0x0500))\r
+       COLORREF SetBkColor(COLORREF clrBk)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (COLORREF)::SendMessage(m_hWnd, SB_SETBKCOLOR, 0, (LPARAM)clrBk);\r
+       }\r
+\r
+       HICON GetIcon(int nPane) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(nPane < 256);\r
+               return (HICON)::SendMessage(m_hWnd, SB_GETICON, nPane, 0L);\r
+       }\r
+\r
+       BOOL SetIcon(int nPane, HICON hIcon)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(nPane < 256);\r
+               return (BOOL)::SendMessage(m_hWnd, SB_SETICON, nPane, (LPARAM)hIcon);\r
+       }\r
+#endif // ((_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)) || (defined(_WIN32_WCE) && (_WIN32_WCE >= 0x0500))\r
+};\r
+\r
+typedef CStatusBarCtrlT<ATL::CWindow>   CStatusBarCtrl;\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CTabCtrl\r
+\r
+template <class TBase>\r
+class CTabCtrlT : public TBase\r
+{\r
+public:\r
+// Constructors\r
+       CTabCtrlT(HWND hWnd = NULL) : TBase(hWnd)\r
+       { }\r
+\r
+       CTabCtrlT< TBase >& operator =(HWND hWnd)\r
+       {\r
+               m_hWnd = hWnd;\r
+               return *this;\r
+       }\r
+\r
+       HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,\r
+                       DWORD dwStyle = 0, DWORD dwExStyle = 0,\r
+                       ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)\r
+       {\r
+               return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);\r
+       }\r
+\r
+// Attributes\r
+       static LPCTSTR GetWndClassName()\r
+       {\r
+               return WC_TABCONTROL;\r
+       }\r
+\r
+       CImageList GetImageList() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TCM_GETIMAGELIST, 0, 0L));\r
+       }\r
+\r
+       CImageList SetImageList(HIMAGELIST hImageList)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TCM_SETIMAGELIST, 0, (LPARAM)hImageList));\r
+       }\r
+\r
+       int GetItemCount() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, TCM_GETITEMCOUNT, 0, 0L);\r
+       }\r
+\r
+       BOOL GetItem(int nItem, LPTCITEM pTabCtrlItem) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TCM_GETITEM, nItem, (LPARAM)pTabCtrlItem);\r
+       }\r
+\r
+       BOOL SetItem(int nItem, LPTCITEM pTabCtrlItem)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TCM_SETITEM, nItem, (LPARAM)pTabCtrlItem);\r
+       }\r
+\r
+       int SetItem(int nItem, UINT mask, LPCTSTR lpszItem, DWORD dwState, DWORD dwStateMask, int iImage, LPARAM lParam)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               TCITEM tci = { 0 };\r
+               tci.mask = mask;\r
+               tci.pszText = (LPTSTR) lpszItem;\r
+               tci.dwState = dwState;\r
+               tci.dwStateMask = dwStateMask;\r
+               tci.iImage = iImage;\r
+               tci.lParam = lParam;\r
+               return (int)::SendMessage(m_hWnd, TCM_SETITEM, nItem, (LPARAM)&tci);\r
+       }\r
+\r
+       BOOL GetItemRect(int nItem, LPRECT lpRect) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TCM_GETITEMRECT, nItem, (LPARAM)lpRect);\r
+       }\r
+\r
+       int GetCurSel() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, TCM_GETCURSEL, 0, 0L);\r
+       }\r
+\r
+       int SetCurSel(int nItem)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, TCM_SETCURSEL, nItem, 0L);\r
+       }\r
+\r
+       SIZE SetItemSize(SIZE size)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               DWORD dwSize = (DWORD)::SendMessage(m_hWnd, TCM_SETITEMSIZE, 0, MAKELPARAM(size.cx, size.cy));\r
+               SIZE sizeRet = { GET_X_LPARAM(dwSize), GET_Y_LPARAM(dwSize) };\r
+               return sizeRet;\r
+       }\r
+\r
+       void SetItemSize(int cx, int cy)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, TCM_SETITEMSIZE, 0, MAKELPARAM(cx, cy));\r
+       }\r
+\r
+       void SetPadding(SIZE size)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, TCM_SETPADDING, 0, MAKELPARAM(size.cx, size.cy));\r
+       }\r
+\r
+       int GetRowCount() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, TCM_GETROWCOUNT, 0, 0L);\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       CToolTipCtrl GetTooltips() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return CToolTipCtrl((HWND)::SendMessage(m_hWnd, TCM_GETTOOLTIPS, 0, 0L));\r
+       }\r
+\r
+       void SetTooltips(HWND hWndToolTip)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, TCM_SETTOOLTIPS, (WPARAM)hWndToolTip, 0L);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       int GetCurFocus() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, TCM_GETCURFOCUS, 0, 0L);\r
+       }\r
+\r
+       void SetCurFocus(int nItem)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, TCM_SETCURFOCUS, nItem, 0L);\r
+       }\r
+\r
+       BOOL SetItemExtra(int cbExtra)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(GetItemCount() == 0);   // must be empty\r
+               return (BOOL)::SendMessage(m_hWnd, TCM_SETITEMEXTRA, cbExtra, 0L);\r
+       }\r
+\r
+       int SetMinTabWidth(int nWidth = -1)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, TCM_SETMINTABWIDTH, 0, nWidth);\r
+       }\r
+\r
+#if (_WIN32_IE >= 0x0400)\r
+       DWORD GetExtendedStyle() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (DWORD)::SendMessage(m_hWnd, TCM_GETEXTENDEDSTYLE, 0, 0L);\r
+       }\r
+\r
+       DWORD SetExtendedStyle(DWORD dwExMask, DWORD dwExStyle)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (DWORD)::SendMessage(m_hWnd, TCM_SETEXTENDEDSTYLE, dwExMask, dwExStyle);\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       BOOL GetUnicodeFormat() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TCM_GETUNICODEFORMAT, 0, 0L);\r
+       }\r
+\r
+       BOOL SetUnicodeFormat(BOOL bUnicode = TRUE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TCM_SETUNICODEFORMAT, bUnicode, 0L);\r
+       }\r
+#endif // !_WIN32_WCE\r
+#endif // (_WIN32_IE >= 0x0400)\r
+\r
+// Operations\r
+       int InsertItem(int nItem, LPTCITEM pTabCtrlItem)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, TCM_INSERTITEM, nItem, (LPARAM)pTabCtrlItem);\r
+       }\r
+\r
+       int InsertItem(int nItem, UINT mask, LPCTSTR lpszItem, int iImage, LPARAM lParam)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               TCITEM tci = { 0 };\r
+               tci.mask = mask;\r
+               tci.pszText = (LPTSTR) lpszItem;\r
+               tci.iImage = iImage;\r
+               tci.lParam = lParam;\r
+               return (int)::SendMessage(m_hWnd, TCM_INSERTITEM, nItem, (LPARAM)&tci);\r
+       }\r
+\r
+       int InsertItem(int nItem, LPCTSTR lpszItem)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               TCITEM tci = { 0 };\r
+               tci.mask = TCIF_TEXT;\r
+               tci.pszText = (LPTSTR) lpszItem;\r
+               return (int)::SendMessage(m_hWnd, TCM_INSERTITEM, nItem, (LPARAM)&tci);\r
+       }\r
+\r
+       int AddItem(LPTCITEM pTabCtrlItem)\r
+       {\r
+               return InsertItem(GetItemCount(), pTabCtrlItem);\r
+       }\r
+\r
+       int AddItem(UINT mask, LPCTSTR lpszItem, int iImage, LPARAM lParam)\r
+       {\r
+               return InsertItem(GetItemCount(), mask, lpszItem, iImage, lParam);\r
+       }\r
+\r
+       int AddItem(LPCTSTR lpszItem)\r
+       {\r
+               return InsertItem(GetItemCount(), lpszItem);\r
+       }\r
+\r
+       BOOL DeleteItem(int nItem)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TCM_DELETEITEM, nItem, 0L);\r
+       }\r
+\r
+       BOOL DeleteAllItems()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TCM_DELETEALLITEMS, 0, 0L);\r
+       }\r
+\r
+       void AdjustRect(BOOL bLarger, LPRECT lpRect)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, TCM_ADJUSTRECT, bLarger, (LPARAM)lpRect);\r
+       }\r
+\r
+       void RemoveImage(int nImage)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, TCM_REMOVEIMAGE, nImage, 0L);\r
+       }\r
+\r
+       int HitTest(TC_HITTESTINFO* pHitTestInfo) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, TCM_HITTEST, 0, (LPARAM)pHitTestInfo);\r
+       }\r
+\r
+       void DeselectAll(BOOL bExcludeFocus = TRUE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, TCM_DESELECTALL, bExcludeFocus, 0L);\r
+       }\r
+\r
+#if (_WIN32_IE >= 0x0400)\r
+       BOOL HighlightItem(int nIndex, BOOL bHighlight = TRUE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TCM_HIGHLIGHTITEM, nIndex, MAKELPARAM(bHighlight, 0));\r
+       }\r
+#endif // (_WIN32_IE >= 0x0400)\r
+};\r
+\r
+typedef CTabCtrlT<ATL::CWindow>   CTabCtrl;\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CTrackBarCtrl\r
+\r
+template <class TBase>\r
+class CTrackBarCtrlT : public TBase\r
+{\r
+public:\r
+// Constructors\r
+       CTrackBarCtrlT(HWND hWnd = NULL) : TBase(hWnd)\r
+       { }\r
+\r
+       CTrackBarCtrlT< TBase >& operator =(HWND hWnd)\r
+       {\r
+               m_hWnd = hWnd;\r
+               return *this;\r
+       }\r
+\r
+       HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,\r
+                       DWORD dwStyle = 0, DWORD dwExStyle = 0,\r
+                       ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)\r
+       {\r
+               return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);\r
+       }\r
+\r
+// Attributes\r
+       static LPCTSTR GetWndClassName()\r
+       {\r
+               return TRACKBAR_CLASS;\r
+       }\r
+\r
+       int GetLineSize() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, TBM_GETLINESIZE, 0, 0L);\r
+       }\r
+\r
+       int SetLineSize(int nSize)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, TBM_SETLINESIZE, 0, nSize);\r
+       }\r
+\r
+       int GetPageSize() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, TBM_GETPAGESIZE, 0, 0L);\r
+       }\r
+\r
+       int SetPageSize(int nSize)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, TBM_SETPAGESIZE, 0, nSize);\r
+       }\r
+\r
+       int GetRangeMin() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, TBM_GETRANGEMIN, 0, 0L);\r
+       }\r
+\r
+       void SetRangeMin(int nMin, BOOL bRedraw = FALSE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, TBM_SETRANGEMIN, bRedraw, nMin);\r
+       }\r
+\r
+       int GetRangeMax() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, TBM_GETRANGEMAX, 0, 0L);\r
+       }\r
+\r
+       void SetRangeMax(int nMax, BOOL bRedraw = FALSE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, TBM_SETRANGEMAX, bRedraw, nMax);\r
+       }\r
+\r
+       void GetRange(int& nMin, int& nMax) const\r
+       {\r
+               nMin = GetRangeMin();\r
+               nMax = GetRangeMax();\r
+       }\r
+\r
+       void SetRange(int nMin, int nMax, BOOL bRedraw = TRUE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, TBM_SETRANGE, bRedraw, MAKELPARAM(nMin, nMax));\r
+       }\r
+\r
+       int GetSelStart() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, TBM_GETSELSTART, 0, 0L);\r
+       }\r
+\r
+       void SetSelStart(int nMin)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, TBM_SETSELSTART, 0, (LPARAM)nMin);\r
+       }\r
+\r
+       int GetSelEnd() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, TBM_GETSELEND, 0, 0L);\r
+       }\r
+\r
+       void SetSelEnd(int nMax)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, TBM_SETSELEND, 0, (LPARAM)nMax);\r
+       }\r
+\r
+       void GetSelection(int& nMin, int& nMax) const\r
+       {\r
+               nMin = GetSelStart();\r
+               nMax = GetSelEnd();\r
+       }\r
+\r
+       void SetSelection(int nMin, int nMax)\r
+       {\r
+               SetSelStart(nMin);\r
+               SetSelEnd(nMax);\r
+       }\r
+\r
+       void GetChannelRect(LPRECT lprc) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, TBM_GETCHANNELRECT, 0, (LPARAM)lprc);\r
+       }\r
+\r
+       void GetThumbRect(LPRECT lprc) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, TBM_GETTHUMBRECT, 0, (LPARAM)lprc);\r
+       }\r
+\r
+       int GetPos() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, TBM_GETPOS, 0, 0L);\r
+       }\r
+\r
+       void SetPos(int nPos)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, TBM_SETPOS, TRUE, nPos);\r
+       }\r
+\r
+       UINT GetNumTics() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (UINT)::SendMessage(m_hWnd, TBM_GETNUMTICS, 0, 0L);\r
+       }\r
+\r
+       DWORD* GetTicArray() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (DWORD*)::SendMessage(m_hWnd, TBM_GETPTICS, 0, 0L);\r
+       }\r
+\r
+       int GetTic(int nTic) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, TBM_GETTIC, nTic, 0L);\r
+       }\r
+\r
+       BOOL SetTic(int nTic)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TBM_SETTIC, 0, nTic);\r
+       }\r
+\r
+       int GetTicPos(int nTic) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, TBM_GETTICPOS, nTic, 0L);\r
+       }\r
+\r
+       void SetTicFreq(int nFreq)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, TBM_SETTICFREQ, nFreq, 0L);\r
+       }\r
+\r
+       int GetThumbLength() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, TBM_GETTHUMBLENGTH, 0, 0L);\r
+       }\r
+\r
+       void SetThumbLength(int nLength)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, TBM_SETTHUMBLENGTH, nLength, 0L);\r
+       }\r
+\r
+       void SetSel(int nStart, int nEnd, BOOL bRedraw = TRUE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT((GetStyle() & TBS_ENABLESELRANGE) != 0);\r
+               ::SendMessage(m_hWnd, TBM_SETSEL, bRedraw, MAKELPARAM(nStart, nEnd));\r
+       }\r
+\r
+       ATL::CWindow GetBuddy(BOOL bLeft = TRUE) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return ATL::CWindow((HWND)::SendMessage(m_hWnd, TBM_GETBUDDY, bLeft, 0L));\r
+       }\r
+\r
+       ATL::CWindow SetBuddy(HWND hWndBuddy, BOOL bLeft = TRUE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return ATL::CWindow((HWND)::SendMessage(m_hWnd, TBM_SETBUDDY, bLeft, (LPARAM)hWndBuddy));\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       CToolTipCtrl GetToolTips() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return CToolTipCtrl((HWND)::SendMessage(m_hWnd, TBM_GETTOOLTIPS, 0, 0L));\r
+       }\r
+\r
+       void SetToolTips(HWND hWndTT)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, TBM_SETTOOLTIPS, (WPARAM)hWndTT, 0L);\r
+       }\r
+\r
+       int SetTipSide(int nSide)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, TBM_SETTIPSIDE, nSide, 0L);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+#if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)\r
+       BOOL GetUnicodeFormat() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TBM_GETUNICODEFORMAT, 0, 0L);\r
+       }\r
+\r
+       BOOL SetUnicodeFormat(BOOL bUnicode = TRUE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, TBM_SETUNICODEFORMAT, bUnicode, 0L);\r
+       }\r
+#endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)\r
+\r
+// Operations\r
+       void ClearSel(BOOL bRedraw = FALSE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, TBM_CLEARSEL, bRedraw, 0L);\r
+       }\r
+\r
+       void VerifyPos()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, TBM_SETPOS, FALSE, 0L);\r
+       }\r
+\r
+       void ClearTics(BOOL bRedraw = FALSE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, TBM_CLEARTICS, bRedraw, 0L);\r
+       }\r
+};\r
+\r
+typedef CTrackBarCtrlT<ATL::CWindow>   CTrackBarCtrl;\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CUpDownCtrl\r
+\r
+template <class TBase>\r
+class CUpDownCtrlT : public TBase\r
+{\r
+public:\r
+// Constructors\r
+       CUpDownCtrlT(HWND hWnd = NULL) : TBase(hWnd)\r
+       { }\r
+\r
+       CUpDownCtrlT< TBase >& operator =(HWND hWnd)\r
+       {\r
+               m_hWnd = hWnd;\r
+               return *this;\r
+       }\r
+\r
+       HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,\r
+                       DWORD dwStyle = 0, DWORD dwExStyle = 0,\r
+                       ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)\r
+       {\r
+               return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);\r
+       }\r
+\r
+// Attributes\r
+       static LPCTSTR GetWndClassName()\r
+       {\r
+               return UPDOWN_CLASS;\r
+       }\r
+\r
+       UINT GetAccel(int nAccel, UDACCEL* pAccel) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (UINT)LOWORD(::SendMessage(m_hWnd, UDM_GETACCEL, nAccel, (LPARAM)pAccel));\r
+       }\r
+\r
+       BOOL SetAccel(int nAccel, UDACCEL* pAccel)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)LOWORD(::SendMessage(m_hWnd, UDM_SETACCEL, nAccel, (LPARAM)pAccel));\r
+       }\r
+\r
+       UINT GetBase() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (UINT)LOWORD(::SendMessage(m_hWnd, UDM_GETBASE, 0, 0L));\r
+       }\r
+\r
+       int SetBase(int nBase)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, UDM_SETBASE, nBase, 0L);\r
+       }\r
+\r
+       ATL::CWindow GetBuddy() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return ATL::CWindow((HWND)::SendMessage(m_hWnd, UDM_GETBUDDY, 0, 0L));\r
+       }\r
+\r
+       ATL::CWindow SetBuddy(HWND hWndBuddy)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return ATL::CWindow((HWND)::SendMessage(m_hWnd, UDM_SETBUDDY, (WPARAM)hWndBuddy, 0L));\r
+       }\r
+\r
+       int GetPos(LPBOOL lpbError = NULL) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               DWORD dwRet = (DWORD)::SendMessage(m_hWnd, UDM_GETPOS, 0, 0L);\r
+               // Note: Seems that Windows always sets error to TRUE if\r
+               // UDS_SETBUDDYINT style is not used\r
+               if(lpbError != NULL)\r
+                       *lpbError = (HIWORD(dwRet) != 0) ? TRUE : FALSE;\r
+               return (int)(short)LOWORD(dwRet);\r
+       }\r
+\r
+       int SetPos(int nPos)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)(short)LOWORD(::SendMessage(m_hWnd, UDM_SETPOS, 0, MAKELPARAM(nPos, 0)));\r
+       }\r
+\r
+       DWORD GetRange() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (DWORD)::SendMessage(m_hWnd, UDM_GETRANGE, 0, 0L);\r
+       }\r
+\r
+       void GetRange(int& nLower, int& nUpper) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               DWORD dwRet = (DWORD)::SendMessage(m_hWnd, UDM_GETRANGE, 0, 0L);\r
+               nLower = (int)(short)HIWORD(dwRet);\r
+               nUpper = (int)(short)LOWORD(dwRet);\r
+       }\r
+\r
+       void SetRange(int nLower, int nUpper)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, UDM_SETRANGE, 0, MAKELPARAM(nUpper, nLower));\r
+       }\r
+\r
+#if (_WIN32_IE >= 0x0400)\r
+       void SetRange32(int nLower, int nUpper)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, UDM_SETRANGE32, nLower, nUpper);\r
+       }\r
+\r
+       void GetRange32(int& nLower, int& nUpper) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, UDM_GETRANGE32, (WPARAM)&nLower, (LPARAM)&nUpper);\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       BOOL GetUnicodeFormat() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, UDM_GETUNICODEFORMAT, 0, 0L);\r
+       }\r
+\r
+       BOOL SetUnicodeFormat(BOOL bUnicode = TRUE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, UDM_SETUNICODEFORMAT, bUnicode, 0L);\r
+       }\r
+#endif // !_WIN32_WCE\r
+#endif // (_WIN32_IE >= 0x0400)\r
+\r
+#if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)\r
+       int GetPos32(LPBOOL lpbError = NULL) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               // Note: Seems that Windows always sets error to TRUE if\r
+               // UDS_SETBUDDYINT style is not used\r
+               return (int)::SendMessage(m_hWnd, UDM_GETPOS32, 0, (LPARAM)lpbError);\r
+       }\r
+\r
+       int SetPos32(int nPos)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, UDM_SETPOS32, 0, (LPARAM)nPos);\r
+       }\r
+#endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)\r
+};\r
+\r
+typedef CUpDownCtrlT<ATL::CWindow>   CUpDownCtrl;\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CProgressBarCtrl\r
+\r
+template <class TBase>\r
+class CProgressBarCtrlT : public TBase\r
+{\r
+public:\r
+// Constructors\r
+       CProgressBarCtrlT(HWND hWnd = NULL) : TBase(hWnd)\r
+       { }\r
+\r
+       CProgressBarCtrlT< TBase >& operator =(HWND hWnd)\r
+       {\r
+               m_hWnd = hWnd;\r
+               return *this;\r
+       }\r
+\r
+       HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,\r
+                       DWORD dwStyle = 0, DWORD dwExStyle = 0,\r
+                       ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)\r
+       {\r
+               return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);\r
+       }\r
+\r
+// Attributes\r
+       static LPCTSTR GetWndClassName()\r
+       {\r
+               return PROGRESS_CLASS;\r
+       }\r
+\r
+       DWORD SetRange(int nLower, int nUpper)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (DWORD)::SendMessage(m_hWnd, PBM_SETRANGE, 0, MAKELPARAM(nLower, nUpper));\r
+       }\r
+\r
+       int SetPos(int nPos)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)(short)LOWORD(::SendMessage(m_hWnd, PBM_SETPOS, nPos, 0L));\r
+       }\r
+\r
+       int OffsetPos(int nPos)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)(short)LOWORD(::SendMessage(m_hWnd, PBM_DELTAPOS, nPos, 0L));\r
+       }\r
+\r
+       int SetStep(int nStep)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)(short)LOWORD(::SendMessage(m_hWnd, PBM_SETSTEP, nStep, 0L));\r
+       }\r
+\r
+       UINT GetPos() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (UINT)::SendMessage(m_hWnd, PBM_GETPOS, 0, 0L);\r
+       }\r
+\r
+       void GetRange(PPBRANGE pPBRange) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(pPBRange != NULL);\r
+               ::SendMessage(m_hWnd, PBM_GETRANGE, TRUE, (LPARAM)pPBRange);\r
+       }\r
+\r
+       void GetRange(int& nLower, int& nUpper) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               PBRANGE range = { 0 };\r
+               ::SendMessage(m_hWnd, PBM_GETRANGE, TRUE, (LPARAM)&range);\r
+               nLower = range.iLow;\r
+               nUpper = range.iHigh;\r
+       }\r
+\r
+       int GetRangeLimit(BOOL bLowLimit) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, PBM_GETRANGE, bLowLimit, (LPARAM)NULL);\r
+       }\r
+\r
+       DWORD SetRange32(int nMin, int nMax)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (DWORD)::SendMessage(m_hWnd, PBM_SETRANGE32, nMin, nMax);\r
+       }\r
+\r
+#if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)\r
+       COLORREF SetBarColor(COLORREF clr)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (COLORREF)::SendMessage(m_hWnd, PBM_SETBARCOLOR, 0, (LPARAM)clr);\r
+       }\r
+\r
+       COLORREF SetBkColor(COLORREF clr)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (COLORREF)::SendMessage(m_hWnd, PBM_SETBKCOLOR, 0, (LPARAM)clr);\r
+       }\r
+#endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)\r
+\r
+#if (_WIN32_WINNT >= 0x0501) && defined(PBM_SETMARQUEE)\r
+       BOOL SetMarquee(BOOL bMarquee, UINT uUpdateTime = 0U)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, PBM_SETMARQUEE, (WPARAM)bMarquee, (LPARAM)uUpdateTime);\r
+       }\r
+#endif // (_WIN32_WINNT >= 0x0501) && defined(PBM_SETMARQUEE)\r
+\r
+#if (_WIN32_WINNT >= 0x0600)\r
+       int GetStep() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, PBM_GETSTEP, 0, 0L);\r
+       }\r
+\r
+       COLORREF GetBkColor() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (COLORREF)::SendMessage(m_hWnd, PBM_GETBKCOLOR, 0, 0L);\r
+       }\r
+\r
+       COLORREF GetBarColor() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (COLORREF)::SendMessage(m_hWnd, PBM_GETBARCOLOR, 0, 0L);\r
+       }\r
+\r
+       int GetState() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, PBM_GETSTATE, 0, 0L);\r
+       }\r
+\r
+       int SetState(int nState)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, PBM_SETSTATE, nState, 0L);\r
+       }\r
+#endif // (_WIN32_WINNT >= 0x0600)\r
+\r
+// Operations\r
+       int StepIt()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)(short)LOWORD(::SendMessage(m_hWnd, PBM_STEPIT, 0, 0L));\r
+       }\r
+};\r
+\r
+typedef CProgressBarCtrlT<ATL::CWindow>   CProgressBarCtrl;\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CHotKeyCtrl\r
+\r
+#ifndef _WIN32_WCE\r
+\r
+template <class TBase>\r
+class CHotKeyCtrlT : public TBase\r
+{\r
+public:\r
+// Constructors\r
+       CHotKeyCtrlT(HWND hWnd = NULL) : TBase(hWnd)\r
+       { }\r
+\r
+       CHotKeyCtrlT< TBase >& operator =(HWND hWnd)\r
+       {\r
+               m_hWnd = hWnd;\r
+               return *this;\r
+       }\r
+\r
+       HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,\r
+                       DWORD dwStyle = 0, DWORD dwExStyle = 0,\r
+                       ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)\r
+       {\r
+               return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);\r
+       }\r
+\r
+// Attributes\r
+       static LPCTSTR GetWndClassName()\r
+       {\r
+               return HOTKEY_CLASS;\r
+       }\r
+\r
+       DWORD GetHotKey() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (DWORD)::SendMessage(m_hWnd, HKM_GETHOTKEY, 0, 0L);\r
+       }\r
+\r
+       void GetHotKey(WORD &wVirtualKeyCode, WORD &wModifiers) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               DWORD dw = (DWORD)::SendMessage(m_hWnd, HKM_GETHOTKEY, 0, 0L);\r
+               wVirtualKeyCode = LOBYTE(LOWORD(dw));\r
+               wModifiers = HIBYTE(LOWORD(dw));\r
+       }\r
+\r
+       void SetHotKey(WORD wVirtualKeyCode, WORD wModifiers)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, HKM_SETHOTKEY, MAKEWORD(wVirtualKeyCode, wModifiers), 0L);\r
+       }\r
+\r
+       void SetRules(WORD wInvalidComb, WORD wModifiers)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, HKM_SETRULES, wInvalidComb, MAKELPARAM(wModifiers, 0));\r
+       }\r
+};\r
+\r
+typedef CHotKeyCtrlT<ATL::CWindow>   CHotKeyCtrl;\r
+\r
+#endif // !_WIN32_WCE\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CAnimateCtrl\r
+\r
+#ifndef _WIN32_WCE\r
+\r
+template <class TBase>\r
+class CAnimateCtrlT : public TBase\r
+{\r
+public:\r
+// Constructors\r
+       CAnimateCtrlT(HWND hWnd = NULL) : TBase(hWnd)\r
+       { }\r
+\r
+       CAnimateCtrlT< TBase >& operator =(HWND hWnd)\r
+       {\r
+               m_hWnd = hWnd;\r
+               return *this;\r
+       }\r
+\r
+       HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,\r
+                       DWORD dwStyle = 0, DWORD dwExStyle = 0,\r
+                       ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)\r
+       {\r
+               return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);\r
+       }\r
+\r
+// Attributes\r
+       static LPCTSTR GetWndClassName()\r
+       {\r
+               return ANIMATE_CLASS;\r
+       }\r
+\r
+// Operations\r
+       BOOL Open(ATL::_U_STRINGorID FileName)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, ACM_OPEN, 0, (LPARAM)FileName.m_lpstr);\r
+       }\r
+\r
+       BOOL Play(UINT nFrom, UINT nTo, UINT nRep)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, ACM_PLAY, nRep, MAKELPARAM(nFrom, nTo));\r
+       }\r
+\r
+       BOOL Stop()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, ACM_STOP, 0, 0L);\r
+       }\r
+\r
+       BOOL Close()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, ACM_OPEN, 0, 0L);\r
+       }\r
+\r
+       BOOL Seek(UINT nTo)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, ACM_PLAY, 0, MAKELPARAM(nTo, nTo));\r
+       }\r
+\r
+       // Vista only\r
+       BOOL IsPlaying() const\r
+       {\r
+#ifndef ACM_ISPLAYING\r
+               const UINT ACM_ISPLAYING = (WM_USER+104);\r
+#endif\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, ACM_ISPLAYING, 0, 0L);\r
+       }\r
+};\r
+\r
+typedef CAnimateCtrlT<ATL::CWindow>   CAnimateCtrl;\r
+\r
+#endif // !_WIN32_WCE\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CRichEditCtrl\r
+\r
+#ifndef _WIN32_WCE\r
+\r
+#ifdef _UNICODE\r
+#if (_RICHEDIT_VER == 0x0100)\r
+#undef RICHEDIT_CLASS\r
+#define RICHEDIT_CLASS L"RICHEDIT"\r
+#endif // (_RICHEDIT_VER == 0x0100)\r
+#endif // _UNICODE\r
+\r
+template <class TBase>\r
+class CRichEditCtrlT : public TBase\r
+{\r
+public:\r
+// Constructors\r
+       CRichEditCtrlT(HWND hWnd = NULL) : TBase(hWnd)\r
+       { }\r
+\r
+       CRichEditCtrlT< TBase >& operator =(HWND hWnd)\r
+       {\r
+               m_hWnd = hWnd;\r
+               return *this;\r
+       }\r
+\r
+       HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,\r
+                       DWORD dwStyle = 0, DWORD dwExStyle = 0,\r
+                       ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)\r
+       {\r
+               return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);\r
+       }\r
+\r
+// Attributes\r
+       static LPCTSTR GetWndClassName()\r
+       {\r
+               return RICHEDIT_CLASS;\r
+       }\r
+\r
+       static LPCTSTR GetLibraryName()\r
+       {\r
+#if (_RICHEDIT_VER >= 0x0200)\r
+               return _T("RICHED20.DLL");\r
+#else\r
+               return _T("RICHED32.DLL");\r
+#endif\r
+       }\r
+\r
+       int GetLineCount() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, EM_GETLINECOUNT, 0, 0L);\r
+       }\r
+\r
+       BOOL GetModify() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, EM_GETMODIFY, 0, 0L);\r
+       }\r
+\r
+       void SetModify(BOOL bModified = TRUE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, EM_SETMODIFY, bModified, 0L);\r
+       }\r
+\r
+       void GetRect(LPRECT lpRect) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, EM_GETRECT, 0, (LPARAM)lpRect);\r
+       }\r
+\r
+       DWORD GetOptions() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (DWORD)::SendMessage(m_hWnd, EM_GETOPTIONS, 0, 0L);\r
+       }\r
+\r
+       DWORD SetOptions(WORD wOperation, DWORD dwOptions)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (DWORD)::SendMessage(m_hWnd, EM_SETOPTIONS, wOperation, dwOptions);\r
+       }\r
+\r
+       // NOTE: first word in lpszBuffer must contain the size of the buffer!\r
+       int GetLine(int nIndex, LPTSTR lpszBuffer) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, EM_GETLINE, nIndex, (LPARAM)lpszBuffer);\r
+       }\r
+\r
+       int GetLine(int nIndex, LPTSTR lpszBuffer, int nMaxLength) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               *(LPWORD)lpszBuffer = (WORD)nMaxLength;\r
+               return (int)::SendMessage(m_hWnd, EM_GETLINE, nIndex, (LPARAM)lpszBuffer);\r
+       }\r
+\r
+       BOOL CanUndo() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, EM_CANUNDO, 0, 0L);\r
+       }\r
+\r
+       BOOL CanPaste(UINT nFormat = 0) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, EM_CANPASTE, nFormat, 0L);\r
+       }\r
+\r
+       void GetSel(LONG& nStartChar, LONG& nEndChar) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               CHARRANGE cr = { 0, 0 };\r
+               ::SendMessage(m_hWnd, EM_EXGETSEL, 0, (LPARAM)&cr);\r
+               nStartChar = cr.cpMin;\r
+               nEndChar = cr.cpMax;\r
+       }\r
+\r
+       void GetSel(CHARRANGE &cr) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, EM_EXGETSEL, 0, (LPARAM)&cr);\r
+       }\r
+\r
+       int SetSel(LONG nStartChar, LONG nEndChar)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               CHARRANGE cr = { nStartChar, nEndChar };\r
+               return (int)::SendMessage(m_hWnd, EM_EXSETSEL, 0, (LPARAM)&cr);\r
+       }\r
+\r
+       int SetSel(CHARRANGE &cr)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, EM_EXSETSEL, 0, (LPARAM)&cr);\r
+       }\r
+\r
+       int SetSelAll()\r
+       {\r
+               return SetSel(0, -1);\r
+       }\r
+\r
+       int SetSelNone()\r
+       {\r
+               return SetSel(-1, 0);\r
+       }\r
+\r
+       DWORD GetDefaultCharFormat(CHARFORMAT& cf) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               cf.cbSize = sizeof(CHARFORMAT);\r
+               return (DWORD)::SendMessage(m_hWnd, EM_GETCHARFORMAT, 0, (LPARAM)&cf);\r
+       }\r
+\r
+       DWORD GetSelectionCharFormat(CHARFORMAT& cf) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               cf.cbSize = sizeof(CHARFORMAT);\r
+               return (DWORD)::SendMessage(m_hWnd, EM_GETCHARFORMAT, 1, (LPARAM)&cf);\r
+       }\r
+\r
+       DWORD GetEventMask() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (DWORD)::SendMessage(m_hWnd, EM_GETEVENTMASK, 0, 0L);\r
+       }\r
+\r
+       LONG GetLimitText() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (LONG)::SendMessage(m_hWnd, EM_GETLIMITTEXT, 0, 0L);\r
+       }\r
+\r
+       DWORD GetParaFormat(PARAFORMAT& pf) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               pf.cbSize = sizeof(PARAFORMAT);\r
+               return (DWORD)::SendMessage(m_hWnd, EM_GETPARAFORMAT, 0, (LPARAM)&pf);\r
+       }\r
+\r
+#if (_RICHEDIT_VER >= 0x0200)\r
+       LONG GetSelText(LPTSTR lpstrBuff) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (LONG)::SendMessage(m_hWnd, EM_GETSELTEXT, 0, (LPARAM)lpstrBuff);\r
+       }\r
+#else // !(_RICHEDIT_VER >= 0x0200)\r
+       // RichEdit 1.0 EM_GETSELTEXT is ANSI only\r
+       LONG GetSelText(LPSTR lpstrBuff) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (LONG)::SendMessage(m_hWnd, EM_GETSELTEXT, 0, (LPARAM)lpstrBuff);\r
+       }\r
+#endif // !(_RICHEDIT_VER >= 0x0200)\r
+\r
+#ifndef _ATL_NO_COM\r
+       BOOL GetSelTextBSTR(BSTR& bstrText) const\r
+       {\r
+               USES_CONVERSION;\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(bstrText == NULL);\r
+\r
+               CHARRANGE cr = { 0, 0 };\r
+               ::SendMessage(m_hWnd, EM_EXGETSEL, 0, (LPARAM)&cr);\r
+\r
+#if (_RICHEDIT_VER >= 0x0200)\r
+               CTempBuffer<TCHAR, _WTL_STACK_ALLOC_THRESHOLD> buff;\r
+               LPTSTR lpstrText = buff.Allocate(cr.cpMax - cr.cpMin + 1);\r
+               if(lpstrText == NULL)\r
+                       return FALSE;\r
+               if(::SendMessage(m_hWnd, EM_GETSELTEXT, 0, (LPARAM)lpstrText) == 0)\r
+                       return FALSE;\r
+\r
+               bstrText = ::SysAllocString(T2W(lpstrText));\r
+#else // !(_RICHEDIT_VER >= 0x0200)\r
+               CTempBuffer<char, _WTL_STACK_ALLOC_THRESHOLD> buff;\r
+               LPSTR lpstrText = buff.Allocate(cr.cpMax - cr.cpMin + 1);\r
+               if(lpstrText == NULL)\r
+                       return FALSE;\r
+               if(::SendMessage(m_hWnd, EM_GETSELTEXT, 0, (LPARAM)lpstrText) == 0)\r
+                       return FALSE;\r
+\r
+               bstrText = ::SysAllocString(A2W(lpstrText));\r
+#endif // !(_RICHEDIT_VER >= 0x0200)\r
+\r
+               return (bstrText != NULL) ? TRUE : FALSE;\r
+       }\r
+#endif // !_ATL_NO_COM\r
+\r
+#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)\r
+       LONG GetSelText(_CSTRING_NS::CString& strText) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+\r
+               CHARRANGE cr = { 0, 0 };\r
+               ::SendMessage(m_hWnd, EM_EXGETSEL, 0, (LPARAM)&cr);\r
+\r
+#if (_RICHEDIT_VER >= 0x0200)\r
+               LONG lLen = 0;\r
+               LPTSTR lpstrText = strText.GetBufferSetLength(cr.cpMax - cr.cpMin);\r
+               if(lpstrText != NULL)\r
+               {\r
+                       lLen = (LONG)::SendMessage(m_hWnd, EM_GETSELTEXT, 0, (LPARAM)lpstrText);\r
+                       strText.ReleaseBuffer();\r
+               }\r
+#else // !(_RICHEDIT_VER >= 0x0200)\r
+               CTempBuffer<char, _WTL_STACK_ALLOC_THRESHOLD> buff;\r
+               LPSTR lpstrText = buff.Allocate(cr.cpMax - cr.cpMin + 1);\r
+               if(lpstrText == NULL)\r
+                       return 0;\r
+               LONG lLen = (LONG)::SendMessage(m_hWnd, EM_GETSELTEXT, 0, (LPARAM)lpstrText);\r
+               if(lLen == 0)\r
+                       return 0;\r
+\r
+               USES_CONVERSION;\r
+               strText = A2T(lpstrText);\r
+#endif // !(_RICHEDIT_VER >= 0x0200)\r
+\r
+               return lLen;\r
+       }\r
+#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)\r
+\r
+       WORD GetSelectionType() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (WORD)::SendMessage(m_hWnd, EM_SELECTIONTYPE, 0, 0L);\r
+       }\r
+\r
+       COLORREF SetBackgroundColor(COLORREF cr)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (COLORREF)::SendMessage(m_hWnd, EM_SETBKGNDCOLOR, 0, cr);\r
+       }\r
+\r
+       COLORREF SetBackgroundColor()   // sets to system background\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (COLORREF)::SendMessage(m_hWnd, EM_SETBKGNDCOLOR, 1, 0);\r
+       }\r
+\r
+       BOOL SetCharFormat(CHARFORMAT& cf, WORD wFlags)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               cf.cbSize = sizeof(CHARFORMAT);\r
+               return (BOOL)::SendMessage(m_hWnd, EM_SETCHARFORMAT, (WPARAM)wFlags, (LPARAM)&cf);\r
+       }\r
+\r
+       BOOL SetDefaultCharFormat(CHARFORMAT& cf)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               cf.cbSize = sizeof(CHARFORMAT);\r
+               return (BOOL)::SendMessage(m_hWnd, EM_SETCHARFORMAT, 0, (LPARAM)&cf);\r
+       }\r
+\r
+       BOOL SetSelectionCharFormat(CHARFORMAT& cf)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               cf.cbSize = sizeof(CHARFORMAT);\r
+               return (BOOL)::SendMessage(m_hWnd, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf);\r
+       }\r
+\r
+       BOOL SetWordCharFormat(CHARFORMAT& cf)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               cf.cbSize = sizeof(CHARFORMAT);\r
+               return (BOOL)::SendMessage(m_hWnd, EM_SETCHARFORMAT, SCF_SELECTION | SCF_WORD, (LPARAM)&cf);\r
+       }\r
+\r
+       DWORD SetEventMask(DWORD dwEventMask)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (DWORD)::SendMessage(m_hWnd, EM_SETEVENTMASK, 0, dwEventMask);\r
+       }\r
+\r
+       BOOL SetParaFormat(PARAFORMAT& pf)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               pf.cbSize = sizeof(PARAFORMAT);\r
+               return (BOOL)::SendMessage(m_hWnd, EM_SETPARAFORMAT, 0, (LPARAM)&pf);\r
+       }\r
+\r
+       BOOL SetTargetDevice(HDC hDC, int cxLineWidth)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, EM_SETTARGETDEVICE, (WPARAM)hDC, cxLineWidth);\r
+       }\r
+\r
+       int GetTextLength() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, WM_GETTEXTLENGTH, 0, 0L);\r
+       }\r
+\r
+       BOOL SetReadOnly(BOOL bReadOnly = TRUE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, EM_SETREADONLY, bReadOnly, 0L);\r
+       }\r
+\r
+       int GetFirstVisibleLine() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, EM_GETFIRSTVISIBLELINE, 0, 0L);\r
+       }\r
+\r
+       EDITWORDBREAKPROCEX GetWordBreakProcEx() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (EDITWORDBREAKPROCEX)::SendMessage(m_hWnd, EM_GETWORDBREAKPROCEX, 0, 0L);\r
+       }\r
+\r
+       EDITWORDBREAKPROCEX SetWordBreakProcEx(EDITWORDBREAKPROCEX pfnEditWordBreakProcEx)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (EDITWORDBREAKPROCEX)::SendMessage(m_hWnd, EM_SETWORDBREAKPROCEX, 0, (LPARAM)pfnEditWordBreakProcEx);\r
+       }\r
+\r
+       int GetTextRange(TEXTRANGE* pTextRange) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, EM_GETTEXTRANGE, 0, (LPARAM)pTextRange);\r
+       }\r
+\r
+#if (_RICHEDIT_VER >= 0x0200)\r
+       int GetTextRange(LONG nStartChar, LONG nEndChar, LPTSTR lpstrText) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               TEXTRANGE tr = { 0 };\r
+               tr.chrg.cpMin = nStartChar;\r
+               tr.chrg.cpMax = nEndChar;\r
+               tr.lpstrText = lpstrText;\r
+               return (int)::SendMessage(m_hWnd, EM_GETTEXTRANGE, 0, (LPARAM)&tr);\r
+       }\r
+#else // !(_RICHEDIT_VER >= 0x0200)\r
+\r
+       int GetTextRange(LONG nStartChar, LONG nEndChar, LPSTR lpstrText) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               TEXTRANGE tr = { 0 };\r
+               tr.chrg.cpMin = nStartChar;\r
+               tr.chrg.cpMax = nEndChar;\r
+               tr.lpstrText = lpstrText;\r
+               return (int)::SendMessage(m_hWnd, EM_GETTEXTRANGE, 0, (LPARAM)&tr);\r
+       }\r
+#endif // !(_RICHEDIT_VER >= 0x0200)\r
+\r
+#if (_RICHEDIT_VER >= 0x0200)\r
+       DWORD GetDefaultCharFormat(CHARFORMAT2& cf) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               cf.cbSize = sizeof(CHARFORMAT2);\r
+               return (DWORD)::SendMessage(m_hWnd, EM_GETCHARFORMAT, 0, (LPARAM)&cf);\r
+       }\r
+\r
+       BOOL SetCharFormat(CHARFORMAT2& cf, WORD wFlags)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               cf.cbSize = sizeof(CHARFORMAT2);\r
+               return (BOOL)::SendMessage(m_hWnd, EM_SETCHARFORMAT, (WPARAM)wFlags, (LPARAM)&cf);\r
+       }\r
+\r
+       BOOL SetDefaultCharFormat(CHARFORMAT2& cf)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               cf.cbSize = sizeof(CHARFORMAT2);\r
+               return (BOOL)::SendMessage(m_hWnd, EM_SETCHARFORMAT, 0, (LPARAM)&cf);\r
+       }\r
+\r
+       DWORD GetSelectionCharFormat(CHARFORMAT2& cf) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               cf.cbSize = sizeof(CHARFORMAT2);\r
+               return (DWORD)::SendMessage(m_hWnd, EM_GETCHARFORMAT, 1, (LPARAM)&cf);\r
+       }\r
+\r
+       BOOL SetSelectionCharFormat(CHARFORMAT2& cf)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               cf.cbSize = sizeof(CHARFORMAT2);\r
+               return (BOOL)::SendMessage(m_hWnd, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf);\r
+       }\r
+\r
+       BOOL SetWordCharFormat(CHARFORMAT2& cf)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               cf.cbSize = sizeof(CHARFORMAT2);\r
+               return (BOOL)::SendMessage(m_hWnd, EM_SETCHARFORMAT, SCF_SELECTION | SCF_WORD, (LPARAM)&cf);\r
+       }\r
+\r
+       DWORD GetParaFormat(PARAFORMAT2& pf) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               pf.cbSize = sizeof(PARAFORMAT2);\r
+               return (DWORD)::SendMessage(m_hWnd, EM_GETPARAFORMAT, 0, (LPARAM)&pf);\r
+       }\r
+\r
+       BOOL SetParaFormat(PARAFORMAT2& pf)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               pf.cbSize = sizeof(PARAFORMAT2);\r
+               return (BOOL)::SendMessage(m_hWnd, EM_SETPARAFORMAT, 0, (LPARAM)&pf);\r
+       }\r
+\r
+       TEXTMODE GetTextMode() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (TEXTMODE)::SendMessage(m_hWnd, EM_GETTEXTMODE, 0, 0L);\r
+       }\r
+\r
+       BOOL SetTextMode(TEXTMODE enumTextMode)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return !(BOOL)::SendMessage(m_hWnd, EM_SETTEXTMODE, enumTextMode, 0L);\r
+       }\r
+\r
+       UNDONAMEID GetUndoName() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (UNDONAMEID)::SendMessage(m_hWnd, EM_GETUNDONAME, 0, 0L);\r
+       }\r
+\r
+       UNDONAMEID GetRedoName() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (UNDONAMEID)::SendMessage(m_hWnd, EM_GETREDONAME, 0, 0L);\r
+       }\r
+\r
+       BOOL CanRedo() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, EM_CANREDO, 0, 0L);\r
+       }\r
+\r
+       BOOL GetAutoURLDetect() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, EM_GETAUTOURLDETECT, 0, 0L);\r
+       }\r
+\r
+       BOOL SetAutoURLDetect(BOOL bAutoDetect = TRUE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return !(BOOL)::SendMessage(m_hWnd, EM_AUTOURLDETECT, bAutoDetect, 0L);\r
+       }\r
+\r
+       // this method is deprecated, please use SetAutoURLDetect\r
+       BOOL EnableAutoURLDetect(BOOL bEnable = TRUE) { return SetAutoURLDetect(bEnable); }\r
+\r
+       UINT SetUndoLimit(UINT uUndoLimit)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (UINT)::SendMessage(m_hWnd, EM_SETUNDOLIMIT, uUndoLimit, 0L);\r
+       }\r
+\r
+       void SetPalette(HPALETTE hPalette)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, EM_SETPALETTE, (WPARAM)hPalette, 0L);\r
+       }\r
+\r
+       int GetTextEx(GETTEXTEX* pGetTextEx, LPTSTR lpstrText) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, EM_GETTEXTEX, (WPARAM)pGetTextEx, (LPARAM)lpstrText);\r
+       }\r
+\r
+       int GetTextEx(LPTSTR lpstrText, int nTextLen, DWORD dwFlags = GT_DEFAULT, UINT uCodePage = CP_ACP, LPCSTR lpDefaultChar = NULL, LPBOOL lpUsedDefChar = NULL) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               GETTEXTEX gte = { 0 };\r
+               gte.cb = nTextLen * sizeof(TCHAR);\r
+               gte.codepage = uCodePage;\r
+               gte.flags = dwFlags;\r
+               gte.lpDefaultChar = lpDefaultChar;\r
+               gte.lpUsedDefChar = lpUsedDefChar;\r
+               return (int)::SendMessage(m_hWnd, EM_GETTEXTEX, (WPARAM)&gte, (LPARAM)lpstrText);\r
+       }\r
+\r
+       int GetTextLengthEx(GETTEXTLENGTHEX* pGetTextLengthEx) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, EM_GETTEXTLENGTHEX, (WPARAM)pGetTextLengthEx, 0L);\r
+       }\r
+\r
+       int GetTextLengthEx(DWORD dwFlags = GTL_DEFAULT, UINT uCodePage = CP_ACP) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               GETTEXTLENGTHEX gtle = { 0 };\r
+               gtle.codepage = uCodePage;\r
+               gtle.flags = dwFlags;\r
+               return (int)::SendMessage(m_hWnd, EM_GETTEXTLENGTHEX, (WPARAM)&gtle, 0L);\r
+       }\r
+#endif // (_RICHEDIT_VER >= 0x0200)\r
+\r
+#if (_RICHEDIT_VER >= 0x0300)\r
+       int SetTextEx(SETTEXTEX* pSetTextEx, LPCTSTR lpstrText)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, EM_SETTEXTEX, (WPARAM)pSetTextEx, (LPARAM)lpstrText);\r
+       }\r
+\r
+       int SetTextEx(LPCTSTR lpstrText, DWORD dwFlags = ST_DEFAULT, UINT uCodePage = CP_ACP)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               SETTEXTEX ste = { 0 };\r
+               ste.flags = dwFlags;\r
+               ste.codepage = uCodePage;\r
+               return (int)::SendMessage(m_hWnd, EM_SETTEXTEX, (WPARAM)&ste, (LPARAM)lpstrText);\r
+       }\r
+\r
+       int GetEditStyle() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, EM_GETEDITSTYLE, 0, 0L);\r
+       }\r
+\r
+       int SetEditStyle(int nStyle, int nMask = -1)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               if(nMask == -1)\r
+                       nMask = nStyle;   // set everything specified\r
+               return (int)::SendMessage(m_hWnd, EM_SETEDITSTYLE, nStyle, nMask);\r
+       }\r
+\r
+       BOOL SetFontSize(int nFontSizeDelta)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(nFontSizeDelta >= -1637 && nFontSizeDelta <= 1638);\r
+               return (BOOL)::SendMessage(m_hWnd, EM_SETFONTSIZE, nFontSizeDelta, 0L);\r
+       }\r
+\r
+       void GetScrollPos(LPPOINT lpPoint) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(lpPoint != NULL);\r
+               ::SendMessage(m_hWnd, EM_GETSCROLLPOS, 0, (LPARAM)lpPoint);\r
+       }\r
+\r
+       void SetScrollPos(LPPOINT lpPoint)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(lpPoint != NULL);\r
+               ::SendMessage(m_hWnd, EM_SETSCROLLPOS, 0, (LPARAM)lpPoint);\r
+       }\r
+\r
+       BOOL GetZoom(int& nNum, int& nDen) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, EM_GETZOOM, (WPARAM)&nNum, (LPARAM)&nDen);\r
+       }\r
+\r
+       BOOL SetZoom(int nNum, int nDen)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(nNum >= 0 && nNum <= 64);\r
+               ATLASSERT(nDen >= 0 && nDen <= 64);\r
+               return (BOOL)::SendMessage(m_hWnd, EM_SETZOOM, nNum, nDen);\r
+       }\r
+\r
+       BOOL SetZoomOff()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, EM_SETZOOM, 0, 0L);\r
+       }\r
+#endif // (_RICHEDIT_VER >= 0x0300)\r
+\r
+// Operations\r
+       void LimitText(LONG nChars = 0)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, EM_EXLIMITTEXT, 0, nChars);\r
+       }\r
+\r
+       int LineFromChar(LONG nIndex) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, EM_EXLINEFROMCHAR, 0, nIndex);\r
+       }\r
+\r
+       POINT PosFromChar(LONG nChar) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               POINT point = { 0, 0 };\r
+               ::SendMessage(m_hWnd, EM_POSFROMCHAR, (WPARAM)&point, nChar);\r
+               return point;\r
+       }\r
+\r
+       int CharFromPos(POINT pt) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               POINTL ptl = { pt.x, pt.y };\r
+               return (int)::SendMessage(m_hWnd, EM_CHARFROMPOS, 0, (LPARAM)&ptl);\r
+       }\r
+\r
+       void EmptyUndoBuffer()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, EM_EMPTYUNDOBUFFER, 0, 0L);\r
+       }\r
+\r
+       int LineIndex(int nLine = -1) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, EM_LINEINDEX, nLine, 0L);\r
+       }\r
+\r
+       int LineLength(int nLine = -1) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, EM_LINELENGTH, nLine, 0L);\r
+       }\r
+\r
+       BOOL LineScroll(int nLines, int nChars = 0)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, EM_LINESCROLL, nChars, nLines);\r
+       }\r
+\r
+       void ReplaceSel(LPCTSTR lpszNewText, BOOL bCanUndo = FALSE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, EM_REPLACESEL, (WPARAM) bCanUndo, (LPARAM)lpszNewText);\r
+       }\r
+\r
+       void SetRect(LPCRECT lpRect)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, EM_SETRECT, 0, (LPARAM)lpRect);\r
+       }\r
+\r
+       BOOL DisplayBand(LPRECT pDisplayRect)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, EM_DISPLAYBAND, 0, (LPARAM)pDisplayRect);\r
+       }\r
+\r
+       LONG FindText(DWORD dwFlags, FINDTEXT& ft) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+#if (_RICHEDIT_VER >= 0x0200) && defined(_UNICODE)\r
+               return (LONG)::SendMessage(m_hWnd, EM_FINDTEXTW, dwFlags, (LPARAM)&ft);\r
+#else\r
+               return (LONG)::SendMessage(m_hWnd, EM_FINDTEXT, dwFlags, (LPARAM)&ft);\r
+#endif\r
+       }\r
+\r
+       LONG FindText(DWORD dwFlags, FINDTEXTEX& ft) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+#if (_RICHEDIT_VER >= 0x0200) && defined(_UNICODE)\r
+               return (LONG)::SendMessage(m_hWnd, EM_FINDTEXTEXW, dwFlags, (LPARAM)&ft);\r
+#else\r
+               return (LONG)::SendMessage(m_hWnd, EM_FINDTEXTEX, dwFlags, (LPARAM)&ft);\r
+#endif\r
+       }\r
+\r
+       LONG FormatRange(FORMATRANGE& fr, BOOL bDisplay = TRUE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (LONG)::SendMessage(m_hWnd, EM_FORMATRANGE, bDisplay, (LPARAM)&fr);\r
+       }\r
+\r
+       LONG FormatRange(FORMATRANGE* pFormatRange, BOOL bDisplay = TRUE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (LONG)::SendMessage(m_hWnd, EM_FORMATRANGE, bDisplay, (LPARAM)pFormatRange);\r
+       }\r
+\r
+       void HideSelection(BOOL bHide = TRUE, BOOL bChangeStyle = FALSE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, EM_HIDESELECTION, bHide, bChangeStyle);\r
+       }\r
+\r
+       void PasteSpecial(UINT uClipFormat, DWORD dwAspect = 0, HMETAFILE hMF = 0)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               REPASTESPECIAL reps = { dwAspect, (DWORD_PTR)hMF };\r
+               ::SendMessage(m_hWnd, EM_PASTESPECIAL, uClipFormat, (LPARAM)&reps);\r
+       }\r
+\r
+       void RequestResize()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, EM_REQUESTRESIZE, 0, 0L);\r
+       }\r
+\r
+       LONG StreamIn(UINT uFormat, EDITSTREAM& es)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (LONG)::SendMessage(m_hWnd, EM_STREAMIN, uFormat, (LPARAM)&es);\r
+       }\r
+\r
+       LONG StreamOut(UINT uFormat, EDITSTREAM& es)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (LONG)::SendMessage(m_hWnd, EM_STREAMOUT, uFormat, (LPARAM)&es);\r
+       }\r
+\r
+       DWORD FindWordBreak(int nCode, LONG nStartChar)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (DWORD)::SendMessage(m_hWnd, EM_FINDWORDBREAK, nCode, nStartChar);\r
+       }\r
+\r
+       // Additional operations\r
+       void ScrollCaret()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, EM_SCROLLCARET, 0, 0L);\r
+       }\r
+\r
+       int InsertText(long nInsertAfterChar, LPCTSTR lpstrText, BOOL bCanUndo = FALSE)\r
+       {\r
+               int nRet = SetSel(nInsertAfterChar, nInsertAfterChar);\r
+               ReplaceSel(lpstrText, bCanUndo);\r
+               return nRet;\r
+       }\r
+\r
+       int AppendText(LPCTSTR lpstrText, BOOL bCanUndo = FALSE)\r
+       {\r
+               return InsertText(GetWindowTextLength(), lpstrText, bCanUndo);\r
+       }\r
+\r
+       // Clipboard operations\r
+       BOOL Undo()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, EM_UNDO, 0, 0L);\r
+       }\r
+\r
+       void Clear()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, WM_CLEAR, 0, 0L);\r
+       }\r
+\r
+       void Copy()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, WM_COPY, 0, 0L);\r
+       }\r
+\r
+       void Cut()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, WM_CUT, 0, 0L);\r
+       }\r
+\r
+       void Paste()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, WM_PASTE, 0, 0L);\r
+       }\r
+\r
+       // OLE support\r
+       IRichEditOle* GetOleInterface() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               IRichEditOle *pRichEditOle = NULL;\r
+               ::SendMessage(m_hWnd, EM_GETOLEINTERFACE, 0, (LPARAM)&pRichEditOle);\r
+               return pRichEditOle;\r
+       }\r
+\r
+       BOOL SetOleCallback(IRichEditOleCallback* pCallback)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, EM_SETOLECALLBACK, 0, (LPARAM)pCallback);\r
+       }\r
+\r
+#if (_RICHEDIT_VER >= 0x0200)\r
+       BOOL Redo()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, EM_REDO, 0, 0L);\r
+       }\r
+\r
+       void StopGroupTyping()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, EM_STOPGROUPTYPING, 0, 0L);\r
+       }\r
+\r
+       void ShowScrollBar(int nBarType, BOOL bVisible = TRUE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, EM_SHOWSCROLLBAR, nBarType, bVisible);\r
+       }\r
+#endif // (_RICHEDIT_VER >= 0x0200)\r
+\r
+#if (_RICHEDIT_VER >= 0x0300)\r
+       BOOL SetTabStops(int nTabStops, LPINT rgTabStops)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, EM_SETTABSTOPS, nTabStops, (LPARAM)rgTabStops);\r
+       }\r
+\r
+       BOOL SetTabStops()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, EM_SETTABSTOPS, 0, 0L);\r
+       }\r
+\r
+       BOOL SetTabStops(const int& cxEachStop)    // takes an 'int'\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, EM_SETTABSTOPS, 1, (LPARAM)(LPINT)&cxEachStop);\r
+       }\r
+#endif // (_RICHEDIT_VER >= 0x0300)\r
+};\r
+\r
+typedef CRichEditCtrlT<ATL::CWindow>   CRichEditCtrl;\r
+\r
+#endif // !_WIN32_WCE\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CRichEditCommands - message handlers for standard EDIT commands\r
+\r
+#ifndef _WIN32_WCE\r
+\r
+// Chain to CRichEditCommands message map. Your class must also derive from CRichEditCtrl.\r
+// Example:\r
+// class CMyRichEdit : public CWindowImpl<CMyRichEdit, CRichEditCtrl>,\r
+//                     public CRichEditCommands<CMyRichEdit>\r
+// {\r
+// public:\r
+//      BEGIN_MSG_MAP(CMyRichEdit)\r
+//              // your handlers...\r
+//              CHAIN_MSG_MAP_ALT(CRichEditCommands<CMyRichEdit>, 1)\r
+//      END_MSG_MAP()\r
+//      // other stuff...\r
+// };\r
+\r
+template <class T>\r
+class CRichEditCommands : public CEditCommands< T >\r
+{\r
+public:\r
+       BEGIN_MSG_MAP(CRichEditCommands< T >)\r
+       ALT_MSG_MAP(1)\r
+               COMMAND_ID_HANDLER(ID_EDIT_CLEAR, CEditCommands< T >::OnEditClear)\r
+               COMMAND_ID_HANDLER(ID_EDIT_CLEAR_ALL, CEditCommands< T >::OnEditClearAll)\r
+               COMMAND_ID_HANDLER(ID_EDIT_COPY, CEditCommands< T >::OnEditCopy)\r
+               COMMAND_ID_HANDLER(ID_EDIT_CUT, CEditCommands< T >::OnEditCut)\r
+               COMMAND_ID_HANDLER(ID_EDIT_PASTE, CEditCommands< T >::OnEditPaste)\r
+               COMMAND_ID_HANDLER(ID_EDIT_SELECT_ALL, CEditCommands< T >::OnEditSelectAll)\r
+               COMMAND_ID_HANDLER(ID_EDIT_UNDO, CEditCommands< T >::OnEditUndo)\r
+#if (_RICHEDIT_VER >= 0x0200)\r
+               COMMAND_ID_HANDLER(ID_EDIT_REDO, OnEditRedo)\r
+#endif // (_RICHEDIT_VER >= 0x0200)\r
+       END_MSG_MAP()\r
+\r
+#if (_RICHEDIT_VER >= 0x0200)\r
+       LRESULT OnEditRedo(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               pT->Redo();\r
+               return 0;\r
+       }\r
+#endif // (_RICHEDIT_VER >= 0x0200)\r
+\r
+// State (update UI) helpers\r
+       BOOL CanCut() const\r
+       { return HasSelection(); }\r
+\r
+       BOOL CanCopy() const\r
+       { return HasSelection(); }\r
+\r
+       BOOL CanClear() const\r
+       { return HasSelection(); }\r
+\r
+// Implementation\r
+       BOOL HasSelection() const\r
+       {\r
+               const T* pT = static_cast<const T*>(this);\r
+               return (pT->GetSelectionType() != SEL_EMPTY);\r
+       }\r
+};\r
+\r
+#endif // _WIN32_WCE\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CDragListBox\r
+\r
+#ifndef _WIN32_WCE\r
+\r
+template <class TBase>\r
+class CDragListBoxT : public CListBoxT< TBase >\r
+{\r
+public:\r
+// Constructors\r
+       CDragListBoxT(HWND hWnd = NULL) : CListBoxT< TBase >(hWnd)\r
+       { }\r
+\r
+       CDragListBoxT< TBase >& operator =(HWND hWnd)\r
+       {\r
+               m_hWnd = hWnd;\r
+               return *this;\r
+       }\r
+\r
+       HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,\r
+                       DWORD dwStyle = 0, DWORD dwExStyle = 0,\r
+                       ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)\r
+       {\r
+               HWND hWnd = TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);\r
+               if(hWnd != NULL)\r
+                       MakeDragList();\r
+               return hWnd;\r
+       }\r
+\r
+// Operations\r
+       BOOL MakeDragList()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT((GetStyle() & (LBS_MULTIPLESEL | LBS_EXTENDEDSEL)) == 0);\r
+               return ::MakeDragList(m_hWnd);\r
+       }\r
+\r
+       int LBItemFromPt(POINT pt, BOOL bAutoScroll = TRUE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return ::LBItemFromPt(m_hWnd, pt, bAutoScroll);\r
+       }\r
+\r
+       void DrawInsert(int nItem)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::DrawInsert(GetParent(), m_hWnd, nItem);\r
+       }\r
+\r
+       static UINT GetDragListMessage()\r
+       {\r
+               static UINT uDragListMessage = 0;\r
+               if(uDragListMessage == 0)\r
+               {\r
+                       CStaticDataInitCriticalSectionLock lock;\r
+                       if(FAILED(lock.Lock()))\r
+                       {\r
+                               ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CDragListBox::GetDragListMessage.\n"));\r
+                               ATLASSERT(FALSE);\r
+                               return 0;\r
+                       }\r
+\r
+                       if(uDragListMessage == 0)\r
+                               uDragListMessage = ::RegisterWindowMessage(DRAGLISTMSGSTRING);\r
+\r
+                       lock.Unlock();\r
+               }\r
+               ATLASSERT(uDragListMessage != 0);\r
+               return uDragListMessage;\r
+       }\r
+};\r
+\r
+typedef CDragListBoxT<ATL::CWindow>   CDragListBox;\r
+\r
+template <class T>\r
+class CDragListNotifyImpl\r
+{\r
+public:\r
+       BEGIN_MSG_MAP(CDragListNotifyImpl< T >)\r
+               MESSAGE_HANDLER(CDragListBox::GetDragListMessage(), OnDragListNotify)\r
+       END_MSG_MAP()\r
+\r
+       LRESULT OnDragListNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)\r
+       {\r
+               uMsg;   // avoid level 4 warning\r
+               ATLASSERT(uMsg == CDragListBox::GetDragListMessage());\r
+               T* pT = static_cast<T*>(this);\r
+               LPDRAGLISTINFO lpDragListInfo = (LPDRAGLISTINFO)lParam;\r
+               LRESULT lRet = 0;\r
+               switch(lpDragListInfo->uNotification)\r
+               {\r
+               case DL_BEGINDRAG:\r
+                       lRet = (LPARAM)pT->OnBeginDrag((int)wParam, lpDragListInfo->hWnd, lpDragListInfo->ptCursor);\r
+                       break;\r
+               case DL_CANCELDRAG:\r
+                       pT->OnCancelDrag((int)wParam, lpDragListInfo->hWnd, lpDragListInfo->ptCursor);\r
+                       break;\r
+               case DL_DRAGGING:\r
+                       lRet = (LPARAM)pT->OnDragging((int)wParam, lpDragListInfo->hWnd, lpDragListInfo->ptCursor);\r
+                       break;\r
+               case DL_DROPPED:\r
+                       pT->OnDropped((int)wParam, lpDragListInfo->hWnd, lpDragListInfo->ptCursor);\r
+                       break;\r
+               default:\r
+                       ATLTRACE2(atlTraceUI, 0, _T("Unknown DragListBox notification\n"));\r
+                       bHandled = FALSE;   // don't handle it\r
+                       break;\r
+               }\r
+               return lRet;\r
+       }\r
+\r
+// Overrideables\r
+       BOOL OnBeginDrag(int /*nCtlID*/, HWND /*hWndDragList*/, POINT /*ptCursor*/)\r
+       {\r
+               return TRUE;   // allow dragging\r
+       }\r
+\r
+       void OnCancelDrag(int /*nCtlID*/, HWND /*hWndDragList*/, POINT /*ptCursor*/)\r
+       {\r
+               // nothing to do\r
+       }\r
+\r
+       int OnDragging(int /*nCtlID*/, HWND /*hWndDragList*/, POINT /*ptCursor*/)\r
+       {\r
+               return 0;   // don't change cursor\r
+       }\r
+\r
+       void OnDropped(int /*nCtlID*/, HWND /*hWndDragList*/, POINT /*ptCursor*/)\r
+       {\r
+               // nothing to do\r
+       }\r
+};\r
+\r
+#endif // _WIN32_WCE\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CReBarCtrl\r
+\r
+template <class TBase>\r
+class CReBarCtrlT : public TBase\r
+{\r
+public:\r
+// Constructors\r
+       CReBarCtrlT(HWND hWnd = NULL) : TBase(hWnd)\r
+       { }\r
+\r
+       CReBarCtrlT< TBase >& operator =(HWND hWnd)\r
+       {\r
+               m_hWnd = hWnd;\r
+               return *this;\r
+       }\r
+\r
+       HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,\r
+                       DWORD dwStyle = 0, DWORD dwExStyle = 0,\r
+                       ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)\r
+       {\r
+               return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);\r
+       }\r
+\r
+// Attributes\r
+       static LPCTSTR GetWndClassName()\r
+       {\r
+               return REBARCLASSNAME;\r
+       }\r
+\r
+       UINT GetBandCount() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (UINT)::SendMessage(m_hWnd, RB_GETBANDCOUNT, 0, 0L);\r
+       }\r
+\r
+       BOOL GetBandInfo(int nBand, LPREBARBANDINFO lprbbi) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, RB_GETBANDINFO, nBand, (LPARAM)lprbbi);\r
+       }\r
+\r
+       BOOL SetBandInfo(int nBand, LPREBARBANDINFO lprbbi)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, RB_SETBANDINFO, nBand, (LPARAM)lprbbi);\r
+       }\r
+\r
+       BOOL GetBarInfo(LPREBARINFO lprbi) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, RB_GETBARINFO, 0, (LPARAM)lprbi);\r
+       }\r
+\r
+       BOOL SetBarInfo(LPREBARINFO lprbi)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, RB_SETBARINFO, 0, (LPARAM)lprbi);\r
+       }\r
+\r
+       CImageList GetImageList() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               REBARINFO rbi = { 0 };\r
+               rbi.cbSize = sizeof(REBARINFO);\r
+               rbi.fMask = RBIM_IMAGELIST;\r
+               if( (BOOL)::SendMessage(m_hWnd, RB_GETBARINFO, 0, (LPARAM)&rbi) == FALSE ) return CImageList();\r
+               return CImageList(rbi.himl);\r
+       }\r
+\r
+       BOOL SetImageList(HIMAGELIST hImageList)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               REBARINFO rbi = { 0 };\r
+               rbi.cbSize = sizeof(REBARINFO);\r
+               rbi.fMask = RBIM_IMAGELIST;\r
+               rbi.himl = hImageList;\r
+               return (BOOL)::SendMessage(m_hWnd, RB_SETBARINFO, 0, (LPARAM)&rbi);\r
+       }\r
+\r
+       UINT GetRowCount() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (UINT)::SendMessage(m_hWnd, RB_GETROWCOUNT, 0, 0L);\r
+       }\r
+\r
+       UINT GetRowHeight(int nBand) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (UINT)::SendMessage(m_hWnd, RB_GETROWHEIGHT, nBand, 0L);\r
+       }\r
+\r
+#if (_WIN32_IE >= 0x0400)\r
+       COLORREF GetTextColor() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (COLORREF)::SendMessage(m_hWnd, RB_GETTEXTCOLOR, 0, 0L);\r
+       }\r
+\r
+       COLORREF SetTextColor(COLORREF clr)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (COLORREF)::SendMessage(m_hWnd, RB_SETTEXTCOLOR, 0, (LPARAM)clr);\r
+       }\r
+\r
+       COLORREF GetBkColor() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (COLORREF)::SendMessage(m_hWnd, RB_GETBKCOLOR, 0, 0L);\r
+       }\r
+\r
+       COLORREF SetBkColor(COLORREF clr)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (COLORREF)::SendMessage(m_hWnd, RB_SETBKCOLOR, 0, (LPARAM)clr);\r
+       }\r
+\r
+       UINT GetBarHeight() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (UINT)::SendMessage(m_hWnd, RB_GETBARHEIGHT, 0, 0L);\r
+       }\r
+\r
+       BOOL GetRect(int nBand, LPRECT lpRect) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, RB_GETRECT, nBand, (LPARAM)lpRect);\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       CToolTipCtrl GetToolTips() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return CToolTipCtrl((HWND)::SendMessage(m_hWnd, RB_GETTOOLTIPS, 0, 0L));\r
+       }\r
+\r
+       void SetToolTips(HWND hwndToolTip)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, RB_SETTOOLTIPS, (WPARAM)hwndToolTip, 0L);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       void GetBandBorders(int nBand, LPRECT lpRect) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(lpRect != NULL);\r
+               ::SendMessage(m_hWnd, RB_GETBANDBORDERS, nBand, (LPARAM)lpRect);\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       BOOL GetColorScheme(LPCOLORSCHEME lpColorScheme) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(lpColorScheme != NULL);\r
+               return (BOOL)::SendMessage(m_hWnd, RB_GETCOLORSCHEME, 0, (LPARAM)lpColorScheme);\r
+       }\r
+\r
+       void SetColorScheme(LPCOLORSCHEME lpColorScheme)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(lpColorScheme != NULL);\r
+               ::SendMessage(m_hWnd, RB_SETCOLORSCHEME, 0, (LPARAM)lpColorScheme);\r
+       }\r
+\r
+       HPALETTE GetPalette() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (HPALETTE)::SendMessage(m_hWnd, RB_GETPALETTE, 0, 0L);\r
+       }\r
+\r
+       HPALETTE SetPalette(HPALETTE hPalette)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (HPALETTE)::SendMessage(m_hWnd, RB_SETPALETTE, 0, (LPARAM)hPalette);\r
+       }\r
+\r
+       BOOL GetUnicodeFormat() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, RB_GETUNICODEFORMAT, 0, 0L);\r
+       }\r
+\r
+       BOOL SetUnicodeFormat(BOOL bUnicode = TRUE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, RB_SETUNICODEFORMAT, bUnicode, 0L);\r
+       }\r
+#endif // !_WIN32_WCE\r
+#endif // (_WIN32_IE >= 0x0400)\r
+\r
+#if (_WIN32_WINNT >= 0x0501)\r
+       // requires uxtheme.h to be included to use MARGINS struct\r
+#ifndef _UXTHEME_H_\r
+       typedef struct _MARGINS*   PMARGINS;\r
+#endif // !_UXTHEME_H_\r
+       void GetBandMargins(PMARGINS pMargins) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, RB_GETBANDMARGINS, 0, (LPARAM)pMargins);\r
+       }\r
+\r
+       void SetWindowTheme(LPCWSTR lpstrTheme)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, RB_SETWINDOWTHEME, 0, (LPARAM)lpstrTheme);\r
+       }\r
+#endif // (_WIN32_WINNT >= 0x0501)\r
+\r
+#if (_WIN32_IE >= 0x0600)\r
+       DWORD GetExtendedStyle() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (DWORD)::SendMessage(m_hWnd, RB_GETEXTENDEDSTYLE, 0, 0L);\r
+       }\r
+\r
+       DWORD SetExtendedStyle(DWORD dwStyle, DWORD dwMask)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (DWORD)::SendMessage(m_hWnd, RB_SETEXTENDEDSTYLE, dwMask, dwStyle);\r
+       }\r
+#endif // (_WIN32_IE >= 0x0600)\r
+\r
+// Operations\r
+       BOOL InsertBand(int nBand, LPREBARBANDINFO lprbbi)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, RB_INSERTBAND, nBand, (LPARAM)lprbbi);\r
+       }\r
+\r
+       BOOL AddBand(LPREBARBANDINFO lprbbi)\r
+       {\r
+               return InsertBand(-1, lprbbi);\r
+       }\r
+\r
+       BOOL DeleteBand(int nBand)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, RB_DELETEBAND, nBand, 0L);\r
+       }\r
+\r
+       ATL::CWindow SetNotifyWnd(HWND hWnd)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return ATL::CWindow((HWND)::SendMessage(m_hWnd, RB_SETPARENT, (WPARAM)hWnd, 0L));\r
+       }\r
+\r
+#if (_WIN32_IE >= 0x0400)\r
+       void BeginDrag(int nBand, DWORD dwPos)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, RB_BEGINDRAG, nBand, dwPos);\r
+       }\r
+\r
+       void BeginDrag(int nBand, int xPos, int yPos)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, RB_BEGINDRAG, nBand, MAKELPARAM(xPos, yPos));\r
+       }\r
+\r
+       void EndDrag()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, RB_ENDDRAG, 0, 0L);\r
+       }\r
+\r
+       void DragMove(DWORD dwPos)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, RB_DRAGMOVE, 0, dwPos);\r
+       }\r
+\r
+       void DragMove(int xPos, int yPos)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, RB_DRAGMOVE, 0, MAKELPARAM(xPos, yPos));\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       void GetDropTarget(IDropTarget** ppDropTarget) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, RB_GETDROPTARGET, 0, (LPARAM)ppDropTarget);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       void MaximizeBand(int nBand, BOOL bIdeal = FALSE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, RB_MAXIMIZEBAND, nBand, bIdeal);\r
+       }\r
+\r
+       void MinimizeBand(int nBand)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, RB_MINIMIZEBAND, nBand, 0L);\r
+       }\r
+\r
+       BOOL SizeToRect(LPRECT lpRect)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, RB_SIZETORECT, 0, (LPARAM)lpRect);\r
+       }\r
+\r
+       int IdToIndex(UINT uBandID) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, RB_IDTOINDEX, uBandID, 0L);\r
+       }\r
+\r
+       int HitTest(LPRBHITTESTINFO lprbht) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, RB_HITTEST, 0, (LPARAM)lprbht);\r
+       }\r
+\r
+       BOOL ShowBand(int nBand, BOOL bShow)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, RB_SHOWBAND, nBand, bShow);\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       BOOL MoveBand(int nBand, int nNewPos)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(nNewPos >= 0 && nNewPos <= ((int)GetBandCount() - 1));\r
+               return (BOOL)::SendMessage(m_hWnd, RB_MOVEBAND, nBand, nNewPos);\r
+       }\r
+#endif // !_WIN32_WCE\r
+#endif // (_WIN32_IE >= 0x0400)\r
+\r
+#if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)\r
+       void PushChevron(int nBand, LPARAM lAppValue)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, RB_PUSHCHEVRON, nBand, lAppValue);\r
+       }\r
+#endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)\r
+\r
+// Extra operations\r
+#if (_WIN32_IE >= 0x0400)\r
+       void LockBands(bool bLock)\r
+       {\r
+               int nBandCount = GetBandCount();\r
+               for(int i =0; i < nBandCount; i++)\r
+               {\r
+                       REBARBANDINFO rbbi = { RunTimeHelper::SizeOf_REBARBANDINFO() };\r
+                       rbbi.fMask = RBBIM_STYLE;\r
+                       BOOL bRet = GetBandInfo(i, &rbbi);\r
+                       ATLASSERT(bRet);\r
+\r
+                       if((rbbi.fStyle & RBBS_GRIPPERALWAYS) == 0)\r
+                       {\r
+                               rbbi.fStyle |= RBBS_GRIPPERALWAYS;\r
+                               bRet = SetBandInfo(i, &rbbi);\r
+                               ATLASSERT(bRet);\r
+                               rbbi.fStyle &= ~RBBS_GRIPPERALWAYS;\r
+                       }\r
+\r
+                       if(bLock)\r
+                               rbbi.fStyle |= RBBS_NOGRIPPER;\r
+                       else\r
+                               rbbi.fStyle &= ~RBBS_NOGRIPPER;\r
+\r
+                       bRet = SetBandInfo(i, &rbbi);\r
+                       ATLASSERT(bRet);\r
+               }\r
+       }\r
+#endif // (_WIN32_IE >= 0x0400)\r
+\r
+#if (_WIN32_WINNT >= 0x0600)\r
+       BOOL SetBandWidth(int nBand, int cxWidth)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, RB_SETBANDWIDTH, nBand, cxWidth);\r
+       }\r
+#endif // (_WIN32_WINNT >= 0x0600)\r
+};\r
+\r
+typedef CReBarCtrlT<ATL::CWindow>   CReBarCtrl;\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CComboBoxEx\r
+\r
+#ifndef _WIN32_WCE\r
+\r
+template <class TBase>\r
+class CComboBoxExT : public CComboBoxT< TBase >\r
+{\r
+public:\r
+// Constructors\r
+       CComboBoxExT(HWND hWnd = NULL) : CComboBoxT< TBase >(hWnd)\r
+       { }\r
+\r
+       CComboBoxExT< TBase >& operator =(HWND hWnd)\r
+       {\r
+               m_hWnd = hWnd;\r
+               return *this;\r
+       }\r
+\r
+       HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,\r
+                       DWORD dwStyle = 0, DWORD dwExStyle = 0,\r
+                       ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)\r
+       {\r
+               return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);\r
+       }\r
+\r
+// Attributes\r
+       static LPCTSTR GetWndClassName()\r
+       {\r
+               return WC_COMBOBOXEX;\r
+       }\r
+\r
+       CImageList GetImageList() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return CImageList((HIMAGELIST)::SendMessage(m_hWnd, CBEM_GETIMAGELIST, 0, 0L));\r
+       }\r
+\r
+       CImageList SetImageList(HIMAGELIST hImageList)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return CImageList((HIMAGELIST)::SendMessage(m_hWnd, CBEM_SETIMAGELIST, 0, (LPARAM)hImageList));\r
+       }\r
+\r
+#if (_WIN32_IE >= 0x0400)\r
+       DWORD GetExtendedStyle() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (DWORD)::SendMessage(m_hWnd, CBEM_GETEXTENDEDSTYLE, 0, 0L);\r
+       }\r
+\r
+       DWORD SetExtendedStyle(DWORD dwExMask, DWORD dwExStyle)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (DWORD)::SendMessage(m_hWnd, CBEM_SETEXTENDEDSTYLE, dwExMask, dwExStyle);\r
+       }\r
+\r
+       BOOL GetUnicodeFormat() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, CBEM_GETUNICODEFORMAT, 0, 0L);\r
+       }\r
+\r
+       BOOL SetUnicodeFormat(BOOL bUnicode = TRUE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, CBEM_SETUNICODEFORMAT, bUnicode, 0L);\r
+       }\r
+#endif // (_WIN32_IE >= 0x0400)\r
+\r
+#if (_WIN32_WINNT >= 0x0501)\r
+       void SetWindowTheme(LPCWSTR lpstrTheme)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, CBEM_SETWINDOWTHEME, 0, (LPARAM)lpstrTheme);\r
+       }\r
+#endif // (_WIN32_WINNT >= 0x0501)\r
+\r
+// Operations\r
+       int InsertItem(const COMBOBOXEXITEM* lpcCBItem)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, CBEM_INSERTITEM, 0, (LPARAM)lpcCBItem);\r
+       }\r
+\r
+       int InsertItem(UINT nMask, int nIndex, LPCTSTR lpszItem, int nImage, int nSelImage, \r
+                      int iIndent, int iOverlay, LPARAM lParam)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               COMBOBOXEXITEM cbex = { 0 };\r
+               cbex.mask = nMask;\r
+               cbex.iItem = nIndex;\r
+               cbex.pszText = (LPTSTR) lpszItem;\r
+               cbex.iImage = nImage;\r
+               cbex.iSelectedImage = nSelImage;\r
+               cbex.iIndent = iIndent;\r
+               cbex.iOverlay = iOverlay;\r
+               cbex.lParam = lParam;\r
+               return (int)::SendMessage(m_hWnd, CBEM_INSERTITEM, 0, (LPARAM)&cbex);\r
+       }\r
+\r
+       int InsertItem(int nIndex, LPCTSTR lpszItem, int nImage, int nSelImage, int iIndent, LPARAM lParam = 0)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               COMBOBOXEXITEM cbex = { 0 };\r
+               cbex.mask = CBEIF_TEXT | CBEIF_IMAGE | CBEIF_SELECTEDIMAGE | CBEIF_INDENT | CBEIF_LPARAM;\r
+               cbex.iItem = nIndex;\r
+               cbex.pszText = (LPTSTR) lpszItem;\r
+               cbex.iImage = nImage;\r
+               cbex.iSelectedImage = nSelImage;\r
+               cbex.iIndent = iIndent;\r
+               cbex.lParam = lParam;\r
+               return (int)::SendMessage(m_hWnd, CBEM_INSERTITEM, 0, (LPARAM)&cbex);\r
+       }\r
+\r
+       int AddItem(UINT nMask, LPCTSTR lpszItem, int nImage, int nSelImage, int iIndent, int iOverlay, LPARAM lParam)\r
+       {\r
+               return InsertItem(nMask, -1, lpszItem, nImage, nSelImage, iIndent, iOverlay, lParam);\r
+       }\r
+\r
+       int AddItem(LPCTSTR lpszItem, int nImage, int nSelImage, int iIndent, LPARAM lParam = 0)\r
+       {\r
+               return InsertItem(-1, lpszItem, nImage, nSelImage, iIndent, lParam);\r
+       }\r
+\r
+       int DeleteItem(int nIndex)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, CBEM_DELETEITEM, nIndex, 0L);\r
+       }\r
+\r
+       BOOL GetItem(PCOMBOBOXEXITEM pCBItem) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, CBEM_GETITEM, 0, (LPARAM)pCBItem);\r
+       }\r
+\r
+       BOOL SetItem(const COMBOBOXEXITEM* lpcCBItem)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, CBEM_SETITEM, 0, (LPARAM)lpcCBItem);\r
+       }\r
+\r
+       int SetItem(int nIndex, UINT nMask, LPCTSTR lpszItem, int nImage, int nSelImage, \r
+                   int iIndent, int iOverlay, LPARAM lParam)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               COMBOBOXEXITEM cbex = { 0 };\r
+               cbex.mask = nMask;\r
+               cbex.iItem = nIndex;\r
+               cbex.pszText = (LPTSTR) lpszItem;\r
+               cbex.iImage = nImage;\r
+               cbex.iSelectedImage = nSelImage;\r
+               cbex.iIndent = iIndent;\r
+               cbex.iOverlay = iOverlay;\r
+               cbex.lParam = lParam;\r
+               return (int)::SendMessage(m_hWnd, CBEM_SETITEM, 0, (LPARAM)&cbex);\r
+       }\r
+\r
+       BOOL GetItemText(int nIndex, LPTSTR lpszItem, int nLen) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(lpszItem != NULL);\r
+\r
+               COMBOBOXEXITEM cbex = { 0 };\r
+               cbex.mask = CBEIF_TEXT;\r
+               cbex.iItem = nIndex;\r
+               cbex.pszText = lpszItem;\r
+               cbex.cchTextMax = nLen;\r
+\r
+               return (BOOL)::SendMessage(m_hWnd, CBEM_GETITEM, 0, (LPARAM)&cbex);\r
+       }\r
+\r
+#ifndef _ATL_NO_COM\r
+       BOOL GetItemText(int nIndex, BSTR& bstrText) const\r
+       {\r
+               USES_CONVERSION;\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(bstrText == NULL);\r
+\r
+               COMBOBOXEXITEM cbex = { 0 };\r
+               cbex.mask = CBEIF_TEXT;\r
+               cbex.iItem = nIndex;\r
+\r
+               LPTSTR lpstrText = NULL;\r
+               BOOL bRet = FALSE;\r
+               for(int nLen = 256; ; nLen *= 2)\r
+               {\r
+                       ATLTRY(lpstrText = new TCHAR[nLen]);\r
+                       if(lpstrText == NULL)\r
+                               break;\r
+                       lpstrText[0] = NULL;\r
+                       cbex.pszText = lpstrText;\r
+                       cbex.cchTextMax = nLen;\r
+                       bRet = (BOOL)::SendMessage(m_hWnd, CBEM_GETITEM, 0, (LPARAM)&cbex);\r
+                       if(!bRet || (lstrlen(cbex.pszText) < nLen - 1))\r
+                               break;\r
+                       delete [] lpstrText;\r
+                       lpstrText = NULL;\r
+               }\r
+\r
+               if(lpstrText != NULL)\r
+               {\r
+                       if(bRet)\r
+                               bstrText = ::SysAllocString(T2OLE(lpstrText));\r
+                       delete [] lpstrText;\r
+               }\r
+\r
+               return (bstrText != NULL) ? TRUE : FALSE;\r
+       }\r
+#endif // !_ATL_NO_COM\r
+\r
+#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)\r
+       BOOL GetItemText(int nIndex, _CSTRING_NS::CString& strText) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+\r
+               COMBOBOXEXITEM cbex = { 0 };\r
+               cbex.mask = CBEIF_TEXT;\r
+               cbex.iItem = nIndex;\r
+\r
+               strText.Empty();\r
+               BOOL bRet = FALSE;\r
+               for(int nLen = 256; ; nLen *= 2)\r
+               {\r
+                       cbex.pszText = strText.GetBufferSetLength(nLen);\r
+                       if(cbex.pszText == NULL)\r
+                       {\r
+                               bRet = FALSE;\r
+                               break;\r
+                       }\r
+                       cbex.cchTextMax = nLen;\r
+                       bRet = (BOOL)::SendMessage(m_hWnd, CBEM_GETITEM, 0, (LPARAM)&cbex);\r
+                       if(!bRet || (lstrlen(cbex.pszText) < nLen - 1))\r
+                               break;\r
+               }\r
+               strText.ReleaseBuffer();\r
+               return bRet;\r
+       }\r
+#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)\r
+\r
+       BOOL SetItemText(int nIndex, LPCTSTR lpszItem)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return SetItem(nIndex, CBEIF_TEXT, lpszItem, 0, 0, 0, 0, 0);\r
+       }\r
+\r
+       CComboBox GetComboCtrl() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return CComboBox((HWND)::SendMessage(m_hWnd, CBEM_GETCOMBOCONTROL, 0, 0L));\r
+       }\r
+\r
+       CEdit GetEditCtrl() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return CEdit((HWND)::SendMessage(m_hWnd, CBEM_GETEDITCONTROL, 0, 0L));\r
+       }\r
+\r
+       BOOL HasEditChanged() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, CBEM_HASEDITCHANGED, 0, 0L);\r
+       }\r
+\r
+// Non-functional\r
+       int AddString(LPCTSTR /*lpszItem*/)\r
+       {\r
+               ATLASSERT(FALSE);  // Not available in CComboBoxEx; use InsertItem\r
+               return 0;\r
+       }\r
+\r
+       int InsertString(int /*nIndex*/, LPCTSTR /*lpszString*/)\r
+       {\r
+               ATLASSERT(FALSE);  // Not available in CComboBoxEx; use InsertItem\r
+               return 0;\r
+       }\r
+\r
+       int Dir(UINT /*attr*/, LPCTSTR /*lpszWildCard*/)\r
+       {\r
+               ATLASSERT(FALSE);  // Not available in CComboBoxEx\r
+               return 0;\r
+       }\r
+\r
+       int FindString(int /*nStartAfter*/, LPCTSTR /*lpszString*/) const\r
+       {\r
+               ATLASSERT(FALSE);  // Not available in CComboBoxEx; try FindStringExact\r
+               return 0;\r
+       }\r
+};\r
+\r
+typedef CComboBoxExT<ATL::CWindow>   CComboBoxEx;\r
+\r
+#endif // !_WIN32_WCE\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CMonthCalendarCtrl\r
+\r
+template <class TBase>\r
+class CMonthCalendarCtrlT : public TBase\r
+{\r
+public:\r
+// Constructors\r
+       CMonthCalendarCtrlT(HWND hWnd = NULL) : TBase(hWnd)\r
+       { }\r
+\r
+       CMonthCalendarCtrlT< TBase >& operator =(HWND hWnd)\r
+       {\r
+               m_hWnd = hWnd;\r
+               return *this;\r
+       }\r
+\r
+       HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,\r
+                       DWORD dwStyle = 0, DWORD dwExStyle = 0,\r
+                       ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)\r
+       {\r
+               return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);\r
+       }\r
+\r
+// Attributes\r
+       static LPCTSTR GetWndClassName()\r
+       {\r
+               return MONTHCAL_CLASS;\r
+       }\r
+\r
+       COLORREF GetColor(int nColorType) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (COLORREF)::SendMessage(m_hWnd, MCM_GETCOLOR, nColorType, 0L);\r
+       }\r
+\r
+       COLORREF SetColor(int nColorType, COLORREF clr)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (COLORREF)::SendMessage(m_hWnd, MCM_SETCOLOR, nColorType, clr);\r
+       }\r
+\r
+       BOOL GetCurSel(LPSYSTEMTIME lpSysTime) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, MCM_GETCURSEL, 0, (LPARAM)lpSysTime);\r
+       }\r
+\r
+       BOOL SetCurSel(LPSYSTEMTIME lpSysTime)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, MCM_SETCURSEL, 0, (LPARAM)lpSysTime);\r
+       }\r
+\r
+       int GetFirstDayOfWeek(BOOL* pbLocaleVal = NULL) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               DWORD dwRet = (DWORD)::SendMessage(m_hWnd, MCM_GETFIRSTDAYOFWEEK, 0, 0L);\r
+               if(pbLocaleVal != NULL)\r
+                       *pbLocaleVal = (BOOL)HIWORD(dwRet);\r
+               return (int)(short)LOWORD(dwRet);\r
+       }\r
+\r
+       int SetFirstDayOfWeek(int nDay, BOOL* pbLocaleVal = NULL)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               DWORD dwRet = (DWORD)::SendMessage(m_hWnd, MCM_SETFIRSTDAYOFWEEK, 0, nDay);\r
+               if(pbLocaleVal != NULL)\r
+                       *pbLocaleVal = (BOOL)HIWORD(dwRet);\r
+               return (int)(short)LOWORD(dwRet);\r
+       }\r
+\r
+       int GetMaxSelCount() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, MCM_GETMAXSELCOUNT, 0, 0L);\r
+       }\r
+\r
+       BOOL SetMaxSelCount(int nMax)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, MCM_SETMAXSELCOUNT, nMax, 0L);\r
+       }\r
+\r
+       int GetMonthDelta() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, MCM_GETMONTHDELTA, 0, 0L);\r
+       }\r
+\r
+       int SetMonthDelta(int nDelta)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, MCM_SETMONTHDELTA, nDelta, 0L);\r
+       }\r
+\r
+       DWORD GetRange(LPSYSTEMTIME lprgSysTimeArray) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (DWORD)::SendMessage(m_hWnd, MCM_GETRANGE, 0, (LPARAM)lprgSysTimeArray);\r
+       }\r
+\r
+       BOOL SetRange(DWORD dwFlags, LPSYSTEMTIME lprgSysTimeArray)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, MCM_SETRANGE, dwFlags, (LPARAM)lprgSysTimeArray);\r
+       }\r
+\r
+       BOOL GetSelRange(LPSYSTEMTIME lprgSysTimeArray) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, MCM_GETSELRANGE, 0, (LPARAM)lprgSysTimeArray);\r
+       }\r
+\r
+       BOOL SetSelRange(LPSYSTEMTIME lprgSysTimeArray)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, MCM_SETSELRANGE, 0, (LPARAM)lprgSysTimeArray);\r
+       }\r
+\r
+       BOOL GetToday(LPSYSTEMTIME lpSysTime) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, MCM_GETTODAY, 0, (LPARAM)lpSysTime);\r
+       }\r
+\r
+       void SetToday(LPSYSTEMTIME lpSysTime)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, MCM_SETTODAY, 0, (LPARAM)lpSysTime);\r
+       }\r
+\r
+       BOOL GetMinReqRect(LPRECT lpRectInfo) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, MCM_GETMINREQRECT, 0, (LPARAM)lpRectInfo);\r
+       }\r
+\r
+       int GetMaxTodayWidth() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, MCM_GETMAXTODAYWIDTH, 0, 0L);\r
+       }\r
+\r
+#if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)\r
+       BOOL GetUnicodeFormat() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, MCM_GETUNICODEFORMAT, 0, 0L);\r
+       }\r
+\r
+       BOOL SetUnicodeFormat(BOOL bUnicode = TRUE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, MCM_SETUNICODEFORMAT, bUnicode, 0L);\r
+       }\r
+#endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)\r
+\r
+#if defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN)\r
+       DWORD GetCurrentView() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (DWORD)::SendMessage(m_hWnd, MCM_GETCURRENTVIEW, 0, 0L);\r
+       }\r
+\r
+       BOOL SetCurrentView(DWORD dwView)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, MCM_SETCURRENTVIEW, 0, dwView);\r
+       }\r
+\r
+       DWORD GetCalendarCount() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (DWORD)::SendMessage(m_hWnd, MCM_GETCALENDARCOUNT, 0, 0L);\r
+       }\r
+\r
+       BOOL GetCalendarGridInfo(PMCGRIDINFO pGridInfo) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, MCM_GETCALENDARGRIDINFO, 0, (LPARAM)pGridInfo);\r
+       }\r
+\r
+       CALID GetCALID() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (CALID)::SendMessage(m_hWnd, MCM_GETCALID, 0, 0L);\r
+       }\r
+\r
+       void SetCALID(CALID calid)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, MCM_SETCALID, (LPARAM)calid, 0L);\r
+       }\r
+\r
+       int GetCalendarBorder() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, MCM_GETCALENDARBORDER, 0, 0L);\r
+       }\r
+\r
+       void SetCalendarBorder(int cxyBorder, BOOL bSet = TRUE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, MCM_SETCALENDARBORDER, (WPARAM)bSet, (LPARAM)cxyBorder);\r
+       }\r
+#endif // defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN)\r
+\r
+// Operations\r
+       int GetMonthRange(DWORD dwFlags, LPSYSTEMTIME lprgSysTimeArray) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, MCM_GETMONTHRANGE, dwFlags, (LPARAM)lprgSysTimeArray);\r
+       }\r
+\r
+       BOOL SetDayState(int nMonths, LPMONTHDAYSTATE lpDayStateArray)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, MCM_SETDAYSTATE, nMonths, (LPARAM)lpDayStateArray);\r
+       }\r
+\r
+       DWORD HitTest(PMCHITTESTINFO pMCHitTest) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (DWORD)::SendMessage(m_hWnd, MCM_HITTEST, 0, (LPARAM)pMCHitTest);\r
+       }\r
+\r
+#if defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN)\r
+       void SizeRectToMin(LPRECT lpRect)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, MCM_SIZERECTTOMIN, 0, (LPARAM)lpRect);\r
+       }\r
+#endif // defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN)\r
+};\r
+\r
+typedef CMonthCalendarCtrlT<ATL::CWindow>   CMonthCalendarCtrl;\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CDateTimePickerCtrl\r
+\r
+template <class TBase>\r
+class CDateTimePickerCtrlT : public TBase\r
+{\r
+public:\r
+// Constructors\r
+       CDateTimePickerCtrlT(HWND hWnd = NULL) : TBase(hWnd)\r
+       { }\r
+\r
+       CDateTimePickerCtrlT< TBase >& operator =(HWND hWnd)\r
+       {\r
+               m_hWnd = hWnd;\r
+               return *this;\r
+       }\r
+\r
+       HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,\r
+                       DWORD dwStyle = 0, DWORD dwExStyle = 0,\r
+                       ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)\r
+       {\r
+               return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);\r
+       }\r
+\r
+// Operations\r
+       static LPCTSTR GetWndClassName()\r
+       {\r
+               return DATETIMEPICK_CLASS;\r
+       }\r
+\r
+       BOOL SetFormat(LPCTSTR lpszFormat)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, DTM_SETFORMAT, 0, (LPARAM)lpszFormat);\r
+       }\r
+\r
+       COLORREF GetMonthCalColor(int nColorType) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (COLORREF)::SendMessage(m_hWnd, DTM_GETMCCOLOR, nColorType, 0L);\r
+       }\r
+\r
+       COLORREF SetMonthCalColor(int nColorType, COLORREF clr)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (COLORREF)::SendMessage(m_hWnd, DTM_SETMCCOLOR, nColorType, clr);\r
+       }\r
+\r
+       DWORD GetRange(LPSYSTEMTIME lpSysTimeArray) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (DWORD)::SendMessage(m_hWnd, DTM_GETRANGE, 0, (LPARAM)lpSysTimeArray);\r
+       }\r
+\r
+       BOOL SetRange(DWORD dwFlags, LPSYSTEMTIME lpSysTimeArray)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, DTM_SETRANGE, dwFlags, (LPARAM)lpSysTimeArray);\r
+       }\r
+\r
+       DWORD GetSystemTime(LPSYSTEMTIME lpSysTime) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (DWORD)::SendMessage(m_hWnd, DTM_GETSYSTEMTIME, 0, (LPARAM)lpSysTime);\r
+       }\r
+\r
+       BOOL SetSystemTime(DWORD dwFlags, LPSYSTEMTIME lpSysTime)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, DTM_SETSYSTEMTIME, dwFlags, (LPARAM)lpSysTime);\r
+       }\r
+\r
+       CMonthCalendarCtrl GetMonthCal() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return CMonthCalendarCtrl((HWND)::SendMessage(m_hWnd, DTM_GETMONTHCAL, 0, 0L));\r
+       }\r
+\r
+#if (_WIN32_IE >= 0x0400)\r
+       CFontHandle GetMonthCalFont() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return CFontHandle((HFONT)::SendMessage(m_hWnd, DTM_GETMCFONT, 0, 0L));\r
+       }\r
+\r
+       void SetMonthCalFont(HFONT hFont, BOOL bRedraw = TRUE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, DTM_SETMCFONT, (WPARAM)hFont, MAKELPARAM(bRedraw, 0));\r
+       }\r
+#endif // (_WIN32_IE >= 0x0400)\r
+\r
+#if defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN)\r
+       DWORD GetMonthCalStyle() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (DWORD)::SendMessage(m_hWnd, DTM_GETMCSTYLE, 0, 0L);\r
+       }\r
+\r
+       DWORD SetMonthCalStyle(DWORD dwStyle)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (DWORD)::SendMessage(m_hWnd, DTM_SETMCSTYLE, 0, (LPARAM)dwStyle);\r
+       }\r
+\r
+       void GetDateTimePickerInfo(LPDATETIMEPICKERINFO lpPickerInfo) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, DTM_GETDATETIMEPICKERINFO, 0, (LPARAM)lpPickerInfo);\r
+       }\r
+\r
+       BOOL GetIdealSize(LPSIZE lpSize) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, DTM_GETIDEALSIZE, 0, (LPARAM)lpSize);\r
+       }\r
+\r
+       void CloseMonthCal()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, DTM_CLOSEMONTHCAL, 0, 0L);\r
+       }\r
+#endif // defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN)\r
+};\r
+\r
+typedef CDateTimePickerCtrlT<ATL::CWindow>   CDateTimePickerCtrl;\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CFlatScrollBarImpl - support for flat scroll bars\r
+\r
+#if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)\r
+\r
+template <class T>\r
+class CFlatScrollBarImpl\r
+{\r
+public:\r
+// Initialization\r
+       BOOL FlatSB_Initialize()\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(::IsWindow(pT->m_hWnd));\r
+               return ::InitializeFlatSB(pT->m_hWnd);\r
+       }\r
+\r
+       HRESULT FlatSB_Uninitialize()\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(::IsWindow(pT->m_hWnd));\r
+               return ::UninitializeFlatSB(pT->m_hWnd);\r
+       }\r
+\r
+// Flat scroll bar properties\r
+       BOOL FlatSB_GetScrollProp(UINT uIndex, LPINT lpnValue) const\r
+       {\r
+               const T* pT = static_cast<const T*>(this);\r
+               ATLASSERT(::IsWindow(pT->m_hWnd));\r
+               return ::FlatSB_GetScrollProp(pT->m_hWnd, uIndex, lpnValue);\r
+       }\r
+\r
+       BOOL FlatSB_SetScrollProp(UINT uIndex, int nValue, BOOL bRedraw = TRUE)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(::IsWindow(pT->m_hWnd));\r
+               return ::FlatSB_SetScrollProp(pT->m_hWnd, uIndex, nValue, bRedraw);\r
+       }\r
+\r
+// Attributes\r
+       int FlatSB_GetScrollPos(int nBar) const\r
+       {\r
+               const T* pT = static_cast<const T*>(this);\r
+               ATLASSERT(::IsWindow(pT->m_hWnd));\r
+               return ::FlatSB_GetScrollPos(pT->m_hWnd, nBar);\r
+       }\r
+\r
+       int FlatSB_SetScrollPos(int nBar, int nPos, BOOL bRedraw = TRUE)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(::IsWindow(pT->m_hWnd));\r
+               return ::FlatSB_SetScrollPos(pT->m_hWnd, nBar, nPos, bRedraw);\r
+       }\r
+\r
+       BOOL FlatSB_GetScrollRange(int nBar, LPINT lpMinPos, LPINT lpMaxPos) const\r
+       {\r
+               const T* pT = static_cast<const T*>(this);\r
+               ATLASSERT(::IsWindow(pT->m_hWnd));\r
+               return ::FlatSB_GetScrollRange(pT->m_hWnd, nBar, lpMinPos, lpMaxPos);\r
+       }\r
+\r
+       BOOL FlatSB_SetScrollRange(int nBar, int nMinPos, int nMaxPos, BOOL bRedraw = TRUE)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(::IsWindow(pT->m_hWnd));\r
+               return ::FlatSB_SetScrollRange(pT->m_hWnd, nBar, nMinPos, nMaxPos, bRedraw);\r
+       }\r
+\r
+       BOOL FlatSB_GetScrollInfo(int nBar, LPSCROLLINFO lpScrollInfo) const\r
+       {\r
+               const T* pT = static_cast<const T*>(this);\r
+               ATLASSERT(::IsWindow(pT->m_hWnd));\r
+               return ::FlatSB_GetScrollInfo(pT->m_hWnd, nBar, lpScrollInfo);\r
+       }\r
+\r
+       int FlatSB_SetScrollInfo(int nBar, LPSCROLLINFO lpScrollInfo, BOOL bRedraw = TRUE)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(::IsWindow(pT->m_hWnd));\r
+               return ::FlatSB_SetScrollInfo(pT->m_hWnd, nBar, lpScrollInfo, bRedraw);\r
+       }\r
+\r
+// Operations\r
+       BOOL FlatSB_ShowScrollBar(UINT nBar, BOOL bShow = TRUE)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(::IsWindow(pT->m_hWnd));\r
+               return ::FlatSB_ShowScrollBar(pT->m_hWnd, nBar, bShow);\r
+       }\r
+\r
+       BOOL FlatSB_EnableScrollBar(UINT uSBFlags, UINT uArrowFlags = ESB_ENABLE_BOTH)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(::IsWindow(pT->m_hWnd));\r
+               return ::FlatSB_EnableScrollBar(pT->m_hWnd, uSBFlags, uArrowFlags);\r
+       }\r
+};\r
+\r
+template <class TBase>\r
+class CFlatScrollBarT : public TBase, public CFlatScrollBarImpl<CFlatScrollBarT< TBase > >\r
+{\r
+public:\r
+       CFlatScrollBarT(HWND hWnd = NULL) : TBase(hWnd)\r
+       { }\r
+\r
+       CFlatScrollBarT< TBase >& operator =(HWND hWnd)\r
+       {\r
+               m_hWnd = hWnd;\r
+               return *this;\r
+       }\r
+};\r
+\r
+typedef CFlatScrollBarT<ATL::CWindow>   CFlatScrollBar;\r
+\r
+#endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CIPAddressCtrl\r
+\r
+#if (_WIN32_IE >= 0x0400)\r
+\r
+template <class TBase>\r
+class CIPAddressCtrlT : public TBase\r
+{\r
+public:\r
+// Constructors\r
+       CIPAddressCtrlT(HWND hWnd = NULL) : TBase(hWnd)\r
+       { }\r
+\r
+       CIPAddressCtrlT< TBase >& operator =(HWND hWnd)\r
+       {\r
+               m_hWnd = hWnd;\r
+               return *this;\r
+       }\r
+\r
+       HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,\r
+                       DWORD dwStyle = 0, DWORD dwExStyle = 0,\r
+                       ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)\r
+       {\r
+               return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);\r
+       }\r
+\r
+// Atteributes\r
+       static LPCTSTR GetWndClassName()\r
+       {\r
+               return WC_IPADDRESS;\r
+       }\r
+\r
+       BOOL IsBlank() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, IPM_ISBLANK, 0, 0L);\r
+       }\r
+\r
+       int GetAddress(LPDWORD lpdwAddress) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, IPM_GETADDRESS, 0, (LPARAM)lpdwAddress);\r
+       }\r
+\r
+       void SetAddress(DWORD dwAddress)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, IPM_SETADDRESS, 0, dwAddress);\r
+       }\r
+\r
+       void ClearAddress()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, IPM_CLEARADDRESS, 0, 0L);\r
+       }\r
+\r
+       void SetRange(int nField, WORD wRange)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, IPM_SETRANGE, nField, wRange);\r
+       }\r
+\r
+       void SetRange(int nField, BYTE nMin, BYTE nMax)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, IPM_SETRANGE, nField, MAKEIPRANGE(nMin, nMax));\r
+       }\r
+\r
+       void SetFocus(int nField)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, IPM_SETFOCUS, nField, 0L);\r
+       }\r
+};\r
+\r
+typedef CIPAddressCtrlT<ATL::CWindow>   CIPAddressCtrl;\r
+\r
+#endif // (_WIN32_IE >= 0x0400)\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CPagerCtrl\r
+\r
+#if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)\r
+\r
+template <class TBase>\r
+class CPagerCtrlT : public TBase\r
+{\r
+public:\r
+// Constructors\r
+       CPagerCtrlT(HWND hWnd = NULL) : TBase(hWnd)\r
+       { }\r
+\r
+       CPagerCtrlT< TBase >& operator =(HWND hWnd)\r
+       {\r
+               m_hWnd = hWnd;\r
+               return *this;\r
+       }\r
+\r
+       HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,\r
+                       DWORD dwStyle = 0, DWORD dwExStyle = 0,\r
+                       ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)\r
+       {\r
+               return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);\r
+       }\r
+\r
+// Attributes\r
+       static LPCTSTR GetWndClassName()\r
+       {\r
+               return WC_PAGESCROLLER;\r
+       }\r
+\r
+       int GetButtonSize() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, PGM_GETBUTTONSIZE, 0, 0L);\r
+       }\r
+\r
+       int SetButtonSize(int nButtonSize)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, PGM_SETBUTTONSIZE, 0, nButtonSize);\r
+       }\r
+\r
+       DWORD GetButtonState(int nButton) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(nButton == PGB_TOPORLEFT || nButton == PGB_BOTTOMORRIGHT);\r
+               return (DWORD)::SendMessage(m_hWnd, PGM_GETBUTTONSTATE, 0, nButton);\r
+       }\r
+\r
+       COLORREF GetBkColor() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (COLORREF)::SendMessage(m_hWnd, PGM_GETBKCOLOR, 0, 0L);\r
+       }\r
+\r
+       COLORREF SetBkColor(COLORREF clrBk)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (COLORREF)::SendMessage(m_hWnd, PGM_SETBKCOLOR, 0, (LPARAM)clrBk);\r
+       }\r
+\r
+       int GetBorder() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, PGM_GETBORDER, 0, 0L);\r
+       }\r
+\r
+       int SetBorder(int nBorderSize)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, PGM_SETBORDER, 0, nBorderSize);\r
+       }\r
+\r
+       int GetPos() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, PGM_GETPOS, 0, 0L);\r
+       }\r
+\r
+       int SetPos(int nPos)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, PGM_SETPOS, 0, nPos);\r
+       }\r
+\r
+// Operations\r
+       void SetChild(HWND hWndChild)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, PGM_SETCHILD, 0, (LPARAM)hWndChild);\r
+       }\r
+\r
+       void ForwardMouse(BOOL bForward = TRUE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, PGM_FORWARDMOUSE, bForward, 0L);\r
+       }\r
+\r
+       void RecalcSize()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, PGM_RECALCSIZE, 0, 0L);\r
+       }\r
+\r
+       void GetDropTarget(IDropTarget** ppDropTarget)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(ppDropTarget != NULL);\r
+               ::SendMessage(m_hWnd, PGM_GETDROPTARGET, 0, (LPARAM)ppDropTarget);\r
+       }\r
+};\r
+\r
+typedef CPagerCtrlT<ATL::CWindow>   CPagerCtrl;\r
+\r
+#endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CLinkCtrl - Windows SYSLINK control\r
+\r
+#if (_WIN32_WINNT >= 0x0501) && !defined(_WIN32_WCE)\r
+\r
+template <class TBase>\r
+class CLinkCtrlT : public TBase\r
+{\r
+public:\r
+// Constructors\r
+       CLinkCtrlT(HWND hWnd = NULL) : TBase(hWnd)\r
+       { }\r
+\r
+       CLinkCtrlT< TBase >& operator =(HWND hWnd)\r
+       {\r
+               m_hWnd = hWnd;\r
+               return *this;\r
+       }\r
+\r
+       HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,\r
+                       DWORD dwStyle = 0, DWORD dwExStyle = 0,\r
+                       ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)\r
+       {\r
+               return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);\r
+       }\r
+\r
+// Attributes\r
+       static LPCTSTR GetWndClassName()\r
+       {\r
+#ifdef _UNICODE\r
+               return WC_LINK;\r
+#else // !_UNICODE\r
+               return "SysLink";\r
+#endif // !_UNICODE\r
+       }\r
+\r
+       int GetIdealHeight(int cxMaxWidth = 0) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, LM_GETIDEALHEIGHT, cxMaxWidth, 0L);\r
+       }\r
+\r
+       BOOL GetItem(PLITEM pLItem) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, LM_GETITEM, 0, (LPARAM)pLItem);\r
+       }\r
+\r
+       BOOL SetItem(PLITEM pLItem)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, LM_SETITEM, 0, (LPARAM)pLItem);\r
+       }\r
+\r
+       // Vista only\r
+       int GetIdealSize(SIZE& size, int cxMaxWidth = 0) const\r
+       {\r
+#ifndef LM_GETIDEALSIZE\r
+               const UINT LM_GETIDEALSIZE = LM_GETIDEALHEIGHT;\r
+#endif\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, LM_GETIDEALSIZE, cxMaxWidth, (LPARAM)&size);\r
+       }\r
+\r
+// Operations\r
+       BOOL HitTest(PLHITTESTINFO pLHitTestInfo) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, LM_HITTEST, 0, (LPARAM)pLHitTestInfo);\r
+       }\r
+};\r
+\r
+typedef CLinkCtrlT<ATL::CWindow>   CLinkCtrl;\r
+\r
+#endif // (_WIN32_WINNT >= 0x0501) && !defined(_WIN32_WCE)\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CCustomDraw - MI class for custom-draw support\r
+\r
+template <class T>\r
+class CCustomDraw\r
+{\r
+public:\r
+#if (_ATL_VER < 0x0700)\r
+       BOOL m_bHandledCD;\r
+\r
+       BOOL IsMsgHandled() const\r
+       {\r
+               return m_bHandledCD;\r
+       }\r
+\r
+       void SetMsgHandled(BOOL bHandled)\r
+       {\r
+               m_bHandledCD = bHandled;\r
+       }\r
+#endif // !(_ATL_VER < 0x0700)\r
+\r
+// Message map and handlers\r
+       BEGIN_MSG_MAP(CCustomDraw< T >)\r
+               NOTIFY_CODE_HANDLER(NM_CUSTOMDRAW, OnCustomDraw)\r
+       ALT_MSG_MAP(1)\r
+               REFLECTED_NOTIFY_CODE_HANDLER(NM_CUSTOMDRAW, OnCustomDraw)\r
+       END_MSG_MAP()\r
+\r
+// message handler\r
+       LRESULT OnCustomDraw(int idCtrl, LPNMHDR pnmh, BOOL& bHandled)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               pT->SetMsgHandled(TRUE);\r
+               LPNMCUSTOMDRAW lpNMCustomDraw = (LPNMCUSTOMDRAW)pnmh;\r
+               DWORD dwRet = 0;\r
+               switch(lpNMCustomDraw->dwDrawStage)\r
+               {\r
+               case CDDS_PREPAINT:\r
+                       dwRet = pT->OnPrePaint(idCtrl, lpNMCustomDraw);\r
+                       break;\r
+               case CDDS_POSTPAINT:\r
+                       dwRet = pT->OnPostPaint(idCtrl, lpNMCustomDraw);\r
+                       break;\r
+               case CDDS_PREERASE:\r
+                       dwRet = pT->OnPreErase(idCtrl, lpNMCustomDraw);\r
+                       break;\r
+               case CDDS_POSTERASE:\r
+                       dwRet = pT->OnPostErase(idCtrl, lpNMCustomDraw);\r
+                       break;\r
+               case CDDS_ITEMPREPAINT:\r
+                       dwRet = pT->OnItemPrePaint(idCtrl, lpNMCustomDraw);\r
+                       break;\r
+               case CDDS_ITEMPOSTPAINT:\r
+                       dwRet = pT->OnItemPostPaint(idCtrl, lpNMCustomDraw);\r
+                       break;\r
+               case CDDS_ITEMPREERASE:\r
+                       dwRet = pT->OnItemPreErase(idCtrl, lpNMCustomDraw);\r
+                       break;\r
+               case CDDS_ITEMPOSTERASE:\r
+                       dwRet = pT->OnItemPostErase(idCtrl, lpNMCustomDraw);\r
+                       break;\r
+#if (_WIN32_IE >= 0x0400)\r
+               case (CDDS_ITEMPREPAINT | CDDS_SUBITEM):\r
+                       dwRet = pT->OnSubItemPrePaint(idCtrl, lpNMCustomDraw);\r
+                       break;\r
+#endif // (_WIN32_IE >= 0x0400)\r
+               default:\r
+                       pT->SetMsgHandled(FALSE);\r
+                       break;\r
+               }\r
+               bHandled = pT->IsMsgHandled();\r
+               return dwRet;\r
+       }\r
+\r
+// Overrideables\r
+       DWORD OnPrePaint(int /*idCtrl*/, LPNMCUSTOMDRAW /*lpNMCustomDraw*/)\r
+       {\r
+               return CDRF_DODEFAULT;\r
+       }\r
+\r
+       DWORD OnPostPaint(int /*idCtrl*/, LPNMCUSTOMDRAW /*lpNMCustomDraw*/)\r
+       {\r
+               return CDRF_DODEFAULT;\r
+       }\r
+\r
+       DWORD OnPreErase(int /*idCtrl*/, LPNMCUSTOMDRAW /*lpNMCustomDraw*/)\r
+       {\r
+               return CDRF_DODEFAULT;\r
+       }\r
+\r
+       DWORD OnPostErase(int /*idCtrl*/, LPNMCUSTOMDRAW /*lpNMCustomDraw*/)\r
+       {\r
+               return CDRF_DODEFAULT;\r
+       }\r
+\r
+       DWORD OnItemPrePaint(int /*idCtrl*/, LPNMCUSTOMDRAW /*lpNMCustomDraw*/)\r
+       {\r
+               return CDRF_DODEFAULT;\r
+       }\r
+\r
+       DWORD OnItemPostPaint(int /*idCtrl*/, LPNMCUSTOMDRAW /*lpNMCustomDraw*/)\r
+       {\r
+               return CDRF_DODEFAULT;\r
+       }\r
+\r
+       DWORD OnItemPreErase(int /*idCtrl*/, LPNMCUSTOMDRAW /*lpNMCustomDraw*/)\r
+       {\r
+               return CDRF_DODEFAULT;\r
+       }\r
+\r
+       DWORD OnItemPostErase(int /*idCtrl*/, LPNMCUSTOMDRAW /*lpNMCustomDraw*/)\r
+       {\r
+               return CDRF_DODEFAULT;\r
+       }\r
+\r
+#if (_WIN32_IE >= 0x0400)\r
+       DWORD OnSubItemPrePaint(int /*idCtrl*/, LPNMCUSTOMDRAW /*lpNMCustomDraw*/)\r
+       {\r
+               return CDRF_DODEFAULT;\r
+       }\r
+#endif // (_WIN32_IE >= 0x0400)\r
+};\r
+\r
+\r
+// --- Windows CE common controls ---\r
+\r
+#ifdef _WIN32_WCE\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CCECommandBarCtrl\r
+\r
+template <class TBase>\r
+class CCECommandBarCtrlT : public TBase\r
+{\r
+public:\r
+// Constructors\r
+       CCECommandBarCtrlT(HWND hWnd = NULL) : TBase(hWnd) { }\r
+\r
+       CCECommandBarCtrlT< TBase >& operator=(HWND hWnd)\r
+       {\r
+               m_hWnd = hWnd;\r
+               return *this;\r
+       }\r
+\r
+// Attributes\r
+       BOOL IsVisible() const\r
+       {\r
+               return IsWindowVisible();\r
+       }\r
+\r
+       int GetHeight() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return ::CommandBar_Height(m_hWnd);\r
+       }\r
+\r
+       HMENU GetMenu(WORD wButton) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return ::CommandBar_GetMenu(m_hWnd, wButton);\r
+       }\r
+\r
+// Operations\r
+       HWND Create(HWND hWndParent, int nCmdBarID)\r
+       {\r
+               m_hWnd = ::CommandBar_Create(ModuleHelper::GetModuleInstance(), hWndParent, nCmdBarID);\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return m_hWnd;\r
+       }\r
+\r
+       void Destroy()\r
+       {\r
+               DestroyWindow();\r
+       }\r
+\r
+       BOOL Show(BOOL bShow = TRUE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return ::CommandBar_Show(m_hWnd, bShow);\r
+       }\r
+\r
+       BOOL DrawMenuBar(WORD wButton)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return ::CommandBar_DrawMenuBar(m_hWnd, wButton);\r
+       }\r
+\r
+       BOOL AddAdornments(DWORD dwFlags = 0)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return ::CommandBar_AddAdornments(m_hWnd, dwFlags, 0);\r
+       }\r
+\r
+       int AddBitmap(int nBitmapID, int nNumImages)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return ::CommandBar_AddBitmap(m_hWnd, ModuleHelper::GetResourceInstance(), nBitmapID, nNumImages, 16, 16);\r
+       }\r
+\r
+       BOOL AddButtons(UINT uNumButtons, LPTBBUTTON lpButtons)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return CommandBar_AddButtons(m_hWnd, uNumButtons, lpButtons);\r
+       }\r
+\r
+       BOOL AddToolTips(UINT uNumToolTips, LPTSTR lpToolTips)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return CommandBar_AddToolTips(m_hWnd, uNumToolTips, lpToolTips);\r
+       }\r
+\r
+       BOOL InsertButton(int nButton, LPTBBUTTON lpButton)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return CommandBar_InsertButton(m_hWnd, nButton, lpButton);\r
+       }\r
+\r
+       HWND InsertComboBox(int nWidth, UINT dwStyle, WORD wComboBoxID, WORD wButton)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return ::CommandBar_InsertComboBox(m_hWnd, ModuleHelper::GetModuleInstance(), nWidth, dwStyle, wComboBoxID, wButton);\r
+       }\r
+\r
+       BOOL InsertMenubar(WORD wMenuID, WORD wButton)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return ::CommandBar_InsertMenubar(m_hWnd, ModuleHelper::GetResourceInstance(), wMenuID, wButton);\r
+       }\r
+\r
+       BOOL InsertMenubarEx(ATL::_U_STRINGorID menu, WORD wButton)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return ::CommandBar_InsertMenubarEx(m_hWnd, ModuleHelper::GetResourceInstance(), (LPTSTR)menu.m_lpstr, wButton);\r
+       }\r
+\r
+       BOOL IsCommandBarMessage(LPMSG lpMsg)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return ::IsCommandBarMessage(m_hWnd, lpMsg);\r
+       }\r
+};\r
+\r
+#if defined(_AYGSHELL_H_) || defined(__AYGSHELL_H__) // PPC MenuBar\r
+       typedef CCECommandBarCtrlT<CToolBarCtrl>        CMenuBarCtrl;\r
+#else\r
+       typedef CCECommandBarCtrlT<CToolBarCtrl>        CCECommandBarCtrl;\r
+#endif // defined(_AYGSHELL_H_) || defined(__AYGSHELL_H__)\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CCECommandBandsCtrl\r
+\r
+template <class TBase>\r
+class CCECommandBandsCtrlT : public TBase\r
+{\r
+public:\r
+// Constructors\r
+       CCECommandBandsCtrlT(HWND hWnd = NULL) : TBase(hWnd) { }\r
+\r
+       CCECommandBandsCtrlT< TBase >& operator=(HWND hWnd)\r
+       {\r
+               m_hWnd = hWnd;\r
+               return *this;\r
+       }\r
+\r
+// Attributes\r
+       BOOL IsVisible() const\r
+       {\r
+               return IsWindowVisible();\r
+       }\r
+\r
+#if (_WIN32_IE >= 0x0400)\r
+       UINT GetHeight() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return CommandBands_Height(m_hWnd);\r
+       }\r
+#endif // (_WIN32_IE >= 0x0400)\r
+\r
+       HWND GetCommandBar(UINT uBand) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return ::CommandBands_GetCommandBar(m_hWnd, uBand);\r
+       }\r
+\r
+       BOOL GetRestoreInformation(UINT uBand, LPCOMMANDBANDSRESTOREINFO pcbr) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return ::CommandBands_GetRestoreInformation(m_hWnd, uBand, pcbr);\r
+       }\r
+\r
+// Operations\r
+       HWND Create(HWND hWndParent, UINT wID, DWORD dwStyles, HIMAGELIST hImageList = NULL)\r
+       {\r
+               m_hWnd = ::CommandBands_Create(ModuleHelper::GetModuleInstance(), hWndParent, wID, dwStyles, hImageList);\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return m_hWnd;\r
+       }\r
+\r
+       BOOL AddAdornments(DWORD dwFlags = 0, LPREBARBANDINFO prbbi = NULL)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return ::CommandBands_AddAdornments(m_hWnd, ModuleHelper::GetModuleInstance(), dwFlags, prbbi);\r
+       }\r
+\r
+       BOOL AddBands(UINT uBandCount, LPREBARBANDINFO prbbi)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return ::CommandBands_AddBands(m_hWnd, ModuleHelper::GetModuleInstance(), uBandCount, prbbi);\r
+       }\r
+\r
+       BOOL Show(BOOL bShow = TRUE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return ::CommandBands_Show(m_hWnd, bShow);\r
+       }\r
+};\r
+\r
+typedef CCECommandBandsCtrlT<ATL::CWindow>     CCECommandBandsCtrl;\r
+\r
+#endif // _WIN32_WCE\r
+\r
+}; // namespace WTL\r
+\r
+#endif // __ATLCTRLS_H__\r
diff --git a/WTL80/include/atlctrlw.h b/WTL80/include/atlctrlw.h
new file mode 100644 (file)
index 0000000..3bf16ee
--- /dev/null
@@ -0,0 +1,4161 @@
+// Windows Template Library - WTL version 8.0\r
+// Copyright (C) Microsoft Corporation. All rights reserved.\r
+//\r
+// This file is a part of the Windows Template Library.\r
+// The use and distribution terms for this software are covered by the\r
+// Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php)\r
+// which can be found in the file CPL.TXT at the root of this distribution.\r
+// By using this software in any fashion, you are agreeing to be bound by\r
+// the terms of this license. You must not remove this notice, or\r
+// any other, from this software.\r
+\r
+#ifndef __ATLCTRLW_H__\r
+#define __ATLCTRLW_H__\r
+\r
+#pragma once\r
+\r
+#ifndef __cplusplus\r
+       #error ATL requires C++ compilation (use a .cpp suffix)\r
+#endif\r
+\r
+#ifdef _WIN32_WCE\r
+       #error atlctrlw.h is not supported on Windows CE\r
+#endif\r
+\r
+#ifndef __ATLAPP_H__\r
+       #error atlctrlw.h requires atlapp.h to be included first\r
+#endif\r
+\r
+#ifndef __ATLCTRLS_H__\r
+       #error atlctrlw.h requires atlctrls.h to be included first\r
+#endif\r
+\r
+#if (_WIN32_IE < 0x0400)\r
+       #error atlctrlw.h requires _WIN32_IE >= 0x0400\r
+#endif\r
+\r
+// Define _WTL_CMDBAR_VISTA_MENUS as 0 to exclude Vista menus support\r
+#if !defined(_WTL_CMDBAR_VISTA_MENUS) && (WINVER >= 0x0500) && (_WIN32_WINNT >= 0x0501) && (_WIN32_IE >= 0x0501)\r
+  #define _WTL_CMDBAR_VISTA_MENUS 1\r
+#endif\r
+\r
+#if _WTL_CMDBAR_VISTA_MENUS\r
+  #if !((_WIN32_WINNT >= 0x0501) && (_WIN32_IE >= 0x0501))\r
+       #error _WTL_CMDBAR_VISTA_MENUS requires (_WIN32_WINNT >= 0x0501) && (_WIN32_IE >= 0x0501)\r
+  #endif\r
+#endif\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Classes in this file:\r
+//\r
+// CCommandBarCtrlImpl<T, TBase, TWinTraits>\r
+// CCommandBarCtrl\r
+// CMDICommandBarCtrlImpl<T, TBase, TWinTraits>\r
+// CMDICommandBarCtrl\r
+\r
+\r
+namespace WTL\r
+{\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Command Bars\r
+\r
+// Window Styles:\r
+#define CBRWS_TOP              CCS_TOP\r
+#define CBRWS_BOTTOM           CCS_BOTTOM\r
+#define CBRWS_NORESIZE         CCS_NORESIZE\r
+#define CBRWS_NOPARENTALIGN    CCS_NOPARENTALIGN\r
+#define CBRWS_NODIVIDER                CCS_NODIVIDER\r
+\r
+// Extended styles\r
+#define CBR_EX_TRANSPARENT     0x00000001L\r
+#define CBR_EX_SHAREMENU       0x00000002L\r
+#define CBR_EX_ALTFOCUSMODE    0x00000004L\r
+#define CBR_EX_TRACKALWAYS     0x00000008L\r
+#define CBR_EX_NOVISTAMENUS    0x00000010L\r
+\r
+// standard command bar styles\r
+#define ATL_SIMPLE_CMDBAR_PANE_STYLE \\r
+       (WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | CBRWS_NODIVIDER | CBRWS_NORESIZE | CBRWS_NOPARENTALIGN)\r
+\r
+// Messages - support chevrons for frame windows\r
+#define CBRM_GETCMDBAR                 (WM_USER + 301) // returns command bar HWND\r
+#define CBRM_GETMENU                   (WM_USER + 302) // returns loaded or attached menu\r
+#define CBRM_TRACKPOPUPMENU            (WM_USER + 303) // displays a popup menu\r
+\r
+typedef struct tagCBRPOPUPMENU\r
+{\r
+       int cbSize;\r
+       HMENU hMenu;         // popup menu do display\r
+       UINT uFlags;         // TPM_* flags for ::TrackPopupMenuEx\r
+       int x;\r
+       int y;\r
+       LPTPMPARAMS lptpm;   // ptr to TPMPARAMS for ::TrackPopupMenuEx\r
+} CBRPOPUPMENU, *LPCBRPOPUPMENU;\r
+\r
+// helper class\r
+template <class T>\r
+class CSimpleStack : public ATL::CSimpleArray< T >\r
+{\r
+public:\r
+       BOOL Push(T t)\r
+       {\r
+#ifdef _CMDBAR_EXTRA_TRACE\r
+               ATLTRACE2(atlTraceUI, 0, _T("CmdBar - STACK-PUSH (%8.8X) size = %i\n"), t, GetSize());\r
+#endif\r
+               return Add(t);\r
+       }\r
+\r
+       T Pop()\r
+       {\r
+               int nLast = GetSize() - 1;\r
+               if(nLast < 0)\r
+                       return NULL;   // must be able to convert to NULL\r
+               T t = m_aT[nLast];\r
+#ifdef _CMDBAR_EXTRA_TRACE\r
+               ATLTRACE2(atlTraceUI, 0, _T("CmdBar - STACK-POP (%8.8X) size = %i\n"), t, GetSize());\r
+#endif\r
+               if(!RemoveAt(nLast))\r
+                       return NULL;\r
+               return t;\r
+       }\r
+\r
+       T GetCurrent()\r
+       {\r
+               int nLast = GetSize() - 1;\r
+               if(nLast < 0)\r
+                       return NULL;   // must be able to convert to NULL\r
+               return m_aT[nLast];\r
+       }\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CCommandBarCtrlBase - base class for the Command Bar implementation\r
+\r
+class CCommandBarCtrlBase : public CToolBarCtrl\r
+{\r
+public:\r
+       struct _MsgHookData\r
+       {\r
+               HHOOK hMsgHook;\r
+               DWORD dwUsage;\r
+\r
+               _MsgHookData() : hMsgHook(NULL), dwUsage(0)\r
+               { }\r
+       };\r
+\r
+       typedef ATL::CSimpleMap<DWORD, _MsgHookData*>   CMsgHookMap;\r
+       static CMsgHookMap* s_pmapMsgHook;\r
+\r
+       static HHOOK s_hCreateHook;\r
+       static bool s_bW2K;  // For animation flag\r
+       static CCommandBarCtrlBase* s_pCurrentBar;\r
+       static bool s_bStaticInit;\r
+\r
+       CSimpleStack<HWND> m_stackMenuWnd;\r
+       CSimpleStack<HMENU> m_stackMenuHandle;\r
+\r
+       HWND m_hWndHook;\r
+       DWORD m_dwMagic;\r
+\r
+\r
+       CCommandBarCtrlBase() : m_hWndHook(NULL), m_dwMagic(1314)\r
+       {\r
+               // init static variables\r
+               if(!s_bStaticInit)\r
+               {\r
+                       CStaticDataInitCriticalSectionLock lock;\r
+                       if(FAILED(lock.Lock()))\r
+                       {\r
+                               ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CCommandBarCtrlBase::CCommandBarCtrlBase.\n"));\r
+                               ATLASSERT(FALSE);\r
+                               return;\r
+                       }\r
+\r
+                       if(!s_bStaticInit)\r
+                       {\r
+                               // Just in case...\r
+                               AtlInitCommonControls(ICC_COOL_CLASSES | ICC_BAR_CLASSES);\r
+                               // Animation on Win2000 only\r
+                               s_bW2K = !AtlIsOldWindows();\r
+                               // done\r
+                               s_bStaticInit = true;\r
+                       }\r
+\r
+                       lock.Unlock();\r
+               }\r
+       }\r
+\r
+       bool IsCommandBarBase() const { return m_dwMagic == 1314; }\r
+};\r
+\r
+__declspec(selectany) CCommandBarCtrlBase::CMsgHookMap* CCommandBarCtrlBase::s_pmapMsgHook = NULL;\r
+__declspec(selectany) HHOOK CCommandBarCtrlBase::s_hCreateHook = NULL;\r
+__declspec(selectany) CCommandBarCtrlBase* CCommandBarCtrlBase::s_pCurrentBar = NULL;\r
+__declspec(selectany) bool CCommandBarCtrlBase::s_bW2K = false;\r
+__declspec(selectany) bool CCommandBarCtrlBase::s_bStaticInit = false;\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CCommandBarCtrl - ATL implementation of Command Bars\r
+\r
+template <class T, class TBase = CCommandBarCtrlBase, class TWinTraits = ATL::CControlWinTraits>\r
+class ATL_NO_VTABLE CCommandBarCtrlImpl : public ATL::CWindowImpl< T, TBase, TWinTraits >\r
+{\r
+public:\r
+       DECLARE_WND_SUPERCLASS(NULL, TBase::GetWndClassName())\r
+\r
+// Declarations\r
+       struct _MenuItemData    // menu item data\r
+       {\r
+               DWORD dwMagic;\r
+               LPTSTR lpstrText;\r
+               UINT fType;\r
+               UINT fState;\r
+               int iButton;\r
+\r
+               _MenuItemData() { dwMagic = 0x1313; }\r
+               bool IsCmdBarMenuItem() { return (dwMagic == 0x1313); }\r
+       };\r
+\r
+       struct _ToolBarData     // toolbar resource data\r
+       {\r
+               WORD wVersion;\r
+               WORD wWidth;\r
+               WORD wHeight;\r
+               WORD wItemCount;\r
+               //WORD aItems[wItemCount]\r
+\r
+               WORD* items()\r
+                       { return (WORD*)(this+1); }\r
+       };\r
+\r
+// Constants\r
+       enum _CmdBarDrawConstants\r
+       {\r
+               s_kcxGap = 1,\r
+               s_kcxTextMargin = 2,\r
+               s_kcxButtonMargin = 3,\r
+               s_kcyButtonMargin = 3\r
+       };\r
+\r
+       enum\r
+       {\r
+               _nMaxMenuItemTextLength = 100,\r
+               _chChevronShortcut = _T('/')\r
+       };\r
+\r
+#ifndef DT_HIDEPREFIX\r
+       enum { DT_HIDEPREFIX = 0x00100000 };\r
+#endif // !DT_HIDEPREFIX\r
+\r
+// Data members\r
+       HMENU m_hMenu;\r
+       HIMAGELIST m_hImageList;\r
+       ATL::CSimpleValArray<WORD> m_arrCommand;\r
+\r
+       DWORD m_dwExtendedStyle;   // Command Bar specific extended styles\r
+\r
+       ATL::CContainedWindow m_wndParent;\r
+\r
+       bool m_bMenuActive:1;\r
+       bool m_bAttachedMenu:1;\r
+       bool m_bImagesVisible:1;\r
+       bool m_bPopupItem:1;\r
+       bool m_bContextMenu:1;\r
+       bool m_bEscapePressed:1;\r
+       bool m_bSkipMsg:1;\r
+       bool m_bParentActive:1;\r
+       bool m_bFlatMenus:1;\r
+       bool m_bUseKeyboardCues:1;\r
+       bool m_bShowKeyboardCues:1;\r
+       bool m_bAllowKeyboardCues:1;\r
+       bool m_bKeyboardInput:1;\r
+       bool m_bAlphaImages:1;\r
+       bool m_bLayoutRTL:1;\r
+       bool m_bSkipPostDown:1;\r
+       bool m_bVistaMenus:1;\r
+\r
+       int m_nPopBtn;\r
+       int m_nNextPopBtn;\r
+\r
+       SIZE m_szBitmap;\r
+       SIZE m_szButton;\r
+\r
+       COLORREF m_clrMask;\r
+       CFont m_fontMenu;   // used internally, only to measure text\r
+\r
+       UINT m_uSysKey;\r
+\r
+       HWND m_hWndFocus;   // Alternate focus mode\r
+\r
+       int m_cxExtraSpacing;\r
+\r
+#if _WTL_CMDBAR_VISTA_MENUS\r
+       ATL::CSimpleValArray<HBITMAP> m_arrVistaBitmap;   // Bitmaps for Vista menus\r
+#endif // _WTL_CMDBAR_VISTA_MENUS\r
+\r
+// Constructor/destructor\r
+       CCommandBarCtrlImpl() : \r
+                       m_hMenu(NULL), \r
+                       m_hImageList(NULL), \r
+                       m_wndParent(this, 1), \r
+                       m_bMenuActive(false), \r
+                       m_bAttachedMenu(false), \r
+                       m_nPopBtn(-1), \r
+                       m_nNextPopBtn(-1), \r
+                       m_bPopupItem(false),\r
+                       m_bImagesVisible(true),\r
+                       m_bSkipMsg(false),\r
+                       m_uSysKey(0),\r
+                       m_hWndFocus(NULL),\r
+                       m_bContextMenu(false),\r
+                       m_bEscapePressed(false),\r
+                       m_clrMask(RGB(192, 192, 192)),\r
+                       m_dwExtendedStyle(CBR_EX_TRANSPARENT | CBR_EX_SHAREMENU | CBR_EX_TRACKALWAYS),\r
+                       m_bParentActive(true),\r
+                       m_bFlatMenus(false),\r
+                       m_bUseKeyboardCues(false),\r
+                       m_bShowKeyboardCues(false),\r
+                       m_bAllowKeyboardCues(true),\r
+                       m_bKeyboardInput(false),\r
+                       m_cxExtraSpacing(0),\r
+                       m_bAlphaImages(false),\r
+                       m_bLayoutRTL(false),\r
+                       m_bSkipPostDown(false),\r
+                       m_bVistaMenus(false)\r
+       {\r
+               SetImageSize(16, 15);   // default\r
+       }\r
+\r
+       ~CCommandBarCtrlImpl()\r
+       {\r
+               if(m_wndParent.IsWindow())\r
+/*scary!*/                     m_wndParent.UnsubclassWindow();\r
+\r
+               if(m_hMenu != NULL && (m_dwExtendedStyle & CBR_EX_SHAREMENU) == 0)\r
+                       ::DestroyMenu(m_hMenu);\r
+\r
+               if(m_hImageList != NULL)\r
+                       ::ImageList_Destroy(m_hImageList);\r
+       }\r
+\r
+// Attributes\r
+       DWORD GetCommandBarExtendedStyle() const\r
+       {\r
+               return m_dwExtendedStyle;\r
+       }\r
+\r
+       DWORD SetCommandBarExtendedStyle(DWORD dwExtendedStyle, DWORD dwMask = 0)\r
+       {\r
+               DWORD dwPrevStyle = m_dwExtendedStyle;\r
+               if(dwMask == 0)\r
+                       m_dwExtendedStyle = dwExtendedStyle;\r
+               else\r
+                       m_dwExtendedStyle = (m_dwExtendedStyle & ~dwMask) | (dwExtendedStyle & dwMask);\r
+               return dwPrevStyle;\r
+       }\r
+\r
+       CMenuHandle GetMenu() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return m_hMenu;\r
+       }\r
+\r
+       COLORREF GetImageMaskColor() const\r
+       {\r
+               return m_clrMask;\r
+       }\r
+\r
+       COLORREF SetImageMaskColor(COLORREF clrMask)\r
+       {\r
+               COLORREF clrOld = m_clrMask;\r
+               m_clrMask = clrMask;\r
+               return clrOld;\r
+       }\r
+\r
+       bool GetImagesVisible() const\r
+       {\r
+               return m_bImagesVisible;\r
+       }\r
+\r
+       bool SetImagesVisible(bool bVisible)\r
+       {\r
+               bool bOld = m_bImagesVisible;\r
+               m_bImagesVisible = bVisible;\r
+               return bOld;\r
+       }\r
+\r
+       void GetImageSize(SIZE& size) const\r
+       {\r
+               size = m_szBitmap;\r
+       }\r
+\r
+       bool SetImageSize(SIZE& size)\r
+       {\r
+               return SetImageSize(size.cx, size.cy);\r
+       }\r
+\r
+       bool SetImageSize(int cx, int cy)\r
+       {\r
+               if(m_hImageList != NULL)\r
+               {\r
+                       if(::ImageList_GetImageCount(m_hImageList) == 0)   // empty\r
+                       {\r
+                               ::ImageList_Destroy(m_hImageList);\r
+                               m_hImageList = NULL;\r
+                       }\r
+                       else\r
+                       {\r
+                               return false;   // can't set, image list exists\r
+                       }\r
+               }\r
+\r
+               if(cx == 0 || cy == 0)\r
+                       return false;\r
+\r
+               m_szBitmap.cx = cx;\r
+               m_szBitmap.cy = cy;\r
+               m_szButton.cx = m_szBitmap.cx + 2 * s_kcxButtonMargin;\r
+               m_szButton.cy = m_szBitmap.cy + 2 * s_kcyButtonMargin;\r
+\r
+               return true;\r
+       }\r
+\r
+       bool GetAlphaImages() const\r
+       {\r
+               return m_bAlphaImages;\r
+       }\r
+\r
+       bool SetAlphaImages(bool bAlphaImages)\r
+       {\r
+               if(m_hImageList != NULL)\r
+               {\r
+                       if(::ImageList_GetImageCount(m_hImageList) == 0)   // empty\r
+                       {\r
+                               ::ImageList_Destroy(m_hImageList);\r
+                               m_hImageList = NULL;\r
+                       }\r
+                       else\r
+                       {\r
+                               return false;   // can't set, image list exists\r
+                       }\r
+               }\r
+\r
+               m_bAlphaImages = bAlphaImages;\r
+               return true;\r
+       }\r
+\r
+       HWND GetCmdBar() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (HWND)::SendMessage(m_hWnd, CBRM_GETCMDBAR, 0, 0L);\r
+       }\r
+\r
+// Methods\r
+       HWND Create(HWND hWndParent, RECT& rcPos, LPCTSTR szWindowName = NULL,\r
+                       DWORD dwStyle = 0, DWORD dwExStyle = 0,\r
+                       UINT nID = 0, LPVOID lpCreateParam = NULL)\r
+       {\r
+               // These styles are required for command bars\r
+               dwStyle |= TBSTYLE_LIST | TBSTYLE_FLAT;\r
+#if (_MSC_VER >= 1300)\r
+               return ATL::CWindowImpl< T, TBase, TWinTraits >::Create(hWndParent, rcPos, szWindowName, dwStyle, dwExStyle, nID, lpCreateParam);\r
+#else // !(_MSC_VER >= 1300)\r
+               typedef ATL::CWindowImpl< T, TBase, TWinTraits >   _baseClass;\r
+               return _baseClass::Create(hWndParent, rcPos, szWindowName, dwStyle, dwExStyle, nID, lpCreateParam);\r
+#endif // !(_MSC_VER >= 1300)\r
+       }\r
+\r
+       BOOL AttachToWindow(HWND hWnd)\r
+       {\r
+               ATLASSERT(m_hWnd == NULL);\r
+               ATLASSERT(::IsWindow(hWnd));\r
+               BOOL bRet = SubclassWindow(hWnd);\r
+               if(bRet)\r
+               {\r
+                       m_bAttachedMenu = true;\r
+                       T* pT = static_cast<T*>(this);\r
+                       pT->GetSystemSettings();\r
+               }\r
+               return bRet;\r
+       }\r
+\r
+       BOOL LoadMenu(ATL::_U_STRINGorID menu)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+\r
+               if(m_bAttachedMenu)   // doesn't work in this mode\r
+                       return FALSE;\r
+               if(menu.m_lpstr == NULL)\r
+                       return FALSE;\r
+\r
+               HMENU hMenu = ::LoadMenu(ModuleHelper::GetResourceInstance(), menu.m_lpstr);\r
+               if(hMenu == NULL)\r
+                       return FALSE;\r
+\r
+               return AttachMenu(hMenu);\r
+       }\r
+\r
+       BOOL AttachMenu(HMENU hMenu)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(hMenu == NULL || ::IsMenu(hMenu));\r
+               if(hMenu != NULL && !::IsMenu(hMenu))\r
+                       return FALSE;\r
+\r
+#if _WTL_CMDBAR_VISTA_MENUS\r
+               // remove Vista bitmaps if used\r
+               if(m_bVistaMenus && (m_hMenu != NULL))\r
+               {\r
+                       T* pT = static_cast<T*>(this);\r
+                       pT->_RemoveVistaBitmapsFromMenu();\r
+               }\r
+#endif // _WTL_CMDBAR_VISTA_MENUS\r
+\r
+               // destroy old menu, if needed, and set new one\r
+               if(m_hMenu != NULL && (m_dwExtendedStyle & CBR_EX_SHAREMENU) == 0)\r
+                       ::DestroyMenu(m_hMenu);\r
+\r
+               m_hMenu = hMenu;\r
+\r
+               if(m_bAttachedMenu)   // Nothing else in this mode\r
+                       return TRUE;\r
+\r
+               // Build buttons according to menu\r
+               SetRedraw(FALSE);\r
+\r
+               // Clear all buttons\r
+               int nCount = GetButtonCount();\r
+               for(int i = 0; i < nCount; i++)\r
+                       ATLVERIFY(DeleteButton(0) != FALSE);\r
+\r
+               // Add buttons for each menu item\r
+               if(m_hMenu != NULL)\r
+               {\r
+                       int nItems = ::GetMenuItemCount(m_hMenu);\r
+\r
+                       T* pT = static_cast<T*>(this);\r
+                       pT;   // avoid level 4 warning\r
+                       TCHAR szString[pT->_nMaxMenuItemTextLength];\r
+                       for(int i = 0; i < nItems; i++)\r
+                       {\r
+                               CMenuItemInfo mii;\r
+                               mii.fMask = MIIM_TYPE | MIIM_STATE | MIIM_SUBMENU;\r
+                               mii.fType = MFT_STRING;\r
+                               mii.dwTypeData = szString;\r
+                               mii.cch = pT->_nMaxMenuItemTextLength;\r
+                               BOOL bRet = ::GetMenuItemInfo(m_hMenu, i, TRUE, &mii);\r
+                               ATLASSERT(bRet);\r
+                               // If we have more than the buffer, we assume we have bitmaps bits\r
+                               if(lstrlen(szString) > pT->_nMaxMenuItemTextLength - 1)\r
+                               {\r
+                                       mii.fType = MFT_BITMAP;\r
+                                       ::SetMenuItemInfo(m_hMenu, i, TRUE, &mii);\r
+                                       szString[0] = 0;\r
+                               }\r
+\r
+                               // NOTE: Command Bar currently supports only drop-down menu items\r
+                               ATLASSERT(mii.hSubMenu != NULL);\r
+\r
+                               TBBUTTON btn = { 0 };\r
+                               btn.iBitmap = 0;\r
+                               btn.idCommand = i;\r
+                               btn.fsState = (BYTE)(((mii.fState & MFS_DISABLED) == 0) ? TBSTATE_ENABLED : 0);\r
+                               btn.fsStyle = TBSTYLE_BUTTON | TBSTYLE_AUTOSIZE | TBSTYLE_DROPDOWN;\r
+                               btn.dwData = 0;\r
+                               btn.iString = 0;\r
+\r
+                               bRet = InsertButton(-1, &btn);\r
+                               ATLASSERT(bRet);\r
+\r
+                               TBBUTTONINFO bi = { 0 };\r
+                               bi.cbSize = sizeof(TBBUTTONINFO);\r
+                               bi.dwMask = TBIF_TEXT;\r
+                               bi.pszText = szString;\r
+\r
+                               bRet = SetButtonInfo(i, &bi);\r
+                               ATLASSERT(bRet);\r
+                       }\r
+               }\r
+\r
+               SetRedraw(TRUE);\r
+               Invalidate();\r
+               UpdateWindow();\r
+\r
+               return TRUE;\r
+       }\r
+\r
+       BOOL LoadImages(ATL::_U_STRINGorID image)\r
+       {\r
+               return _LoadImagesHelper(image, false);\r
+       }\r
+\r
+       BOOL LoadMappedImages(UINT nIDImage, UINT nFlags = 0, LPCOLORMAP lpColorMap = NULL, int nMapSize = 0)\r
+       {\r
+               return _LoadImagesHelper(nIDImage, true, nFlags , lpColorMap, nMapSize);\r
+       }\r
+\r
+       BOOL _LoadImagesHelper(ATL::_U_STRINGorID image, bool bMapped, UINT nFlags = 0, LPCOLORMAP lpColorMap = NULL, int nMapSize = 0)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               HINSTANCE hInstance = ModuleHelper::GetResourceInstance();\r
+\r
+               HRSRC hRsrc = ::FindResource(hInstance, image.m_lpstr, (LPTSTR)RT_TOOLBAR);\r
+               if(hRsrc == NULL)\r
+                       return FALSE;\r
+\r
+               HGLOBAL hGlobal = ::LoadResource(hInstance, hRsrc);\r
+               if(hGlobal == NULL)\r
+                       return FALSE;\r
+\r
+               _ToolBarData* pData = (_ToolBarData*)::LockResource(hGlobal);\r
+               if(pData == NULL)\r
+                       return FALSE;\r
+               ATLASSERT(pData->wVersion == 1);\r
+\r
+               WORD* pItems = pData->items();\r
+               int nItems = pData->wItemCount;\r
+\r
+               // Set internal data\r
+               SetImageSize(pData->wWidth, pData->wHeight);\r
+\r
+               // Create image list if needed\r
+               if(m_hImageList == NULL)\r
+               {\r
+                       // Check if the bitmap is 32-bit (alpha channel) bitmap (valid for Windows XP only)\r
+                       T* pT = static_cast<T*>(this);\r
+                       m_bAlphaImages = AtlIsAlphaBitmapResource(image);\r
+\r
+                       if(!pT->CreateInternalImageList(pData->wItemCount))\r
+                               return FALSE;\r
+               }\r
+\r
+#if _WTL_CMDBAR_VISTA_MENUS\r
+               int nOldImageCount = ::ImageList_GetImageCount(m_hImageList);\r
+#endif // _WTL_CMDBAR_VISTA_MENUS\r
+\r
+               // Add bitmap to our image list\r
+               CBitmap bmp;\r
+               if(bMapped)\r
+               {\r
+                       ATLASSERT(HIWORD(PtrToUlong(image.m_lpstr)) == 0);   // if mapped, must be a numeric ID\r
+                       int nIDImage = (int)(short)LOWORD(PtrToUlong(image.m_lpstr));\r
+                       bmp.LoadMappedBitmap(nIDImage, (WORD)nFlags, lpColorMap, nMapSize);\r
+               }\r
+               else\r
+               {\r
+                       if(m_bAlphaImages)\r
+                               bmp = (HBITMAP)::LoadImage(ModuleHelper::GetResourceInstance(), image.m_lpstr, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_DEFAULTSIZE);\r
+                       else\r
+                               bmp.LoadBitmap(image.m_lpstr);\r
+               }\r
+               ATLASSERT(bmp.m_hBitmap != NULL);\r
+               if(bmp.m_hBitmap == NULL)\r
+                       return FALSE;\r
+               if(::ImageList_AddMasked(m_hImageList, bmp, m_clrMask) == -1)\r
+                       return FALSE;\r
+\r
+               // Fill the array with command IDs\r
+               for(int i = 0; i < nItems; i++)\r
+               {\r
+                       if(pItems[i] != 0)\r
+                               m_arrCommand.Add(pItems[i]);\r
+               }\r
+\r
+               int nImageCount = ::ImageList_GetImageCount(m_hImageList);\r
+               ATLASSERT(nImageCount == m_arrCommand.GetSize());\r
+               if(nImageCount != m_arrCommand.GetSize())\r
+                       return FALSE;\r
+\r
+#if _WTL_CMDBAR_VISTA_MENUS\r
+               if(RunTimeHelper::IsVista())\r
+               {\r
+                       T* pT = static_cast<T*>(this);\r
+                       pT->_AddVistaBitmapsFromImageList(nOldImageCount, nImageCount - nOldImageCount);\r
+                       ATLASSERT(nImageCount == m_arrVistaBitmap.GetSize());\r
+               }\r
+#endif // _WTL_CMDBAR_VISTA_MENUS\r
+\r
+               return TRUE;\r
+       }\r
+\r
+       BOOL AddBitmap(ATL::_U_STRINGorID bitmap, int nCommandID)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               CBitmap bmp;\r
+               bmp.LoadBitmap(bitmap.m_lpstr);\r
+               if(bmp.m_hBitmap == NULL)\r
+                       return FALSE;\r
+               return AddBitmap(bmp, nCommandID);\r
+       }\r
+\r
+       BOOL AddBitmap(HBITMAP hBitmap, UINT nCommandID)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               T* pT = static_cast<T*>(this);\r
+               // Create image list if it doesn't exist\r
+               if(m_hImageList == NULL)\r
+               {\r
+                       if(!pT->CreateInternalImageList(1))\r
+                               return FALSE;\r
+               }\r
+               // check bitmap size\r
+               CBitmapHandle bmp = hBitmap;\r
+               SIZE size = { 0, 0 };\r
+               bmp.GetSize(size);\r
+               if(size.cx != m_szBitmap.cx || size.cy != m_szBitmap.cy)\r
+               {\r
+                       ATLASSERT(FALSE);   // must match size!\r
+                       return FALSE;\r
+               }\r
+               // add bitmap\r
+               int nRet = ::ImageList_AddMasked(m_hImageList, hBitmap, m_clrMask);\r
+               if(nRet == -1)\r
+                       return FALSE;\r
+               BOOL bRet = m_arrCommand.Add((WORD)nCommandID);\r
+               ATLASSERT(::ImageList_GetImageCount(m_hImageList) == m_arrCommand.GetSize());\r
+#if _WTL_CMDBAR_VISTA_MENUS\r
+               if(RunTimeHelper::IsVista())\r
+               {\r
+                       pT->_AddVistaBitmapFromImageList(m_arrCommand.GetSize() - 1);\r
+                       ATLASSERT(m_arrVistaBitmap.GetSize() == m_arrCommand.GetSize());\r
+               }\r
+#endif // _WTL_CMDBAR_VISTA_MENUS\r
+               return bRet;\r
+       }\r
+\r
+       BOOL AddIcon(ATL::_U_STRINGorID icon, UINT nCommandID)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               HICON hIcon = ::LoadIcon(ModuleHelper::GetResourceInstance(), icon.m_lpstr);\r
+               if(hIcon == NULL)\r
+                       return FALSE;\r
+               return AddIcon(hIcon, nCommandID);\r
+       }\r
+\r
+       BOOL AddIcon(HICON hIcon, UINT nCommandID)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               T* pT = static_cast<T*>(this);\r
+               // create image list if it doesn't exist\r
+               if(m_hImageList == NULL)\r
+               {\r
+                       if(!pT->CreateInternalImageList(1))\r
+                               return FALSE;\r
+               }\r
+\r
+               int nRet = ::ImageList_AddIcon(m_hImageList, hIcon);\r
+               if(nRet == -1)\r
+                       return FALSE;\r
+               BOOL bRet = m_arrCommand.Add((WORD)nCommandID);\r
+               ATLASSERT(::ImageList_GetImageCount(m_hImageList) == m_arrCommand.GetSize());\r
+#if _WTL_CMDBAR_VISTA_MENUS\r
+               if(RunTimeHelper::IsVista())\r
+               {\r
+                       pT->_AddVistaBitmapFromImageList(m_arrCommand.GetSize() - 1);\r
+                       ATLASSERT(m_arrVistaBitmap.GetSize() == m_arrCommand.GetSize());\r
+               }\r
+#endif // _WTL_CMDBAR_VISTA_MENUS\r
+               return bRet;\r
+       }\r
+\r
+       BOOL ReplaceBitmap(ATL::_U_STRINGorID bitmap, int nCommandID)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               CBitmap bmp;\r
+               bmp.LoadBitmap(bitmap.m_lpstr);\r
+               if(bmp.m_hBitmap == NULL)\r
+                       return FALSE;\r
+               return ReplaceBitmap(bmp, nCommandID);\r
+       }\r
+\r
+       BOOL ReplaceBitmap(HBITMAP hBitmap, UINT nCommandID)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               BOOL bRet = FALSE;\r
+               for(int i = 0; i < m_arrCommand.GetSize(); i++)\r
+               {\r
+                       if(m_arrCommand[i] == nCommandID)\r
+                       {\r
+                               bRet = ::ImageList_Remove(m_hImageList, i);\r
+                               if(bRet)\r
+                               {\r
+                                       m_arrCommand.RemoveAt(i);\r
+#if _WTL_CMDBAR_VISTA_MENUS\r
+                                       if(RunTimeHelper::IsVista())\r
+                                       {\r
+                                               if(m_arrVistaBitmap[i] != NULL)\r
+                                                       ::DeleteObject(m_arrVistaBitmap[i]);\r
+                                               m_arrVistaBitmap.RemoveAt(i);\r
+                                       }\r
+#endif // _WTL_CMDBAR_VISTA_MENUS\r
+                               }\r
+                               break;\r
+                       }\r
+               }\r
+               if(bRet)\r
+                       bRet = AddBitmap(hBitmap, nCommandID);\r
+               return bRet;\r
+       }\r
+\r
+       BOOL ReplaceIcon(ATL::_U_STRINGorID icon, UINT nCommandID)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               HICON hIcon = ::LoadIcon(ModuleHelper::GetResourceInstance(), icon.m_lpstr);\r
+               if(hIcon == NULL)\r
+                       return FALSE;\r
+               return ReplaceIcon(hIcon, nCommandID);\r
+       }\r
+\r
+       BOOL ReplaceIcon(HICON hIcon, UINT nCommandID)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               BOOL bRet = FALSE;\r
+               for(int i = 0; i < m_arrCommand.GetSize(); i++)\r
+               {\r
+                       if(m_arrCommand[i] == nCommandID)\r
+                       {\r
+                               bRet = (::ImageList_ReplaceIcon(m_hImageList, i, hIcon) != -1);\r
+#if _WTL_CMDBAR_VISTA_MENUS\r
+                               if(RunTimeHelper::IsVista() && bRet != FALSE)\r
+                               {\r
+                                       T* pT = static_cast<T*>(this);\r
+                                       pT->_ReplaceVistaBitmapFromImageList(i);\r
+                               }\r
+#endif // _WTL_CMDBAR_VISTA_MENUS\r
+                               break;\r
+                       }\r
+               }\r
+               return bRet;\r
+       }\r
+\r
+       BOOL RemoveImage(int nCommandID)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+\r
+               BOOL bRet = FALSE;\r
+               for(int i = 0; i < m_arrCommand.GetSize(); i++)\r
+               {\r
+                       if(m_arrCommand[i] == nCommandID)\r
+                       {\r
+                               bRet = ::ImageList_Remove(m_hImageList, i);\r
+                               if(bRet)\r
+                               {\r
+                                       m_arrCommand.RemoveAt(i);\r
+#if _WTL_CMDBAR_VISTA_MENUS\r
+                                       if(RunTimeHelper::IsVista())\r
+                                       {\r
+                                               if(m_arrVistaBitmap[i] != NULL)\r
+                                                       ::DeleteObject(m_arrVistaBitmap[i]);\r
+                                               m_arrVistaBitmap.RemoveAt(i);\r
+                                       }\r
+#endif // _WTL_CMDBAR_VISTA_MENUS\r
+                               }\r
+                               break;\r
+                       }\r
+               }\r
+               return bRet;\r
+       }\r
+\r
+       BOOL RemoveAllImages()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+\r
+               ATLTRACE2(atlTraceUI, 0, _T("CmdBar - Removing all images\n"));\r
+               BOOL bRet = ::ImageList_RemoveAll(m_hImageList);\r
+               if(bRet)\r
+               {\r
+                       m_arrCommand.RemoveAll();\r
+#if _WTL_CMDBAR_VISTA_MENUS\r
+                       for(int i = 0; i < m_arrVistaBitmap.GetSize(); i++)\r
+                       {\r
+                               if(m_arrVistaBitmap[i] != NULL)\r
+                                       ::DeleteObject(m_arrVistaBitmap[i]);\r
+                       }\r
+                       m_arrVistaBitmap.RemoveAll();\r
+#endif // _WTL_CMDBAR_VISTA_MENUS\r
+               }\r
+               return bRet;\r
+       }\r
+\r
+       BOOL TrackPopupMenu(HMENU hMenu, UINT uFlags, int x, int y, LPTPMPARAMS lpParams = NULL)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(::IsMenu(hMenu));\r
+               if(!::IsMenu(hMenu))\r
+                       return FALSE;\r
+               m_bContextMenu = true;\r
+               if(m_bUseKeyboardCues)\r
+                       m_bShowKeyboardCues = m_bKeyboardInput;\r
+               T* pT = static_cast<T*>(this);\r
+               return pT->DoTrackPopupMenu(hMenu, uFlags, x, y, lpParams);\r
+       }\r
+\r
+       BOOL SetMDIClient(HWND /*hWndMDIClient*/)\r
+       {\r
+               // Use CMDICommandBarCtrl for MDI support\r
+               ATLASSERT(FALSE);\r
+               return FALSE;\r
+       }\r
+\r
+// Message map and handlers\r
+       BEGIN_MSG_MAP(CCommandBarCtrlImpl)\r
+               MESSAGE_HANDLER(WM_CREATE, OnCreate)\r
+               MESSAGE_HANDLER(WM_DESTROY, OnDestroy)\r
+               MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground)\r
+               MESSAGE_HANDLER(WM_INITMENU, OnInitMenu)\r
+               MESSAGE_HANDLER(WM_INITMENUPOPUP, OnInitMenuPopup)\r
+               MESSAGE_HANDLER(WM_MENUSELECT, OnMenuSelect)\r
+               MESSAGE_HANDLER(GetAutoPopupMessage(), OnInternalAutoPopup)\r
+               MESSAGE_HANDLER(GetGetBarMessage(), OnInternalGetBar)\r
+               MESSAGE_HANDLER(WM_SETTINGCHANGE, OnSettingChange)\r
+               MESSAGE_HANDLER(WM_MENUCHAR, OnMenuChar)\r
+\r
+               MESSAGE_HANDLER(WM_KEYDOWN, OnKeyDown)\r
+               MESSAGE_HANDLER(WM_KEYUP, OnKeyUp)\r
+               MESSAGE_HANDLER(WM_CHAR, OnChar)\r
+               MESSAGE_HANDLER(WM_SYSKEYDOWN, OnSysKeyDown)\r
+               MESSAGE_HANDLER(WM_SYSKEYUP, OnSysKeyUp)\r
+               MESSAGE_HANDLER(WM_SYSCHAR, OnSysChar)\r
+// public API handlers - these stay to support chevrons in atlframe.h\r
+               MESSAGE_HANDLER(CBRM_GETMENU, OnAPIGetMenu)\r
+               MESSAGE_HANDLER(CBRM_TRACKPOPUPMENU, OnAPITrackPopupMenu)\r
+               MESSAGE_HANDLER(CBRM_GETCMDBAR, OnAPIGetCmdBar)\r
+\r
+               MESSAGE_HANDLER(WM_DRAWITEM, OnDrawItem)\r
+               MESSAGE_HANDLER(WM_MEASUREITEM, OnMeasureItem)\r
+\r
+               MESSAGE_HANDLER(WM_FORWARDMSG, OnForwardMsg)\r
+       ALT_MSG_MAP(1)   // Parent window messages\r
+               NOTIFY_CODE_HANDLER(TBN_HOTITEMCHANGE, OnParentHotItemChange)\r
+               NOTIFY_CODE_HANDLER(TBN_DROPDOWN, OnParentDropDown)\r
+               MESSAGE_HANDLER(WM_INITMENUPOPUP, OnParentInitMenuPopup)\r
+               MESSAGE_HANDLER(GetGetBarMessage(), OnParentInternalGetBar)\r
+               MESSAGE_HANDLER(WM_SYSCOMMAND, OnParentSysCommand)\r
+               MESSAGE_HANDLER(CBRM_GETMENU, OnParentAPIGetMenu)\r
+               MESSAGE_HANDLER(WM_MENUCHAR, OnParentMenuChar)\r
+               MESSAGE_HANDLER(CBRM_TRACKPOPUPMENU, OnParentAPITrackPopupMenu)\r
+               MESSAGE_HANDLER(CBRM_GETCMDBAR, OnParentAPIGetCmdBar)\r
+               MESSAGE_HANDLER(WM_SETTINGCHANGE, OnParentSettingChange)\r
+\r
+               MESSAGE_HANDLER(WM_DRAWITEM, OnParentDrawItem)\r
+               MESSAGE_HANDLER(WM_MEASUREITEM, OnParentMeasureItem)\r
+\r
+               MESSAGE_HANDLER(WM_ACTIVATE, OnParentActivate)\r
+               NOTIFY_CODE_HANDLER(NM_CUSTOMDRAW, OnParentCustomDraw)\r
+       ALT_MSG_MAP(2)   // MDI client window messages\r
+               // Use CMDICommandBarCtrl for MDI support\r
+       ALT_MSG_MAP(3)   // Message hook messages\r
+               MESSAGE_HANDLER(WM_MOUSEMOVE, OnHookMouseMove)\r
+               MESSAGE_HANDLER(WM_SYSKEYDOWN, OnHookSysKeyDown)\r
+               MESSAGE_HANDLER(WM_SYSKEYUP, OnHookSysKeyUp)\r
+               MESSAGE_HANDLER(WM_SYSCHAR, OnHookSysChar)\r
+               MESSAGE_HANDLER(WM_KEYDOWN, OnHookKeyDown)\r
+               MESSAGE_HANDLER(WM_NEXTMENU, OnHookNextMenu)\r
+               MESSAGE_HANDLER(WM_CHAR, OnHookChar)\r
+       END_MSG_MAP()\r
+\r
+       LRESULT OnForwardMsg(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/)\r
+       {\r
+               LPMSG pMsg = (LPMSG)lParam;\r
+               if(pMsg->message >= WM_MOUSEFIRST && pMsg->message <= WM_MOUSELAST)\r
+                       m_bKeyboardInput = false;\r
+               else if(pMsg->message >= WM_KEYFIRST && pMsg->message <= WM_KEYLAST)\r
+                       m_bKeyboardInput = true;\r
+               LRESULT lRet = 0;\r
+               ProcessWindowMessage(pMsg->hwnd, pMsg->message, pMsg->wParam, pMsg->lParam, lRet, 3);\r
+               return lRet;\r
+       }\r
+\r
+       LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)\r
+       {\r
+               // Let the toolbar initialize itself\r
+               LRESULT lRet = DefWindowProc(uMsg, wParam, lParam);\r
+               // get and use system settings\r
+               T* pT = static_cast<T*>(this);\r
+               pT->GetSystemSettings();\r
+               // Parent init\r
+               ATL::CWindow wndParent = GetParent();\r
+               ATL::CWindow wndTopLevelParent = wndParent.GetTopLevelParent();\r
+               m_wndParent.SubclassWindow(wndTopLevelParent);\r
+               // Toolbar Init\r
+               SetButtonStructSize();\r
+               SetImageList(NULL);\r
+\r
+               // Create message hook if needed\r
+               CWindowCreateCriticalSectionLock lock;\r
+               if(FAILED(lock.Lock()))\r
+               {\r
+                       ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CCommandBarCtrlImpl::OnCreate.\n"));\r
+                       ATLASSERT(FALSE);\r
+                       return -1;\r
+               }\r
+\r
+               if(s_pmapMsgHook == NULL)\r
+               {\r
+                       ATLTRY(s_pmapMsgHook = new CMsgHookMap);\r
+                       ATLASSERT(s_pmapMsgHook != NULL);\r
+               }\r
+\r
+               if(s_pmapMsgHook != NULL)\r
+               {\r
+                       DWORD dwThreadID = ::GetCurrentThreadId();\r
+                       _MsgHookData* pData = s_pmapMsgHook->Lookup(dwThreadID);\r
+                       if(pData == NULL)\r
+                       {\r
+                               ATLTRY(pData = new _MsgHookData);\r
+                               ATLASSERT(pData != NULL);\r
+                               HHOOK hMsgHook = ::SetWindowsHookEx(WH_GETMESSAGE, MessageHookProc, ModuleHelper::GetModuleInstance(), dwThreadID);\r
+                               ATLASSERT(hMsgHook != NULL);\r
+                               if(pData != NULL && hMsgHook != NULL)\r
+                               {\r
+                                       pData->hMsgHook = hMsgHook;\r
+                                       pData->dwUsage = 1;\r
+                                       BOOL bRet = s_pmapMsgHook->Add(dwThreadID, pData);\r
+                                       bRet;\r
+                                       ATLASSERT(bRet);\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               (pData->dwUsage)++;\r
+                       }\r
+               }\r
+               lock.Unlock();\r
+\r
+               // Get layout\r
+#if (WINVER >= 0x0500)\r
+               m_bLayoutRTL = ((GetExStyle() & WS_EX_LAYOUTRTL) != 0);\r
+#endif // (WINVER >= 0x0500)\r
+\r
+               return lRet;\r
+       }\r
+\r
+       LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)\r
+       {\r
+               LRESULT lRet = DefWindowProc(uMsg, wParam, lParam);\r
+\r
+#if _WTL_CMDBAR_VISTA_MENUS\r
+               if(m_bVistaMenus && (m_hMenu != NULL))\r
+               {\r
+                       T* pT = static_cast<T*>(this);\r
+                       pT->_RemoveVistaBitmapsFromMenu();\r
+               }\r
+\r
+               for(int i = 0; i < m_arrVistaBitmap.GetSize(); i++)\r
+               {\r
+                       if(m_arrVistaBitmap[i] != NULL)\r
+                               ::DeleteObject(m_arrVistaBitmap[i]);\r
+               }\r
+#endif // _WTL_CMDBAR_VISTA_MENUS\r
+\r
+               if(m_bAttachedMenu)   // nothing to do in this mode\r
+                       return lRet;\r
+\r
+               CWindowCreateCriticalSectionLock lock;\r
+               if(FAILED(lock.Lock()))\r
+               {\r
+                       ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CCommandBarCtrlImpl::OnDestroy.\n"));\r
+                       ATLASSERT(FALSE);\r
+                       return lRet;\r
+               }\r
+\r
+               if(s_pmapMsgHook != NULL)\r
+               {\r
+                       DWORD dwThreadID = ::GetCurrentThreadId();\r
+                       _MsgHookData* pData = s_pmapMsgHook->Lookup(dwThreadID);\r
+                       if(pData != NULL)\r
+                       {\r
+                               (pData->dwUsage)--;\r
+                               if(pData->dwUsage == 0)\r
+                               {\r
+                                       BOOL bRet = ::UnhookWindowsHookEx(pData->hMsgHook);\r
+                                       ATLASSERT(bRet);\r
+                                       bRet = s_pmapMsgHook->Remove(dwThreadID);\r
+                                       ATLASSERT(bRet);\r
+                                       if(bRet)\r
+                                               delete pData;\r
+                               }\r
+\r
+                               if(s_pmapMsgHook->GetSize() == 0)\r
+                               {\r
+                                       delete s_pmapMsgHook;\r
+                                       s_pmapMsgHook = NULL;\r
+                               }\r
+                       }\r
+               }\r
+\r
+               lock.Unlock();\r
+\r
+               return lRet;\r
+       }\r
+\r
+       LRESULT OnKeyDown(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled)\r
+       {\r
+#ifdef _CMDBAR_EXTRA_TRACE\r
+               ATLTRACE2(atlTraceUI, 0, _T("CmdBar - OnKeyDown\n"));\r
+#endif\r
+               bHandled = FALSE;\r
+               // Simulate Alt+Space for the parent\r
+               if(wParam == VK_SPACE)\r
+               {\r
+                       m_wndParent.PostMessage(WM_SYSKEYDOWN, wParam, lParam | (1 << 29));\r
+                       bHandled = TRUE;\r
+               }\r
+#if (_WIN32_IE >= 0x0500)\r
+               else if(wParam == VK_LEFT || wParam == VK_RIGHT)\r
+               {\r
+                       WPARAM wpNext = m_bLayoutRTL ? VK_LEFT : VK_RIGHT;\r
+\r
+                       if(!m_bMenuActive)\r
+                       {\r
+                               T* pT = static_cast<T*>(this);\r
+                               int nBtn = GetHotItem();\r
+                               int nNextBtn = (wParam == wpNext) ? pT->GetNextMenuItem(nBtn) : pT->GetPreviousMenuItem(nBtn);\r
+                               if(nNextBtn == -2)\r
+                               {\r
+                                       SetHotItem(-1);\r
+                                       if(pT->DisplayChevronMenu())\r
+                                               bHandled = TRUE;\r
+                               }\r
+                       }\r
+               }\r
+#endif // (_WIN32_IE >= 0x0500)\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnKeyUp(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)\r
+       {\r
+#ifdef _CMDBAR_EXTRA_TRACE\r
+               ATLTRACE2(atlTraceUI, 0, _T("CmdBar - OnKeyUp\n"));\r
+#endif\r
+               if(wParam != VK_SPACE)\r
+                       bHandled = FALSE;\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnChar(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)\r
+       {\r
+#ifdef _CMDBAR_EXTRA_TRACE\r
+               ATLTRACE2(atlTraceUI, 0, _T("CmdBar - OnChar\n"));\r
+#endif\r
+               if(wParam != VK_SPACE)\r
+                       bHandled = FALSE;\r
+               else\r
+                       return 0;\r
+               // Security\r
+               if(!m_wndParent.IsWindowEnabled() || ::GetFocus() != m_hWnd)\r
+                       return 0;\r
+\r
+               // Handle mnemonic press when we have focus\r
+               int nBtn = 0;\r
+               if(wParam != VK_RETURN && !MapAccelerator((TCHAR)LOWORD(wParam), nBtn))\r
+               {\r
+#if (_WIN32_IE >= 0x0500)\r
+                       if((TCHAR)LOWORD(wParam) != _chChevronShortcut)\r
+#endif // (_WIN32_IE >= 0x0500)\r
+                               ::MessageBeep(0);\r
+               }\r
+               else\r
+               {\r
+#if (_WIN32_IE >= 0x0500)\r
+                       RECT rcClient = { 0 };\r
+                       GetClientRect(&rcClient);\r
+                       RECT rcBtn = { 0 };\r
+                       GetItemRect(nBtn, &rcBtn);\r
+                       TBBUTTON tbb = { 0 };\r
+                       GetButton(nBtn, &tbb);\r
+                       if((tbb.fsState & TBSTATE_ENABLED) != 0 && (tbb.fsState & TBSTATE_HIDDEN) == 0 && rcBtn.right <= rcClient.right)\r
+                       {\r
+#endif // (_WIN32_IE >= 0x0500)\r
+                               PostMessage(WM_KEYDOWN, VK_DOWN, 0L);\r
+                               if(wParam != VK_RETURN)\r
+                                       SetHotItem(nBtn);\r
+#if (_WIN32_IE >= 0x0500)\r
+                       }\r
+                       else\r
+                       {\r
+                               ::MessageBeep(0);\r
+                               bHandled = TRUE;\r
+                       }\r
+#endif // (_WIN32_IE >= 0x0500)\r
+               }\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnSysKeyDown(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)\r
+       {\r
+#ifdef _CMDBAR_EXTRA_TRACE\r
+               ATLTRACE2(atlTraceUI, 0, _T("CmdBar - OnSysKeyDown\n"));\r
+#endif\r
+               bHandled = FALSE;\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnSysKeyUp(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)\r
+       {\r
+#ifdef _CMDBAR_EXTRA_TRACE\r
+               ATLTRACE2(atlTraceUI, 0, _T("CmdBar - OnSysKeyUp\n"));\r
+#endif\r
+               bHandled = FALSE;\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnSysChar(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)\r
+       {\r
+#ifdef _CMDBAR_EXTRA_TRACE\r
+               ATLTRACE2(atlTraceUI, 0, _T("CmdBar - OnSysChar\n"));\r
+#endif\r
+               bHandled = FALSE;\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnEraseBackground(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)\r
+       {\r
+               if(m_bAttachedMenu || (m_dwExtendedStyle & CBR_EX_TRANSPARENT))\r
+               {\r
+                       bHandled = FALSE;\r
+                       return 0;\r
+               }\r
+\r
+               CDCHandle dc = (HDC)wParam;\r
+               RECT rect = { 0 };\r
+               GetClientRect(&rect);\r
+               dc.FillRect(&rect, COLOR_MENU);\r
+\r
+               return 1;   // don't do the default erase\r
+       }\r
+\r
+       LRESULT OnInitMenu(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)\r
+       {\r
+               int nIndex = GetHotItem();\r
+               SendMessage(WM_MENUSELECT, MAKEWPARAM(nIndex, MF_POPUP|MF_HILITE), (LPARAM)m_hMenu);\r
+               bHandled = FALSE;\r
+               return 1;\r
+       }\r
+\r
+       LRESULT OnInitMenuPopup(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)\r
+       {\r
+               if((BOOL)HIWORD(lParam))   // System menu, do nothing\r
+               {\r
+                       bHandled = FALSE;\r
+                       return 1;\r
+               }\r
+\r
+               if(!(m_bAttachedMenu || m_bMenuActive))   // Not attached or ours, do nothing\r
+               {\r
+                       bHandled = FALSE;\r
+                       return 1;\r
+               }\r
+\r
+#ifdef _CMDBAR_EXTRA_TRACE\r
+               ATLTRACE2(atlTraceUI, 0, _T("CmdBar - OnInitMenuPopup\n"));\r
+#endif\r
+               // forward to the parent or subclassed window, so it can handle update UI\r
+               LRESULT lRet = 0;\r
+               if(m_bAttachedMenu)\r
+                       lRet = DefWindowProc(uMsg, wParam, (lParam || m_bContextMenu) ? lParam : GetHotItem());\r
+               else\r
+                       lRet = m_wndParent.DefWindowProc(uMsg, wParam, (lParam || m_bContextMenu) ? lParam : GetHotItem());\r
+\r
+#if _WTL_CMDBAR_VISTA_MENUS\r
+               // If Vista menus are active, just set bitmaps and return\r
+               if(m_bVistaMenus)\r
+               {\r
+                       CMenuHandle menu = (HMENU)wParam;\r
+                       ATLASSERT(menu.m_hMenu != NULL);\r
+\r
+                       for(int i = 0; i < menu.GetMenuItemCount(); i++)\r
+                       {\r
+                               WORD nID = (WORD)menu.GetMenuItemID(i);\r
+                               int nIndex = m_arrCommand.Find(nID);\r
+\r
+                               CMenuItemInfo mii;\r
+                               mii.fMask = MIIM_BITMAP;\r
+                               mii.hbmpItem = (m_bImagesVisible && (nIndex != -1)) ? m_arrVistaBitmap[nIndex] : NULL;\r
+                               menu.SetMenuItemInfo(i, TRUE, &mii);\r
+                       }\r
+\r
+                       return lRet;\r
+               }\r
+#endif // _WTL_CMDBAR_VISTA_MENUS\r
+\r
+               // Convert menu items to ownerdraw, add our data\r
+               if(m_bImagesVisible)\r
+               {\r
+                       CMenuHandle menuPopup = (HMENU)wParam;\r
+                       ATLASSERT(menuPopup.m_hMenu != NULL);\r
+\r
+                       T* pT = static_cast<T*>(this);\r
+                       pT;   // avoid level 4 warning\r
+                       TCHAR szString[pT->_nMaxMenuItemTextLength];\r
+                       BOOL bRet = FALSE;\r
+                       for(int i = 0; i < menuPopup.GetMenuItemCount(); i++)\r
+                       {\r
+                               CMenuItemInfo mii;\r
+                               mii.cch = pT->_nMaxMenuItemTextLength;\r
+                               mii.fMask = MIIM_CHECKMARKS | MIIM_DATA | MIIM_ID | MIIM_STATE | MIIM_SUBMENU | MIIM_TYPE;\r
+                               mii.dwTypeData = szString;\r
+                               bRet = menuPopup.GetMenuItemInfo(i, TRUE, &mii);\r
+                               ATLASSERT(bRet);\r
+\r
+                               if(!(mii.fType & MFT_OWNERDRAW))   // Not already an ownerdraw item\r
+                               {\r
+                                       mii.fMask = MIIM_DATA | MIIM_TYPE | MIIM_STATE;\r
+                                       _MenuItemData* pMI = NULL;\r
+                                       ATLTRY(pMI = new _MenuItemData);\r
+                                       ATLASSERT(pMI != NULL);\r
+                                       if(pMI != NULL)\r
+                                       {\r
+                                               pMI->fType = mii.fType;\r
+                                               pMI->fState = mii.fState;\r
+                                               mii.fType |= MFT_OWNERDRAW;\r
+                                               pMI->iButton = -1;\r
+                                               for(int j = 0; j < m_arrCommand.GetSize(); j++)\r
+                                               {\r
+                                                       if(m_arrCommand[j] == mii.wID)\r
+                                                       {\r
+                                                               pMI->iButton = j;\r
+                                                               break;\r
+                                                       }\r
+                                               }\r
+                                               int cchLen = lstrlen(szString) + 1;\r
+                                               pMI->lpstrText = NULL;\r
+                                               ATLTRY(pMI->lpstrText = new TCHAR[cchLen]);\r
+                                               ATLASSERT(pMI->lpstrText != NULL);\r
+                                               if(pMI->lpstrText != NULL)\r
+                                                       SecureHelper::strcpy_x(pMI->lpstrText, cchLen, szString);\r
+                                               mii.dwItemData = (ULONG_PTR)pMI;\r
+                                               bRet = menuPopup.SetMenuItemInfo(i, TRUE, &mii);\r
+                                               ATLASSERT(bRet);\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       // Add it to the list\r
+                       m_stackMenuHandle.Push(menuPopup.m_hMenu);\r
+               }\r
+\r
+               return lRet;\r
+       }\r
+\r
+       LRESULT OnMenuSelect(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)\r
+       {\r
+               if(!m_bAttachedMenu)   // Not attached, do nothing, forward to parent\r
+               {\r
+                       m_bPopupItem = (lParam != NULL) && ((HMENU)lParam != m_hMenu) && (HIWORD(wParam) & MF_POPUP);\r
+                       if(m_wndParent.IsWindow())\r
+                               m_wndParent.SendMessage(uMsg, wParam, lParam);\r
+                       bHandled = FALSE;\r
+                       return 1;\r
+               }\r
+\r
+               // Check if a menu is closing, do a cleanup\r
+               if(HIWORD(wParam) == 0xFFFF && lParam == NULL)   // Menu closing\r
+               {\r
+#ifdef _CMDBAR_EXTRA_TRACE\r
+                       ATLTRACE2(atlTraceUI, 0, _T("CmdBar - OnMenuSelect - CLOSING!!!!\n"));\r
+#endif\r
+                       ATLASSERT(m_stackMenuWnd.GetSize() == 0);\r
+                       // Restore the menu items to the previous state for all menus that were converted\r
+                       if(m_bImagesVisible)\r
+                       {\r
+                               HMENU hMenu = NULL;\r
+                               while((hMenu = m_stackMenuHandle.Pop()) != NULL)\r
+                               {\r
+                                       CMenuHandle menuPopup = hMenu;\r
+                                       ATLASSERT(menuPopup.m_hMenu != NULL);\r
+                                       // Restore state and delete menu item data\r
+                                       BOOL bRet = FALSE;\r
+                                       for(int i = 0; i < menuPopup.GetMenuItemCount(); i++)\r
+                                       {\r
+                                               CMenuItemInfo mii;\r
+                                               mii.fMask = MIIM_DATA | MIIM_TYPE;\r
+                                               bRet = menuPopup.GetMenuItemInfo(i, TRUE, &mii);\r
+                                               ATLASSERT(bRet);\r
+\r
+                                               _MenuItemData* pMI = (_MenuItemData*)mii.dwItemData;\r
+                                               if(pMI != NULL && pMI->IsCmdBarMenuItem())\r
+                                               {\r
+                                                       mii.fMask = MIIM_DATA | MIIM_TYPE | MIIM_STATE;\r
+                                                       mii.fType = pMI->fType;\r
+                                                       mii.dwTypeData = pMI->lpstrText;\r
+                                                       mii.cch = lstrlen(pMI->lpstrText);\r
+                                                       mii.dwItemData = NULL;\r
+\r
+                                                       bRet = menuPopup.SetMenuItemInfo(i, TRUE, &mii);\r
+                                                       ATLASSERT(bRet);\r
+\r
+                                                       delete [] pMI->lpstrText;\r
+                                                       pMI->dwMagic = 0x6666;\r
+                                                       delete pMI;\r
+                                               }\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+\r
+               bHandled = FALSE;\r
+               return 1;\r
+       }\r
+\r
+       LRESULT OnInternalAutoPopup(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)\r
+       {\r
+               int nIndex = (int)wParam;\r
+               T* pT = static_cast<T*>(this);\r
+               pT->DoPopupMenu(nIndex, false);\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnInternalGetBar(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)\r
+       {\r
+               // Let's make sure we're not embedded in another process\r
+               if((LPVOID)wParam != NULL)\r
+                       *((DWORD*)wParam) = GetCurrentProcessId();\r
+               if(IsWindowVisible())\r
+                       return (LRESULT)static_cast<CCommandBarCtrlBase*>(this);\r
+               else\r
+                       return NULL;\r
+       }\r
+\r
+       LRESULT OnSettingChange(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)\r
+       {\r
+#ifndef SPI_GETKEYBOARDCUES\r
+               const UINT SPI_SETKEYBOARDCUES = 0x100B;\r
+#endif // !SPI_GETKEYBOARDCUES\r
+#ifndef SPI_GETFLATMENU\r
+               const UINT SPI_SETFLATMENU = 0x1023;\r
+#endif // !SPI_GETFLATMENU\r
+\r
+               if(wParam == SPI_SETNONCLIENTMETRICS || wParam == SPI_SETKEYBOARDCUES || wParam == SPI_SETFLATMENU)\r
+               {\r
+                       T* pT = static_cast<T*>(this);\r
+                       pT->GetSystemSettings();\r
+               }\r
+\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnWindowPosChanging(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)\r
+       {\r
+               LRESULT lRet = DefWindowProc(uMsg, wParam, lParam);\r
+\r
+               LPWINDOWPOS lpWP = (LPWINDOWPOS)lParam;\r
+               int cyMin = ::GetSystemMetrics(SM_CYMENU);\r
+               if(lpWP->cy < cyMin)\r
+               lpWP->cy = cyMin;\r
+\r
+               return lRet;\r
+       }\r
+\r
+       LRESULT OnMenuChar(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled)\r
+       {\r
+#ifdef _CMDBAR_EXTRA_TRACE\r
+               ATLTRACE2(atlTraceUI, 0, _T("CmdBar - OnMenuChar\n"));\r
+#endif\r
+               bHandled = TRUE;\r
+               T* pT = static_cast<T*>(this);\r
+\r
+               LRESULT lRet;\r
+               if(m_bMenuActive && LOWORD(wParam) != 0x0D)\r
+                       lRet = 0;\r
+               else\r
+                       lRet = MAKELRESULT(1, 1);\r
+\r
+               if(m_bMenuActive && HIWORD(wParam) == MF_POPUP)\r
+               {\r
+                       // Convert character to lower/uppercase and possibly Unicode, using current keyboard layout\r
+                       TCHAR ch = (TCHAR)LOWORD(wParam);\r
+                       CMenuHandle menu = (HMENU)lParam;\r
+                       int nCount = ::GetMenuItemCount(menu);\r
+                       int nRetCode = MNC_EXECUTE;\r
+                       BOOL bRet = FALSE;\r
+                       TCHAR szString[pT->_nMaxMenuItemTextLength];\r
+                       WORD wMnem = 0;\r
+                       bool bFound = false;\r
+                       for(int i = 0; i < nCount; i++)\r
+                       {\r
+                               CMenuItemInfo mii;\r
+                               mii.cch = pT->_nMaxMenuItemTextLength;\r
+                               mii.fMask = MIIM_CHECKMARKS | MIIM_DATA | MIIM_ID | MIIM_STATE | MIIM_SUBMENU | MIIM_TYPE;\r
+                               mii.dwTypeData = szString;\r
+                               bRet = menu.GetMenuItemInfo(i, TRUE, &mii);\r
+                               if(!bRet || (mii.fType & MFT_SEPARATOR))\r
+                                       continue;\r
+                               _MenuItemData* pmd = (_MenuItemData*)mii.dwItemData;\r
+                               if(pmd != NULL && pmd->IsCmdBarMenuItem())\r
+                               {\r
+                                       LPTSTR p = pmd->lpstrText;\r
+\r
+                                       if(p != NULL)\r
+                                       {\r
+                                               while(*p && *p != _T('&'))\r
+                                                       p = ::CharNext(p);\r
+                                               if(p != NULL && *p)\r
+                                               {\r
+                                                       DWORD dwP = MAKELONG(*(++p), 0);\r
+                                                       DWORD dwC = MAKELONG(ch, 0);\r
+                                                       if(::CharLower((LPTSTR)ULongToPtr(dwP)) == ::CharLower((LPTSTR)ULongToPtr(dwC)))\r
+                                                       {\r
+                                                               if(!bFound)\r
+                                                               {\r
+                                                                       wMnem = (WORD)i;\r
+                                                                       bFound = true;\r
+                                                               }\r
+                                                               else\r
+                                                               {\r
+                                                                       nRetCode = MNC_SELECT;\r
+                                                                       break;\r
+                                                               }\r
+                                                       }\r
+                                               }\r
+                                       }\r
+                               }\r
+                       }\r
+                       if(bFound)\r
+                       {\r
+                               if(nRetCode == MNC_EXECUTE)\r
+                               {\r
+                                       PostMessage(TB_SETHOTITEM, (WPARAM)-1, 0L);\r
+                                       pT->GiveFocusBack();\r
+                               }\r
+                               bHandled = TRUE;\r
+                               lRet = MAKELRESULT(wMnem, nRetCode);\r
+                       }\r
+               } \r
+               else if(!m_bMenuActive)\r
+               {\r
+                       int nBtn = 0;\r
+                       if(!MapAccelerator((TCHAR)LOWORD(wParam), nBtn))\r
+                       {\r
+                               bHandled = FALSE;\r
+                               PostMessage(TB_SETHOTITEM, (WPARAM)-1, 0L);\r
+                               pT->GiveFocusBack();\r
+\r
+#if (_WIN32_IE >= 0x0500)\r
+                               // check if we should display chevron menu\r
+                               if((TCHAR)LOWORD(wParam) == pT->_chChevronShortcut)\r
+                               {\r
+                                       if(pT->DisplayChevronMenu())\r
+                                               bHandled = TRUE;\r
+                               }\r
+#endif // (_WIN32_IE >= 0x0500)\r
+                       }\r
+                       else if(m_wndParent.IsWindowEnabled())\r
+                       {\r
+#if (_WIN32_IE >= 0x0500)\r
+                               RECT rcClient = { 0 };\r
+                               GetClientRect(&rcClient);\r
+                               RECT rcBtn = { 0 };\r
+                               GetItemRect(nBtn, &rcBtn);\r
+                               TBBUTTON tbb = { 0 };\r
+                               GetButton(nBtn, &tbb);\r
+                               if((tbb.fsState & TBSTATE_ENABLED) != 0 && (tbb.fsState & TBSTATE_HIDDEN) == 0 && rcBtn.right <= rcClient.right)\r
+                               {\r
+#endif // (_WIN32_IE >= 0x0500)\r
+                                       if(m_bUseKeyboardCues && !m_bShowKeyboardCues)\r
+                                       {\r
+                                               m_bAllowKeyboardCues = true;\r
+                                               ShowKeyboardCues(true);\r
+                                       }\r
+                                       pT->TakeFocus();\r
+                                       PostMessage(WM_KEYDOWN, VK_DOWN, 0L);\r
+                                       SetHotItem(nBtn);\r
+#if (_WIN32_IE >= 0x0500)\r
+                               }\r
+                               else\r
+                               {\r
+                                       ::MessageBeep(0);\r
+                               }\r
+#endif // (_WIN32_IE >= 0x0500)\r
+                       }\r
+               }\r
+\r
+               return lRet;\r
+       }\r
+\r
+       LRESULT OnDrawItem(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled)\r
+       {\r
+               LPDRAWITEMSTRUCT lpDrawItemStruct = (LPDRAWITEMSTRUCT)lParam;\r
+               _MenuItemData* pmd = (_MenuItemData*)lpDrawItemStruct->itemData;\r
+               if(lpDrawItemStruct->CtlType == ODT_MENU && pmd != NULL && pmd->IsCmdBarMenuItem())\r
+               {\r
+                       T* pT = static_cast<T*>(this);\r
+                       pT->DrawItem(lpDrawItemStruct);\r
+               }\r
+               else\r
+               {\r
+                       bHandled = FALSE;\r
+               }\r
+               return (LRESULT)TRUE;\r
+       }\r
+\r
+       LRESULT OnMeasureItem(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled)\r
+       {\r
+               LPMEASUREITEMSTRUCT lpMeasureItemStruct = (LPMEASUREITEMSTRUCT)lParam;\r
+               _MenuItemData* pmd = (_MenuItemData*)lpMeasureItemStruct->itemData;\r
+               if(lpMeasureItemStruct->CtlType == ODT_MENU && pmd != NULL && pmd->IsCmdBarMenuItem())\r
+               {\r
+                       T* pT = static_cast<T*>(this);\r
+                       pT->MeasureItem(lpMeasureItemStruct);\r
+               }\r
+               else\r
+               {\r
+                       bHandled = FALSE;\r
+               }\r
+               return (LRESULT)TRUE;\r
+       }\r
+\r
+// API message handlers\r
+       LRESULT OnAPIGetMenu(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)\r
+       {\r
+               return (LRESULT)m_hMenu;\r
+       }\r
+\r
+       LRESULT OnAPITrackPopupMenu(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/)\r
+       {\r
+               if(lParam == NULL)\r
+                       return FALSE;\r
+               LPCBRPOPUPMENU lpCBRPopupMenu = (LPCBRPOPUPMENU)lParam;\r
+               if(lpCBRPopupMenu->cbSize != sizeof(CBRPOPUPMENU))\r
+                       return FALSE;\r
+\r
+               T* pT = static_cast<T*>(this);\r
+               return pT->TrackPopupMenu(lpCBRPopupMenu->hMenu, lpCBRPopupMenu->uFlags, lpCBRPopupMenu->x, lpCBRPopupMenu->y, lpCBRPopupMenu->lptpm);\r
+       }\r
+\r
+       LRESULT OnAPIGetCmdBar(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)\r
+       {\r
+               return (LRESULT)m_hWnd;\r
+       }\r
+\r
+// Parent window message handlers\r
+       LRESULT OnParentHotItemChange(int /*idCtrl*/, LPNMHDR pnmh, BOOL& bHandled)\r
+       {\r
+               LPNMTBHOTITEM lpNMHT = (LPNMTBHOTITEM)pnmh;\r
+\r
+               // Check if this comes from us\r
+               if(pnmh->hwndFrom != m_hWnd)\r
+               {\r
+                       bHandled = FALSE;\r
+                       return 0;\r
+               }\r
+\r
+               bool bBlockTracking = false;\r
+               if((m_dwExtendedStyle & CBR_EX_TRACKALWAYS) == 0)\r
+               {\r
+                       DWORD dwProcessID;\r
+                       ::GetWindowThreadProcessId(::GetActiveWindow(), &dwProcessID);\r
+                       bBlockTracking = (::GetCurrentProcessId() != dwProcessID);\r
+               }\r
+\r
+               if((!m_wndParent.IsWindowEnabled() || bBlockTracking) && (lpNMHT->dwFlags & HICF_MOUSE))\r
+               {\r
+                       return 1;\r
+               }\r
+               else\r
+               {\r
+#ifndef HICF_LMOUSE\r
+                       const DWORD HICF_LMOUSE = 0x00000080;   // left mouse button selected\r
+#endif\r
+                       bHandled = FALSE;\r
+\r
+                       // Send WM_MENUSELECT to the app if it needs to display a status text\r
+                       if(!(lpNMHT->dwFlags & HICF_MOUSE)\r
+                               && !(lpNMHT->dwFlags & HICF_ACCELERATOR)\r
+                               && !(lpNMHT->dwFlags & HICF_LMOUSE))\r
+                       {\r
+                               if(lpNMHT->dwFlags & HICF_ENTERING)\r
+                                       m_wndParent.SendMessage(WM_MENUSELECT, 0, (LPARAM)m_hMenu);\r
+                               if(lpNMHT->dwFlags & HICF_LEAVING)\r
+                                       m_wndParent.SendMessage(WM_MENUSELECT, MAKEWPARAM(0, 0xFFFF), NULL);\r
+                       }\r
+\r
+                       return 0;\r
+               }\r
+       }\r
+\r
+       LRESULT OnParentDropDown(int /*idCtrl*/, LPNMHDR pnmh, BOOL& bHandled)\r
+       {\r
+               // Check if this comes from us\r
+               if(pnmh->hwndFrom != m_hWnd)\r
+               {\r
+                       bHandled = FALSE;\r
+                       return 1;\r
+               }\r
+\r
+               T* pT = static_cast<T*>(this);\r
+               if(::GetFocus() != m_hWnd)\r
+                       pT->TakeFocus();\r
+               LPNMTOOLBAR pNMToolBar = (LPNMTOOLBAR)pnmh;\r
+               int nIndex = CommandToIndex(pNMToolBar->iItem);\r
+               m_bContextMenu = false;\r
+               m_bEscapePressed = false;\r
+               pT->DoPopupMenu(nIndex, true);\r
+\r
+               return TBDDRET_DEFAULT;\r
+       }\r
+\r
+       LRESULT OnParentInitMenuPopup(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)\r
+       {\r
+               return OnInitMenuPopup(uMsg, wParam, lParam, bHandled);\r
+       }\r
+\r
+       LRESULT OnParentInternalGetBar(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)\r
+       {\r
+               return OnInternalGetBar(uMsg, wParam, lParam, bHandled);\r
+       }\r
+\r
+       LRESULT OnParentSysCommand(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)\r
+       {\r
+               bHandled = FALSE;\r
+               if((m_uSysKey == VK_MENU \r
+                       || (m_uSysKey == VK_F10 && !(::GetKeyState(VK_SHIFT) & 0x80))\r
+                       || m_uSysKey == VK_SPACE) \r
+                       && wParam == SC_KEYMENU)\r
+               {\r
+                       T* pT = static_cast<T*>(this);\r
+                       if(::GetFocus() == m_hWnd)\r
+                       {\r
+                               pT->GiveFocusBack();   // exit menu "loop"\r
+                               PostMessage(TB_SETHOTITEM, (WPARAM)-1, 0L);\r
+                       }\r
+                       else if(m_uSysKey != VK_SPACE && !m_bSkipMsg)\r
+                       {\r
+                               if(m_bUseKeyboardCues && !m_bShowKeyboardCues && m_bAllowKeyboardCues)\r
+                                       ShowKeyboardCues(true);\r
+\r
+                               pT->TakeFocus();      // enter menu "loop"\r
+                               bHandled = TRUE;\r
+                       }\r
+                       else if(m_uSysKey != VK_SPACE)\r
+                       {\r
+                               bHandled = TRUE;\r
+                       }\r
+               }\r
+               m_bSkipMsg = false;\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnParentAPIGetMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)\r
+       {\r
+               return OnAPIGetMenu(uMsg, wParam, lParam, bHandled);\r
+       }\r
+\r
+       LRESULT OnParentMenuChar(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)\r
+       {\r
+               return OnMenuChar(uMsg, wParam, lParam, bHandled);\r
+       }\r
+\r
+       LRESULT OnParentAPITrackPopupMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)\r
+       {\r
+               return OnAPITrackPopupMenu(uMsg, wParam, lParam, bHandled);\r
+       }\r
+\r
+       LRESULT OnParentAPIGetCmdBar(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)\r
+       {\r
+               return OnAPIGetCmdBar(uMsg, wParam, lParam, bHandled);\r
+       }\r
+\r
+       LRESULT OnParentSettingChange(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)\r
+       {\r
+               OnSettingChange(uMsg, wParam, lParam, bHandled);\r
+               bHandled = FALSE;\r
+               return 1;\r
+       }\r
+\r
+       LRESULT OnParentDrawItem(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)\r
+       {\r
+               return OnDrawItem(uMsg, wParam, lParam, bHandled);\r
+       }\r
+\r
+       LRESULT OnParentMeasureItem(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)\r
+       {\r
+               return OnMeasureItem(uMsg, wParam, lParam, bHandled);\r
+       }\r
+\r
+       LRESULT OnParentActivate(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)\r
+       {\r
+               m_bParentActive = (LOWORD(wParam) != WA_INACTIVE);\r
+               if(!m_bParentActive && m_bUseKeyboardCues && m_bShowKeyboardCues)\r
+               {\r
+                       ShowKeyboardCues(false);   // this will repaint our window\r
+               }\r
+               else\r
+               {\r
+                       Invalidate();\r
+                       UpdateWindow();\r
+               }\r
+               bHandled = FALSE;\r
+               return 1;\r
+       }\r
+\r
+       LRESULT OnParentCustomDraw(int /*idCtrl*/, LPNMHDR pnmh, BOOL& bHandled)\r
+       {\r
+               LRESULT lRet = CDRF_DODEFAULT;\r
+               bHandled = FALSE;\r
+               if(pnmh->hwndFrom == m_hWnd)\r
+               {\r
+                       LPNMTBCUSTOMDRAW lpTBCustomDraw = (LPNMTBCUSTOMDRAW)pnmh;\r
+                       if(lpTBCustomDraw->nmcd.dwDrawStage == CDDS_PREPAINT)\r
+                       {\r
+                               lRet = CDRF_NOTIFYITEMDRAW;\r
+                               bHandled = TRUE;\r
+                       }\r
+                       else if(lpTBCustomDraw->nmcd.dwDrawStage == CDDS_ITEMPREPAINT)\r
+                       {\r
+                               if(m_bFlatMenus)\r
+                               {\r
+#ifndef COLOR_MENUHILIGHT\r
+                                       const int COLOR_MENUHILIGHT = 29;\r
+#endif // !COLOR_MENUHILIGHT\r
+                                       bool bDisabled = ((lpTBCustomDraw->nmcd.uItemState & CDIS_DISABLED) == CDIS_DISABLED);\r
+                                       if(!bDisabled && ((lpTBCustomDraw->nmcd.uItemState & CDIS_HOT) == CDIS_HOT || \r
+                                               (lpTBCustomDraw->nmcd.uItemState & CDIS_SELECTED) == CDIS_SELECTED))\r
+                                       {\r
+                                               ::FillRect(lpTBCustomDraw->nmcd.hdc, &lpTBCustomDraw->nmcd.rc, ::GetSysColorBrush(COLOR_MENUHILIGHT));\r
+                                               ::FrameRect(lpTBCustomDraw->nmcd.hdc, &lpTBCustomDraw->nmcd.rc, ::GetSysColorBrush(COLOR_HIGHLIGHT));\r
+                                               lpTBCustomDraw->clrText = ::GetSysColor(m_bParentActive ? COLOR_HIGHLIGHTTEXT : COLOR_GRAYTEXT);\r
+                                       }\r
+                                       else if(bDisabled || !m_bParentActive)\r
+                                       {\r
+                                               lpTBCustomDraw->clrText = ::GetSysColor(COLOR_GRAYTEXT);\r
+                                       }\r
+                                       CDCHandle dc = lpTBCustomDraw->nmcd.hdc;\r
+                                       dc.SetTextColor(lpTBCustomDraw->clrText);\r
+                                       dc.SetBkMode(lpTBCustomDraw->nStringBkMode);\r
+                                       HFONT hFont = GetFont();\r
+                                       HFONT hFontOld = NULL;\r
+                                       if(hFont != NULL)\r
+                                               hFontOld = dc.SelectFont(hFont);\r
+                                       const int cchText = 200;\r
+                                       TCHAR szText[cchText] = { 0 };\r
+                                       TBBUTTONINFO tbbi = { 0 };\r
+                                       tbbi.cbSize = sizeof(TBBUTTONINFO);\r
+                                       tbbi.dwMask = TBIF_TEXT;\r
+                                       tbbi.pszText = szText;\r
+                                       tbbi.cchText = cchText;\r
+                                       GetButtonInfo((int)lpTBCustomDraw->nmcd.dwItemSpec, &tbbi);\r
+                                       dc.DrawText(szText, -1, &lpTBCustomDraw->nmcd.rc, DT_SINGLELINE | DT_CENTER | DT_VCENTER | (m_bShowKeyboardCues ? 0 : DT_HIDEPREFIX));\r
+                                       if(hFont != NULL)\r
+                                               dc.SelectFont(hFontOld);\r
+                                       lRet = CDRF_SKIPDEFAULT;\r
+                                       bHandled = TRUE;\r
+                               }\r
+                               else if(!m_bParentActive)\r
+                               {\r
+                                       lpTBCustomDraw->clrText = ::GetSysColor(COLOR_GRAYTEXT);\r
+                                       bHandled = TRUE;\r
+                               }\r
+                       }\r
+               }\r
+               return lRet;\r
+       }\r
+\r
+// Message hook handlers\r
+       LRESULT OnHookMouseMove(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)\r
+       {\r
+               static POINT s_point = { -1, -1 };\r
+               DWORD dwPoint = ::GetMessagePos();\r
+               POINT point = { GET_X_LPARAM(dwPoint), GET_Y_LPARAM(dwPoint) };\r
+\r
+               bHandled = FALSE;\r
+               if(m_bMenuActive)\r
+               {\r
+                       if(::WindowFromPoint(point) == m_hWnd)\r
+                       {\r
+                               ScreenToClient(&point);\r
+                               int nHit = HitTest(&point);\r
+\r
+                               if((point.x != s_point.x || point.y != s_point.y) && nHit >= 0 && nHit < ::GetMenuItemCount(m_hMenu) && nHit != m_nPopBtn && m_nPopBtn != -1)\r
+                               {\r
+                                       TBBUTTON tbb = { 0 };\r
+                                       GetButton(nHit, &tbb);\r
+                                       if((tbb.fsState & TBSTATE_ENABLED) != 0)\r
+                                       {\r
+                                               m_nNextPopBtn = nHit | 0xFFFF0000;\r
+                                               HWND hWndMenu = m_stackMenuWnd.GetCurrent();\r
+                                               ATLASSERT(hWndMenu != NULL);\r
+\r
+                                               // this one is needed to close a menu if mouse button was down\r
+                                               ::PostMessage(hWndMenu, WM_LBUTTONUP, 0, MAKELPARAM(point.x, point.y));\r
+                                               // this one closes a popup menu\r
+                                               ::PostMessage(hWndMenu, WM_KEYDOWN, VK_ESCAPE, 0L);\r
+\r
+                                               bHandled = TRUE;\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       ScreenToClient(&point);\r
+               }\r
+\r
+               s_point = point;\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnHookSysKeyDown(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)\r
+       {\r
+               bHandled = FALSE;\r
+#ifdef _CMDBAR_EXTRA_TRACE\r
+               ATLTRACE2(atlTraceUI, 0, _T("CmdBar - Hook WM_SYSKEYDOWN (0x%2.2X)\n"), wParam);\r
+#endif\r
+\r
+               if(wParam == VK_MENU && m_bParentActive && m_bUseKeyboardCues && !m_bShowKeyboardCues && m_bAllowKeyboardCues)\r
+                       ShowKeyboardCues(true);\r
+\r
+               if(wParam != VK_SPACE && !m_bMenuActive && ::GetFocus() == m_hWnd)\r
+               {\r
+                       m_bAllowKeyboardCues = false;\r
+                       PostMessage(TB_SETHOTITEM, (WPARAM)-1, 0L);\r
+                       T* pT = static_cast<T*>(this);\r
+                       pT->GiveFocusBack();\r
+                       m_bSkipMsg = true;\r
+               }\r
+               else\r
+               {\r
+                       if(wParam == VK_SPACE && m_bUseKeyboardCues && m_bShowKeyboardCues)\r
+                       {\r
+                               m_bAllowKeyboardCues = true;\r
+                               ShowKeyboardCues(false);\r
+                       }\r
+                       m_uSysKey = (UINT)wParam;\r
+               }\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnHookSysKeyUp(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)\r
+       {\r
+               if(!m_bAllowKeyboardCues)\r
+                       m_bAllowKeyboardCues = true;\r
+               bHandled = FALSE;\r
+               wParam;\r
+#ifdef _CMDBAR_EXTRA_TRACE\r
+               ATLTRACE2(atlTraceUI, 0, _T("CmdBar - Hook WM_SYSKEYUP (0x%2.2X)\n"), wParam);\r
+#endif\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnHookSysChar(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)\r
+       {\r
+               bHandled = FALSE;\r
+#ifdef _CMDBAR_EXTRA_TRACE\r
+               ATLTRACE2(atlTraceUI, 0, _T("CmdBar - Hook WM_SYSCHAR (0x%2.2X)\n"), wParam);\r
+#endif\r
+\r
+               if(!m_bMenuActive && m_hWndHook != m_hWnd && wParam != VK_SPACE)\r
+                       bHandled = TRUE;\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnHookKeyDown(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)\r
+       {\r
+#ifdef _CMDBAR_EXTRA_TRACE\r
+               ATLTRACE2(atlTraceUI, 0, _T("CmdBar - Hook WM_KEYDOWN (0x%2.2X)\n"), wParam);\r
+#endif\r
+               bHandled = FALSE;\r
+               T* pT = static_cast<T*>(this);\r
+\r
+               if(wParam == VK_ESCAPE && m_stackMenuWnd.GetSize() <= 1)\r
+               {\r
+                       if(m_bMenuActive && !m_bContextMenu)\r
+                       {\r
+                               int nHot = GetHotItem();\r
+                               if(nHot == -1)\r
+                                       nHot = m_nPopBtn;\r
+                               if(nHot == -1)\r
+                                       nHot = 0;\r
+                               SetHotItem(nHot);\r
+                               bHandled = TRUE;\r
+                               pT->TakeFocus();\r
+                               m_bEscapePressed = true; // To keep focus\r
+                               m_bSkipPostDown = false;\r
+                       }\r
+                       else if(::GetFocus() == m_hWnd && m_wndParent.IsWindow())\r
+                       {\r
+                               SetHotItem(-1);\r
+                               pT->GiveFocusBack();\r
+                               bHandled = TRUE;\r
+                       }\r
+               }\r
+               else if(wParam == VK_RETURN || wParam == VK_UP || wParam == VK_DOWN)\r
+               {\r
+                       if(!m_bMenuActive && ::GetFocus() == m_hWnd && m_wndParent.IsWindow())\r
+                       {\r
+                               int nHot = GetHotItem();\r
+                               if(nHot != -1)\r
+                               {\r
+                                       if(wParam != VK_RETURN)\r
+                                       {\r
+                                               if(!m_bSkipPostDown)\r
+                                               {\r
+// IE4 only: WM_KEYDOWN doesn't generate TBN_DROPDOWN, we need to simulate a mouse click\r
+#if (_WIN32_IE < 0x0500)\r
+                                                       DWORD dwMajor = 0, dwMinor = 0;\r
+                                                       ATL::AtlGetCommCtrlVersion(&dwMajor, &dwMinor);\r
+                                                       if(dwMajor <= 4 || (dwMajor == 5 && dwMinor < 80))\r
+                                                       {\r
+                                                               RECT rect;\r
+                                                               GetItemRect(nHot, &rect);\r
+                                                               PostMessage(WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(rect.left, rect.top));\r
+                                                       }\r
+#endif // (_WIN32_IE < 0x0500)\r
+                                                       PostMessage(WM_KEYDOWN, VK_DOWN, 0L);\r
+                                                       m_bSkipPostDown = true;\r
+                                               }\r
+                                               else\r
+                                               {\r
+                                                       ATLTRACE2(atlTraceUI, 0, _T("CmdBar - skipping posting another VK_DOWN\n"));\r
+                                                       m_bSkipPostDown = false;\r
+                                               }\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       ATLTRACE2(atlTraceUI, 0, _T("CmdBar - Can't find hot button\n"));\r
+                               }\r
+                       }\r
+                       if(wParam == VK_RETURN && m_bMenuActive)\r
+                       {\r
+                               PostMessage(TB_SETHOTITEM, (WPARAM)-1, 0L);\r
+                               m_nNextPopBtn = -1;\r
+                               pT->GiveFocusBack();\r
+                       }\r
+               }\r
+               else if(wParam == VK_LEFT || wParam == VK_RIGHT)\r
+               {\r
+                       WPARAM wpNext = m_bLayoutRTL ? VK_LEFT : VK_RIGHT;\r
+                       WPARAM wpPrev = m_bLayoutRTL ? VK_RIGHT : VK_LEFT;\r
+\r
+                       if(m_bMenuActive && !m_bContextMenu && !(wParam == wpNext && m_bPopupItem))\r
+                       {\r
+                               bool bAction = false;\r
+                               if(wParam == wpPrev && s_pCurrentBar->m_stackMenuWnd.GetSize() == 1)\r
+                               {\r
+                                       m_nNextPopBtn = pT->GetPreviousMenuItem(m_nPopBtn);\r
+                                       if(m_nNextPopBtn != -1)\r
+                                               bAction = true;\r
+                               }\r
+                               else if(wParam == wpNext)\r
+                               {\r
+                                       m_nNextPopBtn = pT->GetNextMenuItem(m_nPopBtn);\r
+                                       if(m_nNextPopBtn != -1)\r
+                                               bAction = true;\r
+                               }\r
+                               HWND hWndMenu = m_stackMenuWnd.GetCurrent();\r
+                               ATLASSERT(hWndMenu != NULL);\r
+\r
+                               // Close the popup menu\r
+                               if(bAction)\r
+                               {\r
+                                       ::PostMessage(hWndMenu, WM_KEYDOWN, VK_ESCAPE, 0L);\r
+                                       if(wParam == wpNext)\r
+                                       {\r
+                                               int cItem = m_stackMenuWnd.GetSize() - 1;\r
+                                               while(cItem >= 0)\r
+                                               {\r
+                                                       hWndMenu = m_stackMenuWnd[cItem];\r
+                                                       if(hWndMenu != NULL)\r
+                                                               ::PostMessage(hWndMenu, WM_KEYDOWN, VK_ESCAPE, 0L);\r
+                                                       cItem--;\r
+                                               }\r
+                                       }\r
+#if (_WIN32_IE >= 0x0500)\r
+                                       if(m_nNextPopBtn == -2)\r
+                                       {\r
+                                               m_nNextPopBtn = -1;\r
+                                               pT->DisplayChevronMenu();\r
+                                       }\r
+#endif // (_WIN32_IE >= 0x0500)\r
+                                       bHandled = TRUE;\r
+                               }\r
+                       }\r
+               }\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnHookNextMenu(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)\r
+       {\r
+#ifdef _CMDBAR_EXTRA_TRACE\r
+               ATLTRACE2(atlTraceUI, 0, _T("CmdBar - Hook WM_NEXTMENU\n"));\r
+#endif\r
+               bHandled = FALSE;\r
+               return 1;\r
+       }\r
+\r
+       LRESULT OnHookChar(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)\r
+       {\r
+#ifdef _CMDBAR_EXTRA_TRACE\r
+               ATLTRACE2(atlTraceUI, 0, _T("CmdBar - Hook WM_CHAR (0x%2.2X)\n"), wParam);\r
+#endif\r
+               bHandled = (wParam == VK_ESCAPE);\r
+               return 0;\r
+       }\r
+\r
+// Implementation - ownerdraw overrideables and helpers\r
+       void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               if(m_bFlatMenus)\r
+                       pT->DrawItemFlat(lpDrawItemStruct);\r
+               else\r
+                       pT->DrawItem3D(lpDrawItemStruct);\r
+\r
+       }\r
+\r
+       void DrawItem3D(LPDRAWITEMSTRUCT lpDrawItemStruct)\r
+       {\r
+               _MenuItemData* pmd = (_MenuItemData*)lpDrawItemStruct->itemData;\r
+               CDCHandle dc = lpDrawItemStruct->hDC;\r
+               const RECT& rcItem = lpDrawItemStruct->rcItem;\r
+               T* pT = static_cast<T*>(this);\r
+\r
+               if(pmd->fType & MFT_SEPARATOR)\r
+               {\r
+                       // draw separator\r
+                       RECT rc = rcItem;\r
+                       rc.top += (rc.bottom - rc.top) / 2;      // vertical center\r
+                       dc.DrawEdge(&rc, EDGE_ETCHED, BF_TOP);   // draw separator line\r
+               }\r
+               else            // not a separator\r
+               {\r
+                       BOOL bDisabled = lpDrawItemStruct->itemState & ODS_GRAYED;\r
+                       BOOL bSelected = lpDrawItemStruct->itemState & ODS_SELECTED;\r
+                       BOOL bChecked = lpDrawItemStruct->itemState & ODS_CHECKED;\r
+                       BOOL bHasImage = FALSE;\r
+\r
+                       if(LOWORD(lpDrawItemStruct->itemID) == (WORD)-1)\r
+                               bSelected = FALSE;\r
+                       RECT rcButn = { rcItem.left, rcItem.top, rcItem.left + m_szButton.cx, rcItem.top + m_szButton.cy };   // button rect\r
+                       ::OffsetRect(&rcButn, 0, ((rcItem.bottom - rcItem.top) - (rcButn.bottom - rcButn.top)) / 2);          // center vertically\r
+\r
+                       int iButton = pmd->iButton;\r
+                       if(iButton >= 0)\r
+                       {\r
+                               bHasImage = TRUE;\r
+\r
+                               // calc drawing point\r
+                               SIZE sz = { rcButn.right - rcButn.left - m_szBitmap.cx, rcButn.bottom - rcButn.top - m_szBitmap.cy };\r
+                               sz.cx /= 2;\r
+                               sz.cy /= 2;\r
+                               POINT point = { rcButn.left + sz.cx, rcButn.top + sz.cy };\r
+\r
+                               // fill background depending on state\r
+                               if(!bChecked || (bSelected && !bDisabled))\r
+                               {\r
+                                       if(!bDisabled)\r
+                                               dc.FillRect(&rcButn, (bChecked && !bSelected) ? COLOR_3DLIGHT : COLOR_MENU);\r
+                                       else\r
+                                               dc.FillRect(&rcButn, COLOR_MENU);\r
+                               }\r
+                               else\r
+                               {\r
+                                       COLORREF crTxt = dc.SetTextColor(::GetSysColor(COLOR_BTNFACE));\r
+                                       COLORREF crBk = dc.SetBkColor(::GetSysColor(COLOR_BTNHILIGHT));\r
+                                       CBrush hbr(CDCHandle::GetHalftoneBrush());\r
+                                       dc.SetBrushOrg(rcButn.left, rcButn.top);\r
+                                       dc.FillRect(&rcButn, hbr);\r
+                                       dc.SetTextColor(crTxt);\r
+                                       dc.SetBkColor(crBk);\r
+                               }\r
+\r
+                               // draw disabled or normal\r
+                               if(!bDisabled)\r
+                               {\r
+                                       // draw pushed-in or popped-out edge\r
+                                       if(bSelected || bChecked)\r
+                                       {\r
+                                               RECT rc2 = rcButn;\r
+                                               dc.DrawEdge(&rc2, bChecked ? BDR_SUNKENOUTER : BDR_RAISEDINNER, BF_RECT);\r
+                                       }\r
+                                       // draw the image\r
+                                       ::ImageList_Draw(m_hImageList, iButton, dc, point.x, point.y, ILD_TRANSPARENT);\r
+                               }\r
+                               else\r
+                               {\r
+                                       HBRUSH hBrushBackground = bChecked ? NULL : ::GetSysColorBrush(COLOR_MENU);\r
+                                       pT->DrawBitmapDisabled(dc, iButton, point, hBrushBackground);\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               // no image - look for custom checked/unchecked bitmaps\r
+                               CMenuItemInfo info;\r
+                               info.fMask = MIIM_CHECKMARKS | MIIM_TYPE;\r
+                               ::GetMenuItemInfo((HMENU)lpDrawItemStruct->hwndItem, lpDrawItemStruct->itemID, MF_BYCOMMAND, &info);\r
+                               if(bChecked || info.hbmpUnchecked != NULL)\r
+                               {\r
+                                       BOOL bRadio = ((info.fType & MFT_RADIOCHECK) != 0);\r
+                                       bHasImage = pT->DrawCheckmark(dc, rcButn, bSelected, bDisabled, bRadio, bChecked ? info.hbmpChecked : info.hbmpUnchecked);\r
+                               }\r
+                       }\r
+\r
+                       // draw item text\r
+                       int cxButn = m_szButton.cx;\r
+                       COLORREF colorBG = ::GetSysColor(bSelected ? COLOR_HIGHLIGHT : COLOR_MENU);\r
+                       if(bSelected || lpDrawItemStruct->itemAction == ODA_SELECT)\r
+                       {\r
+                               RECT rcBG = rcItem;\r
+                               if(bHasImage)\r
+                                       rcBG.left += cxButn + s_kcxGap;\r
+                               dc.FillRect(&rcBG, bSelected ? COLOR_HIGHLIGHT : COLOR_MENU);\r
+                       }\r
+\r
+                       // calc text rectangle and colors\r
+                       RECT rcText = rcItem;\r
+                       rcText.left += cxButn + s_kcxGap + s_kcxTextMargin;\r
+                       rcText.right -= cxButn;\r
+                       dc.SetBkMode(TRANSPARENT);\r
+                       COLORREF colorText = ::GetSysColor(bDisabled ?  (bSelected ? COLOR_GRAYTEXT : COLOR_3DSHADOW) : (bSelected ? COLOR_HIGHLIGHTTEXT : COLOR_MENUTEXT));\r
+\r
+                       // font already selected by Windows\r
+                       if(bDisabled && (!bSelected || colorText == colorBG))\r
+                       {\r
+                               // disabled - draw shadow text shifted down and right 1 pixel (unles selected)\r
+                               RECT rcDisabled = rcText;\r
+                               ::OffsetRect(&rcDisabled, 1, 1);\r
+                               pT->DrawMenuText(dc, rcDisabled, pmd->lpstrText, ::GetSysColor(COLOR_3DHILIGHT));\r
+                       }\r
+                       pT->DrawMenuText(dc, rcText, pmd->lpstrText, colorText); // finally!\r
+               }\r
+       }\r
+\r
+       void DrawItemFlat(LPDRAWITEMSTRUCT lpDrawItemStruct)\r
+       {\r
+               _MenuItemData* pmd = (_MenuItemData*)lpDrawItemStruct->itemData;\r
+               CDCHandle dc = lpDrawItemStruct->hDC;\r
+               const RECT& rcItem = lpDrawItemStruct->rcItem;\r
+               T* pT = static_cast<T*>(this);\r
+\r
+#ifndef COLOR_MENUHILIGHT\r
+               const int COLOR_MENUHILIGHT = 29;\r
+#endif // !COLOR_MENUHILIGHT\r
+\r
+               BOOL bDisabled = lpDrawItemStruct->itemState & ODS_GRAYED;\r
+               BOOL bSelected = lpDrawItemStruct->itemState & ODS_SELECTED;\r
+               BOOL bChecked = lpDrawItemStruct->itemState & ODS_CHECKED;\r
+\r
+               // paint background\r
+               if(bSelected || lpDrawItemStruct->itemAction == ODA_SELECT)\r
+               {\r
+                       if(bSelected)\r
+                       {\r
+                               dc.FillRect(&rcItem, ::GetSysColorBrush(COLOR_MENUHILIGHT));\r
+                               dc.FrameRect(&rcItem, ::GetSysColorBrush(COLOR_HIGHLIGHT));\r
+                       }\r
+                       else\r
+                       {\r
+                               dc.FillRect(&rcItem, ::GetSysColorBrush(COLOR_MENU));\r
+                       }\r
+               }\r
+\r
+               if(pmd->fType & MFT_SEPARATOR)\r
+               {\r
+                       // draw separator\r
+                       RECT rc = rcItem;\r
+                       rc.top += (rc.bottom - rc.top) / 2;      // vertical center\r
+                       dc.DrawEdge(&rc, EDGE_ETCHED, BF_TOP);   // draw separator line\r
+               }\r
+               else            // not a separator\r
+               {\r
+                       if(LOWORD(lpDrawItemStruct->itemID) == (WORD)-1)\r
+                               bSelected = FALSE;\r
+                       RECT rcButn = { rcItem.left, rcItem.top, rcItem.left + m_szButton.cx, rcItem.top + m_szButton.cy };   // button rect\r
+                       ::OffsetRect(&rcButn, 0, ((rcItem.bottom - rcItem.top) - (rcButn.bottom - rcButn.top)) / 2);          // center vertically\r
+\r
+                       // draw background and border for checked items\r
+                       if(bChecked)\r
+                       {\r
+                               RECT rcCheck = rcButn;\r
+                               ::InflateRect(&rcCheck, -1, -1);\r
+                               if(bSelected)\r
+                                       dc.FillRect(&rcCheck, ::GetSysColorBrush(COLOR_MENU));\r
+                               dc.FrameRect(&rcCheck, ::GetSysColorBrush(COLOR_HIGHLIGHT));\r
+                       }\r
+\r
+                       int iButton = pmd->iButton;\r
+                       if(iButton >= 0)\r
+                       {\r
+                               // calc drawing point\r
+                               SIZE sz = { rcButn.right - rcButn.left - m_szBitmap.cx, rcButn.bottom - rcButn.top - m_szBitmap.cy };\r
+                               sz.cx /= 2;\r
+                               sz.cy /= 2;\r
+                               POINT point = { rcButn.left + sz.cx, rcButn.top + sz.cy };\r
+\r
+                               // draw disabled or normal\r
+                               if(!bDisabled)\r
+                               {\r
+                                       ::ImageList_Draw(m_hImageList, iButton, dc, point.x, point.y, ILD_TRANSPARENT);\r
+                               }\r
+                               else\r
+                               {\r
+                                       HBRUSH hBrushBackground = ::GetSysColorBrush((bSelected && !(bDisabled && bChecked)) ? COLOR_MENUHILIGHT : COLOR_MENU);\r
+                                       HBRUSH hBrushDisabledImage = ::GetSysColorBrush(COLOR_3DSHADOW);\r
+                                       pT->DrawBitmapDisabled(dc, iButton, point, hBrushBackground, hBrushBackground, hBrushDisabledImage);\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               // no image - look for custom checked/unchecked bitmaps\r
+                               CMenuItemInfo info;\r
+                               info.fMask = MIIM_CHECKMARKS | MIIM_TYPE;\r
+                               ::GetMenuItemInfo((HMENU)lpDrawItemStruct->hwndItem, lpDrawItemStruct->itemID, MF_BYCOMMAND, &info);\r
+                               if(bChecked || info.hbmpUnchecked != NULL)\r
+                               {\r
+                                       BOOL bRadio = ((info.fType & MFT_RADIOCHECK) != 0);\r
+                                       pT->DrawCheckmark(dc, rcButn, bSelected, bDisabled, bRadio, bChecked ? info.hbmpChecked : info.hbmpUnchecked);\r
+                               }\r
+                       }\r
+\r
+                       // draw item text\r
+                       int cxButn = m_szButton.cx;\r
+                       // calc text rectangle and colors\r
+                       RECT rcText = rcItem;\r
+                       rcText.left += cxButn + s_kcxGap + s_kcxTextMargin;\r
+                       rcText.right -= cxButn;\r
+                       dc.SetBkMode(TRANSPARENT);\r
+                       COLORREF colorText = ::GetSysColor(bDisabled ?  (bSelected ? COLOR_GRAYTEXT : COLOR_3DSHADOW) : (bSelected ? COLOR_HIGHLIGHTTEXT : COLOR_MENUTEXT));\r
+\r
+                       pT->DrawMenuText(dc, rcText, pmd->lpstrText, colorText); // finally!\r
+               }\r
+       }\r
+\r
+       void DrawMenuText(CDCHandle& dc, RECT& rc, LPCTSTR lpstrText, COLORREF color)\r
+       {\r
+               int nTab = -1;\r
+               for(int i = 0; i < lstrlen(lpstrText); i++)\r
+               {\r
+                       if(lpstrText[i] == _T('\t'))\r
+                       {\r
+                               nTab = i;\r
+                               break;\r
+                       }\r
+               }\r
+               dc.SetTextColor(color);\r
+               dc.DrawText(lpstrText, nTab, &rc, DT_SINGLELINE | DT_LEFT | DT_VCENTER | (m_bShowKeyboardCues ? 0 : DT_HIDEPREFIX));\r
+               if(nTab != -1)\r
+                       dc.DrawText(&lpstrText[nTab + 1], -1, &rc, DT_SINGLELINE | DT_RIGHT | DT_VCENTER | (m_bShowKeyboardCues ? 0 : DT_HIDEPREFIX));\r
+       }\r
+\r
+       void DrawBitmapDisabled(CDCHandle& dc, int nImage, POINT point,\r
+                       HBRUSH hBrushBackground = ::GetSysColorBrush(COLOR_3DFACE),\r
+                       HBRUSH hBrush3DEffect = ::GetSysColorBrush(COLOR_3DHILIGHT),\r
+                       HBRUSH hBrushDisabledImage = ::GetSysColorBrush(COLOR_3DSHADOW))\r
+       {\r
+#if (_WIN32_WINNT >= 0x0501) && (_WIN32_IE >= 0x0501)\r
+               if(m_bAlphaImages)\r
+               {\r
+                       IMAGELISTDRAWPARAMS ildp = { 0 };\r
+                       ildp.cbSize = sizeof(IMAGELISTDRAWPARAMS);\r
+                       ildp.himl = m_hImageList;\r
+                       ildp.i = nImage;\r
+                       ildp.hdcDst = dc;\r
+                       ildp.x = point.x;\r
+                       ildp.y = point.y;\r
+                       ildp.cx = 0;\r
+                       ildp.cy = 0;\r
+                       ildp.xBitmap = 0;\r
+                       ildp.yBitmap = 0;\r
+                       ildp.fStyle = ILD_TRANSPARENT;\r
+                       ildp.fState = ILS_SATURATE;\r
+                       ildp.Frame = 0;\r
+                       ::ImageList_DrawIndirect(&ildp);\r
+               }\r
+               else\r
+#endif // (_WIN32_WINNT >= 0x0501) && (_WIN32_IE >= 0x0501)\r
+               {\r
+                       // create memory DC\r
+                       CDC dcMem;\r
+                       dcMem.CreateCompatibleDC(dc);\r
+                       // create mono or color bitmap\r
+                       CBitmap bmp;\r
+                       bmp.CreateCompatibleBitmap(dc, m_szBitmap.cx, m_szBitmap.cy);\r
+                       ATLASSERT(bmp.m_hBitmap != NULL);\r
+                       // draw image into memory DC--fill BG white first\r
+                       HBITMAP hBmpOld = dcMem.SelectBitmap(bmp);\r
+                       dcMem.PatBlt(0, 0, m_szBitmap.cx, m_szBitmap.cy, WHITENESS);\r
+                       // If white is the text color, we can't use the normal painting since\r
+                       // it would blend with the WHITENESS, but the mask is OK\r
+                       UINT uDrawStyle = (::GetSysColor(COLOR_BTNTEXT) == RGB(255, 255, 255)) ? ILD_MASK : ILD_NORMAL;\r
+                       ::ImageList_Draw(m_hImageList, nImage, dcMem, 0, 0, uDrawStyle);\r
+                       dc.DitherBlt(point.x, point.y, m_szBitmap.cx, m_szBitmap.cy, dcMem, NULL, 0, 0, hBrushBackground, hBrush3DEffect, hBrushDisabledImage);\r
+                       dcMem.SelectBitmap(hBmpOld);   // restore\r
+               }\r
+       }\r
+\r
+       // old name\r
+       BOOL Draw3DCheckmark(CDCHandle& dc, const RECT& rc, BOOL bSelected, BOOL bDisabled, BOOL bRadio, HBITMAP hBmpCheck)\r
+       {\r
+               return DrawCheckmark(dc, rc, bSelected, bDisabled, bRadio, hBmpCheck);\r
+       }\r
+\r
+       BOOL DrawCheckmark(CDCHandle& dc, const RECT& rc, BOOL bSelected, BOOL bDisabled, BOOL bRadio, HBITMAP hBmpCheck)\r
+       {\r
+               // get checkmark bitmap, if none, use Windows standard\r
+               SIZE size = { 0, 0 };\r
+               CBitmapHandle bmp = hBmpCheck;\r
+               if(hBmpCheck != NULL)\r
+               {\r
+                       bmp.GetSize(size);\r
+               }\r
+               else\r
+               {\r
+                       size.cx = ::GetSystemMetrics(SM_CXMENUCHECK); \r
+                       size.cy = ::GetSystemMetrics(SM_CYMENUCHECK); \r
+                       bmp.CreateCompatibleBitmap(dc, size.cx, size.cy);\r
+                       ATLASSERT(bmp.m_hBitmap != NULL);\r
+               }\r
+               // center bitmap in caller's rectangle\r
+               RECT rcDest = rc;\r
+               if((rc.right - rc.left) > size.cx)\r
+               {\r
+                       rcDest.left = rc.left + (rc.right - rc.left - size.cx) / 2;\r
+                       rcDest.right = rcDest.left + size.cx;\r
+               }\r
+               if((rc.bottom - rc.top) > size.cy)\r
+               {\r
+                       rcDest.top = rc.top + (rc.bottom - rc.top - size.cy) / 2;\r
+                       rcDest.bottom = rcDest.top + size.cy;\r
+               }\r
+               // paint background\r
+               if(!m_bFlatMenus)\r
+               {\r
+                       if(bSelected && !bDisabled)\r
+                       {\r
+                               dc.FillRect(&rcDest, COLOR_MENU);\r
+                       }\r
+                       else\r
+                       {\r
+                               COLORREF clrTextOld = dc.SetTextColor(::GetSysColor(COLOR_BTNFACE));\r
+                               COLORREF clrBkOld = dc.SetBkColor(::GetSysColor(COLOR_BTNHILIGHT));\r
+                               CBrush hbr(CDCHandle::GetHalftoneBrush());\r
+                               dc.SetBrushOrg(rcDest.left, rcDest.top);\r
+                               dc.FillRect(&rcDest, hbr);\r
+                               dc.SetTextColor(clrTextOld);\r
+                               dc.SetBkColor(clrBkOld);\r
+                       }\r
+               }\r
+\r
+               // create source image\r
+               CDC dcSource;\r
+               dcSource.CreateCompatibleDC(dc);\r
+               HBITMAP hBmpOld = dcSource.SelectBitmap(bmp);\r
+               // set colors\r
+               const COLORREF clrBlack = RGB(0, 0, 0);\r
+               const COLORREF clrWhite = RGB(255, 255, 255);\r
+               COLORREF clrTextOld = dc.SetTextColor(clrBlack);\r
+               COLORREF clrBkOld = dc.SetBkColor(clrWhite);\r
+               // create mask\r
+               CDC dcMask;\r
+               dcMask.CreateCompatibleDC(dc);\r
+               CBitmap bmpMask;\r
+               bmpMask.CreateBitmap(size.cx, size.cy, 1, 1, NULL);\r
+               HBITMAP hBmpOld1 = dcMask.SelectBitmap(bmpMask);\r
+\r
+               // draw the checkmark transparently\r
+               int cx = rcDest.right - rcDest.left;\r
+               int cy = rcDest.bottom - rcDest.top;\r
+               if(hBmpCheck != NULL)\r
+               {\r
+                       // build mask based on transparent color        \r
+                       dcSource.SetBkColor(m_clrMask);\r
+                       dcMask.SetBkColor(clrBlack);\r
+                       dcMask.SetTextColor(clrWhite);\r
+                       dcMask.BitBlt(0, 0, size.cx, size.cy, dcSource, 0, 0, SRCCOPY);\r
+                       // draw bitmap using the mask\r
+                       dc.BitBlt(rcDest.left, rcDest.top, cx, cy, dcSource, 0, 0, SRCINVERT);\r
+                       dc.BitBlt(rcDest.left, rcDest.top, cx, cy, dcMask, 0, 0, SRCAND);\r
+                       dc.BitBlt(rcDest.left, rcDest.top, cx, cy, dcSource, 0, 0, SRCINVERT);\r
+               }\r
+               else\r
+               {\r
+                       const DWORD ROP_DSno = 0x00BB0226L;\r
+                       const DWORD ROP_DSa = 0x008800C6L;\r
+                       const DWORD ROP_DSo = 0x00EE0086L;\r
+                       const DWORD ROP_DSna = 0x00220326L;\r
+\r
+                       // draw mask\r
+                       RECT rcSource = { 0, 0, min(size.cx, rc.right - rc.left), min(size.cy, rc.bottom - rc.top) };\r
+                       dcMask.DrawFrameControl(&rcSource, DFC_MENU, bRadio ? DFCS_MENUBULLET : DFCS_MENUCHECK);\r
+\r
+                       // draw shadow if disabled\r
+                       if(!m_bFlatMenus && bDisabled)\r
+                       {\r
+                               // offset by one pixel\r
+                               int x = rcDest.left + 1;\r
+                               int y = rcDest.top + 1;\r
+                               // paint source bitmap\r
+                               const int nColor = COLOR_3DHILIGHT;\r
+                               dcSource.FillRect(&rcSource, nColor);\r
+                               // draw checkmark - special case black and white colors\r
+                               COLORREF clrCheck = ::GetSysColor(nColor);\r
+                               if(clrCheck == clrWhite)\r
+                               {\r
+                                       dc.BitBlt(x, y, cx, cy, dcMask,  0, 0,   ROP_DSno);\r
+                                       dc.BitBlt(x, y, cx, cy, dcSource, 0, 0, ROP_DSa);\r
+                               }\r
+                               else\r
+                               {\r
+                                       if(clrCheck != clrBlack)\r
+                                       {\r
+                                               ATLASSERT(dcSource.GetTextColor() == clrBlack);\r
+                                               ATLASSERT(dcSource.GetBkColor() == clrWhite);\r
+                                               dcSource.BitBlt(0, 0, size.cx, size.cy, dcMask, 0, 0, ROP_DSna);\r
+                                       }\r
+                                       dc.BitBlt(x, y, cx, cy, dcMask,  0,  0,  ROP_DSa);\r
+                                       dc.BitBlt(x, y, cx, cy, dcSource, 0, 0, ROP_DSo);\r
+                               }\r
+                       }\r
+\r
+                       // paint source bitmap\r
+                       const int nColor = bDisabled ? COLOR_BTNSHADOW : COLOR_MENUTEXT;\r
+                       dcSource.FillRect(&rcSource, nColor);\r
+                       // draw checkmark - special case black and white colors\r
+                       COLORREF clrCheck = ::GetSysColor(nColor);\r
+                       if(clrCheck == clrWhite)\r
+                       {\r
+                               dc.BitBlt(rcDest.left, rcDest.top, cx, cy, dcMask,  0, 0,   ROP_DSno);\r
+                               dc.BitBlt(rcDest.left, rcDest.top, cx, cy, dcSource, 0, 0, ROP_DSa);\r
+                       }\r
+                       else\r
+                       {\r
+                               if(clrCheck != clrBlack)\r
+                               {\r
+                                       ATLASSERT(dcSource.GetTextColor() == clrBlack);\r
+                                       ATLASSERT(dcSource.GetBkColor() == clrWhite);\r
+                                       dcSource.BitBlt(0, 0, size.cx, size.cy, dcMask, 0, 0, ROP_DSna);\r
+                               }\r
+                               dc.BitBlt(rcDest.left, rcDest.top, cx, cy, dcMask,  0,  0,  ROP_DSa);\r
+                               dc.BitBlt(rcDest.left, rcDest.top, cx, cy, dcSource, 0, 0, ROP_DSo);\r
+                       }\r
+               }\r
+               // restore all\r
+               dc.SetTextColor(clrTextOld);\r
+               dc.SetBkColor(clrBkOld);\r
+               dcSource.SelectBitmap(hBmpOld);\r
+               dcMask.SelectBitmap(hBmpOld1);\r
+               if(hBmpCheck == NULL)\r
+                       bmp.DeleteObject();\r
+               // draw pushed-in hilight\r
+               if(!m_bFlatMenus && !bDisabled)\r
+               {\r
+                       if(rc.right - rc.left > size.cx)\r
+                               ::InflateRect(&rcDest, 1,1);   // inflate checkmark by one pixel all around\r
+                       dc.DrawEdge(&rcDest, BDR_SUNKENOUTER, BF_RECT);\r
+               }\r
+\r
+               return TRUE;\r
+       }\r
+\r
+       void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)\r
+       {\r
+               _MenuItemData* pmd = (_MenuItemData*)lpMeasureItemStruct->itemData;\r
+\r
+               if(pmd->fType & MFT_SEPARATOR)   // separator - use half system height and zero width\r
+               {\r
+                       lpMeasureItemStruct->itemHeight = ::GetSystemMetrics(SM_CYMENU) / 2;\r
+                       lpMeasureItemStruct->itemWidth  = 0;\r
+               }\r
+               else\r
+               {\r
+                       // compute size of text - use DrawText with DT_CALCRECT\r
+                       CWindowDC dc(NULL);\r
+                       CFont fontBold;\r
+                       HFONT hOldFont = NULL;\r
+                       if(pmd->fState & MFS_DEFAULT)\r
+                       {\r
+                               // need bold version of font\r
+                               LOGFONT lf = { 0 };\r
+                               m_fontMenu.GetLogFont(lf);\r
+                               lf.lfWeight += 200;\r
+                               fontBold.CreateFontIndirect(&lf);\r
+                               ATLASSERT(fontBold.m_hFont != NULL);\r
+                               hOldFont = dc.SelectFont(fontBold);\r
+                       }\r
+                       else\r
+                       {\r
+                               hOldFont = dc.SelectFont(m_fontMenu);\r
+                       }\r
+\r
+                       RECT rcText = { 0, 0, 0, 0 };\r
+                       dc.DrawText(pmd->lpstrText, -1, &rcText, DT_SINGLELINE | DT_LEFT | DT_VCENTER | DT_CALCRECT);\r
+                       int cx = rcText.right - rcText.left;\r
+                       dc.SelectFont(hOldFont);\r
+\r
+                       LOGFONT lf = { 0 };\r
+                       m_fontMenu.GetLogFont(lf);\r
+                       int cy = lf.lfHeight;\r
+                       if(cy < 0)\r
+                               cy = -cy;\r
+                       const int cyMargin = 8;\r
+                       cy += cyMargin;\r
+\r
+                       // height of item is the bigger of these two\r
+                       lpMeasureItemStruct->itemHeight = max(cy, (int)m_szButton.cy);\r
+\r
+                       // width is width of text plus a bunch of stuff\r
+                       cx += 2 * s_kcxTextMargin;   // L/R margin for readability\r
+                       cx += s_kcxGap;              // space between button and menu text\r
+                       cx += 2 * m_szButton.cx;     // button width (L=button; R=empty margin)\r
+                       cx += m_cxExtraSpacing;      // extra between item text and accelerator keys\r
+\r
+                       // Windows adds 1 to returned value\r
+                       cx -= ::GetSystemMetrics(SM_CXMENUCHECK) - 1;\r
+                       lpMeasureItemStruct->itemWidth = cx;   // done deal\r
+               }\r
+       }\r
+\r
+// Implementation - Hook procs\r
+       static LRESULT CALLBACK CreateHookProc(int nCode, WPARAM wParam, LPARAM lParam)\r
+       {\r
+               const int cchClassName = 7;\r
+               TCHAR szClassName[cchClassName] = { 0 };\r
+\r
+               if(nCode == HCBT_CREATEWND)\r
+               {\r
+                       HWND hWndMenu = (HWND)wParam;\r
+#ifdef _CMDBAR_EXTRA_TRACE\r
+                       ATLTRACE2(atlTraceUI, 0, _T("CmdBar - HCBT_CREATEWND (HWND = %8.8X)\n"), hWndMenu);\r
+#endif\r
+\r
+                       ::GetClassName(hWndMenu, szClassName, cchClassName);\r
+                       if(!lstrcmp(_T("#32768"), szClassName))\r
+                               s_pCurrentBar->m_stackMenuWnd.Push(hWndMenu);\r
+               }\r
+               else if(nCode == HCBT_DESTROYWND)\r
+               {\r
+                       HWND hWndMenu = (HWND)wParam;\r
+#ifdef _CMDBAR_EXTRA_TRACE\r
+                       ATLTRACE2(atlTraceUI, 0, _T("CmdBar - HCBT_DESTROYWND (HWND = %8.8X)\n"), hWndMenu);\r
+#endif\r
+\r
+                       ::GetClassName(hWndMenu, szClassName, cchClassName);\r
+                       if(!lstrcmp(_T("#32768"), szClassName))\r
+                       {\r
+                               ATLASSERT(hWndMenu == s_pCurrentBar->m_stackMenuWnd.GetCurrent());\r
+                               s_pCurrentBar->m_stackMenuWnd.Pop();\r
+                       }\r
+               }\r
+\r
+               return ::CallNextHookEx(s_hCreateHook, nCode, wParam, lParam);\r
+       }\r
+\r
+       static LRESULT CALLBACK MessageHookProc(int nCode, WPARAM wParam, LPARAM lParam)\r
+       {\r
+               LPMSG pMsg = (LPMSG)lParam;\r
+\r
+               if(nCode == HC_ACTION && wParam == PM_REMOVE && pMsg->message != GetGetBarMessage() && pMsg->message != WM_FORWARDMSG)\r
+               {\r
+                       CCommandBarCtrlBase* pCmdBar = NULL;\r
+                       HWND hWnd = pMsg->hwnd;\r
+                       DWORD dwPID = 0;\r
+                       while(pCmdBar == NULL && hWnd != NULL)\r
+                       {\r
+                               pCmdBar = (CCommandBarCtrlBase*)::SendMessage(hWnd, GetGetBarMessage(), (WPARAM)&dwPID, 0L);\r
+                               hWnd = ::GetParent(hWnd);\r
+                       }\r
+\r
+                       if(pCmdBar != NULL && dwPID == GetCurrentProcessId())\r
+                       {\r
+                               pCmdBar->m_hWndHook = pMsg->hwnd;\r
+                               ATLASSERT(pCmdBar->IsCommandBarBase());\r
+\r
+                               if(::IsWindow(pCmdBar->m_hWnd))\r
+                                       pCmdBar->SendMessage(WM_FORWARDMSG, 0, (LPARAM)pMsg);\r
+                               else\r
+                                       ATLTRACE2(atlTraceUI, 0, _T("CmdBar - Hook skipping message, can't find command bar!\n"));\r
+                       }\r
+               }\r
+\r
+               LRESULT lRet = 0;\r
+               ATLASSERT(s_pmapMsgHook != NULL);\r
+               if(s_pmapMsgHook != NULL)\r
+               {\r
+                       DWORD dwThreadID = ::GetCurrentThreadId();\r
+                       _MsgHookData* pData = s_pmapMsgHook->Lookup(dwThreadID);\r
+                       if(pData != NULL)\r
+                       {\r
+                               lRet = ::CallNextHookEx(pData->hMsgHook, nCode, wParam, lParam);\r
+                       }\r
+               }\r
+               return lRet;\r
+       }\r
+\r
+// Implementation\r
+       void DoPopupMenu(int nIndex, bool bAnimate)\r
+       {\r
+#ifdef _CMDBAR_EXTRA_TRACE\r
+               ATLTRACE2(atlTraceUI, 0, _T("CmdBar - DoPopupMenu, bAnimate = %s\n"), bAnimate ? "true" : "false");\r
+#endif\r
+\r
+               // Menu animation flags\r
+#ifndef TPM_VERPOSANIMATION\r
+               const UINT TPM_VERPOSANIMATION = 0x1000L;\r
+#endif\r
+#ifndef TPM_NOANIMATION\r
+               const UINT TPM_NOANIMATION = 0x4000L;\r
+#endif\r
+               T* pT = static_cast<T*>(this);\r
+\r
+               // get popup menu and it's position\r
+               RECT rect = { 0 };\r
+               GetItemRect(nIndex, &rect);\r
+               POINT pt = { rect.left, rect.bottom };\r
+               MapWindowPoints(NULL, &pt, 1);\r
+               MapWindowPoints(NULL, &rect);\r
+               TPMPARAMS TPMParams = { 0 };\r
+               TPMParams.cbSize = sizeof(TPMPARAMS);\r
+               TPMParams.rcExclude = rect;\r
+               HMENU hMenuPopup = ::GetSubMenu(m_hMenu, nIndex);\r
+               ATLASSERT(hMenuPopup != NULL);\r
+\r
+               // get button ID\r
+               TBBUTTON tbb = { 0 };\r
+               GetButton(nIndex, &tbb);\r
+               int nCmdID = tbb.idCommand;\r
+\r
+               m_nPopBtn = nIndex;   // remember current button's index\r
+\r
+               // press button and display popup menu\r
+               PressButton(nCmdID, TRUE);\r
+               SetHotItem(nCmdID);\r
+               pT->DoTrackPopupMenu(hMenuPopup, TPM_LEFTBUTTON | TPM_VERTICAL | TPM_LEFTALIGN | TPM_TOPALIGN |\r
+                       (s_bW2K ? (bAnimate ? TPM_VERPOSANIMATION : TPM_NOANIMATION) : 0), pt.x, pt.y, &TPMParams);\r
+               PressButton(nCmdID, FALSE);\r
+               if(::GetFocus() != m_hWnd)\r
+                       SetHotItem(-1);\r
+\r
+               m_nPopBtn = -1;   // restore\r
+\r
+               // eat next message if click is on the same button\r
+               MSG msg = { 0 };\r
+               if(::PeekMessage(&msg, m_hWnd, WM_LBUTTONDOWN, WM_LBUTTONDOWN, PM_NOREMOVE) && ::PtInRect(&rect, msg.pt))\r
+                       ::PeekMessage(&msg, m_hWnd, WM_LBUTTONDOWN, WM_LBUTTONDOWN, PM_REMOVE);\r
+\r
+               // check if another popup menu should be displayed\r
+               if(m_nNextPopBtn != -1)\r
+               {\r
+                       PostMessage(GetAutoPopupMessage(), m_nNextPopBtn & 0xFFFF);\r
+                       if(!(m_nNextPopBtn & 0xFFFF0000) && !m_bPopupItem)\r
+                               PostMessage(WM_KEYDOWN, VK_DOWN, 0);\r
+                       m_nNextPopBtn = -1;\r
+               }\r
+               else\r
+               {\r
+                       m_bContextMenu = false;\r
+                       // If user didn't hit escape, give focus back\r
+                       if(!m_bEscapePressed)\r
+                       {\r
+                               if(m_bUseKeyboardCues && m_bShowKeyboardCues)\r
+                                       m_bAllowKeyboardCues = false;\r
+                               pT->GiveFocusBack();\r
+                       }\r
+                       else\r
+                       {\r
+                               SetHotItem(nCmdID);\r
+                               SetAnchorHighlight(TRUE);\r
+                       }\r
+               }\r
+       }\r
+\r
+       BOOL DoTrackPopupMenu(HMENU hMenu, UINT uFlags, int x, int y, LPTPMPARAMS lpParams = NULL)\r
+       {\r
+               CMenuHandle menuPopup = hMenu;\r
+\r
+               CWindowCreateCriticalSectionLock lock;\r
+               if(FAILED(lock.Lock()))\r
+               {\r
+                       ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CCommandBarCtrlImpl::DoTrackPopupMenu.\n"));\r
+                       ATLASSERT(FALSE);\r
+                       return FALSE;\r
+               }\r
+\r
+               ATLASSERT(s_hCreateHook == NULL);\r
+\r
+               s_pCurrentBar = static_cast<CCommandBarCtrlBase*>(this);\r
+\r
+               s_hCreateHook = ::SetWindowsHookEx(WH_CBT, CreateHookProc, ModuleHelper::GetModuleInstance(), GetCurrentThreadId());\r
+               ATLASSERT(s_hCreateHook != NULL);\r
+\r
+               m_bPopupItem = false;\r
+               m_bMenuActive = true;\r
+\r
+               BOOL bTrackRet = menuPopup.TrackPopupMenuEx(uFlags, x, y, m_hWnd, lpParams);\r
+               m_bMenuActive = false;\r
+\r
+               ::UnhookWindowsHookEx(s_hCreateHook);\r
+\r
+               s_hCreateHook = NULL;\r
+               s_pCurrentBar = NULL;\r
+\r
+               lock.Unlock();\r
+\r
+               // cleanup - convert menus back to original state\r
+#ifdef _CMDBAR_EXTRA_TRACE\r
+               ATLTRACE2(atlTraceUI, 0, _T("CmdBar - TrackPopupMenu - cleanup\n"));\r
+#endif\r
+\r
+               ATLASSERT(m_stackMenuWnd.GetSize() == 0);\r
+\r
+               UpdateWindow();\r
+               ATL::CWindow wndTL = GetTopLevelParent();\r
+               wndTL.UpdateWindow();\r
+\r
+               // restore the menu items to the previous state for all menus that were converted\r
+               if(m_bImagesVisible)\r
+               {\r
+                       HMENU hMenuSav = NULL;\r
+                       while((hMenuSav = m_stackMenuHandle.Pop()) != NULL)\r
+                       {\r
+                               menuPopup = hMenuSav;\r
+                               BOOL bRet = FALSE;\r
+                               // restore state and delete menu item data\r
+                               for(int i = 0; i < menuPopup.GetMenuItemCount(); i++)\r
+                               {\r
+                                       CMenuItemInfo mii;\r
+                                       mii.fMask = MIIM_DATA | MIIM_TYPE | MIIM_ID;\r
+                                       bRet = menuPopup.GetMenuItemInfo(i, TRUE, &mii);\r
+                                       ATLASSERT(bRet);\r
+\r
+                                       _MenuItemData* pMI = (_MenuItemData*)mii.dwItemData;\r
+                                       if(pMI != NULL && pMI->IsCmdBarMenuItem())\r
+                                       {\r
+                                               mii.fMask = MIIM_DATA | MIIM_TYPE | MIIM_STATE;\r
+                                               mii.fType = pMI->fType;\r
+                                               mii.fState = pMI->fState;\r
+                                               mii.dwTypeData = pMI->lpstrText;\r
+                                               mii.cch = lstrlen(pMI->lpstrText);\r
+                                               mii.dwItemData = NULL;\r
+\r
+                                               bRet = menuPopup.SetMenuItemInfo(i, TRUE, &mii);\r
+                                               // this one triggers WM_MEASUREITEM\r
+                                               menuPopup.ModifyMenu(i, MF_BYPOSITION | mii.fType | mii.fState, mii.wID, pMI->lpstrText);\r
+                                               ATLASSERT(bRet);\r
+\r
+                                               delete [] pMI->lpstrText;\r
+                                               delete pMI;\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+               return bTrackRet;\r
+       }\r
+\r
+       int GetPreviousMenuItem(int nBtn) const\r
+       {\r
+               if(nBtn == -1)\r
+                       return -1;\r
+#if (_WIN32_IE >= 0x0500)\r
+               RECT rcClient;\r
+               GetClientRect(&rcClient);\r
+#endif // (_WIN32_IE >= 0x0500)\r
+               int nNextBtn;\r
+               for(nNextBtn = nBtn - 1; nNextBtn != nBtn; nNextBtn--)\r
+               {\r
+                       if(nNextBtn < 0)\r
+                               nNextBtn = ::GetMenuItemCount(m_hMenu) - 1;\r
+                       TBBUTTON tbb = { 0 };\r
+                       GetButton(nNextBtn, &tbb);\r
+#if (_WIN32_IE >= 0x0500)\r
+                       RECT rcBtn;\r
+                       GetItemRect(nNextBtn, &rcBtn);\r
+                       if(rcBtn.right > rcClient.right)\r
+                       {\r
+                               nNextBtn = -2;   // chevron\r
+                               break;\r
+                       }\r
+#endif // (_WIN32_IE >= 0x0500)\r
+                       if((tbb.fsState & TBSTATE_ENABLED) != 0 && (tbb.fsState & TBSTATE_HIDDEN) == 0)\r
+                               break;\r
+               }\r
+               return (nNextBtn != nBtn) ? nNextBtn : -1;\r
+       }\r
+\r
+       int GetNextMenuItem(int nBtn) const\r
+       {\r
+               if(nBtn == -1)\r
+                       return -1;\r
+#if (_WIN32_IE >= 0x0500)\r
+               RECT rcClient = { 0 };\r
+               GetClientRect(&rcClient);\r
+#endif // (_WIN32_IE >= 0x0500)\r
+               int nNextBtn = 0;\r
+               int nCount = ::GetMenuItemCount(m_hMenu);\r
+               for(nNextBtn = nBtn + 1; nNextBtn != nBtn; nNextBtn++)\r
+               {\r
+                       if(nNextBtn >= nCount)\r
+                               nNextBtn = 0;\r
+                       TBBUTTON tbb = { 0 };\r
+                       GetButton(nNextBtn, &tbb);\r
+#if (_WIN32_IE >= 0x0500)\r
+                       RECT rcBtn = { 0 };\r
+                       GetItemRect(nNextBtn, &rcBtn);\r
+                       if(rcBtn.right > rcClient.right)\r
+                       {\r
+                               nNextBtn = -2;   // chevron\r
+                               break;\r
+                       }\r
+#endif // (_WIN32_IE >= 0x0500)\r
+                       if((tbb.fsState & TBSTATE_ENABLED) != 0 && (tbb.fsState & TBSTATE_HIDDEN) == 0)\r
+                               break;\r
+               }\r
+               return (nNextBtn != nBtn) ? nNextBtn : -1;\r
+       }\r
+\r
+#if (_WIN32_IE >= 0x0500)\r
+       bool DisplayChevronMenu()\r
+       {\r
+               // assume we are in a rebar\r
+               HWND hWndReBar = GetParent();\r
+               int nCount = (int)::SendMessage(hWndReBar, RB_GETBANDCOUNT, 0, 0L);\r
+               bool bRet = false;\r
+               for(int i = 0; i < nCount; i++)\r
+               {\r
+                       REBARBANDINFO rbbi = { RunTimeHelper::SizeOf_REBARBANDINFO(), RBBIM_CHILD | RBBIM_STYLE };\r
+                       BOOL bRetBandInfo = (BOOL)::SendMessage(hWndReBar, RB_GETBANDINFO, i, (LPARAM)&rbbi);\r
+                       if(bRetBandInfo && rbbi.hwndChild == m_hWnd)\r
+                       {\r
+                               if((rbbi.fStyle & RBBS_USECHEVRON) != 0)\r
+                               {\r
+                                       ::PostMessage(hWndReBar, RB_PUSHCHEVRON, i, 0L);\r
+                                       PostMessage(WM_KEYDOWN, VK_DOWN, 0L);\r
+                                       bRet = true;\r
+                               }\r
+                               break;\r
+                       }\r
+               }\r
+               return bRet;\r
+       }\r
+#endif // (_WIN32_IE >= 0x0500)\r
+\r
+       void GetSystemSettings()\r
+       {\r
+               // refresh our font\r
+               NONCLIENTMETRICS info = { RunTimeHelper::SizeOf_NONCLIENTMETRICS() };\r
+               BOOL bRet = ::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(info), &info, 0);\r
+               ATLASSERT(bRet);\r
+               if(bRet)\r
+               {\r
+                       LOGFONT logfont = { 0 };\r
+                       if(m_fontMenu.m_hFont != NULL)\r
+                               m_fontMenu.GetLogFont(logfont);\r
+                       if(logfont.lfHeight != info.lfMenuFont.lfHeight ||\r
+                          logfont.lfWidth != info.lfMenuFont.lfWidth ||\r
+                          logfont.lfEscapement != info.lfMenuFont.lfEscapement ||\r
+                          logfont.lfOrientation != info.lfMenuFont.lfOrientation ||\r
+                          logfont.lfWeight != info.lfMenuFont.lfWeight ||\r
+                          logfont.lfItalic != info.lfMenuFont.lfItalic ||\r
+                          logfont.lfUnderline != info.lfMenuFont.lfUnderline ||\r
+                          logfont.lfStrikeOut != info.lfMenuFont.lfStrikeOut ||\r
+                          logfont.lfCharSet != info.lfMenuFont.lfCharSet ||\r
+                          logfont.lfOutPrecision != info.lfMenuFont.lfOutPrecision ||\r
+                          logfont.lfClipPrecision != info.lfMenuFont.lfClipPrecision ||\r
+                          logfont.lfQuality != info.lfMenuFont.lfQuality ||\r
+                          logfont.lfPitchAndFamily != info.lfMenuFont.lfPitchAndFamily ||\r
+                          lstrcmp(logfont.lfFaceName, info.lfMenuFont.lfFaceName) != 0)\r
+                       {\r
+                               HFONT hFontMenu = ::CreateFontIndirect(&info.lfMenuFont);\r
+                               ATLASSERT(hFontMenu != NULL);\r
+                               if(hFontMenu != NULL)\r
+                               {\r
+                                       if(m_fontMenu.m_hFont != NULL)\r
+                                               m_fontMenu.DeleteObject();\r
+                                       m_fontMenu.Attach(hFontMenu);\r
+                                       SetFont(m_fontMenu);\r
+                                       AddStrings(_T("NS\0"));   // for proper item height\r
+                                       AutoSize();\r
+                               }\r
+                       }\r
+               }\r
+\r
+               // check if we need extra spacing for menu item text\r
+               CWindowDC dc(m_hWnd);\r
+               HFONT hFontOld = dc.SelectFont(m_fontMenu);\r
+               RECT rcText = { 0, 0, 0, 0 };\r
+               dc.DrawText(_T("\t"), -1, &rcText, DT_SINGLELINE | DT_LEFT | DT_VCENTER | DT_CALCRECT);\r
+               if((rcText.right - rcText.left) < 4)\r
+               {\r
+                       ::SetRectEmpty(&rcText);\r
+                       dc.DrawText(_T("x"), -1, &rcText, DT_SINGLELINE | DT_LEFT | DT_VCENTER | DT_CALCRECT);\r
+                       m_cxExtraSpacing = rcText.right - rcText.left;\r
+               }\r
+               else\r
+               {\r
+                       m_cxExtraSpacing = 0;\r
+               }\r
+               dc.SelectFont(hFontOld);\r
+\r
+               // get Windows version\r
+               OSVERSIONINFO ovi = { sizeof(OSVERSIONINFO) };\r
+               ::GetVersionEx(&ovi);\r
+\r
+               // query keyboard cues mode (Windows 2000 or later)\r
+               if(ovi.dwMajorVersion >= 5)\r
+               {\r
+#ifndef SPI_GETKEYBOARDCUES\r
+                       const UINT SPI_GETKEYBOARDCUES = 0x100A;\r
+#endif // !SPI_GETKEYBOARDCUES\r
+                       BOOL bRetVal = TRUE;\r
+                       bRet = ::SystemParametersInfo(SPI_GETKEYBOARDCUES, 0, &bRetVal, 0);\r
+                       m_bUseKeyboardCues = (bRet && !bRetVal);\r
+                       m_bAllowKeyboardCues = true;\r
+                       ShowKeyboardCues(!m_bUseKeyboardCues);\r
+               }\r
+\r
+               // query flat menu mode (Windows XP or later)\r
+               if((ovi.dwMajorVersion == 5 && ovi.dwMinorVersion >= 1) || (ovi.dwMajorVersion > 5))\r
+               {\r
+#ifndef SPI_GETFLATMENU\r
+                       const UINT SPI_GETFLATMENU = 0x1022;\r
+#endif // !SPI_GETFLATMENU\r
+                       BOOL bRetVal = FALSE;\r
+                       bRet = ::SystemParametersInfo(SPI_GETFLATMENU, 0, &bRetVal, 0);\r
+                       m_bFlatMenus = (bRet && bRetVal);\r
+               }\r
+\r
+#if _WTL_CMDBAR_VISTA_MENUS\r
+               // check if we should use Vista menus\r
+               bool bVistaMenus = (RunTimeHelper::IsVista() && RunTimeHelper::IsCommCtrl6() && ((m_dwExtendedStyle & CBR_EX_NOVISTAMENUS) == 0));\r
+\r
+               if(bVistaMenus)\r
+               {\r
+                       HMODULE hThemeDLL = ::LoadLibrary(_T("uxtheme.dll"));\r
+                       if(hThemeDLL != NULL)\r
+                       {\r
+                               typedef BOOL (STDAPICALLTYPE *PFN_IsThemeActive)();\r
+                               PFN_IsThemeActive pfnIsThemeActive = (PFN_IsThemeActive)::GetProcAddress(hThemeDLL, "IsThemeActive");\r
+                               ATLASSERT(pfnIsThemeActive != NULL);\r
+                               bVistaMenus = bVistaMenus && (pfnIsThemeActive != NULL) && (pfnIsThemeActive() != FALSE);\r
+\r
+                               typedef BOOL (STDAPICALLTYPE *PFN_IsAppThemed)();\r
+                               PFN_IsAppThemed pfnIsAppThemed = (PFN_IsAppThemed)::GetProcAddress(hThemeDLL, "IsAppThemed");\r
+                               ATLASSERT(pfnIsAppThemed != NULL);\r
+                               bVistaMenus = bVistaMenus && (pfnIsAppThemed != NULL) && (pfnIsAppThemed() != FALSE);\r
+\r
+                               ::FreeLibrary(hThemeDLL);\r
+                       }\r
+               }\r
+\r
+               if(!bVistaMenus && m_bVistaMenus && (m_hMenu != NULL) && (m_arrCommand.GetSize() > 0))\r
+               {\r
+                       T* pT = static_cast<T*>(this);\r
+                       pT->_RemoveVistaBitmapsFromMenu();\r
+               }\r
+\r
+               m_bVistaMenus = bVistaMenus;\r
+#endif // _WTL_CMDBAR_VISTA_MENUS\r
+\r
+#ifdef _CMDBAR_EXTRA_TRACE\r
+               ATLTRACE2(atlTraceUI, 0, _T("CmdBar - GetSystemSettings:\n     m_bFlatMenus = %s\n     m_bUseKeyboardCues = %s     m_bVistaMenus = %s\n"),\r
+                       m_bFlatMenus ? "true" : "false", m_bUseKeyboardCues ? "true" : "false", m_bVistaMenus ? "true" : "false");\r
+#endif\r
+       }\r
+\r
+// Implementation - alternate focus mode support\r
+       void TakeFocus()\r
+       {\r
+               if((m_dwExtendedStyle & CBR_EX_ALTFOCUSMODE) && m_hWndFocus == NULL)\r
+                       m_hWndFocus = ::GetFocus();\r
+               SetFocus();\r
+       }\r
+\r
+       void GiveFocusBack()\r
+       {\r
+               if(m_bParentActive)\r
+               {\r
+                       if((m_dwExtendedStyle & CBR_EX_ALTFOCUSMODE) && ::IsWindow(m_hWndFocus))\r
+                               ::SetFocus(m_hWndFocus);\r
+                       else if(!(m_dwExtendedStyle & CBR_EX_ALTFOCUSMODE) && m_wndParent.IsWindow())\r
+                               m_wndParent.SetFocus();\r
+               }\r
+               m_hWndFocus = NULL;\r
+               SetAnchorHighlight(FALSE);\r
+               if(m_bUseKeyboardCues && m_bShowKeyboardCues)\r
+                       ShowKeyboardCues(false);\r
+               m_bSkipPostDown = false;\r
+       }\r
+\r
+       void ShowKeyboardCues(bool bShow)\r
+       {\r
+               m_bShowKeyboardCues = bShow;\r
+               SetDrawTextFlags(DT_HIDEPREFIX, m_bShowKeyboardCues ? 0 : DT_HIDEPREFIX);\r
+               Invalidate();\r
+               UpdateWindow();\r
+       }\r
+\r
+// Implementation - internal message helpers\r
+       static UINT GetAutoPopupMessage()\r
+       {\r
+               static UINT uAutoPopupMessage = 0;\r
+               if(uAutoPopupMessage == 0)\r
+               {\r
+                       CStaticDataInitCriticalSectionLock lock;\r
+                       if(FAILED(lock.Lock()))\r
+                       {\r
+                               ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CCommandBarCtrlImpl::GetAutoPopupMessage.\n"));\r
+                               ATLASSERT(FALSE);\r
+                               return 0;\r
+                       }\r
+\r
+                       if(uAutoPopupMessage == 0)\r
+                               uAutoPopupMessage = ::RegisterWindowMessage(_T("WTL_CmdBar_InternalAutoPopupMsg"));\r
+\r
+                       lock.Unlock();\r
+               }\r
+               ATLASSERT(uAutoPopupMessage != 0);\r
+               return uAutoPopupMessage;\r
+       }\r
+\r
+       static UINT GetGetBarMessage()\r
+       {\r
+               static UINT uGetBarMessage = 0;\r
+               if(uGetBarMessage == 0)\r
+               {\r
+                       CStaticDataInitCriticalSectionLock lock;\r
+                       if(FAILED(lock.Lock()))\r
+                       {\r
+                               ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CCommandBarCtrlImpl::GetGetBarMessage.\n"));\r
+                               ATLASSERT(FALSE);\r
+                               return 0;\r
+                       }\r
+\r
+                       if(uGetBarMessage == 0)\r
+                               uGetBarMessage = ::RegisterWindowMessage(_T("WTL_CmdBar_InternalGetBarMsg"));\r
+\r
+                       lock.Unlock();\r
+               }\r
+               ATLASSERT(uGetBarMessage != 0);\r
+               return uGetBarMessage;\r
+       }\r
+\r
+// Implementation\r
+       bool CreateInternalImageList(int cImages)\r
+       {\r
+               UINT uFlags = (m_bAlphaImages ? ILC_COLOR32 : ILC_COLOR24) | ILC_MASK;\r
+               m_hImageList = ::ImageList_Create(m_szBitmap.cx, m_szBitmap.cy, uFlags, cImages, 1);\r
+               ATLASSERT(m_hImageList != NULL);\r
+               return (m_hImageList != NULL);\r
+       }\r
+\r
+// Implementation - support for Vista menus\r
+#if _WTL_CMDBAR_VISTA_MENUS\r
+       void _AddVistaBitmapsFromImageList(int nStartIndex, int nCount)\r
+       {\r
+               // Create display compatible memory DC\r
+               HDC hDC = ::GetDC(NULL);\r
+               CDC dcMem;\r
+               dcMem.CreateCompatibleDC(hDC);\r
+               HBITMAP hBitmapSave = dcMem.GetCurrentBitmap();\r
+\r
+               T* pT = static_cast<T*>(this);\r
+               // Create bitmaps for all menu items\r
+               for(int i = 0; i < nCount; i++)\r
+               {\r
+                       HBITMAP hBitmap = pT->_CreateVistaBitmapHelper(nStartIndex + i, hDC, dcMem);\r
+                       dcMem.SelectBitmap(hBitmapSave);\r
+                       m_arrVistaBitmap.Add(hBitmap);\r
+               }\r
+       }\r
+\r
+       void _AddVistaBitmapFromImageList(int nIndex)\r
+       {\r
+               // Create display compatible memory DC\r
+               HDC hDC = ::GetDC(NULL);\r
+               CDC dcMem;\r
+               dcMem.CreateCompatibleDC(hDC);\r
+               HBITMAP hBitmapSave = dcMem.GetCurrentBitmap();\r
+\r
+               // Create bitmap for menu item\r
+               T* pT = static_cast<T*>(this);\r
+               HBITMAP hBitmap = pT->_CreateVistaBitmapHelper(nIndex, hDC, dcMem);\r
+\r
+               // Select saved bitmap back and add bitmap to the array\r
+               dcMem.SelectBitmap(hBitmapSave);\r
+               m_arrVistaBitmap.Add(hBitmap);\r
+       }\r
+\r
+       void _ReplaceVistaBitmapFromImageList(int nIndex)\r
+       {\r
+               // Delete existing bitmap\r
+               if(m_arrVistaBitmap[nIndex] != NULL)\r
+                       ::DeleteObject(m_arrVistaBitmap[nIndex]);\r
+\r
+               // Create display compatible memory DC\r
+               HDC hDC = ::GetDC(NULL);\r
+               CDC dcMem;\r
+               dcMem.CreateCompatibleDC(hDC);\r
+               HBITMAP hBitmapSave = dcMem.GetCurrentBitmap();\r
+\r
+               // Create bitmap for menu item\r
+               T* pT = static_cast<T*>(this);\r
+               HBITMAP hBitmap = pT->_CreateVistaBitmapHelper(nIndex, hDC, dcMem);\r
+\r
+               // Select saved bitmap back and replace bitmap in the array\r
+               dcMem.SelectBitmap(hBitmapSave);\r
+               m_arrVistaBitmap.SetAtIndex(nIndex, hBitmap);\r
+       }\r
+\r
+       HBITMAP _CreateVistaBitmapHelper(int nIndex, HDC hDCSource, HDC hDCTarget)\r
+       {\r
+               // Create 32-bit bitmap\r
+               BITMAPINFO bi = { 0 };\r
+               bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);\r
+               bi.bmiHeader.biWidth = m_szBitmap.cx;\r
+               bi.bmiHeader.biHeight = m_szBitmap.cy;\r
+               bi.bmiHeader.biPlanes = 1;\r
+               bi.bmiHeader.biBitCount = 32;\r
+               bi.bmiHeader.biCompression = BI_RGB;\r
+               bi.bmiHeader.biSizeImage = 0;\r
+               bi.bmiHeader.biXPelsPerMeter = 0;\r
+               bi.bmiHeader.biYPelsPerMeter = 0;\r
+               bi.bmiHeader.biClrUsed = 0;\r
+               bi.bmiHeader.biClrImportant = 0;\r
+               HBITMAP hBitmap = ::CreateDIBSection(hDCSource, &bi, DIB_RGB_COLORS, NULL, NULL, 0);\r
+               ATLASSERT(hBitmap != NULL);\r
+\r
+               // Select bitmap into target DC and draw from image list to it\r
+               if(hBitmap != NULL)\r
+               {\r
+                       ::SelectObject(hDCTarget, hBitmap);\r
+\r
+                       IMAGELISTDRAWPARAMS ildp = { 0 };\r
+                       ildp.cbSize = sizeof(IMAGELISTDRAWPARAMS);\r
+                       ildp.himl = m_hImageList;\r
+                       ildp.i = nIndex;\r
+                       ildp.hdcDst = hDCTarget;\r
+                       ildp.x = 0;\r
+                       ildp.y = 0;\r
+                       ildp.cx = 0;\r
+                       ildp.cy = 0;\r
+                       ildp.xBitmap = 0;\r
+                       ildp.yBitmap = 0;\r
+                       ildp.fStyle = ILD_TRANSPARENT;\r
+                       ildp.fState = ILS_ALPHA;\r
+                       ildp.Frame = 255;\r
+                       ::ImageList_DrawIndirect(&ildp);\r
+               }\r
+\r
+               return hBitmap;\r
+       }\r
+\r
+       void _RemoveVistaBitmapsFromMenu()\r
+       {\r
+               CMenuHandle menu = m_hMenu;\r
+               for(int i = 0; i < m_arrCommand.GetSize(); i++)\r
+               {\r
+                       CMenuItemInfo mii;\r
+                       mii.fMask = MIIM_BITMAP;\r
+                       mii.hbmpItem = NULL;\r
+                       menu.SetMenuItemInfo(m_arrCommand[i], FALSE, &mii);\r
+               }\r
+       }\r
+#endif // _WTL_CMDBAR_VISTA_MENUS\r
+};\r
+\r
+\r
+class CCommandBarCtrl : public CCommandBarCtrlImpl<CCommandBarCtrl>\r
+{\r
+public:\r
+       DECLARE_WND_SUPERCLASS(_T("WTL_CommandBar"), GetWndClassName())\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CMDICommandBarCtrl - ATL implementation of Command Bars for MDI apps\r
+\r
+template <class T, class TBase = CCommandBarCtrlBase, class TWinTraits = ATL::CControlWinTraits>\r
+class ATL_NO_VTABLE CMDICommandBarCtrlImpl : public CCommandBarCtrlImpl< T, TBase, TWinTraits>\r
+{\r
+public:\r
+// Data members\r
+       ATL::CContainedWindow m_wndMDIClient;\r
+       bool m_bChildMaximized;\r
+       HWND m_hWndChildMaximized;\r
+       HICON m_hIconChildMaximized;\r
+       int m_nBtnPressed;\r
+       int m_nBtnWasPressed;\r
+\r
+       int m_cxyOffset;      // offset between nonclient elements\r
+       int m_cxIconWidth;    // small icon width\r
+       int m_cyIconHeight;   // small icon height\r
+       int m_cxBtnWidth;     // nonclient button width\r
+       int m_cyBtnHeight;    // nonclient button height\r
+       int m_cxLeft;         // left nonclient area width\r
+       int m_cxRight;        // right nonclient area width\r
+\r
+// Theme declarations and data members\r
+#ifndef _WTL_NO_AUTO_THEME\r
+#ifndef _UXTHEME_H_\r
+       typedef HANDLE HTHEME;\r
+#endif // !_UXTHEME_H_\r
+       typedef HTHEME (STDAPICALLTYPE *PFN_OpenThemeData)(HWND hwnd, LPCWSTR pszClassList);\r
+       typedef HRESULT (STDAPICALLTYPE *PFN_CloseThemeData)(HTHEME hTheme);\r
+       typedef HRESULT (STDAPICALLTYPE *PFN_DrawThemeBackground)(HTHEME hTheme, HDC hdc, int iPartId, int iStateId, const RECT *pRect, OPTIONAL const RECT *pClipRect);\r
+       typedef HRESULT (STDAPICALLTYPE *PFN_DrawThemeParentBackground)(HWND hwnd, HDC hdc, OPTIONAL RECT* prc);\r
+\r
+       HMODULE m_hThemeDLL;\r
+       HTHEME m_hTheme;\r
+       PFN_DrawThemeBackground m_pfnDrawThemeBackground;\r
+       PFN_DrawThemeParentBackground m_pfnDrawThemeParentBackground;\r
+#endif // !_WTL_NO_AUTO_THEME\r
+\r
+// Constructor/destructor\r
+       CMDICommandBarCtrlImpl() : \r
+                       m_wndMDIClient(this, 2), m_bChildMaximized(false), \r
+                       m_hWndChildMaximized(NULL), m_hIconChildMaximized(NULL), \r
+                       m_nBtnPressed(-1), m_nBtnWasPressed(-1),\r
+#ifndef _WTL_NO_AUTO_THEME\r
+                       m_hThemeDLL(NULL), m_hTheme(NULL), m_pfnDrawThemeBackground(NULL), m_pfnDrawThemeParentBackground(NULL), \r
+#endif // !_WTL_NO_AUTO_THEME\r
+                       m_cxyOffset(2),\r
+                       m_cxIconWidth(16), m_cyIconHeight(16),\r
+                       m_cxBtnWidth(16), m_cyBtnHeight(14),\r
+                       m_cxLeft(20), m_cxRight(55)\r
+       { }\r
+\r
+       ~CMDICommandBarCtrlImpl()\r
+       {\r
+               if(m_wndMDIClient.IsWindow())\r
+/*scary!*/                     m_wndMDIClient.UnsubclassWindow();\r
+       }\r
+\r
+// Operations\r
+       BOOL SetMDIClient(HWND hWndMDIClient)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(::IsWindow(hWndMDIClient));\r
+               if(!::IsWindow(hWndMDIClient))\r
+                       return FALSE;\r
+\r
+#ifdef _DEBUG\r
+               // BLOCK: Test if the passed window is MDICLIENT\r
+               {\r
+                       LPCTSTR lpszMDIClientClass = _T("MDICLIENT");\r
+                       const int nNameLen = 9 + 1;   // "MDICLIENT" + NULL\r
+                       TCHAR szClassName[nNameLen] = { 0 };\r
+                       ::GetClassName(hWndMDIClient, szClassName, nNameLen);\r
+                       ATLASSERT(lstrcmpi(szClassName, lpszMDIClientClass) == 0);\r
+               }\r
+#endif // _DEBUG\r
+\r
+               if(m_wndMDIClient.IsWindow())\r
+/*scary!*/             m_wndMDIClient.UnsubclassWindow();\r
+\r
+               return m_wndMDIClient.SubclassWindow(hWndMDIClient);\r
+       }\r
+\r
+// Message maps\r
+       typedef CCommandBarCtrlImpl< T, TBase, TWinTraits >   _baseClass;\r
+       BEGIN_MSG_MAP(CMDICommandBarCtrlImpl)\r
+               MESSAGE_HANDLER(WM_CREATE, OnCreate)\r
+               MESSAGE_HANDLER(WM_DESTROY, OnDestroy)\r
+#ifndef _WTL_NO_AUTO_THEME\r
+               MESSAGE_HANDLER(_GetThemeChangedMsg(), OnThemeChanged)\r
+#endif // !_WTL_NO_AUTO_THEME\r
+               MESSAGE_HANDLER(WM_SIZE, OnSize)\r
+               MESSAGE_HANDLER(WM_NCCALCSIZE, OnNcCalcSize)\r
+               MESSAGE_HANDLER(WM_NCPAINT, OnNcPaint)\r
+               MESSAGE_HANDLER(WM_NCHITTEST, OnNcHitTest)\r
+               MESSAGE_HANDLER(WM_NCLBUTTONDOWN, OnNcLButtonDown)\r
+               MESSAGE_HANDLER(WM_MOUSEMOVE, OnMouseMove)\r
+               MESSAGE_HANDLER(WM_LBUTTONUP, OnLButtonUp)\r
+               MESSAGE_HANDLER(WM_NCLBUTTONDBLCLK, OnNcLButtonDblClk)\r
+               MESSAGE_HANDLER(WM_CAPTURECHANGED, OnCaptureChanged)\r
+               CHAIN_MSG_MAP(_baseClass)\r
+       ALT_MSG_MAP(1)   // Parent window messages\r
+               MESSAGE_HANDLER(WM_ACTIVATE, OnParentActivate)\r
+               CHAIN_MSG_MAP_ALT(_baseClass, 1)\r
+       ALT_MSG_MAP(2)   // MDI client window messages\r
+               MESSAGE_HANDLER(WM_MDISETMENU, OnMDISetMenu)\r
+               // no chaining needed since this was moved from the base class here\r
+       ALT_MSG_MAP(3)   // Message hook messages\r
+               MESSAGE_RANGE_HANDLER(0, 0xFFFF, OnAllHookMessages)\r
+               CHAIN_MSG_MAP_ALT(_baseClass, 3)\r
+       END_MSG_MAP()\r
+\r
+// Additional MDI message handlers\r
+       LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)\r
+       {\r
+               LRESULT lRet = _baseClass::OnCreate(uMsg, wParam, lParam, bHandled);\r
+               if(lRet == (LRESULT)-1)\r
+                       return lRet;\r
+\r
+#ifndef _WTL_NO_AUTO_THEME\r
+               // this will fail if theming is not supported\r
+               m_hThemeDLL = ::LoadLibrary(_T("uxtheme.dll"));\r
+               if(m_hThemeDLL != NULL)\r
+               {\r
+                       m_pfnDrawThemeBackground = (PFN_DrawThemeBackground)::GetProcAddress(m_hThemeDLL, "DrawThemeBackground");\r
+                       ATLASSERT(m_pfnDrawThemeBackground != NULL);\r
+                       if(m_pfnDrawThemeBackground != NULL)\r
+                       {\r
+                               T* pT = static_cast<T*>(this);\r
+                               pT->_OpenThemeData();\r
+                       }\r
+                       else\r
+                       {\r
+                               ::FreeLibrary(m_hThemeDLL);\r
+                               m_hThemeDLL = NULL;\r
+                       }\r
+                       m_pfnDrawThemeParentBackground = (PFN_DrawThemeParentBackground)::GetProcAddress(m_hThemeDLL, "DrawThemeParentBackground");\r
+                       ATLASSERT(m_pfnDrawThemeParentBackground != NULL);\r
+               }\r
+#endif // !_WTL_NO_AUTO_THEME\r
+\r
+               return lRet;\r
+       }\r
+\r
+       LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)\r
+       {\r
+               LRESULT lRet = _baseClass::OnDestroy(uMsg, wParam, lParam, bHandled);\r
+\r
+#ifndef _WTL_NO_AUTO_THEME\r
+               if(m_hThemeDLL != NULL)\r
+               {\r
+                       T* pT = static_cast<T*>(this);\r
+                       pT->_CloseThemeData();\r
+                       ::FreeLibrary(m_hThemeDLL);\r
+                       m_hThemeDLL = NULL;\r
+               }\r
+#endif // !_WTL_NO_AUTO_THEME\r
+\r
+               return lRet;\r
+       }\r
+\r
+#ifndef _WTL_NO_AUTO_THEME\r
+       LRESULT OnThemeChanged(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)\r
+       {\r
+               if(m_hThemeDLL != NULL)\r
+               {\r
+                       T* pT = static_cast<T*>(this);\r
+                       pT->_CloseThemeData();\r
+                       pT->_OpenThemeData();\r
+               }\r
+               return 0;\r
+       }\r
+#endif // !_WTL_NO_AUTO_THEME\r
+\r
+       LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)\r
+       {\r
+               LRESULT lRet = DefWindowProc(uMsg, wParam, lParam);\r
+               T* pT = static_cast<T*>(this);\r
+               pT->_AdjustBtnSize(GET_Y_LPARAM(lParam));\r
+               return lRet;\r
+       }\r
+\r
+       LRESULT OnNcCalcSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)\r
+       {\r
+               LRESULT lRet = DefWindowProc(uMsg, wParam, lParam);\r
+\r
+               if(m_bChildMaximized && (BOOL)wParam)\r
+               {\r
+                       LPNCCALCSIZE_PARAMS lpParams = (LPNCCALCSIZE_PARAMS)lParam;\r
+                       if(m_bLayoutRTL)\r
+                       {\r
+                               lpParams->rgrc[0].left += m_cxRight;\r
+                               lpParams->rgrc[0].right -= m_cxLeft;\r
+                       }\r
+                       else\r
+                       {\r
+                               lpParams->rgrc[0].left += m_cxLeft;\r
+                               lpParams->rgrc[0].right -= m_cxRight;\r
+                       }\r
+               }\r
+\r
+               return lRet;\r
+       }\r
+\r
+       LRESULT OnNcPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)\r
+       {\r
+               LRESULT lRet = DefWindowProc(uMsg, wParam, lParam);\r
+\r
+               if(!m_bChildMaximized)\r
+                       return lRet;\r
+\r
+               ATLASSERT(m_hWndChildMaximized != NULL && m_hIconChildMaximized != NULL);\r
+\r
+               // get DC and window rectangle\r
+               CWindowDC dc(m_hWnd);\r
+               RECT rect;\r
+               GetWindowRect(&rect);\r
+               int cxWidth = rect.right - rect.left;\r
+               int cyHeight = rect.bottom - rect.top;\r
+\r
+               // paint left side nonclient background and draw icon\r
+               ::SetRect(&rect, 0, 0, m_cxLeft, cyHeight);\r
+#ifndef _WTL_NO_AUTO_THEME\r
+               if(m_hTheme != NULL)\r
+               {\r
+                       if(m_pfnDrawThemeParentBackground != NULL)\r
+                               m_pfnDrawThemeParentBackground(m_hWnd, dc, &rect);\r
+                       else\r
+                               dc.FillRect(&rect, COLOR_WINDOW);\r
+               }\r
+               else\r
+#endif // !_WTL_NO_AUTO_THEME\r
+               {\r
+                       if((m_dwExtendedStyle & CBR_EX_TRANSPARENT) != 0)\r
+                               dc.FillRect(&rect, COLOR_3DFACE);\r
+                       else\r
+                               dc.FillRect(&rect, COLOR_MENU);\r
+               }\r
+\r
+               RECT rcIcon = { 0 };\r
+               T* pT = static_cast<T*>(this);\r
+               pT->_CalcIconRect(cxWidth, cyHeight, rcIcon);\r
+               dc.DrawIconEx(rcIcon.left, rcIcon.top, m_hIconChildMaximized, m_cxIconWidth, m_cyIconHeight);\r
+\r
+               // paint right side nonclient background\r
+               ::SetRect(&rect, cxWidth - m_cxRight, 0, cxWidth, cyHeight);\r
+#ifndef _WTL_NO_AUTO_THEME\r
+               if(m_hTheme != NULL)\r
+               {\r
+                       if(m_pfnDrawThemeParentBackground != NULL)\r
+                       {\r
+                               // this is to account for the left non-client area\r
+                               POINT ptOrg = { 0, 0 };\r
+                               dc.GetViewportOrg(&ptOrg);\r
+                               dc.SetViewportOrg(ptOrg.x + m_cxLeft, ptOrg.y);\r
+                               ::OffsetRect(&rect, -m_cxLeft, 0);\r
+\r
+                               m_pfnDrawThemeParentBackground(m_hWnd, dc, &rect);\r
+\r
+                               // restore\r
+                               dc.SetViewportOrg(ptOrg);\r
+                               ::OffsetRect(&rect, m_cxLeft, 0);\r
+                       }\r
+                       else\r
+                       {\r
+                               dc.FillRect(&rect, COLOR_3DFACE);\r
+                       }\r
+               }\r
+               else\r
+#endif // !_WTL_NO_AUTO_THEME\r
+               {\r
+                       if((m_dwExtendedStyle & CBR_EX_TRANSPARENT) != 0)\r
+                               dc.FillRect(&rect, COLOR_3DFACE);\r
+                       else\r
+                               dc.FillRect(&rect, COLOR_MENU);\r
+               }\r
+\r
+               // draw buttons\r
+               RECT arrRect[3] = { 0 };\r
+               pT->_CalcBtnRects(cxWidth, cyHeight, arrRect);\r
+               pT->_DrawMDIButton(dc, arrRect, -1);   // draw all buttons\r
+\r
+               return lRet;\r
+       }\r
+\r
+       LRESULT OnNcHitTest(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)\r
+       {\r
+               LRESULT lRet = DefWindowProc(uMsg, wParam, lParam);\r
+               if(m_bChildMaximized)\r
+               {\r
+                       RECT rect = { 0 };\r
+                       GetWindowRect(&rect);\r
+                       POINT pt = { GET_X_LPARAM(lParam) - rect.left, GET_Y_LPARAM(lParam) - rect.top };\r
+                       if(m_bLayoutRTL)\r
+                       {\r
+                               if((pt.x < m_cxRight) || (pt.x > ((rect.right - rect.left) - m_cxLeft)))\r
+                                       lRet = HTBORDER;\r
+                       }\r
+                       else\r
+                       {\r
+                               if((pt.x < m_cxLeft) || (pt.x > ((rect.right - rect.left) - m_cxRight)))\r
+                                       lRet = HTBORDER;\r
+                       }\r
+               }\r
+               return lRet;\r
+       }\r
+\r
+       LRESULT OnNcLButtonDown(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled)\r
+       {\r
+               if(!m_bChildMaximized)\r
+               {\r
+                       bHandled = FALSE;\r
+                       return 1;\r
+               }\r
+\r
+               ATLASSERT(_DebugCheckChild());\r
+\r
+               POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };\r
+               RECT rect = { 0 };\r
+               GetWindowRect(&rect);\r
+               pt.x -= rect.left;\r
+               pt.y -= rect.top;\r
+\r
+               RECT rcIcon = { 0 };\r
+               T* pT = static_cast<T*>(this);\r
+               pT->_CalcIconRect(rect.right - rect.left, rect.bottom - rect.top, rcIcon, m_bLayoutRTL);\r
+               RECT arrRect[3] = { 0 };\r
+               pT->_CalcBtnRects(rect.right - rect.left, rect.bottom - rect.top, arrRect, m_bLayoutRTL);\r
+\r
+               if(::PtInRect(&rcIcon, pt))\r
+               {\r
+#ifdef _CMDBAR_EXTRA_TRACE\r
+                       ATLTRACE2(atlTraceUI, 0, _T("MDI CmdBar - LButtonDown: icon\n"));\r
+#endif\r
+#ifndef TPM_VERPOSANIMATION\r
+                       const UINT TPM_VERPOSANIMATION = 0x1000L;   // Menu animation flag\r
+#endif\r
+                       CMenuHandle menu = ::GetSystemMenu(m_hWndChildMaximized, FALSE);\r
+                       UINT uRet = (UINT)menu.TrackPopupMenu(TPM_LEFTBUTTON | TPM_VERTICAL | TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RETURNCMD |  \r
+                               (s_bW2K ? TPM_VERPOSANIMATION : 0), m_bLayoutRTL ? rect.right : rect.left, rect.bottom, m_hWndChildMaximized);\r
+\r
+                       // eat next message if click is on the same button\r
+                       ::OffsetRect(&rcIcon, rect.left, rect.top);\r
+                       MSG msg = { 0 };\r
+                       if(::PeekMessage(&msg, m_hWnd, WM_NCLBUTTONDOWN, WM_NCLBUTTONDOWN, PM_NOREMOVE) && ::PtInRect(&rcIcon, msg.pt))\r
+                               ::PeekMessage(&msg, m_hWnd, WM_NCLBUTTONDOWN, WM_NCLBUTTONDOWN, PM_REMOVE);\r
+\r
+                       if(uRet != 0)\r
+                               ::SendMessage(m_hWndChildMaximized, WM_SYSCOMMAND, uRet, 0L);\r
+               }\r
+               else if(::PtInRect(&arrRect[0], pt))\r
+               {\r
+#ifdef _CMDBAR_EXTRA_TRACE\r
+                       ATLTRACE2(atlTraceUI, 0, _T("MDI CmdBar - LButtonDown: close button\n"));\r
+#endif\r
+                       m_nBtnWasPressed = m_nBtnPressed = 0;\r
+               }\r
+               else if(::PtInRect(&arrRect[1], pt))\r
+               {\r
+#ifdef _CMDBAR_EXTRA_TRACE\r
+                       ATLTRACE2(atlTraceUI, 0, _T("MDI CmdBar - LButtonDown: restore button\n"));\r
+#endif\r
+                       m_nBtnWasPressed = m_nBtnPressed = 1;\r
+               }\r
+               else if(::PtInRect(&arrRect[2], pt))\r
+               {\r
+#ifdef _CMDBAR_EXTRA_TRACE\r
+                       ATLTRACE2(atlTraceUI, 0, _T("MDI CmdBar - LButtonDown: minimize button\n"));\r
+#endif\r
+                       m_nBtnWasPressed = m_nBtnPressed = 2;\r
+               }\r
+               else\r
+               {\r
+                       bHandled = FALSE;\r
+               }\r
+\r
+               // draw the button state if it was pressed\r
+               if(m_nBtnPressed != -1)\r
+               {\r
+                       SetCapture();\r
+                       CWindowDC dc(m_hWnd);\r
+                       pT->_CalcBtnRects(rect.right - rect.left, rect.bottom - rect.top, arrRect);\r
+                       pT->_DrawMDIButton(dc, arrRect, m_nBtnPressed);\r
+               }\r
+\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnMouseMove(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled)\r
+       {\r
+               if(!m_bChildMaximized || ::GetCapture() != m_hWnd || m_nBtnWasPressed == -1)\r
+               {\r
+                       bHandled = FALSE;\r
+                       return 1;\r
+               }\r
+\r
+               POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };\r
+               ClientToScreen(&pt);\r
+               RECT rect = { 0 };\r
+               GetWindowRect(&rect);\r
+               pt.x -= rect.left;\r
+               pt.y -= rect.top;\r
+               RECT arrRect[3] = { 0 };\r
+               T* pT = static_cast<T*>(this);\r
+               pT->_CalcBtnRects(rect.right - rect.left, rect.bottom - rect.top, arrRect, m_bLayoutRTL);\r
+               int nOldBtnPressed = m_nBtnPressed;\r
+               m_nBtnPressed = ::PtInRect(&arrRect[m_nBtnWasPressed], pt) ? m_nBtnWasPressed : -1;\r
+               if(nOldBtnPressed != m_nBtnPressed)\r
+               {\r
+                       CWindowDC dc(m_hWnd);\r
+                       pT->_CalcBtnRects(rect.right - rect.left, rect.bottom - rect.top, arrRect);\r
+                       pT->_DrawMDIButton(dc, arrRect, (m_nBtnPressed != -1) ? m_nBtnPressed : nOldBtnPressed);\r
+               }\r
+\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnLButtonUp(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled)\r
+       {\r
+               if(!m_bChildMaximized || ::GetCapture() != m_hWnd || m_nBtnWasPressed == -1)\r
+               {\r
+                       bHandled = FALSE;\r
+                       return 1;\r
+               }\r
+\r
+               ATLASSERT(_DebugCheckChild());\r
+\r
+               POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };\r
+               ClientToScreen(&pt);\r
+               RECT rect = { 0 };\r
+               GetWindowRect(&rect);\r
+               pt.x -= rect.left;\r
+               pt.y -= rect.top;\r
+\r
+               int nBtn = m_nBtnWasPressed;\r
+               ReleaseCapture();\r
+\r
+               RECT arrRect[3] = { 0 };\r
+               T* pT = static_cast<T*>(this);\r
+               pT->_CalcBtnRects(rect.right - rect.left, rect.bottom - rect.top, arrRect, m_bLayoutRTL);\r
+               if(::PtInRect(&arrRect[nBtn], pt))\r
+               {\r
+                       switch(nBtn)\r
+                       {\r
+                       case 0:         // close\r
+#ifdef _CMDBAR_EXTRA_TRACE\r
+                               ATLTRACE2(atlTraceUI, 0, _T("MDI CmdBar - LButtonUp: close button\n"));\r
+#endif\r
+                               ::SendMessage(m_hWndChildMaximized, WM_SYSCOMMAND, SC_CLOSE, 0L);\r
+                               break;\r
+                       case 1:         // restore\r
+#ifdef _CMDBAR_EXTRA_TRACE\r
+                               ATLTRACE2(atlTraceUI, 0, _T("MDI CmdBar - LButtonUp: restore button\n"));\r
+#endif\r
+                               ::SendMessage(m_hWndChildMaximized, WM_SYSCOMMAND, SC_RESTORE, 0L);\r
+                               break;\r
+                       case 2:         // minimize\r
+#ifdef _CMDBAR_EXTRA_TRACE\r
+                               ATLTRACE2(atlTraceUI, 0, _T("MDI CmdBar - LButtonUp: minimize button\n"));\r
+#endif\r
+                               ::SendMessage(m_hWndChildMaximized, WM_SYSCOMMAND, SC_MINIMIZE, 0L);\r
+                               break;\r
+                       default:\r
+                               break;\r
+                       }\r
+               }\r
+\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnNcLButtonDblClk(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled)\r
+       {\r
+               if(!m_bChildMaximized || m_nBtnWasPressed != -1)\r
+               {\r
+                       bHandled = FALSE;\r
+                       return 1;\r
+               }\r
+\r
+               ATLASSERT(_DebugCheckChild());\r
+\r
+               POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };\r
+               RECT rect = { 0 };\r
+               GetWindowRect(&rect);\r
+               pt.x -= rect.left;\r
+               pt.y -= rect.top;\r
+\r
+               RECT rcIcon = { 0 };\r
+               T* pT = static_cast<T*>(this);\r
+               pT->_CalcIconRect(rect.right - rect.left, rect.bottom - rect.top, rcIcon, m_bLayoutRTL);\r
+               RECT arrRect[3] = { 0 };\r
+               pT->_CalcBtnRects(rect.right - rect.left, rect.bottom - rect.top, arrRect, m_bLayoutRTL);\r
+\r
+               if(::PtInRect(&rcIcon, pt))\r
+               {\r
+                       CMenuHandle menu = ::GetSystemMenu(m_hWndChildMaximized, FALSE);\r
+                       UINT uDefID = menu.GetMenuDefaultItem();\r
+                       if(uDefID == (UINT)-1)\r
+                               uDefID = SC_CLOSE;\r
+                       ::SendMessage(m_hWndChildMaximized, WM_SYSCOMMAND, uDefID, 0L);\r
+               }\r
+\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnCaptureChanged(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)\r
+       {\r
+               if(m_bChildMaximized)\r
+               {\r
+                       if(m_nBtnPressed != -1)\r
+                       {\r
+                               ATLASSERT(m_nBtnPressed == m_nBtnWasPressed);   // must be\r
+                               m_nBtnPressed = -1;\r
+                               RECT rect = { 0 };\r
+                               GetWindowRect(&rect);\r
+                               RECT arrRect[3] = { 0 };\r
+                               T* pT = static_cast<T*>(this);\r
+                               pT->_CalcBtnRects(rect.right - rect.left, rect.bottom - rect.top, arrRect);\r
+                               CWindowDC dc(m_hWnd);\r
+                               pT->_DrawMDIButton(dc, arrRect, m_nBtnWasPressed);\r
+                       }\r
+                       m_nBtnWasPressed = -1;\r
+               }\r
+               else\r
+               {\r
+                       bHandled = FALSE;\r
+               }\r
+               return 0;\r
+       }\r
+\r
+// Parent window message handlers\r
+       LRESULT OnParentActivate(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)\r
+       {\r
+               m_bParentActive = (LOWORD(wParam) != WA_INACTIVE);\r
+               RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_FRAME | RDW_UPDATENOW);\r
+               bHandled = FALSE;\r
+               return 1;\r
+       }\r
+\r
+// MDI client window message handlers\r
+       LRESULT OnMDISetMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)\r
+       {\r
+               m_wndMDIClient.DefWindowProc(uMsg, NULL, lParam);\r
+               HMENU hOldMenu = GetMenu();\r
+               BOOL bRet = AttachMenu((HMENU)wParam);\r
+               bRet;   // avoid level 4 warning\r
+               ATLASSERT(bRet);\r
+\r
+#if (_WIN32_IE >= 0x0400)\r
+               T* pT = static_cast<T*>(this);\r
+               pT->UpdateRebarBandIdealSize();\r
+#endif // (_WIN32_IE >= 0x0400)\r
+\r
+               return (LRESULT)hOldMenu;\r
+       }\r
+\r
+// All messages from the message hook\r
+       LRESULT OnAllHookMessages(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               pT->_ProcessAllHookMessages(uMsg, wParam, lParam);\r
+\r
+               bHandled = FALSE;\r
+               return 1;\r
+       }\r
+\r
+// Overrideables\r
+       // override this to provide different ideal size\r
+       void UpdateRebarBandIdealSize()\r
+       {\r
+               // assuming we are in a rebar, change ideal size to our size\r
+               // we hope that if we are not in a rebar, nCount will be 0\r
+               int nCount = (int)::SendMessage(GetParent(), RB_GETBANDCOUNT, 0, 0L);\r
+               for(int i = 0; i < nCount; i++)\r
+               {\r
+                       REBARBANDINFO rbi = { RunTimeHelper::SizeOf_REBARBANDINFO(), RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_IDEALSIZE };\r
+                       ::SendMessage(GetParent(), RB_GETBANDINFO, i, (LPARAM)&rbi);\r
+                       if(rbi.hwndChild == m_hWnd)\r
+                       {\r
+                               rbi.fMask = RBBIM_IDEALSIZE;\r
+                               rbi.cxIdeal = m_bChildMaximized ? m_cxLeft + m_cxRight : 0;\r
+                               int nBtnCount = GetButtonCount();\r
+                               if(nBtnCount > 0)\r
+                               {\r
+                                       RECT rect = { 0 };\r
+                                       GetItemRect(nBtnCount - 1, &rect);\r
+                                       rbi.cxIdeal += rect.right;\r
+                               }\r
+                               ::SendMessage(GetParent(), RB_SETBANDINFO, i, (LPARAM)&rbi);\r
+                               break;\r
+                       }\r
+               }\r
+       }\r
+\r
+       // all hook messages - check for the maximized MDI child window change\r
+       void _ProcessAllHookMessages(UINT uMsg, WPARAM /*wParam*/, LPARAM /*lParam*/)\r
+       {\r
+               if(uMsg == WM_MDIGETACTIVE || uMsg == WM_MDISETMENU)\r
+                       return;\r
+\r
+               BOOL bMaximized = FALSE;\r
+               HWND hWndChild = (HWND)::SendMessage(m_wndMDIClient, WM_MDIGETACTIVE, 0, (LPARAM)&bMaximized);\r
+               bool bMaxOld = m_bChildMaximized;\r
+               m_bChildMaximized = (hWndChild != NULL && bMaximized);\r
+               HICON hIconOld = m_hIconChildMaximized;\r
+\r
+               if(m_bChildMaximized)\r
+               {\r
+                       if(m_hWndChildMaximized != hWndChild)\r
+                       {\r
+                               ATL::CWindow wnd = m_hWndChildMaximized = hWndChild;\r
+                               m_hIconChildMaximized = wnd.GetIcon(FALSE);\r
+                               if(m_hIconChildMaximized == NULL)\r
+                               {\r
+                                       m_hIconChildMaximized = wnd.GetIcon(TRUE);\r
+                                       if(m_hIconChildMaximized == NULL)\r
+                                       {\r
+                                               // no icon set with WM_SETICON, get the class one\r
+// need conditional code because types don't match in winuser.h\r
+#ifdef _WIN64\r
+                                               m_hIconChildMaximized = (HICON)::GetClassLongPtr(wnd, GCLP_HICONSM);\r
+#else\r
+                                               m_hIconChildMaximized = (HICON)LongToHandle(::GetClassLongPtr(wnd, GCLP_HICONSM));\r
+#endif\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       m_hWndChildMaximized = NULL;\r
+                       m_hIconChildMaximized = NULL;\r
+               }\r
+\r
+               if(bMaxOld != m_bChildMaximized)\r
+               {\r
+#ifdef _CMDBAR_EXTRA_TRACE\r
+                       ATLTRACE2(atlTraceUI, 0, _T("MDI CmdBar - All messages hook change: m_bChildMaximized = %s\n"), m_bChildMaximized ? "true" : "false");\r
+#endif\r
+                       // assuming we are in a rebar, change our size to accomodate new state\r
+                       // we hope that if we are not in a rebar, nCount will be 0\r
+                       int nCount = (int)::SendMessage(GetParent(), RB_GETBANDCOUNT, 0, 0L);\r
+                       int cxDiff = (m_bChildMaximized ? 1 : -1) * (m_cxLeft + m_cxRight);\r
+                       for(int i = 0; i < nCount; i++)\r
+                       {\r
+#if (_WIN32_IE >= 0x0500)\r
+                               REBARBANDINFO rbi = { RunTimeHelper::SizeOf_REBARBANDINFO(), RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_IDEALSIZE | RBBIM_STYLE };\r
+                               ::SendMessage(GetParent(), RB_GETBANDINFO, i, (LPARAM)&rbi);\r
+                               if(rbi.hwndChild == m_hWnd)\r
+                               {\r
+                                       if((rbi.fStyle & RBBS_USECHEVRON) != 0)\r
+                                       {\r
+                                               rbi.fMask = RBBIM_CHILDSIZE | RBBIM_IDEALSIZE;\r
+                                               rbi.cxMinChild += cxDiff;\r
+                                               rbi.cxIdeal += cxDiff;\r
+                                               ::SendMessage(GetParent(), RB_SETBANDINFO, i, (LPARAM)&rbi);\r
+                                       }\r
+                                       break;\r
+                               }\r
+#elif (_WIN32_IE >= 0x0400)\r
+                               REBARBANDINFO rbi = { RunTimeHelper::SizeOf_REBARBANDINFO(), RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_IDEALSIZE };\r
+                               ::SendMessage(GetParent(), RB_GETBANDINFO, i, (LPARAM)&rbi);\r
+                               if(rbi.hwndChild == m_hWnd)\r
+                               {\r
+                                       rbi.fMask = RBBIM_CHILDSIZE | RBBIM_IDEALSIZE;\r
+                                       rbi.cxMinChild += cxDiff;\r
+                                       rbi.cxIdeal += cxDiff;\r
+                                       ::SendMessage(GetParent(), RB_SETBANDINFO, i, (LPARAM)&rbi);\r
+                                       break;\r
+                               }\r
+#else // (_WIN32_IE < 0x0400)\r
+                               REBARBANDINFO rbi = { RunTimeHelper::SizeOf_REBARBANDINFO(), RBBIM_CHILD | RBBIM_CHILDSIZE };\r
+                               ::SendMessage(GetParent(), RB_GETBANDINFO, i, (LPARAM)&rbi);\r
+                               if(rbi.hwndChild == m_hWnd)\r
+                               {\r
+                                       rbi.fMask = RBBIM_CHILDSIZE;\r
+                                       rbi.cxMinChild += cxDiff;\r
+                                       ::SendMessage(GetParent(), RB_SETBANDINFO, i, (LPARAM)&rbi);\r
+                                       break;\r
+                               }\r
+#endif // (_WIN32_IE < 0x0400)\r
+                       }\r
+               }\r
+\r
+               if(bMaxOld != m_bChildMaximized || hIconOld != m_hIconChildMaximized)\r
+               {\r
+                       // force size change and redraw everything\r
+                       RECT rect = { 0 };\r
+                       GetWindowRect(&rect);\r
+                       ::MapWindowPoints(NULL, GetParent(), (LPPOINT)&rect, 2);\r
+                       SetRedraw(FALSE);\r
+                       SetWindowPos(NULL, 0, 0, 1, 1, SWP_NOZORDER | SWP_NOMOVE);\r
+                       SetWindowPos(NULL, &rect, SWP_NOZORDER | SWP_NOMOVE);\r
+                       SetRedraw(TRUE);\r
+                       RedrawWindow(NULL, NULL, RDW_FRAME | RDW_INVALIDATE | RDW_UPDATENOW);\r
+               }\r
+       }\r
+\r
+// Implementation\r
+       void GetSystemSettings()\r
+       {\r
+#ifdef _CMDBAR_EXTRA_TRACE\r
+               ATLTRACE2(atlTraceUI, 0, _T("MDI CmdBar - GetSystemSettings\n"));\r
+#endif\r
+               _baseClass::GetSystemSettings();\r
+\r
+               NONCLIENTMETRICS info = { RunTimeHelper::SizeOf_NONCLIENTMETRICS() };\r
+               BOOL bRet = ::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(info), &info, 0);\r
+               ATLASSERT(bRet);\r
+               if(bRet)\r
+               {\r
+                       m_cxIconWidth = ::GetSystemMetrics(SM_CXSMICON);\r
+                       m_cyIconHeight = ::GetSystemMetrics(SM_CYSMICON);\r
+                       m_cxLeft = m_cxIconWidth;\r
+\r
+#ifndef _WTL_NO_AUTO_THEME\r
+                       if(m_hTheme != NULL)\r
+                       {\r
+                               m_cxBtnWidth = info.iCaptionWidth - 2 * m_cxyOffset;\r
+                               m_cyBtnHeight = info.iCaptionHeight - 2 * m_cxyOffset;\r
+                               m_cxRight = 3 * m_cxBtnWidth;\r
+                       }\r
+                       else\r
+#endif // !_WTL_NO_AUTO_THEME\r
+                       {\r
+                               m_cxBtnWidth = info.iCaptionWidth - m_cxyOffset;\r
+                               m_cyBtnHeight = info.iCaptionHeight - 2 * m_cxyOffset;\r
+                               m_cxRight = 3 * m_cxBtnWidth + m_cxyOffset;\r
+                       }\r
+               }\r
+\r
+               RECT rect = { 0 };\r
+               GetClientRect(&rect);\r
+               T* pT = static_cast<T*>(this);\r
+               pT->_AdjustBtnSize(rect.bottom);\r
+       }\r
+\r
+       void _AdjustBtnSize(int cyHeight)\r
+       {\r
+               if(cyHeight > 1 && m_cyBtnHeight > cyHeight)\r
+               {\r
+#ifndef _WTL_NO_AUTO_THEME\r
+                       if(m_hTheme != NULL)\r
+                       {\r
+                               m_cyBtnHeight = cyHeight;\r
+                               m_cxBtnWidth = cyHeight;\r
+                               m_cxRight = 3 * m_cxBtnWidth;\r
+                       }\r
+                       else\r
+#endif // !_WTL_NO_AUTO_THEME\r
+                       {\r
+                               m_cyBtnHeight = cyHeight;\r
+                               m_cxBtnWidth = cyHeight + m_cxyOffset;\r
+                               m_cxRight = 3 * m_cxBtnWidth + m_cxyOffset;\r
+                       }\r
+               }\r
+       }\r
+\r
+       void _CalcIconRect(int cxWidth, int cyHeight, RECT& rect, bool bInvertX = false) const\r
+       {\r
+               int xStart = (m_cxLeft - m_cxIconWidth) / 2;\r
+               if(xStart < 0)\r
+                       xStart = 0;\r
+               int yStart = (cyHeight - m_cyIconHeight) / 2;\r
+               if(yStart < 0)\r
+                       yStart = 0;\r
+\r
+               if(bInvertX)\r
+                       ::SetRect(&rect, cxWidth - (xStart + m_cxBtnWidth), yStart, cxWidth - xStart, yStart + m_cyBtnHeight);\r
+               else\r
+                       ::SetRect(&rect, xStart, yStart, xStart + m_cxBtnWidth, yStart + m_cyBtnHeight);\r
+       }\r
+\r
+       void _CalcBtnRects(int cxWidth, int cyHeight, RECT arrRect[3], bool bInvertX = false) const\r
+       {\r
+               int yStart = (cyHeight - m_cyBtnHeight) / 2;\r
+               if(yStart < 0)\r
+                       yStart = 0;\r
+\r
+               RECT rcBtn = { cxWidth - m_cxBtnWidth, yStart, cxWidth, yStart + m_cyBtnHeight };\r
+               int nDirection = -1;\r
+               if(bInvertX)\r
+               {\r
+                       ::SetRect(&rcBtn, 0, yStart, m_cxBtnWidth, yStart + m_cyBtnHeight);\r
+                       nDirection = 1;\r
+               }\r
+\r
+               arrRect[0] = rcBtn;\r
+#ifndef _WTL_NO_AUTO_THEME\r
+               if(m_hTheme != NULL)\r
+                       ::OffsetRect(&rcBtn, nDirection * m_cxBtnWidth, 0);\r
+               else\r
+#endif // !_WTL_NO_AUTO_THEME\r
+                       ::OffsetRect(&rcBtn, nDirection * (m_cxBtnWidth + m_cxyOffset), 0);\r
+               arrRect[1] = rcBtn;\r
+               ::OffsetRect(&rcBtn, nDirection * m_cxBtnWidth, 0);\r
+               arrRect[2] = rcBtn;\r
+       }\r
+\r
+       void _DrawMDIButton(CWindowDC& dc, LPRECT pRects, int nBtn)\r
+       {\r
+#ifndef _WTL_NO_AUTO_THEME\r
+               if(m_hTheme != NULL)\r
+               {\r
+#ifndef TMSCHEMA_H\r
+                       const int WP_MDICLOSEBUTTON = 20;\r
+                       const int CBS_NORMAL = 1;\r
+                       const int CBS_PUSHED = 3;\r
+                       const int CBS_DISABLED = 4;\r
+                       const int WP_MDIRESTOREBUTTON = 22;\r
+                       const int RBS_NORMAL = 1;\r
+                       const int RBS_PUSHED = 3;\r
+                       const int RBS_DISABLED = 4;\r
+                       const int WP_MDIMINBUTTON = 16;\r
+                       const int MINBS_NORMAL = 1;\r
+                       const int MINBS_PUSHED = 3;\r
+                       const int MINBS_DISABLED = 4;\r
+#endif // TMSCHEMA_H\r
+                       if(nBtn == -1 || nBtn == 0)\r
+                               m_pfnDrawThemeBackground(m_hTheme, dc, WP_MDICLOSEBUTTON, m_bParentActive ? ((m_nBtnPressed == 0) ? CBS_PUSHED : CBS_NORMAL) : CBS_DISABLED, &pRects[0], NULL);\r
+                       if(nBtn == -1 || nBtn == 1)\r
+                               m_pfnDrawThemeBackground(m_hTheme, dc, WP_MDIRESTOREBUTTON, m_bParentActive ? ((m_nBtnPressed == 1) ? RBS_PUSHED : RBS_NORMAL) : RBS_DISABLED, &pRects[1], NULL);\r
+                       if(nBtn == -1 || nBtn == 2)\r
+                               m_pfnDrawThemeBackground(m_hTheme, dc, WP_MDIMINBUTTON, m_bParentActive ? ((m_nBtnPressed == 2) ? MINBS_PUSHED : MINBS_NORMAL) : MINBS_DISABLED, &pRects[2], NULL);\r
+               }\r
+               else\r
+#endif // !_WTL_NO_AUTO_THEME\r
+               {\r
+                       if(nBtn == -1 || nBtn == 0)\r
+                               dc.DrawFrameControl(&pRects[0], DFC_CAPTION, DFCS_CAPTIONCLOSE | ((m_nBtnPressed == 0) ? DFCS_PUSHED : 0));\r
+                       if(nBtn == -1 || nBtn == 1)\r
+                               dc.DrawFrameControl(&pRects[1], DFC_CAPTION, DFCS_CAPTIONRESTORE | ((m_nBtnPressed == 1) ? DFCS_PUSHED : 0));\r
+                       if(nBtn == -1 || nBtn == 2)\r
+                               dc.DrawFrameControl(&pRects[2], DFC_CAPTION, DFCS_CAPTIONMIN | ((m_nBtnPressed == 2) ? DFCS_PUSHED : 0));\r
+               }\r
+       }\r
+\r
+#ifndef _WTL_NO_AUTO_THEME\r
+       static UINT _GetThemeChangedMsg()\r
+       {\r
+#ifndef WM_THEMECHANGED\r
+               static const UINT WM_THEMECHANGED = 0x031A;\r
+#endif // !WM_THEMECHANGED\r
+               return WM_THEMECHANGED;\r
+       }\r
+\r
+       void _OpenThemeData()\r
+       {\r
+               ATLASSERT(m_hThemeDLL != NULL);\r
+\r
+               PFN_OpenThemeData pfnOpenThemeData = (PFN_OpenThemeData)::GetProcAddress(m_hThemeDLL, "OpenThemeData");\r
+               ATLASSERT(pfnOpenThemeData != NULL);\r
+               if(pfnOpenThemeData != NULL)\r
+                       m_hTheme = pfnOpenThemeData(m_hWnd, L"Window");\r
+       }\r
+\r
+       void _CloseThemeData()\r
+       {\r
+               ATLASSERT(m_hThemeDLL != NULL);\r
+\r
+               if(m_hTheme == NULL)\r
+                       return;   // nothing to do\r
+\r
+               PFN_CloseThemeData pfnCloseThemeData = (PFN_CloseThemeData)::GetProcAddress(m_hThemeDLL, "CloseThemeData");\r
+               ATLASSERT(pfnCloseThemeData != NULL);\r
+               if(pfnCloseThemeData != NULL)\r
+               {\r
+                       pfnCloseThemeData(m_hTheme);\r
+                       m_hTheme = NULL;\r
+               }\r
+       }\r
+#endif // !_WTL_NO_AUTO_THEME\r
+\r
+       bool _DebugCheckChild()\r
+       {\r
+#ifdef _DEBUG\r
+               BOOL bMaximized = FALSE;\r
+               HWND hWndChild = (HWND)::SendMessage(m_wndMDIClient, WM_MDIGETACTIVE, 0, (LPARAM)&bMaximized);\r
+               return (bMaximized && hWndChild == m_hWndChildMaximized);\r
+#else // !_DEBUG\r
+               return true;\r
+#endif // !_DEBUG\r
+       }\r
+};\r
+\r
+class CMDICommandBarCtrl : public CMDICommandBarCtrlImpl<CMDICommandBarCtrl>\r
+{\r
+public:\r
+       DECLARE_WND_SUPERCLASS(_T("WTL_MDICommandBar"), GetWndClassName())\r
+};\r
+\r
+}; // namespace WTL\r
+\r
+#endif // __ATLCTRLW_H__\r
diff --git a/WTL80/include/atlctrlx.h b/WTL80/include/atlctrlx.h
new file mode 100644 (file)
index 0000000..bd78e3f
--- /dev/null
@@ -0,0 +1,4827 @@
+// Windows Template Library - WTL version 8.0\r
+// Copyright (C) Microsoft Corporation. All rights reserved.\r
+//\r
+// This file is a part of the Windows Template Library.\r
+// The use and distribution terms for this software are covered by the\r
+// Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php)\r
+// which can be found in the file CPL.TXT at the root of this distribution.\r
+// By using this software in any fashion, you are agreeing to be bound by\r
+// the terms of this license. You must not remove this notice, or\r
+// any other, from this software.\r
+\r
+#ifndef __ATLCTRLX_H__\r
+#define __ATLCTRLX_H__\r
+\r
+#pragma once\r
+\r
+#ifndef __cplusplus\r
+       #error ATL requires C++ compilation (use a .cpp suffix)\r
+#endif\r
+\r
+#ifndef __ATLAPP_H__\r
+       #error atlctrlx.h requires atlapp.h to be included first\r
+#endif\r
+\r
+#ifndef __ATLCTRLS_H__\r
+       #error atlctrlx.h requires atlctrls.h to be included first\r
+#endif\r
+\r
+#ifndef WM_UPDATEUISTATE\r
+  #define WM_UPDATEUISTATE                0x0128\r
+#endif // !WM_UPDATEUISTATE\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Classes in this file:\r
+//\r
+// CBitmapButtonImpl<T, TBase, TWinTraits>\r
+// CBitmapButton\r
+// CCheckListViewCtrlImpl<T, TBase, TWinTraits>\r
+// CCheckListViewCtrl\r
+// CHyperLinkImpl<T, TBase, TWinTraits>\r
+// CHyperLink\r
+// CWaitCursor\r
+// CCustomWaitCursor\r
+// CMultiPaneStatusBarCtrlImpl<T, TBase>\r
+// CMultiPaneStatusBarCtrl\r
+// CPaneContainerImpl<T, TBase, TWinTraits>\r
+// CPaneContainer\r
+// CSortListViewImpl<T>\r
+// CSortListViewCtrlImpl<T, TBase, TWinTraits>\r
+// CSortListViewCtrl\r
+// CTabViewImpl<T, TBase, TWinTraits>\r
+// CTabView\r
+\r
+namespace WTL\r
+{\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CBitmapButton - bitmap button implementation\r
+\r
+#ifndef _WIN32_WCE\r
+\r
+// bitmap button extended styles\r
+#define BMPBTN_HOVER           0x00000001\r
+#define BMPBTN_AUTO3D_SINGLE   0x00000002\r
+#define BMPBTN_AUTO3D_DOUBLE   0x00000004\r
+#define BMPBTN_AUTOSIZE                0x00000008\r
+#define BMPBTN_SHAREIMAGELISTS 0x00000010\r
+#define BMPBTN_AUTOFIRE                0x00000020\r
+\r
+template <class T, class TBase = CButton, class TWinTraits = ATL::CControlWinTraits>\r
+class ATL_NO_VTABLE CBitmapButtonImpl : public ATL::CWindowImpl< T, TBase, TWinTraits>\r
+{\r
+public:\r
+       DECLARE_WND_SUPERCLASS(NULL, TBase::GetWndClassName())\r
+\r
+       enum\r
+       {\r
+               _nImageNormal = 0,\r
+               _nImagePushed,\r
+               _nImageFocusOrHover,\r
+               _nImageDisabled,\r
+\r
+               _nImageCount = 4,\r
+       };\r
+\r
+       enum\r
+       {\r
+               ID_TIMER_FIRST = 1000,\r
+               ID_TIMER_REPEAT = 1001\r
+       };\r
+\r
+       // Bitmap button specific extended styles\r
+       DWORD m_dwExtendedStyle;\r
+\r
+       CImageList m_ImageList;\r
+       int m_nImage[_nImageCount];\r
+\r
+       CToolTipCtrl m_tip;\r
+       LPTSTR m_lpstrToolTipText;\r
+\r
+       // Internal states\r
+       unsigned m_fMouseOver:1;\r
+       unsigned m_fFocus:1;\r
+       unsigned m_fPressed:1;\r
+\r
+\r
+// Constructor/Destructor\r
+       CBitmapButtonImpl(DWORD dwExtendedStyle = BMPBTN_AUTOSIZE, HIMAGELIST hImageList = NULL) : \r
+                       m_ImageList(hImageList), m_dwExtendedStyle(dwExtendedStyle), \r
+                       m_lpstrToolTipText(NULL),\r
+                       m_fMouseOver(0), m_fFocus(0), m_fPressed(0)\r
+       {\r
+               m_nImage[_nImageNormal] = -1;\r
+               m_nImage[_nImagePushed] = -1;\r
+               m_nImage[_nImageFocusOrHover] = -1;\r
+               m_nImage[_nImageDisabled] = -1;\r
+       }\r
+\r
+       ~CBitmapButtonImpl()\r
+       {\r
+               if((m_dwExtendedStyle & BMPBTN_SHAREIMAGELISTS) == 0)\r
+                       m_ImageList.Destroy();\r
+               delete [] m_lpstrToolTipText;\r
+       }\r
+\r
+       // overridden to provide proper initialization\r
+       BOOL SubclassWindow(HWND hWnd)\r
+       {\r
+#if (_MSC_VER >= 1300)\r
+               BOOL bRet = ATL::CWindowImpl< T, TBase, TWinTraits>::SubclassWindow(hWnd);\r
+#else // !(_MSC_VER >= 1300)\r
+               typedef ATL::CWindowImpl< T, TBase, TWinTraits>   _baseClass;\r
+               BOOL bRet = _baseClass::SubclassWindow(hWnd);\r
+#endif // !(_MSC_VER >= 1300)\r
+               if(bRet)\r
+                       Init();\r
+               return bRet;\r
+       }\r
+\r
+// Attributes\r
+       DWORD GetBitmapButtonExtendedStyle() const\r
+       {\r
+               return m_dwExtendedStyle;\r
+       }\r
+\r
+       DWORD SetBitmapButtonExtendedStyle(DWORD dwExtendedStyle, DWORD dwMask = 0)\r
+       {\r
+               DWORD dwPrevStyle = m_dwExtendedStyle;\r
+               if(dwMask == 0)\r
+                       m_dwExtendedStyle = dwExtendedStyle;\r
+               else\r
+                       m_dwExtendedStyle = (m_dwExtendedStyle & ~dwMask) | (dwExtendedStyle & dwMask);\r
+               return dwPrevStyle;\r
+       }\r
+\r
+       HIMAGELIST GetImageList() const\r
+       {\r
+               return m_ImageList;\r
+       }\r
+\r
+       HIMAGELIST SetImageList(HIMAGELIST hImageList)\r
+       {\r
+               HIMAGELIST hImageListPrev = m_ImageList;\r
+               m_ImageList = hImageList;\r
+               if((m_dwExtendedStyle & BMPBTN_AUTOSIZE) != 0 && ::IsWindow(m_hWnd))\r
+                       SizeToImage();\r
+               return hImageListPrev;\r
+       }\r
+\r
+       int GetToolTipTextLength() const\r
+       {\r
+               return (m_lpstrToolTipText == NULL) ? -1 : lstrlen(m_lpstrToolTipText);\r
+       }\r
+\r
+       bool GetToolTipText(LPTSTR lpstrText, int nLength) const\r
+       {\r
+               ATLASSERT(lpstrText != NULL);\r
+               if(m_lpstrToolTipText == NULL)\r
+                       return false;\r
+\r
+               errno_t nRet = SecureHelper::strncpy_x(lpstrText, nLength, m_lpstrToolTipText, _TRUNCATE);\r
+\r
+               return (nRet == 0 || nRet == STRUNCATE);\r
+       }\r
+\r
+       bool SetToolTipText(LPCTSTR lpstrText)\r
+       {\r
+               if(m_lpstrToolTipText != NULL)\r
+               {\r
+                       delete [] m_lpstrToolTipText;\r
+                       m_lpstrToolTipText = NULL;\r
+               }\r
+\r
+               if(lpstrText == NULL)\r
+               {\r
+                       if(m_tip.IsWindow())\r
+                               m_tip.Activate(FALSE);\r
+                       return true;\r
+               }\r
+\r
+               int cchLen = lstrlen(lpstrText) + 1;\r
+               ATLTRY(m_lpstrToolTipText = new TCHAR[cchLen]);\r
+               if(m_lpstrToolTipText == NULL)\r
+                       return false;\r
+\r
+               SecureHelper::strcpy_x(m_lpstrToolTipText, cchLen, lpstrText);\r
+               if(m_tip.IsWindow())\r
+               {\r
+                       m_tip.Activate(TRUE);\r
+                       m_tip.AddTool(m_hWnd, m_lpstrToolTipText);\r
+               }\r
+\r
+               return true;\r
+       }\r
+\r
+// Operations\r
+       void SetImages(int nNormal, int nPushed = -1, int nFocusOrHover = -1, int nDisabled = -1)\r
+       {\r
+               if(nNormal != -1)\r
+                       m_nImage[_nImageNormal] = nNormal;\r
+               if(nPushed != -1)\r
+                       m_nImage[_nImagePushed] = nPushed;\r
+               if(nFocusOrHover != -1)\r
+                       m_nImage[_nImageFocusOrHover] = nFocusOrHover;\r
+               if(nDisabled != -1)\r
+                       m_nImage[_nImageDisabled] = nDisabled;\r
+       }\r
+\r
+       BOOL SizeToImage()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd) && m_ImageList.m_hImageList != NULL);\r
+               int cx = 0;\r
+               int cy = 0;\r
+               if(!m_ImageList.GetIconSize(cx, cy))\r
+                       return FALSE;\r
+               return ResizeClient(cx, cy);\r
+       }\r
+\r
+// Overrideables\r
+       void DoPaint(CDCHandle dc)\r
+       {\r
+               ATLASSERT(m_ImageList.m_hImageList != NULL);   // image list must be set\r
+               ATLASSERT(m_nImage[0] != -1);                  // main bitmap must be set\r
+\r
+               // set bitmap according to the current button state\r
+               int nImage = -1;\r
+               bool bHover = IsHoverMode();\r
+               if(!IsWindowEnabled())\r
+                       nImage = m_nImage[_nImageDisabled];\r
+               else if(m_fPressed == 1)\r
+                       nImage = m_nImage[_nImagePushed];\r
+               else if((!bHover && m_fFocus == 1) || (bHover && m_fMouseOver == 1))\r
+                       nImage = m_nImage[_nImageFocusOrHover];\r
+               if(nImage == -1)   // not there, use default one\r
+                       nImage = m_nImage[_nImageNormal];\r
+\r
+               // draw the button image\r
+               int xyPos = 0;\r
+               if((m_fPressed == 1) && ((m_dwExtendedStyle & (BMPBTN_AUTO3D_SINGLE | BMPBTN_AUTO3D_DOUBLE)) != 0) && (m_nImage[_nImagePushed] == -1))\r
+                       xyPos = 1;\r
+               m_ImageList.Draw(dc, nImage, xyPos, xyPos, ILD_NORMAL);\r
+\r
+               // draw 3D border if required\r
+               if((m_dwExtendedStyle & (BMPBTN_AUTO3D_SINGLE | BMPBTN_AUTO3D_DOUBLE)) != 0)\r
+               {\r
+                       RECT rect;\r
+                       GetClientRect(&rect);\r
+\r
+                       if(m_fPressed == 1)\r
+                               dc.DrawEdge(&rect, ((m_dwExtendedStyle & BMPBTN_AUTO3D_SINGLE) != 0) ? BDR_SUNKENOUTER : EDGE_SUNKEN, BF_RECT);\r
+                       else if(!bHover || m_fMouseOver == 1)\r
+                               dc.DrawEdge(&rect, ((m_dwExtendedStyle & BMPBTN_AUTO3D_SINGLE) != 0) ? BDR_RAISEDINNER : EDGE_RAISED, BF_RECT);\r
+\r
+                       if(!bHover && m_fFocus == 1)\r
+                       {\r
+                               ::InflateRect(&rect, -2 * ::GetSystemMetrics(SM_CXEDGE), -2 * ::GetSystemMetrics(SM_CYEDGE));\r
+                               dc.DrawFocusRect(&rect);\r
+                       }\r
+               }\r
+       }\r
+\r
+// Message map and handlers\r
+       BEGIN_MSG_MAP(CBitmapButtonImpl)\r
+               MESSAGE_HANDLER(WM_CREATE, OnCreate)\r
+               MESSAGE_HANDLER(WM_DESTROY, OnDestroy)\r
+               MESSAGE_RANGE_HANDLER(WM_MOUSEFIRST, WM_MOUSELAST, OnMouseMessage)\r
+               MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground)\r
+               MESSAGE_HANDLER(WM_PAINT, OnPaint)\r
+               MESSAGE_HANDLER(WM_PRINTCLIENT, OnPaint)\r
+               MESSAGE_HANDLER(WM_SETFOCUS, OnFocus)\r
+               MESSAGE_HANDLER(WM_KILLFOCUS, OnFocus)\r
+               MESSAGE_HANDLER(WM_LBUTTONDOWN, OnLButtonDown)\r
+               MESSAGE_HANDLER(WM_LBUTTONDBLCLK, OnLButtonDblClk)\r
+               MESSAGE_HANDLER(WM_LBUTTONUP, OnLButtonUp)\r
+               MESSAGE_HANDLER(WM_CAPTURECHANGED, OnCaptureChanged)\r
+               MESSAGE_HANDLER(WM_ENABLE, OnEnable)\r
+               MESSAGE_HANDLER(WM_MOUSEMOVE, OnMouseMove)\r
+               MESSAGE_HANDLER(WM_MOUSELEAVE, OnMouseLeave)\r
+               MESSAGE_HANDLER(WM_KEYDOWN, OnKeyDown)\r
+               MESSAGE_HANDLER(WM_KEYUP, OnKeyUp)\r
+               MESSAGE_HANDLER(WM_TIMER, OnTimer)\r
+               MESSAGE_HANDLER(WM_UPDATEUISTATE, OnUpdateUiState)\r
+       END_MSG_MAP()\r
+\r
+       LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)\r
+       {\r
+               Init();\r
+               bHandled = FALSE;\r
+               return 1;\r
+       }\r
+\r
+       LRESULT OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)\r
+       {\r
+               if(m_tip.IsWindow())\r
+               {\r
+                       m_tip.DestroyWindow();\r
+                       m_tip.m_hWnd = NULL;\r
+               }\r
+               bHandled = FALSE;\r
+               return 1;\r
+       }\r
+\r
+       LRESULT OnMouseMessage(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)\r
+       {\r
+               MSG msg = { m_hWnd, uMsg, wParam, lParam };\r
+               if(m_tip.IsWindow())\r
+                       m_tip.RelayEvent(&msg);\r
+               bHandled = FALSE;\r
+               return 1;\r
+       }\r
+\r
+       LRESULT OnEraseBackground(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)\r
+       {\r
+               return 1;   // no background needed\r
+       }\r
+\r
+       LRESULT OnPaint(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               if(wParam != NULL)\r
+               {\r
+                       pT->DoPaint((HDC)wParam);\r
+               }\r
+               else\r
+               {\r
+                       CPaintDC dc(m_hWnd);\r
+                       pT->DoPaint(dc.m_hDC);\r
+               }\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnFocus(UINT uMsg, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)\r
+       {\r
+               m_fFocus = (uMsg == WM_SETFOCUS) ? 1 : 0;\r
+               Invalidate();\r
+               UpdateWindow();\r
+               bHandled = FALSE;\r
+               return 1;\r
+       }\r
+\r
+       LRESULT OnLButtonDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)\r
+       {\r
+               LRESULT lRet = 0;\r
+               if(IsHoverMode())\r
+                       SetCapture();\r
+               else\r
+                       lRet = DefWindowProc(uMsg, wParam, lParam);\r
+               if(::GetCapture() == m_hWnd)\r
+               {\r
+                       m_fPressed = 1;\r
+                       Invalidate();\r
+                       UpdateWindow();\r
+               }\r
+               if((m_dwExtendedStyle & BMPBTN_AUTOFIRE) != 0)\r
+               {\r
+                       int nElapse = 250;\r
+                       int nDelay = 0;\r
+                       if(::SystemParametersInfo(SPI_GETKEYBOARDDELAY, 0, &nDelay, 0))\r
+                               nElapse += nDelay * 250;   // all milli-seconds\r
+                       SetTimer(ID_TIMER_FIRST, nElapse);\r
+               }\r
+               return lRet;\r
+       }\r
+\r
+       LRESULT OnLButtonDblClk(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)\r
+       {\r
+               LRESULT lRet = 0;\r
+               if(!IsHoverMode())\r
+                       lRet = DefWindowProc(uMsg, wParam, lParam);\r
+               if(::GetCapture() != m_hWnd)\r
+                       SetCapture();\r
+               if(m_fPressed == 0)\r
+               {\r
+                       m_fPressed = 1;\r
+                       Invalidate();\r
+                       UpdateWindow();\r
+               }\r
+               return lRet;\r
+       }\r
+\r
+       LRESULT OnLButtonUp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)\r
+       {\r
+               LRESULT lRet = 0;\r
+               bool bHover = IsHoverMode();\r
+               if(!bHover)\r
+                       lRet = DefWindowProc(uMsg, wParam, lParam);\r
+               if(::GetCapture() == m_hWnd)\r
+               {\r
+                       if(bHover && m_fPressed == 1)\r
+                               ::SendMessage(GetParent(), WM_COMMAND, MAKEWPARAM(GetDlgCtrlID(), BN_CLICKED), (LPARAM)m_hWnd);\r
+                       ::ReleaseCapture();\r
+               }\r
+               return lRet;\r
+       }\r
+\r
+       LRESULT OnCaptureChanged(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)\r
+       {\r
+               if(m_fPressed == 1)\r
+               {\r
+                       m_fPressed = 0;\r
+                       Invalidate();\r
+                       UpdateWindow();\r
+               }\r
+               bHandled = FALSE;\r
+               return 1;\r
+       }\r
+\r
+       LRESULT OnEnable(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)\r
+       {\r
+               Invalidate();\r
+               UpdateWindow();\r
+               bHandled = FALSE;\r
+               return 1;\r
+       }\r
+\r
+       LRESULT OnMouseMove(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled)\r
+       {\r
+               if(::GetCapture() == m_hWnd)\r
+               {\r
+                       POINT ptCursor = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };\r
+                       ClientToScreen(&ptCursor);\r
+                       RECT rect = { 0 };\r
+                       GetWindowRect(&rect);\r
+                       unsigned int uPressed = ::PtInRect(&rect, ptCursor) ? 1 : 0;\r
+                       if(m_fPressed != uPressed)\r
+                       {\r
+                               m_fPressed = uPressed;\r
+                               Invalidate();\r
+                               UpdateWindow();\r
+                       }\r
+               }\r
+               else if(IsHoverMode() && m_fMouseOver == 0)\r
+               {\r
+                       m_fMouseOver = 1;\r
+                       Invalidate();\r
+                       UpdateWindow();\r
+                       StartTrackMouseLeave();\r
+               }\r
+               bHandled = FALSE;\r
+               return 1;\r
+       }\r
+\r
+       LRESULT OnMouseLeave(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)\r
+       {\r
+               if(m_fMouseOver == 1)\r
+               {\r
+                       m_fMouseOver = 0;\r
+                       Invalidate();\r
+                       UpdateWindow();\r
+               }\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnKeyDown(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)\r
+       {\r
+               if(wParam == VK_SPACE && IsHoverMode())\r
+                       return 0;   // ignore if in hover mode\r
+               if(wParam == VK_SPACE && m_fPressed == 0)\r
+               {\r
+                       m_fPressed = 1;\r
+                       Invalidate();\r
+                       UpdateWindow();\r
+               }\r
+               bHandled = FALSE;\r
+               return 1;\r
+       }\r
+\r
+       LRESULT OnKeyUp(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)\r
+       {\r
+               if(wParam == VK_SPACE && IsHoverMode())\r
+                       return 0;   // ignore if in hover mode\r
+               if(wParam == VK_SPACE && m_fPressed == 1)\r
+               {\r
+                       m_fPressed = 0;\r
+                       Invalidate();\r
+                       UpdateWindow();\r
+               }\r
+               bHandled = FALSE;\r
+               return 1;\r
+       }\r
+\r
+       LRESULT OnTimer(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)\r
+       {\r
+               ATLASSERT((m_dwExtendedStyle & BMPBTN_AUTOFIRE) != 0);\r
+               switch(wParam)   // timer ID\r
+               {\r
+               case ID_TIMER_FIRST:\r
+                       KillTimer(ID_TIMER_FIRST);\r
+                       if(m_fPressed == 1)\r
+                       {\r
+                               ::SendMessage(GetParent(), WM_COMMAND, MAKEWPARAM(GetDlgCtrlID(), BN_CLICKED), (LPARAM)m_hWnd);\r
+                               int nElapse = 250;\r
+                               int nRepeat = 40;\r
+                               if(::SystemParametersInfo(SPI_GETKEYBOARDSPEED, 0, &nRepeat, 0))\r
+                                       nElapse = 10000 / (10 * nRepeat + 25);   // milli-seconds, approximated\r
+                               SetTimer(ID_TIMER_REPEAT, nElapse);\r
+                       }\r
+                       break;\r
+               case ID_TIMER_REPEAT:\r
+                       if(m_fPressed == 1)\r
+                               ::SendMessage(GetParent(), WM_COMMAND, MAKEWPARAM(GetDlgCtrlID(), BN_CLICKED), (LPARAM)m_hWnd);\r
+                       else if(::GetCapture() != m_hWnd)\r
+                               KillTimer(ID_TIMER_REPEAT);\r
+                       break;\r
+               default:        // not our timer\r
+                       break;\r
+               }\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnUpdateUiState(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)\r
+       {\r
+               // If the control is subclassed or superclassed, this message can cause\r
+               // repainting without WM_PAINT. We don't use this state, so just do nothing.\r
+               return 0;\r
+       }\r
+\r
+// Implementation\r
+       void Init()\r
+       {\r
+               // We need this style to prevent Windows from painting the button\r
+               ModifyStyle(0, BS_OWNERDRAW);\r
+\r
+               // create a tool tip\r
+               m_tip.Create(m_hWnd);\r
+               ATLASSERT(m_tip.IsWindow());\r
+               if(m_tip.IsWindow() && m_lpstrToolTipText != NULL)\r
+               {\r
+                       m_tip.Activate(TRUE);\r
+                       m_tip.AddTool(m_hWnd, m_lpstrToolTipText);\r
+               }\r
+\r
+               if(m_ImageList.m_hImageList != NULL && (m_dwExtendedStyle & BMPBTN_AUTOSIZE) != 0)\r
+                       SizeToImage();\r
+       }\r
+\r
+       BOOL StartTrackMouseLeave()\r
+       {\r
+               TRACKMOUSEEVENT tme = { 0 };\r
+               tme.cbSize = sizeof(tme);\r
+               tme.dwFlags = TME_LEAVE;\r
+               tme.hwndTrack = m_hWnd;\r
+               return _TrackMouseEvent(&tme);\r
+       }\r
+\r
+       bool IsHoverMode() const\r
+       {\r
+               return ((m_dwExtendedStyle & BMPBTN_HOVER) != 0);\r
+       }\r
+};\r
+\r
+\r
+class CBitmapButton : public CBitmapButtonImpl<CBitmapButton>\r
+{\r
+public:\r
+       DECLARE_WND_SUPERCLASS(_T("WTL_BitmapButton"), GetWndClassName())\r
+\r
+       CBitmapButton(DWORD dwExtendedStyle = BMPBTN_AUTOSIZE, HIMAGELIST hImageList = NULL) : \r
+               CBitmapButtonImpl<CBitmapButton>(dwExtendedStyle, hImageList)\r
+       { }\r
+};\r
+\r
+#endif // !_WIN32_WCE\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CCheckListCtrlView - list view control with check boxes\r
+\r
+template <DWORD t_dwStyle, DWORD t_dwExStyle, DWORD t_dwExListViewStyle>\r
+class CCheckListViewCtrlImplTraits\r
+{\r
+public:\r
+       static DWORD GetWndStyle(DWORD dwStyle)\r
+       {\r
+               return (dwStyle == 0) ? t_dwStyle : dwStyle;\r
+       }\r
+\r
+       static DWORD GetWndExStyle(DWORD dwExStyle)\r
+       {\r
+               return (dwExStyle == 0) ? t_dwExStyle : dwExStyle;\r
+       }\r
+\r
+       static DWORD GetExtendedLVStyle()\r
+       {\r
+               return t_dwExListViewStyle;\r
+       }\r
+};\r
+\r
+typedef CCheckListViewCtrlImplTraits<WS_CHILD | WS_VISIBLE | LVS_REPORT | LVS_SHOWSELALWAYS, WS_EX_CLIENTEDGE, LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT>   CCheckListViewCtrlTraits;\r
+\r
+template <class T, class TBase = CListViewCtrl, class TWinTraits = CCheckListViewCtrlTraits>\r
+class ATL_NO_VTABLE CCheckListViewCtrlImpl : public ATL::CWindowImpl<T, TBase, TWinTraits>\r
+{\r
+public:\r
+       DECLARE_WND_SUPERCLASS(NULL, TBase::GetWndClassName())\r
+\r
+// Attributes\r
+       static DWORD GetExtendedLVStyle()\r
+       {\r
+               return TWinTraits::GetExtendedLVStyle();\r
+       }\r
+\r
+// Operations\r
+       BOOL SubclassWindow(HWND hWnd)\r
+       {\r
+#if (_MSC_VER >= 1300)\r
+               BOOL bRet = ATL::CWindowImplBaseT< TBase, TWinTraits>::SubclassWindow(hWnd);\r
+#else // !(_MSC_VER >= 1300)\r
+               typedef ATL::CWindowImplBaseT< TBase, TWinTraits>   _baseClass;\r
+               BOOL bRet = _baseClass::SubclassWindow(hWnd);\r
+#endif // !(_MSC_VER >= 1300)\r
+               if(bRet)\r
+               {\r
+                       T* pT = static_cast<T*>(this);\r
+                       pT;\r
+                       ATLASSERT((pT->GetExtendedLVStyle() & LVS_EX_CHECKBOXES) != 0);\r
+                       SetExtendedListViewStyle(pT->GetExtendedLVStyle());\r
+               }\r
+               return bRet;\r
+       }\r
+\r
+       void CheckSelectedItems(int nCurrItem)\r
+       {\r
+               // first check if this item is selected\r
+               LVITEM lvi = { 0 };\r
+               lvi.iItem = nCurrItem;\r
+               lvi.iSubItem = 0;\r
+               lvi.mask = LVIF_STATE;\r
+               lvi.stateMask = LVIS_SELECTED;\r
+               GetItem(&lvi);\r
+               // if item is not selected, don't do anything\r
+               if(!(lvi.state & LVIS_SELECTED))\r
+                       return;\r
+               // new check state will be reverse of the current state,\r
+               BOOL bCheck = !GetCheckState(nCurrItem);\r
+               int nItem = -1;\r
+               int nOldItem = -1;\r
+               while((nItem = GetNextItem(nOldItem, LVNI_SELECTED)) != -1)\r
+               {\r
+                       if(nItem != nCurrItem)\r
+                               SetCheckState(nItem, bCheck);\r
+                       nOldItem = nItem;\r
+               }\r
+       }\r
+\r
+// Implementation\r
+       BEGIN_MSG_MAP(CCheckListViewCtrlImpl)\r
+               MESSAGE_HANDLER(WM_CREATE, OnCreate)\r
+               MESSAGE_HANDLER(WM_LBUTTONDOWN, OnLButtonDown)\r
+               MESSAGE_HANDLER(WM_LBUTTONDBLCLK, OnLButtonDown)\r
+               MESSAGE_HANDLER(WM_KEYDOWN, OnKeyDown)\r
+       END_MSG_MAP()\r
+\r
+       LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)\r
+       {\r
+               // first let list view control initialize everything\r
+               LRESULT lRet = DefWindowProc(uMsg, wParam, lParam);\r
+               T* pT = static_cast<T*>(this);\r
+               pT;\r
+               ATLASSERT((pT->GetExtendedLVStyle() & LVS_EX_CHECKBOXES) != 0);\r
+               SetExtendedListViewStyle(pT->GetExtendedLVStyle());\r
+               return lRet;\r
+       }\r
+\r
+       LRESULT OnLButtonDown(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled)\r
+       {\r
+               POINT ptMsg = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };\r
+               LVHITTESTINFO lvh = { 0 };\r
+               lvh.pt = ptMsg;\r
+               if(HitTest(&lvh) != -1 && lvh.flags == LVHT_ONITEMSTATEICON && ::GetKeyState(VK_CONTROL) >= 0)\r
+               {\r
+                       T* pT = static_cast<T*>(this);\r
+                       pT->CheckSelectedItems(lvh.iItem);\r
+               }\r
+               bHandled = FALSE;\r
+               return 1;\r
+       }\r
+\r
+       LRESULT OnKeyDown(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)\r
+       {\r
+               if(wParam == VK_SPACE)\r
+               {\r
+                       int nCurrItem = GetNextItem(-1, LVNI_FOCUSED);\r
+                       if(nCurrItem != -1  && ::GetKeyState(VK_CONTROL) >= 0)\r
+                       {\r
+                               T* pT = static_cast<T*>(this);\r
+                               pT->CheckSelectedItems(nCurrItem);\r
+                       }\r
+               }\r
+               bHandled = FALSE;\r
+               return 1;\r
+       }\r
+};\r
+\r
+class CCheckListViewCtrl : public CCheckListViewCtrlImpl<CCheckListViewCtrl>\r
+{\r
+public:\r
+       DECLARE_WND_SUPERCLASS(_T("WTL_CheckListView"), GetWndClassName())\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CHyperLink - hyper link control implementation\r
+\r
+#if (WINVER < 0x0500) && !defined(_WIN32_WCE)\r
+__declspec(selectany) struct\r
+{\r
+       enum { cxWidth = 32, cyHeight = 32 };\r
+       int xHotSpot;\r
+       int yHotSpot;\r
+       unsigned char arrANDPlane[cxWidth * cyHeight / 8];\r
+       unsigned char arrXORPlane[cxWidth * cyHeight / 8];\r
+} _AtlHyperLink_CursorData = \r
+{\r
+       5, 0, \r
+       {\r
+               0xF9, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, \r
+               0xF0, 0xFF, 0xFF, 0xFF, 0xF0, 0x3F, 0xFF, 0xFF, 0xF0, 0x07, 0xFF, 0xFF, 0xF0, 0x01, 0xFF, 0xFF, \r
+               0xF0, 0x00, 0xFF, 0xFF, 0x10, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x7F, 0xFF, \r
+               0x80, 0x00, 0x7F, 0xFF, 0xC0, 0x00, 0x7F, 0xFF, 0xC0, 0x00, 0x7F, 0xFF, 0xE0, 0x00, 0x7F, 0xFF, \r
+               0xE0, 0x00, 0xFF, 0xFF, 0xF0, 0x00, 0xFF, 0xFF, 0xF0, 0x00, 0xFF, 0xFF, 0xF8, 0x01, 0xFF, 0xFF, \r
+               0xF8, 0x01, 0xFF, 0xFF, 0xF8, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, \r
+               0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, \r
+               0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF\r
+       },\r
+       {\r
+               0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, \r
+               0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0xC0, 0x00, 0x00, 0x06, 0xD8, 0x00, 0x00, \r
+               0x06, 0xDA, 0x00, 0x00, 0x06, 0xDB, 0x00, 0x00, 0x67, 0xFB, 0x00, 0x00, 0x77, 0xFF, 0x00, 0x00, \r
+               0x37, 0xFF, 0x00, 0x00, 0x17, 0xFF, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x00, \r
+               0x0F, 0xFE, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, \r
+               0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00\r
+       }\r
+};\r
+#endif // (WINVER < 0x0500) && !defined(_WIN32_WCE)\r
+\r
+#define HLINK_UNDERLINED      0x00000000\r
+#define HLINK_NOTUNDERLINED   0x00000001\r
+#define HLINK_UNDERLINEHOVER  0x00000002\r
+#define HLINK_COMMANDBUTTON   0x00000004\r
+#define HLINK_NOTIFYBUTTON    0x0000000C\r
+#define HLINK_USETAGS         0x00000010\r
+#define HLINK_USETAGSBOLD     0x00000030\r
+#define HLINK_NOTOOLTIP       0x00000040\r
+\r
+// Notes:\r
+// - HLINK_USETAGS and HLINK_USETAGSBOLD are always left-aligned\r
+// - When HLINK_USETAGSBOLD is used, the underlined styles will be ignored\r
+\r
+template <class T, class TBase = ATL::CWindow, class TWinTraits = ATL::CControlWinTraits>\r
+class ATL_NO_VTABLE CHyperLinkImpl : public ATL::CWindowImpl< T, TBase, TWinTraits >\r
+{\r
+public:\r
+       LPTSTR m_lpstrLabel;\r
+       LPTSTR m_lpstrHyperLink;\r
+\r
+       HCURSOR m_hCursor;\r
+       HFONT m_hFont;\r
+       HFONT m_hFontNormal;\r
+\r
+       RECT m_rcLink;\r
+#ifndef _WIN32_WCE\r
+       CToolTipCtrl m_tip;\r
+#endif // !_WIN32_WCE\r
+\r
+       COLORREF m_clrLink;\r
+       COLORREF m_clrVisited;\r
+\r
+       DWORD m_dwExtendedStyle;   // Hyper Link specific extended styles\r
+\r
+       bool m_bPaintLabel:1;\r
+       bool m_bVisited:1;\r
+       bool m_bHover:1;\r
+       bool m_bInternalLinkFont:1;\r
+\r
+\r
+// Constructor/Destructor\r
+       CHyperLinkImpl(DWORD dwExtendedStyle = HLINK_UNDERLINED) : \r
+                       m_lpstrLabel(NULL), m_lpstrHyperLink(NULL),\r
+                       m_hCursor(NULL), m_hFont(NULL), m_hFontNormal(NULL),\r
+                       m_clrLink(RGB(0, 0, 255)), m_clrVisited(RGB(128, 0, 128)),\r
+                       m_dwExtendedStyle(dwExtendedStyle),\r
+                       m_bPaintLabel(true), m_bVisited(false),\r
+                       m_bHover(false), m_bInternalLinkFont(false)\r
+       {\r
+               ::SetRectEmpty(&m_rcLink);\r
+       }\r
+\r
+       ~CHyperLinkImpl()\r
+       {\r
+               delete [] m_lpstrLabel;\r
+               delete [] m_lpstrHyperLink;\r
+               if(m_bInternalLinkFont && m_hFont != NULL)\r
+                       ::DeleteObject(m_hFont);\r
+#if (WINVER < 0x0500) && !defined(_WIN32_WCE)\r
+               // It was created, not loaded, so we have to destroy it\r
+               if(m_hCursor != NULL)\r
+                       ::DestroyCursor(m_hCursor);\r
+#endif // (WINVER < 0x0500) && !defined(_WIN32_WCE)\r
+       }\r
+\r
+// Attributes\r
+       DWORD GetHyperLinkExtendedStyle() const\r
+       {\r
+               return m_dwExtendedStyle;\r
+       }\r
+\r
+       DWORD SetHyperLinkExtendedStyle(DWORD dwExtendedStyle, DWORD dwMask = 0)\r
+       {\r
+               DWORD dwPrevStyle = m_dwExtendedStyle;\r
+               if(dwMask == 0)\r
+                       m_dwExtendedStyle = dwExtendedStyle;\r
+               else\r
+                       m_dwExtendedStyle = (m_dwExtendedStyle & ~dwMask) | (dwExtendedStyle & dwMask);\r
+               return dwPrevStyle;\r
+       }\r
+\r
+       bool GetLabel(LPTSTR lpstrBuffer, int nLength) const\r
+       {\r
+               if(m_lpstrLabel == NULL)\r
+                       return false;\r
+               ATLASSERT(lpstrBuffer != NULL);\r
+               if(nLength <= lstrlen(m_lpstrLabel))\r
+                       return false;\r
+\r
+               SecureHelper::strcpy_x(lpstrBuffer, nLength, m_lpstrLabel);\r
+\r
+               return true;\r
+       }\r
+\r
+       bool SetLabel(LPCTSTR lpstrLabel)\r
+       {\r
+               delete [] m_lpstrLabel;\r
+               m_lpstrLabel = NULL;\r
+               int cchLen = lstrlen(lpstrLabel) + 1;\r
+               ATLTRY(m_lpstrLabel = new TCHAR[cchLen]);\r
+               if(m_lpstrLabel == NULL)\r
+                       return false;\r
+\r
+               SecureHelper::strcpy_x(m_lpstrLabel, cchLen, lpstrLabel);\r
+               T* pT = static_cast<T*>(this);\r
+               pT->CalcLabelRect();\r
+\r
+               if(m_hWnd != NULL)\r
+                       SetWindowText(lpstrLabel);   // Set this for accessibility\r
+\r
+               return true;\r
+       }\r
+\r
+       bool GetHyperLink(LPTSTR lpstrBuffer, int nLength) const\r
+       {\r
+               if(m_lpstrHyperLink == NULL)\r
+                       return false;\r
+               ATLASSERT(lpstrBuffer != NULL);\r
+               if(nLength <= lstrlen(m_lpstrHyperLink))\r
+                       return false;\r
+\r
+               SecureHelper::strcpy_x(lpstrBuffer, nLength, m_lpstrHyperLink);\r
+\r
+               return true;\r
+       }\r
+\r
+       bool SetHyperLink(LPCTSTR lpstrLink)\r
+       {\r
+               delete [] m_lpstrHyperLink;\r
+               m_lpstrHyperLink = NULL;\r
+               int cchLen = lstrlen(lpstrLink) + 1;\r
+               ATLTRY(m_lpstrHyperLink = new TCHAR[cchLen]);\r
+               if(m_lpstrHyperLink == NULL)\r
+                       return false;\r
+\r
+               SecureHelper::strcpy_x(m_lpstrHyperLink, cchLen, lpstrLink);\r
+               if(m_lpstrLabel == NULL)\r
+               {\r
+                       T* pT = static_cast<T*>(this);\r
+                       pT->CalcLabelRect();\r
+               }\r
+#ifndef _WIN32_WCE\r
+               if(m_tip.IsWindow())\r
+               {\r
+                       m_tip.Activate(TRUE);\r
+                       m_tip.AddTool(m_hWnd, m_lpstrHyperLink, &m_rcLink, 1);\r
+               }\r
+#endif // !_WIN32_WCE\r
+               return true;\r
+       }\r
+\r
+       HFONT GetLinkFont() const\r
+       {\r
+               return m_hFont;\r
+       }\r
+\r
+       void SetLinkFont(HFONT hFont)\r
+       {\r
+               if(m_bInternalLinkFont && m_hFont != NULL)\r
+               {\r
+                       ::DeleteObject(m_hFont);\r
+                       m_bInternalLinkFont = false;\r
+               }\r
+               m_hFont = hFont;\r
+       }\r
+\r
+       int GetIdealHeight() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               if(m_lpstrLabel == NULL && m_lpstrHyperLink == NULL)\r
+                       return -1;\r
+               if(!m_bPaintLabel)\r
+                       return -1;\r
+\r
+               CClientDC dc(m_hWnd);\r
+               RECT rect = { 0 };\r
+               GetClientRect(&rect);\r
+               HFONT hFontOld = dc.SelectFont(m_hFontNormal);\r
+               RECT rcText = rect;\r
+               dc.DrawText(_T("NS"), -1, &rcText, DT_LEFT | DT_WORDBREAK | DT_CALCRECT);\r
+               dc.SelectFont(m_hFont);\r
+               RECT rcLink = rect;\r
+               dc.DrawText(_T("NS"), -1, &rcLink, DT_LEFT | DT_WORDBREAK | DT_CALCRECT);\r
+               dc.SelectFont(hFontOld);\r
+               return max(rcText.bottom - rcText.top, rcLink.bottom - rcLink.top);\r
+       }\r
+\r
+       bool GetIdealSize(SIZE& size) const\r
+       {\r
+               int cx = 0, cy = 0;\r
+               bool bRet = GetIdealSize(cx, cy);\r
+               if(bRet)\r
+               {\r
+                       size.cx = cx;\r
+                       size.cy = cy;\r
+               }\r
+               return bRet;\r
+       }\r
+\r
+       bool GetIdealSize(int& cx, int& cy) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               if(m_lpstrLabel == NULL && m_lpstrHyperLink == NULL)\r
+                       return false;\r
+               if(!m_bPaintLabel)\r
+                       return false;\r
+\r
+               CClientDC dc(m_hWnd);\r
+               RECT rcClient = { 0 };\r
+               GetClientRect(&rcClient);\r
+               RECT rcAll = rcClient;\r
+\r
+               if(IsUsingTags())\r
+               {\r
+                       // find tags and label parts\r
+                       LPTSTR lpstrLeft = NULL;\r
+                       int cchLeft = 0;\r
+                       LPTSTR lpstrLink = NULL;\r
+                       int cchLink = 0;\r
+                       LPTSTR lpstrRight = NULL;\r
+                       int cchRight = 0;\r
+\r
+                       const T* pT = static_cast<const T*>(this);\r
+                       pT->CalcLabelParts(lpstrLeft, cchLeft, lpstrLink, cchLink, lpstrRight, cchRight);\r
+\r
+                       // get label part rects\r
+                       HFONT hFontOld = dc.SelectFont(m_hFontNormal);\r
+                       RECT rcLeft = rcClient;\r
+                       dc.DrawText(lpstrLeft, cchLeft, &rcLeft, DT_LEFT | DT_WORDBREAK | DT_CALCRECT);\r
+\r
+                       dc.SelectFont(m_hFont);\r
+                       RECT rcLink = { rcLeft.right, rcLeft.top, rcClient.right, rcClient.bottom };\r
+                       dc.DrawText(lpstrLink, cchLink, &rcLink, DT_LEFT | DT_WORDBREAK | DT_CALCRECT);\r
+\r
+                       dc.SelectFont(m_hFontNormal);\r
+                       RECT rcRight = { rcLink.right, rcLink.top, rcClient.right, rcClient.bottom };\r
+                       dc.DrawText(lpstrRight, cchRight, &rcRight, DT_LEFT | DT_WORDBREAK | DT_CALCRECT);\r
+\r
+                       dc.SelectFont(hFontOld);\r
+\r
+                       int cyMax = max(rcLeft.bottom, max(rcLink.bottom, rcRight.bottom));\r
+                       ::SetRect(&rcAll, rcLeft.left, rcLeft.top, rcRight.right, cyMax);\r
+               }\r
+               else\r
+               {\r
+                       HFONT hOldFont = NULL;\r
+                       if(m_hFont != NULL)\r
+                               hOldFont = dc.SelectFont(m_hFont);\r
+                       LPTSTR lpstrText = (m_lpstrLabel != NULL) ? m_lpstrLabel : m_lpstrHyperLink;\r
+                       DWORD dwStyle = GetStyle();\r
+                       int nDrawStyle = DT_LEFT;\r
+                       if (dwStyle & SS_CENTER)\r
+                               nDrawStyle = DT_CENTER;\r
+                       else if (dwStyle & SS_RIGHT)\r
+                               nDrawStyle = DT_RIGHT;\r
+                       dc.DrawText(lpstrText, -1, &rcAll, nDrawStyle | DT_WORDBREAK | DT_CALCRECT);\r
+                       if(m_hFont != NULL)\r
+                               dc.SelectFont(hOldFont);\r
+                       if (dwStyle & SS_CENTER)\r
+                       {\r
+                               int dx = (rcClient.right - rcAll.right) / 2;\r
+                               ::OffsetRect(&rcAll, dx, 0);\r
+                       }\r
+                       else if (dwStyle & SS_RIGHT)\r
+                       {\r
+                               int dx = rcClient.right - rcAll.right;\r
+                               ::OffsetRect(&rcAll, dx, 0);\r
+                       }\r
+               }\r
+\r
+               cx = rcAll.right - rcAll.left;\r
+               cy = rcAll.bottom - rcAll.top;\r
+\r
+               return true;\r
+       }\r
+\r
+       // for command buttons only\r
+       bool GetToolTipText(LPTSTR lpstrBuffer, int nLength) const\r
+       {\r
+               ATLASSERT(IsCommandButton());\r
+               return GetHyperLink(lpstrBuffer, nLength);\r
+       }\r
+\r
+       bool SetToolTipText(LPCTSTR lpstrToolTipText)\r
+       {\r
+               ATLASSERT(IsCommandButton());\r
+               return SetHyperLink(lpstrToolTipText);\r
+       }\r
+\r
+// Operations\r
+       BOOL SubclassWindow(HWND hWnd)\r
+       {\r
+               ATLASSERT(m_hWnd == NULL);\r
+               ATLASSERT(::IsWindow(hWnd));\r
+#if (_MSC_VER >= 1300)\r
+               BOOL bRet = ATL::CWindowImpl< T, TBase, TWinTraits>::SubclassWindow(hWnd);\r
+#else // !(_MSC_VER >= 1300)\r
+               typedef ATL::CWindowImpl< T, TBase, TWinTraits>   _baseClass;\r
+               BOOL bRet = _baseClass::SubclassWindow(hWnd);\r
+#endif // !(_MSC_VER >= 1300)\r
+               if(bRet)\r
+               {\r
+                       T* pT = static_cast<T*>(this);\r
+                       pT->Init();\r
+               }\r
+               return bRet;\r
+       }\r
+\r
+       bool Navigate()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               bool bRet = true;\r
+               if(IsNotifyButton())\r
+               {\r
+                       NMHDR nmhdr = { m_hWnd, GetDlgCtrlID(), NM_CLICK };\r
+                       ::SendMessage(GetParent(), WM_NOTIFY, GetDlgCtrlID(), (LPARAM)&nmhdr);\r
+               }\r
+               else if(IsCommandButton())\r
+               {\r
+                       ::SendMessage(GetParent(), WM_COMMAND, MAKEWPARAM(GetDlgCtrlID(), BN_CLICKED), (LPARAM)m_hWnd);\r
+               }\r
+               else\r
+               {\r
+                       ATLASSERT(m_lpstrHyperLink != NULL);\r
+#ifndef _WIN32_WCE\r
+                       DWORD_PTR dwRet = (DWORD_PTR)::ShellExecute(0, _T("open"), m_lpstrHyperLink, 0, 0, SW_SHOWNORMAL);\r
+                       bRet = (dwRet > 32);\r
+#else // CE specific\r
+                       SHELLEXECUTEINFO shExeInfo = { sizeof(SHELLEXECUTEINFO), 0, 0, L"open", m_lpstrHyperLink, 0, 0, SW_SHOWNORMAL, 0, 0, 0, 0, 0, 0, 0 };\r
+                       ::ShellExecuteEx(&shExeInfo);\r
+                       DWORD_PTR dwRet = (DWORD_PTR)shExeInfo.hInstApp;\r
+                       bRet = (dwRet == 0) || (dwRet > 32);\r
+#endif // _WIN32_WCE\r
+                       ATLASSERT(bRet);\r
+                       if(bRet)\r
+                       {\r
+                               m_bVisited = true;\r
+                               Invalidate();\r
+                       }\r
+               }\r
+               return bRet;\r
+       }\r
+\r
+// Message map and handlers\r
+       BEGIN_MSG_MAP(CHyperLinkImpl)\r
+               MESSAGE_HANDLER(WM_CREATE, OnCreate)\r
+#ifndef _WIN32_WCE\r
+               MESSAGE_HANDLER(WM_DESTROY, OnDestroy)\r
+               MESSAGE_RANGE_HANDLER(WM_MOUSEFIRST, WM_MOUSELAST, OnMouseMessage)\r
+#endif // !_WIN32_WCE\r
+               MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground)\r
+               MESSAGE_HANDLER(WM_PAINT, OnPaint)\r
+#ifndef _WIN32_WCE\r
+               MESSAGE_HANDLER(WM_PRINTCLIENT, OnPaint)\r
+#endif // !_WIN32_WCE\r
+               MESSAGE_HANDLER(WM_SETFOCUS, OnFocus)\r
+               MESSAGE_HANDLER(WM_KILLFOCUS, OnFocus)\r
+               MESSAGE_HANDLER(WM_MOUSEMOVE, OnMouseMove)\r
+#ifndef _WIN32_WCE\r
+               MESSAGE_HANDLER(WM_MOUSELEAVE, OnMouseLeave)\r
+#endif // !_WIN32_WCE\r
+               MESSAGE_HANDLER(WM_LBUTTONDOWN, OnLButtonDown)\r
+               MESSAGE_HANDLER(WM_LBUTTONUP, OnLButtonUp)\r
+               MESSAGE_HANDLER(WM_CHAR, OnChar)\r
+               MESSAGE_HANDLER(WM_GETDLGCODE, OnGetDlgCode)\r
+               MESSAGE_HANDLER(WM_SETCURSOR, OnSetCursor)\r
+               MESSAGE_HANDLER(WM_ENABLE, OnEnable)\r
+               MESSAGE_HANDLER(WM_GETFONT, OnGetFont)\r
+               MESSAGE_HANDLER(WM_SETFONT, OnSetFont)\r
+               MESSAGE_HANDLER(WM_UPDATEUISTATE, OnUpdateUiState)\r
+               MESSAGE_HANDLER(WM_SIZE, OnSize)\r
+       END_MSG_MAP()\r
+\r
+       LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               pT->Init();\r
+               return 0;\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       LRESULT OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)\r
+       {\r
+               if(m_tip.IsWindow())\r
+               {\r
+                       m_tip.DestroyWindow();\r
+                       m_tip.m_hWnd = NULL;\r
+               }\r
+               bHandled = FALSE;\r
+               return 1;\r
+       }\r
+\r
+       LRESULT OnMouseMessage(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)\r
+       {\r
+               MSG msg = { m_hWnd, uMsg, wParam, lParam };\r
+               if(m_tip.IsWindow() && IsUsingToolTip())\r
+                       m_tip.RelayEvent(&msg);\r
+               bHandled = FALSE;\r
+               return 1;\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       LRESULT OnEraseBackground(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)\r
+       {\r
+               return 1;   // no background painting needed (we do it all during WM_PAINT)\r
+       }\r
+\r
+       LRESULT OnPaint(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)\r
+       {\r
+               if(!m_bPaintLabel)\r
+               {\r
+                       bHandled = FALSE;\r
+                       return 1;\r
+               }\r
+\r
+               T* pT = static_cast<T*>(this);\r
+               if(wParam != NULL)\r
+               {\r
+                       pT->DoEraseBackground((HDC)wParam);\r
+                       pT->DoPaint((HDC)wParam);\r
+               }\r
+               else\r
+               {\r
+                       CPaintDC dc(m_hWnd);\r
+                       pT->DoEraseBackground(dc.m_hDC);\r
+                       pT->DoPaint(dc.m_hDC);\r
+               }\r
+\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnFocus(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)\r
+       {\r
+               if(m_bPaintLabel)\r
+                       Invalidate();\r
+               else\r
+                       bHandled = FALSE;\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnMouseMove(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled)\r
+       {\r
+               POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };\r
+               if((m_lpstrHyperLink != NULL  || IsCommandButton()) && ::PtInRect(&m_rcLink, pt))\r
+               {\r
+                       ::SetCursor(m_hCursor);\r
+                       if(IsUnderlineHover())\r
+                       {\r
+                               if(!m_bHover)\r
+                               {\r
+                                       m_bHover = true;\r
+                                       InvalidateRect(&m_rcLink);\r
+                                       UpdateWindow();\r
+#ifndef _WIN32_WCE\r
+                                       StartTrackMouseLeave();\r
+#endif // !_WIN32_WCE\r
+                               }\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       if(IsUnderlineHover())\r
+                       {\r
+                               if(m_bHover)\r
+                               {\r
+                                       m_bHover = false;\r
+                                       InvalidateRect(&m_rcLink);\r
+                                       UpdateWindow();\r
+                               }\r
+                       }\r
+                       bHandled = FALSE;\r
+               }\r
+               return 0;\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       LRESULT OnMouseLeave(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)\r
+       {\r
+               if(IsUnderlineHover() && m_bHover)\r
+               {\r
+                       m_bHover = false;\r
+                       InvalidateRect(&m_rcLink);\r
+                       UpdateWindow();\r
+               }\r
+               return 0;\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       LRESULT OnLButtonDown(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/)\r
+       {\r
+               POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };\r
+               if(::PtInRect(&m_rcLink, pt))\r
+               {\r
+                       SetFocus();\r
+                       SetCapture();\r
+               }\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnLButtonUp(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/)\r
+       {\r
+               if(GetCapture() == m_hWnd)\r
+               {\r
+                       ReleaseCapture();\r
+                       POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };\r
+                       if(::PtInRect(&m_rcLink, pt))\r
+                       {\r
+                               T* pT = static_cast<T*>(this);\r
+                               pT->Navigate();\r
+                       }\r
+               }\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnChar(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)\r
+       {\r
+               if(wParam == VK_RETURN || wParam == VK_SPACE)\r
+               {\r
+                       T* pT = static_cast<T*>(this);\r
+                       pT->Navigate();\r
+               }\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnGetDlgCode(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)\r
+       {\r
+               return DLGC_WANTCHARS;\r
+       }\r
+\r
+       LRESULT OnSetCursor(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)\r
+       {\r
+               POINT pt = { 0, 0 };\r
+               GetCursorPos(&pt);\r
+               ScreenToClient(&pt);\r
+               if((m_lpstrHyperLink != NULL  || IsCommandButton()) && ::PtInRect(&m_rcLink, pt))\r
+               {\r
+                       return TRUE;\r
+               }\r
+               bHandled = FALSE;\r
+               return FALSE;\r
+       }\r
+\r
+       LRESULT OnEnable(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)\r
+       {\r
+               Invalidate();\r
+               UpdateWindow();\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnGetFont(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)\r
+       {\r
+               return (LRESULT)m_hFontNormal;\r
+       }\r
+\r
+       LRESULT OnSetFont(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)\r
+       {\r
+               m_hFontNormal = (HFONT)wParam;\r
+               if((BOOL)lParam)\r
+               {\r
+                       Invalidate();\r
+                       UpdateWindow();\r
+               }\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnUpdateUiState(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)\r
+       {\r
+               // If the control is subclassed or superclassed, this message can cause\r
+               // repainting without WM_PAINT. We don't use this state, so just do nothing.\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnSize(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               pT->CalcLabelRect();\r
+               pT->Invalidate();\r
+               return 0;\r
+       }\r
+\r
+// Implementation\r
+       void Init()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+\r
+               // Check if we should paint a label\r
+               const int cchBuff = 8;\r
+               TCHAR szBuffer[cchBuff] = { 0 };\r
+               if(::GetClassName(m_hWnd, szBuffer, cchBuff))\r
+               {\r
+                       if(lstrcmpi(szBuffer, _T("static")) == 0)\r
+                       {\r
+                               ModifyStyle(0, SS_NOTIFY);   // we need this\r
+                               DWORD dwStyle = GetStyle() & 0x000000FF;\r
+#ifndef _WIN32_WCE\r
+                               if(dwStyle == SS_ICON || dwStyle == SS_BLACKRECT || dwStyle == SS_GRAYRECT || \r
+                                               dwStyle == SS_WHITERECT || dwStyle == SS_BLACKFRAME || dwStyle == SS_GRAYFRAME || \r
+                                               dwStyle == SS_WHITEFRAME || dwStyle == SS_OWNERDRAW || \r
+                                               dwStyle == SS_BITMAP || dwStyle == SS_ENHMETAFILE)\r
+#else // CE specific\r
+                               if(dwStyle == SS_ICON || dwStyle == SS_BITMAP)\r
+#endif // _WIN32_WCE\r
+                                       m_bPaintLabel = false;\r
+                       }\r
+               }\r
+\r
+               // create or load a cursor\r
+#if (WINVER >= 0x0500) || defined(_WIN32_WCE)\r
+               m_hCursor = ::LoadCursor(NULL, IDC_HAND);\r
+#else\r
+               m_hCursor = ::CreateCursor(ModuleHelper::GetModuleInstance(), _AtlHyperLink_CursorData.xHotSpot, _AtlHyperLink_CursorData.yHotSpot, _AtlHyperLink_CursorData.cxWidth, _AtlHyperLink_CursorData.cyHeight, _AtlHyperLink_CursorData.arrANDPlane, _AtlHyperLink_CursorData.arrXORPlane);\r
+#endif\r
+               ATLASSERT(m_hCursor != NULL);\r
+\r
+               // set font\r
+               if(m_bPaintLabel)\r
+               {\r
+                       ATL::CWindow wnd = GetParent();\r
+                       m_hFontNormal = wnd.GetFont();\r
+                       if(m_hFontNormal == NULL)\r
+                               m_hFontNormal = (HFONT)::GetStockObject(SYSTEM_FONT);\r
+                       if(m_hFontNormal != NULL && m_hFont == NULL)\r
+                       {\r
+                               LOGFONT lf = { 0 };\r
+                               CFontHandle font = m_hFontNormal;\r
+                               font.GetLogFont(&lf);\r
+                               if(IsUsingTagsBold())\r
+                                       lf.lfWeight = FW_BOLD;\r
+                               else if(!IsNotUnderlined())\r
+                                       lf.lfUnderline = TRUE;\r
+                               m_hFont = ::CreateFontIndirect(&lf);\r
+                               m_bInternalLinkFont = true;\r
+                               ATLASSERT(m_hFont != NULL);\r
+                       }\r
+               }\r
+\r
+#ifndef _WIN32_WCE\r
+               // create a tool tip\r
+               m_tip.Create(m_hWnd);\r
+               ATLASSERT(m_tip.IsWindow());\r
+#endif // !_WIN32_WCE\r
+\r
+               // set label (defaults to window text)\r
+               if(m_lpstrLabel == NULL)\r
+               {\r
+                       int nLen = GetWindowTextLength();\r
+                       if(nLen > 0)\r
+                       {\r
+                               CTempBuffer<TCHAR, _WTL_STACK_ALLOC_THRESHOLD> buff;\r
+                               LPTSTR lpstrText = buff.Allocate(nLen + 1);\r
+                               ATLASSERT(lpstrText != NULL);\r
+                               if((lpstrText != NULL) && (GetWindowText(lpstrText, nLen + 1) > 0))\r
+                                       SetLabel(lpstrText);\r
+                       }\r
+               }\r
+\r
+               T* pT = static_cast<T*>(this);\r
+               pT->CalcLabelRect();\r
+\r
+               // set hyperlink (defaults to label), or just activate tool tip if already set\r
+               if(m_lpstrHyperLink == NULL && !IsCommandButton())\r
+               {\r
+                       if(m_lpstrLabel != NULL)\r
+                               SetHyperLink(m_lpstrLabel);\r
+               }\r
+#ifndef _WIN32_WCE\r
+               else\r
+               {\r
+                       m_tip.Activate(TRUE);\r
+                       m_tip.AddTool(m_hWnd, m_lpstrHyperLink, &m_rcLink, 1);\r
+               }\r
+#endif // !_WIN32_WCE\r
+\r
+               // set link colors\r
+               if(m_bPaintLabel)\r
+               {\r
+                       ATL::CRegKey rk;\r
+                       LONG lRet = rk.Open(HKEY_CURRENT_USER, _T("Software\\Microsoft\\Internet Explorer\\Settings"));\r
+                       if(lRet == 0)\r
+                       {\r
+                               const int cchValue = 12;\r
+                               TCHAR szValue[cchValue] = { 0 };\r
+#if (_ATL_VER >= 0x0700)\r
+                               ULONG ulCount = cchValue;\r
+                               lRet = rk.QueryStringValue(_T("Anchor Color"), szValue, &ulCount);\r
+#else\r
+                               DWORD dwCount = cchValue * sizeof(TCHAR);\r
+                               lRet = rk.QueryValue(szValue, _T("Anchor Color"), &dwCount);\r
+#endif\r
+                               if(lRet == 0)\r
+                               {\r
+                                       COLORREF clr = pT->_ParseColorString(szValue);\r
+                                       ATLASSERT(clr != CLR_INVALID);\r
+                                       if(clr != CLR_INVALID)\r
+                                               m_clrLink = clr;\r
+                               }\r
+\r
+#if (_ATL_VER >= 0x0700)\r
+                               ulCount = cchValue;\r
+                               lRet = rk.QueryStringValue(_T("Anchor Color Visited"), szValue, &ulCount);\r
+#else\r
+                               dwCount = cchValue * sizeof(TCHAR);\r
+                               lRet = rk.QueryValue(szValue, _T("Anchor Color Visited"), &dwCount);\r
+#endif\r
+                               if(lRet == 0)\r
+                               {\r
+                                       COLORREF clr = pT->_ParseColorString(szValue);\r
+                                       ATLASSERT(clr != CLR_INVALID);\r
+                                       if(clr != CLR_INVALID)\r
+                                               m_clrVisited = clr;\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       static COLORREF _ParseColorString(LPTSTR lpstr)\r
+       {\r
+               int c[3] = { -1, -1, -1 };\r
+               LPTSTR p = NULL;\r
+               for(int i = 0; i < 2; i++)\r
+               {\r
+                       for(p = lpstr; *p != _T('\0'); p = ::CharNext(p))\r
+                       {\r
+                               if(*p == _T(','))\r
+                               {\r
+                                       *p = _T('\0');\r
+                                       c[i] = T::_xttoi(lpstr);\r
+                                       lpstr = &p[1];\r
+                                       break;\r
+                               }\r
+                       }\r
+                       if(c[i] == -1)\r
+                               return CLR_INVALID;\r
+               }\r
+               if(*lpstr == _T('\0'))\r
+                       return CLR_INVALID;\r
+               c[2] = T::_xttoi(lpstr);\r
+\r
+               return RGB(c[0], c[1], c[2]);\r
+       }\r
+\r
+       bool CalcLabelRect()\r
+       {\r
+               if(!::IsWindow(m_hWnd))\r
+                       return false;\r
+               if(m_lpstrLabel == NULL && m_lpstrHyperLink == NULL)\r
+                       return false;\r
+\r
+               CClientDC dc(m_hWnd);\r
+               RECT rcClient = { 0 };\r
+               GetClientRect(&rcClient);\r
+               m_rcLink = rcClient;\r
+               if(!m_bPaintLabel)\r
+                       return true;\r
+\r
+               if(IsUsingTags())\r
+               {\r
+                       // find tags and label parts\r
+                       LPTSTR lpstrLeft = NULL;\r
+                       int cchLeft = 0;\r
+                       LPTSTR lpstrLink = NULL;\r
+                       int cchLink = 0;\r
+                       LPTSTR lpstrRight = NULL;\r
+                       int cchRight = 0;\r
+\r
+                       T* pT = static_cast<T*>(this);\r
+                       pT->CalcLabelParts(lpstrLeft, cchLeft, lpstrLink, cchLink, lpstrRight, cchRight);\r
+                       ATLASSERT(lpstrLink != NULL);\r
+                       ATLASSERT(cchLink > 0);\r
+\r
+                       // get label part rects\r
+                       HFONT hFontOld = dc.SelectFont(m_hFontNormal);\r
+\r
+                       RECT rcLeft = rcClient;\r
+                       if(lpstrLeft != NULL)\r
+                               dc.DrawText(lpstrLeft, cchLeft, &rcLeft, DT_LEFT | DT_WORDBREAK | DT_CALCRECT);\r
+\r
+                       dc.SelectFont(m_hFont);\r
+                       RECT rcLink = rcClient;\r
+                       if(lpstrLeft != NULL)\r
+                               rcLink.left = rcLeft.right;\r
+                       dc.DrawText(lpstrLink, cchLink, &rcLink, DT_LEFT | DT_WORDBREAK | DT_CALCRECT);\r
+\r
+                       dc.SelectFont(hFontOld);\r
+\r
+                       m_rcLink = rcLink;\r
+               }\r
+               else\r
+               {\r
+                       HFONT hOldFont = NULL;\r
+                       if(m_hFont != NULL)\r
+                               hOldFont = dc.SelectFont(m_hFont);\r
+                       LPTSTR lpstrText = (m_lpstrLabel != NULL) ? m_lpstrLabel : m_lpstrHyperLink;\r
+                       DWORD dwStyle = GetStyle();\r
+                       int nDrawStyle = DT_LEFT;\r
+                       if (dwStyle & SS_CENTER)\r
+                               nDrawStyle = DT_CENTER;\r
+                       else if (dwStyle & SS_RIGHT)\r
+                               nDrawStyle = DT_RIGHT;\r
+                       dc.DrawText(lpstrText, -1, &m_rcLink, nDrawStyle | DT_WORDBREAK | DT_CALCRECT);\r
+                       if(m_hFont != NULL)\r
+                               dc.SelectFont(hOldFont);\r
+                       if (dwStyle & SS_CENTER)\r
+                       {\r
+                               int dx = (rcClient.right - m_rcLink.right) / 2;\r
+                               ::OffsetRect(&m_rcLink, dx, 0);\r
+                       }\r
+                       else if (dwStyle & SS_RIGHT)\r
+                       {\r
+                               int dx = rcClient.right - m_rcLink.right;\r
+                               ::OffsetRect(&m_rcLink, dx, 0);\r
+                       }\r
+               }\r
+\r
+               return true;\r
+       }\r
+\r
+       void CalcLabelParts(LPTSTR& lpstrLeft, int& cchLeft, LPTSTR& lpstrLink, int& cchLink, LPTSTR& lpstrRight, int& cchRight) const\r
+       {\r
+               lpstrLeft = NULL;\r
+               cchLeft = 0;\r
+               lpstrLink = NULL;\r
+               cchLink = 0;\r
+               lpstrRight = NULL;\r
+               cchRight = 0;\r
+\r
+               LPTSTR lpstrText = (m_lpstrLabel != NULL) ? m_lpstrLabel : m_lpstrHyperLink;\r
+               int cchText = lstrlen(lpstrText);\r
+               bool bOutsideLink = true;\r
+               for(int i = 0; i < cchText; i++)\r
+               {\r
+                       if(lpstrText[i] != _T('<'))\r
+                               continue;\r
+\r
+                       if(bOutsideLink)\r
+                       {\r
+                               if(::CompareString(LOCALE_USER_DEFAULT, NORM_IGNORECASE, &lpstrText[i], 3, _T("<A>"), 3) == CSTR_EQUAL)\r
+                               {\r
+                                       if(i > 0)\r
+                                       {\r
+                                               lpstrLeft = lpstrText;\r
+                                               cchLeft = i;\r
+                                       }\r
+                                       lpstrLink = &lpstrText[i + 3];\r
+                                       bOutsideLink = false;\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               if(::CompareString(LOCALE_USER_DEFAULT, NORM_IGNORECASE, &lpstrText[i], 4, _T("</A>"), 4) == CSTR_EQUAL)\r
+                               {\r
+                                       cchLink = i - 3 - cchLeft;\r
+                                       if(lpstrText[i + 4] != 0)\r
+                                       {\r
+                                               lpstrRight = &lpstrText[i + 4];\r
+                                               cchRight = cchText - (i + 4);\r
+                                               break;\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+\r
+       }\r
+\r
+       void DoEraseBackground(CDCHandle dc)\r
+       {\r
+               HBRUSH hBrush = (HBRUSH)::SendMessage(GetParent(), WM_CTLCOLORSTATIC, (WPARAM)dc.m_hDC, (LPARAM)m_hWnd);\r
+               if(hBrush != NULL)\r
+               {\r
+                       RECT rect = { 0 };\r
+                       GetClientRect(&rect);\r
+                       dc.FillRect(&rect, hBrush);\r
+               }\r
+       }\r
+\r
+       void DoPaint(CDCHandle dc)\r
+       {\r
+               if(IsUsingTags())\r
+               {\r
+                       // find tags and label parts\r
+                       LPTSTR lpstrLeft = NULL;\r
+                       int cchLeft = 0;\r
+                       LPTSTR lpstrLink = NULL;\r
+                       int cchLink = 0;\r
+                       LPTSTR lpstrRight = NULL;\r
+                       int cchRight = 0;\r
+\r
+                       T* pT = static_cast<T*>(this);\r
+                       pT->CalcLabelParts(lpstrLeft, cchLeft, lpstrLink, cchLink, lpstrRight, cchRight);\r
+\r
+                       // get label part rects\r
+                       RECT rcClient = { 0 };\r
+                       GetClientRect(&rcClient);\r
+\r
+                       dc.SetBkMode(TRANSPARENT);\r
+                       HFONT hFontOld = dc.SelectFont(m_hFontNormal);\r
+\r
+                       if(lpstrLeft != NULL)\r
+                               dc.DrawText(lpstrLeft, cchLeft, &rcClient, DT_LEFT | DT_WORDBREAK);\r
+\r
+                       COLORREF clrOld = dc.SetTextColor(IsWindowEnabled() ? (m_bVisited ? m_clrVisited : m_clrLink) : (::GetSysColor(COLOR_GRAYTEXT)));\r
+                       if(m_hFont != NULL && (!IsUnderlineHover() || (IsUnderlineHover() && m_bHover)))\r
+                               dc.SelectFont(m_hFont);\r
+                       else\r
+                               dc.SelectFont(m_hFontNormal);\r
+\r
+                       dc.DrawText(lpstrLink, cchLink, &m_rcLink, DT_LEFT | DT_WORDBREAK);\r
+\r
+                       dc.SetTextColor(clrOld);\r
+                       dc.SelectFont(m_hFontNormal);\r
+                       if(lpstrRight != NULL)\r
+                       {\r
+                               RECT rcRight = { m_rcLink.right, m_rcLink.top, rcClient.right, rcClient.bottom };\r
+                               dc.DrawText(lpstrRight, cchRight, &rcRight, DT_LEFT | DT_WORDBREAK);\r
+                       }\r
+\r
+                       if(GetFocus() == m_hWnd)\r
+                               dc.DrawFocusRect(&m_rcLink);\r
+\r
+                       dc.SelectFont(hFontOld);\r
+               }\r
+               else\r
+               {\r
+                       dc.SetBkMode(TRANSPARENT);\r
+                       COLORREF clrOld = dc.SetTextColor(IsWindowEnabled() ? (m_bVisited ? m_clrVisited : m_clrLink) : (::GetSysColor(COLOR_GRAYTEXT)));\r
+\r
+                       HFONT hFontOld = NULL;\r
+                       if(m_hFont != NULL && (!IsUnderlineHover() || (IsUnderlineHover() && m_bHover)))\r
+                               hFontOld = dc.SelectFont(m_hFont);\r
+                       else\r
+                               hFontOld = dc.SelectFont(m_hFontNormal);\r
+\r
+                       LPTSTR lpstrText = (m_lpstrLabel != NULL) ? m_lpstrLabel : m_lpstrHyperLink;\r
+\r
+                       DWORD dwStyle = GetStyle();\r
+                       int nDrawStyle = DT_LEFT;\r
+                       if (dwStyle & SS_CENTER)\r
+                               nDrawStyle = DT_CENTER;\r
+                       else if (dwStyle & SS_RIGHT)\r
+                               nDrawStyle = DT_RIGHT;\r
+\r
+                       dc.DrawText(lpstrText, -1, &m_rcLink, nDrawStyle | DT_WORDBREAK);\r
+\r
+                       if(GetFocus() == m_hWnd)\r
+                               dc.DrawFocusRect(&m_rcLink);\r
+\r
+                       dc.SetTextColor(clrOld);\r
+                       dc.SelectFont(hFontOld);\r
+               }\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       BOOL StartTrackMouseLeave()\r
+       {\r
+               TRACKMOUSEEVENT tme = { 0 };\r
+               tme.cbSize = sizeof(tme);\r
+               tme.dwFlags = TME_LEAVE;\r
+               tme.hwndTrack = m_hWnd;\r
+               return _TrackMouseEvent(&tme);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+// Implementation helpers\r
+       bool IsUnderlined() const\r
+       {\r
+               return ((m_dwExtendedStyle & (HLINK_NOTUNDERLINED | HLINK_UNDERLINEHOVER)) == 0);\r
+       }\r
+\r
+       bool IsNotUnderlined() const\r
+       {\r
+               return ((m_dwExtendedStyle & HLINK_NOTUNDERLINED) != 0);\r
+       }\r
+\r
+       bool IsUnderlineHover() const\r
+       {\r
+               return ((m_dwExtendedStyle & HLINK_UNDERLINEHOVER) != 0);\r
+       }\r
+\r
+       bool IsCommandButton() const\r
+       {\r
+               return ((m_dwExtendedStyle & HLINK_COMMANDBUTTON) != 0);\r
+       }\r
+\r
+       bool IsNotifyButton() const\r
+       {\r
+               return ((m_dwExtendedStyle & HLINK_NOTIFYBUTTON) == HLINK_NOTIFYBUTTON);\r
+       }\r
+\r
+       bool IsUsingTags() const\r
+       {\r
+               return ((m_dwExtendedStyle & HLINK_USETAGS) != 0);\r
+       }\r
+\r
+       bool IsUsingTagsBold() const\r
+       {\r
+               return ((m_dwExtendedStyle & HLINK_USETAGSBOLD) == HLINK_USETAGSBOLD);\r
+       }\r
+\r
+       bool IsUsingToolTip() const\r
+       {\r
+               return ((m_dwExtendedStyle & HLINK_NOTOOLTIP) == 0);\r
+       }\r
+\r
+       static int _xttoi(const TCHAR* nptr)\r
+       {\r
+#ifndef _ATL_MIN_CRT\r
+               return _ttoi(nptr);\r
+#else // _ATL_MIN_CRT\r
+               while(*nptr == _T(' '))   // skip spaces\r
+                       ++nptr;\r
+\r
+               int c = (int)(_TUCHAR)*nptr++;\r
+               int sign = c;   // save sign indication\r
+               if (c == _T('-') || c == _T('+'))\r
+                       c = (int)(_TUCHAR)*nptr++;   // skip sign\r
+\r
+               int total = 0;\r
+               while((TCHAR)c >= _T('0') && (TCHAR)c <= _T('9'))\r
+               {\r
+                       total = 10 * total + ((TCHAR)c - _T('0'));   // accumulate digit\r
+                       c = (int)(_TUCHAR)*nptr++;        // get next char\r
+               }\r
+\r
+               // return result, negated if necessary\r
+               return ((TCHAR)sign != _T('-')) ? total : -total;\r
+#endif // _ATL_MIN_CRT\r
+       }\r
+};\r
+\r
+\r
+class CHyperLink : public CHyperLinkImpl<CHyperLink>\r
+{\r
+public:\r
+       DECLARE_WND_CLASS(_T("WTL_HyperLink"))\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CWaitCursor - displays a wait cursor\r
+\r
+class CWaitCursor\r
+{\r
+public:\r
+// Data\r
+       HCURSOR m_hWaitCursor;\r
+       HCURSOR m_hOldCursor;\r
+       bool m_bInUse;\r
+\r
+// Constructor/destructor\r
+       CWaitCursor(bool bSet = true, LPCTSTR lpstrCursor = IDC_WAIT, bool bSys = true) : m_hOldCursor(NULL), m_bInUse(false)\r
+       {\r
+               HINSTANCE hInstance = bSys ? NULL : ModuleHelper::GetResourceInstance();\r
+               m_hWaitCursor = ::LoadCursor(hInstance, lpstrCursor);\r
+               ATLASSERT(m_hWaitCursor != NULL);\r
+\r
+               if(bSet)\r
+                       Set();\r
+       }\r
+\r
+       ~CWaitCursor()\r
+       {\r
+               Restore();\r
+       }\r
+\r
+// Methods\r
+       bool Set()\r
+       {\r
+               if(m_bInUse)\r
+                       return false;\r
+               m_hOldCursor = ::SetCursor(m_hWaitCursor);\r
+               m_bInUse = true;\r
+               return true;\r
+       }\r
+\r
+       bool Restore()\r
+       {\r
+               if(!m_bInUse)\r
+                       return false;\r
+               ::SetCursor(m_hOldCursor);\r
+               m_bInUse = false;\r
+               return true;\r
+       }\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CCustomWaitCursor - for custom and animated cursors\r
+\r
+class CCustomWaitCursor : public CWaitCursor\r
+{\r
+public:\r
+// Constructor/destructor\r
+       CCustomWaitCursor(ATL::_U_STRINGorID cursor, bool bSet = true, HINSTANCE hInstance = NULL) : \r
+                       CWaitCursor(false, IDC_WAIT, true)\r
+       {\r
+               if(hInstance == NULL)\r
+                       hInstance = ModuleHelper::GetResourceInstance();\r
+               m_hWaitCursor = (HCURSOR)::LoadImage(hInstance, cursor.m_lpstr, IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE);\r
+\r
+               if(bSet)\r
+                       Set();\r
+       }\r
+\r
+       ~CCustomWaitCursor()\r
+       {\r
+               Restore();\r
+#if !defined(_WIN32_WCE) || ((_WIN32_WCE >= 0x400) && !(defined(WIN32_PLATFORM_PSPC) || defined(WIN32_PLATFORM_WFSP)))\r
+               ::DestroyCursor(m_hWaitCursor);\r
+#endif // !defined(_WIN32_WCE) || ((_WIN32_WCE >= 0x400) && !(defined(WIN32_PLATFORM_PSPC) || defined(WIN32_PLATFORM_WFSP)))\r
+       }\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CMultiPaneStatusBarCtrl - Status Bar with multiple panes\r
+\r
+template <class T, class TBase = CStatusBarCtrl>\r
+class ATL_NO_VTABLE CMultiPaneStatusBarCtrlImpl : public ATL::CWindowImpl< T, TBase >\r
+{\r
+public:\r
+       DECLARE_WND_SUPERCLASS(NULL, TBase::GetWndClassName())\r
+\r
+// Data\r
+       enum { m_cxPaneMargin = 3 };\r
+\r
+       int m_nPanes;\r
+       int* m_pPane;\r
+\r
+// Constructor/destructor\r
+       CMultiPaneStatusBarCtrlImpl() : m_nPanes(0), m_pPane(NULL)\r
+       { }\r
+\r
+       ~CMultiPaneStatusBarCtrlImpl()\r
+       {\r
+               delete [] m_pPane;\r
+       }\r
+\r
+// Methods\r
+       HWND Create(HWND hWndParent, LPCTSTR lpstrText, DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | SBARS_SIZEGRIP, UINT nID = ATL_IDW_STATUS_BAR)\r
+       {\r
+#if (_MSC_VER >= 1300)\r
+               return ATL::CWindowImpl< T, TBase >::Create(hWndParent, rcDefault, lpstrText, dwStyle, 0, nID);\r
+#else // !(_MSC_VER >= 1300)\r
+               typedef ATL::CWindowImpl< T, TBase >   _baseClass;\r
+               return _baseClass::Create(hWndParent, rcDefault, lpstrText, dwStyle, 0, nID);\r
+#endif // !(_MSC_VER >= 1300)\r
+       }\r
+\r
+       HWND Create(HWND hWndParent, UINT nTextID = ATL_IDS_IDLEMESSAGE, DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | SBARS_SIZEGRIP, UINT nID = ATL_IDW_STATUS_BAR)\r
+       {\r
+               const int cchMax = 128;   // max text length is 127 for status bars (+1 for null)\r
+               TCHAR szText[cchMax];\r
+               szText[0] = 0;\r
+               ::LoadString(ModuleHelper::GetResourceInstance(), nTextID, szText, cchMax);\r
+               return Create(hWndParent, szText, dwStyle, nID);\r
+       }\r
+\r
+       BOOL SetPanes(int* pPanes, int nPanes, bool bSetText = true)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(nPanes > 0);\r
+\r
+               m_nPanes = nPanes;\r
+               delete [] m_pPane;\r
+               m_pPane = NULL;\r
+\r
+               ATLTRY(m_pPane = new int[nPanes]);\r
+               ATLASSERT(m_pPane != NULL);\r
+               if(m_pPane == NULL)\r
+                       return FALSE;\r
+\r
+               CTempBuffer<int, _WTL_STACK_ALLOC_THRESHOLD> buff;\r
+               int* pPanesPos = buff.Allocate(nPanes);\r
+               ATLASSERT(pPanesPos != NULL);\r
+               if(pPanesPos == NULL)\r
+                       return FALSE;\r
+\r
+               SecureHelper::memcpy_x(m_pPane, nPanes * sizeof(int), pPanes, nPanes * sizeof(int));\r
+\r
+               // get status bar DC and set font\r
+               CClientDC dc(m_hWnd);\r
+               HFONT hOldFont = dc.SelectFont(GetFont());\r
+\r
+               // get status bar borders\r
+               int arrBorders[3] = { 0 };\r
+               GetBorders(arrBorders);\r
+\r
+               const int cchBuff = 128;\r
+               TCHAR szBuff[cchBuff] = { 0 };\r
+               SIZE size = { 0, 0 };\r
+               int cxLeft = arrBorders[0];\r
+\r
+               // calculate right edge of each part\r
+               for(int i = 0; i < nPanes; i++)\r
+               {\r
+                       if(pPanes[i] == ID_DEFAULT_PANE)\r
+                       {\r
+                               // make very large, will be resized later\r
+                               pPanesPos[i] = INT_MAX / 2;\r
+                       }\r
+                       else\r
+                       {\r
+                               ::LoadString(ModuleHelper::GetResourceInstance(), pPanes[i], szBuff, cchBuff);\r
+                               dc.GetTextExtent(szBuff, lstrlen(szBuff), &size);\r
+                               T* pT = static_cast<T*>(this);\r
+                               pT;\r
+                               pPanesPos[i] = cxLeft + size.cx + arrBorders[2] + 2 * pT->m_cxPaneMargin;\r
+                       }\r
+                       cxLeft = pPanesPos[i];\r
+               }\r
+\r
+               BOOL bRet = SetParts(nPanes, pPanesPos);\r
+\r
+               if(bRet && bSetText)\r
+               {\r
+                       for(int i = 0; i < nPanes; i++)\r
+                       {\r
+                               if(pPanes[i] != ID_DEFAULT_PANE)\r
+                               {\r
+                                       ::LoadString(ModuleHelper::GetResourceInstance(), pPanes[i], szBuff, cchBuff);\r
+                                       SetPaneText(m_pPane[i], szBuff);\r
+                               }\r
+                       }\r
+               }\r
+\r
+               dc.SelectFont(hOldFont);\r
+               return bRet;\r
+       }\r
+\r
+       bool GetPaneTextLength(int nPaneID, int* pcchLength = NULL, int* pnType = NULL) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               int nIndex  = GetPaneIndexFromID(nPaneID);\r
+               if(nIndex == -1)\r
+                       return false;\r
+\r
+               int nLength = GetTextLength(nIndex, pnType);\r
+               if(pcchLength != NULL)\r
+                       *pcchLength = nLength;\r
+\r
+               return true;\r
+       }\r
+\r
+       BOOL GetPaneText(int nPaneID, LPTSTR lpstrText, int* pcchLength = NULL, int* pnType = NULL) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               int nIndex  = GetPaneIndexFromID(nPaneID);\r
+               if(nIndex == -1)\r
+                       return FALSE;\r
+\r
+               int nLength = GetText(nIndex, lpstrText, pnType);\r
+               if(pcchLength != NULL)\r
+                       *pcchLength = nLength;\r
+\r
+               return TRUE;\r
+       }\r
+\r
+       BOOL SetPaneText(int nPaneID, LPCTSTR lpstrText, int nType = 0)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               int nIndex  = GetPaneIndexFromID(nPaneID);\r
+               if(nIndex == -1)\r
+                       return FALSE;\r
+\r
+               return SetText(nIndex, lpstrText, nType);\r
+       }\r
+\r
+       BOOL GetPaneRect(int nPaneID, LPRECT lpRect) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               int nIndex  = GetPaneIndexFromID(nPaneID);\r
+               if(nIndex == -1)\r
+                       return FALSE;\r
+\r
+               return GetRect(nIndex, lpRect);\r
+       }\r
+\r
+       BOOL SetPaneWidth(int nPaneID, int cxWidth)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(nPaneID != ID_DEFAULT_PANE);   // Can't resize this one\r
+               int nIndex  = GetPaneIndexFromID(nPaneID);\r
+               if(nIndex == -1)\r
+                       return FALSE;\r
+\r
+               // get pane positions\r
+               CTempBuffer<int, _WTL_STACK_ALLOC_THRESHOLD> buff;\r
+               int* pPanesPos = buff.Allocate(m_nPanes);\r
+               if(pPanesPos == NULL)\r
+                       return FALSE;\r
+               GetParts(m_nPanes, pPanesPos);\r
+               // calculate offset\r
+               int cxPaneWidth = pPanesPos[nIndex] - ((nIndex == 0) ? 0 : pPanesPos[nIndex - 1]);\r
+               int cxOff = cxWidth - cxPaneWidth;\r
+               // find variable width pane\r
+               int nDef = m_nPanes;\r
+               for(int i = 0; i < m_nPanes; i++)\r
+               {\r
+                       if(m_pPane[i] == ID_DEFAULT_PANE)\r
+                       {\r
+                               nDef = i;\r
+                               break;\r
+                       }\r
+               }\r
+               // resize\r
+               if(nIndex < nDef)   // before default pane\r
+               {\r
+                       for(int i = nIndex; i < nDef; i++)\r
+                               pPanesPos[i] += cxOff;\r
+                               \r
+               }\r
+               else                    // after default one\r
+               {\r
+                       for(int i = nDef; i < nIndex; i++)\r
+                               pPanesPos[i] -= cxOff;\r
+               }\r
+               // set pane postions\r
+               return SetParts(m_nPanes, pPanesPos);\r
+       }\r
+\r
+#if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)\r
+       BOOL GetPaneTipText(int nPaneID, LPTSTR lpstrText, int nSize) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               int nIndex  = GetPaneIndexFromID(nPaneID);\r
+               if(nIndex == -1)\r
+                       return FALSE;\r
+\r
+               GetTipText(nIndex, lpstrText, nSize);\r
+               return TRUE;\r
+       }\r
+\r
+       BOOL SetPaneTipText(int nPaneID, LPCTSTR lpstrText)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               int nIndex  = GetPaneIndexFromID(nPaneID);\r
+               if(nIndex == -1)\r
+                       return FALSE;\r
+\r
+               SetTipText(nIndex, lpstrText);\r
+               return TRUE;\r
+       }\r
+#endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)\r
+\r
+#if ((_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)) || (defined(_WIN32_WCE) && (_WIN32_WCE >= 0x0500))\r
+       BOOL GetPaneIcon(int nPaneID, HICON& hIcon) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               int nIndex  = GetPaneIndexFromID(nPaneID);\r
+               if(nIndex == -1)\r
+                       return FALSE;\r
+\r
+               hIcon = GetIcon(nIndex);\r
+               return TRUE;\r
+       }\r
+\r
+       BOOL SetPaneIcon(int nPaneID, HICON hIcon)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               int nIndex  = GetPaneIndexFromID(nPaneID);\r
+               if(nIndex == -1)\r
+                       return FALSE;\r
+\r
+               return SetIcon(nIndex, hIcon);\r
+       }\r
+#endif // ((_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)) || (defined(_WIN32_WCE) && (_WIN32_WCE >= 0x0500))\r
+\r
+// Message map and handlers\r
+       BEGIN_MSG_MAP(CMultiPaneStatusBarCtrlImpl< T >)\r
+               MESSAGE_HANDLER(WM_SIZE, OnSize)\r
+       END_MSG_MAP()\r
+\r
+       LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)\r
+       {\r
+               LRESULT lRet = DefWindowProc(uMsg, wParam, lParam);\r
+               if(wParam != SIZE_MINIMIZED && m_nPanes > 0)\r
+               {\r
+                       T* pT = static_cast<T*>(this);\r
+                       pT->UpdatePanesLayout();\r
+               }\r
+               return lRet;\r
+       }\r
+\r
+// Implementation\r
+       BOOL UpdatePanesLayout()\r
+       {\r
+               // get pane positions\r
+               CTempBuffer<int, _WTL_STACK_ALLOC_THRESHOLD> buff;\r
+               int* pPanesPos = buff.Allocate(m_nPanes);\r
+               ATLASSERT(pPanesPos != NULL);\r
+               if(pPanesPos == NULL)\r
+                       return FALSE;\r
+               int nRet = GetParts(m_nPanes, pPanesPos);\r
+               ATLASSERT(nRet == m_nPanes);\r
+               if(nRet != m_nPanes)\r
+                       return FALSE;\r
+               // calculate offset\r
+               RECT rcClient = { 0 };\r
+               GetClientRect(&rcClient);\r
+               int cxOff = rcClient.right - pPanesPos[m_nPanes - 1];\r
+#ifndef _WIN32_WCE\r
+               // Move panes left if size grip box is present\r
+               if((GetStyle() & SBARS_SIZEGRIP) != 0)\r
+                       cxOff -= ::GetSystemMetrics(SM_CXVSCROLL) + ::GetSystemMetrics(SM_CXEDGE);\r
+#endif // !_WIN32_WCE\r
+               // find variable width pane\r
+               int i;\r
+               for(i = 0; i < m_nPanes; i++)\r
+               {\r
+                       if(m_pPane[i] == ID_DEFAULT_PANE)\r
+                               break;\r
+               }\r
+               // resize all panes from the variable one to the right\r
+               if((i < m_nPanes) && (pPanesPos[i] + cxOff) > ((i == 0) ? 0 : pPanesPos[i - 1]))\r
+               {\r
+                       for(; i < m_nPanes; i++)\r
+                               pPanesPos[i] += cxOff;\r
+               }\r
+               // set pane postions\r
+               return SetParts(m_nPanes, pPanesPos);\r
+       }\r
+\r
+       int GetPaneIndexFromID(int nPaneID) const\r
+       {\r
+               for(int i = 0; i < m_nPanes; i++)\r
+               {\r
+                       if(m_pPane[i] == nPaneID)\r
+                               return i;\r
+               }\r
+\r
+               return -1;   // not found\r
+       }\r
+};\r
+\r
+class CMultiPaneStatusBarCtrl : public CMultiPaneStatusBarCtrlImpl<CMultiPaneStatusBarCtrl>\r
+{\r
+public:\r
+       DECLARE_WND_SUPERCLASS(_T("WTL_MultiPaneStatusBar"), GetWndClassName())\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CPaneContainer - provides header with title and close button for panes\r
+\r
+// pane container extended styles\r
+#define PANECNT_NOCLOSEBUTTON  0x00000001\r
+#define PANECNT_VERTICAL       0x00000002\r
+#define PANECNT_FLATBORDER     0x00000004\r
+#define PANECNT_NOBORDER       0x00000008\r
+\r
+template <class T, class TBase = ATL::CWindow, class TWinTraits = ATL::CControlWinTraits>\r
+class ATL_NO_VTABLE CPaneContainerImpl : public ATL::CWindowImpl< T, TBase, TWinTraits >, public CCustomDraw< T >\r
+{\r
+public:\r
+       DECLARE_WND_CLASS_EX(NULL, 0, -1)\r
+\r
+// Constants\r
+       enum\r
+       {\r
+               m_cxyBorder = 2,\r
+               m_cxyTextOffset = 4,\r
+               m_cxyBtnOffset = 1,\r
+\r
+               m_cchTitle = 80,\r
+\r
+               m_cxImageTB = 13,\r
+               m_cyImageTB = 11,\r
+               m_cxyBtnAddTB = 7,\r
+\r
+               m_cxToolBar = m_cxImageTB + m_cxyBtnAddTB + m_cxyBorder + m_cxyBtnOffset,\r
+\r
+               m_xBtnImageLeft = 6,\r
+               m_yBtnImageTop = 5,\r
+               m_xBtnImageRight = 12,\r
+               m_yBtnImageBottom = 11,\r
+\r
+               m_nCloseBtnID = ID_PANE_CLOSE\r
+       };\r
+\r
+// Data members\r
+       CToolBarCtrl m_tb;\r
+       ATL::CWindow m_wndClient;\r
+       int m_cxyHeader;\r
+       TCHAR m_szTitle[m_cchTitle];\r
+       DWORD m_dwExtendedStyle;   // Pane container specific extended styles\r
+\r
+\r
+// Constructor\r
+       CPaneContainerImpl() : m_cxyHeader(0), m_dwExtendedStyle(0)\r
+       {\r
+               m_szTitle[0] = 0;\r
+       }\r
+\r
+// Attributes\r
+       DWORD GetPaneContainerExtendedStyle() const\r
+       {\r
+               return m_dwExtendedStyle;\r
+       }\r
+\r
+       DWORD SetPaneContainerExtendedStyle(DWORD dwExtendedStyle, DWORD dwMask = 0)\r
+       {\r
+               DWORD dwPrevStyle = m_dwExtendedStyle;\r
+               if(dwMask == 0)\r
+                       m_dwExtendedStyle = dwExtendedStyle;\r
+               else\r
+                       m_dwExtendedStyle = (m_dwExtendedStyle & ~dwMask) | (dwExtendedStyle & dwMask);\r
+               if(m_hWnd != NULL)\r
+               {\r
+                       T* pT = static_cast<T*>(this);\r
+                       bool bUpdate = false;\r
+\r
+                       if(((dwPrevStyle & PANECNT_NOCLOSEBUTTON) != 0) && ((m_dwExtendedStyle & PANECNT_NOCLOSEBUTTON) == 0))   // add close button\r
+                       {\r
+                               pT->CreateCloseButton();\r
+                               bUpdate = true;\r
+                       }\r
+                       else if(((dwPrevStyle & PANECNT_NOCLOSEBUTTON) == 0) && ((m_dwExtendedStyle & PANECNT_NOCLOSEBUTTON) != 0))   // remove close button\r
+                       {\r
+                               pT->DestroyCloseButton();\r
+                               bUpdate = true;\r
+                       }\r
+\r
+                       if((dwPrevStyle & PANECNT_VERTICAL) != (m_dwExtendedStyle & PANECNT_VERTICAL))   // change orientation\r
+                       {\r
+                               pT->CalcSize();\r
+                               bUpdate = true;\r
+                       }\r
+\r
+                       if((dwPrevStyle & (PANECNT_FLATBORDER | PANECNT_NOBORDER)) != \r
+                          (m_dwExtendedStyle & (PANECNT_FLATBORDER | PANECNT_NOBORDER)))   // change border\r
+                       {\r
+                               bUpdate = true;\r
+                       }\r
+\r
+                       if(bUpdate)\r
+                               pT->UpdateLayout();\r
+               }\r
+               return dwPrevStyle;\r
+       }\r
+\r
+       HWND GetClient() const\r
+       {\r
+               return m_wndClient;\r
+       }\r
+\r
+       HWND SetClient(HWND hWndClient)\r
+       {\r
+               HWND hWndOldClient = m_wndClient;\r
+               m_wndClient = hWndClient;\r
+               if(m_hWnd != NULL)\r
+               {\r
+                       T* pT = static_cast<T*>(this);\r
+                       pT->UpdateLayout();\r
+               }\r
+               return hWndOldClient;\r
+       }\r
+\r
+       BOOL GetTitle(LPTSTR lpstrTitle, int cchLength) const\r
+       {\r
+               ATLASSERT(lpstrTitle != NULL);\r
+\r
+               errno_t nRet = SecureHelper::strncpy_x(lpstrTitle, cchLength, m_szTitle, _TRUNCATE);\r
+\r
+               return (nRet == 0 || nRet == STRUNCATE);\r
+       }\r
+\r
+       BOOL SetTitle(LPCTSTR lpstrTitle)\r
+       {\r
+               ATLASSERT(lpstrTitle != NULL);\r
+\r
+               errno_t nRet = SecureHelper::strncpy_x(m_szTitle, m_cchTitle, lpstrTitle, _TRUNCATE);\r
+               bool bRet = (nRet == 0 || nRet == STRUNCATE);\r
+               if(bRet && m_hWnd != NULL)\r
+               {\r
+                       T* pT = static_cast<T*>(this);\r
+                       pT->UpdateLayout();\r
+               }\r
+\r
+               return bRet;\r
+       }\r
+\r
+       int GetTitleLength() const\r
+       {\r
+               return lstrlen(m_szTitle);\r
+       }\r
+\r
+// Methods\r
+       HWND Create(HWND hWndParent, LPCTSTR lpstrTitle = NULL, DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,\r
+                       DWORD dwExStyle = 0, UINT nID = 0, LPVOID lpCreateParam = NULL)\r
+       {\r
+               if(lpstrTitle != NULL)\r
+                       SecureHelper::strncpy_x(m_szTitle, m_cchTitle, lpstrTitle, _TRUNCATE);\r
+#if (_MSC_VER >= 1300)\r
+               return ATL::CWindowImpl< T, TBase, TWinTraits >::Create(hWndParent, rcDefault, NULL, dwStyle, dwExStyle, nID, lpCreateParam);\r
+#else // !(_MSC_VER >= 1300)\r
+               typedef ATL::CWindowImpl< T, TBase, TWinTraits >   _baseClass;\r
+               return _baseClass::Create(hWndParent, rcDefault, NULL, dwStyle, dwExStyle, nID, lpCreateParam);\r
+#endif // !(_MSC_VER >= 1300)\r
+       }\r
+\r
+       HWND Create(HWND hWndParent, UINT uTitleID, DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,\r
+                       DWORD dwExStyle = 0, UINT nID = 0, LPVOID lpCreateParam = NULL)\r
+       {\r
+               if(uTitleID != 0U)\r
+                       ::LoadString(ModuleHelper::GetResourceInstance(), uTitleID, m_szTitle, m_cchTitle);\r
+#if (_MSC_VER >= 1300)\r
+               return ATL::CWindowImpl< T, TBase, TWinTraits >::Create(hWndParent, rcDefault, NULL, dwStyle, dwExStyle, nID, lpCreateParam);\r
+#else // !(_MSC_VER >= 1300)\r
+               typedef ATL::CWindowImpl< T, TBase, TWinTraits >   _baseClass;\r
+               return _baseClass::Create(hWndParent, rcDefault, NULL, dwStyle, dwExStyle, nID, lpCreateParam);\r
+#endif // !(_MSC_VER >= 1300)\r
+       }\r
+\r
+       BOOL EnableCloseButton(BOOL bEnable)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               T* pT = static_cast<T*>(this);\r
+               pT;   // avoid level 4 warning\r
+               return (m_tb.m_hWnd != NULL) ? m_tb.EnableButton(pT->m_nCloseBtnID, bEnable) : FALSE;\r
+       }\r
+\r
+       void UpdateLayout()\r
+       {\r
+               RECT rcClient = { 0 };\r
+               GetClientRect(&rcClient);\r
+               T* pT = static_cast<T*>(this);\r
+               pT->UpdateLayout(rcClient.right, rcClient.bottom);\r
+       }\r
+\r
+// Message map and handlers\r
+       BEGIN_MSG_MAP(CPaneContainerImpl)\r
+               MESSAGE_HANDLER(WM_CREATE, OnCreate)\r
+               MESSAGE_HANDLER(WM_SIZE, OnSize)\r
+               MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)\r
+               MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground)\r
+               MESSAGE_HANDLER(WM_PAINT, OnPaint)\r
+#ifndef _WIN32_WCE\r
+               MESSAGE_HANDLER(WM_PRINTCLIENT, OnPaint)\r
+#endif // !_WIN32_WCE\r
+               MESSAGE_HANDLER(WM_NOTIFY, OnNotify)\r
+               MESSAGE_HANDLER(WM_COMMAND, OnCommand)\r
+               FORWARD_NOTIFICATIONS()\r
+       END_MSG_MAP()\r
+\r
+       LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               pT->CalcSize();\r
+\r
+               if((m_dwExtendedStyle & PANECNT_NOCLOSEBUTTON) == 0)\r
+                       pT->CreateCloseButton();\r
+\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnSize(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               pT->UpdateLayout(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnSetFocus(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)\r
+       {\r
+               if(m_wndClient.m_hWnd != NULL)\r
+                       m_wndClient.SetFocus();\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnEraseBackground(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)\r
+       {\r
+               return 1;   // no background needed\r
+       }\r
+\r
+       LRESULT OnPaint(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               if(wParam != NULL)\r
+               {\r
+                       pT->DrawPaneTitle((HDC)wParam);\r
+\r
+                       if(m_wndClient.m_hWnd == NULL)   // no client window\r
+                               pT->DrawPane((HDC)wParam);\r
+               }\r
+               else\r
+               {\r
+                       CPaintDC dc(m_hWnd);\r
+                       pT->DrawPaneTitle(dc.m_hDC);\r
+\r
+                       if(m_wndClient.m_hWnd == NULL)   // no client window\r
+                               pT->DrawPane(dc.m_hDC);\r
+               }\r
+\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnNotify(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled)\r
+       {\r
+               if(m_tb.m_hWnd == NULL)\r
+               {\r
+                       bHandled = FALSE;\r
+                       return 1;\r
+               }\r
+\r
+               T* pT = static_cast<T*>(this);\r
+               pT;\r
+               LPNMHDR lpnmh = (LPNMHDR)lParam;\r
+               LRESULT lRet = 0;\r
+\r
+               // pass toolbar custom draw notifications to the base class\r
+               if(lpnmh->code == NM_CUSTOMDRAW && lpnmh->hwndFrom == m_tb.m_hWnd)\r
+                       lRet = CCustomDraw< T >::OnCustomDraw(0, lpnmh, bHandled);\r
+#ifndef _WIN32_WCE\r
+               // tooltip notifications come with the tooltip window handle and button ID,\r
+               // pass them to the parent if we don't handle them\r
+               else if(lpnmh->code == TTN_GETDISPINFO && lpnmh->idFrom == pT->m_nCloseBtnID)\r
+                       bHandled = pT->GetToolTipText(lpnmh);\r
+#endif // !_WIN32_WCE\r
+               // only let notifications not from the toolbar go to the parent\r
+               else if(lpnmh->hwndFrom != m_tb.m_hWnd && lpnmh->idFrom != pT->m_nCloseBtnID)\r
+                       bHandled = FALSE;\r
+\r
+               return lRet;\r
+       }\r
+\r
+       LRESULT OnCommand(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled)\r
+       {\r
+               // if command comes from the close button, substitute HWND of the pane container instead\r
+               if(m_tb.m_hWnd != NULL && (HWND)lParam == m_tb.m_hWnd)\r
+                       return ::SendMessage(GetParent(), WM_COMMAND, wParam, (LPARAM)m_hWnd);\r
+\r
+               bHandled = FALSE;\r
+               return 1;\r
+       }\r
+\r
+// Custom draw overrides\r
+       DWORD OnPrePaint(int /*idCtrl*/, LPNMCUSTOMDRAW /*lpNMCustomDraw*/)\r
+       {\r
+               return CDRF_NOTIFYITEMDRAW;   // we need per-item notifications\r
+       }\r
+\r
+       DWORD OnItemPrePaint(int /*idCtrl*/, LPNMCUSTOMDRAW lpNMCustomDraw)\r
+       {\r
+               CDCHandle dc = lpNMCustomDraw->hdc;\r
+#if (_WIN32_IE >= 0x0400)\r
+               RECT& rc = lpNMCustomDraw->rc;\r
+#else // !(_WIN32_IE >= 0x0400)\r
+               RECT rc;\r
+               m_tb.GetItemRect(0, &rc);\r
+#endif // !(_WIN32_IE >= 0x0400)\r
+\r
+               dc.FillRect(&rc, COLOR_3DFACE);\r
+\r
+               return CDRF_NOTIFYPOSTPAINT;\r
+       }\r
+\r
+       DWORD OnItemPostPaint(int /*idCtrl*/, LPNMCUSTOMDRAW lpNMCustomDraw)\r
+       {\r
+               CDCHandle dc = lpNMCustomDraw->hdc;\r
+#if (_WIN32_IE >= 0x0400)\r
+               RECT& rc = lpNMCustomDraw->rc;\r
+#else // !(_WIN32_IE >= 0x0400)\r
+               RECT rc = { 0 };\r
+               m_tb.GetItemRect(0, &rc);\r
+#endif // !(_WIN32_IE >= 0x0400)\r
+\r
+               RECT rcImage = { m_xBtnImageLeft, m_yBtnImageTop, m_xBtnImageRight + 1, m_yBtnImageBottom + 1 };\r
+               ::OffsetRect(&rcImage, rc.left, rc.top);\r
+               T* pT = static_cast<T*>(this);\r
+\r
+               if((lpNMCustomDraw->uItemState & CDIS_DISABLED) != 0)\r
+               {\r
+                       RECT rcShadow = rcImage;\r
+                       ::OffsetRect(&rcShadow, 1, 1);\r
+                       CPen pen1;\r
+                       pen1.CreatePen(PS_SOLID, 0, ::GetSysColor(COLOR_3DHILIGHT));\r
+                       pT->DrawButtonImage(dc, rcShadow, pen1);\r
+                       CPen pen2;\r
+                       pen2.CreatePen(PS_SOLID, 0, ::GetSysColor(COLOR_3DSHADOW));\r
+                       pT->DrawButtonImage(dc, rcImage, pen2);\r
+               }\r
+               else\r
+               {\r
+                       if((lpNMCustomDraw->uItemState & CDIS_SELECTED) != 0)\r
+                               ::OffsetRect(&rcImage, 1, 1);\r
+                       CPen pen;\r
+                       pen.CreatePen(PS_SOLID, 0, ::GetSysColor(COLOR_BTNTEXT));\r
+                       pT->DrawButtonImage(dc, rcImage, pen);\r
+               }\r
+\r
+               return CDRF_DODEFAULT;   // continue with the default item painting\r
+       }\r
+\r
+// Implementation - overrideable methods\r
+       void UpdateLayout(int cxWidth, int cyHeight)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               RECT rect = { 0 };\r
+\r
+               if(IsVertical())\r
+               {\r
+                       ::SetRect(&rect, 0, 0, m_cxyHeader, cyHeight);\r
+                       if(m_tb.m_hWnd != NULL)\r
+                               m_tb.SetWindowPos(NULL, m_cxyBorder, m_cxyBorder + m_cxyBtnOffset, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE);\r
+\r
+                       if(m_wndClient.m_hWnd != NULL)\r
+                               m_wndClient.SetWindowPos(NULL, m_cxyHeader, 0, cxWidth - m_cxyHeader, cyHeight, SWP_NOZORDER);\r
+                       else\r
+                               rect.right = cxWidth;\r
+               }\r
+               else\r
+               {\r
+                       ::SetRect(&rect, 0, 0, cxWidth, m_cxyHeader);\r
+                       if(m_tb.m_hWnd != NULL)\r
+                               m_tb.SetWindowPos(NULL, rect.right - m_cxToolBar, m_cxyBorder + m_cxyBtnOffset, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE);\r
+\r
+                       if(m_wndClient.m_hWnd != NULL)\r
+                               m_wndClient.SetWindowPos(NULL, 0, m_cxyHeader, cxWidth, cyHeight - m_cxyHeader, SWP_NOZORDER);\r
+                       else\r
+                               rect.bottom = cyHeight;\r
+               }\r
+\r
+               InvalidateRect(&rect);\r
+       }\r
+\r
+       void CreateCloseButton()\r
+       {\r
+               ATLASSERT(m_tb.m_hWnd == NULL);\r
+               // create toolbar for the "x" button\r
+               m_tb.Create(m_hWnd, rcDefault, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | CCS_NODIVIDER | CCS_NORESIZE | CCS_NOPARENTALIGN | CCS_NOMOVEY | TBSTYLE_TOOLTIPS | TBSTYLE_FLAT, 0);\r
+               ATLASSERT(m_tb.IsWindow());\r
+\r
+               if(m_tb.m_hWnd != NULL)\r
+               {\r
+                       T* pT = static_cast<T*>(this);\r
+                       pT;   // avoid level 4 warning\r
+\r
+                       m_tb.SetButtonStructSize();\r
+\r
+                       TBBUTTON tbbtn = { 0 };\r
+                       tbbtn.idCommand = pT->m_nCloseBtnID;\r
+                       tbbtn.fsState = TBSTATE_ENABLED;\r
+                       tbbtn.fsStyle = TBSTYLE_BUTTON;\r
+                       m_tb.AddButtons(1, &tbbtn);\r
+\r
+                       m_tb.SetBitmapSize(m_cxImageTB, m_cyImageTB);\r
+                       m_tb.SetButtonSize(m_cxImageTB + m_cxyBtnAddTB, m_cyImageTB + m_cxyBtnAddTB);\r
+\r
+                       if(IsVertical())\r
+                               m_tb.SetWindowPos(NULL, m_cxyBorder + m_cxyBtnOffset, m_cxyBorder + m_cxyBtnOffset, m_cxImageTB + m_cxyBtnAddTB, m_cyImageTB + m_cxyBtnAddTB, SWP_NOZORDER | SWP_NOACTIVATE);\r
+                       else\r
+                               m_tb.SetWindowPos(NULL, 0, 0, m_cxImageTB + m_cxyBtnAddTB, m_cyImageTB + m_cxyBtnAddTB, SWP_NOZORDER | SWP_NOMOVE | SWP_NOACTIVATE);\r
+               }\r
+       }\r
+\r
+       void DestroyCloseButton()\r
+       {\r
+               if(m_tb.m_hWnd != NULL)\r
+                       m_tb.DestroyWindow();\r
+       }\r
+\r
+       void CalcSize()\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               CFontHandle font = pT->GetTitleFont();\r
+               LOGFONT lf = { 0 };\r
+               font.GetLogFont(lf);\r
+               if(IsVertical())\r
+               {\r
+                       m_cxyHeader = m_cxImageTB + m_cxyBtnAddTB + m_cxyBorder;\r
+               }\r
+               else\r
+               {\r
+                       int cyFont = abs(lf.lfHeight) + m_cxyBorder + 2 * m_cxyTextOffset;\r
+                       int cyBtn = m_cyImageTB + m_cxyBtnAddTB + m_cxyBorder + 2 * m_cxyBtnOffset;\r
+                       m_cxyHeader = max(cyFont, cyBtn);\r
+               }\r
+       }\r
+\r
+       HFONT GetTitleFont() const\r
+       {\r
+               return AtlGetDefaultGuiFont();\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       BOOL GetToolTipText(LPNMHDR /*lpnmh*/)\r
+       {\r
+               return FALSE;\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       void DrawPaneTitle(CDCHandle dc)\r
+       {\r
+               RECT rect = { 0 };\r
+               GetClientRect(&rect);\r
+\r
+               UINT uBorder = BF_LEFT | BF_TOP | BF_ADJUST;\r
+               if(IsVertical())\r
+               {\r
+                       rect.right = rect.left + m_cxyHeader;\r
+                       uBorder |= BF_BOTTOM;\r
+               }\r
+               else\r
+               {\r
+                       rect.bottom = rect.top + m_cxyHeader;\r
+                       uBorder |= BF_RIGHT;\r
+               }\r
+\r
+               if((m_dwExtendedStyle & PANECNT_NOBORDER) == 0)\r
+               {\r
+                       if((m_dwExtendedStyle & PANECNT_FLATBORDER) != 0)\r
+                               uBorder |= BF_FLAT;\r
+                       dc.DrawEdge(&rect, EDGE_ETCHED, uBorder);\r
+               }\r
+               dc.FillRect(&rect, COLOR_3DFACE);\r
+\r
+               if(!IsVertical())   // draw title only for horizontal pane container\r
+               {\r
+                       dc.SetTextColor(::GetSysColor(COLOR_WINDOWTEXT));\r
+                       dc.SetBkMode(TRANSPARENT);\r
+                       T* pT = static_cast<T*>(this);\r
+                       HFONT hFontOld = dc.SelectFont(pT->GetTitleFont());\r
+                       rect.left += m_cxyTextOffset;\r
+                       rect.right -= m_cxyTextOffset;\r
+                       if(m_tb.m_hWnd != NULL)\r
+                               rect.right -= m_cxToolBar;;\r
+#ifndef _WIN32_WCE\r
+                       dc.DrawText(m_szTitle, -1, &rect, DT_LEFT | DT_SINGLELINE | DT_VCENTER | DT_END_ELLIPSIS);\r
+#else // CE specific\r
+                       dc.DrawText(m_szTitle, -1, &rect, DT_LEFT | DT_SINGLELINE | DT_VCENTER);\r
+#endif // _WIN32_WCE\r
+                       dc.SelectFont(hFontOld);\r
+               }\r
+       }\r
+\r
+       // called only if pane is empty\r
+       void DrawPane(CDCHandle dc)\r
+       {\r
+               RECT rect = { 0 };\r
+               GetClientRect(&rect);\r
+               if(IsVertical())\r
+                       rect.left += m_cxyHeader;\r
+               else\r
+                       rect.top += m_cxyHeader;\r
+               if((GetExStyle() & WS_EX_CLIENTEDGE) == 0)\r
+                       dc.DrawEdge(&rect, EDGE_SUNKEN, BF_RECT | BF_ADJUST);\r
+               dc.FillRect(&rect, COLOR_APPWORKSPACE);\r
+       }\r
+\r
+       // drawing helper - draws "x" button image\r
+       void DrawButtonImage(CDCHandle dc, RECT& rcImage, HPEN hPen)\r
+       {\r
+#if !defined(_WIN32_WCE) || (_WIN32_WCE >= 400)\r
+               HPEN hPenOld = dc.SelectPen(hPen);\r
+\r
+               dc.MoveTo(rcImage.left, rcImage.top);\r
+               dc.LineTo(rcImage.right, rcImage.bottom);\r
+               dc.MoveTo(rcImage.left + 1, rcImage.top);\r
+               dc.LineTo(rcImage.right + 1, rcImage.bottom);\r
+\r
+               dc.MoveTo(rcImage.left, rcImage.bottom - 1);\r
+               dc.LineTo(rcImage.right, rcImage.top - 1);\r
+               dc.MoveTo(rcImage.left + 1, rcImage.bottom - 1);\r
+               dc.LineTo(rcImage.right + 1, rcImage.top - 1);\r
+\r
+               dc.SelectPen(hPenOld);\r
+#else // (_WIN32_WCE < 400)\r
+               rcImage;\r
+               hPen;\r
+               // no support for the "x" button image\r
+#endif // (_WIN32_WCE < 400)\r
+       }\r
+\r
+       bool IsVertical() const\r
+       {\r
+               return ((m_dwExtendedStyle & PANECNT_VERTICAL) != 0);\r
+       }\r
+};\r
+\r
+class CPaneContainer : public CPaneContainerImpl<CPaneContainer>\r
+{\r
+public:\r
+       DECLARE_WND_CLASS_EX(_T("WTL_PaneContainer"), 0, -1)\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CSortListViewCtrl - implements sorting for a listview control\r
+\r
+// sort listview extended styles\r
+#define SORTLV_USESHELLBITMAPS 0x00000001\r
+\r
+// Notification sent to parent when sort column is changed by user clicking header.  \r
+#define SLVN_SORTCHANGED       LVN_LAST\r
+\r
+// A LPNMSORTLISTVIEW is sent with the SLVN_SORTCHANGED notification\r
+typedef struct tagNMSORTLISTVIEW\r
+{\r
+    NMHDR hdr;\r
+    int iNewSortColumn;\r
+    int iOldSortColumn;\r
+} NMSORTLISTVIEW, *LPNMSORTLISTVIEW;\r
+\r
+// Column sort types. Can be set on a per-column basis with the SetColumnSortType method.\r
+enum\r
+{\r
+       LVCOLSORT_NONE,\r
+       LVCOLSORT_TEXT,   // default\r
+       LVCOLSORT_TEXTNOCASE,\r
+       LVCOLSORT_LONG,\r
+       LVCOLSORT_DOUBLE,\r
+       LVCOLSORT_DECIMAL,\r
+       LVCOLSORT_DATETIME,\r
+       LVCOLSORT_DATE,\r
+       LVCOLSORT_TIME,\r
+       LVCOLSORT_CUSTOM,\r
+       LVCOLSORT_LAST = LVCOLSORT_CUSTOM\r
+};\r
+\r
+\r
+template <class T>\r
+class CSortListViewImpl\r
+{\r
+public:\r
+       enum\r
+       {\r
+               m_cchCmpTextMax = 32, // overrideable\r
+               m_cxSortImage = 16,\r
+               m_cySortImage = 15,\r
+               m_cxSortArrow = 11,\r
+               m_cySortArrow = 6,\r
+               m_iSortUp = 0,        // index of sort bitmaps\r
+               m_iSortDown = 1,\r
+               m_nShellSortUpID = 133\r
+       };\r
+\r
+       // passed to LVCompare functions as lParam1 and lParam2 \r
+       struct LVCompareParam\r
+       {\r
+               int iItem;\r
+               DWORD_PTR dwItemData;\r
+               union\r
+               {\r
+                       long lValue;\r
+                       double dblValue;\r
+                       DECIMAL decValue;\r
+                       LPCTSTR pszValue;\r
+               };\r
+       };\r
+       \r
+       // passed to LVCompare functions as the lParamSort parameter\r
+       struct LVSortInfo\r
+       {\r
+               T* pT;\r
+               int iSortCol;\r
+               bool bDescending;\r
+       };\r
+\r
+       bool m_bSortDescending;\r
+       bool m_bCommCtrl6;\r
+       int m_iSortColumn;\r
+       CBitmap m_bmSort[2];\r
+       int m_fmtOldSortCol;\r
+       HBITMAP m_hbmOldSortCol;\r
+       DWORD m_dwSortLVExtendedStyle;\r
+       ATL::CSimpleArray<WORD> m_arrColSortType;\r
+       bool m_bUseWaitCursor;\r
+       \r
+       CSortListViewImpl() :\r
+                       m_bSortDescending(false),\r
+                       m_bCommCtrl6(false),\r
+                       m_iSortColumn(-1), \r
+                       m_fmtOldSortCol(0),\r
+                       m_hbmOldSortCol(NULL),\r
+                       m_dwSortLVExtendedStyle(SORTLV_USESHELLBITMAPS),\r
+                       m_bUseWaitCursor(true)\r
+       {\r
+#ifndef _WIN32_WCE\r
+               DWORD dwMajor = 0;\r
+               DWORD dwMinor = 0;\r
+               HRESULT hRet = ATL::AtlGetCommCtrlVersion(&dwMajor, &dwMinor);\r
+               m_bCommCtrl6 = SUCCEEDED(hRet) && dwMajor >= 6;\r
+#endif // !_WIN32_WCE\r
+       }\r
+       \r
+// Attributes\r
+       void SetSortColumn(int iCol)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(::IsWindow(pT->m_hWnd));\r
+               CHeaderCtrl header = pT->GetHeader();\r
+               ATLASSERT(header.m_hWnd != NULL);\r
+               ATLASSERT(iCol >= -1 && iCol < m_arrColSortType.GetSize());\r
+\r
+               int iOldSortCol = m_iSortColumn;\r
+               m_iSortColumn = iCol;\r
+               if(m_bCommCtrl6)\r
+               {\r
+#ifndef HDF_SORTUP\r
+                       const int HDF_SORTUP = 0x0400;  \r
+#endif // HDF_SORTUP\r
+#ifndef HDF_SORTDOWN\r
+                       const int HDF_SORTDOWN = 0x0200;        \r
+#endif // HDF_SORTDOWN\r
+                       const int nMask = HDF_SORTUP | HDF_SORTDOWN;\r
+                       HDITEM hditem = { HDI_FORMAT };\r
+                       if(iOldSortCol != iCol && iOldSortCol >= 0 && header.GetItem(iOldSortCol, &hditem))\r
+                       {\r
+                               hditem.fmt &= ~nMask;\r
+                               header.SetItem(iOldSortCol, &hditem);\r
+                       }\r
+                       if(iCol >= 0 && header.GetItem(iCol, &hditem))\r
+                       {\r
+                               hditem.fmt &= ~nMask;\r
+                               hditem.fmt |= m_bSortDescending ? HDF_SORTDOWN : HDF_SORTUP;\r
+                               header.SetItem(iCol, &hditem);\r
+                       }\r
+                       return;\r
+               }\r
+\r
+               if(m_bmSort[m_iSortUp].IsNull())\r
+                       pT->CreateSortBitmaps();\r
+\r
+               // restore previous sort column's bitmap, if any, and format\r
+               HDITEM hditem = { HDI_BITMAP | HDI_FORMAT };\r
+               if(iOldSortCol != iCol && iOldSortCol >= 0)\r
+               {\r
+                       hditem.hbm = m_hbmOldSortCol;\r
+                       hditem.fmt = m_fmtOldSortCol;\r
+                       header.SetItem(iOldSortCol, &hditem);\r
+               }\r
+\r
+               // save new sort column's bitmap and format, and add our sort bitmap\r
+               if(iCol >= 0 && header.GetItem(iCol, &hditem))\r
+               {\r
+                       if(iOldSortCol != iCol)\r
+                       {\r
+                               m_fmtOldSortCol = hditem.fmt;\r
+                               m_hbmOldSortCol = hditem.hbm;\r
+                       }\r
+                       hditem.fmt &= ~HDF_IMAGE;\r
+                       hditem.fmt |= HDF_BITMAP | HDF_BITMAP_ON_RIGHT;\r
+                       int i = m_bSortDescending ? m_iSortDown : m_iSortUp;\r
+                       hditem.hbm = m_bmSort[i];\r
+                       header.SetItem(iCol, &hditem);\r
+               }\r
+       }\r
+\r
+       int GetSortColumn() const\r
+       {\r
+               return m_iSortColumn;\r
+       }\r
+\r
+       void SetColumnSortType(int iCol, WORD wType)\r
+       {\r
+               ATLASSERT(iCol >= 0 && iCol < m_arrColSortType.GetSize());\r
+               ATLASSERT(wType >= LVCOLSORT_NONE && wType <= LVCOLSORT_LAST);\r
+               m_arrColSortType[iCol] = wType;\r
+       }\r
+\r
+       WORD GetColumnSortType(int iCol) const\r
+       {\r
+               ATLASSERT((iCol >= 0) && iCol < m_arrColSortType.GetSize());\r
+               return m_arrColSortType[iCol];\r
+       }\r
+\r
+       int GetColumnCount() const\r
+       {\r
+               const T* pT = static_cast<const T*>(this);\r
+               ATLASSERT(::IsWindow(pT->m_hWnd));\r
+               CHeaderCtrl header = pT->GetHeader();\r
+               return header.m_hWnd != NULL ? header.GetItemCount() : 0;\r
+       }\r
+\r
+       bool IsSortDescending() const\r
+       {\r
+               return m_bSortDescending;\r
+       }\r
+\r
+       DWORD GetSortListViewExtendedStyle() const\r
+       {\r
+               return m_dwSortLVExtendedStyle;\r
+       }\r
+\r
+       DWORD SetSortListViewExtendedStyle(DWORD dwExtendedStyle, DWORD dwMask = 0)\r
+       {\r
+               DWORD dwPrevStyle = m_dwSortLVExtendedStyle;\r
+               if(dwMask == 0)\r
+                       m_dwSortLVExtendedStyle = dwExtendedStyle;\r
+               else\r
+                       m_dwSortLVExtendedStyle = (m_dwSortLVExtendedStyle & ~dwMask) | (dwExtendedStyle & dwMask);\r
+               return dwPrevStyle;\r
+       }\r
+\r
+// Operations\r
+       bool DoSortItems(int iCol, bool bDescending = false)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(::IsWindow(pT->m_hWnd));\r
+               ATLASSERT(iCol >= 0 && iCol < m_arrColSortType.GetSize());\r
+\r
+               WORD wType = m_arrColSortType[iCol];\r
+               if(wType == LVCOLSORT_NONE)\r
+                       return false;\r
+\r
+               int nCount = pT->GetItemCount();\r
+               if(nCount < 2)\r
+               {\r
+                       m_bSortDescending = bDescending;\r
+                       SetSortColumn(iCol);\r
+                       return true;\r
+               }\r
+\r
+               CWaitCursor waitCursor(false);\r
+               if(m_bUseWaitCursor)\r
+                       waitCursor.Set();\r
+\r
+               LVCompareParam* pParam = NULL;\r
+               ATLTRY(pParam = new LVCompareParam[nCount]);\r
+               PFNLVCOMPARE pFunc = NULL;\r
+               TCHAR pszTemp[pT->m_cchCmpTextMax];\r
+               bool bStrValue = false;\r
+\r
+               switch(wType)\r
+               {\r
+               case LVCOLSORT_TEXT:\r
+                       pFunc = (PFNLVCOMPARE)pT->LVCompareText;\r
+               case LVCOLSORT_TEXTNOCASE:\r
+                       if(pFunc == NULL)\r
+                               pFunc = (PFNLVCOMPARE)pT->LVCompareTextNoCase;\r
+               case LVCOLSORT_CUSTOM:\r
+                       {\r
+                               if(pFunc == NULL)\r
+                                       pFunc = (PFNLVCOMPARE)pT->LVCompareCustom;\r
+\r
+                               for(int i = 0; i < nCount; i++)\r
+                               {\r
+                                       pParam[i].iItem = i;\r
+                                       pParam[i].dwItemData = pT->GetItemData(i);\r
+                                       pParam[i].pszValue = new TCHAR[pT->m_cchCmpTextMax];\r
+                                       pT->GetItemText(i, iCol, (LPTSTR)pParam[i].pszValue, pT->m_cchCmpTextMax);\r
+                                       pT->SetItemData(i, (DWORD_PTR)&pParam[i]);\r
+                               }\r
+                               bStrValue = true;\r
+                       }\r
+                       break;\r
+               case LVCOLSORT_LONG:\r
+                       {\r
+                               pFunc = (PFNLVCOMPARE)pT->LVCompareLong;\r
+                               for(int i = 0; i < nCount; i++)\r
+                               {\r
+                                       pParam[i].iItem = i;\r
+                                       pParam[i].dwItemData = pT->GetItemData(i);\r
+                                       pT->GetItemText(i, iCol, pszTemp, pT->m_cchCmpTextMax);\r
+                                       pParam[i].lValue = pT->StrToLong(pszTemp);\r
+                                       pT->SetItemData(i, (DWORD_PTR)&pParam[i]);\r
+                               }\r
+                       }\r
+                       break;\r
+               case LVCOLSORT_DOUBLE:\r
+                       {\r
+                               pFunc = (PFNLVCOMPARE)pT->LVCompareDouble;\r
+                               for(int i = 0; i < nCount; i++)\r
+                               {\r
+                                       pParam[i].iItem = i;\r
+                                       pParam[i].dwItemData = pT->GetItemData(i);\r
+                                       pT->GetItemText(i, iCol, pszTemp, pT->m_cchCmpTextMax);\r
+                                       pParam[i].dblValue = pT->StrToDouble(pszTemp);\r
+                                       pT->SetItemData(i, (DWORD_PTR)&pParam[i]);\r
+                               }\r
+                       }\r
+                       break;\r
+               case LVCOLSORT_DECIMAL:\r
+                       {\r
+                               pFunc = (PFNLVCOMPARE)pT->LVCompareDecimal;\r
+                               for(int i = 0; i < nCount; i++)\r
+                               {\r
+                                       pParam[i].iItem = i;\r
+                                       pParam[i].dwItemData = pT->GetItemData(i);\r
+                                       pT->GetItemText(i, iCol, pszTemp, pT->m_cchCmpTextMax);\r
+                                       pT->StrToDecimal(pszTemp, &pParam[i].decValue);\r
+                                       pT->SetItemData(i, (DWORD_PTR)&pParam[i]);\r
+                               }\r
+                       }\r
+                       break;\r
+               case LVCOLSORT_DATETIME:\r
+               case LVCOLSORT_DATE:\r
+               case LVCOLSORT_TIME:\r
+                       {\r
+                               pFunc = (PFNLVCOMPARE)pT->LVCompareDouble;\r
+                               DWORD dwFlags = LOCALE_NOUSEROVERRIDE;\r
+                               if(wType == LVCOLSORT_DATE)\r
+                                       dwFlags |= VAR_DATEVALUEONLY;\r
+                               else if(wType == LVCOLSORT_TIME)\r
+                                       dwFlags |= VAR_TIMEVALUEONLY;\r
+                               for(int i = 0; i < nCount; i++)\r
+                               {\r
+                                       pParam[i].iItem = i;\r
+                                       pParam[i].dwItemData = pT->GetItemData(i);\r
+                                       pT->GetItemText(i, iCol, pszTemp, pT->m_cchCmpTextMax);\r
+                                       pParam[i].dblValue = pT->DateStrToDouble(pszTemp, dwFlags);\r
+                                       pT->SetItemData(i, (DWORD_PTR)&pParam[i]);\r
+                               }\r
+                       }\r
+                       break;\r
+               default:\r
+                       ATLTRACE2(atlTraceUI, 0, _T("Unknown value for sort type in CSortListViewImpl::DoSortItems()\n"));\r
+                       break;\r
+               } // switch(wType)\r
+\r
+               ATLASSERT(pFunc != NULL);\r
+               LVSortInfo lvsi = { pT, iCol, bDescending };\r
+               bool bRet = ((BOOL)pT->DefWindowProc(LVM_SORTITEMS, (WPARAM)&lvsi, (LPARAM)pFunc) != FALSE);\r
+               for(int i = 0; i < nCount; i++)\r
+               {\r
+                       DWORD_PTR dwItemData = pT->GetItemData(i);\r
+                       LVCompareParam* p = (LVCompareParam*)dwItemData;\r
+                       ATLASSERT(p != NULL);\r
+                       if(bStrValue)\r
+                               delete [] (TCHAR*)p->pszValue;\r
+                       pT->SetItemData(i, p->dwItemData);\r
+               }\r
+               delete [] pParam;\r
+\r
+               if(bRet)\r
+               {\r
+                       m_bSortDescending = bDescending;\r
+                       SetSortColumn(iCol);\r
+               }\r
+\r
+               if(m_bUseWaitCursor)\r
+                       waitCursor.Restore();\r
+\r
+               return bRet;\r
+       }\r
+\r
+       void CreateSortBitmaps()\r
+       {\r
+               if((m_dwSortLVExtendedStyle & SORTLV_USESHELLBITMAPS) != 0)\r
+               {\r
+                       bool bFree = false;\r
+                       LPCTSTR pszModule = _T("shell32.dll"); \r
+                       HINSTANCE hShell = ::GetModuleHandle(pszModule);\r
+\r
+                       if (hShell == NULL)             \r
+                       {\r
+                               hShell = ::LoadLibrary(pszModule);\r
+                               bFree = true;\r
+                       }\r
\r
+                       if (hShell != NULL)\r
+                       {\r
+                               bool bSuccess = true;\r
+                               for(int i = m_iSortUp; i <= m_iSortDown; i++)\r
+                               {\r
+                                       if(!m_bmSort[i].IsNull())\r
+                                               m_bmSort[i].DeleteObject();\r
+                                       m_bmSort[i] = (HBITMAP)::LoadImage(hShell, MAKEINTRESOURCE(m_nShellSortUpID + i), \r
+#ifndef _WIN32_WCE\r
+                                               IMAGE_BITMAP, 0, 0, LR_LOADMAP3DCOLORS);\r
+#else // CE specific\r
+                                               IMAGE_BITMAP, 0, 0, 0);\r
+#endif // _WIN32_WCE\r
+                                       if(m_bmSort[i].IsNull())\r
+                                       {\r
+                                               bSuccess = false;\r
+                                               break;\r
+                                       }\r
+                               }\r
+                               if(bFree)\r
+                                       ::FreeLibrary(hShell);\r
+                               if(bSuccess)\r
+                                       return;\r
+                       }\r
+               }\r
+\r
+               T* pT = static_cast<T*>(this);\r
+               for(int i = m_iSortUp; i <= m_iSortDown; i++)\r
+               {\r
+                       if(!m_bmSort[i].IsNull())\r
+                               m_bmSort[i].DeleteObject();\r
+\r
+                       CDC dcMem;\r
+                       CClientDC dc(::GetDesktopWindow());\r
+                       dcMem.CreateCompatibleDC(dc.m_hDC);\r
+                       m_bmSort[i].CreateCompatibleBitmap(dc.m_hDC, m_cxSortImage, m_cySortImage);\r
+                       HBITMAP hbmOld = dcMem.SelectBitmap(m_bmSort[i]);\r
+                       RECT rc = {0,0,m_cxSortImage, m_cySortImage};\r
+                       pT->DrawSortBitmap(dcMem.m_hDC, i, &rc);\r
+                       dcMem.SelectBitmap(hbmOld);\r
+                       dcMem.DeleteDC();\r
+               }\r
+       }\r
+\r
+       void NotifyParentSortChanged(int iNewSortCol, int iOldSortCol)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               int nID = pT->GetDlgCtrlID();\r
+               NMSORTLISTVIEW nm = { { pT->m_hWnd, nID, SLVN_SORTCHANGED }, iNewSortCol, iOldSortCol };\r
+               ::SendMessage(pT->GetParent(), WM_NOTIFY, (WPARAM)nID, (LPARAM)&nm);\r
+       }\r
+\r
+// Overrideables\r
+       int CompareItemsCustom(LVCompareParam* /*pItem1*/, LVCompareParam* /*pItem2*/, int /*iSortCol*/)\r
+       {\r
+               // pItem1 and pItem2 contain valid iItem, dwItemData, and pszValue members.\r
+               // If item1 > item2 return 1, if item1 < item2 return -1, else return 0.\r
+               return 0;\r
+       }\r
+\r
+       void DrawSortBitmap(CDCHandle dc, int iBitmap, LPRECT prc)\r
+       {\r
+               dc.FillRect(prc, ::GetSysColorBrush(COLOR_BTNFACE));    \r
+               HBRUSH hbrOld = dc.SelectBrush(::GetSysColorBrush(COLOR_BTNSHADOW));\r
+               CPen pen;\r
+               pen.CreatePen(PS_SOLID, 0, ::GetSysColor(COLOR_BTNSHADOW));\r
+               HPEN hpenOld = dc.SelectPen(pen);\r
+               POINT ptOrg = { (m_cxSortImage - m_cxSortArrow) / 2, (m_cySortImage - m_cySortArrow) / 2 };\r
+               if(iBitmap == m_iSortUp)\r
+               {\r
+                       POINT pts[3] = \r
+                       {\r
+                               { ptOrg.x + m_cxSortArrow / 2, ptOrg.y },\r
+                               { ptOrg.x, ptOrg.y + m_cySortArrow - 1 }, \r
+                               { ptOrg.x + m_cxSortArrow - 1, ptOrg.y + m_cySortArrow - 1 }\r
+                       };\r
+                       dc.Polygon(pts, 3);\r
+               }\r
+               else\r
+               {\r
+                       POINT pts[3] = \r
+                       {\r
+                               { ptOrg.x, ptOrg.y },\r
+                               { ptOrg.x + m_cxSortArrow / 2, ptOrg.y + m_cySortArrow - 1 },\r
+                               { ptOrg.x + m_cxSortArrow - 1, ptOrg.y }\r
+                       };\r
+                       dc.Polygon(pts, 3);\r
+               }\r
+               dc.SelectBrush(hbrOld);\r
+               dc.SelectPen(hpenOld);\r
+       }\r
+\r
+       double DateStrToDouble(LPCTSTR lpstr, DWORD dwFlags)\r
+       {\r
+               ATLASSERT(lpstr != NULL);\r
+               if(lpstr == NULL || lpstr[0] == _T('\0'))\r
+                       return 0;\r
+\r
+               USES_CONVERSION;\r
+               HRESULT hRet = E_FAIL;\r
+               DATE dRet = 0;\r
+               if (FAILED(hRet = ::VarDateFromStr((LPOLESTR)T2COLE(lpstr), LANG_USER_DEFAULT, dwFlags, &dRet)))\r
+               {\r
+                       ATLTRACE2(atlTraceUI, 0, _T("VarDateFromStr failed with result of 0x%8.8X\n"), hRet);\r
+                       dRet = 0;\r
+               }\r
+               return dRet;\r
+       }\r
+\r
+       long StrToLong(LPCTSTR lpstr)\r
+       {\r
+               ATLASSERT(lpstr != NULL);\r
+               if(lpstr == NULL || lpstr[0] == _T('\0'))\r
+                       return 0;\r
+               \r
+               USES_CONVERSION;\r
+               HRESULT hRet = E_FAIL;\r
+               long lRet = 0;\r
+               if (FAILED(hRet = ::VarI4FromStr((LPOLESTR)T2COLE(lpstr), LANG_USER_DEFAULT, LOCALE_NOUSEROVERRIDE, &lRet)))\r
+               {\r
+                       ATLTRACE2(atlTraceUI, 0, _T("VarI4FromStr failed with result of 0x%8.8X\n"), hRet);\r
+                       lRet = 0;\r
+               }\r
+               return lRet;\r
+       }\r
+\r
+       double StrToDouble(LPCTSTR lpstr)\r
+       {\r
+               ATLASSERT(lpstr != NULL);\r
+               if(lpstr == NULL || lpstr[0] == _T('\0'))\r
+                       return 0;\r
+\r
+               USES_CONVERSION;\r
+               HRESULT hRet = E_FAIL;\r
+               double dblRet = 0;\r
+               if (FAILED(hRet = ::VarR8FromStr((LPOLESTR)T2COLE(lpstr), LANG_USER_DEFAULT, LOCALE_NOUSEROVERRIDE, &dblRet)))\r
+               {\r
+                       ATLTRACE2(atlTraceUI, 0, _T("VarR8FromStr failed with result of 0x%8.8X\n"), hRet);\r
+                       dblRet = 0;\r
+               }\r
+               return dblRet;\r
+       }\r
+\r
+       bool StrToDecimal(LPCTSTR lpstr, DECIMAL* pDecimal)\r
+       {\r
+               ATLASSERT(lpstr != NULL);\r
+               ATLASSERT(pDecimal != NULL);\r
+               if(lpstr == NULL || pDecimal == NULL)\r
+                       return false;\r
+\r
+               USES_CONVERSION;\r
+               HRESULT hRet = E_FAIL;\r
+               if (FAILED(hRet = ::VarDecFromStr((LPOLESTR)T2COLE(lpstr), LANG_USER_DEFAULT, LOCALE_NOUSEROVERRIDE, pDecimal)))\r
+               {\r
+                       ATLTRACE2(atlTraceUI, 0, _T("VarDecFromStr failed with result of 0x%8.8X\n"), hRet);\r
+                       pDecimal->Lo64 = 0;\r
+                       pDecimal->Hi32 = 0;\r
+                       pDecimal->signscale = 0;\r
+                       return false;\r
+               }\r
+               return true;\r
+       }\r
+\r
+// Overrideable PFNLVCOMPARE functions\r
+       static int CALLBACK LVCompareText(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)\r
+       {\r
+               ATLASSERT(lParam1 != NULL && lParam2 != NULL && lParamSort != NULL);\r
+\r
+               LVCompareParam* pParam1 = (LVCompareParam*)lParam1;\r
+               LVCompareParam* pParam2 = (LVCompareParam*)lParam2;\r
+               LVSortInfo* pInfo = (LVSortInfo*)lParamSort;\r
+               \r
+               int nRet = lstrcmp(pParam1->pszValue, pParam2->pszValue);\r
+               return pInfo->bDescending ? -nRet : nRet;\r
+       }\r
+\r
+       static int CALLBACK LVCompareTextNoCase(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)\r
+       {\r
+               ATLASSERT(lParam1 != NULL && lParam2 != NULL && lParamSort != NULL);\r
+\r
+               LVCompareParam* pParam1 = (LVCompareParam*)lParam1;\r
+               LVCompareParam* pParam2 = (LVCompareParam*)lParam2;\r
+               LVSortInfo* pInfo = (LVSortInfo*)lParamSort;\r
+               \r
+               int nRet = lstrcmpi(pParam1->pszValue, pParam2->pszValue);\r
+               return pInfo->bDescending ? -nRet : nRet;\r
+       }\r
+\r
+       static int CALLBACK LVCompareLong(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)\r
+       {\r
+               ATLASSERT(lParam1 != NULL && lParam2 != NULL && lParamSort != NULL);\r
+\r
+               LVCompareParam* pParam1 = (LVCompareParam*)lParam1;\r
+               LVCompareParam* pParam2 = (LVCompareParam*)lParam2;\r
+               LVSortInfo* pInfo = (LVSortInfo*)lParamSort;\r
+               \r
+               int nRet = 0;\r
+               if(pParam1->lValue > pParam2->lValue)\r
+                       nRet = 1;\r
+               else if(pParam1->lValue < pParam2->lValue)\r
+                       nRet = -1;\r
+               return pInfo->bDescending ? -nRet : nRet;\r
+       }\r
+\r
+       static int CALLBACK LVCompareDouble(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)\r
+       {\r
+               ATLASSERT(lParam1 != NULL && lParam2 != NULL && lParamSort != NULL);\r
+\r
+               LVCompareParam* pParam1 = (LVCompareParam*)lParam1;\r
+               LVCompareParam* pParam2 = (LVCompareParam*)lParam2;\r
+               LVSortInfo* pInfo = (LVSortInfo*)lParamSort;\r
+               \r
+               int nRet = 0;\r
+               if(pParam1->dblValue > pParam2->dblValue)\r
+                       nRet = 1;\r
+               else if(pParam1->dblValue < pParam2->dblValue)\r
+                       nRet = -1;\r
+               return pInfo->bDescending ? -nRet : nRet;\r
+       }\r
+\r
+       static int CALLBACK LVCompareCustom(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)\r
+       {\r
+               ATLASSERT(lParam1 != NULL && lParam2 != NULL && lParamSort != NULL);\r
+\r
+               LVCompareParam* pParam1 = (LVCompareParam*)lParam1;\r
+               LVCompareParam* pParam2 = (LVCompareParam*)lParam2;\r
+               LVSortInfo* pInfo = (LVSortInfo*)lParamSort;\r
+               \r
+               int nRet = pInfo->pT->CompareItemsCustom(pParam1, pParam2, pInfo->iSortCol);\r
+               return pInfo->bDescending ? -nRet : nRet;\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       static int CALLBACK LVCompareDecimal(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)\r
+       {\r
+               ATLASSERT(lParam1 != NULL && lParam2 != NULL && lParamSort != NULL);\r
+\r
+               LVCompareParam* pParam1 = (LVCompareParam*)lParam1;\r
+               LVCompareParam* pParam2 = (LVCompareParam*)lParam2;\r
+               LVSortInfo* pInfo = (LVSortInfo*)lParamSort;\r
+               \r
+               int nRet = (int)::VarDecCmp(&pParam1->decValue, &pParam2->decValue);\r
+               nRet--;\r
+               return pInfo->bDescending ? -nRet : nRet;\r
+       }\r
+#else\r
+       // Compare mantissas, ignore sign and scale\r
+       static int CompareMantissas(const DECIMAL& decLeft, const DECIMAL& decRight)\r
+       {\r
+               if (decLeft.Hi32 < decRight.Hi32)\r
+               {\r
+                       return -1;\r
+               }\r
+               if (decLeft.Hi32 > decRight.Hi32)\r
+               {\r
+                       return 1;\r
+               }\r
+               // Here, decLeft.Hi32 == decRight.Hi32\r
+               if (decLeft.Lo64 < decRight.Lo64)\r
+               {\r
+                       return -1;\r
+               }\r
+               if (decLeft.Lo64 > decRight.Lo64)\r
+               {\r
+                       return 1;\r
+               }\r
+               return 0;\r
+       }\r
+\r
+       // return values: VARCMP_LT, VARCMP_EQ, VARCMP_GT, VARCMP_NULL\r
+       static HRESULT VarDecCmp(const DECIMAL* pdecLeft, const DECIMAL* pdecRight)\r
+       {\r
+               static const ULONG powersOfTen[] =\r
+               {\r
+                       10ul,\r
+                       100ul,\r
+                       1000ul,\r
+                       10000ul,\r
+                       100000ul,\r
+                       1000000ul,\r
+                       10000000ul,\r
+                       100000000ul,\r
+                       1000000000ul\r
+               };\r
+               static const int largestPower = sizeof(powersOfTen) / sizeof(powersOfTen[0]);\r
+               if (!pdecLeft || !pdecRight)\r
+               {\r
+                       return VARCMP_NULL;\r
+               }\r
+               \r
+               // Degenerate case - at least one comparand is of the form\r
+               // [+-]0*10^N (denormalized zero)\r
+               bool bLeftZero = (!pdecLeft->Lo64 && !pdecLeft->Hi32);\r
+               bool bRightZero = (!pdecRight->Lo64 && !pdecRight->Hi32);\r
+               if (bLeftZero && bRightZero)\r
+               {\r
+                       return VARCMP_EQ;\r
+               }\r
+               bool bLeftNeg = ((pdecLeft->sign & DECIMAL_NEG) != 0);\r
+               bool bRightNeg = ((pdecRight->sign & DECIMAL_NEG) != 0);\r
+               if (bLeftZero)\r
+               {\r
+                       return (bRightNeg ? VARCMP_GT : VARCMP_LT);\r
+               }\r
+               // This also covers the case where the comparands have different signs\r
+               if (bRightZero || bLeftNeg != bRightNeg)\r
+               {\r
+                       return (bLeftNeg ? VARCMP_LT : VARCMP_GT);\r
+               }\r
+\r
+               // Here both comparands have the same sign and need to be compared\r
+               // on mantissa and scale. The result is obvious when\r
+               // 1. Scales are equal (then compare mantissas)\r
+               // 2. A number with smaller scale is also the one with larger mantissa\r
+               //    (then this number is obviously larger)\r
+               // In the remaining case, we would multiply the number with smaller\r
+               // scale by 10 and simultaneously increment its scale (which amounts to\r
+               // adding trailing zeros after decimal point), until the numbers fall under\r
+               // one of the two cases above\r
+               DECIMAL temp;\r
+               bool bInvert = bLeftNeg; // the final result needs to be inverted\r
+               if (pdecLeft->scale < pdecRight->scale)\r
+               {\r
+                       temp = *pdecLeft;\r
+               }\r
+               else\r
+               {\r
+                       temp = *pdecRight;\r
+                       pdecRight = pdecLeft;\r
+                       bInvert = !bInvert;\r
+               }\r
+\r
+               // Now temp is the number with smaller (or equal) scale, and\r
+               // we can modify it freely without touching original parameters\r
+               int comp;\r
+               while ((comp = CompareMantissas(temp, *pdecRight)) < 0 &&\r
+                       temp.scale < pdecRight->scale)\r
+               {\r
+                       // Multiply by an appropriate power of 10\r
+                       int scaleDiff = pdecRight->scale - temp.scale;\r
+                       if (scaleDiff > largestPower)\r
+                       {\r
+                               // Keep the multiplier representable in 32bit\r
+                               scaleDiff = largestPower;\r
+                       }\r
+                       DWORDLONG power = powersOfTen[scaleDiff - 1];\r
+                       // Multiply temp's mantissa by power\r
+                       DWORDLONG product = temp.Lo32 * power;\r
+                       ULONG carry = static_cast<ULONG>(product >> 32);\r
+                       temp.Lo32  = static_cast<ULONG>(product);\r
+                       product = temp.Mid32 * power + carry;\r
+                       carry = static_cast<ULONG>(product >> 32);\r
+                       temp.Mid32 = static_cast<ULONG>(product);\r
+                       product = temp.Hi32 * power + carry;\r
+                       if (static_cast<ULONG>(product >> 32))\r
+                       {\r
+                               // Multiplication overflowed - pdecLeft is clearly larger\r
+                               break;\r
+                       }\r
+                       temp.Hi32 = static_cast<ULONG>(product);\r
+                       temp.scale = (BYTE)(temp.scale + scaleDiff);\r
+               }\r
+               if (temp.scale < pdecRight->scale)\r
+               {\r
+                       comp = 1;\r
+               }\r
+               if (bInvert)\r
+               {\r
+                       comp = -comp;\r
+               }\r
+               return (comp > 0 ? VARCMP_GT : comp < 0 ? VARCMP_LT : VARCMP_EQ);\r
+       }\r
+\r
+       static int CALLBACK LVCompareDecimal(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)\r
+       {\r
+               ATLASSERT(lParam1 != NULL && lParam2 != NULL && lParamSort != NULL);\r
+\r
+               LVCompareParam* pParam1 = (LVCompareParam*)lParam1;\r
+               LVCompareParam* pParam2 = (LVCompareParam*)lParam2;\r
+               LVSortInfo* pInfo = (LVSortInfo*)lParamSort;\r
+               \r
+               int nRet = (int)VarDecCmp(&pParam1->decValue, &pParam2->decValue);\r
+               nRet--;\r
+               return pInfo->bDescending ? -nRet : nRet;\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       BEGIN_MSG_MAP(CSortListViewImpl)\r
+               MESSAGE_HANDLER(LVM_INSERTCOLUMN, OnInsertColumn)\r
+               MESSAGE_HANDLER(LVM_DELETECOLUMN, OnDeleteColumn)\r
+               NOTIFY_CODE_HANDLER(HDN_ITEMCLICKA, OnHeaderItemClick)\r
+               NOTIFY_CODE_HANDLER(HDN_ITEMCLICKW, OnHeaderItemClick)\r
+               MESSAGE_HANDLER(WM_SETTINGCHANGE, OnSettingChange)\r
+       END_MSG_MAP()\r
+\r
+       LRESULT OnInsertColumn(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)     \r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               LRESULT lRet = pT->DefWindowProc(uMsg, wParam, lParam);\r
+               if(lRet == -1)\r
+                       return -1;\r
+\r
+               WORD wType = 0;\r
+               m_arrColSortType.Add(wType);\r
+               int nCount = m_arrColSortType.GetSize();\r
+               ATLASSERT(nCount == GetColumnCount());\r
+\r
+               for(int i = nCount - 1; i > lRet; i--)\r
+                       m_arrColSortType[i] = m_arrColSortType[i - 1];\r
+               m_arrColSortType[(int)lRet] = LVCOLSORT_TEXT;\r
+\r
+               if(lRet <= m_iSortColumn)\r
+                       m_iSortColumn++;\r
+\r
+               return lRet;\r
+       }\r
+\r
+       LRESULT OnDeleteColumn(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)     \r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               LRESULT lRet = pT->DefWindowProc(uMsg, wParam, lParam);\r
+               if(lRet == 0)\r
+                       return 0;\r
+\r
+               int iCol = (int)wParam; \r
+               if(m_iSortColumn == iCol)\r
+                       m_iSortColumn = -1;\r
+               else if(m_iSortColumn > iCol)\r
+                       m_iSortColumn--;\r
+               m_arrColSortType.RemoveAt(iCol);\r
+\r
+               return lRet;\r
+       }\r
+\r
+       LRESULT OnHeaderItemClick(int /*idCtrl*/, LPNMHDR pnmh, BOOL& bHandled)\r
+       {\r
+               LPNMHEADER p = (LPNMHEADER)pnmh;\r
+               if(p->iButton == 0)\r
+               {\r
+                       int iOld = m_iSortColumn;\r
+                       bool bDescending = (m_iSortColumn == p->iItem) ? !m_bSortDescending : false;\r
+                       if(DoSortItems(p->iItem, bDescending))\r
+                               NotifyParentSortChanged(p->iItem, iOld);                                \r
+               }\r
+               bHandled = FALSE;\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnSettingChange(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)\r
+       {\r
+#ifndef _WIN32_WCE\r
+               if(wParam == SPI_SETNONCLIENTMETRICS)\r
+                       GetSystemSettings();\r
+#else  // CE specific\r
+               wParam; // avoid level 4 warning\r
+               GetSystemSettings();\r
+#endif // _WIN32_WCE\r
+               bHandled = FALSE;\r
+               return 0;\r
+       }\r
+\r
+       void GetSystemSettings()\r
+       {\r
+               if(!m_bCommCtrl6 && !m_bmSort[m_iSortUp].IsNull())\r
+               {\r
+                       T* pT = static_cast<T*>(this);\r
+                       pT->CreateSortBitmaps();\r
+                       if(m_iSortColumn != -1)\r
+                               SetSortColumn(m_iSortColumn);\r
+               }\r
+       }\r
+\r
+};\r
+\r
+\r
+typedef ATL::CWinTraits<WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | LVS_REPORT | LVS_SHOWSELALWAYS , WS_EX_CLIENTEDGE>   CSortListViewCtrlTraits;\r
+\r
+template <class T, class TBase = CListViewCtrl, class TWinTraits = CSortListViewCtrlTraits>\r
+class ATL_NO_VTABLE CSortListViewCtrlImpl: public ATL::CWindowImpl<T, TBase, TWinTraits>, public CSortListViewImpl<T>\r
+{\r
+public:\r
+       DECLARE_WND_SUPERCLASS(NULL, TBase::GetWndClassName())\r
+\r
+       bool SortItems(int iCol, bool bDescending = false)\r
+       {\r
+               return DoSortItems(iCol, bDescending);\r
+       }\r
+               \r
+       BEGIN_MSG_MAP(CSortListViewCtrlImpl)\r
+               MESSAGE_HANDLER(LVM_INSERTCOLUMN, CSortListViewImpl<T>::OnInsertColumn)\r
+               MESSAGE_HANDLER(LVM_DELETECOLUMN, CSortListViewImpl<T>::OnDeleteColumn)\r
+               NOTIFY_CODE_HANDLER(HDN_ITEMCLICKA, CSortListViewImpl<T>::OnHeaderItemClick)\r
+               NOTIFY_CODE_HANDLER(HDN_ITEMCLICKW, CSortListViewImpl<T>::OnHeaderItemClick)\r
+               MESSAGE_HANDLER(WM_SETTINGCHANGE, CSortListViewImpl<T>::OnSettingChange)\r
+       END_MSG_MAP()\r
+};\r
+\r
+class CSortListViewCtrl : public CSortListViewCtrlImpl<CSortListViewCtrl>\r
+{\r
+public:\r
+       DECLARE_WND_SUPERCLASS(_T("WTL_SortListViewCtrl"), GetWndClassName())\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CTabView - implements tab view window\r
+\r
+// TabView Notifications\r
+#define TBVN_PAGEACTIVATED   (0U-741)\r
+#define TBVN_CONTEXTMENU     (0U-742)\r
+\r
+// Notification data for TBVN_CONTEXTMENU\r
+struct TBVCONTEXTMENUINFO\r
+{\r
+       NMHDR hdr;\r
+       POINT pt;\r
+};\r
+\r
+typedef TBVCONTEXTMENUINFO* LPTBVCONTEXTMENUINFO;\r
+\r
+\r
+template <class T, class TBase = ATL::CWindow, class TWinTraits = ATL::CControlWinTraits>\r
+class ATL_NO_VTABLE CTabViewImpl : public ATL::CWindowImpl<T, TBase, TWinTraits>\r
+{\r
+public:\r
+       DECLARE_WND_CLASS_EX(NULL, 0, COLOR_APPWORKSPACE)\r
+\r
+// Declarations and enums\r
+       struct TABVIEWPAGE\r
+       {\r
+               HWND hWnd;\r
+               LPTSTR lpstrTitle;\r
+               LPVOID pData;\r
+       };\r
+\r
+       struct TCITEMEXTRA\r
+       {\r
+               TCITEMHEADER tciheader;\r
+               TABVIEWPAGE tvpage;\r
+\r
+               operator LPTCITEM() { return (LPTCITEM)this; }\r
+       };\r
+\r
+       enum\r
+       {\r
+               m_nTabID = 1313,\r
+               m_cxMoveMark = 6,\r
+               m_cyMoveMark = 3,\r
+               m_nMenuItemsMax = (ID_WINDOW_TABLAST - ID_WINDOW_TABFIRST + 1)\r
+       };\r
+\r
+// Data members\r
+       ATL::CContainedWindowT<CTabCtrl> m_tab;\r
+       int m_cyTabHeight;\r
+\r
+       int m_nActivePage;\r
+\r
+       int m_nInsertItem;\r
+       POINT m_ptStartDrag;\r
+\r
+       CMenuHandle m_menu;\r
+\r
+       int m_cchTabTextLength;\r
+\r
+       int m_nMenuItemsCount;\r
+\r
+       ATL::CWindow m_wndTitleBar;\r
+       LPTSTR m_lpstrTitleBarBase;\r
+       int m_cchTitleBarLength;\r
+\r
+       CImageList m_ilDrag;\r
+\r
+       bool m_bDestroyPageOnRemove:1;\r
+       bool m_bDestroyImageList:1;\r
+       bool m_bActivePageMenuItem:1;\r
+       bool m_bActiveAsDefaultMenuItem:1;\r
+       bool m_bEmptyMenuItem:1;\r
+       bool m_bWindowsMenuItem:1;\r
+       // internal\r
+       bool m_bTabCapture:1;\r
+       bool m_bTabDrag:1;\r
+\r
+// Constructor/destructor\r
+       CTabViewImpl() :\r
+                       m_nActivePage(-1), \r
+                       m_cyTabHeight(0), \r
+                       m_tab(this, 1), \r
+                       m_nInsertItem(-1), \r
+                       m_cchTabTextLength(30), \r
+                       m_nMenuItemsCount(10), \r
+                       m_lpstrTitleBarBase(NULL), \r
+                       m_cchTitleBarLength(100), \r
+                       m_bDestroyPageOnRemove(true), \r
+                       m_bDestroyImageList(true), \r
+                       m_bActivePageMenuItem(true), \r
+                       m_bActiveAsDefaultMenuItem(false), \r
+                       m_bEmptyMenuItem(false), \r
+                       m_bWindowsMenuItem(false), \r
+                       m_bTabCapture(false), \r
+                       m_bTabDrag(false)\r
+       {\r
+               m_ptStartDrag.x = 0;\r
+               m_ptStartDrag.y = 0;\r
+       }\r
+\r
+       ~CTabViewImpl()\r
+       {\r
+               delete [] m_lpstrTitleBarBase;\r
+       }\r
+\r
+// Message filter function - to be called from PreTranslateMessage of the main window\r
+       BOOL PreTranslateMessage(MSG* pMsg)\r
+       {\r
+               if(IsWindow() == FALSE)\r
+                       return FALSE;\r
+\r
+               BOOL bRet = FALSE;\r
+\r
+               // Check for TabView built-in accelerators (Ctrl+Tab/Ctrl+Shift+Tab - next/previous page)\r
+               int nCount = GetPageCount();\r
+               if(nCount > 0)\r
+               {\r
+                       bool bControl = (::GetKeyState(VK_CONTROL) < 0);\r
+                       if((pMsg->message == WM_KEYDOWN) && (pMsg->wParam == VK_TAB) && bControl)\r
+                       {\r
+                               if(nCount > 1)\r
+                               {\r
+                                       int nPage = m_nActivePage;\r
+                                       bool bShift = (::GetKeyState(VK_SHIFT) < 0);\r
+                                       if(bShift)\r
+                                               nPage = (nPage > 0) ? (nPage - 1) : (nCount - 1);\r
+                                       else\r
+                                               nPage = ((nPage >= 0) && (nPage < (nCount - 1))) ? (nPage + 1) : 0;\r
+\r
+                                       SetActivePage(nPage);\r
+                                       T* pT = static_cast<T*>(this);\r
+                                       pT->OnPageActivated(m_nActivePage);\r
+                               }\r
+\r
+                               bRet = TRUE;\r
+                       }\r
+               }\r
+\r
+               // If we are doing drag-drop, check for Escape key that cancels it\r
+               if(bRet == FALSE)\r
+               {\r
+                       if(m_bTabCapture && pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_ESCAPE)\r
+                       {\r
+                               ::ReleaseCapture();\r
+                               bRet = TRUE;\r
+                       }\r
+               }\r
+\r
+               // Pass the message to the active page\r
+               if(bRet == FALSE)\r
+               {\r
+                       if(m_nActivePage != -1)\r
+                               bRet = (BOOL)::SendMessage(GetPageHWND(m_nActivePage), WM_FORWARDMSG, 0, (LPARAM)pMsg);\r
+               }\r
+\r
+               return bRet;\r
+       }\r
+\r
+// Attributes\r
+       int GetPageCount() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return m_tab.GetItemCount();\r
+       }\r
+\r
+       int GetActivePage() const\r
+       {\r
+               return m_nActivePage;\r
+       }\r
+\r
+       void SetActivePage(int nPage)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(IsValidPageIndex(nPage));\r
+\r
+               T* pT = static_cast<T*>(this);\r
+\r
+               SetRedraw(FALSE);\r
+\r
+               if(m_nActivePage != -1)\r
+                       ::ShowWindow(GetPageHWND(m_nActivePage), FALSE);\r
+               m_nActivePage = nPage;\r
+               m_tab.SetCurSel(m_nActivePage);\r
+               ::ShowWindow(GetPageHWND(m_nActivePage), TRUE);\r
+\r
+               pT->UpdateLayout();\r
+\r
+               SetRedraw(TRUE);\r
+               RedrawWindow(NULL, NULL, RDW_FRAME | RDW_INVALIDATE | RDW_UPDATENOW | RDW_ALLCHILDREN);\r
+\r
+               if(::GetFocus() != m_tab.m_hWnd)\r
+                       ::SetFocus(GetPageHWND(m_nActivePage));\r
+\r
+               pT->UpdateTitleBar();\r
+               pT->UpdateMenu();\r
+       }\r
+\r
+       HIMAGELIST GetImageList() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return m_tab.GetImageList();\r
+       }\r
+\r
+       HIMAGELIST SetImageList(HIMAGELIST hImageList)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return m_tab.SetImageList(hImageList);\r
+       }\r
+\r
+       void SetWindowMenu(HMENU hMenu)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+\r
+               m_menu = hMenu;\r
+\r
+               T* pT = static_cast<T*>(this);\r
+               pT->UpdateMenu();\r
+       }\r
+\r
+       void SetTitleBarWindow(HWND hWnd)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+\r
+               delete [] m_lpstrTitleBarBase;\r
+               m_lpstrTitleBarBase = NULL;\r
+\r
+               m_wndTitleBar = hWnd;\r
+               if(hWnd == NULL)\r
+                       return;\r
+\r
+               int cchLen = m_wndTitleBar.GetWindowTextLength() + 1;\r
+               ATLTRY(m_lpstrTitleBarBase = new TCHAR[cchLen]);\r
+               if(m_lpstrTitleBarBase != NULL)\r
+               {\r
+                       m_wndTitleBar.GetWindowText(m_lpstrTitleBarBase, cchLen);\r
+                       T* pT = static_cast<T*>(this);\r
+                       pT->UpdateTitleBar();\r
+               }\r
+       }\r
+\r
+// Page attributes\r
+       HWND GetPageHWND(int nPage) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(IsValidPageIndex(nPage));\r
+\r
+               TCITEMEXTRA tcix = { 0 };\r
+               tcix.tciheader.mask = TCIF_PARAM;\r
+               m_tab.GetItem(nPage, tcix);\r
+\r
+               return tcix.tvpage.hWnd;\r
+       }\r
+\r
+       LPCTSTR GetPageTitle(int nPage) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(IsValidPageIndex(nPage));\r
+\r
+               TCITEMEXTRA tcix = { 0 };\r
+               tcix.tciheader.mask = TCIF_PARAM;\r
+               if(m_tab.GetItem(nPage, tcix) == FALSE)\r
+                       return NULL;\r
+\r
+               return tcix.tvpage.lpstrTitle;\r
+       }\r
+\r
+       bool SetPageTitle(int nPage, LPCTSTR lpstrTitle)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(IsValidPageIndex(nPage));\r
+\r
+               T* pT = static_cast<T*>(this);\r
+\r
+               int cchBuff = lstrlen(lpstrTitle) + 1;\r
+               LPTSTR lpstrBuff = NULL;\r
+               ATLTRY(lpstrBuff = new TCHAR[cchBuff]);\r
+               if(lpstrBuff == NULL)\r
+                       return false;\r
+\r
+               SecureHelper::strcpy_x(lpstrBuff, cchBuff, lpstrTitle);\r
+               TCITEMEXTRA tcix = { 0 };\r
+               tcix.tciheader.mask = TCIF_PARAM;\r
+               if(m_tab.GetItem(nPage, tcix) == FALSE)\r
+                       return false;\r
+\r
+               CTempBuffer<TCHAR, _WTL_STACK_ALLOC_THRESHOLD> buff;\r
+               LPTSTR lpstrTabText = buff.Allocate(m_cchTabTextLength + 1);\r
+               if(lpstrTabText == NULL)\r
+                       return false;\r
+\r
+               delete [] tcix.tvpage.lpstrTitle;\r
+\r
+               pT->ShortenTitle(lpstrTitle, lpstrTabText, m_cchTabTextLength + 1);\r
+\r
+               tcix.tciheader.mask = TCIF_TEXT | TCIF_PARAM;\r
+               tcix.tciheader.pszText = lpstrTabText;\r
+               tcix.tvpage.lpstrTitle = lpstrBuff;\r
+               if(m_tab.SetItem(nPage, tcix) == FALSE)\r
+                       return false;\r
+\r
+               pT->UpdateTitleBar();\r
+               pT->UpdateMenu();\r
+\r
+               return true;\r
+       }\r
+\r
+       LPVOID GetPageData(int nPage) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(IsValidPageIndex(nPage));\r
+\r
+               TCITEMEXTRA tcix = { 0 };\r
+               tcix.tciheader.mask = TCIF_PARAM;\r
+               m_tab.GetItem(nPage, tcix);\r
+\r
+               return tcix.tvpage.pData;\r
+       }\r
+\r
+       LPVOID SetPageData(int nPage, LPVOID pData)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(IsValidPageIndex(nPage));\r
+\r
+               TCITEMEXTRA tcix = { 0 };\r
+               tcix.tciheader.mask = TCIF_PARAM;\r
+               m_tab.GetItem(nPage, tcix);\r
+               LPVOID pDataOld = tcix.tvpage.pData;\r
+\r
+               tcix.tvpage.pData = pData;\r
+               m_tab.SetItem(nPage, tcix);\r
+\r
+               return pDataOld;\r
+       }\r
+\r
+       int GetPageImage(int nPage) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(IsValidPageIndex(nPage));\r
+\r
+               TCITEMEXTRA tcix = { 0 };\r
+               tcix.tciheader.mask = TCIF_IMAGE;\r
+               m_tab.GetItem(nPage, tcix);\r
+\r
+               return tcix.tciheader.iImage;\r
+       }\r
+\r
+       int SetPageImage(int nPage, int nImage)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(IsValidPageIndex(nPage));\r
+\r
+               TCITEMEXTRA tcix = { 0 };\r
+               tcix.tciheader.mask = TCIF_IMAGE;\r
+               m_tab.GetItem(nPage, tcix);\r
+               int nImageOld = tcix.tciheader.iImage;\r
+\r
+               tcix.tciheader.iImage = nImage;\r
+               m_tab.SetItem(nPage, tcix);\r
+\r
+               return nImageOld;\r
+       }\r
+\r
+// Operations\r
+       bool AddPage(HWND hWndView, LPCTSTR lpstrTitle, int nImage = -1, LPVOID pData = NULL)\r
+       {\r
+               return InsertPage(GetPageCount(), hWndView, lpstrTitle, nImage, pData);\r
+       }\r
+\r
+       bool InsertPage(int nPage, HWND hWndView, LPCTSTR lpstrTitle, int nImage = -1, LPVOID pData = NULL)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(nPage == GetPageCount() || IsValidPageIndex(nPage));\r
+\r
+               T* pT = static_cast<T*>(this);\r
+\r
+               int cchBuff = lstrlen(lpstrTitle) + 1;\r
+               LPTSTR lpstrBuff = NULL;\r
+               ATLTRY(lpstrBuff = new TCHAR[cchBuff]);\r
+               if(lpstrBuff == NULL)\r
+                       return false;\r
+\r
+               SecureHelper::strcpy_x(lpstrBuff, cchBuff, lpstrTitle);\r
+\r
+               CTempBuffer<TCHAR, _WTL_STACK_ALLOC_THRESHOLD> buff;\r
+               LPTSTR lpstrTabText = buff.Allocate(m_cchTabTextLength + 1);\r
+               if(lpstrTabText == NULL)\r
+                       return false;\r
+\r
+               pT->ShortenTitle(lpstrTitle, lpstrTabText, m_cchTabTextLength + 1);\r
+\r
+               SetRedraw(FALSE);\r
+\r
+               TCITEMEXTRA tcix = { 0 };\r
+               tcix.tciheader.mask = TCIF_TEXT | TCIF_IMAGE | TCIF_PARAM;\r
+               tcix.tciheader.pszText = lpstrTabText;\r
+               tcix.tciheader.iImage = nImage;\r
+               tcix.tvpage.hWnd = hWndView;\r
+               tcix.tvpage.lpstrTitle = lpstrBuff;\r
+               tcix.tvpage.pData = pData;\r
+               int nItem = m_tab.InsertItem(nPage, tcix);\r
+               if(nItem == -1)\r
+               {\r
+                       delete [] lpstrBuff;\r
+                       SetRedraw(TRUE);\r
+                       return false;\r
+               }\r
+\r
+               SetActivePage(nItem);\r
+               pT->OnPageActivated(m_nActivePage);\r
+\r
+               if(GetPageCount() == 1)\r
+                       pT->ShowTabControl(true);\r
+\r
+               pT->UpdateLayout();\r
+\r
+               SetRedraw(TRUE);\r
+               RedrawWindow(NULL, NULL, RDW_FRAME | RDW_INVALIDATE | RDW_UPDATENOW | RDW_ALLCHILDREN);\r
+\r
+               return true;\r
+       }\r
+\r
+       void RemovePage(int nPage)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(IsValidPageIndex(nPage));\r
+\r
+               T* pT = static_cast<T*>(this);\r
+\r
+               SetRedraw(FALSE);\r
+\r
+               if(GetPageCount() == 1)\r
+                       pT->ShowTabControl(false);\r
+\r
+               if(m_bDestroyPageOnRemove)\r
+                       ::DestroyWindow(GetPageHWND(nPage));\r
+               else\r
+                       ::ShowWindow(GetPageHWND(nPage), FALSE);\r
+               LPTSTR lpstrTitle = (LPTSTR)GetPageTitle(nPage);\r
+               delete [] lpstrTitle;\r
+\r
+               ATLVERIFY(m_tab.DeleteItem(nPage) != FALSE);\r
+\r
+               if(m_nActivePage == nPage)\r
+               {\r
+                       m_nActivePage = -1;\r
+\r
+                       if(nPage > 0)\r
+                       {\r
+                               SetActivePage(nPage - 1);\r
+                       }\r
+                       else if(GetPageCount() > 0)\r
+                       {\r
+                               SetActivePage(nPage);\r
+                       }\r
+                       else\r
+                       {\r
+                               SetRedraw(TRUE);\r
+                               Invalidate();\r
+                               UpdateWindow();\r
+                               pT->UpdateTitleBar();\r
+                               pT->UpdateMenu();\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       nPage = (nPage < m_nActivePage) ? (m_nActivePage - 1) : m_nActivePage;\r
+                       m_nActivePage = -1;\r
+                       SetActivePage(nPage);\r
+               }\r
+\r
+               pT->OnPageActivated(m_nActivePage);\r
+       }\r
+\r
+       void RemoveAllPages()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+\r
+               if(GetPageCount() == 0)\r
+                       return;\r
+\r
+               T* pT = static_cast<T*>(this);\r
+\r
+               SetRedraw(FALSE);\r
+\r
+               pT->ShowTabControl(false);\r
+\r
+               for(int i = 0; i < GetPageCount(); i++)\r
+               {\r
+                       if(m_bDestroyPageOnRemove)\r
+                               ::DestroyWindow(GetPageHWND(i));\r
+                       else\r
+                               ::ShowWindow(GetPageHWND(i), FALSE);\r
+                       LPTSTR lpstrTitle = (LPTSTR)GetPageTitle(i);\r
+                       delete [] lpstrTitle;\r
+               }\r
+               m_tab.DeleteAllItems();\r
+\r
+               m_nActivePage = -1;\r
+               pT->OnPageActivated(m_nActivePage);\r
+\r
+               SetRedraw(TRUE);\r
+               Invalidate();\r
+               UpdateWindow();\r
+\r
+               pT->UpdateTitleBar();\r
+               pT->UpdateMenu();\r
+       }\r
+\r
+       int PageIndexFromHwnd(HWND hWnd) const\r
+       {\r
+               int nIndex = -1;\r
+\r
+               for(int i = 0; i < GetPageCount(); i++)\r
+               {\r
+                       if(GetPageHWND(i) == hWnd)\r
+                       {\r
+                               nIndex = i;\r
+                               break;\r
+                       }\r
+               }\r
+\r
+               return nIndex;\r
+       }\r
+\r
+       void BuildWindowMenu(HMENU hMenu, int nMenuItemsCount = 10, bool bEmptyMenuItem = true, bool bWindowsMenuItem = true, bool bActivePageMenuItem = true, bool bActiveAsDefaultMenuItem = false)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+\r
+               CMenuHandle menu = hMenu;\r
+               T* pT = static_cast<T*>(this);\r
+               pT;   // avoid level 4 warning\r
+               int nFirstPos = 0;\r
+\r
+               // Find first menu item in our range\r
+#ifndef _WIN32_WCE\r
+               for(nFirstPos = 0; nFirstPos < menu.GetMenuItemCount(); nFirstPos++)\r
+               {\r
+                       UINT nID = menu.GetMenuItemID(nFirstPos);\r
+                       if((nID >= ID_WINDOW_TABFIRST && nID <= ID_WINDOW_TABLAST) || nID == ID_WINDOW_SHOWTABLIST)\r
+                               break;\r
+               }\r
+#else // CE specific\r
+               for(nFirstPos = 0; ; nFirstPos++)\r
+               {\r
+                       CMenuItemInfo mii;\r
+                       mii.fMask = MIIM_ID;\r
+                       BOOL bRet = menu.GetMenuItemInfo(nFirstPos, TRUE, &mii);\r
+                       if(bRet == FALSE)\r
+                               break;\r
+                       if((mii.wID >= ID_WINDOW_TABFIRST && mii.wID <= ID_WINDOW_TABLAST) || mii.wID == ID_WINDOW_SHOWTABLIST)\r
+                               break;\r
+               }\r
+#endif // _WIN32_WCE\r
+\r
+               // Remove all menu items for tab pages\r
+               BOOL bRet = TRUE;\r
+               while(bRet != FALSE)\r
+                       bRet = menu.DeleteMenu(nFirstPos, MF_BYPOSITION);\r
+\r
+               // Add separator if it's not already there\r
+               int nPageCount = GetPageCount();\r
+               if((bWindowsMenuItem || (nPageCount > 0)) && (nFirstPos > 0))\r
+               {\r
+                       CMenuItemInfo mii;\r
+                       mii.fMask = MIIM_TYPE;\r
+                       menu.GetMenuItemInfo(nFirstPos - 1, TRUE, &mii);\r
+                       if((nFirstPos <= 0) || ((mii.fType & MFT_SEPARATOR) == 0))\r
+                       {\r
+                               menu.AppendMenu(MF_SEPARATOR);\r
+                               nFirstPos++;\r
+                       }\r
+               }\r
+\r
+               // Add menu items for all pages\r
+               if(nPageCount > 0)\r
+               {\r
+                       // Append menu items for all pages\r
+                       const int cchPrefix = 3;   // 2 digits + space\r
+                       nMenuItemsCount = min(min(nPageCount, nMenuItemsCount), (int)m_nMenuItemsMax);\r
+                       ATLASSERT(nMenuItemsCount < 100);   // 2 digits only\r
+                       if(nMenuItemsCount >= 100)\r
+                               nMenuItemsCount = 99;\r
+\r
+                       for(int i = 0; i < nMenuItemsCount; i++)\r
+                       {\r
+                               LPCTSTR lpstrTitle = GetPageTitle(i);\r
+                               int nLen = lstrlen(lpstrTitle);\r
+                               CTempBuffer<TCHAR, _WTL_STACK_ALLOC_THRESHOLD> buff;\r
+                               LPTSTR lpstrText = buff.Allocate(cchPrefix + nLen + 1);\r
+                               ATLASSERT(lpstrText != NULL);\r
+                               if(lpstrText != NULL)\r
+                               {\r
+                                       LPCTSTR lpstrFormat = (i < 9) ? _T("&%i %s") : _T("%i %s");\r
+                                       SecureHelper::wsprintf_x(lpstrText, cchPrefix + nLen + 1, lpstrFormat, i + 1, lpstrTitle);\r
+                                       menu.AppendMenu(MF_STRING, ID_WINDOW_TABFIRST + i, lpstrText);\r
+                               }\r
+                       }\r
+\r
+                       // Mark active page\r
+                       if(bActivePageMenuItem && (m_nActivePage != -1))\r
+                       {\r
+#ifndef _WIN32_WCE\r
+                               if(bActiveAsDefaultMenuItem)\r
+                               {\r
+                                       menu.SetMenuDefaultItem((UINT)-1,  TRUE);\r
+                                       menu.SetMenuDefaultItem(nFirstPos + m_nActivePage,  TRUE);\r
+                               }\r
+                               else\r
+#else // CE specific\r
+                               bActiveAsDefaultMenuItem;   // avoid level 4 warning\r
+#endif // _WIN32_WCE\r
+                               {\r
+                                       menu.CheckMenuRadioItem(nFirstPos, nFirstPos + nMenuItemsCount, nFirstPos + m_nActivePage, MF_BYPOSITION);\r
+                               }\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       if(bEmptyMenuItem)\r
+                       {\r
+                               menu.AppendMenu(MF_BYPOSITION | MF_STRING, ID_WINDOW_TABFIRST, pT->GetEmptyListText());\r
+                               menu.EnableMenuItem(ID_WINDOW_TABFIRST, MF_GRAYED);\r
+                       }\r
+\r
+                       // Remove separator if nothing else is there\r
+                       if(!bEmptyMenuItem && !bWindowsMenuItem && (nFirstPos > 0))\r
+                       {\r
+                               CMenuItemInfo mii;\r
+                               mii.fMask = MIIM_TYPE;\r
+                               menu.GetMenuItemInfo(nFirstPos - 1, TRUE, &mii);\r
+                               if((mii.fType & MFT_SEPARATOR) != 0)\r
+                                       menu.DeleteMenu(nFirstPos - 1, MF_BYPOSITION);\r
+                       }\r
+               }\r
+\r
+               // Add "Windows..." menu item\r
+               if(bWindowsMenuItem)\r
+                       menu.AppendMenu(MF_BYPOSITION | MF_STRING, ID_WINDOW_SHOWTABLIST, pT->GetWindowsMenuItemText());\r
+       }\r
+\r
+// Message map and handlers\r
+       BEGIN_MSG_MAP(CTabViewImpl)\r
+               MESSAGE_HANDLER(WM_CREATE, OnCreate)\r
+               MESSAGE_HANDLER(WM_DESTROY, OnDestroy)\r
+               MESSAGE_HANDLER(WM_SIZE, OnSize)\r
+               MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)\r
+               NOTIFY_HANDLER(m_nTabID, TCN_SELCHANGE, OnTabChanged)\r
+               NOTIFY_ID_HANDLER(m_nTabID, OnTabNotification)\r
+#ifndef _WIN32_WCE\r
+               NOTIFY_CODE_HANDLER(TTN_GETDISPINFO, OnTabGetDispInfo)\r
+#endif // !_WIN32_WCE\r
+               FORWARD_NOTIFICATIONS()\r
+       ALT_MSG_MAP(1)   // tab control\r
+               MESSAGE_HANDLER(WM_LBUTTONDOWN, OnTabLButtonDown)\r
+               MESSAGE_HANDLER(WM_LBUTTONUP, OnTabLButtonUp)\r
+               MESSAGE_HANDLER(WM_CAPTURECHANGED, OnTabCaptureChanged)\r
+               MESSAGE_HANDLER(WM_MOUSEMOVE, OnTabMouseMove)\r
+               MESSAGE_HANDLER(WM_RBUTTONUP, OnTabRButtonUp)\r
+               MESSAGE_HANDLER(WM_SYSKEYDOWN, OnTabSysKeyDown)\r
+       END_MSG_MAP()\r
+\r
+       LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               pT->CreateTabControl();\r
+\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)\r
+       {\r
+               RemoveAllPages();\r
+\r
+               if(m_bDestroyImageList)\r
+               {\r
+                       CImageList il = m_tab.SetImageList(NULL);\r
+                       if(il.m_hImageList != NULL)\r
+                               il.Destroy();\r
+               }\r
+\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnSize(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               pT->UpdateLayout();\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnSetFocus(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)\r
+       {\r
+               if(m_nActivePage != -1)\r
+                       ::SetFocus(GetPageHWND(m_nActivePage));\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnTabChanged(int /*idCtrl*/, LPNMHDR /*pnmh*/, BOOL& /*bHandled*/)\r
+       {\r
+               SetActivePage(m_tab.GetCurSel());\r
+               T* pT = static_cast<T*>(this);\r
+               pT->OnPageActivated(m_nActivePage);\r
+\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnTabNotification(int /*idCtrl*/, LPNMHDR /*pnmh*/, BOOL& /*bHandled*/)\r
+       {\r
+               // nothing to do - this just blocks all tab control\r
+               // notifications from being propagated further\r
+               return 0;\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       LRESULT OnTabGetDispInfo(int /*idCtrl*/, LPNMHDR pnmh, BOOL& bHandled)\r
+       {\r
+               LPNMTTDISPINFO pTTDI = (LPNMTTDISPINFO)pnmh;\r
+               if(pTTDI->hdr.hwndFrom == m_tab.GetTooltips())\r
+               {\r
+                       T* pT = static_cast<T*>(this);\r
+                       pT->UpdateTooltipText(pTTDI);\r
+               }\r
+               else\r
+               {\r
+                       bHandled = FALSE;\r
+               }\r
+\r
+               return 0;\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+// Tab control message handlers\r
+       LRESULT OnTabLButtonDown(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled)\r
+       {\r
+               if(m_tab.GetItemCount() > 1)\r
+               {\r
+                       m_bTabCapture = true;\r
+                       m_tab.SetCapture();\r
+\r
+                       m_ptStartDrag.x = GET_X_LPARAM(lParam);\r
+                       m_ptStartDrag.y = GET_Y_LPARAM(lParam);\r
+               }\r
+\r
+               bHandled = FALSE;\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnTabLButtonUp(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled)\r
+       {\r
+               if(m_bTabCapture)\r
+               {\r
+                       if(m_bTabDrag)\r
+                       {\r
+                               TCHITTESTINFO hti = { 0 };\r
+                               hti.pt.x = GET_X_LPARAM(lParam);\r
+                               hti.pt.y = GET_Y_LPARAM(lParam);\r
+                               int nItem = m_tab.HitTest(&hti);\r
+                               if(nItem != -1)\r
+                                       MovePage(m_nActivePage, nItem);\r
+                       }\r
+\r
+                       ::ReleaseCapture();\r
+               }\r
+\r
+               bHandled = FALSE;\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnTabCaptureChanged(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)\r
+       {\r
+               if(m_bTabCapture)\r
+               {\r
+                       m_bTabCapture = false;\r
+\r
+                       if(m_bTabDrag)\r
+                       {\r
+                               m_bTabDrag = false;\r
+                               T* pT = static_cast<T*>(this);\r
+                               pT->DrawMoveMark(-1);\r
+\r
+#ifndef _WIN32_WCE\r
+                               m_ilDrag.DragLeave(GetDesktopWindow());\r
+#endif // !_WIN32_WCE\r
+                               m_ilDrag.EndDrag();\r
+\r
+                               m_ilDrag.Destroy();\r
+                               m_ilDrag.m_hImageList = NULL;\r
+                       }\r
+               }\r
+\r
+               bHandled = FALSE;\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnTabMouseMove(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled)\r
+       {\r
+               bHandled = FALSE;\r
+\r
+               if(m_bTabCapture)\r
+               {\r
+                       POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };\r
+\r
+                       if(!m_bTabDrag)\r
+                       {\r
+#ifndef _WIN32_WCE\r
+                               if(abs(m_ptStartDrag.x - GET_X_LPARAM(lParam)) >= ::GetSystemMetrics(SM_CXDRAG) ||\r
+                                  abs(m_ptStartDrag.y - GET_Y_LPARAM(lParam)) >= ::GetSystemMetrics(SM_CYDRAG))\r
+#else // CE specific\r
+                               if(abs(m_ptStartDrag.x - GET_X_LPARAM(lParam)) >= 4 ||\r
+                                  abs(m_ptStartDrag.y - GET_Y_LPARAM(lParam)) >= 4)\r
+#endif // _WIN32_WCE\r
+                               {\r
+                                       T* pT = static_cast<T*>(this);\r
+                                       pT->GenerateDragImage(m_nActivePage);\r
+\r
+                                       int cxCursor = ::GetSystemMetrics(SM_CXCURSOR);\r
+                                       int cyCursor = ::GetSystemMetrics(SM_CYCURSOR);\r
+                                       m_ilDrag.BeginDrag(0, -(cxCursor / 2), -(cyCursor / 2));\r
+#ifndef _WIN32_WCE\r
+                                       POINT ptEnter = m_ptStartDrag;\r
+                                       m_tab.ClientToScreen(&ptEnter);\r
+                                       m_ilDrag.DragEnter(GetDesktopWindow(), ptEnter);\r
+#endif // !_WIN32_WCE\r
+\r
+                                       m_bTabDrag = true;\r
+                               }\r
+                       }\r
+\r
+                       if(m_bTabDrag)\r
+                       {\r
+                               TCHITTESTINFO hti = { 0 };\r
+                               hti.pt = pt;\r
+                               int nItem = m_tab.HitTest(&hti);\r
+\r
+                               T* pT = static_cast<T*>(this);\r
+                               pT->SetMoveCursor(nItem != -1);\r
+\r
+                               if(m_nInsertItem != nItem)\r
+                                       pT->DrawMoveMark(nItem);\r
+\r
+                               m_ilDrag.DragShowNolock((nItem != -1) ? TRUE : FALSE);\r
+                               m_tab.ClientToScreen(&pt);\r
+                               m_ilDrag.DragMove(pt);\r
+\r
+                               bHandled = TRUE;\r
+                       }\r
+               }\r
+\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnTabRButtonUp(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/)\r
+       {\r
+               TCHITTESTINFO hti = { 0 };\r
+               hti.pt.x = GET_X_LPARAM(lParam);\r
+               hti.pt.y = GET_Y_LPARAM(lParam);\r
+               int nItem = m_tab.HitTest(&hti);\r
+               if(nItem != -1)\r
+               {\r
+                       T* pT = static_cast<T*>(this);\r
+                       pT->OnContextMenu(nItem, hti.pt);\r
+               }\r
+\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnTabSysKeyDown(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)\r
+       {\r
+               bool bShift = (::GetKeyState(VK_SHIFT) < 0);\r
+               if(wParam == VK_F10 && bShift)\r
+               {\r
+                       if(m_nActivePage != -1)\r
+                       {\r
+                               RECT rect = { 0 };\r
+                               m_tab.GetItemRect(m_nActivePage, &rect);\r
+                               POINT pt = { rect.left, rect.bottom };\r
+                               T* pT = static_cast<T*>(this);\r
+                               pT->OnContextMenu(m_nActivePage, pt);\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       bHandled = FALSE;\r
+               }\r
+\r
+               return 0;\r
+       }\r
+\r
+// Implementation helpers\r
+       bool IsValidPageIndex(int nPage) const\r
+       {\r
+               return (nPage >= 0 && nPage < GetPageCount());\r
+       }\r
+\r
+       bool MovePage(int nMovePage, int nInsertBeforePage)\r
+       {\r
+               ATLASSERT(IsValidPageIndex(nMovePage));\r
+               ATLASSERT(IsValidPageIndex(nInsertBeforePage));\r
+\r
+               if(!IsValidPageIndex(nMovePage) || !IsValidPageIndex(nInsertBeforePage))\r
+                       return false;\r
+\r
+               if(nMovePage == nInsertBeforePage)\r
+                       return true;   // nothing to do\r
+\r
+               CTempBuffer<TCHAR, _WTL_STACK_ALLOC_THRESHOLD> buff;\r
+               LPTSTR lpstrTabText = buff.Allocate(m_cchTabTextLength + 1);\r
+               if(lpstrTabText == NULL)\r
+                       return false;\r
+               TCITEMEXTRA tcix = { 0 };\r
+               tcix.tciheader.mask = TCIF_TEXT | TCIF_IMAGE | TCIF_PARAM;\r
+               tcix.tciheader.pszText = lpstrTabText;\r
+               tcix.tciheader.cchTextMax = m_cchTabTextLength + 1;\r
+               BOOL bRet = m_tab.GetItem(nMovePage, tcix);\r
+               ATLASSERT(bRet != FALSE);\r
+               if(bRet == FALSE)\r
+                       return false;\r
+\r
+               int nInsertItem = (nInsertBeforePage > nMovePage) ? nInsertBeforePage + 1 : nInsertBeforePage;\r
+               int nNewItem = m_tab.InsertItem(nInsertItem, tcix);\r
+               ATLASSERT(nNewItem == nInsertItem);\r
+               if(nNewItem != nInsertItem)\r
+               {\r
+                       ATLVERIFY(m_tab.DeleteItem(nNewItem));\r
+                       return false;\r
+               }\r
+\r
+               if(nMovePage > nInsertBeforePage)\r
+                       ATLVERIFY(m_tab.DeleteItem(nMovePage + 1) != FALSE);\r
+               else if(nMovePage < nInsertBeforePage)\r
+                       ATLVERIFY(m_tab.DeleteItem(nMovePage) != FALSE);\r
+\r
+               SetActivePage(nInsertBeforePage);\r
+               T* pT = static_cast<T*>(this);\r
+               pT->OnPageActivated(m_nActivePage);\r
+\r
+               return true;\r
+       }\r
+\r
+// Implementation overrideables\r
+       bool CreateTabControl()\r
+       {\r
+#ifndef _WIN32_WCE\r
+               m_tab.Create(m_hWnd, rcDefault, NULL, WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | TCS_TOOLTIPS, 0, m_nTabID);\r
+#else // CE specific\r
+               m_tab.Create(m_hWnd, rcDefault, NULL, WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, 0, m_nTabID);\r
+#endif // _WIN32_WCE\r
+               ATLASSERT(m_tab.m_hWnd != NULL);\r
+               if(m_tab.m_hWnd == NULL)\r
+                       return false;\r
+\r
+               m_tab.SetFont(AtlGetDefaultGuiFont());\r
+\r
+               m_tab.SetItemExtra(sizeof(TABVIEWPAGE));\r
+\r
+               T* pT = static_cast<T*>(this);\r
+               m_cyTabHeight = pT->CalcTabHeight();\r
+\r
+               return true;\r
+       }\r
+\r
+       int CalcTabHeight()\r
+       {\r
+               int nCount = m_tab.GetItemCount();\r
+               TCITEMEXTRA tcix = { 0 };\r
+               tcix.tciheader.mask = TCIF_TEXT;\r
+               tcix.tciheader.pszText = _T("NS");\r
+               int nIndex = m_tab.InsertItem(nCount, tcix);\r
+\r
+               RECT rect = { 0, 0, 1000, 1000 };\r
+               m_tab.AdjustRect(FALSE, &rect);\r
+\r
+               RECT rcWnd = { 0, 0, 1000, rect.top };\r
+               ::AdjustWindowRectEx(&rcWnd, m_tab.GetStyle(), FALSE, m_tab.GetExStyle());\r
+\r
+               int nHeight = rcWnd.bottom - rcWnd.top;\r
+\r
+               m_tab.DeleteItem(nIndex);\r
+\r
+               return nHeight;\r
+       }\r
+\r
+       void ShowTabControl(bool bShow)\r
+       {\r
+               m_tab.ShowWindow(bShow ? SW_SHOWNOACTIVATE : SW_HIDE);\r
+       }\r
+\r
+       void UpdateLayout()\r
+       {\r
+               RECT rect;\r
+               GetClientRect(&rect);\r
+\r
+               if(m_tab.IsWindow() && ((m_tab.GetStyle() & WS_VISIBLE) != 0))\r
+                       m_tab.SetWindowPos(NULL, 0, 0, rect.right - rect.left, m_cyTabHeight, SWP_NOZORDER);\r
+\r
+               if(m_nActivePage != -1)\r
+                       ::SetWindowPos(GetPageHWND(m_nActivePage), NULL, 0, m_cyTabHeight, rect.right - rect.left, rect.bottom - rect.top - m_cyTabHeight, SWP_NOZORDER);\r
+       }\r
+\r
+       void UpdateMenu()\r
+       {\r
+               if(m_menu.m_hMenu != NULL)\r
+                       BuildWindowMenu(m_menu, m_nMenuItemsCount, m_bEmptyMenuItem, m_bWindowsMenuItem, m_bActivePageMenuItem, m_bActiveAsDefaultMenuItem);\r
+       }\r
+\r
+       void UpdateTitleBar()\r
+       {\r
+               if(!m_wndTitleBar.IsWindow() || m_lpstrTitleBarBase == NULL)\r
+                       return;   // nothing to do\r
+\r
+               if(m_nActivePage != -1)\r
+               {\r
+                       T* pT = static_cast<T*>(this);\r
+                       LPCTSTR lpstrTitle = pT->GetPageTitle(m_nActivePage);\r
+                       LPCTSTR lpstrDivider = pT->GetTitleDividerText();\r
+                       int cchBuffer = m_cchTitleBarLength + lstrlen(lpstrDivider) + lstrlen(m_lpstrTitleBarBase) + 1;\r
+                       CTempBuffer<TCHAR, _WTL_STACK_ALLOC_THRESHOLD> buff;\r
+                       LPTSTR lpstrPageTitle = buff.Allocate(cchBuffer);\r
+                       ATLASSERT(lpstrPageTitle != NULL);\r
+                       if(lpstrPageTitle != NULL)\r
+                       {\r
+                               pT->ShortenTitle(lpstrTitle, lpstrPageTitle, m_cchTitleBarLength + 1);\r
+                               SecureHelper::strcat_x(lpstrPageTitle, cchBuffer, lpstrDivider);\r
+                               SecureHelper::strcat_x(lpstrPageTitle, cchBuffer, m_lpstrTitleBarBase);\r
+                       }\r
+                       else\r
+                       {\r
+                               lpstrPageTitle = m_lpstrTitleBarBase;\r
+                       }\r
+\r
+                       m_wndTitleBar.SetWindowText(lpstrPageTitle);\r
+               }\r
+               else\r
+               {\r
+                       m_wndTitleBar.SetWindowText(m_lpstrTitleBarBase);\r
+               }\r
+       }\r
+\r
+       void DrawMoveMark(int nItem)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+\r
+               if(m_nInsertItem != -1)\r
+               {\r
+                       RECT rect = { 0 };\r
+                       pT->GetMoveMarkRect(rect);\r
+                       m_tab.InvalidateRect(&rect);\r
+               }\r
+\r
+               m_nInsertItem = nItem;\r
+\r
+               if(m_nInsertItem != -1)\r
+               {\r
+                       CClientDC dc(m_tab.m_hWnd);\r
+\r
+                       RECT rect = { 0 };\r
+                       pT->GetMoveMarkRect(rect);\r
+\r
+                       CPen pen;\r
+                       pen.CreatePen(PS_SOLID, 1, ::GetSysColor(COLOR_WINDOWTEXT));\r
+                       CBrush brush;\r
+                       brush.CreateSolidBrush(::GetSysColor(COLOR_WINDOWTEXT));\r
+\r
+                       HPEN hPenOld = dc.SelectPen(pen);\r
+                       HBRUSH hBrushOld = dc.SelectBrush(brush);\r
+\r
+                       int x = rect.left;\r
+                       int y = rect.top;\r
+                       POINT ptsTop[3] = { { x, y }, { x + m_cxMoveMark, y }, { x + (m_cxMoveMark / 2), y + m_cyMoveMark } };\r
+                       dc.Polygon(ptsTop, 3);\r
+\r
+                       y = rect.bottom - 1;\r
+                       POINT ptsBottom[3] = { { x, y }, { x + m_cxMoveMark, y }, { x + (m_cxMoveMark / 2), y - m_cyMoveMark } };\r
+                       dc.Polygon(ptsBottom, 3);\r
+\r
+                       dc.SelectPen(hPenOld);\r
+                       dc.SelectBrush(hBrushOld);\r
+               }\r
+       }\r
+\r
+       void GetMoveMarkRect(RECT& rect) const\r
+       {\r
+               m_tab.GetClientRect(&rect);\r
+\r
+               RECT rcItem = { 0 };\r
+               m_tab.GetItemRect(m_nInsertItem, &rcItem);\r
+\r
+               if(m_nInsertItem <= m_nActivePage)\r
+               {\r
+                       rect.left = rcItem.left - m_cxMoveMark / 2 - 1;\r
+                       rect.right = rcItem.left + m_cxMoveMark / 2;\r
+               }\r
+               else\r
+               {\r
+                       rect.left = rcItem.right - m_cxMoveMark / 2 - 1;\r
+                       rect.right = rcItem.right + m_cxMoveMark / 2;\r
+               }\r
+       }\r
+\r
+       void SetMoveCursor(bool bCanMove)\r
+       {\r
+               ::SetCursor(::LoadCursor(NULL, bCanMove ? IDC_ARROW : IDC_NO));\r
+       }\r
+\r
+       void GenerateDragImage(int nItem)\r
+       {\r
+               ATLASSERT(IsValidPageIndex(nItem));\r
+\r
+#ifndef _WIN32_WCE\r
+               RECT rcItem = { 0 };\r
+               m_tab.GetItemRect(nItem, &rcItem);\r
+               ::InflateRect(&rcItem, 2, 2);   // make bigger to cover selected item\r
+#else // CE specific\r
+               nItem;   // avoid level 4 warning\r
+               RECT rcItem = { 0, 0, 40, 20 };\r
+#endif // _WIN32_WCE\r
+\r
+               ATLASSERT(m_ilDrag.m_hImageList == NULL);\r
+               m_ilDrag.Create(rcItem.right - rcItem.left, rcItem.bottom - rcItem.top, ILC_COLORDDB | ILC_MASK, 1, 1);\r
+\r
+               CClientDC dc(m_hWnd);\r
+               CDC dcMem;\r
+               dcMem.CreateCompatibleDC(dc);\r
+               ATLASSERT(dcMem.m_hDC != NULL);\r
+               dcMem.SetViewportOrg(-rcItem.left, -rcItem.top);\r
+\r
+               CBitmap bmp;\r
+               bmp.CreateCompatibleBitmap(dc, rcItem.right - rcItem.left, rcItem.bottom - rcItem.top);\r
+               ATLASSERT(bmp.m_hBitmap != NULL);\r
+\r
+               HBITMAP hBmpOld = dcMem.SelectBitmap(bmp);\r
+#ifndef _WIN32_WCE\r
+               m_tab.SendMessage(WM_PRINTCLIENT, (WPARAM)dcMem.m_hDC);\r
+#else // CE specific\r
+               dcMem.Rectangle(&rcItem);\r
+#endif // _WIN32_WCE\r
+               dcMem.SelectBitmap(hBmpOld);\r
+\r
+               ATLVERIFY(m_ilDrag.Add(bmp.m_hBitmap, RGB(255, 0, 255)) != -1);\r
+       }\r
+\r
+       void ShortenTitle(LPCTSTR lpstrTitle, LPTSTR lpstrShortTitle, int cchShortTitle)\r
+       {\r
+               if(lstrlen(lpstrTitle) >= cchShortTitle)\r
+               {\r
+                       LPCTSTR lpstrEllipsis = _T("...");\r
+                       int cchEllipsis = lstrlen(lpstrEllipsis);\r
+                       SecureHelper::strncpy_x(lpstrShortTitle, cchShortTitle, lpstrTitle, cchShortTitle - cchEllipsis - 1);\r
+                       SecureHelper::strcat_x(lpstrShortTitle, cchShortTitle, lpstrEllipsis);\r
+               }\r
+               else\r
+               {\r
+                       SecureHelper::strcpy_x(lpstrShortTitle, cchShortTitle, lpstrTitle);\r
+               }\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       void UpdateTooltipText(LPNMTTDISPINFO pTTDI)\r
+       {\r
+               ATLASSERT(pTTDI != NULL);\r
+               pTTDI->lpszText = (LPTSTR)GetPageTitle((int)pTTDI->hdr.idFrom);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+// Text for menu items and title bar - override to provide different strings\r
+       static LPCTSTR GetEmptyListText()\r
+       {\r
+               return _T("(Empty)");\r
+       }\r
+\r
+       static LPCTSTR GetWindowsMenuItemText()\r
+       {\r
+               return _T("&Windows...");\r
+       }\r
+\r
+       static LPCTSTR GetTitleDividerText()\r
+       {\r
+               return _T(" - ");\r
+       }\r
+\r
+// Notifications - override to provide different behavior\r
+       void OnPageActivated(int nPage)\r
+       {\r
+               NMHDR nmhdr = { 0 };\r
+               nmhdr.hwndFrom = m_hWnd;\r
+               nmhdr.idFrom = nPage;\r
+               nmhdr.code = TBVN_PAGEACTIVATED;\r
+               ::SendMessage(GetParent(), WM_NOTIFY, GetDlgCtrlID(), (LPARAM)&nmhdr);\r
+       }\r
+\r
+       void OnContextMenu(int nPage, POINT pt)\r
+       {\r
+               m_tab.ClientToScreen(&pt);\r
+\r
+               TBVCONTEXTMENUINFO cmi = { 0 };\r
+               cmi.hdr.hwndFrom = m_hWnd;\r
+               cmi.hdr.idFrom = nPage;\r
+               cmi.hdr.code = TBVN_CONTEXTMENU;\r
+               cmi.pt = pt;\r
+               ::SendMessage(GetParent(), WM_NOTIFY, GetDlgCtrlID(), (LPARAM)&cmi);\r
+       }\r
+};\r
+\r
+\r
+class CTabView : public CTabViewImpl<CTabView>\r
+{\r
+public:\r
+       DECLARE_WND_CLASS_EX(_T("WTL_TabView"), 0, COLOR_APPWORKSPACE)\r
+};\r
+\r
+}; // namespace WTL\r
+\r
+#endif // __ATLCTRLX_H__\r
diff --git a/WTL80/include/atlddx.h b/WTL80/include/atlddx.h
new file mode 100644 (file)
index 0000000..ad4249a
--- /dev/null
@@ -0,0 +1,624 @@
+// Windows Template Library - WTL version 8.0\r
+// Copyright (C) Microsoft Corporation. All rights reserved.\r
+//\r
+// This file is a part of the Windows Template Library.\r
+// The use and distribution terms for this software are covered by the\r
+// Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php)\r
+// which can be found in the file CPL.TXT at the root of this distribution.\r
+// By using this software in any fashion, you are agreeing to be bound by\r
+// the terms of this license. You must not remove this notice, or\r
+// any other, from this software.\r
+\r
+#ifndef __ATLDDX_H__\r
+#define __ATLDDX_H__\r
+\r
+#pragma once\r
+\r
+#ifndef __cplusplus\r
+       #error ATL requires C++ compilation (use a .cpp suffix)\r
+#endif\r
+\r
+#ifndef __ATLAPP_H__\r
+       #error atlddx.h requires atlapp.h to be included first\r
+#endif\r
+\r
+#if defined(_ATL_USE_DDX_FLOAT) && defined(_ATL_MIN_CRT)\r
+       #error Cannot use floating point DDX with _ATL_MIN_CRT defined\r
+#endif // defined(_ATL_USE_DDX_FLOAT) && defined(_ATL_MIN_CRT)\r
+\r
+#ifdef _ATL_USE_DDX_FLOAT\r
+  #include <float.h>\r
+#endif // _ATL_USE_DDX_FLOAT\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Classes in this file:\r
+//\r
+// CWinDataExchange<T>\r
+\r
+\r
+namespace WTL\r
+{\r
+\r
+// Constants\r
+#define DDX_LOAD       FALSE\r
+#define DDX_SAVE       TRUE\r
+\r
+// DDX map macros\r
+#define BEGIN_DDX_MAP(thisClass) \\r
+       BOOL DoDataExchange(BOOL bSaveAndValidate = FALSE, UINT nCtlID = (UINT)-1) \\r
+       { \\r
+               bSaveAndValidate; \\r
+               nCtlID;\r
+\r
+#define DDX_TEXT(nID, var) \\r
+               if(nCtlID == (UINT)-1 || nCtlID == nID) \\r
+               { \\r
+                       if(!DDX_Text(nID, var, sizeof(var), bSaveAndValidate)) \\r
+                               return FALSE; \\r
+               }\r
+\r
+#define DDX_TEXT_LEN(nID, var, len) \\r
+               if(nCtlID == (UINT)-1 || nCtlID == nID) \\r
+               { \\r
+                       if(!DDX_Text(nID, var, sizeof(var), bSaveAndValidate, TRUE, len)) \\r
+                               return FALSE; \\r
+               }\r
+\r
+#define DDX_INT(nID, var) \\r
+               if(nCtlID == (UINT)-1 || nCtlID == nID) \\r
+               { \\r
+                       if(!DDX_Int(nID, var, TRUE, bSaveAndValidate)) \\r
+                               return FALSE; \\r
+               }\r
+\r
+#define DDX_INT_RANGE(nID, var, min, max) \\r
+               if(nCtlID == (UINT)-1 || nCtlID == nID) \\r
+               { \\r
+                       if(!DDX_Int(nID, var, TRUE, bSaveAndValidate, TRUE, min, max)) \\r
+                               return FALSE; \\r
+               }\r
+\r
+#define DDX_UINT(nID, var) \\r
+               if(nCtlID == (UINT)-1 || nCtlID == nID) \\r
+               { \\r
+                       if(!DDX_Int(nID, var, FALSE, bSaveAndValidate)) \\r
+                               return FALSE; \\r
+               }\r
+\r
+#define DDX_UINT_RANGE(nID, var, min, max) \\r
+               if(nCtlID == (UINT)-1 || nCtlID == nID) \\r
+               { \\r
+                       if(!DDX_Int(nID, var, FALSE, bSaveAndValidate, TRUE, min, max)) \\r
+                               return FALSE; \\r
+               }\r
+\r
+#ifdef _ATL_USE_DDX_FLOAT\r
+#define DDX_FLOAT(nID, var) \\r
+               if(nCtlID == (UINT)-1 || nCtlID == nID) \\r
+               { \\r
+                       if(!DDX_Float(nID, var, bSaveAndValidate)) \\r
+                               return FALSE; \\r
+               }\r
+\r
+#define DDX_FLOAT_RANGE(nID, var, min, max) \\r
+               if(nCtlID == (UINT)-1 || nCtlID == nID) \\r
+               { \\r
+                       if(!DDX_Float(nID, var, bSaveAndValidate, TRUE, min, max)) \\r
+                               return FALSE; \\r
+               }\r
+#define DDX_FLOAT_P(nID, var, precision) \\r
+               if(nCtlID == (UINT)-1 || nCtlID == nID) \\r
+               { \\r
+                       if(!DDX_Float(nID, var, bSaveAndValidate, FALSE, 0, 0, precision)) \\r
+                               return FALSE; \\r
+               }\r
+\r
+#define DDX_FLOAT_P_RANGE(nID, var, min, max, precision) \\r
+               if(nCtlID == (UINT)-1 || nCtlID == nID) \\r
+               { \\r
+                       if(!DDX_Float(nID, var, bSaveAndValidate, TRUE, min, max, precision)) \\r
+                               return FALSE; \\r
+               }\r
+#endif // _ATL_USE_DDX_FLOAT\r
+\r
+#define DDX_CONTROL(nID, obj) \\r
+               if(nCtlID == (UINT)-1 || nCtlID == nID) \\r
+                       DDX_Control(nID, obj, bSaveAndValidate);\r
+\r
+#define DDX_CONTROL_HANDLE(nID, obj) \\r
+               if(nCtlID == (UINT)-1 || nCtlID == nID) \\r
+                       DDX_Control_Handle(nID, obj, bSaveAndValidate);\r
+\r
+#define DDX_CHECK(nID, var) \\r
+               if(nCtlID == (UINT)-1 || nCtlID == nID) \\r
+                       DDX_Check(nID, var, bSaveAndValidate);\r
+\r
+#define DDX_RADIO(nID, var) \\r
+               if(nCtlID == (UINT)-1 || nCtlID == nID) \\r
+                       DDX_Radio(nID, var, bSaveAndValidate);\r
+\r
+#define END_DDX_MAP() \\r
+               return TRUE; \\r
+       }\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CWinDataExchange - provides support for DDX\r
+\r
+template <class T>\r
+class CWinDataExchange\r
+{\r
+public:\r
+// Data exchange method - override in your derived class\r
+       BOOL DoDataExchange(BOOL /*bSaveAndValidate*/ = FALSE, UINT /*nCtlID*/ = (UINT)-1)\r
+       {\r
+               // this one should never be called, override it in\r
+               // your derived class by implementing DDX map\r
+               ATLASSERT(FALSE);\r
+               return FALSE;\r
+       }\r
+\r
+// Helpers for validation error reporting\r
+       enum _XDataType\r
+       {\r
+               ddxDataNull = 0,\r
+               ddxDataText = 1,\r
+               ddxDataInt = 2,\r
+               ddxDataFloat = 3,\r
+               ddxDataDouble = 4\r
+       };\r
+\r
+       struct _XTextData\r
+       {\r
+               int nLength;\r
+               int nMaxLength;\r
+       };\r
+\r
+       struct _XIntData\r
+       {\r
+               long nVal;\r
+               long nMin;\r
+               long nMax;\r
+       };\r
+\r
+       struct _XFloatData\r
+       {\r
+               double nVal;\r
+               double nMin;\r
+               double nMax;\r
+       };\r
+\r
+       struct _XData\r
+       {\r
+               _XDataType nDataType;\r
+               union\r
+               {\r
+                       _XTextData textData;\r
+                       _XIntData intData;\r
+                       _XFloatData floatData;\r
+               };\r
+       };\r
+\r
+// Text exchange\r
+       BOOL DDX_Text(UINT nID, LPTSTR lpstrText, int cbSize, BOOL bSave, BOOL bValidate = FALSE, int nLength = 0)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               BOOL bSuccess = TRUE;\r
+\r
+               if(bSave)\r
+               {\r
+                       HWND hWndCtrl = pT->GetDlgItem(nID);\r
+                       int nRetLen = ::GetWindowText(hWndCtrl, lpstrText, cbSize / sizeof(TCHAR));\r
+                       if(nRetLen < ::GetWindowTextLength(hWndCtrl))\r
+                               bSuccess = FALSE;\r
+               }\r
+               else\r
+               {\r
+                       ATLASSERT(!bValidate || lstrlen(lpstrText) <= nLength);\r
+                       bSuccess = pT->SetDlgItemText(nID, lpstrText);\r
+               }\r
+\r
+               if(!bSuccess)\r
+               {\r
+                       pT->OnDataExchangeError(nID, bSave);\r
+               }\r
+               else if(bSave && bValidate)   // validation\r
+               {\r
+                       ATLASSERT(nLength > 0);\r
+                       if(lstrlen(lpstrText) > nLength)\r
+                       {\r
+                               _XData data = { ddxDataText };\r
+                               data.textData.nLength = lstrlen(lpstrText);\r
+                               data.textData.nMaxLength = nLength;\r
+                               pT->OnDataValidateError(nID, bSave, data);\r
+                               bSuccess = FALSE;\r
+                       }\r
+               }\r
+               return bSuccess;\r
+       }\r
+\r
+       BOOL DDX_Text(UINT nID, BSTR& bstrText, int /*cbSize*/, BOOL bSave, BOOL bValidate = FALSE, int nLength = 0)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               BOOL bSuccess = TRUE;\r
+\r
+               if(bSave)\r
+               {\r
+                       bSuccess = pT->GetDlgItemText(nID, bstrText);\r
+               }\r
+               else\r
+               {\r
+                       USES_CONVERSION;\r
+                       LPTSTR lpstrText = OLE2T(bstrText);\r
+                       ATLASSERT(!bValidate || lstrlen(lpstrText) <= nLength);\r
+                       bSuccess = pT->SetDlgItemText(nID, lpstrText);\r
+               }\r
+\r
+               if(!bSuccess)\r
+               {\r
+                       pT->OnDataExchangeError(nID, bSave);\r
+               }\r
+               else if(bSave && bValidate)   // validation\r
+               {\r
+                       ATLASSERT(nLength > 0);\r
+                       if((int)::SysStringLen(bstrText) > nLength)\r
+                       {\r
+                               _XData data = { ddxDataText };\r
+                               data.textData.nLength = (int)::SysStringLen(bstrText);\r
+                               data.textData.nMaxLength = nLength;\r
+                               pT->OnDataValidateError(nID, bSave, data);\r
+                               bSuccess = FALSE;\r
+                       }\r
+               }\r
+               return bSuccess;\r
+       }\r
+\r
+       BOOL DDX_Text(UINT nID, ATL::CComBSTR& bstrText, int /*cbSize*/, BOOL bSave, BOOL bValidate = FALSE, int nLength = 0)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               BOOL bSuccess = TRUE;\r
+\r
+               if(bSave)\r
+               {\r
+                       bSuccess = pT->GetDlgItemText(nID, (BSTR&)bstrText);\r
+               }\r
+               else\r
+               {\r
+                       USES_CONVERSION;\r
+                       LPTSTR lpstrText = OLE2T(bstrText);\r
+                       ATLASSERT(!bValidate || lstrlen(lpstrText) <= nLength);\r
+                       bSuccess = pT->SetDlgItemText(nID, lpstrText);\r
+               }\r
+\r
+               if(!bSuccess)\r
+               {\r
+                       pT->OnDataExchangeError(nID, bSave);\r
+               }\r
+               else if(bSave && bValidate)   // validation\r
+               {\r
+                       ATLASSERT(nLength > 0);\r
+                       if((int)bstrText.Length() > nLength)\r
+                       {\r
+                               _XData data = { ddxDataText };\r
+                               data.textData.nLength = (int)bstrText.Length();\r
+                               data.textData.nMaxLength = nLength;\r
+                               pT->OnDataValidateError(nID, bSave, data);\r
+                               bSuccess = FALSE;\r
+                       }\r
+               }\r
+               return bSuccess;\r
+       }\r
+\r
+#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)\r
+       BOOL DDX_Text(UINT nID, _CSTRING_NS::CString& strText, int /*cbSize*/, BOOL bSave, BOOL bValidate = FALSE, int nLength = 0)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               BOOL bSuccess = TRUE;\r
+\r
+               if(bSave)\r
+               {\r
+                       HWND hWndCtrl = pT->GetDlgItem(nID);\r
+                       int nLen = ::GetWindowTextLength(hWndCtrl);\r
+                       int nRetLen = -1;\r
+                       LPTSTR lpstr = strText.GetBufferSetLength(nLen);\r
+                       if(lpstr != NULL)\r
+                       {\r
+                               nRetLen = ::GetWindowText(hWndCtrl, lpstr, nLen + 1);\r
+                               strText.ReleaseBuffer();\r
+                       }\r
+                       if(nRetLen < nLen)\r
+                               bSuccess = FALSE;\r
+               }\r
+               else\r
+               {\r
+                       bSuccess = pT->SetDlgItemText(nID, strText);\r
+               }\r
+\r
+               if(!bSuccess)\r
+               {\r
+                       pT->OnDataExchangeError(nID, bSave);\r
+               }\r
+               else if(bSave && bValidate)   // validation\r
+               {\r
+                       ATLASSERT(nLength > 0);\r
+                       if(strText.GetLength() > nLength)\r
+                       {\r
+                               _XData data = { ddxDataText };\r
+                               data.textData.nLength = strText.GetLength();\r
+                               data.textData.nMaxLength = nLength;\r
+                               pT->OnDataValidateError(nID, bSave, data);\r
+                               bSuccess = FALSE;\r
+                       }\r
+               }\r
+               return bSuccess;\r
+       }\r
+#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)\r
+\r
+// Numeric exchange\r
+       template <class Type>\r
+       BOOL DDX_Int(UINT nID, Type& nVal, BOOL bSigned, BOOL bSave, BOOL bValidate = FALSE, Type nMin = 0, Type nMax = 0)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               BOOL bSuccess = TRUE;\r
+\r
+               if(bSave)\r
+               {\r
+                       nVal = (Type)pT->GetDlgItemInt(nID, &bSuccess, bSigned);\r
+               }\r
+               else\r
+               {\r
+                       ATLASSERT(!bValidate || nVal >= nMin && nVal <= nMax);\r
+                       bSuccess = pT->SetDlgItemInt(nID, nVal, bSigned);\r
+               }\r
+\r
+               if(!bSuccess)\r
+               {\r
+                       pT->OnDataExchangeError(nID, bSave);\r
+               }\r
+               else if(bSave && bValidate)   // validation\r
+               {\r
+                       ATLASSERT(nMin != nMax);\r
+                       if(nVal < nMin || nVal > nMax)\r
+                       {\r
+                               _XData data = { ddxDataInt };\r
+                               data.intData.nVal = (long)nVal;\r
+                               data.intData.nMin = (long)nMin;\r
+                               data.intData.nMax = (long)nMax;\r
+                               pT->OnDataValidateError(nID, bSave, data);\r
+                               bSuccess = FALSE;\r
+                       }\r
+               }\r
+               return bSuccess;\r
+       }\r
+\r
+// Float exchange\r
+#ifdef _ATL_USE_DDX_FLOAT\r
+       static BOOL _AtlSimpleFloatParse(LPCTSTR lpszText, double& d)\r
+       {\r
+               ATLASSERT(lpszText != NULL);\r
+               while (*lpszText == _T(' ') || *lpszText == _T('\t'))\r
+                       lpszText++;\r
+\r
+               TCHAR chFirst = lpszText[0];\r
+               d = _tcstod(lpszText, (LPTSTR*)&lpszText);\r
+               if (d == 0.0 && chFirst != _T('0'))\r
+                       return FALSE;   // could not convert\r
+               while (*lpszText == _T(' ') || *lpszText == _T('\t'))\r
+                       lpszText++;\r
+\r
+               if (*lpszText != _T('\0'))\r
+                       return FALSE;   // not terminated properly\r
+\r
+               return TRUE;\r
+       }\r
+\r
+       BOOL DDX_Float(UINT nID, float& nVal, BOOL bSave, BOOL bValidate = FALSE, float nMin = 0.F, float nMax = 0.F, int nPrecision = FLT_DIG)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               BOOL bSuccess = TRUE;\r
+               const int cchBuff = 32;\r
+               TCHAR szBuff[cchBuff] = { 0 };\r
+\r
+               if(bSave)\r
+               {\r
+                       pT->GetDlgItemText(nID, szBuff, cchBuff);\r
+                       double d = 0;\r
+                       if(_AtlSimpleFloatParse(szBuff, d))\r
+                               nVal = (float)d;\r
+                       else\r
+                               bSuccess = FALSE;\r
+               }\r
+               else\r
+               {\r
+                       ATLASSERT(!bValidate || nVal >= nMin && nVal <= nMax);\r
+                       SecureHelper::sprintf_x(szBuff, cchBuff, _T("%.*g"), nPrecision, nVal);\r
+                       bSuccess = pT->SetDlgItemText(nID, szBuff);\r
+               }\r
+\r
+               if(!bSuccess)\r
+               {\r
+                       pT->OnDataExchangeError(nID, bSave);\r
+               }\r
+               else if(bSave && bValidate)   // validation\r
+               {\r
+                       ATLASSERT(nMin != nMax);\r
+                       if(nVal < nMin || nVal > nMax)\r
+                       {\r
+                               _XData data = { ddxDataFloat };\r
+                               data.floatData.nVal = (double)nVal;\r
+                               data.floatData.nMin = (double)nMin;\r
+                               data.floatData.nMax = (double)nMax;\r
+                               pT->OnDataValidateError(nID, bSave, data);\r
+                               bSuccess = FALSE;\r
+                       }\r
+               }\r
+               return bSuccess;\r
+       }\r
+\r
+       BOOL DDX_Float(UINT nID, double& nVal, BOOL bSave, BOOL bValidate = FALSE, double nMin = 0., double nMax = 0., int nPrecision = DBL_DIG)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               BOOL bSuccess = TRUE;\r
+               const int cchBuff = 32;\r
+               TCHAR szBuff[cchBuff] = { 0 };\r
+\r
+               if(bSave)\r
+               {\r
+                       pT->GetDlgItemText(nID, szBuff, cchBuff);\r
+                       double d = 0;\r
+                       if(_AtlSimpleFloatParse(szBuff, d))\r
+                               nVal = d;\r
+                       else\r
+                               bSuccess = FALSE;\r
+               }\r
+               else\r
+               {\r
+                       ATLASSERT(!bValidate || nVal >= nMin && nVal <= nMax);\r
+                       SecureHelper::sprintf_x(szBuff, cchBuff, _T("%.*g"), nPrecision, nVal);\r
+                       bSuccess = pT->SetDlgItemText(nID, szBuff);\r
+               }\r
+\r
+               if(!bSuccess)\r
+               {\r
+                       pT->OnDataExchangeError(nID, bSave);\r
+               }\r
+               else if(bSave && bValidate)   // validation\r
+               {\r
+                       ATLASSERT(nMin != nMax);\r
+                       if(nVal < nMin || nVal > nMax)\r
+                       {\r
+                               _XData data = { ddxDataFloat };\r
+                               data.floatData.nVal = nVal;\r
+                               data.floatData.nMin = nMin;\r
+                               data.floatData.nMax = nMax;\r
+                               pT->OnDataValidateError(nID, bSave, data);\r
+                               bSuccess = FALSE;\r
+                       }\r
+               }\r
+               return bSuccess;\r
+       }\r
+#endif // _ATL_USE_DDX_FLOAT\r
+\r
+// Full control subclassing (for CWindowImpl derived controls)\r
+       template <class TControl>\r
+       void DDX_Control(UINT nID, TControl& ctrl, BOOL bSave)\r
+       {\r
+               if(!bSave && ctrl.m_hWnd == NULL)\r
+               {\r
+                       T* pT = static_cast<T*>(this);\r
+                       ctrl.SubclassWindow(pT->GetDlgItem(nID));\r
+               }\r
+       }\r
+\r
+// Simple control attaching (for HWND wrapper controls)\r
+       template <class TControl>\r
+       void DDX_Control_Handle(UINT nID, TControl& ctrl, BOOL bSave)\r
+       {\r
+               if(!bSave && ctrl.m_hWnd == NULL)\r
+               {\r
+                       T* pT = static_cast<T*>(this);\r
+                       ctrl = pT->GetDlgItem(nID);\r
+               }\r
+       }\r
+\r
+// Control state\r
+       void DDX_Check(UINT nID, int& nValue, BOOL bSave)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               HWND hWndCtrl = pT->GetDlgItem(nID);\r
+               if(bSave)\r
+               {\r
+                       nValue = (int)::SendMessage(hWndCtrl, BM_GETCHECK, 0, 0L);\r
+                       ATLASSERT(nValue >= 0 && nValue <= 2);\r
+               }\r
+               else\r
+               {\r
+                       if(nValue < 0 || nValue > 2)\r
+                       {\r
+                               ATLTRACE2(atlTraceUI, 0, _T("ATL: Warning - dialog data checkbox value (%d) out of range.\n"), nValue);\r
+                               nValue = 0;  // default to off\r
+                       }\r
+                       ::SendMessage(hWndCtrl, BM_SETCHECK, nValue, 0L);\r
+               }\r
+       }\r
+\r
+       // variant that supports bool (checked/not-checked, no intermediate state)\r
+       void DDX_Check(UINT nID, bool& bCheck, BOOL bSave)\r
+       {\r
+               int nValue = bCheck ? 1 : 0;\r
+               DDX_Check(nID, nValue, bSave);\r
+\r
+               if(bSave)\r
+               {\r
+                       if(nValue == 2)\r
+                               ATLTRACE2(atlTraceUI, 0, _T("ATL: Warning - checkbox state (%d) out of supported range.\n"), nValue);\r
+                       bCheck = (nValue == 1);\r
+               }\r
+       }\r
+\r
+       void DDX_Radio(UINT nID, int& nValue, BOOL bSave)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               HWND hWndCtrl = pT->GetDlgItem(nID);\r
+               ATLASSERT(hWndCtrl != NULL);\r
+\r
+               // must be first in a group of auto radio buttons\r
+               ATLASSERT(::GetWindowLong(hWndCtrl, GWL_STYLE) & WS_GROUP);\r
+               ATLASSERT(::SendMessage(hWndCtrl, WM_GETDLGCODE, 0, 0L) & DLGC_RADIOBUTTON);\r
+\r
+               if(bSave)\r
+                       nValue = -1;     // value if none found\r
+\r
+               // walk all children in group\r
+               int nButton = 0;\r
+               do\r
+               {\r
+                       if(::SendMessage(hWndCtrl, WM_GETDLGCODE, 0, 0L) & DLGC_RADIOBUTTON)\r
+                       {\r
+                               // control in group is a radio button\r
+                               if(bSave)\r
+                               {\r
+                                       if(::SendMessage(hWndCtrl, BM_GETCHECK, 0, 0L) != 0)\r
+                                       {\r
+                                               ATLASSERT(nValue == -1);    // only set once\r
+                                               nValue = nButton;\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       // select button\r
+                                       ::SendMessage(hWndCtrl, BM_SETCHECK, (nButton == nValue), 0L);\r
+                               }\r
+                               nButton++;\r
+                       }\r
+                       else\r
+                       {\r
+                               ATLTRACE2(atlTraceUI, 0, _T("ATL: Warning - skipping non-radio button in group.\n"));\r
+                       }\r
+                       hWndCtrl = ::GetWindow(hWndCtrl, GW_HWNDNEXT);\r
+               }\r
+               while (hWndCtrl != NULL && !(GetWindowLong(hWndCtrl, GWL_STYLE) & WS_GROUP));\r
+       }\r
+\r
+// Overrideables\r
+       void OnDataExchangeError(UINT nCtrlID, BOOL /*bSave*/)\r
+       {\r
+               // Override to display an error message\r
+               ::MessageBeep((UINT)-1);\r
+               T* pT = static_cast<T*>(this);\r
+               ::SetFocus(pT->GetDlgItem(nCtrlID));\r
+       }\r
+\r
+       void OnDataValidateError(UINT nCtrlID, BOOL /*bSave*/, _XData& /*data*/)\r
+       {\r
+               // Override to display an error message\r
+               ::MessageBeep((UINT)-1);\r
+               T* pT = static_cast<T*>(this);\r
+               ::SetFocus(pT->GetDlgItem(nCtrlID));\r
+       }\r
+};\r
+\r
+}; // namespace WTL\r
+\r
+#endif // __ATLDDX_H__\r
diff --git a/WTL80/include/atldlgs.h b/WTL80/include/atldlgs.h
new file mode 100644 (file)
index 0000000..c0fd568
--- /dev/null
@@ -0,0 +1,6212 @@
+// Windows Template Library - WTL version 8.0\r
+// Copyright (C) Microsoft Corporation. All rights reserved.\r
+//\r
+// This file is a part of the Windows Template Library.\r
+// The use and distribution terms for this software are covered by the\r
+// Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php)\r
+// which can be found in the file CPL.TXT at the root of this distribution.\r
+// By using this software in any fashion, you are agreeing to be bound by\r
+// the terms of this license. You must not remove this notice, or\r
+// any other, from this software.\r
+\r
+#ifndef __ATLDLGS_H__\r
+#define __ATLDLGS_H__\r
+\r
+#pragma once\r
+\r
+#ifndef __cplusplus\r
+       #error ATL requires C++ compilation (use a .cpp suffix)\r
+#endif\r
+\r
+#ifndef __ATLAPP_H__\r
+       #error atldlgs.h requires atlapp.h to be included first\r
+#endif\r
+\r
+#ifndef __ATLWIN_H__\r
+       #error atldlgs.h requires atlwin.h to be included first\r
+#endif\r
+\r
+#include <commdlg.h>\r
+#include <shlobj.h>\r
+\r
+#if (_WIN32_WINNT >= 0x0600) && !defined(_WIN32_WCE)\r
+  #include <shobjidl.h>\r
+#endif // (_WIN32_WINNT >= 0x0600) && !defined(_WIN32_WCE)\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Classes in this file:\r
+//\r
+// CFileDialogImpl<T>\r
+// CFileDialog\r
+// CFileDialogEx\r
+// CMultiFileDialogImpl<T>\r
+// CMultiFileDialog\r
+// CShellFileDialogImpl<T>\r
+// CShellFileOpenDialogImpl<T>\r
+// CShellFileOpenDialog\r
+// CShellFileSaveDialogImpl<T>\r
+// CShellFileSaveDialog\r
+// CFolderDialogImpl<T>\r
+// CFolderDialog\r
+// CFontDialogImpl<T>\r
+// CFontDialog\r
+// CRichEditFontDialogImpl<T>\r
+// CRichEditFontDialog\r
+// CColorDialogImpl<T>\r
+// CColorDialog\r
+// CPrintDialogImpl<T>\r
+// CPrintDialog\r
+// CPrintDialogExImpl<T>\r
+// CPrintDialogEx\r
+// CPageSetupDialogImpl<T>\r
+// CPageSetupDialog\r
+// CFindReplaceDialogImpl<T>\r
+// CFindReplaceDialog\r
+//\r
+// CMemDlgTemplate\r
+// CIndirectDialogImpl<T, TDlgTemplate, TBase>\r
+//\r
+// CPropertySheetWindow\r
+// CPropertySheetImpl<T, TBase>\r
+// CPropertySheet\r
+// CPropertyPageWindow\r
+// CPropertyPageImpl<T, TBase>\r
+// CPropertyPage<t_wDlgTemplateID>\r
+// CAxPropertyPageImpl<T, TBase>\r
+// CAxPropertyPage<t_wDlgTemplateID>\r
+//\r
+// CWizard97SheetWindow\r
+// CWizard97SheetImpl<T, TBase>\r
+// CWizard97Sheet\r
+// CWizard97PageWindow\r
+// CWizard97PageImpl<T, TBase>\r
+// CWizard97ExteriorPageImpl<T, TBase>\r
+// CWizard97InteriorPageImpl<T, TBase>\r
+//\r
+// CAeroWizardFrameWindow\r
+// CAeroWizardFrameImpl<T, TBase>\r
+// CAeroWizardFrame\r
+// CAeroWizardPageWindow\r
+// CAeroWizardPageImpl<T, TBase>\r
+// CAeroWizardPage<t_wDlgTemplateID>\r
+// CAeroWizardAxPageImpl<T, TBase>\r
+// CAeroWizardAxPage<t_wDlgTemplateID>\r
+//\r
+// CTaskDialogConfig\r
+// CTaskDialogImpl<T>\r
+// CTaskDialog\r
+//\r
+// Global functions:\r
+//   AtlTaskDialog()\r
+\r
+\r
+namespace WTL\r
+{\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CFileDialogImpl - used for File Open or File Save As\r
+\r
+// compatibility with the old (vc6.0) headers\r
+#if (_WIN32_WINNT >= 0x0500) && !defined(OPENFILENAME_SIZE_VERSION_400)\r
+  #ifndef CDSIZEOF_STRUCT\r
+    #define CDSIZEOF_STRUCT(structname, member)  (((int)((LPBYTE)(&((structname*)0)->member) - ((LPBYTE)((structname*)0)))) + sizeof(((structname*)0)->member))\r
+  #endif\r
+  #define OPENFILENAME_SIZE_VERSION_400A  CDSIZEOF_STRUCT(OPENFILENAMEA,lpTemplateName)\r
+  #define OPENFILENAME_SIZE_VERSION_400W  CDSIZEOF_STRUCT(OPENFILENAMEW,lpTemplateName)\r
+  #ifdef UNICODE\r
+    #define OPENFILENAME_SIZE_VERSION_400  OPENFILENAME_SIZE_VERSION_400W\r
+  #else\r
+    #define OPENFILENAME_SIZE_VERSION_400  OPENFILENAME_SIZE_VERSION_400A\r
+  #endif // !UNICODE\r
+#endif // (_WIN32_WINNT >= 0x0500) && !defined(OPENFILENAME_SIZE_VERSION_400)\r
+\r
+#if !defined(_WIN32_WCE) && !defined(CDN_INCLUDEITEM)\r
+  #define CDN_INCLUDEITEM         (CDN_FIRST - 0x0007)\r
+#endif\r
+\r
+template <class T>\r
+class ATL_NO_VTABLE CFileDialogImpl : public ATL::CDialogImplBase\r
+{\r
+public:\r
+#if defined(__AYGSHELL_H__) && (_WIN32_WCE >= 0x0501)\r
+       OPENFILENAMEEX m_ofn;\r
+#else\r
+       OPENFILENAME m_ofn;\r
+#endif\r
+       BOOL m_bOpenFileDialog;            // TRUE for file open, FALSE for file save\r
+       TCHAR m_szFileTitle[_MAX_FNAME];   // contains file title after return\r
+       TCHAR m_szFileName[_MAX_PATH];     // contains full path name after return\r
+\r
+       CFileDialogImpl(BOOL bOpenFileDialog, // TRUE for FileOpen, FALSE for FileSaveAs\r
+                       LPCTSTR lpszDefExt = NULL,\r
+                       LPCTSTR lpszFileName = NULL,\r
+                       DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,\r
+                       LPCTSTR lpszFilter = NULL,\r
+                       HWND hWndParent = NULL)\r
+       {\r
+               memset(&m_ofn, 0, sizeof(m_ofn)); // initialize structure to 0/NULL\r
+               m_szFileName[0] = _T('\0');\r
+               m_szFileTitle[0] = _T('\0');\r
+\r
+               m_bOpenFileDialog = bOpenFileDialog;\r
+\r
+               m_ofn.lStructSize = sizeof(m_ofn);\r
+#if (_WIN32_WINNT >= 0x0500)\r
+               // adjust struct size if running on older version of Windows\r
+               if(AtlIsOldWindows())\r
+               {\r
+                       ATLASSERT(sizeof(m_ofn) > OPENFILENAME_SIZE_VERSION_400);   // must be\r
+                       m_ofn.lStructSize = OPENFILENAME_SIZE_VERSION_400;\r
+               }\r
+#endif // (_WIN32_WINNT >= 0x0500)\r
+               m_ofn.lpstrFile = m_szFileName;\r
+               m_ofn.nMaxFile = _MAX_PATH;\r
+               m_ofn.lpstrDefExt = lpszDefExt;\r
+               m_ofn.lpstrFileTitle = (LPTSTR)m_szFileTitle;\r
+               m_ofn.nMaxFileTitle = _MAX_FNAME;\r
+#ifndef _WIN32_WCE\r
+               m_ofn.Flags = dwFlags | OFN_EXPLORER | OFN_ENABLEHOOK | OFN_ENABLESIZING;\r
+#else // CE specific\r
+               m_ofn.Flags = dwFlags | OFN_EXPLORER | OFN_ENABLEHOOK;\r
+#endif // !_WIN32_WCE\r
+               m_ofn.lpstrFilter = lpszFilter;\r
+               m_ofn.hInstance = ModuleHelper::GetResourceInstance();\r
+               m_ofn.lpfnHook = (LPOFNHOOKPROC)T::StartDialogProc;\r
+               m_ofn.hwndOwner = hWndParent;\r
+\r
+               // setup initial file name\r
+               if(lpszFileName != NULL)\r
+               SecureHelper::strncpy_x(m_szFileName, _countof(m_szFileName), lpszFileName, _TRUNCATE);\r
+       }\r
+\r
+       INT_PTR DoModal(HWND hWndParent = ::GetActiveWindow())\r
+       {\r
+               ATLASSERT((m_ofn.Flags & OFN_ENABLEHOOK) != 0);\r
+               ATLASSERT(m_ofn.lpfnHook != NULL);   // can still be a user hook\r
+\r
+               ATLASSERT((m_ofn.Flags & OFN_EXPLORER) != 0);\r
+\r
+               if(m_ofn.hwndOwner == NULL)   // set only if not specified before\r
+                       m_ofn.hwndOwner = hWndParent;\r
+\r
+               ATLASSERT(m_hWnd == NULL);\r
+               ModuleHelper::AddCreateWndData(&m_thunk.cd, (ATL::CDialogImplBase*)this);\r
+\r
+               BOOL bRet;\r
+               if(m_bOpenFileDialog)\r
+#if defined(__AYGSHELL_H__) && (_WIN32_WCE >= 0x0501)\r
+                       bRet = ::GetOpenFileNameEx(&m_ofn);\r
+               else\r
+                       bRet = ::GetSaveFileName((LPOPENFILENAME)&m_ofn);\r
+#else\r
+                       bRet = ::GetOpenFileName(&m_ofn);\r
+               else\r
+                       bRet = ::GetSaveFileName(&m_ofn);\r
+#endif\r
+\r
+               m_hWnd = NULL;\r
+\r
+               return bRet ? IDOK : IDCANCEL;\r
+       }\r
+\r
+// Attributes\r
+       ATL::CWindow GetFileDialogWindow() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return ATL::CWindow(GetParent());\r
+       }\r
+\r
+       int GetFilePath(LPTSTR lpstrFilePath, int nLength) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT((m_ofn.Flags & OFN_EXPLORER) != 0);\r
+\r
+               return (int)GetFileDialogWindow().SendMessage(CDM_GETFILEPATH, nLength, (LPARAM)lpstrFilePath);\r
+       }\r
+\r
+       int GetFolderIDList(LPVOID lpBuff, int nLength) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT((m_ofn.Flags & OFN_EXPLORER) != 0);\r
+\r
+               return (int)GetFileDialogWindow().SendMessage(CDM_GETFOLDERIDLIST, nLength, (LPARAM)lpBuff);\r
+       }\r
+\r
+       int GetFolderPath(LPTSTR lpstrFolderPath, int nLength) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT((m_ofn.Flags & OFN_EXPLORER) != 0);\r
+\r
+               return (int)GetFileDialogWindow().SendMessage(CDM_GETFOLDERPATH, nLength, (LPARAM)lpstrFolderPath);\r
+       }\r
+\r
+       int GetSpec(LPTSTR lpstrSpec, int nLength) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT((m_ofn.Flags & OFN_EXPLORER) != 0);\r
+\r
+               return (int)GetFileDialogWindow().SendMessage(CDM_GETSPEC, nLength, (LPARAM)lpstrSpec);\r
+       }\r
+\r
+       void SetControlText(int nCtrlID, LPCTSTR lpstrText)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT((m_ofn.Flags & OFN_EXPLORER) != 0);\r
+\r
+               GetFileDialogWindow().SendMessage(CDM_SETCONTROLTEXT, nCtrlID, (LPARAM)lpstrText);\r
+       }\r
+\r
+       void SetDefExt(LPCTSTR lpstrExt)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT((m_ofn.Flags & OFN_EXPLORER) != 0);\r
+\r
+               GetFileDialogWindow().SendMessage(CDM_SETDEFEXT, 0, (LPARAM)lpstrExt);\r
+       }\r
+\r
+       BOOL GetReadOnlyPref() const    // return TRUE if readonly checked\r
+       {\r
+               return ((m_ofn.Flags & OFN_READONLY) != 0) ? TRUE : FALSE;\r
+       }\r
+\r
+// Operations\r
+       void HideControl(int nCtrlID)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT((m_ofn.Flags & OFN_EXPLORER) != 0);\r
+\r
+               GetFileDialogWindow().SendMessage(CDM_HIDECONTROL, nCtrlID);\r
+       }\r
+\r
+// Special override for common dialogs\r
+       BOOL EndDialog(INT_PTR /*nRetCode*/ = 0)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               GetFileDialogWindow().SendMessage(WM_COMMAND, MAKEWPARAM(IDCANCEL, 0));\r
+               return TRUE;\r
+       }\r
+\r
+// Message map and handlers\r
+       BEGIN_MSG_MAP(CFileDialogImpl)\r
+               NOTIFY_CODE_HANDLER(CDN_FILEOK, _OnFileOK)\r
+               NOTIFY_CODE_HANDLER(CDN_FOLDERCHANGE, _OnFolderChange)\r
+               NOTIFY_CODE_HANDLER(CDN_HELP, _OnHelp)\r
+               NOTIFY_CODE_HANDLER(CDN_INITDONE, _OnInitDone)\r
+               NOTIFY_CODE_HANDLER(CDN_SELCHANGE, _OnSelChange)\r
+               NOTIFY_CODE_HANDLER(CDN_SHAREVIOLATION, _OnShareViolation)\r
+               NOTIFY_CODE_HANDLER(CDN_TYPECHANGE, _OnTypeChange)\r
+#ifndef _WIN32_WCE\r
+               NOTIFY_CODE_HANDLER(CDN_INCLUDEITEM, _OnIncludeItem)\r
+#endif // !_WIN32_WCE\r
+       END_MSG_MAP()\r
+\r
+       LRESULT _OnFileOK(int /*idCtrl*/, LPNMHDR pnmh, BOOL& /*bHandled*/)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               T* pT = static_cast<T*>(this);\r
+               return !pT->OnFileOK((LPOFNOTIFY)pnmh);\r
+       }\r
+\r
+       LRESULT _OnFolderChange(int /*idCtrl*/, LPNMHDR pnmh, BOOL& /*bHandled*/)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               T* pT = static_cast<T*>(this);\r
+               pT->OnFolderChange((LPOFNOTIFY)pnmh);\r
+               return 0;\r
+       }\r
+\r
+       LRESULT _OnHelp(int /*idCtrl*/, LPNMHDR pnmh, BOOL& /*bHandled*/)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               T* pT = static_cast<T*>(this);\r
+               pT->OnHelp((LPOFNOTIFY)pnmh);\r
+               return 0;\r
+       }\r
+\r
+       LRESULT _OnInitDone(int /*idCtrl*/, LPNMHDR pnmh, BOOL& /*bHandled*/)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               T* pT = static_cast<T*>(this);\r
+               pT->OnInitDone((LPOFNOTIFY)pnmh);\r
+               return 0;\r
+       }\r
+\r
+       LRESULT _OnSelChange(int /*idCtrl*/, LPNMHDR pnmh, BOOL& /*bHandled*/)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               T* pT = static_cast<T*>(this);\r
+               pT->OnSelChange((LPOFNOTIFY)pnmh);\r
+               return 0;\r
+       }\r
+\r
+       LRESULT _OnShareViolation(int /*idCtrl*/, LPNMHDR pnmh, BOOL& /*bHandled*/)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               T* pT = static_cast<T*>(this);\r
+               return pT->OnShareViolation((LPOFNOTIFY)pnmh);\r
+       }\r
+\r
+       LRESULT _OnTypeChange(int /*idCtrl*/, LPNMHDR pnmh, BOOL& /*bHandled*/)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               T* pT = static_cast<T*>(this);\r
+               pT->OnTypeChange((LPOFNOTIFY)pnmh);\r
+               return 0;\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       LRESULT _OnIncludeItem(int /*idCtrl*/, LPNMHDR pnmh, BOOL& /*bHandled*/)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               T* pT = static_cast<T*>(this);\r
+               return pT->OnIncludeItem((LPOFNOTIFYEX)pnmh);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+// Overrideables\r
+       BOOL OnFileOK(LPOFNOTIFY /*lpon*/)\r
+       {\r
+               return TRUE;\r
+       }\r
+\r
+       void OnFolderChange(LPOFNOTIFY /*lpon*/)\r
+       {\r
+       }\r
+\r
+       void OnHelp(LPOFNOTIFY /*lpon*/)\r
+       {\r
+       }\r
+\r
+       void OnInitDone(LPOFNOTIFY /*lpon*/)\r
+       {\r
+       }\r
+\r
+       void OnSelChange(LPOFNOTIFY /*lpon*/)\r
+       {\r
+       }\r
+\r
+       int OnShareViolation(LPOFNOTIFY /*lpon*/)\r
+       {\r
+               return 0;\r
+       }\r
+\r
+       void OnTypeChange(LPOFNOTIFY /*lpon*/)\r
+       {\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       BOOL OnIncludeItem(LPOFNOTIFYEX /*lponex*/)\r
+       {\r
+               return TRUE;   // include item\r
+       }\r
+#endif // !_WIN32_WCE\r
+};\r
+\r
+class CFileDialog : public CFileDialogImpl<CFileDialog>\r
+{\r
+public:\r
+       CFileDialog(BOOL bOpenFileDialog, // TRUE for FileOpen, FALSE for FileSaveAs\r
+               LPCTSTR lpszDefExt = NULL,\r
+               LPCTSTR lpszFileName = NULL,\r
+               DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,\r
+               LPCTSTR lpszFilter = NULL,\r
+               HWND hWndParent = NULL)\r
+               : CFileDialogImpl<CFileDialog>(bOpenFileDialog, lpszDefExt, lpszFileName, dwFlags, lpszFilter, hWndParent)\r
+       { }\r
+\r
+       // override base class map and references to handlers\r
+       DECLARE_EMPTY_MSG_MAP()\r
+};\r
+\r
+#if defined(__AYGSHELL_H__) && (_WIN32_WCE >= 0x0501)\r
+class CFileDialogEx : public CFileDialogImpl<CFileDialogEx>\r
+{\r
+public:\r
+       CFileDialogEx( // Supports only FileOpen\r
+               LPCTSTR lpszDefExt = NULL,\r
+               LPCTSTR lpszFileName = NULL,\r
+               DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,\r
+               OFN_EXFLAG ExFlags = OFN_EXFLAG_THUMBNAILVIEW,\r
+               OFN_SORTORDER dwSortOrder = OFN_SORTORDER_AUTO,         \r
+               LPCTSTR lpszFilter = NULL,\r
+               HWND hWndParent = NULL)\r
+               : CFileDialogImpl<CFileDialogEx>(TRUE, lpszDefExt, lpszFileName, dwFlags, lpszFilter, hWndParent)\r
+       {\r
+               m_ofn.ExFlags = ExFlags;\r
+               m_ofn.dwSortOrder = dwSortOrder;\r
+       }\r
+\r
+       // override base class map and references to handlers\r
+       DECLARE_EMPTY_MSG_MAP()\r
+};\r
+#endif // defined(__AYGSHELL_H__) && (_WIN32_WCE >= 0x0501)\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Multi File Dialog - Multi-select File Open dialog\r
+\r
+#ifndef _WIN32_WCE\r
+\r
+// The class dynamically resizes the buffer as the file selection changes\r
+// (as described in Knowledge Base article 131462). It also expands selected\r
+// shortcut files to take into account the full path of the target file.\r
+// Note that this doesn't work on Win9x for the old style dialogs, as well as\r
+// on NT for non-Unicode builds. \r
+\r
+#ifndef _WTL_FIXED_OFN_BUFFER_LENGTH\r
+  #define _WTL_FIXED_OFN_BUFFER_LENGTH 0x10000\r
+#endif\r
+\r
+template <class T>\r
+class ATL_NO_VTABLE CMultiFileDialogImpl : public CFileDialogImpl< T >\r
+{\r
+public:\r
+       mutable LPCTSTR m_pNextFile; \r
+#ifndef _UNICODE\r
+       bool m_bIsNT;\r
+#endif\r
+\r
+       CMultiFileDialogImpl(\r
+               LPCTSTR lpszDefExt = NULL,\r
+               LPCTSTR lpszFileName = NULL,\r
+               DWORD dwFlags = OFN_HIDEREADONLY,\r
+               LPCTSTR lpszFilter = NULL,\r
+               HWND hWndParent = NULL)\r
+               : CFileDialogImpl<T>(TRUE, lpszDefExt, lpszFileName, dwFlags, lpszFilter, hWndParent), \r
+                 m_pNextFile(NULL)\r
+       {\r
+               m_ofn.Flags |= OFN_ALLOWMULTISELECT;   // Force multiple selection mode\r
+\r
+#ifndef _UNICODE\r
+               OSVERSIONINFO ovi = { sizeof(ovi) };\r
+               ::GetVersionEx(&ovi);\r
+               m_bIsNT = (ovi.dwPlatformId == VER_PLATFORM_WIN32_NT);\r
+               if (m_bIsNT)\r
+               {\r
+                       // On NT platforms, GetOpenFileNameA thunks to GetOpenFileNameW and there \r
+                       // is absolutely nothing we can do except to start off with a large buffer.\r
+                       ATLVERIFY(ResizeFilenameBuffer(_WTL_FIXED_OFN_BUFFER_LENGTH));\r
+               }\r
+#endif\r
+       }\r
+\r
+       ~CMultiFileDialogImpl()\r
+       {\r
+               if (m_ofn.lpstrFile != m_szFileName)   // Free the buffer if we allocated it\r
+                       delete[] m_ofn.lpstrFile;\r
+       }\r
+\r
+// Operations\r
+       // Get the directory that the files were chosen from.\r
+       // The function returns the number of characters copied, not including the terminating zero. \r
+       // If the buffer is NULL, the function returns the required size, in characters, including the terminating zero.\r
+       // If the function fails, the return value is zero.\r
+       int GetDirectory(LPTSTR pBuffer, int nBufLen) const\r
+       {\r
+               if (m_ofn.lpstrFile == NULL)\r
+                       return 0;\r
+\r
+               LPCTSTR pStr = m_ofn.lpstrFile;\r
+               int nLength = lstrlen(pStr);\r
+               if (pStr[nLength + 1] == 0)\r
+               {\r
+                       // The OFN buffer contains a single item so extract its path.\r
+                       LPCTSTR pSep = _strrchr(pStr, _T('\\'));\r
+                       if (pSep != NULL)\r
+                               nLength = (int)(DWORD_PTR)(pSep - pStr);\r
+               }\r
+\r
+               int nRet = 0;\r
+               if (pBuffer == NULL)   // If the buffer is NULL, return the required length\r
+               {\r
+                       nRet = nLength + 1;\r
+               }\r
+               else if (nBufLen > nLength)\r
+               {\r
+                       SecureHelper::strncpy_x(pBuffer, nBufLen, pStr, nLength);\r
+                       nRet = nLength;\r
+               }\r
+\r
+               return nRet;\r
+       }\r
+\r
+#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)\r
+       bool GetDirectory(_CSTRING_NS::CString& strDir) const\r
+       {\r
+               bool bRet = false;\r
+\r
+               int nLength = GetDirectory(NULL, 0);\r
+               if (nLength > 0)\r
+               {\r
+                       bRet = (GetDirectory(strDir.GetBuffer(nLength), nLength) > 0);\r
+                       strDir.ReleaseBuffer(nLength - 1);\r
+               }\r
+\r
+               return bRet;\r
+       }\r
+#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)\r
+\r
+       // Get the first filename as a pointer into the buffer.\r
+       LPCTSTR GetFirstFileName() const\r
+       {\r
+               if (m_ofn.lpstrFile == NULL)\r
+                       return NULL;\r
+\r
+               m_pNextFile = NULL;   // Reset internal buffer pointer\r
+\r
+               LPCTSTR pStr = m_ofn.lpstrFile;\r
+               int nLength = lstrlen(pStr);\r
+               if (pStr[nLength + 1] != 0)\r
+               {\r
+                       // Multiple items were selected. The first string is the directory,\r
+                       // so skip forwards to the second string.\r
+                       pStr += nLength + 1;\r
+\r
+                       // Set up m_pNext so it points to the second item (or null).\r
+                       m_pNextFile = pStr;\r
+                       GetNextFileName();\r
+               }\r
+               else\r
+               {\r
+                       // A single item was selected. Skip forward past the path.\r
+                       LPCTSTR pSep = _strrchr(pStr, _T('\\'));\r
+                       if (pSep != NULL)\r
+                               pStr = pSep + 1;\r
+               }\r
+\r
+               return pStr;\r
+       }\r
+\r
+       // Get the next filename as a pointer into the buffer.\r
+       LPCTSTR GetNextFileName() const\r
+       {\r
+               if (m_pNextFile == NULL)\r
+                       return NULL;\r
+\r
+               LPCTSTR pStr = m_pNextFile;\r
+               // Set "m_pNextFile" to point to the next file name, or null if we \r
+               // have reached the last file in the list.\r
+               int nLength = lstrlen(pStr);\r
+               m_pNextFile = (pStr[nLength + 1] != 0) ? &pStr[nLength + 1] : NULL;\r
+\r
+               return pStr;\r
+       }\r
+\r
+       // Get the first filename as a full path.\r
+       // The function returns the number of characters copied, not including the terminating zero. \r
+       // If the buffer is NULL, the function returns the required size, in characters, including the terminating zero.\r
+       // If the function fails, the return value is zero.\r
+       int GetFirstPathName(LPTSTR pBuffer, int nBufLen) const\r
+       {\r
+               LPCTSTR pStr = GetFirstFileName();\r
+               int nLengthDir = GetDirectory(NULL, 0);\r
+               if((pStr == NULL) || (nLengthDir == 0))\r
+                       return 0;\r
+\r
+               // Figure out the required length.\r
+               int nLengthTotal = nLengthDir + lstrlen(pStr);\r
+\r
+               int nRet = 0;\r
+               if(pBuffer == NULL) // If the buffer is NULL, return the required length\r
+               {\r
+                       nRet = nLengthTotal + 1;\r
+               }\r
+               else if (nBufLen > nLengthTotal) // If the buffer is big enough, go ahead and construct the path\r
+               {               \r
+                       GetDirectory(pBuffer, nBufLen);\r
+                       SecureHelper::strcat_x(pBuffer, nBufLen, _T("\\"));\r
+                       SecureHelper::strcat_x(pBuffer, nBufLen, pStr);\r
+                       nRet = nLengthTotal;\r
+               }\r
+\r
+               return nRet;\r
+       }\r
+\r
+#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)\r
+       bool GetFirstPathName(_CSTRING_NS::CString& strPath) const\r
+       {\r
+               bool bRet = false;\r
+\r
+               int nLength = GetFirstPathName(NULL, 0);\r
+               if (nLength > 0)\r
+               {\r
+                       bRet = (GetFirstPathName(strPath.GetBuffer(nLength), nLength) > 0);\r
+                       strPath.ReleaseBuffer(nLength - 1);\r
+               }\r
+\r
+               return bRet;\r
+       }\r
+#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)\r
+\r
+       // Get the next filename as a full path.\r
+       // The function returns the number of characters copied, not including the terminating zero. \r
+       // If the buffer is NULL, the function returns the required size, in characters, including the terminating zero.\r
+       // If the function fails, the return value is zero.\r
+       // The internal position marker is moved forward only if the function succeeds and the buffer was large enough.\r
+       int GetNextPathName(LPTSTR pBuffer, int nBufLen) const\r
+       {\r
+               if (m_pNextFile == NULL)\r
+                       return 0;\r
+\r
+               int nRet = 0;\r
+               LPCTSTR pStr = m_pNextFile;\r
+               // Does the filename contain a backslash?\r
+               if (_strrchr(pStr, _T('\\')) != NULL)\r
+               {\r
+                       // Yes, so we'll assume it's a full path.\r
+                       int nLength = lstrlen(pStr);\r
+\r
+                       if (pBuffer == NULL) // If the buffer is NULL, return the required length\r
+                       {\r
+                               nRet = nLength + 1;\r
+                       }\r
+                       else if (nBufLen > nLength) // The buffer is big enough, so go ahead and copy the filename\r
+                       {\r
+                               SecureHelper::strcpy_x(pBuffer, nBufLen, GetNextFileName());\r
+                               nRet = nBufLen;\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       // The filename is relative, so construct the full path.\r
+                       int nLengthDir = GetDirectory(NULL, 0);\r
+                       if (nLengthDir > 0)\r
+                       {\r
+                               // Calculate the required space.\r
+                               int nLengthTotal = nLengthDir + lstrlen(pStr);\r
+\r
+                               if(pBuffer == NULL) // If the buffer is NULL, return the required length\r
+                               {\r
+                                       nRet = nLengthTotal + 1;\r
+                               }\r
+                               else if (nBufLen > nLengthTotal) // If the buffer is big enough, go ahead and construct the path\r
+                               {\r
+                                       GetDirectory(pBuffer, nBufLen);\r
+                                       SecureHelper::strcat_x(pBuffer, nBufLen, _T("\\"));\r
+                                       SecureHelper::strcat_x(pBuffer, nBufLen, GetNextFileName());\r
+                                       nRet = nLengthTotal;\r
+                               }\r
+                       }\r
+               }\r
+\r
+               return nRet;\r
+       }\r
+\r
+#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)\r
+       bool GetNextPathName(_CSTRING_NS::CString& strPath) const\r
+       {\r
+               bool bRet = false;\r
+\r
+               int nLength = GetNextPathName(NULL, 0);\r
+               if (nLength > 0)\r
+               {\r
+                       bRet = (GetNextPathName(strPath.GetBuffer(nLength), nLength) > 0);\r
+                       strPath.ReleaseBuffer(nLength - 1);\r
+               }\r
+\r
+               return bRet;\r
+       }\r
+#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)\r
+\r
+// Implementation\r
+       bool ResizeFilenameBuffer(DWORD dwLength)\r
+       {\r
+               if (dwLength > m_ofn.nMaxFile)\r
+               {\r
+                       // Free the old buffer.\r
+                       if (m_ofn.lpstrFile != m_szFileName)\r
+                       {\r
+                               delete[] m_ofn.lpstrFile;\r
+                               m_ofn.lpstrFile = NULL;\r
+                               m_ofn.nMaxFile = 0;\r
+                       }\r
+\r
+                       // Allocate the new buffer.\r
+                       LPTSTR lpstrBuff = NULL;\r
+                       ATLTRY(lpstrBuff = new TCHAR[dwLength]);\r
+                       if (lpstrBuff != NULL)\r
+                       {\r
+                               m_ofn.lpstrFile = lpstrBuff;\r
+                               m_ofn.lpstrFile[0] = 0;\r
+                               m_ofn.nMaxFile = dwLength;\r
+                       }\r
+               }\r
+\r
+               return (m_ofn.lpstrFile != NULL);\r
+       }\r
+\r
+       void OnSelChange(LPOFNOTIFY /*lpon*/)\r
+       {\r
+#ifndef _UNICODE\r
+               // There is no point resizing the buffer in ANSI builds running on NT.\r
+               if (m_bIsNT)\r
+                       return;\r
+#endif\r
+\r
+               // Get the buffer length required to hold the spec.\r
+               int nLength = GetSpec(NULL, 0);\r
+               if (nLength <= 1)\r
+                       return; // no files are selected, presumably\r
+               \r
+               // Add room for the directory, and an extra terminating zero.\r
+               nLength += GetFolderPath(NULL, 0) + 1;\r
+\r
+               if (!ResizeFilenameBuffer(nLength))\r
+               {\r
+                       ATLASSERT(FALSE);\r
+                       return;\r
+               }\r
+\r
+               // If we are not following links then our work is done.\r
+               if ((m_ofn.Flags & OFN_NODEREFERENCELINKS) != 0)\r
+                       return;\r
+\r
+               // Get the file spec, which is the text in the edit control.\r
+               if (GetSpec(m_ofn.lpstrFile, m_ofn.nMaxFile) <= 0)\r
+                       return;\r
+               \r
+               // Get the ID-list of the current folder.\r
+               int nBytes = GetFolderIDList(NULL, 0);\r
+               CTempBuffer<ITEMIDLIST> idlist;\r
+               idlist.AllocateBytes(nBytes);\r
+               if ((nBytes <= 0) || (GetFolderIDList(idlist, nBytes) <= 0))\r
+                       return;\r
+\r
+               // First bind to the desktop folder, then to the current folder.\r
+               ATL::CComPtr<IShellFolder> pDesktop, pFolder;\r
+               if (FAILED(::SHGetDesktopFolder(&pDesktop)))\r
+                       return;\r
+               if (FAILED(pDesktop->BindToObject(idlist, NULL, IID_IShellFolder, (void**)&pFolder)))\r
+                       return;\r
+\r
+               // Work through the file spec, looking for quoted filenames. If we find a shortcut file, then \r
+               // we need to add enough extra buffer space to hold its target path.\r
+               DWORD nExtraChars = 0;\r
+               bool bInsideQuotes = false;\r
+               LPCTSTR pAnchor = m_ofn.lpstrFile;\r
+               LPCTSTR pChar = m_ofn.lpstrFile;\r
+               for ( ; *pChar; ++pChar)\r
+               {\r
+                       // Look for quotation marks.\r
+                       if (*pChar == _T('\"'))\r
+                       {\r
+                               // We are either entering or leaving a passage of quoted text.\r
+                               bInsideQuotes = !bInsideQuotes;\r
+\r
+                               // Is it an opening or closing quote?\r
+                               if (bInsideQuotes)\r
+                               {\r
+                                       // We found an opening quote, so set "pAnchor" to the following character.\r
+                                       pAnchor = pChar + 1;\r
+                               }\r
+                               else // closing quote\r
+                               {\r
+                                       // Each quoted entity should be shorter than MAX_PATH.\r
+                                       if (pChar - pAnchor >= MAX_PATH)\r
+                                               return;\r
+\r
+                                       // Get the ID-list and attributes of the file.\r
+                                       USES_CONVERSION;\r
+                                       int nFileNameLength = (int)(DWORD_PTR)(pChar - pAnchor);\r
+                                       TCHAR szFileName[MAX_PATH];\r
+                                       SecureHelper::strncpy_x(szFileName, MAX_PATH, pAnchor, nFileNameLength);\r
+                                       LPITEMIDLIST pidl = NULL;\r
+                                       DWORD dwAttrib = SFGAO_LINK;\r
+                                       if (SUCCEEDED(pFolder->ParseDisplayName(NULL, NULL, T2W(szFileName), NULL, &pidl, &dwAttrib)))\r
+                                       {\r
+                                               // Is it a shortcut file?\r
+                                               if (dwAttrib & SFGAO_LINK)\r
+                                               {\r
+                                                       // Bind to its IShellLink interface.\r
+                                                       ATL::CComPtr<IShellLink> pLink;\r
+                                                       if (SUCCEEDED(pFolder->BindToObject(pidl, NULL, IID_IShellLink, (void**)&pLink)))\r
+                                                       {\r
+                                                               // Get the shortcut's target path.\r
+                                                               TCHAR szPath[MAX_PATH];\r
+                                                               if (SUCCEEDED(pLink->GetPath(szPath, MAX_PATH, NULL, 0)))\r
+                                                               {\r
+                                                                       // If the target path is longer than the shortcut name, then add on the number \r
+                                                                       // of extra characters that are required.\r
+                                                                       int nNewLength = lstrlen(szPath);\r
+                                                                       if (nNewLength > nFileNameLength)\r
+                                                                               nExtraChars += nNewLength - nFileNameLength;\r
+                                                               }\r
+                                                       }\r
+                                               }\r
+\r
+                                               // Free the ID-list returned by ParseDisplayName.\r
+                                               ::CoTaskMemFree(pidl);\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+\r
+               // If we need more space for shortcut targets, then reallocate.\r
+               if (nExtraChars > 0)\r
+                       ATLVERIFY(ResizeFilenameBuffer(m_ofn.nMaxFile + nExtraChars));\r
+       }\r
+\r
+       // Helper for _ATM_MIN_CRT\r
+       static const TCHAR* _strrchr(const TCHAR* p, TCHAR ch)\r
+       {\r
+#ifndef _ATL_MIN_CRT\r
+               return _tcsrchr(p, ch);\r
+#else // _ATL_MIN_CRT\r
+               const TCHAR* lpsz = NULL;\r
+               while (*p != 0)\r
+               {\r
+                       if (*p == ch)\r
+                               lpsz = p;\r
+                       p = ::CharNext(p);\r
+               }\r
+               return lpsz;\r
+#endif // _ATL_MIN_CRT\r
+       }\r
+};\r
+\r
+class CMultiFileDialog : public CMultiFileDialogImpl<CMultiFileDialog>\r
+{\r
+public:\r
+       CMultiFileDialog(\r
+               LPCTSTR lpszDefExt = NULL,\r
+               LPCTSTR lpszFileName = NULL,\r
+               DWORD dwFlags = OFN_HIDEREADONLY,\r
+               LPCTSTR lpszFilter = NULL,\r
+               HWND hWndParent = NULL)\r
+               : CMultiFileDialogImpl<CMultiFileDialog>(lpszDefExt, lpszFileName, dwFlags, lpszFilter, hWndParent)\r
+       { }\r
+\r
+       BEGIN_MSG_MAP(CMultiFileDialog)\r
+               CHAIN_MSG_MAP(CMultiFileDialogImpl<CMultiFileDialog>)\r
+       END_MSG_MAP()\r
+};\r
+\r
+#endif // !_WIN32_WCE\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Shell File Dialog - new Shell File Open and Save dialogs in Vista\r
+\r
+// Note: Use GetPtr() to access dialog interface methods.\r
+// Example:\r
+//     CShellFileOpenDialog dlg;\r
+//     dlg.GetPtr()->SetTitle(L"MyFileOpenDialog");\r
+\r
+#if (_WIN32_WINNT >= 0x0600) && !defined(_WIN32_WCE)\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CShellFileDialogImpl - base class for CShellFileOpenDialogImpl and CShellFileSaveDialogImpl\r
+\r
+template <class T>\r
+class ATL_NO_VTABLE CShellFileDialogImpl : public IFileDialogEvents\r
+{\r
+public:\r
+// Operations\r
+       INT_PTR DoModal(HWND hWndParent = ::GetActiveWindow())\r
+       {\r
+               INT_PTR nRet = -1;\r
+\r
+               T* pT = static_cast<T*>(this);\r
+               if(pT->m_spFileDlg == NULL)\r
+               {\r
+                       ATLASSERT(FALSE);\r
+                       return nRet;\r
+               }\r
+\r
+               DWORD dwCookie = 0;\r
+               pT->_Advise(dwCookie);\r
+\r
+               HRESULT hRet = pT->m_spFileDlg->Show(hWndParent);\r
+               if(SUCCEEDED(hRet))\r
+                       nRet = IDOK;\r
+               else if(hRet == HRESULT_FROM_WIN32(ERROR_CANCELLED))\r
+                       nRet = IDCANCEL;\r
+               else\r
+                       ATLASSERT(FALSE);   // error\r
+\r
+               pT->_Unadvise(dwCookie);\r
+\r
+               return nRet;\r
+       }\r
+\r
+       bool IsNull() const\r
+       {\r
+               const T* pT = static_cast<const T*>(this);\r
+               return (pT->m_spFileDlg == NULL);\r
+       }\r
+\r
+// Operations - get file path after dialog returns\r
+       HRESULT GetFilePath(LPWSTR lpstrFilePath, int cchLength)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(pT->m_spFileDlg != NULL);\r
+\r
+               ATL::CComPtr<IShellItem> spItem;\r
+               HRESULT hRet = pT->m_spFileDlg->GetResult(&spItem);\r
+\r
+               if(SUCCEEDED(hRet))\r
+                       hRet = GetFileNameFromShellItem(spItem, SIGDN_FILESYSPATH, lpstrFilePath, cchLength);\r
+\r
+               return hRet;\r
+       }\r
+\r
+       HRESULT GetFileTitle(LPWSTR lpstrFileTitle, int cchLength)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(pT->m_spFileDlg != NULL);\r
+\r
+               ATL::CComPtr<IShellItem> spItem;\r
+               HRESULT hRet = pT->m_spFileDlg->GetResult(&spItem);\r
+\r
+               if(SUCCEEDED(hRet))\r
+                       hRet = GetFileNameFromShellItem(spItem, SIGDN_NORMALDISPLAY, lpstrFileTitle, cchLength);\r
+\r
+               return hRet;\r
+       }\r
+\r
+#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)\r
+       HRESULT GetFilePath(_CSTRING_NS::CString& strFilePath)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(pT->m_spFileDlg != NULL);\r
+\r
+               ATL::CComPtr<IShellItem> spItem;\r
+               HRESULT hRet = pT->m_spFileDlg->GetResult(&spItem);\r
+\r
+               if(SUCCEEDED(hRet))\r
+                       hRet = GetFileNameFromShellItem(spItem, SIGDN_FILESYSPATH, strFilePath);\r
+\r
+               return hRet;\r
+       }\r
+\r
+       HRESULT GetFileTitle(_CSTRING_NS::CString& strFileTitle)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(pT->m_spFileDlg != NULL);\r
+\r
+               ATL::CComPtr<IShellItem> spItem;\r
+               HRESULT hRet = pT->m_spFileDlg->GetResult(&spItem);\r
+\r
+               if(SUCCEEDED(hRet))\r
+                       hRet = GetFileNameFromShellItem(spItem, SIGDN_NORMALDISPLAY, strFileTitle);\r
+\r
+               return hRet;\r
+       }\r
+#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)\r
+\r
+// Helpers for IShellItem\r
+       static HRESULT GetFileNameFromShellItem(IShellItem* pShellItem, SIGDN type, LPWSTR lpstr, int cchLength)\r
+       {\r
+               ATLASSERT(pShellItem != NULL);\r
+\r
+               LPWSTR lpstrName = NULL;\r
+               HRESULT hRet = pShellItem->GetDisplayName(type, &lpstrName);\r
+\r
+               if(SUCCEEDED(hRet))\r
+               {\r
+                       if(lstrlenW(lpstrName) < cchLength)\r
+                       {\r
+                               SecureHelper::strcpyW_x(lpstr, cchLength, lpstrName);\r
+                       }\r
+                       else\r
+                       {\r
+                               ATLASSERT(FALSE);\r
+                               hRet = DISP_E_BUFFERTOOSMALL;\r
+                       }\r
+\r
+                       ::CoTaskMemFree(lpstrName);\r
+               }\r
+\r
+               return hRet;\r
+       }\r
+\r
+#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)\r
+       static HRESULT GetFileNameFromShellItem(IShellItem* pShellItem, SIGDN type, _CSTRING_NS::CString& str)\r
+       {\r
+               ATLASSERT(pShellItem != NULL);\r
+\r
+               LPWSTR lpstrName = NULL;\r
+               HRESULT hRet = pShellItem->GetDisplayName(type, &lpstrName);\r
+\r
+               if(SUCCEEDED(hRet))\r
+               {\r
+                       str = lpstrName;\r
+                       ::CoTaskMemFree(lpstrName);\r
+               }\r
+\r
+               return hRet;\r
+       }\r
+#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)\r
+\r
+// Implementation\r
+       void _Advise(DWORD& dwCookie)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(pT->m_spFileDlg != NULL);\r
+               HRESULT hRet = pT->m_spFileDlg->Advise((IFileDialogEvents*)this, &dwCookie);\r
+               ATLVERIFY(SUCCEEDED(hRet));\r
+       }\r
+\r
+       void _Unadvise(DWORD dwCookie)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(pT->m_spFileDlg != NULL);\r
+               HRESULT hRet = pT->m_spFileDlg->Unadvise(dwCookie);\r
+               ATLVERIFY(SUCCEEDED(hRet));\r
+       }\r
+\r
+       void _Init(LPCWSTR lpszFileName, DWORD dwOptions, LPCWSTR lpszDefExt, const COMDLG_FILTERSPEC* arrFilterSpec, UINT uFilterSpecCount)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(pT->m_spFileDlg != NULL);\r
+\r
+               HRESULT hRet = E_FAIL;\r
+\r
+               if(lpszFileName != NULL)\r
+               {\r
+                       hRet = pT->m_spFileDlg->SetFileName(lpszFileName);\r
+                       ATLASSERT(SUCCEEDED(hRet));\r
+               }\r
+\r
+               hRet = pT->m_spFileDlg->SetOptions(dwOptions);\r
+               ATLASSERT(SUCCEEDED(hRet));\r
+\r
+               if(lpszDefExt != NULL)\r
+               {\r
+                       hRet = pT->m_spFileDlg->SetDefaultExtension(lpszDefExt);\r
+                       ATLASSERT(SUCCEEDED(hRet));\r
+               }\r
+\r
+               if(arrFilterSpec != NULL && uFilterSpecCount != 0U)\r
+               {\r
+                       hRet = pT->m_spFileDlg->SetFileTypes(uFilterSpecCount, arrFilterSpec);\r
+                       ATLASSERT(SUCCEEDED(hRet));\r
+               }\r
+       }\r
+\r
+// Implementation - IUnknown interface\r
+       STDMETHOD(QueryInterface)(REFIID riid, void** ppvObject)\r
+       {\r
+               if(ppvObject == NULL)\r
+                       return E_POINTER;\r
+\r
+               T* pT = static_cast<T*>(this);\r
+               if(IsEqualGUID(riid, IID_IUnknown) || IsEqualGUID(riid, IID_IFileDialogEvents))\r
+               {\r
+                       *ppvObject = (IFileDialogEvents*)pT;\r
+                       // AddRef() not needed\r
+                       return S_OK;\r
+               }\r
+\r
+               return E_NOINTERFACE;\r
+       }\r
+\r
+       virtual ULONG STDMETHODCALLTYPE AddRef()\r
+       {\r
+               return 1;\r
+       }\r
+\r
+       virtual ULONG STDMETHODCALLTYPE Release()\r
+       {\r
+               return 1;\r
+       }\r
+\r
+// Implementation - IFileDialogEvents interface\r
+       virtual HRESULT STDMETHODCALLTYPE IFileDialogEvents::OnFileOk(IFileDialog* pfd)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(pT->m_spFileDlg.IsEqualObject(pfd));\r
+               pfd;   // avoid level 4 warning\r
+               return pT->OnFileOk();\r
+       }\r
+\r
+       virtual HRESULT STDMETHODCALLTYPE IFileDialogEvents::OnFolderChanging(IFileDialog* pfd, IShellItem* psiFolder)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(pT->m_spFileDlg.IsEqualObject(pfd));\r
+               pfd;   // avoid level 4 warning\r
+               return pT->OnFolderChanging(psiFolder);\r
+       }\r
+\r
+       virtual HRESULT STDMETHODCALLTYPE IFileDialogEvents::OnFolderChange(IFileDialog* pfd)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(pT->m_spFileDlg.IsEqualObject(pfd));\r
+               pfd;   // avoid level 4 warning\r
+               return pT->OnFolderChange();\r
+       }\r
+\r
+       virtual HRESULT STDMETHODCALLTYPE IFileDialogEvents::OnSelectionChange(IFileDialog* pfd)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(pT->m_spFileDlg.IsEqualObject(pfd));\r
+               pfd;   // avoid level 4 warning\r
+               return pT->OnSelectionChange();\r
+       }\r
+\r
+       virtual HRESULT STDMETHODCALLTYPE IFileDialogEvents::OnShareViolation(IFileDialog* pfd, IShellItem* psi, FDE_SHAREVIOLATION_RESPONSE* pResponse)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(pT->m_spFileDlg.IsEqualObject(pfd));\r
+               pfd;   // avoid level 4 warning\r
+               return pT->OnShareViolation(psi, pResponse);\r
+       }\r
+\r
+       virtual HRESULT STDMETHODCALLTYPE IFileDialogEvents::OnTypeChange(IFileDialog* pfd)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(pT->m_spFileDlg.IsEqualObject(pfd));\r
+               pfd;   // avoid level 4 warning\r
+               return pT->OnTypeChange();\r
+       }\r
+\r
+       virtual HRESULT STDMETHODCALLTYPE IFileDialogEvents::OnOverwrite(IFileDialog* pfd, IShellItem* psi, FDE_OVERWRITE_RESPONSE* pResponse)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(pT->m_spFileDlg.IsEqualObject(pfd));\r
+               pfd;   // avoid level 4 warning\r
+               return pT->OnOverwrite(psi, pResponse);\r
+       }\r
+\r
+// Overrideables - Event handlers\r
+       HRESULT OnFileOk()\r
+       {\r
+               return E_NOTIMPL;\r
+       }\r
+\r
+       HRESULT OnFolderChanging(IShellItem* /*psiFolder*/)\r
+       {\r
+               return E_NOTIMPL;\r
+       }\r
+\r
+       HRESULT OnFolderChange()\r
+       {\r
+               return E_NOTIMPL;\r
+       }\r
+\r
+       HRESULT OnSelectionChange()\r
+       {\r
+               return E_NOTIMPL;\r
+       }\r
+\r
+       HRESULT OnShareViolation(IShellItem* /*psi*/, FDE_SHAREVIOLATION_RESPONSE* /*pResponse*/)\r
+       {\r
+               return E_NOTIMPL;\r
+       }\r
+\r
+       HRESULT OnTypeChange()\r
+       {\r
+               return E_NOTIMPL;\r
+       }\r
+\r
+       HRESULT OnOverwrite(IShellItem* /*psi*/, FDE_OVERWRITE_RESPONSE* /*pResponse*/)\r
+       {\r
+               return E_NOTIMPL;\r
+       }\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CShellFileOpenDialogImpl - implements new Shell File Open dialog\r
+\r
+template <class T>\r
+class ATL_NO_VTABLE CShellFileOpenDialogImpl : public CShellFileDialogImpl< T >\r
+{\r
+public:\r
+       ATL::CComPtr<IFileOpenDialog> m_spFileDlg;\r
+\r
+       CShellFileOpenDialogImpl(LPCWSTR lpszFileName = NULL, \r
+                                DWORD dwOptions = FOS_FORCEFILESYSTEM | FOS_PATHMUSTEXIST | FOS_FILEMUSTEXIST, \r
+                                LPCWSTR lpszDefExt = NULL, \r
+                                const COMDLG_FILTERSPEC* arrFilterSpec = NULL, \r
+                                UINT uFilterSpecCount = 0U)\r
+       {\r
+               HRESULT hRet = m_spFileDlg.CoCreateInstance(CLSID_FileOpenDialog);\r
+\r
+               if(SUCCEEDED(hRet))\r
+                       _Init(lpszFileName, dwOptions, lpszDefExt, arrFilterSpec, uFilterSpecCount);\r
+       }\r
+\r
+       IFileOpenDialog* GetPtr()\r
+       {\r
+               return m_spFileDlg;\r
+       }\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CShellFileOpenDialog - new Shell File Open dialog without events\r
+\r
+class CShellFileOpenDialog : public CShellFileOpenDialogImpl<CShellFileOpenDialog>\r
+{\r
+public:\r
+       CShellFileOpenDialog(LPCWSTR lpszFileName = NULL, \r
+                            DWORD dwOptions = FOS_FORCEFILESYSTEM | FOS_PATHMUSTEXIST | FOS_FILEMUSTEXIST, \r
+                            LPCWSTR lpszDefExt = NULL, \r
+                            const COMDLG_FILTERSPEC* arrFilterSpec = NULL, \r
+                            UINT uFilterSpecCount = 0U) : CShellFileOpenDialogImpl<CShellFileOpenDialog>(lpszFileName, dwOptions, lpszDefExt, arrFilterSpec, uFilterSpecCount)\r
+       { }\r
+\r
+// Implementation (remove _Advise/_Unadvise code using template magic)\r
+       void _Advise(DWORD& /*dwCookie*/)\r
+       { }\r
+\r
+       void _Unadvise(DWORD /*dwCookie*/)\r
+       { }\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CShellFileSaveDialogImpl - implements new Shell File Save dialog\r
+\r
+template <class T>\r
+class ATL_NO_VTABLE CShellFileSaveDialogImpl : public CShellFileDialogImpl< T >\r
+{\r
+public:\r
+       ATL::CComPtr<IFileSaveDialog> m_spFileDlg;\r
+\r
+       CShellFileSaveDialogImpl(LPCWSTR lpszFileName = NULL, \r
+                                DWORD dwOptions = FOS_FORCEFILESYSTEM | FOS_PATHMUSTEXIST | FOS_OVERWRITEPROMPT, \r
+                                LPCWSTR lpszDefExt = NULL, \r
+                                const COMDLG_FILTERSPEC* arrFilterSpec = NULL, \r
+                                UINT uFilterSpecCount = 0U)\r
+       {\r
+               HRESULT hRet = m_spFileDlg.CoCreateInstance(CLSID_FileSaveDialog);\r
+\r
+               if(SUCCEEDED(hRet))\r
+                       _Init(lpszFileName, dwOptions, lpszDefExt, arrFilterSpec, uFilterSpecCount);\r
+       }\r
+\r
+       IFileSaveDialog* GetPtr()\r
+       {\r
+               return m_spFileDlg;\r
+       }\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CShellFileSaveDialog - new Shell File Save dialog without events\r
+\r
+class CShellFileSaveDialog : public CShellFileSaveDialogImpl<CShellFileSaveDialog>\r
+{\r
+public:\r
+       CShellFileSaveDialog(LPCWSTR lpszFileName = NULL, \r
+                            DWORD dwOptions = FOS_FORCEFILESYSTEM | FOS_PATHMUSTEXIST | FOS_OVERWRITEPROMPT, \r
+                            LPCWSTR lpszDefExt = NULL, \r
+                            const COMDLG_FILTERSPEC* arrFilterSpec = NULL, \r
+                            UINT uFilterSpecCount = 0U) : CShellFileSaveDialogImpl<CShellFileSaveDialog>(lpszFileName, dwOptions, lpszDefExt, arrFilterSpec, uFilterSpecCount)\r
+       { }\r
+\r
+// Implementation (remove _Advise/_Unadvise code using template magic)\r
+       void _Advise(DWORD& /*dwCookie*/)\r
+       { }\r
+\r
+       void _Unadvise(DWORD /*dwCookie*/)\r
+       { }\r
+};\r
+\r
+#endif // (_WIN32_WINNT >= 0x0600) && !defined(_WIN32_WCE)\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CFolderDialogImpl - used for browsing for a folder\r
+\r
+#ifndef _WIN32_WCE\r
+\r
+template <class T>\r
+class ATL_NO_VTABLE CFolderDialogImpl\r
+{\r
+public:\r
+       BROWSEINFO m_bi;\r
+       LPCTSTR m_lpstrInitialFolder;\r
+       LPCITEMIDLIST m_pidlInitialSelection;\r
+       bool m_bExpandInitialSelection;\r
+       TCHAR m_szFolderDisplayName[MAX_PATH];\r
+       TCHAR m_szFolderPath[MAX_PATH];\r
+       LPITEMIDLIST m_pidlSelected;\r
+       HWND m_hWnd;   // used only in the callback function\r
+\r
+// Constructor\r
+       CFolderDialogImpl(HWND hWndParent = NULL, LPCTSTR lpstrTitle = NULL, UINT uFlags = BIF_RETURNONLYFSDIRS) : \r
+                       m_lpstrInitialFolder(NULL), m_pidlInitialSelection(NULL), m_bExpandInitialSelection(false), m_pidlSelected(NULL), m_hWnd(NULL)\r
+       {\r
+               memset(&m_bi, 0, sizeof(m_bi)); // initialize structure to 0/NULL\r
+\r
+               m_bi.hwndOwner = hWndParent;\r
+               m_bi.pidlRoot = NULL;\r
+               m_bi.pszDisplayName = m_szFolderDisplayName;\r
+               m_bi.lpszTitle = lpstrTitle;\r
+               m_bi.ulFlags = uFlags;\r
+               m_bi.lpfn = BrowseCallbackProc;\r
+               m_bi.lParam = (LPARAM)static_cast<T*>(this);\r
+\r
+               m_szFolderPath[0] = 0;\r
+               m_szFolderDisplayName[0] = 0;\r
+       }\r
+\r
+       ~CFolderDialogImpl()\r
+       {\r
+               ::CoTaskMemFree(m_pidlSelected);\r
+       }\r
+\r
+// Operations\r
+       INT_PTR DoModal(HWND hWndParent = ::GetActiveWindow())\r
+       {\r
+               if(m_bi.hwndOwner == NULL)   // set only if not specified before\r
+                       m_bi.hwndOwner = hWndParent;\r
+\r
+               // Clear out any previous results\r
+               m_szFolderPath[0] = 0;\r
+               m_szFolderDisplayName[0] = 0;\r
+               ::CoTaskMemFree(m_pidlSelected);\r
+\r
+               INT_PTR nRet = IDCANCEL;\r
+               m_pidlSelected = ::SHBrowseForFolder(&m_bi);\r
+\r
+               if(m_pidlSelected != NULL)\r
+               {\r
+                       nRet = IDOK;\r
+\r
+                       // If BIF_RETURNONLYFSDIRS is set, we try to get the filesystem path.\r
+                       // Otherwise, the caller must handle the ID-list directly.\r
+                       if((m_bi.ulFlags & BIF_RETURNONLYFSDIRS) != 0)\r
+                       {\r
+                               if(::SHGetPathFromIDList(m_pidlSelected, m_szFolderPath) == FALSE)\r
+                                       nRet = IDCANCEL;\r
+                       }\r
+               }\r
+\r
+               return nRet;\r
+       }\r
+\r
+       // Methods to call before DoModal\r
+       void SetInitialFolder(LPCTSTR lpstrInitialFolder, bool bExpand = true)\r
+       {\r
+               // lpstrInitialFolder may be a file if BIF_BROWSEINCLUDEFILES is specified\r
+               m_lpstrInitialFolder = lpstrInitialFolder;\r
+               m_bExpandInitialSelection = bExpand;\r
+       }\r
+\r
+       void SetInitialSelection(LPCITEMIDLIST pidl, bool bExpand = true)\r
+       {\r
+               m_pidlInitialSelection = pidl;\r
+               m_bExpandInitialSelection = bExpand;\r
+       }\r
+\r
+       // Methods to call after DoModal\r
+       LPITEMIDLIST GetSelectedItem(bool bDetach = false)\r
+       {\r
+               LPITEMIDLIST pidl = m_pidlSelected;\r
+               if(bDetach)\r
+                       m_pidlSelected = NULL;\r
+\r
+               return pidl;\r
+       }\r
+\r
+       LPCTSTR GetFolderPath() const\r
+       {\r
+               return m_szFolderPath;\r
+       }\r
+\r
+       LPCTSTR GetFolderDisplayName() const\r
+       {\r
+               return m_szFolderDisplayName;\r
+       }\r
+\r
+       int GetFolderImageIndex() const\r
+       {\r
+               return m_bi.iImage;\r
+       }\r
+\r
+// Callback function and overrideables\r
+       static int CALLBACK BrowseCallbackProc(HWND hWnd, UINT uMsg, LPARAM lParam, LPARAM lpData)\r
+       {\r
+#ifndef BFFM_VALIDATEFAILED\r
+  #ifdef UNICODE\r
+               const int BFFM_VALIDATEFAILED = 4;\r
+  #else\r
+               const int BFFM_VALIDATEFAILED = 3;\r
+  #endif\r
+#endif // !BFFM_VALIDATEFAILED\r
+#ifndef BFFM_IUNKNOWN\r
+               const int BFFM_IUNKNOWN = 5;\r
+#endif // !BFFM_IUNKNOWN\r
+#ifndef BIF_NEWDIALOGSTYLE\r
+               const UINT BIF_NEWDIALOGSTYLE = 0x0040;\r
+#endif // !BIF_NEWDIALOGSTYLE\r
+\r
+               int nRet = 0;\r
+               T* pT = (T*)lpData;\r
+               bool bClear = false;\r
+               if(pT->m_hWnd == NULL)\r
+               {\r
+                       pT->m_hWnd = hWnd;\r
+                       bClear = true;\r
+               }\r
+               else\r
+               {\r
+                       ATLASSERT(pT->m_hWnd == hWnd);\r
+               }\r
+\r
+               switch(uMsg)\r
+               {\r
+               case BFFM_INITIALIZED:\r
+                       // Set initial selection\r
+                       // Note that m_pidlInitialSelection, if set, takes precedence over m_lpstrInitialFolder\r
+                       if(pT->m_pidlInitialSelection != NULL)\r
+                               pT->SetSelection(pT->m_pidlInitialSelection);\r
+                       else if(pT->m_lpstrInitialFolder != NULL)\r
+                               pT->SetSelection(pT->m_lpstrInitialFolder);\r
+\r
+                       // Expand initial selection if appropriate\r
+                       if(pT->m_bExpandInitialSelection && ((pT->m_bi.ulFlags & BIF_NEWDIALOGSTYLE) != 0))\r
+                       {\r
+                               if(pT->m_pidlInitialSelection != NULL)\r
+                                       pT->SetExpanded(pT->m_pidlInitialSelection);\r
+                               else if(pT->m_lpstrInitialFolder != NULL)\r
+                                       pT->SetExpanded(pT->m_lpstrInitialFolder);\r
+                       }\r
+                       pT->OnInitialized();\r
+                       break;\r
+               case BFFM_SELCHANGED:\r
+                       pT->OnSelChanged((LPITEMIDLIST)lParam);\r
+                       break;\r
+               case BFFM_VALIDATEFAILED:\r
+                       nRet = pT->OnValidateFailed((LPCTSTR)lParam);\r
+                       break;\r
+               case BFFM_IUNKNOWN:\r
+                       pT->OnIUnknown((IUnknown*)lParam);\r
+                       break;\r
+               default:\r
+                       ATLTRACE2(atlTraceUI, 0, _T("Unknown message received in CFolderDialogImpl::BrowseCallbackProc\n"));\r
+                       break;\r
+               }\r
+\r
+               if(bClear)\r
+                       pT->m_hWnd = NULL;\r
+               return nRet;\r
+       }\r
+\r
+       void OnInitialized()\r
+       {\r
+       }\r
+\r
+       void OnSelChanged(LPITEMIDLIST /*pItemIDList*/)\r
+       {\r
+       }\r
+\r
+       int OnValidateFailed(LPCTSTR /*lpstrFolderPath*/)\r
+       {\r
+               return 1;   // 1=continue, 0=EndDialog\r
+       }\r
+\r
+       void OnIUnknown(IUnknown* /*pUnknown*/)\r
+       {\r
+       }\r
+\r
+       // Commands - valid to call only from handlers\r
+       void EnableOK(BOOL bEnable)\r
+       {\r
+               ATLASSERT(m_hWnd != NULL);\r
+               ::SendMessage(m_hWnd, BFFM_ENABLEOK, 0, bEnable);\r
+       }\r
+\r
+       void SetSelection(LPCITEMIDLIST pItemIDList)\r
+       {\r
+               ATLASSERT(m_hWnd != NULL);\r
+               ::SendMessage(m_hWnd, BFFM_SETSELECTION, FALSE, (LPARAM)pItemIDList);\r
+       }\r
+\r
+       void SetSelection(LPCTSTR lpstrFolderPath)\r
+       {\r
+               ATLASSERT(m_hWnd != NULL);\r
+               ::SendMessage(m_hWnd, BFFM_SETSELECTION, TRUE, (LPARAM)lpstrFolderPath);\r
+       }\r
+\r
+       void SetStatusText(LPCTSTR lpstrText)\r
+       {\r
+               ATLASSERT(m_hWnd != NULL);\r
+               ::SendMessage(m_hWnd, BFFM_SETSTATUSTEXT, 0, (LPARAM)lpstrText);\r
+       }\r
+\r
+       void SetOKText(LPCTSTR lpstrOKText)\r
+       {\r
+#ifndef BFFM_SETOKTEXT\r
+               const UINT BFFM_SETOKTEXT = WM_USER + 105;\r
+#endif\r
+               ATLASSERT(m_hWnd != NULL);\r
+               USES_CONVERSION;\r
+               LPCWSTR lpstr = T2CW(lpstrOKText);\r
+               ::SendMessage(m_hWnd, BFFM_SETOKTEXT, (WPARAM)lpstr, 0L);\r
+       }\r
+\r
+       void SetExpanded(LPCITEMIDLIST pItemIDList)\r
+       {\r
+#ifndef BFFM_SETEXPANDED\r
+               const UINT BFFM_SETEXPANDED = WM_USER + 106;\r
+#endif\r
+               ATLASSERT(m_hWnd != NULL);\r
+               ::SendMessage(m_hWnd, BFFM_SETEXPANDED, FALSE, (LPARAM)pItemIDList);\r
+       }\r
+\r
+       void SetExpanded(LPCTSTR lpstrFolderPath)\r
+       {\r
+#ifndef BFFM_SETEXPANDED\r
+               const UINT BFFM_SETEXPANDED = WM_USER + 106;\r
+#endif\r
+               ATLASSERT(m_hWnd != NULL);\r
+               USES_CONVERSION;\r
+               LPCWSTR lpstr = T2CW(lpstrFolderPath);\r
+               ::SendMessage(m_hWnd, BFFM_SETEXPANDED, TRUE, (LPARAM)lpstr);\r
+       }\r
+};\r
+\r
+class CFolderDialog : public CFolderDialogImpl<CFolderDialog>\r
+{\r
+public:\r
+       CFolderDialog(HWND hWndParent = NULL, LPCTSTR lpstrTitle = NULL, UINT uFlags = BIF_RETURNONLYFSDIRS)\r
+               : CFolderDialogImpl<CFolderDialog>(hWndParent, lpstrTitle, uFlags)\r
+       { }\r
+};\r
+\r
+#endif // !_WIN32_WCE\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CCommonDialogImplBase - base class for common dialog classes\r
+\r
+class ATL_NO_VTABLE CCommonDialogImplBase : public ATL::CWindowImplBase\r
+{\r
+public:\r
+       static UINT_PTR APIENTRY HookProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)\r
+       {\r
+               if(uMsg != WM_INITDIALOG)\r
+                       return 0;\r
+               CCommonDialogImplBase* pT = (CCommonDialogImplBase*)ModuleHelper::ExtractCreateWndData();\r
+               ATLASSERT(pT != NULL);\r
+               ATLASSERT(pT->m_hWnd == NULL);\r
+               ATLASSERT(::IsWindow(hWnd));\r
+               // subclass dialog's window\r
+               if(!pT->SubclassWindow(hWnd))\r
+               {\r
+                       ATLTRACE2(atlTraceUI, 0, _T("Subclassing a common dialog failed\n"));\r
+                       return 0;\r
+               }\r
+               // check message map for WM_INITDIALOG handler\r
+               LRESULT lRes = 0;\r
+               if(pT->ProcessWindowMessage(pT->m_hWnd, uMsg, wParam, lParam, lRes, 0) == FALSE)\r
+                       return 0;\r
+               return lRes;\r
+       }\r
+\r
+// Special override for common dialogs\r
+       BOOL EndDialog(INT_PTR /*nRetCode*/ = 0)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               SendMessage(WM_COMMAND, MAKEWPARAM(IDABORT, 0));\r
+               return TRUE;\r
+       }\r
+\r
+// Implementation - try to override these, to prevent errors\r
+       HWND Create(HWND, ATL::_U_RECT, LPCTSTR, DWORD, DWORD, ATL::_U_MENUorID, ATOM, LPVOID)\r
+       {\r
+               ATLASSERT(FALSE);   // should not be called\r
+               return NULL;\r
+       }\r
+\r
+       static LRESULT CALLBACK StartWindowProc(HWND /*hWnd*/, UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/)\r
+       {\r
+               ATLASSERT(FALSE);   // should not be called\r
+               return 0;\r
+       }\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CFontDialogImpl - font selection dialog\r
+\r
+#ifndef _WIN32_WCE\r
+\r
+template <class T>\r
+class ATL_NO_VTABLE CFontDialogImpl : public CCommonDialogImplBase\r
+{\r
+public:\r
+       enum { _cchStyleName = 64 };\r
+\r
+       CHOOSEFONT m_cf;\r
+       TCHAR m_szStyleName[_cchStyleName];  // contains style name after return\r
+       LOGFONT m_lf;                        // default LOGFONT to store the info\r
+\r
+// Constructors\r
+       CFontDialogImpl(LPLOGFONT lplfInitial = NULL,\r
+                       DWORD dwFlags = CF_EFFECTS | CF_SCREENFONTS,\r
+                       HDC hDCPrinter = NULL,\r
+                       HWND hWndParent = NULL)\r
+       {\r
+               memset(&m_cf, 0, sizeof(m_cf));\r
+               memset(&m_lf, 0, sizeof(m_lf));\r
+               memset(&m_szStyleName, 0, sizeof(m_szStyleName));\r
+\r
+               m_cf.lStructSize = sizeof(m_cf);\r
+               m_cf.hwndOwner = hWndParent;\r
+               m_cf.rgbColors = RGB(0, 0, 0);\r
+               m_cf.lpszStyle = (LPTSTR)&m_szStyleName;\r
+               m_cf.Flags = dwFlags | CF_ENABLEHOOK;\r
+               m_cf.lpfnHook = (LPCFHOOKPROC)T::HookProc;\r
+\r
+               if(lplfInitial != NULL)\r
+               {\r
+                       m_cf.lpLogFont = lplfInitial;\r
+                       m_cf.Flags |= CF_INITTOLOGFONTSTRUCT;\r
+                       m_lf = *lplfInitial;\r
+               }\r
+               else\r
+               {\r
+                       m_cf.lpLogFont = &m_lf;\r
+               }\r
+\r
+               if(hDCPrinter != NULL)\r
+               {\r
+                       m_cf.hDC = hDCPrinter;\r
+                       m_cf.Flags |= CF_PRINTERFONTS;\r
+               }\r
+       }\r
+\r
+// Operations\r
+       INT_PTR DoModal(HWND hWndParent = ::GetActiveWindow())\r
+       {\r
+               ATLASSERT((m_cf.Flags & CF_ENABLEHOOK) != 0);\r
+               ATLASSERT(m_cf.lpfnHook != NULL);   // can still be a user hook\r
+\r
+               if(m_cf.hwndOwner == NULL)          // set only if not specified before\r
+                       m_cf.hwndOwner = hWndParent;\r
+\r
+               ATLASSERT(m_hWnd == NULL);\r
+               ModuleHelper::AddCreateWndData(&m_thunk.cd, (CCommonDialogImplBase*)this);\r
+\r
+               BOOL bRet = ::ChooseFont(&m_cf);\r
+\r
+               m_hWnd = NULL;\r
+\r
+               if(bRet)   // copy logical font from user's initialization buffer (if needed)\r
+                       SecureHelper::memcpy_x(&m_lf, sizeof(m_lf), m_cf.lpLogFont, sizeof(m_lf));\r
+\r
+               return bRet ? IDOK : IDCANCEL;\r
+       }\r
+\r
+       // works only when the dialog is dislayed or after\r
+       void GetCurrentFont(LPLOGFONT lplf) const\r
+       {\r
+               ATLASSERT(lplf != NULL);\r
+\r
+               if(m_hWnd != NULL)\r
+                       ::SendMessage(m_hWnd, WM_CHOOSEFONT_GETLOGFONT, 0, (LPARAM)lplf);\r
+               else\r
+                       *lplf = m_lf;\r
+       }\r
+\r
+       // works only when the dialog is dislayed or before\r
+#ifndef _WIN32_WCE\r
+       void SetLogFont(LPLOGFONT lplf)\r
+       {\r
+               ATLASSERT(lplf != NULL);\r
+#ifndef WM_CHOOSEFONT_SETLOGFONT\r
+               const UINT WM_CHOOSEFONT_SETLOGFONT = (WM_USER + 101);\r
+#endif\r
+               if(m_hWnd != NULL)\r
+               {\r
+                       ::SendMessage(m_hWnd, WM_CHOOSEFONT_SETLOGFONT, 0, (LPARAM)lplf);\r
+               }\r
+               else\r
+               {\r
+                       m_lf = *lplf;\r
+                       m_cf.Flags |= CF_INITTOLOGFONTSTRUCT;\r
+               }\r
+       }\r
+\r
+       void SetFlags(DWORD dwFlags)\r
+       {\r
+#ifndef WM_CHOOSEFONT_SETFLAGS\r
+               const UINT WM_CHOOSEFONT_SETFLAGS = (WM_USER + 102);\r
+#endif\r
+               if(m_hWnd != NULL)\r
+               {\r
+                       CHOOSEFONT cf = { sizeof(CHOOSEFONT) };\r
+                       cf.Flags = dwFlags;\r
+                       ::SendMessage(m_hWnd, WM_CHOOSEFONT_SETFLAGS, 0, (LPARAM)&cf);\r
+               }\r
+               else\r
+               {\r
+                       m_cf.Flags = dwFlags;\r
+               }\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       // Helpers for parsing information after successful return\r
+       LPCTSTR GetFaceName() const   // return the face name of the font\r
+       {\r
+               return (LPCTSTR)m_cf.lpLogFont->lfFaceName;\r
+       }\r
+\r
+       LPCTSTR GetStyleName() const  // return the style name of the font\r
+       {\r
+               return m_cf.lpszStyle;\r
+       }\r
+\r
+       int GetSize() const           // return the pt size of the font\r
+       {\r
+               return m_cf.iPointSize;\r
+       }\r
+\r
+       COLORREF GetColor() const     // return the color of the font\r
+       {\r
+               return m_cf.rgbColors;\r
+       }\r
+\r
+       int GetWeight() const         // return the chosen font weight\r
+       {\r
+               return (int)m_cf.lpLogFont->lfWeight;\r
+       }\r
+\r
+       BOOL IsStrikeOut() const      // return TRUE if strikeout\r
+       {\r
+               return (m_cf.lpLogFont->lfStrikeOut) ? TRUE : FALSE;\r
+       }\r
+\r
+       BOOL IsUnderline() const      // return TRUE if underline\r
+       {\r
+               return (m_cf.lpLogFont->lfUnderline) ? TRUE : FALSE;\r
+       }\r
+\r
+       BOOL IsBold() const           // return TRUE if bold font\r
+       {\r
+               return (m_cf.lpLogFont->lfWeight == FW_BOLD) ? TRUE : FALSE;\r
+       }\r
+\r
+       BOOL IsItalic() const         // return TRUE if italic font\r
+       {\r
+               return m_cf.lpLogFont->lfItalic ? TRUE : FALSE;\r
+       }\r
+};\r
+\r
+class CFontDialog : public CFontDialogImpl<CFontDialog>\r
+{\r
+public:\r
+       CFontDialog(LPLOGFONT lplfInitial = NULL,\r
+               DWORD dwFlags = CF_EFFECTS | CF_SCREENFONTS,\r
+               HDC hDCPrinter = NULL,\r
+               HWND hWndParent = NULL)\r
+               : CFontDialogImpl<CFontDialog>(lplfInitial, dwFlags, hDCPrinter, hWndParent)\r
+       { }\r
+\r
+       DECLARE_EMPTY_MSG_MAP()\r
+};\r
+\r
+#endif // _WIN32_WCE\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CRichEditFontDialogImpl - font selection for the Rich Edit ctrl\r
+\r
+#if defined(_RICHEDIT_) && !defined(_WIN32_WCE)\r
+\r
+template <class T>\r
+class ATL_NO_VTABLE CRichEditFontDialogImpl : public CFontDialogImpl< T >\r
+{\r
+public:\r
+       CRichEditFontDialogImpl(const CHARFORMAT& charformat,\r
+                       DWORD dwFlags = CF_SCREENFONTS,\r
+                       HDC hDCPrinter = NULL,\r
+                       HWND hWndParent = NULL)\r
+                       : CFontDialogImpl< T >(NULL, dwFlags, hDCPrinter, hWndParent)\r
+       {\r
+               m_cf.Flags |= CF_INITTOLOGFONTSTRUCT;\r
+               m_cf.Flags |= FillInLogFont(charformat);\r
+               m_cf.lpLogFont = &m_lf;\r
+\r
+               if((charformat.dwMask & CFM_COLOR) != 0)\r
+                       m_cf.rgbColors = charformat.crTextColor;\r
+       }\r
+\r
+       void GetCharFormat(CHARFORMAT& cf) const\r
+       {\r
+               USES_CONVERSION;\r
+               cf.dwEffects = 0;\r
+               cf.dwMask = 0;\r
+               if((m_cf.Flags & CF_NOSTYLESEL) == 0)\r
+               {\r
+                       cf.dwMask |= CFM_BOLD | CFM_ITALIC;\r
+                       cf.dwEffects |= IsBold() ? CFE_BOLD : 0;\r
+                       cf.dwEffects |= IsItalic() ? CFE_ITALIC : 0;\r
+               }\r
+               if((m_cf.Flags & CF_NOSIZESEL) == 0)\r
+               {\r
+                       cf.dwMask |= CFM_SIZE;\r
+                       // GetSize() returns in tenths of points so mulitply by 2 to get twips\r
+                       cf.yHeight = GetSize() * 2;\r
+               }\r
+\r
+               if((m_cf.Flags & CF_NOFACESEL) == 0)\r
+               {\r
+                       cf.dwMask |= CFM_FACE;\r
+                       cf.bPitchAndFamily = m_cf.lpLogFont->lfPitchAndFamily;\r
+#if (_RICHEDIT_VER >= 0x0200)\r
+                       SecureHelper::strcpy_x(cf.szFaceName, _countof(cf.szFaceName), GetFaceName());\r
+#else // !(_RICHEDIT_VER >= 0x0200)\r
+                       SecureHelper::strcpyA_x(cf.szFaceName, _countof(cf.szFaceName), T2A((LPTSTR)(LPCTSTR)GetFaceName()));\r
+#endif // !(_RICHEDIT_VER >= 0x0200)\r
+               }\r
+\r
+               if((m_cf.Flags & CF_EFFECTS) != 0)\r
+               {\r
+                       cf.dwMask |= CFM_UNDERLINE | CFM_STRIKEOUT | CFM_COLOR;\r
+                       cf.dwEffects |= IsUnderline() ? CFE_UNDERLINE : 0;\r
+                       cf.dwEffects |= IsStrikeOut() ? CFE_STRIKEOUT : 0;\r
+                       cf.crTextColor = GetColor();\r
+               }\r
+               if((m_cf.Flags & CF_NOSCRIPTSEL) == 0)\r
+               {\r
+                       cf.bCharSet = m_cf.lpLogFont->lfCharSet;\r
+                       cf.dwMask |= CFM_CHARSET;\r
+               }\r
+               cf.yOffset = 0;\r
+       }\r
+\r
+       DWORD FillInLogFont(const CHARFORMAT& cf)\r
+       {\r
+               USES_CONVERSION;\r
+               DWORD dwFlags = 0;\r
+               if((cf.dwMask & CFM_SIZE) != 0)\r
+               {\r
+                       HDC hDC = ::CreateDC(_T("DISPLAY"), NULL, NULL, NULL);\r
+                       LONG yPerInch = ::GetDeviceCaps(hDC, LOGPIXELSY);\r
+                       m_lf.lfHeight = -(int)((cf.yHeight * yPerInch) / 1440);\r
+               }\r
+               else\r
+                       m_lf.lfHeight = 0;\r
+\r
+               m_lf.lfWidth = 0;\r
+               m_lf.lfEscapement = 0;\r
+               m_lf.lfOrientation = 0;\r
+\r
+               if((cf.dwMask & (CFM_ITALIC | CFM_BOLD)) == (CFM_ITALIC | CFM_BOLD))\r
+               {\r
+                       m_lf.lfWeight = ((cf.dwEffects & CFE_BOLD) != 0) ? FW_BOLD : FW_NORMAL;\r
+                       m_lf.lfItalic = (BYTE)(((cf.dwEffects & CFE_ITALIC) != 0) ? TRUE : FALSE);\r
+               }\r
+               else\r
+               {\r
+                       dwFlags |= CF_NOSTYLESEL;\r
+                       m_lf.lfWeight = FW_DONTCARE;\r
+                       m_lf.lfItalic = FALSE;\r
+               }\r
+\r
+               if((cf.dwMask & (CFM_UNDERLINE | CFM_STRIKEOUT | CFM_COLOR)) == (CFM_UNDERLINE|CFM_STRIKEOUT|CFM_COLOR))\r
+               {\r
+                       dwFlags |= CF_EFFECTS;\r
+                       m_lf.lfUnderline = (BYTE)(((cf.dwEffects & CFE_UNDERLINE) != 0) ? TRUE : FALSE);\r
+                       m_lf.lfStrikeOut = (BYTE)(((cf.dwEffects & CFE_STRIKEOUT) != 0) ? TRUE : FALSE);\r
+               }\r
+               else\r
+               {\r
+                       m_lf.lfUnderline = (BYTE)FALSE;\r
+                       m_lf.lfStrikeOut = (BYTE)FALSE;\r
+               }\r
+\r
+               if((cf.dwMask & CFM_CHARSET) != 0)\r
+                       m_lf.lfCharSet = cf.bCharSet;\r
+               else\r
+                       dwFlags |= CF_NOSCRIPTSEL;\r
+               m_lf.lfOutPrecision = OUT_DEFAULT_PRECIS;\r
+               m_lf.lfClipPrecision = CLIP_DEFAULT_PRECIS;\r
+               m_lf.lfQuality = DEFAULT_QUALITY;\r
+               if((cf.dwMask & CFM_FACE) != 0)\r
+               {\r
+                       m_lf.lfPitchAndFamily = cf.bPitchAndFamily;\r
+#if (_RICHEDIT_VER >= 0x0200)\r
+                       SecureHelper::strcpy_x(m_lf.lfFaceName, _countof(m_lf.lfFaceName), cf.szFaceName);\r
+#else // !(_RICHEDIT_VER >= 0x0200)\r
+                       SecureHelper::strcpy_x(m_lf.lfFaceName, _countof(m_lf.lfFaceName), A2T((LPSTR)cf.szFaceName));\r
+#endif // !(_RICHEDIT_VER >= 0x0200)\r
+               }\r
+               else\r
+               {\r
+                       m_lf.lfPitchAndFamily = DEFAULT_PITCH|FF_DONTCARE;\r
+                       m_lf.lfFaceName[0] = (TCHAR)0;\r
+               }\r
+               return dwFlags;\r
+       }\r
+};\r
+\r
+class CRichEditFontDialog : public CRichEditFontDialogImpl<CRichEditFontDialog>\r
+{\r
+public:\r
+       CRichEditFontDialog(const CHARFORMAT& charformat,\r
+               DWORD dwFlags = CF_SCREENFONTS,\r
+               HDC hDCPrinter = NULL,\r
+               HWND hWndParent = NULL)\r
+               : CRichEditFontDialogImpl<CRichEditFontDialog>(charformat, dwFlags, hDCPrinter, hWndParent)\r
+       { }\r
+\r
+       DECLARE_EMPTY_MSG_MAP()\r
+};\r
+\r
+#endif // defined(_RICHEDIT_) && !defined(_WIN32_WCE)\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CColorDialogImpl - color selection\r
+\r
+#if !defined(_WIN32_WCE) || ((_WIN32_WCE > 420) && !(defined(WIN32_PLATFORM_WFSP) && (_WIN32_WCE > 0x0500)))\r
+\r
+#ifdef _WIN32_WCE\r
+  #pragma comment(lib, "commdlg.lib")\r
+\r
+  #ifndef SETRGBSTRING\r
+    #define SETRGBSTRING _T("commdlg_SetRGBColor")\r
+  #endif\r
+\r
+  #ifndef COLOROKSTRING\r
+    #define COLOROKSTRING _T("commdlg_ColorOK")\r
+  #endif\r
+#endif\r
+\r
+template <class T>\r
+class ATL_NO_VTABLE CColorDialogImpl : public CCommonDialogImplBase\r
+{\r
+public:\r
+       CHOOSECOLOR m_cc;\r
+\r
+// Constructor\r
+       CColorDialogImpl(COLORREF clrInit = 0, DWORD dwFlags = 0, HWND hWndParent = NULL)\r
+       {\r
+               memset(&m_cc, 0, sizeof(m_cc));\r
+\r
+               m_cc.lStructSize = sizeof(m_cc);\r
+               m_cc.lpCustColors = GetCustomColors();\r
+               m_cc.hwndOwner = hWndParent;\r
+               m_cc.Flags = dwFlags | CC_ENABLEHOOK;\r
+               m_cc.lpfnHook = (LPCCHOOKPROC)T::HookProc;\r
+\r
+               if(clrInit != 0)\r
+               {\r
+                       m_cc.rgbResult = clrInit;\r
+                       m_cc.Flags |= CC_RGBINIT;\r
+               }\r
+       }\r
+\r
+// Operations\r
+       INT_PTR DoModal(HWND hWndParent = ::GetActiveWindow())\r
+       {\r
+               ATLASSERT((m_cc.Flags & CC_ENABLEHOOK) != 0);\r
+               ATLASSERT(m_cc.lpfnHook != NULL);   // can still be a user hook\r
+\r
+               if(m_cc.hwndOwner == NULL)          // set only if not specified before\r
+                       m_cc.hwndOwner = hWndParent;\r
+\r
+               ATLASSERT(m_hWnd == NULL);\r
+               ModuleHelper::AddCreateWndData(&m_thunk.cd, (CCommonDialogImplBase*)this);\r
+\r
+               BOOL bRet = ::ChooseColor(&m_cc);\r
+\r
+               m_hWnd = NULL;\r
+\r
+               return bRet ? IDOK : IDCANCEL;\r
+       }\r
+\r
+       // Set the current color while dialog is displayed\r
+       void SetCurrentColor(COLORREF clr)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               SendMessage(_GetSetRGBMessage(), 0, (LPARAM)clr);\r
+       }\r
+\r
+       // Get the selected color after DoModal returns, or in OnColorOK\r
+       COLORREF GetColor() const\r
+       {\r
+               return m_cc.rgbResult;\r
+       }\r
+\r
+// Special override for the color dialog\r
+       static UINT_PTR APIENTRY HookProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)\r
+       {\r
+               if(uMsg != WM_INITDIALOG && uMsg != _GetColorOKMessage())\r
+                       return 0;\r
+\r
+               LPCHOOSECOLOR lpCC = (LPCHOOSECOLOR)lParam;\r
+               CCommonDialogImplBase* pT = NULL;\r
+\r
+               if(uMsg == WM_INITDIALOG)\r
+               {\r
+                       pT = (CCommonDialogImplBase*)ModuleHelper::ExtractCreateWndData();\r
+                       lpCC->lCustData = (LPARAM)pT;\r
+                       ATLASSERT(pT != NULL);\r
+                       ATLASSERT(pT->m_hWnd == NULL);\r
+                       ATLASSERT(::IsWindow(hWnd));\r
+                       // subclass dialog's window\r
+                       if(!pT->SubclassWindow(hWnd))\r
+                       {\r
+                               ATLTRACE2(atlTraceUI, 0, _T("Subclassing a Color common dialog failed\n"));\r
+                               return 0;\r
+                       }\r
+               }\r
+               else if(uMsg == _GetColorOKMessage())\r
+               {\r
+                       pT = (CCommonDialogImplBase*)lpCC->lCustData;\r
+                       ATLASSERT(pT != NULL);\r
+                       ATLASSERT(::IsWindow(pT->m_hWnd));\r
+               }\r
+\r
+               // pass to the message map\r
+               LRESULT lRes;\r
+               if(pT->ProcessWindowMessage(pT->m_hWnd, uMsg, wParam, lParam, lRes, 0) == FALSE)\r
+                       return 0;\r
+               return lRes;\r
+       }\r
+\r
+// Helpers\r
+       static COLORREF* GetCustomColors()\r
+       {\r
+               static COLORREF rgbCustomColors[16] =\r
+               {\r
+                       RGB(255, 255, 255), RGB(255, 255, 255), \r
+                       RGB(255, 255, 255), RGB(255, 255, 255), \r
+                       RGB(255, 255, 255), RGB(255, 255, 255), \r
+                       RGB(255, 255, 255), RGB(255, 255, 255), \r
+                       RGB(255, 255, 255), RGB(255, 255, 255), \r
+                       RGB(255, 255, 255), RGB(255, 255, 255), \r
+                       RGB(255, 255, 255), RGB(255, 255, 255), \r
+                       RGB(255, 255, 255), RGB(255, 255, 255), \r
+               };\r
+\r
+               return rgbCustomColors;\r
+       }\r
+\r
+       static UINT _GetSetRGBMessage()\r
+       {\r
+               static UINT uSetRGBMessage = 0;\r
+               if(uSetRGBMessage == 0)\r
+               {\r
+                       CStaticDataInitCriticalSectionLock lock;\r
+                       if(FAILED(lock.Lock()))\r
+                       {\r
+                               ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CColorDialogImpl::_GetSetRGBMessage.\n"));\r
+                               ATLASSERT(FALSE);\r
+                               return 0;\r
+                       }\r
+\r
+                       if(uSetRGBMessage == 0)\r
+                               uSetRGBMessage = ::RegisterWindowMessage(SETRGBSTRING);\r
+\r
+                       lock.Unlock();\r
+               }\r
+               ATLASSERT(uSetRGBMessage != 0);\r
+               return uSetRGBMessage;\r
+       }\r
+\r
+       static UINT _GetColorOKMessage()\r
+       {\r
+               static UINT uColorOKMessage = 0;\r
+               if(uColorOKMessage == 0)\r
+               {\r
+                       CStaticDataInitCriticalSectionLock lock;\r
+                       if(FAILED(lock.Lock()))\r
+                       {\r
+                               ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CColorDialogImpl::_GetColorOKMessage.\n"));\r
+                               ATLASSERT(FALSE);\r
+                               return 0;\r
+                       }\r
+\r
+                       if(uColorOKMessage == 0)\r
+                               uColorOKMessage = ::RegisterWindowMessage(COLOROKSTRING);\r
+\r
+                       lock.Unlock();\r
+               }\r
+               ATLASSERT(uColorOKMessage != 0);\r
+               return uColorOKMessage;\r
+       }\r
+\r
+// Message map and handlers\r
+       BEGIN_MSG_MAP(CColorDialogImpl)\r
+               MESSAGE_HANDLER(_GetColorOKMessage(), _OnColorOK)\r
+       END_MSG_MAP()\r
+\r
+       LRESULT _OnColorOK(UINT, WPARAM, LPARAM, BOOL&)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               return pT->OnColorOK();\r
+       }\r
+\r
+// Overrideable\r
+       BOOL OnColorOK()        // validate color\r
+       {\r
+               return FALSE;\r
+       }\r
+};\r
+\r
+class CColorDialog : public CColorDialogImpl<CColorDialog>\r
+{\r
+public:\r
+       CColorDialog(COLORREF clrInit = 0, DWORD dwFlags = 0, HWND hWndParent = NULL)\r
+               : CColorDialogImpl<CColorDialog>(clrInit, dwFlags, hWndParent)\r
+       { }\r
+\r
+       // override base class map and references to handlers\r
+       DECLARE_EMPTY_MSG_MAP()\r
+};\r
+\r
+#endif // !defined(_WIN32_WCE) || ((_WIN32_WCE > 420) && !(defined(WIN32_PLATFORM_WFSP) && (_WIN32_WCE > 0x0500)))\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CPrintDialogImpl - used for Print... and PrintSetup...\r
+\r
+#ifndef _WIN32_WCE\r
+\r
+// global helper\r
+static HDC _AtlCreateDC(HGLOBAL hDevNames, HGLOBAL hDevMode)\r
+{\r
+       if(hDevNames == NULL)\r
+               return NULL;\r
+\r
+       LPDEVNAMES lpDevNames = (LPDEVNAMES)::GlobalLock(hDevNames);\r
+       LPDEVMODE  lpDevMode = (hDevMode != NULL) ? (LPDEVMODE)::GlobalLock(hDevMode) : NULL;\r
+\r
+       if(lpDevNames == NULL)\r
+               return NULL;\r
+\r
+       HDC hDC = ::CreateDC((LPCTSTR)lpDevNames + lpDevNames->wDriverOffset,\r
+                                         (LPCTSTR)lpDevNames + lpDevNames->wDeviceOffset,\r
+                                         (LPCTSTR)lpDevNames + lpDevNames->wOutputOffset,\r
+                                         lpDevMode);\r
+\r
+       ::GlobalUnlock(hDevNames);\r
+       if(hDevMode != NULL)\r
+               ::GlobalUnlock(hDevMode);\r
+       return hDC;\r
+}\r
+\r
+template <class T>\r
+class ATL_NO_VTABLE CPrintDialogImpl : public CCommonDialogImplBase\r
+{\r
+public:\r
+       // print dialog parameter block (note this is a reference)\r
+       PRINTDLG& m_pd;\r
+\r
+// Constructors\r
+       CPrintDialogImpl(BOOL bPrintSetupOnly = FALSE,  // TRUE for Print Setup, FALSE for Print Dialog\r
+                       DWORD dwFlags = PD_ALLPAGES | PD_USEDEVMODECOPIES | PD_NOPAGENUMS | PD_NOSELECTION,\r
+                       HWND hWndParent = NULL)\r
+                       : m_pd(m_pdActual)\r
+       {\r
+               memset(&m_pdActual, 0, sizeof(m_pdActual));\r
+\r
+               m_pd.lStructSize = sizeof(m_pdActual);\r
+               m_pd.hwndOwner = hWndParent;\r
+               m_pd.Flags = (dwFlags | PD_ENABLEPRINTHOOK | PD_ENABLESETUPHOOK);\r
+               m_pd.lpfnPrintHook = (LPPRINTHOOKPROC)T::HookProc;\r
+               m_pd.lpfnSetupHook = (LPSETUPHOOKPROC)T::HookProc;\r
+\r
+               if(bPrintSetupOnly)\r
+                       m_pd.Flags |= PD_PRINTSETUP;\r
+               else\r
+                       m_pd.Flags |= PD_RETURNDC;\r
+\r
+               m_pd.Flags &= ~PD_RETURNIC; // do not support information context\r
+       }\r
+\r
+// Operations\r
+       INT_PTR DoModal(HWND hWndParent = ::GetActiveWindow())\r
+       {\r
+               ATLASSERT((m_pd.Flags & PD_ENABLEPRINTHOOK) != 0);\r
+               ATLASSERT((m_pd.Flags & PD_ENABLESETUPHOOK) != 0);\r
+               ATLASSERT(m_pd.lpfnPrintHook != NULL);   // can still be a user hook\r
+               ATLASSERT(m_pd.lpfnSetupHook != NULL);   // can still be a user hook\r
+               ATLASSERT((m_pd.Flags & PD_RETURNDEFAULT) == 0);   // use GetDefaults for this\r
+\r
+               if(m_pd.hwndOwner == NULL)   // set only if not specified before\r
+                       m_pd.hwndOwner = hWndParent;\r
+\r
+               ATLASSERT(m_hWnd == NULL);\r
+               ModuleHelper::AddCreateWndData(&m_thunk.cd, (CCommonDialogImplBase*)this);\r
+\r
+               BOOL bRet = ::PrintDlg(&m_pd);\r
+\r
+               m_hWnd = NULL;\r
+\r
+               return bRet ? IDOK : IDCANCEL;\r
+       }\r
+\r
+       // GetDefaults will not display a dialog but will get device defaults\r
+       BOOL GetDefaults()\r
+       {\r
+               m_pd.Flags |= PD_RETURNDEFAULT;\r
+               ATLASSERT(m_pd.hDevMode == NULL);    // must be NULL\r
+               ATLASSERT(m_pd.hDevNames == NULL);   // must be NULL\r
+\r
+               return ::PrintDlg(&m_pd);\r
+       }\r
+\r
+       // Helpers for parsing information after successful return num. copies requested\r
+       int GetCopies() const\r
+       {\r
+               if((m_pd.Flags & PD_USEDEVMODECOPIES) != 0)\r
+               {\r
+                       LPDEVMODE lpDevMode = GetDevMode();\r
+                       return (lpDevMode != NULL) ? lpDevMode->dmCopies : -1;\r
+               }\r
+\r
+               return m_pd.nCopies;\r
+       }\r
+\r
+       BOOL PrintCollate() const       // TRUE if collate checked\r
+       {\r
+               return ((m_pd.Flags & PD_COLLATE) != 0) ? TRUE : FALSE;\r
+       }\r
+\r
+       BOOL PrintSelection() const     // TRUE if printing selection\r
+       {\r
+               return ((m_pd.Flags & PD_SELECTION) != 0) ? TRUE : FALSE;\r
+       }\r
+\r
+       BOOL PrintAll() const           // TRUE if printing all pages\r
+       {\r
+               return (!PrintRange() && !PrintSelection()) ? TRUE : FALSE;\r
+       }\r
+\r
+       BOOL PrintRange() const         // TRUE if printing page range\r
+       {\r
+               return ((m_pd.Flags & PD_PAGENUMS) != 0) ? TRUE : FALSE;\r
+       }\r
+\r
+       BOOL PrintToFile() const        // TRUE if printing to a file\r
+       {\r
+               return ((m_pd.Flags & PD_PRINTTOFILE) != 0) ? TRUE : FALSE;\r
+       }\r
+\r
+       int GetFromPage() const         // starting page if valid\r
+       {\r
+               return PrintRange() ? m_pd.nFromPage : -1;\r
+       }\r
+\r
+       int GetToPage() const           // ending page if valid\r
+       {\r
+               return PrintRange() ? m_pd.nToPage : -1;\r
+       }\r
+\r
+       LPDEVMODE GetDevMode() const    // return DEVMODE\r
+       {\r
+               if(m_pd.hDevMode == NULL)\r
+                       return NULL;\r
+\r
+               return (LPDEVMODE)::GlobalLock(m_pd.hDevMode);\r
+       }\r
+\r
+       LPCTSTR GetDriverName() const   // return driver name\r
+       {\r
+               if(m_pd.hDevNames == NULL)\r
+                       return NULL;\r
+\r
+               LPDEVNAMES lpDev = (LPDEVNAMES)::GlobalLock(m_pd.hDevNames);\r
+               if(lpDev == NULL)\r
+                       return NULL;\r
+\r
+               return (LPCTSTR)lpDev + lpDev->wDriverOffset;\r
+       }\r
+\r
+       LPCTSTR GetDeviceName() const   // return device name\r
+       {\r
+               if(m_pd.hDevNames == NULL)\r
+                       return NULL;\r
+\r
+               LPDEVNAMES lpDev = (LPDEVNAMES)::GlobalLock(m_pd.hDevNames);\r
+               if(lpDev == NULL)\r
+                       return NULL;\r
+\r
+               return (LPCTSTR)lpDev + lpDev->wDeviceOffset;\r
+       }\r
+\r
+       LPCTSTR GetPortName() const     // return output port name\r
+       {\r
+               if(m_pd.hDevNames == NULL)\r
+                       return NULL;\r
+\r
+               LPDEVNAMES lpDev = (LPDEVNAMES)::GlobalLock(m_pd.hDevNames);\r
+               if(lpDev == NULL)\r
+                       return NULL;\r
+\r
+               return (LPCTSTR)lpDev + lpDev->wOutputOffset;\r
+       }\r
+\r
+       HDC GetPrinterDC() const        // return HDC (caller must delete)\r
+       {\r
+               ATLASSERT((m_pd.Flags & PD_RETURNDC) != 0);\r
+               return m_pd.hDC;\r
+       }\r
+\r
+       // This helper creates a DC based on the DEVNAMES and DEVMODE structures.\r
+       // This DC is returned, but also stored in m_pd.hDC as though it had been\r
+       // returned by CommDlg.  It is assumed that any previously obtained DC\r
+       // has been/will be deleted by the user.  This may be\r
+       // used without ever invoking the print/print setup dialogs.\r
+       HDC CreatePrinterDC()\r
+       {\r
+               m_pd.hDC = _AtlCreateDC(m_pd.hDevNames, m_pd.hDevMode);\r
+               return m_pd.hDC;\r
+       }\r
+\r
+// Implementation\r
+       PRINTDLG m_pdActual; // the Print/Print Setup need to share this\r
+\r
+       // The following handle the case of print setup... from the print dialog\r
+       CPrintDialogImpl(PRINTDLG& pdInit) : m_pd(pdInit)\r
+       { }\r
+\r
+       BEGIN_MSG_MAP(CPrintDialogImpl)\r
+#ifdef psh1\r
+               COMMAND_ID_HANDLER(psh1, OnPrintSetup) // print setup button when print is displayed\r
+#else // !psh1\r
+               COMMAND_ID_HANDLER(0x0400, OnPrintSetup) // value from dlgs.h\r
+#endif // !psh1\r
+       END_MSG_MAP()\r
+\r
+       LRESULT OnPrintSetup(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& /*bHandled*/)\r
+       {\r
+               T dlgSetup(m_pd);\r
+               ModuleHelper::AddCreateWndData(&dlgSetup.m_thunk.cd, (CCommonDialogImplBase*)&dlgSetup);\r
+               return DefWindowProc(WM_COMMAND, MAKEWPARAM(wID, wNotifyCode), (LPARAM)hWndCtl);\r
+       }\r
+};\r
+\r
+class CPrintDialog : public CPrintDialogImpl<CPrintDialog>\r
+{\r
+public:\r
+       CPrintDialog(BOOL bPrintSetupOnly = FALSE,\r
+               DWORD dwFlags = PD_ALLPAGES | PD_USEDEVMODECOPIES | PD_NOPAGENUMS | PD_NOSELECTION,\r
+               HWND hWndParent = NULL)\r
+               : CPrintDialogImpl<CPrintDialog>(bPrintSetupOnly, dwFlags, hWndParent)\r
+       { }\r
+\r
+       CPrintDialog(PRINTDLG& pdInit) : CPrintDialogImpl<CPrintDialog>(pdInit)\r
+       { }\r
+};\r
+\r
+#endif // _WIN32_WCE\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CPrintDialogExImpl - new print dialog for Windows 2000\r
+\r
+#if (WINVER >= 0x0500) && !defined(_WIN32_WCE)\r
+\r
+}; // namespace WTL\r
+\r
+#include <atlcom.h>\r
+\r
+extern "C" const __declspec(selectany) IID IID_IPrintDialogCallback = {0x5852a2c3, 0x6530, 0x11d1, {0xb6, 0xa3, 0x0, 0x0, 0xf8, 0x75, 0x7b, 0xf9}};\r
+extern "C" const __declspec(selectany) IID IID_IPrintDialogServices = {0x509aaeda, 0x5639, 0x11d1, {0xb6, 0xa1, 0x0, 0x0, 0xf8, 0x75, 0x7b, 0xf9}};\r
+\r
+namespace WTL\r
+{\r
+\r
+template <class T>\r
+class ATL_NO_VTABLE CPrintDialogExImpl : \r
+                               public ATL::CWindow,\r
+                               public ATL::CMessageMap,\r
+                               public IPrintDialogCallback,\r
+                               public ATL::IObjectWithSiteImpl< T >\r
+{\r
+public:\r
+       PRINTDLGEX m_pdex;\r
+\r
+// Constructor\r
+       CPrintDialogExImpl(DWORD dwFlags = PD_ALLPAGES | PD_USEDEVMODECOPIES | PD_NOPAGENUMS | PD_NOSELECTION | PD_NOCURRENTPAGE,\r
+                               HWND hWndParent = NULL)\r
+       {\r
+               memset(&m_pdex, 0, sizeof(m_pdex));\r
+\r
+               m_pdex.lStructSize = sizeof(PRINTDLGEX);\r
+               m_pdex.hwndOwner = hWndParent;\r
+               m_pdex.Flags = dwFlags;\r
+               m_pdex.nStartPage = START_PAGE_GENERAL;\r
+               // callback object will be set in DoModal\r
+\r
+               m_pdex.Flags &= ~PD_RETURNIC; // do not support information context\r
+       }\r
+\r
+// Operations\r
+       HRESULT DoModal(HWND hWndParent = ::GetActiveWindow())\r
+       {\r
+               ATLASSERT(m_hWnd == NULL);\r
+               ATLASSERT((m_pdex.Flags & PD_RETURNDEFAULT) == 0);   // use GetDefaults for this\r
+\r
+               if(m_pdex.hwndOwner == NULL)   // set only if not specified before\r
+                       m_pdex.hwndOwner = hWndParent;\r
+\r
+               T* pT = static_cast<T*>(this);\r
+               m_pdex.lpCallback = (IUnknown*)(IPrintDialogCallback*)pT;\r
+\r
+               HRESULT hResult = ::PrintDlgEx(&m_pdex);\r
+\r
+               m_hWnd = NULL;\r
+\r
+               return hResult;\r
+       }\r
+\r
+       BOOL EndDialog(INT_PTR /*nRetCode*/ = 0)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               SendMessage(WM_COMMAND, MAKEWPARAM(IDABORT, 0));\r
+               return TRUE;\r
+       }\r
+\r
+       // GetDefaults will not display a dialog but will get device defaults\r
+       HRESULT GetDefaults()\r
+       {\r
+               m_pdex.Flags |= PD_RETURNDEFAULT;\r
+               ATLASSERT(m_pdex.hDevMode == NULL);    // must be NULL\r
+               ATLASSERT(m_pdex.hDevNames == NULL);   // must be NULL\r
+\r
+               return ::PrintDlgEx(&m_pdex);\r
+       }\r
+\r
+       // Helpers for parsing information after successful return num. copies requested\r
+       int GetCopies() const\r
+       {\r
+               if((m_pdex.Flags & PD_USEDEVMODECOPIES) != 0)\r
+               {\r
+                       LPDEVMODE lpDevMode = GetDevMode();\r
+                       return (lpDevMode != NULL) ? lpDevMode->dmCopies : -1;\r
+               }\r
+\r
+               return m_pdex.nCopies;\r
+       }\r
+\r
+       BOOL PrintCollate() const       // TRUE if collate checked\r
+       {\r
+               return ((m_pdex.Flags & PD_COLLATE) != 0) ? TRUE : FALSE;\r
+       }\r
+\r
+       BOOL PrintSelection() const     // TRUE if printing selection\r
+       {\r
+               return ((m_pdex.Flags & PD_SELECTION) != 0) ? TRUE : FALSE;\r
+       }\r
+\r
+       BOOL PrintAll() const           // TRUE if printing all pages\r
+       {\r
+               return (!PrintRange() && !PrintSelection()) ? TRUE : FALSE;\r
+       }\r
+\r
+       BOOL PrintRange() const         // TRUE if printing page range\r
+       {\r
+               return ((m_pdex.Flags & PD_PAGENUMS) != 0) ? TRUE : FALSE;\r
+       }\r
+\r
+       BOOL PrintToFile() const        // TRUE if printing to a file\r
+       {\r
+               return ((m_pdex.Flags & PD_PRINTTOFILE) != 0) ? TRUE : FALSE;\r
+       }\r
+\r
+       LPDEVMODE GetDevMode() const    // return DEVMODE\r
+       {\r
+               if(m_pdex.hDevMode == NULL)\r
+                       return NULL;\r
+\r
+               return (LPDEVMODE)::GlobalLock(m_pdex.hDevMode);\r
+       }\r
+\r
+       LPCTSTR GetDriverName() const   // return driver name\r
+       {\r
+               if(m_pdex.hDevNames == NULL)\r
+                       return NULL;\r
+\r
+               LPDEVNAMES lpDev = (LPDEVNAMES)::GlobalLock(m_pdex.hDevNames);\r
+               if(lpDev == NULL)\r
+                       return NULL;\r
+\r
+               return (LPCTSTR)lpDev + lpDev->wDriverOffset;\r
+       }\r
+\r
+       LPCTSTR GetDeviceName() const   // return device name\r
+       {\r
+               if(m_pdex.hDevNames == NULL)\r
+                       return NULL;\r
+\r
+               LPDEVNAMES lpDev = (LPDEVNAMES)::GlobalLock(m_pdex.hDevNames);\r
+               if(lpDev == NULL)\r
+                       return NULL;\r
+\r
+               return (LPCTSTR)lpDev + lpDev->wDeviceOffset;\r
+       }\r
+\r
+       LPCTSTR GetPortName() const     // return output port name\r
+       {\r
+               if(m_pdex.hDevNames == NULL)\r
+                       return NULL;\r
+\r
+               LPDEVNAMES lpDev = (LPDEVNAMES)::GlobalLock(m_pdex.hDevNames);\r
+               if(lpDev == NULL)\r
+                       return NULL;\r
+\r
+               return (LPCTSTR)lpDev + lpDev->wOutputOffset;\r
+       }\r
+\r
+       HDC GetPrinterDC() const        // return HDC (caller must delete)\r
+       {\r
+               ATLASSERT((m_pdex.Flags & PD_RETURNDC) != 0);\r
+               return m_pdex.hDC;\r
+       }\r
+\r
+       // This helper creates a DC based on the DEVNAMES and DEVMODE structures.\r
+       // This DC is returned, but also stored in m_pdex.hDC as though it had been\r
+       // returned by CommDlg.  It is assumed that any previously obtained DC\r
+       // has been/will be deleted by the user.  This may be\r
+       // used without ever invoking the print/print setup dialogs.\r
+       HDC CreatePrinterDC()\r
+       {\r
+               m_pdex.hDC = _AtlCreateDC(m_pdex.hDevNames, m_pdex.hDevMode);\r
+               return m_pdex.hDC;\r
+       }\r
+\r
+// Implementation - interfaces\r
+\r
+// IUnknown\r
+       STDMETHOD(QueryInterface)(REFIID riid, void** ppvObject)\r
+       {\r
+               if(ppvObject == NULL)\r
+                       return E_POINTER;\r
+\r
+               T* pT = static_cast<T*>(this);\r
+               if(IsEqualGUID(riid, IID_IUnknown) || IsEqualGUID(riid, IID_IPrintDialogCallback))\r
+               {\r
+                       *ppvObject = (IPrintDialogCallback*)pT;\r
+                       // AddRef() not needed\r
+                       return S_OK;\r
+               }\r
+               else if(IsEqualGUID(riid, IID_IObjectWithSite))\r
+               {\r
+                       *ppvObject = (IObjectWithSite*)pT;\r
+                       // AddRef() not needed\r
+                       return S_OK;\r
+               }\r
+\r
+               return E_NOINTERFACE;\r
+       }\r
+\r
+       virtual ULONG STDMETHODCALLTYPE AddRef()\r
+       {\r
+               return 1;\r
+       }\r
+\r
+       virtual ULONG STDMETHODCALLTYPE Release()\r
+       {\r
+               return 1;\r
+       }\r
+\r
+// IPrintDialogCallback\r
+       STDMETHOD(InitDone)()\r
+       {\r
+               return S_FALSE;\r
+       }\r
+\r
+       STDMETHOD(SelectionChange)()\r
+       {\r
+               return S_FALSE;\r
+       }\r
+\r
+       STDMETHOD(HandleMessage)(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT* plResult)\r
+       {\r
+               // set up m_hWnd the first time\r
+               if(m_hWnd == NULL)\r
+                       Attach(hWnd);\r
+\r
+               // call message map\r
+               HRESULT hRet = ProcessWindowMessage(hWnd, uMsg, wParam, lParam, *plResult, 0) ? S_OK : S_FALSE;\r
+               if(hRet == S_OK && uMsg == WM_NOTIFY)   // return in DWLP_MSGRESULT\r
+                       ::SetWindowLongPtr(GetParent(), DWLP_MSGRESULT, (LONG_PTR)*plResult);\r
+\r
+               if(uMsg == WM_INITDIALOG && hRet == S_OK && (BOOL)*plResult != FALSE)\r
+                       hRet = S_FALSE;\r
+\r
+               return hRet;\r
+       }\r
+};\r
+\r
+class CPrintDialogEx : public CPrintDialogExImpl<CPrintDialogEx>\r
+{\r
+public:\r
+       CPrintDialogEx(\r
+               DWORD dwFlags = PD_ALLPAGES | PD_USEDEVMODECOPIES | PD_NOPAGENUMS | PD_NOSELECTION | PD_NOCURRENTPAGE,\r
+               HWND hWndParent = NULL)\r
+               : CPrintDialogExImpl<CPrintDialogEx>(dwFlags, hWndParent)\r
+       { }\r
+\r
+       DECLARE_EMPTY_MSG_MAP()\r
+};\r
+\r
+#endif // (WINVER >= 0x0500) && !defined(_WIN32_WCE)\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CPageSetupDialogImpl - Page Setup dialog\r
+\r
+#ifndef _WIN32_WCE\r
+\r
+template <class T>\r
+class ATL_NO_VTABLE CPageSetupDialogImpl : public CCommonDialogImplBase\r
+{\r
+public:\r
+       PAGESETUPDLG m_psd;\r
+       ATL::CWndProcThunk m_thunkPaint;\r
+\r
+// Constructors\r
+       CPageSetupDialogImpl(DWORD dwFlags = PSD_MARGINS | PSD_INWININIINTLMEASURE, HWND hWndParent = NULL)\r
+       {\r
+               memset(&m_psd, 0, sizeof(m_psd));\r
+\r
+               m_psd.lStructSize = sizeof(m_psd);\r
+               m_psd.hwndOwner = hWndParent;\r
+               m_psd.Flags = (dwFlags | PSD_ENABLEPAGESETUPHOOK | PSD_ENABLEPAGEPAINTHOOK);\r
+               m_psd.lpfnPageSetupHook = (LPPAGESETUPHOOK)T::HookProc;\r
+               m_thunkPaint.Init((WNDPROC)T::PaintHookProc, this);\r
+#if (_ATL_VER >= 0x0700)\r
+               m_psd.lpfnPagePaintHook = (LPPAGEPAINTHOOK)m_thunkPaint.GetWNDPROC();\r
+#else\r
+               m_psd.lpfnPagePaintHook = (LPPAGEPAINTHOOK)&(m_thunkPaint.thunk);\r
+#endif\r
+       }\r
+\r
+       DECLARE_EMPTY_MSG_MAP()\r
+\r
+// Attributes\r
+       LPDEVMODE GetDevMode() const    // return DEVMODE\r
+       {\r
+               if(m_psd.hDevMode == NULL)\r
+                       return NULL;\r
+\r
+               return (LPDEVMODE)::GlobalLock(m_psd.hDevMode);\r
+       }\r
+\r
+       LPCTSTR GetDriverName() const   // return driver name\r
+       {\r
+               if(m_psd.hDevNames == NULL)\r
+                       return NULL;\r
+\r
+               LPDEVNAMES lpDev = (LPDEVNAMES)::GlobalLock(m_psd.hDevNames);\r
+               return (LPCTSTR)lpDev + lpDev->wDriverOffset;\r
+       }\r
+\r
+       LPCTSTR GetDeviceName() const   // return device name\r
+       {\r
+               if(m_psd.hDevNames == NULL)\r
+                       return NULL;\r
+\r
+               LPDEVNAMES lpDev = (LPDEVNAMES)::GlobalLock(m_psd.hDevNames);\r
+               return (LPCTSTR)lpDev + lpDev->wDeviceOffset;\r
+       }\r
+\r
+       LPCTSTR GetPortName() const     // return output port name\r
+       {\r
+               if(m_psd.hDevNames == NULL)\r
+                       return NULL;\r
+\r
+               LPDEVNAMES lpDev = (LPDEVNAMES)::GlobalLock(m_psd.hDevNames);\r
+               return (LPCTSTR)lpDev + lpDev->wOutputOffset;\r
+       }\r
+\r
+       HDC CreatePrinterDC()\r
+       {\r
+               return _AtlCreateDC(m_psd.hDevNames, m_psd.hDevMode);\r
+       }\r
+\r
+       SIZE GetPaperSize() const\r
+       {\r
+               SIZE size;\r
+               size.cx = m_psd.ptPaperSize.x;\r
+               size.cy = m_psd.ptPaperSize.y;\r
+               return size;\r
+       }\r
+\r
+       void GetMargins(LPRECT lpRectMargins, LPRECT lpRectMinMargins) const\r
+       {\r
+               if(lpRectMargins != NULL)\r
+                       *lpRectMargins = m_psd.rtMargin;\r
+               if(lpRectMinMargins != NULL)\r
+                       *lpRectMinMargins = m_psd.rtMinMargin;\r
+       }\r
+\r
+// Operations\r
+       INT_PTR DoModal(HWND hWndParent = ::GetActiveWindow())\r
+       {\r
+               ATLASSERT((m_psd.Flags & PSD_ENABLEPAGESETUPHOOK) != 0);\r
+               ATLASSERT((m_psd.Flags & PSD_ENABLEPAGEPAINTHOOK) != 0);\r
+               ATLASSERT(m_psd.lpfnPageSetupHook != NULL);   // can still be a user hook\r
+               ATLASSERT(m_psd.lpfnPagePaintHook != NULL);   // can still be a user hook\r
+\r
+               if(m_psd.hwndOwner == NULL)   // set only if not specified before\r
+                       m_psd.hwndOwner = hWndParent;\r
+\r
+               ATLASSERT(m_hWnd == NULL);\r
+               ModuleHelper::AddCreateWndData(&m_thunk.cd, (CCommonDialogImplBase*)this);\r
+\r
+               BOOL bRet = ::PageSetupDlg(&m_psd);\r
+\r
+               m_hWnd = NULL;\r
+\r
+               return bRet ? IDOK : IDCANCEL;\r
+       }\r
+\r
+// Implementation\r
+       static UINT_PTR CALLBACK PaintHookProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)\r
+       {\r
+               T* pT = (T*)hWnd;\r
+               UINT_PTR uRet = 0;\r
+               switch(uMsg)\r
+               {\r
+               case WM_PSD_PAGESETUPDLG:\r
+                       uRet = pT->PreDrawPage(LOWORD(wParam), HIWORD(wParam), (LPPAGESETUPDLG)lParam);\r
+                       break;\r
+               case WM_PSD_FULLPAGERECT:\r
+               case WM_PSD_MINMARGINRECT:\r
+               case WM_PSD_MARGINRECT:\r
+               case WM_PSD_GREEKTEXTRECT:\r
+               case WM_PSD_ENVSTAMPRECT:\r
+               case WM_PSD_YAFULLPAGERECT:\r
+                       uRet = pT->OnDrawPage(uMsg, (HDC)wParam, (LPRECT)lParam);\r
+                       break;\r
+               default:\r
+                       ATLTRACE2(atlTraceUI, 0, _T("CPageSetupDialogImpl::PaintHookProc - unknown message received\n"));\r
+                       break;\r
+               }\r
+               return uRet;\r
+       }\r
+\r
+// Overridables\r
+       UINT_PTR PreDrawPage(WORD /*wPaper*/, WORD /*wFlags*/, LPPAGESETUPDLG /*pPSD*/)\r
+       {\r
+               // return 1 to prevent any more drawing\r
+               return 0;\r
+       }\r
+\r
+       UINT_PTR OnDrawPage(UINT /*uMsg*/, HDC /*hDC*/, LPRECT /*lpRect*/)\r
+       {\r
+               return 0; // do the default\r
+       }\r
+};\r
+\r
+class CPageSetupDialog : public CPageSetupDialogImpl<CPageSetupDialog>\r
+{\r
+public:\r
+       CPageSetupDialog(DWORD dwFlags = PSD_MARGINS | PSD_INWININIINTLMEASURE, HWND hWndParent = NULL)\r
+               : CPageSetupDialogImpl<CPageSetupDialog>(dwFlags, hWndParent)\r
+       { }\r
+\r
+       // override PaintHookProc and references to handlers\r
+       static UINT_PTR CALLBACK PaintHookProc(HWND, UINT, WPARAM, LPARAM)\r
+       {\r
+               return 0;\r
+       }\r
+};\r
+\r
+#endif // _WIN32_WCE\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CFindReplaceDialogImpl - Find/FindReplace modeless dialogs\r
+\r
+#ifndef _WIN32_WCE\r
+\r
+template <class T>\r
+class ATL_NO_VTABLE CFindReplaceDialogImpl : public CCommonDialogImplBase\r
+{\r
+public:\r
+       enum { _cchFindReplaceBuffer = 128 };\r
+\r
+       FINDREPLACE m_fr;\r
+       TCHAR m_szFindWhat[_cchFindReplaceBuffer];\r
+       TCHAR m_szReplaceWith[_cchFindReplaceBuffer];\r
+\r
+// Constructors\r
+       CFindReplaceDialogImpl()\r
+       {\r
+               memset(&m_fr, 0, sizeof(m_fr));\r
+               m_szFindWhat[0] = _T('\0');\r
+               m_szReplaceWith[0] = _T('\0');\r
+\r
+               m_fr.lStructSize = sizeof(m_fr);\r
+               m_fr.Flags = FR_ENABLEHOOK;\r
+               m_fr.lpfnHook = (LPFRHOOKPROC)T::HookProc;\r
+               m_fr.lpstrFindWhat = (LPTSTR)m_szFindWhat;\r
+               m_fr.wFindWhatLen = _cchFindReplaceBuffer;\r
+               m_fr.lpstrReplaceWith = (LPTSTR)m_szReplaceWith;\r
+               m_fr.wReplaceWithLen = _cchFindReplaceBuffer;\r
+       }\r
+\r
+       // Note: You must allocate the object on the heap.\r
+       //       If you do not, you must override OnFinalMessage()\r
+       virtual void OnFinalMessage(HWND /*hWnd*/)\r
+       {\r
+               delete this;\r
+       }\r
+\r
+       HWND Create(BOOL bFindDialogOnly, // TRUE for Find, FALSE for FindReplace\r
+                       LPCTSTR lpszFindWhat,\r
+                       LPCTSTR lpszReplaceWith = NULL,\r
+                       DWORD dwFlags = FR_DOWN,\r
+                       HWND hWndParent = NULL)\r
+       {\r
+               ATLASSERT((m_fr.Flags & FR_ENABLEHOOK) != 0);\r
+               ATLASSERT(m_fr.lpfnHook != NULL);\r
+\r
+               m_fr.Flags |= dwFlags;\r
+\r
+               if(hWndParent == NULL)\r
+                       m_fr.hwndOwner = ::GetActiveWindow();\r
+               else\r
+                       m_fr.hwndOwner = hWndParent;\r
+               ATLASSERT(m_fr.hwndOwner != NULL); // must have an owner for modeless dialog\r
+\r
+               if(lpszFindWhat != NULL)\r
+                       SecureHelper::strncpy_x(m_szFindWhat, _countof(m_szFindWhat), lpszFindWhat, _TRUNCATE);\r
+\r
+               if(lpszReplaceWith != NULL)\r
+                       SecureHelper::strncpy_x(m_szReplaceWith, _countof(m_szReplaceWith), lpszReplaceWith, _TRUNCATE);\r
+\r
+               ATLASSERT(m_hWnd == NULL);\r
+               ModuleHelper::AddCreateWndData(&m_thunk.cd, (CCommonDialogImplBase*)this);\r
+\r
+               HWND hWnd = NULL;\r
+               if(bFindDialogOnly)\r
+                       hWnd = ::FindText(&m_fr);\r
+               else\r
+                       hWnd = ::ReplaceText(&m_fr);\r
+\r
+               ATLASSERT(m_hWnd == hWnd);\r
+               return hWnd;\r
+       }\r
+\r
+       static const UINT GetFindReplaceMsg()\r
+       {\r
+               static const UINT nMsgFindReplace = ::RegisterWindowMessage(FINDMSGSTRING);\r
+               return nMsgFindReplace;\r
+       }\r
+       // call while handling FINDMSGSTRING registered message\r
+       // to retreive the object\r
+       static T* PASCAL GetNotifier(LPARAM lParam)\r
+       {\r
+               ATLASSERT(lParam != NULL);\r
+               T* pDlg = (T*)(lParam - offsetof(T, m_fr));\r
+               return pDlg;\r
+       }\r
+\r
+// Operations\r
+       // Helpers for parsing information after successful return\r
+       LPCTSTR GetFindString() const    // get find string\r
+       {\r
+               return (LPCTSTR)m_fr.lpstrFindWhat;\r
+       }\r
+\r
+       LPCTSTR GetReplaceString() const // get replacement string\r
+       {\r
+               return (LPCTSTR)m_fr.lpstrReplaceWith;\r
+       }\r
+\r
+       BOOL SearchDown() const          // TRUE if search down, FALSE is up\r
+       {\r
+               return ((m_fr.Flags & FR_DOWN) != 0) ? TRUE : FALSE;\r
+       }\r
+\r
+       BOOL FindNext() const            // TRUE if command is find next\r
+       {\r
+               return ((m_fr.Flags & FR_FINDNEXT) != 0) ? TRUE : FALSE;\r
+       }\r
+\r
+       BOOL MatchCase() const           // TRUE if matching case\r
+       {\r
+               return ((m_fr.Flags & FR_MATCHCASE) != 0) ? TRUE : FALSE;\r
+       }\r
+\r
+       BOOL MatchWholeWord() const      // TRUE if matching whole words only\r
+       {\r
+               return ((m_fr.Flags & FR_WHOLEWORD) != 0) ? TRUE : FALSE;\r
+       }\r
+\r
+       BOOL ReplaceCurrent() const      // TRUE if replacing current string\r
+       {\r
+               return ((m_fr. Flags & FR_REPLACE) != 0) ? TRUE : FALSE;\r
+       }\r
+\r
+       BOOL ReplaceAll() const          // TRUE if replacing all occurrences\r
+       {\r
+               return ((m_fr.Flags & FR_REPLACEALL) != 0) ? TRUE : FALSE;\r
+       }\r
+\r
+       BOOL IsTerminating() const       // TRUE if terminating dialog\r
+       {\r
+               return ((m_fr.Flags & FR_DIALOGTERM) != 0) ? TRUE : FALSE ;\r
+       }\r
+};\r
+\r
+class CFindReplaceDialog : public CFindReplaceDialogImpl<CFindReplaceDialog>\r
+{\r
+public:\r
+       DECLARE_EMPTY_MSG_MAP()\r
+};\r
+\r
+#endif // !_WIN32_WCE\r
+\r
+\r
+#if (_ATL_VER >= 0x800)\r
+typedef ATL::_DialogSplitHelper::DLGTEMPLATEEX DLGTEMPLATEEX;\r
+typedef ATL::_DialogSplitHelper::DLGITEMTEMPLATEEX DLGITEMTEMPLATEEX;\r
+#else // (_ATL_VER >= 0x800)\r
+typedef ATL::_DialogSizeHelper::_ATL_DLGTEMPLATEEX DLGTEMPLATEEX;\r
+#pragma pack(push, 4)\r
+struct DLGITEMTEMPLATEEX\r
+{\r
+       DWORD helpID;\r
+       DWORD exStyle;\r
+       DWORD style;\r
+       short x;\r
+       short y;\r
+       short cx;\r
+       short cy;\r
+       WORD id;\r
+};\r
+#pragma pack(pop)\r
+#endif // (_ATL_VER >= 0x800)\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CMemDlgTemplate - in-memory dialog template - DLGTEMPLATE or DLGTEMPLATEEX\r
+\r
+class CMemDlgTemplate\r
+{\r
+public:\r
+       enum StdCtrlType\r
+       {\r
+               CTRL_BUTTON    = 0x0080,\r
+               CTRL_EDIT      = 0x0081,\r
+               CTRL_STATIC    = 0x0082,\r
+               CTRL_LISTBOX   = 0x0083,\r
+               CTRL_SCROLLBAR = 0x0084,\r
+               CTRL_COMBOBOX  = 0x0085\r
+       };\r
+\r
+       CMemDlgTemplate() : m_pData(NULL), m_pPtr(NULL), m_cAllocated(0)\r
+       { }\r
+\r
+       ~CMemDlgTemplate()\r
+       {\r
+               Reset();\r
+       }\r
+\r
+       bool IsValid() const\r
+       {\r
+               return (m_pData != NULL);\r
+       }\r
+\r
+       bool IsTemplateEx() const\r
+       {\r
+               return (IsValid() && ((DLGTEMPLATEEX*)m_pData)->signature == 0xFFFF);\r
+       }\r
+\r
+       LPDLGTEMPLATE GetTemplatePtr()\r
+       {\r
+               return reinterpret_cast<LPDLGTEMPLATE>(m_pData);\r
+       }\r
+\r
+       DLGTEMPLATEEX* GetTemplateExPtr()\r
+       {\r
+               return reinterpret_cast<DLGTEMPLATEEX*>(m_pData);\r
+       }\r
+\r
+       void Reset()\r
+       {\r
+               if (IsValid())\r
+                       ATLVERIFY(::GlobalFree(m_pData) == NULL);\r
+\r
+               m_pData = NULL;\r
+               m_pPtr = NULL;\r
+               m_cAllocated = 0;\r
+       }\r
+\r
+       void Create(bool bDlgEx, LPCTSTR lpszCaption, short nX, short nY, short nWidth, short nHeight, DWORD dwStyle = 0, DWORD dwExStyle = 0, \r
+                   LPCTSTR lpstrFontName = NULL, WORD wFontSize = 0, WORD wWeight = 0, BYTE bItalic = 0, BYTE bCharset = 0, DWORD dwHelpID = 0,\r
+                               ATL::_U_STRINGorID ClassName = 0U, ATL::_U_STRINGorID Menu = 0U)\r
+       {\r
+               // Should have DS_SETFONT style to set the dialog font name and size\r
+               if (lpstrFontName != NULL)\r
+               {\r
+                       dwStyle |= DS_SETFONT;\r
+               }\r
+               else\r
+               {\r
+                       dwStyle &= ~DS_SETFONT;\r
+               }\r
+\r
+               if (bDlgEx)\r
+               {\r
+                       DLGTEMPLATEEX dlg = {1, 0xFFFF, dwHelpID, dwExStyle, dwStyle, 0, nX, nY, nWidth, nHeight};\r
+                       AddData(&dlg, sizeof(dlg));\r
+               }\r
+               else\r
+               {\r
+                       DLGTEMPLATE dlg = {dwStyle, dwExStyle, 0, nX, nY, nWidth, nHeight};\r
+                       AddData(&dlg, sizeof(dlg));\r
+               }\r
+\r
+#ifndef _WIN32_WCE\r
+               if (Menu.m_lpstr == NULL)\r
+               {\r
+                       WORD menuData = 0;\r
+                       AddData(&menuData, sizeof(WORD));\r
+               }\r
+               else if (IS_INTRESOURCE(Menu.m_lpstr))\r
+               {\r
+                       WORD menuData[] = {0xFFFF, (WORD)Menu.m_lpstr};\r
+                       AddData(menuData, sizeof(menuData));\r
+               }\r
+               else\r
+               {\r
+                       AddString(Menu.m_lpstr);\r
+               }\r
+#else // _WIN32_WCE\r
+               // Windows CE doesn't support the addition of menus to a dialog box\r
+               ATLASSERT(Menu.m_lpstr == NULL);\r
+               Menu.m_lpstr;   // avoid level 4 warning\r
+               WORD menuData = 0;\r
+               AddData(&menuData, sizeof(WORD));\r
+#endif // _WIN32_WCE\r
+\r
+               if (ClassName.m_lpstr == NULL)\r
+               {\r
+                       WORD classData = 0;\r
+                       AddData(&classData, sizeof(WORD));\r
+               }\r
+               else if (IS_INTRESOURCE(ClassName.m_lpstr))\r
+               {\r
+                       WORD classData[] = {0xFFFF, (WORD)ClassName.m_lpstr};\r
+                       AddData(classData, sizeof(classData));\r
+               }\r
+               else\r
+               {\r
+                       AddString(ClassName.m_lpstr);\r
+               }\r
+\r
+               // Set dialog caption\r
+               AddString(lpszCaption);\r
+\r
+               if (lpstrFontName != NULL)\r
+               {\r
+                       AddData(&wFontSize, sizeof(wFontSize));\r
+\r
+                       if (bDlgEx)\r
+                       {\r
+                               AddData(&wWeight, sizeof(wWeight));\r
+                               AddData(&bItalic, sizeof(bItalic));\r
+                               AddData(&bCharset, sizeof(bCharset));\r
+                       }\r
+\r
+                       AddString(lpstrFontName);\r
+               }\r
+       }\r
+\r
+       void AddControl(ATL::_U_STRINGorID ClassName, WORD wId, short nX, short nY, short nWidth, short nHeight, DWORD dwStyle, DWORD dwExStyle,\r
+                       ATL::_U_STRINGorID Text, const WORD* pCreationData = NULL, WORD nCreationData = 0, DWORD dwHelpID = 0)\r
+       {\r
+               ATLASSERT(IsValid());\r
+\r
+               // DWORD align data\r
+               m_pPtr = (LPBYTE)(DWORD_PTR)((DWORD)(DWORD_PTR)(m_pPtr + 3) & (~3));\r
+\r
+               if (IsTemplateEx())\r
+               {\r
+                       DLGTEMPLATEEX* dlg = (DLGTEMPLATEEX*)m_pData;\r
+                       dlg->cDlgItems++;\r
+\r
+                       DLGITEMTEMPLATEEX item = {dwHelpID, ATL::CControlWinTraits::GetWndExStyle(0) | dwExStyle, ATL::CControlWinTraits::GetWndStyle(0) | dwStyle, nX, nY, nWidth, nHeight, wId};\r
+                       AddData(&item, sizeof(item));\r
+               }\r
+               else\r
+               {\r
+                       LPDLGTEMPLATE dlg = (LPDLGTEMPLATE)m_pData;\r
+                       dlg->cdit++;\r
+\r
+                       DLGITEMTEMPLATE item = {ATL::CControlWinTraits::GetWndStyle(0) | dwStyle, ATL::CControlWinTraits::GetWndExStyle(0) | dwExStyle, nX, nY, nWidth, nHeight, wId};\r
+                       AddData(&item, sizeof(item));\r
+               }\r
+\r
+               ATLASSERT(ClassName.m_lpstr != NULL);\r
+               if (IS_INTRESOURCE(ClassName.m_lpstr))\r
+               {\r
+                       WORD wData[] = {0xFFFF, (WORD)ClassName.m_lpstr};\r
+                       AddData(wData, sizeof(wData));\r
+               }\r
+               else\r
+               {\r
+                       AddString(ClassName.m_lpstr);\r
+               }\r
+\r
+               if (Text.m_lpstr == NULL)\r
+               {\r
+                       WORD classData = 0;\r
+                       AddData(&classData, sizeof(WORD));\r
+               }\r
+               else if (IS_INTRESOURCE(Text.m_lpstr))\r
+               {\r
+                       WORD wData[] = {0xFFFF, (WORD)Text.m_lpstr};\r
+                       AddData(wData, sizeof(wData));\r
+               }\r
+               else\r
+               {\r
+                       AddString(Text.m_lpstr);\r
+               }\r
+\r
+               AddData(&nCreationData, sizeof(nCreationData));\r
+\r
+               if ((nCreationData != 0))\r
+               {\r
+                       ATLASSERT(pCreationData != NULL);\r
+                       AddData(pCreationData, nCreationData * sizeof(WORD));\r
+               }\r
+       }\r
+\r
+       void AddStdControl(StdCtrlType CtrlType, WORD wId, short nX, short nY, short nWidth, short nHeight,\r
+                          DWORD dwStyle, DWORD dwExStyle, ATL::_U_STRINGorID Text, const WORD* pCreationData = NULL, WORD nCreationData = 0, DWORD dwHelpID = 0)\r
+       {\r
+               AddControl(CtrlType, wId, nX, nY, nWidth, nHeight, dwStyle, dwExStyle, Text, pCreationData, nCreationData, dwHelpID);\r
+       }\r
+\r
+protected:\r
+       void AddData(LPCVOID pData, size_t nData)\r
+       {\r
+               ATLASSERT(pData != NULL);\r
+\r
+               const size_t ALLOCATION_INCREMENT = 1024;\r
+\r
+               if (m_pData == NULL)\r
+               {\r
+                       m_cAllocated = ((nData / ALLOCATION_INCREMENT) + 1) * ALLOCATION_INCREMENT;\r
+                       m_pPtr = m_pData = static_cast<LPBYTE>(::GlobalAlloc(GPTR, m_cAllocated));\r
+                       ATLASSERT(m_pData != NULL);\r
+               }\r
+               else if (((m_pPtr - m_pData) + nData) > m_cAllocated)\r
+               {\r
+                       size_t ptrPos = (m_pPtr - m_pData);\r
+                       m_cAllocated += ((nData / ALLOCATION_INCREMENT) + 1) * ALLOCATION_INCREMENT;\r
+                       m_pData = static_cast<LPBYTE>(::GlobalReAlloc(m_pData, m_cAllocated, 0));\r
+                       ATLASSERT(m_pData != NULL);\r
+                       m_pPtr = m_pData + ptrPos;\r
+               }\r
+\r
+               SecureHelper::memcpy_x(m_pPtr, m_cAllocated - (m_pPtr - m_pData), pData, nData);\r
+\r
+               m_pPtr += nData;\r
+       }\r
+\r
+       void AddString(LPCTSTR lpszStr)\r
+       {\r
+               if (lpszStr == NULL)\r
+               {\r
+                       WCHAR szEmpty = 0;\r
+                       AddData(&szEmpty, sizeof(szEmpty));\r
+               }\r
+               else\r
+               {\r
+                       USES_CONVERSION;\r
+                       LPCWSTR lpstr = T2CW(lpszStr);\r
+                       int nSize = lstrlenW(lpstr) + 1;\r
+                       AddData(lpstr, nSize * sizeof(WCHAR));\r
+               }\r
+       }\r
+\r
+       LPBYTE m_pData;\r
+       LPBYTE m_pPtr;\r
+       SIZE_T m_cAllocated;\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Dialog and control macros for indirect dialogs\r
+\r
+// for DLGTEMPLATE\r
+#define BEGIN_DIALOG(x, y, width, height) \\r
+       void DoInitTemplate() \\r
+       { \\r
+               bool bExTemplate = false; \\r
+               short nX = x, nY = y, nWidth = width, nHeight = height; \\r
+               LPCTSTR szCaption = NULL; \\r
+               DWORD dwStyle = WS_POPUP | WS_BORDER | WS_SYSMENU; \\r
+               DWORD dwExStyle = 0; \\r
+               LPCTSTR szFontName = NULL; \\r
+               WORD wFontSize = 0; \\r
+               WORD wWeight = 0; \\r
+               BYTE bItalic = 0; \\r
+               BYTE bCharset = 0; \\r
+               DWORD dwHelpID = 0; \\r
+               ATL::_U_STRINGorID Menu = 0U; \\r
+               ATL::_U_STRINGorID ClassName = 0U;\r
+\r
+// for DLGTEMPLATEEX\r
+#define BEGIN_DIALOG_EX(x, y, width, height, helpID) \\r
+       void DoInitTemplate() \\r
+       { \\r
+               bool bExTemplate = true; \\r
+               short nX = x, nY = y, nWidth = width, nHeight = height; \\r
+               LPCTSTR szCaption = NULL; \\r
+               DWORD dwStyle = WS_POPUP | WS_BORDER | WS_SYSMENU; \\r
+               DWORD dwExStyle = 0; \\r
+               LPCTSTR szFontName = NULL; \\r
+               WORD wFontSize = 0; \\r
+               WORD wWeight = 0; \\r
+               BYTE bItalic = 0; \\r
+               BYTE bCharset = 0; \\r
+               DWORD dwHelpID = helpID; \\r
+               ATL::_U_STRINGorID Menu = 0U; \\r
+               ATL::_U_STRINGorID ClassName = 0U;\r
+\r
+#define END_DIALOG() \\r
+               m_Template.Create(bExTemplate, szCaption, nX, nY, nWidth, nHeight, dwStyle, dwExStyle, szFontName, wFontSize, wWeight, bItalic, bCharset, dwHelpID, ClassName, Menu); \\r
+       };\r
+\r
+#define DIALOG_CAPTION(caption) \\r
+               szCaption = caption;\r
+#define DIALOG_STYLE(style) \\r
+               dwStyle = style;\r
+#define DIALOG_EXSTYLE(exStyle) \\r
+               dwExStyle = exStyle;\r
+#define DIALOG_FONT(pointSize, typeFace) \\r
+               wFontSize = pointSize; \\r
+               szFontName = typeFace;\r
+#define DIALOG_FONT_EX(pointsize, typeface, weight, italic, charset) \\r
+               ATLASSERT(bExTemplate); \\r
+               wFontSize = pointsize; \\r
+               szFontName = typeface; \\r
+               wWeight = weight; \\r
+               bItalic = italic; \\r
+               bCharset = charset;\r
+#define DIALOG_MENU(menuName) \\r
+               Menu = menuName;\r
+#define DIALOG_CLASS(className) \\r
+               ClassName = className;\r
+\r
+#define BEGIN_CONTROLS_MAP() \\r
+       void DoInitControls() \\r
+       {\r
+\r
+#define END_CONTROLS_MAP() \\r
+       };\r
+\r
+\r
+#define CONTROL_LTEXT(text, id, x, y, width, height, style, exStyle) \\r
+       m_Template.AddStdControl(WTL::CMemDlgTemplate::CTRL_STATIC, (WORD)id, x, y, width, height, style | SS_LEFT | WS_GROUP, exStyle, text, NULL, 0);\r
+#define CONTROL_CTEXT(text, id, x, y, width, height, style, exStyle) \\r
+       m_Template.AddStdControl(WTL::CMemDlgTemplate::CTRL_STATIC, (WORD)id, x, y, width, height, style | SS_CENTER | WS_GROUP, exStyle, text, NULL, 0);\r
+#define CONTROL_RTEXT(text, id, x, y, width, height, style, exStyle) \\r
+       m_Template.AddStdControl(WTL::CMemDlgTemplate::CTRL_STATIC, (WORD)id, x, y, width, height, style | SS_RIGHT | WS_GROUP, exStyle, text, NULL, 0);\r
+#define CONTROL_PUSHBUTTON(text, id, x, y, width, height, style, exStyle) \\r
+       m_Template.AddStdControl(WTL::CMemDlgTemplate::CTRL_BUTTON, (WORD)id, x, y, width, height, style | BS_PUSHBUTTON | WS_TABSTOP, exStyle, text, NULL, 0);\r
+#define CONTROL_DEFPUSHBUTTON(text, id, x, y, width, height, style, exStyle) \\r
+       m_Template.AddStdControl(WTL::CMemDlgTemplate::CTRL_BUTTON, (WORD)id, x, y, width, height, style | BS_DEFPUSHBUTTON | WS_TABSTOP, exStyle, text, NULL, 0);\r
+#ifndef _WIN32_WCE\r
+#define CONTROL_PUSHBOX(text, id, x, y, width, height, style, exStyle) \\r
+       m_Template.AddStdControl(WTL::CMemDlgTemplate::CTRL_BUTTON, (WORD)id, x, y, width, height, style | BS_PUSHBOX | WS_TABSTOP, exStyle, text, NULL, 0);\r
+#endif // !_WIN32_WCE\r
+#define CONTROL_STATE3(text, id, x, y, width, height, style, exStyle) \\r
+       m_Template.AddStdControl(WTL::CMemDlgTemplate::CTRL_BUTTON, (WORD)id, x, y, width, height, style | BS_3STATE | WS_TABSTOP, exStyle, text, NULL, 0);\r
+#define CONTROL_AUTO3STATE(text, id, x, y, width, height, style, exStyle) \\r
+       m_Template.AddStdControl(WTL::CMemDlgTemplate::CTRL_BUTTON, (WORD)id, x, y, width, height, style | BS_AUTO3STATE | WS_TABSTOP, exStyle, text, NULL, 0);\r
+#define CONTROL_CHECKBOX(text, id, x, y, width, height, style, exStyle) \\r
+       m_Template.AddStdControl(WTL::CMemDlgTemplate::CTRL_BUTTON, (WORD)id, x, y, width, height, style | BS_CHECKBOX | WS_TABSTOP, exStyle, text, NULL, 0);\r
+#define CONTROL_AUTOCHECKBOX(text, id, x, y, width, height, style, exStyle) \\r
+       m_Template.AddStdControl(WTL::CMemDlgTemplate::CTRL_BUTTON, (WORD)id, x, y, width, height, style | BS_AUTOCHECKBOX | WS_TABSTOP, exStyle, text, NULL, 0);\r
+#define CONTROL_RADIOBUTTON(text, id, x, y, width, height, style, exStyle) \\r
+       m_Template.AddStdControl(WTL::CMemDlgTemplate::CTRL_BUTTON, (WORD)id, x, y, width, height, style | BS_RADIOBUTTON | WS_TABSTOP, exStyle, text, NULL, 0);\r
+#define CONTROL_AUTORADIOBUTTON(text, id, x, y, width, height, style, exStyle) \\r
+       m_Template.AddStdControl(WTL::CMemDlgTemplate::CTRL_BUTTON, (WORD)id, x, y, width, height, style | BS_AUTORADIOBUTTON | WS_TABSTOP, exStyle, text, NULL, 0);\r
+#define CONTROL_COMBOBOX(id, x, y, width, height, style, exStyle) \\r
+       m_Template.AddStdControl(WTL::CMemDlgTemplate::CTRL_COMBOBOX, (WORD)id, x, y, width, height, style | CBS_DROPDOWN | WS_TABSTOP, exStyle, (LPCTSTR)NULL, NULL, 0);\r
+#define CONTROL_EDITTEXT(id, x, y, width, height, style, exStyle) \\r
+       m_Template.AddStdControl(WTL::CMemDlgTemplate::CTRL_EDIT, (WORD)id, x, y, width, height, style | ES_LEFT | WS_BORDER | WS_TABSTOP, exStyle, (LPCTSTR)NULL, NULL, 0);\r
+#define CONTROL_GROUPBOX(text, id, x, y, width, height, style, exStyle) \\r
+       m_Template.AddStdControl(WTL::CMemDlgTemplate::CTRL_BUTTON, (WORD)id, x, y, width, height, style | BS_GROUPBOX, exStyle, text, NULL, 0);\r
+#define CONTROL_LISTBOX(id, x, y, width, height, style, exStyle) \\r
+       m_Template.AddStdControl(WTL::CMemDlgTemplate::CTRL_LISTBOX, (WORD)id, x, y, width, height, style | LBS_NOTIFY | WS_BORDER, exStyle, (LPCTSTR)NULL, NULL, 0);\r
+#define CONTROL_SCROLLBAR(id, x, y, width, height, style, exStyle) \\r
+       m_Template.AddStdControl(WTL::CMemDlgTemplate::CTRL_SCROLLBAR, (WORD)id, x, y, width, height, style | SBS_HORZ, exStyle, (LPCTSTR)NULL, NULL, 0);\r
+#define CONTROL_ICON(text, id, x, y, width, height, style, exStyle) \\r
+       m_Template.AddStdControl(WTL::CMemDlgTemplate::CTRL_STATIC, (WORD)id, x, y, width, height, style | SS_ICON, exStyle, text, NULL, 0);\r
+#define CONTROL_CONTROL(text, id, className, style, x, y, width, height, exStyle) \\r
+       m_Template.AddControl(className, (WORD)id, x, y, width, height, style, exStyle, text, NULL, 0);\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CIndirectDialogImpl - dialogs with template in memory\r
+\r
+template <class T, class TDlgTemplate = CMemDlgTemplate, class TBase = ATL::CDialogImpl<T, ATL::CWindow> >\r
+class ATL_NO_VTABLE CIndirectDialogImpl : public TBase\r
+{\r
+public:\r
+       enum { IDD = 0 };   // no dialog template resource\r
+\r
+       TDlgTemplate m_Template;\r
+\r
+       void CreateTemplate()\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               pT->DoInitTemplate();\r
+               pT->DoInitControls();\r
+       }\r
+\r
+       INT_PTR DoModal(HWND hWndParent = ::GetActiveWindow(), LPARAM dwInitParam = NULL)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(pT->m_hWnd == NULL);\r
+\r
+               if (!m_Template.IsValid())\r
+                       CreateTemplate();\r
+\r
+#if (_ATL_VER >= 0x0800)\r
+               // Allocate the thunk structure here, where we can fail gracefully.\r
+               BOOL result = m_thunk.Init(NULL, NULL);\r
+               if (result == FALSE)\r
+               {\r
+                       SetLastError(ERROR_OUTOFMEMORY);\r
+                       return -1;\r
+               }\r
+#endif // (_ATL_VER >= 0x0800)\r
+\r
+               ModuleHelper::AddCreateWndData(&m_thunk.cd, pT);\r
+\r
+#ifdef _DEBUG\r
+               m_bModal = true;\r
+#endif // _DEBUG\r
+\r
+               return ::DialogBoxIndirectParam(ModuleHelper::GetResourceInstance(), m_Template.GetTemplatePtr(), hWndParent, (DLGPROC)T::StartDialogProc, dwInitParam);\r
+       }\r
+\r
+       HWND Create(HWND hWndParent, LPARAM dwInitParam = NULL)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(pT->m_hWnd == NULL);\r
+\r
+               if (!m_Template.IsValid())\r
+                       CreateTemplate();\r
+\r
+#if (_ATL_VER >= 0x0800)\r
+               // Allocate the thunk structure here, where we can fail gracefully.\r
+               BOOL result = m_thunk.Init(NULL, NULL);\r
+               if (result == FALSE) \r
+               {\r
+                       SetLastError(ERROR_OUTOFMEMORY);\r
+                       return NULL;\r
+               }\r
+#endif // (_ATL_VER >= 0x0800)\r
+\r
+               ModuleHelper::AddCreateWndData(&m_thunk.cd, pT);\r
+\r
+#ifdef _DEBUG\r
+               m_bModal = false;\r
+#endif // _DEBUG\r
+\r
+               HWND hWnd = ::CreateDialogIndirectParam(ModuleHelper::GetResourceInstance(), (LPCDLGTEMPLATE)m_Template.GetTemplatePtr(), hWndParent, (DLGPROC)T::StartDialogProc, dwInitParam);\r
+               ATLASSERT(m_hWnd == hWnd);\r
+\r
+               return hWnd;\r
+       }\r
+\r
+       // for CComControl\r
+       HWND Create(HWND hWndParent, RECT&, LPARAM dwInitParam = NULL)\r
+       {\r
+               return Create(hWndParent, dwInitParam);\r
+       }\r
+\r
+       void DoInitTemplate() \r
+       {\r
+               ATLASSERT(FALSE);   // MUST be defined in derived class\r
+       }\r
+\r
+       void DoInitControls() \r
+       {\r
+               ATLASSERT(FALSE);   // MUST be defined in derived class\r
+       }\r
+};\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CPropertySheetWindow - client side for a property sheet\r
+\r
+class CPropertySheetWindow : public ATL::CWindow\r
+{\r
+public:\r
+// Constructors\r
+       CPropertySheetWindow(HWND hWnd = NULL) : ATL::CWindow(hWnd)\r
+       { }\r
+\r
+       CPropertySheetWindow& operator =(HWND hWnd)\r
+       {\r
+               m_hWnd = hWnd;\r
+               return *this;\r
+       }\r
+\r
+// Attributes\r
+       int GetPageCount() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               HWND hWndTabCtrl = GetTabControl();\r
+               ATLASSERT(hWndTabCtrl != NULL);\r
+               return (int)::SendMessage(hWndTabCtrl, TCM_GETITEMCOUNT, 0, 0L);\r
+       }\r
+\r
+       HWND GetActivePage() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (HWND)::SendMessage(m_hWnd, PSM_GETCURRENTPAGEHWND, 0, 0L);\r
+       }\r
+\r
+       int GetActiveIndex() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               HWND hWndTabCtrl = GetTabControl();\r
+               ATLASSERT(hWndTabCtrl != NULL);\r
+               return (int)::SendMessage(hWndTabCtrl, TCM_GETCURSEL, 0, 0L);\r
+       }\r
+\r
+       BOOL SetActivePage(int nPageIndex)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, PSM_SETCURSEL, nPageIndex, 0L);\r
+       }\r
+\r
+       BOOL SetActivePage(HPROPSHEETPAGE hPage)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(hPage != NULL);\r
+               return (BOOL)::SendMessage(m_hWnd, PSM_SETCURSEL, 0, (LPARAM)hPage);\r
+       }\r
+\r
+       BOOL SetActivePageByID(int nPageID)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, PSM_SETCURSELID, 0, nPageID);\r
+       }\r
+\r
+       void SetTitle(LPCTSTR lpszText, UINT nStyle = 0)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT((nStyle & ~PSH_PROPTITLE) == 0); // only PSH_PROPTITLE is valid\r
+               ATLASSERT(lpszText != NULL);\r
+               ::SendMessage(m_hWnd, PSM_SETTITLE, nStyle, (LPARAM)lpszText);\r
+       }\r
+\r
+       HWND GetTabControl() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (HWND)::SendMessage(m_hWnd, PSM_GETTABCONTROL, 0, 0L);\r
+       }\r
+\r
+       void SetFinishText(LPCTSTR lpszText)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, PSM_SETFINISHTEXT, 0, (LPARAM)lpszText);\r
+       }\r
+\r
+       void SetWizardButtons(DWORD dwFlags)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::PostMessage(m_hWnd, PSM_SETWIZBUTTONS, 0, dwFlags);\r
+       }\r
+\r
+// Operations\r
+       BOOL AddPage(HPROPSHEETPAGE hPage)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(hPage != NULL);\r
+               return (BOOL)::SendMessage(m_hWnd, PSM_ADDPAGE, 0, (LPARAM)hPage);\r
+       }\r
+\r
+       BOOL AddPage(LPCPROPSHEETPAGE pPage)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(pPage != NULL);\r
+               HPROPSHEETPAGE hPage = ::CreatePropertySheetPage(pPage);\r
+               if(hPage == NULL)\r
+                       return FALSE;\r
+               return (BOOL)::SendMessage(m_hWnd, PSM_ADDPAGE, 0, (LPARAM)hPage);\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       BOOL InsertPage(int nNewPageIndex, HPROPSHEETPAGE hPage)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(hPage != NULL);\r
+               return (BOOL)::SendMessage(m_hWnd, PSM_INSERTPAGE, nNewPageIndex, (LPARAM)hPage);\r
+       }\r
+\r
+       BOOL InsertPage(int nNewPageIndex, LPCPROPSHEETPAGE pPage)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(pPage != NULL);\r
+               HPROPSHEETPAGE hPage = ::CreatePropertySheetPage(pPage);\r
+               if(hPage == NULL)\r
+                       return FALSE;\r
+               return (BOOL)::SendMessage(m_hWnd, PSM_INSERTPAGE, nNewPageIndex, (LPARAM)hPage);\r
+       }\r
+\r
+       BOOL InsertPage(HPROPSHEETPAGE hPageInsertAfter, HPROPSHEETPAGE hPage)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(hPage != NULL);\r
+               return (BOOL)::SendMessage(m_hWnd, PSM_INSERTPAGE, (WPARAM)hPageInsertAfter, (LPARAM)hPage);\r
+       }\r
+\r
+       BOOL InsertPage(HPROPSHEETPAGE hPageInsertAfter, LPCPROPSHEETPAGE pPage)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(pPage != NULL);\r
+               HPROPSHEETPAGE hPage = ::CreatePropertySheetPage(pPage);\r
+               if(hPage == NULL)\r
+                       return FALSE;\r
+               return (BOOL)::SendMessage(m_hWnd, PSM_INSERTPAGE, (WPARAM)hPageInsertAfter, (LPARAM)hPage);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       void RemovePage(int nPageIndex)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, PSM_REMOVEPAGE, nPageIndex, 0L);\r
+       }\r
+\r
+       void RemovePage(HPROPSHEETPAGE hPage)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(hPage != NULL);\r
+               ::SendMessage(m_hWnd, PSM_REMOVEPAGE, 0, (LPARAM)hPage);\r
+       }\r
+\r
+       BOOL PressButton(int nButton)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, PSM_PRESSBUTTON, nButton, 0L);\r
+       }\r
+\r
+       BOOL Apply()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, PSM_APPLY, 0, 0L);\r
+       }\r
+\r
+       void CancelToClose()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, PSM_CANCELTOCLOSE, 0, 0L);\r
+       }\r
+\r
+       void SetModified(HWND hWndPage, BOOL bChanged = TRUE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(::IsWindow(hWndPage));\r
+               UINT uMsg = bChanged ? PSM_CHANGED : PSM_UNCHANGED;\r
+               ::SendMessage(m_hWnd, uMsg, (WPARAM)hWndPage, 0L);\r
+       }\r
+\r
+       LRESULT QuerySiblings(WPARAM wParam, LPARAM lParam)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return ::SendMessage(m_hWnd, PSM_QUERYSIBLINGS, wParam, lParam);\r
+       }\r
+\r
+       void RebootSystem()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, PSM_REBOOTSYSTEM, 0, 0L);\r
+       }\r
+\r
+       void RestartWindows()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, PSM_RESTARTWINDOWS, 0, 0L);\r
+       }\r
+\r
+       BOOL IsDialogMessage(LPMSG lpMsg)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, PSM_ISDIALOGMESSAGE, 0, (LPARAM)lpMsg);\r
+       }\r
+\r
+#if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)\r
+       int HwndToIndex(HWND hWnd) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, PSM_HWNDTOINDEX, (WPARAM)hWnd, 0L);\r
+       }\r
+\r
+       HWND IndexToHwnd(int nIndex) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (HWND)::SendMessage(m_hWnd, PSM_INDEXTOHWND, nIndex, 0L);\r
+       }\r
+\r
+       int PageToIndex(HPROPSHEETPAGE hPage) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, PSM_PAGETOINDEX, 0, (LPARAM)hPage);\r
+       }\r
+\r
+       HPROPSHEETPAGE IndexToPage(int nIndex) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (HPROPSHEETPAGE)::SendMessage(m_hWnd, PSM_INDEXTOPAGE, nIndex, 0L);\r
+       }\r
+\r
+       int IdToIndex(int nID) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, PSM_IDTOINDEX, 0, nID);\r
+       }\r
+\r
+       int IndexToId(int nIndex) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, PSM_INDEXTOID, nIndex, 0L);\r
+       }\r
+\r
+       int GetResult() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, PSM_GETRESULT, 0, 0L);\r
+       }\r
+\r
+       BOOL RecalcPageSizes()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, PSM_RECALCPAGESIZES, 0, 0L);\r
+       }\r
+\r
+       void SetHeaderTitle(int nIndex, LPCTSTR lpstrHeaderTitle)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, PSM_SETHEADERTITLE, nIndex, (LPARAM)lpstrHeaderTitle);\r
+       }\r
+\r
+       void SetHeaderSubTitle(int nIndex, LPCTSTR lpstrHeaderSubTitle)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, PSM_SETHEADERSUBTITLE, nIndex, (LPARAM)lpstrHeaderSubTitle);\r
+       }\r
+#endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)\r
+\r
+// Implementation - override to prevent usage\r
+       HWND Create(LPCTSTR, HWND, ATL::_U_RECT = NULL, LPCTSTR = NULL, DWORD = 0, DWORD = 0, ATL::_U_MENUorID = 0U, LPVOID = NULL)\r
+       {\r
+               ATLASSERT(FALSE);\r
+               return NULL;\r
+       }\r
+};\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CPropertySheetImpl - implements a property sheet\r
+\r
+template <class T, class TBase = CPropertySheetWindow>\r
+class ATL_NO_VTABLE CPropertySheetImpl : public ATL::CWindowImplBaseT< TBase >\r
+{\r
+public:\r
+       PROPSHEETHEADER m_psh;\r
+       ATL::CSimpleArray<HPROPSHEETPAGE> m_arrPages;\r
+\r
+#if defined(_AYGSHELL_H_) || defined(__AYGSHELL_H__) // PPC specific\r
+  #ifndef PROPSHEET_LINK_SIZE\r
+       #define PROPSHEET_LINK_SIZE 128\r
+  #endif // PROPSHEET_LINK_SIZE\r
+       TCHAR m_szLink[PROPSHEET_LINK_SIZE];\r
+       static LPCTSTR m_pszTitle;\r
+       static LPCTSTR m_pszLink;\r
+#endif // defined(_AYGSHELL_H_) || defined(__AYGSHELL_H__) \r
+\r
+// Construction/Destruction\r
+       CPropertySheetImpl(ATL::_U_STRINGorID title = (LPCTSTR)NULL, UINT uStartPage = 0, HWND hWndParent = NULL)\r
+       {\r
+               memset(&m_psh, 0, sizeof(PROPSHEETHEADER));\r
+               m_psh.dwSize = sizeof(PROPSHEETHEADER);\r
+               m_psh.dwFlags = PSH_USECALLBACK;\r
+               m_psh.hInstance = ModuleHelper::GetResourceInstance();\r
+               m_psh.phpage = NULL;   // will be set later\r
+               m_psh.nPages = 0;      // will be set later\r
+               m_psh.pszCaption = title.m_lpstr;\r
+               m_psh.nStartPage = uStartPage;\r
+               m_psh.hwndParent = hWndParent;   // if NULL, will be set in DoModal/Create\r
+               m_psh.pfnCallback = T::PropSheetCallback;\r
+\r
+#if defined(_AYGSHELL_H_) || defined(__AYGSHELL_H__) // PPC specific \r
+               m_psh.dwFlags |= PSH_MAXIMIZE;\r
+               m_szLink[0] = 0;\r
+#endif // defined(_AYGSHELL_H_) || defined(__AYGSHELL_H__)\r
+       }\r
+\r
+       ~CPropertySheetImpl()\r
+       {\r
+               if(m_arrPages.GetSize() > 0)   // sheet never created, destroy all pages\r
+               {\r
+                       for(int i = 0; i < m_arrPages.GetSize(); i++)\r
+                               ::DestroyPropertySheetPage((HPROPSHEETPAGE)m_arrPages[i]);\r
+               }\r
+       }\r
+\r
+// Callback function and overrideables\r
+       static int CALLBACK PropSheetCallback(HWND hWnd, UINT uMsg, LPARAM lParam)\r
+       {\r
+               lParam;   // avoid level 4 warning\r
+               int nRet = 0;\r
+\r
+               if(uMsg == PSCB_INITIALIZED)\r
+               {\r
+                       ATLASSERT(hWnd != NULL);\r
+                       T* pT = (T*)ModuleHelper::ExtractCreateWndData();\r
+                       // subclass the sheet window\r
+                       pT->SubclassWindow(hWnd);\r
+                       // remove page handles array\r
+                       pT->_CleanUpPages();\r
+\r
+#if defined(_AYGSHELL_H_) || defined(__AYGSHELL_H__) // PPC specific\r
+                       m_pszTitle = pT->m_psh.pszCaption;\r
+                       if(*pT->m_szLink != 0)\r
+                               m_pszLink = pT->m_szLink;\r
+#endif  // defined(_AYGSHELL_H_) || defined(__AYGSHELL_H__) // PPC specific\r
+\r
+                       pT->OnSheetInitialized();\r
+               }\r
+#if defined(_AYGSHELL_H_) || defined(__AYGSHELL_H__) // PPC specific uMsg\r
+               else\r
+               {\r
+                       switch(uMsg)\r
+                       {\r
+                       case PSCB_GETVERSION :\r
+                               nRet = COMCTL32_VERSION;\r
+                               break;\r
+                       case PSCB_GETTITLE :\r
+                               if(m_pszTitle != NULL)\r
+                               {\r
+                                       lstrcpy((LPTSTR)lParam, m_pszTitle);\r
+                                       m_pszTitle = NULL;\r
+                               }\r
+                               break;\r
+                       case PSCB_GETLINKTEXT:\r
+                               if(m_pszLink != NULL)\r
+                               {\r
+                                       lstrcpy((LPTSTR)lParam, m_pszLink);\r
+                                       m_pszLink = NULL;\r
+                               }\r
+                               break;\r
+                       default:\r
+                               break;\r
+                       }\r
+               }\r
+#endif // defined(_AYGSHELL_H_) || defined(__AYGSHELL_H__) \r
+\r
+               return nRet;\r
+       }\r
+\r
+       void OnSheetInitialized()\r
+       {\r
+       }\r
+\r
+// Create method\r
+       HWND Create(HWND hWndParent = NULL)\r
+       {\r
+               ATLASSERT(m_hWnd == NULL);\r
+\r
+               m_psh.dwFlags |= PSH_MODELESS;\r
+               if(m_psh.hwndParent == NULL)\r
+                       m_psh.hwndParent = hWndParent;\r
+               m_psh.phpage = (HPROPSHEETPAGE*)m_arrPages.GetData();\r
+               m_psh.nPages = m_arrPages.GetSize();\r
+\r
+               T* pT = static_cast<T*>(this);\r
+               ModuleHelper::AddCreateWndData(&pT->m_thunk.cd, pT);\r
+\r
+               HWND hWnd = (HWND)::PropertySheet(&m_psh);\r
+               _CleanUpPages();   // ensure clean-up, required if call failed\r
+\r
+               ATLASSERT(m_hWnd == hWnd);\r
+\r
+               return hWnd;\r
+       }\r
+\r
+       INT_PTR DoModal(HWND hWndParent = ::GetActiveWindow())\r
+       {\r
+               ATLASSERT(m_hWnd == NULL);\r
+\r
+               m_psh.dwFlags &= ~PSH_MODELESS;\r
+               if(m_psh.hwndParent == NULL)\r
+                       m_psh.hwndParent = hWndParent;\r
+               m_psh.phpage = (HPROPSHEETPAGE*)m_arrPages.GetData();\r
+               m_psh.nPages = m_arrPages.GetSize();\r
+\r
+               T* pT = static_cast<T*>(this);\r
+               ModuleHelper::AddCreateWndData(&pT->m_thunk.cd, pT);\r
+\r
+               INT_PTR nRet = ::PropertySheet(&m_psh);\r
+               _CleanUpPages();   // ensure clean-up, required if call failed\r
+\r
+               return nRet;\r
+       }\r
+\r
+       // implementation helper - clean up pages array\r
+       void _CleanUpPages()\r
+       {\r
+               m_psh.nPages = 0;\r
+               m_psh.phpage = NULL;\r
+               m_arrPages.RemoveAll();\r
+       }\r
+\r
+// Attributes (extended overrides of client class methods)\r
+// These now can be called before the sheet is created\r
+// Note: Calling these after the sheet is created gives unpredictable results\r
+       int GetPageCount() const\r
+       {\r
+               if(m_hWnd == NULL)   // not created yet\r
+                       return m_arrPages.GetSize();\r
+               return TBase::GetPageCount();\r
+       }\r
+\r
+       int GetActiveIndex() const\r
+       {\r
+               if(m_hWnd == NULL)   // not created yet\r
+                       return m_psh.nStartPage;\r
+               return TBase::GetActiveIndex();\r
+       }\r
+\r
+       HPROPSHEETPAGE GetPage(int nPageIndex) const\r
+       {\r
+               ATLASSERT(m_hWnd == NULL);   // can't do this after it's created\r
+               return (HPROPSHEETPAGE)m_arrPages[nPageIndex];\r
+       }\r
+\r
+       int GetPageIndex(HPROPSHEETPAGE hPage) const\r
+       {\r
+               ATLASSERT(m_hWnd == NULL);   // can't do this after it's created\r
+               return m_arrPages.Find((HPROPSHEETPAGE&)hPage);\r
+       }\r
+\r
+       BOOL SetActivePage(int nPageIndex)\r
+       {\r
+               if(m_hWnd == NULL)   // not created yet\r
+               {\r
+                       ATLASSERT(nPageIndex >= 0 && nPageIndex < m_arrPages.GetSize());\r
+                       m_psh.nStartPage = nPageIndex;\r
+                       return TRUE;\r
+               }\r
+               return TBase::SetActivePage(nPageIndex);\r
+       }\r
+\r
+       BOOL SetActivePage(HPROPSHEETPAGE hPage)\r
+       {\r
+               ATLASSERT(hPage != NULL);\r
+               if (m_hWnd == NULL)   // not created yet\r
+               {\r
+                       int nPageIndex = GetPageIndex(hPage);\r
+                       if(nPageIndex == -1)\r
+                               return FALSE;\r
+\r
+                       return SetActivePage(nPageIndex);\r
+               }\r
+               return TBase::SetActivePage(hPage);\r
+\r
+       }\r
+\r
+       void SetTitle(LPCTSTR lpszText, UINT nStyle = 0)\r
+       {\r
+               ATLASSERT((nStyle & ~PSH_PROPTITLE) == 0);   // only PSH_PROPTITLE is valid\r
+               ATLASSERT(lpszText != NULL);\r
+\r
+               if(m_hWnd == NULL)\r
+               {\r
+                       // set internal state\r
+                       m_psh.pszCaption = lpszText;   // must exist until sheet is created\r
+                       m_psh.dwFlags &= ~PSH_PROPTITLE;\r
+                       m_psh.dwFlags |= nStyle;\r
+               }\r
+               else\r
+               {\r
+                       // set external state\r
+                       TBase::SetTitle(lpszText, nStyle);\r
+               }\r
+       }\r
+\r
+#if defined(_AYGSHELL_H_) || defined(__AYGSHELL_H__) // PPC specific Link field        \r
+       void SetLinkText(LPCTSTR lpszText)\r
+       {\r
+               ATLASSERT(lpszText != NULL);\r
+               ATLASSERT(lstrlen(lpszText) < PROPSHEET_LINK_SIZE);\r
+               lstrcpy(m_szLink, lpszText);\r
+       }\r
+#endif // defined(_AYGSHELL_H_) || defined(__AYGSHELL_H__) \r
+\r
+       void SetWizardMode()\r
+       {\r
+               m_psh.dwFlags |= PSH_WIZARD;\r
+       }\r
+\r
+       void EnableHelp()\r
+       {\r
+               m_psh.dwFlags |= PSH_HASHELP;\r
+       }\r
+\r
+// Operations\r
+       BOOL AddPage(HPROPSHEETPAGE hPage)\r
+       {\r
+               ATLASSERT(hPage != NULL);\r
+               BOOL bRet = FALSE;\r
+               if(m_hWnd != NULL)\r
+                       bRet = TBase::AddPage(hPage);\r
+               else    // sheet not created yet, use internal data\r
+                       bRet = m_arrPages.Add((HPROPSHEETPAGE&)hPage);\r
+               return bRet;\r
+       }\r
+\r
+       BOOL AddPage(LPCPROPSHEETPAGE pPage)\r
+       {\r
+               ATLASSERT(pPage != NULL);\r
+               HPROPSHEETPAGE hPage = ::CreatePropertySheetPage(pPage);\r
+               if(hPage == NULL)\r
+                       return FALSE;\r
+               BOOL bRet = AddPage(hPage);\r
+               if(!bRet)\r
+                       ::DestroyPropertySheetPage(hPage);\r
+               return bRet;\r
+       }\r
+\r
+       BOOL RemovePage(HPROPSHEETPAGE hPage)\r
+       {\r
+               ATLASSERT(hPage != NULL);\r
+               if (m_hWnd == NULL)   // not created yet\r
+               {\r
+                       int nPage = GetPageIndex(hPage);\r
+                       if(nPage == -1)\r
+                               return FALSE;\r
+                       return RemovePage(nPage);\r
+               }\r
+               TBase::RemovePage(hPage);\r
+               return TRUE;\r
+\r
+       }\r
+\r
+       BOOL RemovePage(int nPageIndex)\r
+       {\r
+               BOOL bRet = TRUE;\r
+               if(m_hWnd != NULL)\r
+                       TBase::RemovePage(nPageIndex);\r
+               else    // sheet not created yet, use internal data\r
+                       bRet = m_arrPages.RemoveAt(nPageIndex);\r
+               return bRet;\r
+       }\r
+\r
+#if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)\r
+       void SetHeader(LPCTSTR szbmHeader)\r
+       {\r
+               ATLASSERT(m_hWnd == NULL);   // can't do this after it's created\r
+\r
+               m_psh.dwFlags &= ~PSH_WIZARD;\r
+               m_psh.dwFlags |= (PSH_HEADER | PSH_WIZARD97);\r
+               m_psh.pszbmHeader = szbmHeader;\r
+       }\r
+\r
+       void SetHeader(HBITMAP hbmHeader)\r
+       {\r
+               ATLASSERT(m_hWnd == NULL);   // can't do this after it's created\r
+\r
+               m_psh.dwFlags &= ~PSH_WIZARD;\r
+               m_psh.dwFlags |= (PSH_HEADER | PSH_USEHBMHEADER | PSH_WIZARD97);\r
+               m_psh.hbmHeader = hbmHeader;\r
+       }\r
+\r
+       void SetWatermark(LPCTSTR szbmWatermark, HPALETTE hplWatermark = NULL)\r
+       {\r
+               ATLASSERT(m_hWnd == NULL);   // can't do this after it's created\r
+\r
+               m_psh.dwFlags &= ~PSH_WIZARD;\r
+               m_psh.dwFlags |= PSH_WATERMARK | PSH_WIZARD97;\r
+               m_psh.pszbmWatermark = szbmWatermark;\r
+\r
+               if (hplWatermark != NULL)\r
+               {\r
+                       m_psh.dwFlags |= PSH_USEHPLWATERMARK;\r
+                       m_psh.hplWatermark = hplWatermark;\r
+               }\r
+       }\r
+\r
+       void SetWatermark(HBITMAP hbmWatermark, HPALETTE hplWatermark = NULL)\r
+       {\r
+               ATLASSERT(m_hWnd == NULL);   // can't do this after it's created\r
+\r
+               m_psh.dwFlags &= ~PSH_WIZARD;\r
+               m_psh.dwFlags |= (PSH_WATERMARK | PSH_USEHBMWATERMARK | PSH_WIZARD97);\r
+               m_psh.hbmWatermark = hbmWatermark;\r
+\r
+               if (hplWatermark != NULL)\r
+               {\r
+                       m_psh.dwFlags |= PSH_USEHPLWATERMARK;\r
+                       m_psh.hplWatermark = hplWatermark;\r
+               }\r
+       }\r
+\r
+       void StretchWatermark(bool bStretchWatermark)\r
+       {\r
+               ATLASSERT(m_hWnd == NULL);   // can't do this after it's created\r
+               if (bStretchWatermark)\r
+                       m_psh.dwFlags |= PSH_STRETCHWATERMARK;\r
+               else\r
+                       m_psh.dwFlags &= ~PSH_STRETCHWATERMARK;\r
+       }\r
+#endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)\r
+\r
+// Message map and handlers\r
+       BEGIN_MSG_MAP(CPropertySheetImpl)\r
+               MESSAGE_HANDLER(WM_COMMAND, OnCommand)\r
+               MESSAGE_HANDLER(WM_SYSCOMMAND, OnSysCommand)\r
+       END_MSG_MAP()\r
+\r
+       LRESULT OnCommand(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)\r
+       {\r
+               LRESULT lRet = DefWindowProc(uMsg, wParam, lParam);\r
+               if(HIWORD(wParam) == BN_CLICKED && (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) &&\r
+                  ((m_psh.dwFlags & PSH_MODELESS) != 0) && (GetActivePage() == NULL))\r
+                       DestroyWindow();\r
+               return lRet;\r
+       }\r
+\r
+       LRESULT OnSysCommand(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)\r
+       {\r
+               if(((m_psh.dwFlags & PSH_MODELESS) == PSH_MODELESS) && ((wParam & 0xFFF0) == SC_CLOSE))\r
+                       SendMessage(WM_CLOSE);\r
+               else\r
+                       bHandled = FALSE;\r
+               return 0;\r
+       }\r
+};\r
+\r
+#if defined(_AYGSHELL_H_) || defined(__AYGSHELL_H__) // PPC static pointers\r
+template < class T, class TBase >\r
+LPCWSTR CPropertySheetImpl<T,TBase>::m_pszTitle = NULL;\r
+template < class T, class TBase>\r
+LPCWSTR CPropertySheetImpl<T,TBase>::m_pszLink = NULL;\r
+#endif // defined(_AYGSHELL_H_) || defined(__AYGSHELL_H__)\r
+\r
+// for non-customized sheets\r
+class CPropertySheet : public CPropertySheetImpl<CPropertySheet>\r
+{\r
+public:\r
+       CPropertySheet(ATL::_U_STRINGorID title = (LPCTSTR)NULL, UINT uStartPage = 0, HWND hWndParent = NULL)\r
+               : CPropertySheetImpl<CPropertySheet>(title, uStartPage, hWndParent)\r
+       { }\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CPropertyPageWindow - client side for a property page\r
+\r
+class CPropertyPageWindow : public ATL::CWindow\r
+{\r
+public:\r
+// Constructors\r
+       CPropertyPageWindow(HWND hWnd = NULL) : ATL::CWindow(hWnd)\r
+       { }\r
+\r
+       CPropertyPageWindow& operator =(HWND hWnd)\r
+       {\r
+               m_hWnd = hWnd;\r
+               return *this;\r
+       }\r
+\r
+// Attributes\r
+       CPropertySheetWindow GetPropertySheet() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return CPropertySheetWindow(GetParent());\r
+       }\r
+\r
+// Operations\r
+       BOOL Apply()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(GetParent() != NULL);\r
+               return GetPropertySheet().Apply();\r
+       }\r
+\r
+       void CancelToClose()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(GetParent() != NULL);\r
+               GetPropertySheet().CancelToClose();\r
+       }\r
+\r
+       void SetModified(BOOL bChanged = TRUE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(GetParent() != NULL);\r
+               GetPropertySheet().SetModified(m_hWnd, bChanged);\r
+       }\r
+\r
+       LRESULT QuerySiblings(WPARAM wParam, LPARAM lParam)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(GetParent() != NULL);\r
+               return GetPropertySheet().QuerySiblings(wParam, lParam);\r
+       }\r
+\r
+       void RebootSystem()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(GetParent() != NULL);\r
+               GetPropertySheet().RebootSystem();\r
+       }\r
+\r
+       void RestartWindows()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(GetParent() != NULL);\r
+               GetPropertySheet().RestartWindows();\r
+       }\r
+\r
+       void SetWizardButtons(DWORD dwFlags)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(GetParent() != NULL);\r
+               GetPropertySheet().SetWizardButtons(dwFlags);\r
+       }\r
+\r
+// Implementation - overrides to prevent usage\r
+       HWND Create(LPCTSTR, HWND, ATL::_U_RECT = NULL, LPCTSTR = NULL, DWORD = 0, DWORD = 0, ATL::_U_MENUorID = 0U, LPVOID = NULL)\r
+       {\r
+               ATLASSERT(FALSE);\r
+               return NULL;\r
+       }\r
+};\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CPropertyPageImpl - implements a property page\r
+\r
+template <class T, class TBase = CPropertyPageWindow>\r
+class ATL_NO_VTABLE CPropertyPageImpl : public ATL::CDialogImplBaseT< TBase >\r
+{\r
+public:\r
+       PROPSHEETPAGE m_psp;\r
+\r
+       operator PROPSHEETPAGE*() { return &m_psp; }\r
+\r
+// Construction\r
+       CPropertyPageImpl(ATL::_U_STRINGorID title = (LPCTSTR)NULL)\r
+       {\r
+               // initialize PROPSHEETPAGE struct\r
+               memset(&m_psp, 0, sizeof(PROPSHEETPAGE));\r
+               m_psp.dwSize = sizeof(PROPSHEETPAGE);\r
+               m_psp.dwFlags = PSP_USECALLBACK;\r
+               m_psp.hInstance = ModuleHelper::GetResourceInstance();\r
+               T* pT = static_cast<T*>(this);\r
+               m_psp.pszTemplate = MAKEINTRESOURCE(pT->IDD);\r
+               m_psp.pfnDlgProc = (DLGPROC)T::StartDialogProc;\r
+               m_psp.pfnCallback = T::PropPageCallback;\r
+               m_psp.lParam = (LPARAM)pT;\r
+\r
+               if(title.m_lpstr != NULL)\r
+                       SetTitle(title);\r
+       }\r
+\r
+// Callback function and overrideables\r
+       static UINT CALLBACK PropPageCallback(HWND hWnd, UINT uMsg, LPPROPSHEETPAGE ppsp)\r
+       {\r
+               hWnd;   // avoid level 4 warning\r
+               ATLASSERT(hWnd == NULL);\r
+               T* pT = (T*)ppsp->lParam;\r
+               UINT uRet = 0;\r
+\r
+               switch(uMsg)\r
+               {\r
+               case PSPCB_CREATE:\r
+                       {\r
+                               ATL::CDialogImplBaseT< TBase >* pPage = (ATL::CDialogImplBaseT< TBase >*)pT;\r
+                               ModuleHelper::AddCreateWndData(&pPage->m_thunk.cd, pPage);\r
+                               uRet = pT->OnPageCreate() ? 1 : 0;\r
+                       }\r
+                       break;\r
+#if (_WIN32_IE >= 0x0500)\r
+               case PSPCB_ADDREF:\r
+                       pT->OnPageAddRef();\r
+                       break;\r
+#endif // (_WIN32_IE >= 0x0500)\r
+               case PSPCB_RELEASE:\r
+                       pT->OnPageRelease();\r
+                       break;\r
+               default:\r
+                       break;\r
+               }\r
+\r
+               return uRet;\r
+       }\r
+\r
+       bool OnPageCreate()\r
+       {\r
+               return true;   // true - allow page to be created, false - prevent creation\r
+       }\r
+\r
+#if (_WIN32_IE >= 0x0500)\r
+       void OnPageAddRef()\r
+       {\r
+       }\r
+#endif // (_WIN32_IE >= 0x0500)\r
+\r
+       void OnPageRelease()\r
+       {\r
+       }\r
+\r
+// Create method\r
+       HPROPSHEETPAGE Create()\r
+       {\r
+               return ::CreatePropertySheetPage(&m_psp);\r
+       }\r
+\r
+// Attributes\r
+       void SetTitle(ATL::_U_STRINGorID title)\r
+       {\r
+               m_psp.pszTitle = title.m_lpstr;\r
+               m_psp.dwFlags |= PSP_USETITLE;\r
+       }\r
+\r
+#if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)\r
+       void SetHeaderTitle(LPCTSTR lpstrHeaderTitle)\r
+       {\r
+               ATLASSERT(m_hWnd == NULL);   // can't do this after it's created\r
+               m_psp.dwFlags |= PSP_USEHEADERTITLE;\r
+               m_psp.pszHeaderTitle = lpstrHeaderTitle;\r
+       }\r
+\r
+       void SetHeaderSubTitle(LPCTSTR lpstrHeaderSubTitle)\r
+       {\r
+               ATLASSERT(m_hWnd == NULL);   // can't do this after it's created\r
+               m_psp.dwFlags |= PSP_USEHEADERSUBTITLE;\r
+               m_psp.pszHeaderSubTitle = lpstrHeaderSubTitle;\r
+       }\r
+#endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)\r
+\r
+// Operations\r
+       void EnableHelp()\r
+       {\r
+               m_psp.dwFlags |= PSP_HASHELP;\r
+       }\r
+\r
+// Message map and handlers\r
+       BEGIN_MSG_MAP(CPropertyPageImpl)\r
+               MESSAGE_HANDLER(WM_NOTIFY, OnNotify)\r
+       END_MSG_MAP()\r
+\r
+       // NOTE: Define _WTL_NEW_PAGE_NOTIFY_HANDLERS to use new notification\r
+       // handlers that return direct values without any restrictions\r
+       LRESULT OnNotify(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled)\r
+       {\r
+#ifndef _WIN32_WCE\r
+               // This notification is sometimes received on Windows CE after the window is already destroyed\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+#endif\r
+               NMHDR* pNMHDR = (NMHDR*)lParam;\r
+\r
+               // don't handle messages not from the page/sheet itself\r
+               if(pNMHDR->hwndFrom != m_hWnd && pNMHDR->hwndFrom != ::GetParent(m_hWnd))\r
+               {\r
+                       bHandled = FALSE;\r
+                       return 1;\r
+               }\r
+#ifdef _WIN32_WCE\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+#endif\r
+\r
+               T* pT = static_cast<T*>(this);\r
+               LRESULT lResult = 0;\r
+               switch(pNMHDR->code)\r
+               {\r
+#ifdef _WTL_NEW_PAGE_NOTIFY_HANDLERS\r
+               case PSN_SETACTIVE:\r
+                       lResult = pT->OnSetActive();\r
+                       break;\r
+               case PSN_KILLACTIVE:\r
+                       lResult = pT->OnKillActive();\r
+                       break;\r
+               case PSN_APPLY:\r
+                       lResult = pT->OnApply();\r
+                       break;\r
+               case PSN_RESET:\r
+                       pT->OnReset();\r
+                       break;\r
+               case PSN_QUERYCANCEL:\r
+                       lResult = pT->OnQueryCancel();\r
+                       break;\r
+               case PSN_WIZNEXT:\r
+                       lResult = pT->OnWizardNext();\r
+                       break;\r
+               case PSN_WIZBACK:\r
+                       lResult = pT->OnWizardBack();\r
+                       break;\r
+               case PSN_WIZFINISH:\r
+                       lResult = pT->OnWizardFinish();\r
+                       break;\r
+               case PSN_HELP:\r
+                       pT->OnHelp();\r
+                       break;\r
+#ifndef _WIN32_WCE\r
+#if (_WIN32_IE >= 0x0400)\r
+               case PSN_GETOBJECT:\r
+                       if(!pT->OnGetObject((LPNMOBJECTNOTIFY)lParam))\r
+                               bHandled = FALSE;\r
+                       break;\r
+#endif // (_WIN32_IE >= 0x0400)\r
+#if (_WIN32_IE >= 0x0500)\r
+               case PSN_TRANSLATEACCELERATOR:\r
+                       {\r
+                               LPPSHNOTIFY lpPSHNotify = (LPPSHNOTIFY)lParam;\r
+                               lResult = pT->OnTranslateAccelerator((LPMSG)lpPSHNotify->lParam);\r
+                       }\r
+                       break;\r
+               case PSN_QUERYINITIALFOCUS:\r
+                       {\r
+                               LPPSHNOTIFY lpPSHNotify = (LPPSHNOTIFY)lParam;\r
+                               lResult = (LRESULT)pT->OnQueryInitialFocus((HWND)lpPSHNotify->lParam);\r
+                       }\r
+                       break;\r
+#endif // (_WIN32_IE >= 0x0500)\r
+#endif // !_WIN32_WCE\r
+\r
+#else // !_WTL_NEW_PAGE_NOTIFY_HANDLERS\r
+               case PSN_SETACTIVE:\r
+                       lResult = pT->OnSetActive() ? 0 : -1;\r
+                       break;\r
+               case PSN_KILLACTIVE:\r
+                       lResult = !pT->OnKillActive();\r
+                       break;\r
+               case PSN_APPLY:\r
+                       lResult = pT->OnApply() ? PSNRET_NOERROR : PSNRET_INVALID_NOCHANGEPAGE;\r
+                       break;\r
+               case PSN_RESET:\r
+                       pT->OnReset();\r
+                       break;\r
+               case PSN_QUERYCANCEL:\r
+                       lResult = !pT->OnQueryCancel();\r
+                       break;\r
+               case PSN_WIZNEXT:\r
+                       lResult = pT->OnWizardNext();\r
+                       break;\r
+               case PSN_WIZBACK:\r
+                       lResult = pT->OnWizardBack();\r
+                       break;\r
+               case PSN_WIZFINISH:\r
+                       lResult = !pT->OnWizardFinish();\r
+                       break;\r
+               case PSN_HELP:\r
+                       pT->OnHelp();\r
+                       break;\r
+#ifndef _WIN32_WCE\r
+#if (_WIN32_IE >= 0x0400)\r
+               case PSN_GETOBJECT:\r
+                       if(!pT->OnGetObject((LPNMOBJECTNOTIFY)lParam))\r
+                               bHandled = FALSE;\r
+                       break;\r
+#endif // (_WIN32_IE >= 0x0400)\r
+#if (_WIN32_IE >= 0x0500)\r
+               case PSN_TRANSLATEACCELERATOR:\r
+                       {\r
+                               LPPSHNOTIFY lpPSHNotify = (LPPSHNOTIFY)lParam;\r
+                               lResult = pT->OnTranslateAccelerator((LPMSG)lpPSHNotify->lParam) ? PSNRET_MESSAGEHANDLED : PSNRET_NOERROR;\r
+                       }\r
+                       break;\r
+               case PSN_QUERYINITIALFOCUS:\r
+                       {\r
+                               LPPSHNOTIFY lpPSHNotify = (LPPSHNOTIFY)lParam;\r
+                               lResult = (LRESULT)pT->OnQueryInitialFocus((HWND)lpPSHNotify->lParam);\r
+                       }\r
+                       break;\r
+#endif // (_WIN32_IE >= 0x0500)\r
+#endif // !_WIN32_WCE\r
+\r
+#endif // !_WTL_NEW_PAGE_NOTIFY_HANDLERS\r
+               default:\r
+                       bHandled = FALSE;   // not handled\r
+               }\r
+\r
+               return lResult;\r
+       }\r
+\r
+// Overridables\r
+       // NOTE: Define _WTL_NEW_PAGE_NOTIFY_HANDLERS to use new notification\r
+       // handlers that return direct values without any restrictions\r
+#ifdef _WTL_NEW_PAGE_NOTIFY_HANDLERS\r
+       int OnSetActive()\r
+       {\r
+               // 0 = allow activate\r
+               // -1 = go back that was active\r
+               // page ID = jump to page\r
+               return 0;\r
+       }\r
+\r
+       BOOL OnKillActive()\r
+       {\r
+               // FALSE = allow deactivate\r
+               // TRUE = prevent deactivation\r
+               return FALSE;\r
+       }\r
+\r
+       int OnApply()\r
+       {\r
+               // PSNRET_NOERROR = apply OK\r
+               // PSNRET_INVALID = apply not OK, return to this page\r
+               // PSNRET_INVALID_NOCHANGEPAGE = apply not OK, don't change focus\r
+               return PSNRET_NOERROR;\r
+       }\r
+\r
+       void OnReset()\r
+       {\r
+       }\r
+\r
+       BOOL OnQueryCancel()\r
+       {\r
+               // FALSE = allow cancel\r
+               // TRUE = prevent cancel\r
+               return FALSE;\r
+       }\r
+\r
+       int OnWizardBack()\r
+       {\r
+               // 0  = goto previous page\r
+               // -1 = prevent page change\r
+               // >0 = jump to page by dlg ID\r
+               return 0;\r
+       }\r
+\r
+       int OnWizardNext()\r
+       {\r
+               // 0  = goto next page\r
+               // -1 = prevent page change\r
+               // >0 = jump to page by dlg ID\r
+               return 0;\r
+       }\r
+\r
+       INT_PTR OnWizardFinish()\r
+       {\r
+               // FALSE = allow finish\r
+               // TRUE = prevent finish\r
+               // HWND = prevent finish and set focus to HWND (CommCtrl 5.80 only)\r
+               return FALSE;\r
+       }\r
+\r
+       void OnHelp()\r
+       {\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+#if (_WIN32_IE >= 0x0400)\r
+       BOOL OnGetObject(LPNMOBJECTNOTIFY /*lpObjectNotify*/)\r
+       {\r
+               return FALSE;   // not processed\r
+       }\r
+#endif // (_WIN32_IE >= 0x0400)\r
+\r
+#if (_WIN32_IE >= 0x0500)\r
+       int OnTranslateAccelerator(LPMSG /*lpMsg*/)\r
+       {\r
+               // PSNRET_NOERROR - message not handled\r
+               // PSNRET_MESSAGEHANDLED - message handled\r
+               return PSNRET_NOERROR;\r
+       }\r
+\r
+       HWND OnQueryInitialFocus(HWND /*hWndFocus*/)\r
+       {\r
+               // NULL = set focus to default control\r
+               // HWND = set focus to HWND\r
+               return NULL;\r
+       }\r
+#endif // (_WIN32_IE >= 0x0500)\r
+#endif // !_WIN32_WCE\r
+\r
+#else // !_WTL_NEW_PAGE_NOTIFY_HANDLERS\r
+       BOOL OnSetActive()\r
+       {\r
+               return TRUE;\r
+       }\r
+\r
+       BOOL OnKillActive()\r
+       {\r
+               return TRUE;\r
+       }\r
+\r
+       BOOL OnApply()\r
+       {\r
+               return TRUE;\r
+       }\r
+\r
+       void OnReset()\r
+       {\r
+       }\r
+\r
+       BOOL OnQueryCancel()\r
+       {\r
+               return TRUE;    // ok to cancel\r
+       }\r
+\r
+       int OnWizardBack()\r
+       {\r
+               // 0  = goto previous page\r
+               // -1 = prevent page change\r
+               // >0 = jump to page by dlg ID\r
+               return 0;\r
+       }\r
+\r
+       int OnWizardNext()\r
+       {\r
+               // 0  = goto next page\r
+               // -1 = prevent page change\r
+               // >0 = jump to page by dlg ID\r
+               return 0;\r
+       }\r
+\r
+       BOOL OnWizardFinish()\r
+       {\r
+               return TRUE;\r
+       }\r
+\r
+       void OnHelp()\r
+       {\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+#if (_WIN32_IE >= 0x0400)\r
+       BOOL OnGetObject(LPNMOBJECTNOTIFY /*lpObjectNotify*/)\r
+       {\r
+               return FALSE;   // not processed\r
+       }\r
+#endif // (_WIN32_IE >= 0x0400)\r
+\r
+#if (_WIN32_IE >= 0x0500)\r
+       BOOL OnTranslateAccelerator(LPMSG /*lpMsg*/)\r
+       {\r
+               return FALSE;   // not translated\r
+       }\r
+\r
+       HWND OnQueryInitialFocus(HWND /*hWndFocus*/)\r
+       {\r
+               return NULL;   // default\r
+       }\r
+#endif // (_WIN32_IE >= 0x0500)\r
+#endif // !_WIN32_WCE\r
+\r
+#endif // !_WTL_NEW_PAGE_NOTIFY_HANDLERS\r
+};\r
+\r
+// for non-customized pages\r
+template <WORD t_wDlgTemplateID>\r
+class CPropertyPage : public CPropertyPageImpl<CPropertyPage<t_wDlgTemplateID> >\r
+{\r
+public:\r
+       enum { IDD = t_wDlgTemplateID };\r
+\r
+       CPropertyPage(ATL::_U_STRINGorID title = (LPCTSTR)NULL) : CPropertyPageImpl<CPropertyPage>(title)\r
+       { }\r
+\r
+       DECLARE_EMPTY_MSG_MAP()\r
+};\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CAxPropertyPageImpl - property page that hosts ActiveX controls\r
+\r
+#ifndef _ATL_NO_HOSTING\r
+\r
+// Note: You must #include <atlhost.h> to use these classes\r
+\r
+template <class T, class TBase = CPropertyPageWindow>\r
+class ATL_NO_VTABLE CAxPropertyPageImpl : public CPropertyPageImpl< T, TBase >\r
+{\r
+public:\r
+// Data members\r
+       HGLOBAL m_hInitData;\r
+       HGLOBAL m_hDlgRes;\r
+       HGLOBAL m_hDlgResSplit;\r
+\r
+// Constructor/destructor\r
+       CAxPropertyPageImpl(ATL::_U_STRINGorID title = (LPCTSTR)NULL) : \r
+                       CPropertyPageImpl< T, TBase >(title),\r
+                       m_hInitData(NULL), m_hDlgRes(NULL), m_hDlgResSplit(NULL)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               pT;   // avoid level 4 warning\r
+\r
+               // initialize ActiveX hosting and modify dialog template\r
+               ATL::AtlAxWinInit();\r
+\r
+               HINSTANCE hInstance = ModuleHelper::GetResourceInstance();\r
+               LPCTSTR lpTemplateName = MAKEINTRESOURCE(pT->IDD);\r
+               HRSRC hDlg = ::FindResource(hInstance, lpTemplateName, (LPTSTR)RT_DIALOG);\r
+               if(hDlg != NULL)\r
+               {\r
+                       HRSRC hDlgInit = ::FindResource(hInstance, lpTemplateName, (LPTSTR)_ATL_RT_DLGINIT);\r
+\r
+                       BYTE* pInitData = NULL;\r
+                       if(hDlgInit != NULL)\r
+                       {\r
+                               m_hInitData = ::LoadResource(hInstance, hDlgInit);\r
+                               pInitData = (BYTE*)::LockResource(m_hInitData);\r
+                       }\r
+\r
+                       m_hDlgRes = ::LoadResource(hInstance, hDlg);\r
+                       DLGTEMPLATE* pDlg = (DLGTEMPLATE*)::LockResource(m_hDlgRes);\r
+                       LPCDLGTEMPLATE lpDialogTemplate = ATL::_DialogSplitHelper::SplitDialogTemplate(pDlg, pInitData);\r
+                       if(lpDialogTemplate != pDlg)\r
+                               m_hDlgResSplit = GlobalHandle(lpDialogTemplate);\r
+\r
+                       // set up property page to use in-memory dialog template\r
+                       if(lpDialogTemplate != NULL)\r
+                       {\r
+                               m_psp.dwFlags |= PSP_DLGINDIRECT;\r
+                               m_psp.pResource = lpDialogTemplate;\r
+                       }\r
+                       else\r
+                       {\r
+                               ATLASSERT(FALSE && _T("CAxPropertyPageImpl - ActiveX initializtion failed!"));\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       ATLASSERT(FALSE && _T("CAxPropertyPageImpl - Cannot find dialog template!"));\r
+               }\r
+       }\r
+\r
+       ~CAxPropertyPageImpl()\r
+       {\r
+               if(m_hInitData != NULL)\r
+               {\r
+                       UnlockResource(m_hInitData);\r
+                       FreeResource(m_hInitData);\r
+               }\r
+               if(m_hDlgRes != NULL)\r
+               {\r
+                       UnlockResource(m_hDlgRes);\r
+                       FreeResource(m_hDlgRes);\r
+               }\r
+               if(m_hDlgResSplit != NULL)\r
+               {\r
+                       ::GlobalFree(m_hDlgResSplit);\r
+               }\r
+       }\r
+\r
+// Methods\r
+       // call this one to handle keyboard message for ActiveX controls\r
+       BOOL PreTranslateMessage(LPMSG pMsg)\r
+       {\r
+               if ((pMsg->message < WM_KEYFIRST || pMsg->message > WM_KEYLAST) &&\r
+                  (pMsg->message < WM_MOUSEFIRST || pMsg->message > WM_MOUSELAST))\r
+                       return FALSE;\r
+               // find a direct child of the dialog from the window that has focus\r
+               HWND hWndCtl = ::GetFocus();\r
+               if (IsChild(hWndCtl) && ::GetParent(hWndCtl) != m_hWnd)\r
+               {\r
+                       do\r
+                       {\r
+                               hWndCtl = ::GetParent(hWndCtl);\r
+                       }\r
+                       while (::GetParent(hWndCtl) != m_hWnd);\r
+               }\r
+               // give controls a chance to translate this message\r
+               return (BOOL)::SendMessage(hWndCtl, WM_FORWARDMSG, 0, (LPARAM)pMsg);\r
+       }\r
+\r
+// Overridables\r
+#if (_WIN32_IE >= 0x0500)\r
+       // new default implementation for ActiveX hosting pages\r
+#ifdef _WTL_NEW_PAGE_NOTIFY_HANDLERS\r
+       int OnTranslateAccelerator(LPMSG lpMsg)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               return (pT->PreTranslateMessage(lpMsg) != FALSE) ? PSNRET_MESSAGEHANDLED : PSNRET_NOERROR;\r
+       }\r
+#else // !_WTL_NEW_PAGE_NOTIFY_HANDLERS\r
+       BOOL OnTranslateAccelerator(LPMSG lpMsg)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               return pT->PreTranslateMessage(lpMsg);\r
+       }\r
+#endif // !_WTL_NEW_PAGE_NOTIFY_HANDLERS\r
+#endif // (_WIN32_IE >= 0x0500)\r
+\r
+// Support for new stuff in ATL7\r
+#if (_ATL_VER >= 0x0700)\r
+       int GetIDD()\r
+       {\r
+               return( static_cast<T*>(this)->IDD );\r
+       }\r
+\r
+       virtual DLGPROC GetDialogProc()\r
+       {\r
+               return DialogProc;\r
+       }\r
+\r
+       static INT_PTR CALLBACK DialogProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)\r
+       {\r
+               CAxPropertyPageImpl< T, TBase >* pThis = (CAxPropertyPageImpl< T, TBase >*)hWnd;\r
+               if (uMsg == WM_INITDIALOG)\r
+               {\r
+                       HRESULT hr;\r
+                       if (FAILED(hr = pThis->CreateActiveXControls(pThis->GetIDD())))\r
+                       {\r
+                               ATLASSERT(FALSE);\r
+                               return FALSE;\r
+                       }\r
+               }\r
+               return CPropertyPageImpl< T, TBase >::DialogProc(hWnd, uMsg, wParam, lParam);\r
+       }\r
+\r
+// ActiveX controls creation\r
+       virtual HRESULT CreateActiveXControls(UINT nID)\r
+       {\r
+               // Load dialog template and InitData\r
+               HRSRC hDlgInit = ::FindResource(ATL::_AtlBaseModule.GetResourceInstance(), MAKEINTRESOURCE(nID), (LPTSTR)_ATL_RT_DLGINIT);\r
+               BYTE* pInitData = NULL;\r
+               HGLOBAL hData = NULL;\r
+               HRESULT hr = S_OK;\r
+               if (hDlgInit != NULL)\r
+               {\r
+                       hData = ::LoadResource(ATL::_AtlBaseModule.GetResourceInstance(), hDlgInit);\r
+                       if (hData != NULL)\r
+                               pInitData = (BYTE*) ::LockResource(hData);\r
+               }\r
+\r
+               HRSRC hDlg = ::FindResource(ATL::_AtlBaseModule.GetResourceInstance(), MAKEINTRESOURCE(nID), (LPTSTR)RT_DIALOG);\r
+               if (hDlg != NULL)\r
+               {\r
+                       HGLOBAL hResource = ::LoadResource(ATL::_AtlBaseModule.GetResourceInstance(), hDlg);\r
+                       DLGTEMPLATE* pDlg = NULL;\r
+                       if (hResource != NULL)\r
+                       {\r
+                               pDlg = (DLGTEMPLATE*) ::LockResource(hResource);\r
+                               if (pDlg != NULL)\r
+                               {\r
+                                       // Get first control on the template\r
+                                       BOOL bDialogEx = ATL::_DialogSplitHelper::IsDialogEx(pDlg);\r
+                                       WORD nItems = ATL::_DialogSplitHelper::DlgTemplateItemCount(pDlg);\r
+\r
+                                       // Get first control on the dialog\r
+                                       DLGITEMTEMPLATE* pItem = ATL::_DialogSplitHelper::FindFirstDlgItem(pDlg);\r
+                                       HWND hWndPrev = GetWindow(GW_CHILD);\r
+\r
+                                       // Create all ActiveX cotnrols in the dialog template and place them in the correct tab order (z-order)\r
+                                       for (WORD nItem = 0; nItem < nItems; nItem++)\r
+                                       {\r
+                                               DWORD wID = bDialogEx ? ((ATL::_DialogSplitHelper::DLGITEMTEMPLATEEX*)pItem)->id : pItem->id;\r
+                                               if (ATL::_DialogSplitHelper::IsActiveXControl(pItem, bDialogEx))\r
+                                               {\r
+                                                       BYTE* pData = NULL;\r
+                                                       DWORD dwLen = ATL::_DialogSplitHelper::FindCreateData(wID, pInitData, &pData);\r
+                                                       ATL::CComPtr<IStream> spStream;\r
+                                                       if (dwLen != 0)\r
+                                                       {\r
+                                                               HGLOBAL h = GlobalAlloc(GHND, dwLen);\r
+                                                               if (h != NULL)\r
+                                                               {\r
+                                                                       BYTE* pBytes = (BYTE*) GlobalLock(h);\r
+                                                                       BYTE* pSource = pData; \r
+                                                                       SecureHelper::memcpy_x(pBytes, dwLen, pSource, dwLen);\r
+                                                                       GlobalUnlock(h);\r
+                                                                       CreateStreamOnHGlobal(h, TRUE, &spStream);\r
+                                                               }\r
+                                                               else\r
+                                                               {\r
+                                                                       hr = E_OUTOFMEMORY;\r
+                                                                       break;\r
+                                                               }\r
+                                                       }\r
+\r
+                                                       ATL::CComBSTR bstrLicKey;\r
+                                                       hr = ATL::_DialogSplitHelper::ParseInitData(spStream, &bstrLicKey.m_str);\r
+                                                       if (SUCCEEDED(hr))\r
+                                                       {\r
+                                                               ATL::CAxWindow2 wnd;\r
+                                                               // Get control caption.\r
+                                                               LPWSTR pszClassName = \r
+                                                                       bDialogEx ? \r
+                                                                               (LPWSTR)(((ATL::_DialogSplitHelper::DLGITEMTEMPLATEEX*)pItem) + 1) :\r
+                                                                               (LPWSTR)(pItem + 1);\r
+                                                               // Get control rect.\r
+                                                               RECT rect;\r
+                                                               rect.left = \r
+                                                                       bDialogEx ? \r
+                                                                               ((ATL::_DialogSplitHelper::DLGITEMTEMPLATEEX*)pItem)->x : \r
+                                                                               pItem->x;\r
+                                                               rect.top = \r
+                                                                       bDialogEx ? \r
+                                                                               ((ATL::_DialogSplitHelper::DLGITEMTEMPLATEEX*)pItem)->y : \r
+                                                                               pItem->y;\r
+                                                               rect.right = rect.left + \r
+                                                                       (bDialogEx ? \r
+                                                                               ((ATL::_DialogSplitHelper::DLGITEMTEMPLATEEX*)pItem)->cx : \r
+                                                                               pItem->cx);\r
+                                                               rect.bottom = rect.top + \r
+                                                                       (bDialogEx ? \r
+                                                                               ((ATL::_DialogSplitHelper::DLGITEMTEMPLATEEX*)pItem)->cy : \r
+                                                                               pItem->cy);\r
+\r
+                                                               // Convert from dialog units to screen units\r
+                                                               MapDialogRect(&rect);\r
+\r
+                                                               // Create AxWindow with a NULL caption.\r
+                                                               wnd.Create(m_hWnd, \r
+                                                                       &rect, \r
+                                                                       NULL, \r
+                                                                       (bDialogEx ? \r
+                                                                               ((ATL::_DialogSplitHelper::DLGITEMTEMPLATEEX*)pItem)->style : \r
+                                                                               pItem->style) | WS_TABSTOP, \r
+                                                                       bDialogEx ? \r
+                                                                               ((ATL::_DialogSplitHelper::DLGITEMTEMPLATEEX*)pItem)->exStyle : \r
+                                                                               0,\r
+                                                                       bDialogEx ? \r
+                                                                               ((ATL::_DialogSplitHelper::DLGITEMTEMPLATEEX*)pItem)->id : \r
+                                                                               pItem->id,\r
+                                                                       NULL);\r
+\r
+                                                               if (wnd != NULL)\r
+                                                               {\r
+#ifndef _WIN32_WCE\r
+                                                                       // Set the Help ID\r
+                                                                       if (bDialogEx && ((ATL::_DialogSplitHelper::DLGITEMTEMPLATEEX*)pItem)->helpID != 0)\r
+                                                                               wnd.SetWindowContextHelpId(((ATL::_DialogSplitHelper::DLGITEMTEMPLATEEX*)pItem)->helpID);\r
+#endif // !_WIN32_WCE\r
+                                                                       // Try to create the ActiveX control.\r
+                                                                       hr = wnd.CreateControlLic(pszClassName, spStream, NULL, bstrLicKey);\r
+                                                                       if (FAILED(hr))\r
+                                                                               break;\r
+                                                                       // Set the correct tab position.\r
+                                                                       if (nItem == 0)\r
+                                                                               hWndPrev = HWND_TOP;\r
+                                                                       wnd.SetWindowPos(hWndPrev, 0,0,0,0,SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);\r
+                                                                       hWndPrev = wnd;\r
+                                                               }\r
+                                                               else\r
+                                                               {\r
+                                                                       hr = ATL::AtlHresultFromLastError();\r
+                                                               }\r
+                                                       }\r
+                                               }\r
+                                               else\r
+                                               {\r
+                                                       if (nItem != 0)\r
+                                                               hWndPrev = ::GetWindow(hWndPrev, GW_HWNDNEXT);\r
+                                               }\r
+                                               pItem = ATL::_DialogSplitHelper::FindNextDlgItem(pItem, bDialogEx);\r
+                                       }\r
+                               }\r
+                               else\r
+                                       hr = ATL::AtlHresultFromLastError();\r
+                       }\r
+                       else\r
+                               hr = ATL::AtlHresultFromLastError();\r
+               }\r
+               return hr;\r
+       }\r
+\r
+// Event handling support\r
+       HRESULT AdviseSinkMap(bool bAdvise)\r
+       {\r
+               if(!bAdvise && m_hWnd == NULL)\r
+               {\r
+                       // window is gone, controls are already unadvised\r
+                       ATLTRACE2(atlTraceUI, 0, _T("CAxPropertyPageImpl::AdviseSinkMap called after the window was destroyed\n"));\r
+                       return S_OK;\r
+               }\r
+               HRESULT hRet = E_NOTIMPL;\r
+               __if_exists(T::_GetSinkMapFinder)\r
+               {\r
+                       T* pT = static_cast<T*>(this);\r
+                       hRet = AtlAdviseSinkMap(pT, bAdvise);\r
+               }\r
+               return hRet;\r
+       }\r
+\r
+// Message map and handlers\r
+       typedef CPropertyPageImpl< T, TBase>   _baseClass;\r
+       BEGIN_MSG_MAP(CAxPropertyPageImpl)\r
+               MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)\r
+               MESSAGE_HANDLER(WM_DESTROY, OnDestroy)\r
+               CHAIN_MSG_MAP(_baseClass)\r
+       END_MSG_MAP()\r
+\r
+       LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)\r
+       {\r
+               // initialize controls in dialog with DLGINIT resource section\r
+               ExecuteDlgInit(static_cast<T*>(this)->IDD);\r
+               AdviseSinkMap(true);\r
+               bHandled = FALSE;\r
+               return 1;\r
+       }\r
+\r
+       LRESULT OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)\r
+       {\r
+               AdviseSinkMap(false);\r
+               bHandled = FALSE;\r
+               return 1;\r
+       }\r
+#endif // (_ATL_VER >= 0x0700)\r
+};\r
+\r
+// for non-customized pages\r
+template <WORD t_wDlgTemplateID>\r
+class CAxPropertyPage : public CAxPropertyPageImpl<CAxPropertyPage<t_wDlgTemplateID> >\r
+{\r
+public:\r
+       enum { IDD = t_wDlgTemplateID };\r
+\r
+       CAxPropertyPage(ATL::_U_STRINGorID title = (LPCTSTR)NULL) : CAxPropertyPageImpl<CAxPropertyPage>(title)\r
+       { }\r
+\r
+#if (_WIN32_IE >= 0x0500) || (_ATL_VER >= 0x0700)\r
+       // not empty so we handle accelerators/create controls\r
+       BEGIN_MSG_MAP(CAxPropertyPage)\r
+               CHAIN_MSG_MAP(CAxPropertyPageImpl<CAxPropertyPage<t_wDlgTemplateID> >)\r
+       END_MSG_MAP()\r
+#else // !((_WIN32_IE >= 0x0500) || (_ATL_VER >= 0x0700))\r
+       DECLARE_EMPTY_MSG_MAP()\r
+#endif // !((_WIN32_IE >= 0x0500) || (_ATL_VER >= 0x0700))\r
+};\r
+\r
+#endif // _ATL_NO_HOSTING\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Wizard97 Support\r
+\r
+#if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)\r
+\r
+// Sample wizard dialog resources:\r
+//\r
+// IDD_WIZ97_INTERIOR_BLANK DIALOG  0, 0, 317, 143\r
+// STYLE DS_SETFONT | WS_CHILD | WS_DISABLED | WS_CAPTION\r
+// CAPTION "Wizard97 Property Page - Interior"\r
+// FONT 8, "MS Shell Dlg"\r
+// BEGIN\r
+// END\r
+//\r
+// IDD_WIZ97_EXTERIOR_BLANK DIALOGEX 0, 0, 317, 193\r
+// STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION\r
+// CAPTION "Wizard97 Property Page - Welcome/Complete"\r
+// FONT 8, "MS Shell Dlg", 0, 0, 0x0\r
+// BEGIN\r
+//    LTEXT           "Welcome to the X Wizard",IDC_WIZ97_EXTERIOR_TITLE,115,8,\r
+//                    195,24\r
+//    LTEXT           "Wizard Explanation\r\n(The height of the static text should be in multiples of 8 dlus)",\r
+//                    IDC_STATIC,115,40,195,16\r
+//    LTEXT           "h",IDC_WIZ97_BULLET1,118,64,8,8\r
+//    LTEXT           "List Item 1 (the h is turned into a bullet)",IDC_STATIC,\r
+//                    127,63,122,8\r
+//    LTEXT           "h",IDC_WIZ97_BULLET2,118,79,8,8\r
+//    LTEXT           "List Item 2. Keep 7 dlus between paragraphs",IDC_STATIC,\r
+//                    127,78,33,8\r
+//    CONTROL         "&Do not show this Welcome page again",\r
+//                    IDC_WIZ97_WELCOME_NOTAGAIN,"Button",BS_AUTOCHECKBOX | \r
+//                    WS_TABSTOP,115,169,138,10\r
+// END\r
+//\r
+// GUIDELINES DESIGNINFO \r
+// BEGIN\r
+//    IDD_WIZ97_INTERIOR_BLANK, DIALOG\r
+//    BEGIN\r
+//        LEFTMARGIN, 7\r
+//        RIGHTMARGIN, 310\r
+//        VERTGUIDE, 21\r
+//        VERTGUIDE, 31\r
+//        VERTGUIDE, 286\r
+//        VERTGUIDE, 296\r
+//        TOPMARGIN, 7\r
+//        BOTTOMMARGIN, 136\r
+//        HORZGUIDE, 8\r
+//    END\r
+//\r
+//    IDD_WIZ97_EXTERIOR_BLANK, DIALOG\r
+//    BEGIN\r
+//        RIGHTMARGIN, 310\r
+//        VERTGUIDE, 115\r
+//        VERTGUIDE, 118\r
+//        VERTGUIDE, 127\r
+//        TOPMARGIN, 7\r
+//        BOTTOMMARGIN, 186\r
+//        HORZGUIDE, 8\r
+//        HORZGUIDE, 32\r
+//        HORZGUIDE, 40\r
+//        HORZGUIDE, 169\r
+//    END\r
+// END\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CWizard97SheetWindow - client side for a Wizard 97 style wizard sheet\r
+\r
+class CWizard97SheetWindow : public CPropertySheetWindow\r
+{\r
+public:\r
+// Constructors\r
+       CWizard97SheetWindow(HWND hWnd = NULL) : CPropertySheetWindow(hWnd)\r
+       { }\r
+\r
+       CWizard97SheetWindow& operator =(HWND hWnd)\r
+       {\r
+               m_hWnd = hWnd;\r
+               return *this;\r
+       }\r
+\r
+// Operations\r
+       HFONT GetExteriorPageTitleFont(void)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (HFONT)::SendMessage(m_hWnd, GetMessage_GetExteriorPageTitleFont(), 0, 0L);\r
+       }\r
+\r
+       HFONT GetBulletFont(void)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (HFONT)::SendMessage(m_hWnd, GetMessage_GetBulletFont(), 0, 0L);\r
+       }\r
+\r
+// Helpers\r
+       static UINT GetMessage_GetExteriorPageTitleFont()\r
+       {\r
+               static UINT uGetExteriorPageTitleFont = 0;\r
+               if(uGetExteriorPageTitleFont == 0)\r
+               {\r
+                       CStaticDataInitCriticalSectionLock lock;\r
+                       if(FAILED(lock.Lock()))\r
+                       {\r
+                               ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CWizard97SheetWindow::GetMessage_GetExteriorPageTitleFont().\n"));\r
+                               ATLASSERT(FALSE);\r
+                               return 0;\r
+                       }\r
+\r
+                       if(uGetExteriorPageTitleFont == 0)\r
+                               uGetExteriorPageTitleFont = ::RegisterWindowMessage(_T("GetExteriorPageTitleFont_531AF056-B8BE-4c4c-B786-AC608DF0DF12"));\r
+\r
+                       lock.Unlock();\r
+               }\r
+               ATLASSERT(uGetExteriorPageTitleFont != 0);\r
+               return uGetExteriorPageTitleFont;\r
+       }\r
+\r
+       static UINT GetMessage_GetBulletFont()\r
+       {\r
+               static UINT uGetBulletFont = 0;\r
+               if(uGetBulletFont == 0)\r
+               {\r
+                       CStaticDataInitCriticalSectionLock lock;\r
+                       if(FAILED(lock.Lock()))\r
+                       {\r
+                               ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CWizard97SheetWindow::GetMessage_GetBulletFont().\n"));\r
+                               ATLASSERT(FALSE);\r
+                               return 0;\r
+                       }\r
+\r
+                       if(uGetBulletFont == 0)\r
+                               uGetBulletFont = ::RegisterWindowMessage(_T("GetBulletFont_AD347D08-8F65-45ef-982E-6352E8218AD5"));\r
+\r
+                       lock.Unlock();\r
+               }\r
+               ATLASSERT(uGetBulletFont != 0);\r
+               return uGetBulletFont;\r
+       }\r
+\r
+// Implementation - override to prevent usage\r
+       HWND Create(LPCTSTR, HWND, ATL::_U_RECT = NULL, LPCTSTR = NULL, DWORD = 0, DWORD = 0, ATL::_U_MENUorID = 0U, LPVOID = NULL)\r
+       {\r
+               ATLASSERT(FALSE);\r
+               return NULL;\r
+       }\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CWizard97SheetImpl - implements a Wizard 97 style wizard sheet\r
+\r
+template <class T, class TBase = CWizard97SheetWindow>\r
+class ATL_NO_VTABLE CWizard97SheetImpl : public CPropertySheetImpl< T, TBase >\r
+{\r
+protected:\r
+// Typedefs\r
+       typedef CWizard97SheetImpl< T, TBase > thisClass;\r
+       typedef CPropertySheetImpl< T, TBase > baseClass;\r
+\r
+// Member variables\r
+       CFont m_fontExteriorPageTitle;   // Welcome and Completion page title font\r
+       CFont m_fontBullet;              // Bullet font (used on static text 'h' to produce a small bullet)\r
+       bool m_bReceivedFirstSizeMessage;   \r
+\r
+public:\r
+       CWizard97SheetImpl(ATL::_U_STRINGorID title, ATL::_U_STRINGorID headerBitmap, ATL::_U_STRINGorID watermarkBitmap, UINT uStartPage = 0, HWND hWndParent = NULL) :\r
+                       baseClass(title, uStartPage, hWndParent),\r
+                       m_bReceivedFirstSizeMessage(false)\r
+       {\r
+               m_psh.dwFlags &= ~(PSH_NOCONTEXTHELP);\r
+               m_psh.dwFlags &= ~(PSH_WIZARD | PSH_WIZARD_LITE);\r
+\r
+               m_psh.dwFlags |= (PSH_HASHELP | PSH_WIZARDCONTEXTHELP);\r
+               m_psh.dwFlags |= PSH_WIZARD97;\r
+\r
+               baseClass::SetHeader(headerBitmap.m_lpstr);\r
+               baseClass::SetWatermark(watermarkBitmap.m_lpstr);\r
+       }\r
+\r
+// Overrides from base class\r
+       void OnSheetInitialized()\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               pT->_InitializeFonts();\r
+\r
+               // We'd like to center the wizard here, but its too early.\r
+               // Instead, we'll do CenterWindow upon our first WM_SIZE message\r
+       }\r
+\r
+// Initialization\r
+       void _InitializeFonts()\r
+       {\r
+               // Setup the Title and Bullet Font\r
+               // (Property pages can send the "get external page title font" and "get bullet font" messages)\r
+               // The derived class needs to do the actual SetFont for the dialog items)\r
+\r
+               CFontHandle fontThisDialog = this->GetFont();\r
+               CClientDC dcScreen(NULL);\r
+\r
+               LOGFONT titleLogFont = {0};\r
+               LOGFONT bulletLogFont = {0};\r
+               fontThisDialog.GetLogFont(&titleLogFont);\r
+               fontThisDialog.GetLogFont(&bulletLogFont);\r
+\r
+               // The Wizard 97 Spec recommends to do the Title Font\r
+               // as Verdana Bold, 12pt.\r
+               titleLogFont.lfCharSet = DEFAULT_CHARSET;\r
+               titleLogFont.lfWeight = FW_BOLD;\r
+               SecureHelper::strcpy_x(titleLogFont.lfFaceName, _countof(titleLogFont.lfFaceName), _T("Verdana Bold"));\r
+               INT titleFontPointSize = 12;\r
+               titleLogFont.lfHeight = -::MulDiv(titleFontPointSize, dcScreen.GetDeviceCaps(LOGPIXELSY), 72);\r
+               m_fontExteriorPageTitle.CreateFontIndirect(&titleLogFont);\r
+\r
+               // The Wizard 97 Spec recommends to do Bullets by having\r
+               // static text of "h" in the Marlett font.\r
+               bulletLogFont.lfCharSet = DEFAULT_CHARSET;\r
+               bulletLogFont.lfWeight = FW_NORMAL;\r
+               SecureHelper::strcpy_x(bulletLogFont.lfFaceName, _countof(bulletLogFont.lfFaceName), _T("Marlett"));\r
+               INT bulletFontSize = 8;\r
+               bulletLogFont.lfHeight = -::MulDiv(bulletFontSize, dcScreen.GetDeviceCaps(LOGPIXELSY), 72);\r
+               m_fontBullet.CreateFontIndirect(&bulletLogFont);\r
+       }\r
+\r
+// Message Handling\r
+       BEGIN_MSG_MAP(thisClass)\r
+               MESSAGE_HANDLER(CWizard97SheetWindow::GetMessage_GetExteriorPageTitleFont(), OnGetExteriorPageTitleFont)\r
+               MESSAGE_HANDLER(CWizard97SheetWindow::GetMessage_GetBulletFont(), OnGetBulletFont)\r
+               MESSAGE_HANDLER(WM_SIZE, OnSize)\r
+               CHAIN_MSG_MAP(baseClass)\r
+       END_MSG_MAP()\r
+\r
+       LRESULT OnGetExteriorPageTitleFont(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)\r
+       {\r
+               return (LRESULT)(HFONT)m_fontExteriorPageTitle;\r
+       }\r
+\r
+       LRESULT OnGetBulletFont(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)\r
+       {\r
+               return (LRESULT)(HFONT)m_fontBullet;\r
+       }\r
+\r
+       LRESULT OnSize(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)\r
+       {\r
+               if(!m_bReceivedFirstSizeMessage)\r
+               {\r
+                       m_bReceivedFirstSizeMessage = true;\r
+                       this->CenterWindow();\r
+               }\r
+\r
+               bHandled = FALSE;\r
+               return 0;\r
+       }\r
+};\r
+\r
+// for non-customized sheets\r
+class CWizard97Sheet : public CWizard97SheetImpl<CWizard97Sheet>\r
+{\r
+protected:\r
+// Typedefs\r
+       typedef CWizard97Sheet thisClass;\r
+       typedef CWizard97SheetImpl<CWizard97Sheet> baseClass;\r
+\r
+public:\r
+       CWizard97Sheet(ATL::_U_STRINGorID title, ATL::_U_STRINGorID headerBitmap, ATL::_U_STRINGorID watermarkBitmap, UINT uStartPage = 0, HWND hWndParent = NULL) :\r
+               baseClass(title, headerBitmap, watermarkBitmap, uStartPage, hWndParent)\r
+       { }\r
+\r
+       BEGIN_MSG_MAP(thisClass)\r
+               CHAIN_MSG_MAP(baseClass)\r
+       END_MSG_MAP()\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CWizard97PageWindow - client side for a Wizard 97 style wizard page\r
+\r
+#define WIZARD97_EXTERIOR_CXDLG 317\r
+#define WIZARD97_EXTERIOR_CYDLG 193\r
+\r
+#define WIZARD97_INTERIOR_CXDLG 317\r
+#define WIZARD97_INTERIOR_CYDLG 143\r
+\r
+class CWizard97PageWindow : public CPropertyPageWindow\r
+{\r
+public:\r
+// Constructors\r
+       CWizard97PageWindow(HWND hWnd = NULL) : CPropertyPageWindow(hWnd)\r
+       { }\r
+\r
+       CWizard97PageWindow& operator =(HWND hWnd)\r
+       {\r
+               m_hWnd = hWnd;\r
+               return *this;\r
+       }\r
+\r
+// Attributes\r
+       CWizard97SheetWindow GetPropertySheet() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return CWizard97SheetWindow(GetParent());\r
+       }\r
+\r
+// Operations\r
+       HFONT GetExteriorPageTitleFont(void)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return GetPropertySheet().GetExteriorPageTitleFont();\r
+       }\r
+\r
+       HFONT GetBulletFont(void)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return GetPropertySheet().GetBulletFont();\r
+       }\r
+\r
+// Implementation - overrides to prevent usage\r
+       HWND Create(LPCTSTR, HWND, ATL::_U_RECT = NULL, LPCTSTR = NULL, DWORD = 0, DWORD = 0, ATL::_U_MENUorID = 0U, LPVOID = NULL)\r
+       {\r
+               ATLASSERT(FALSE);\r
+               return NULL;\r
+       }\r
+\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CWizard97PageImpl - implements a Wizard 97 style wizard page\r
+\r
+template <class T, class TBase = CWizard97PageWindow>\r
+class ATL_NO_VTABLE CWizard97PageImpl : public CPropertyPageImpl< T, TBase >\r
+{\r
+protected:\r
+// Typedefs\r
+       typedef CWizard97PageImpl< T, TBase > thisClass;\r
+       typedef CPropertyPageImpl< T, TBase > baseClass;\r
+\r
+public:\r
+       CWizard97PageImpl(ATL::_U_STRINGorID title = (LPCTSTR)NULL) : baseClass(title)\r
+       { }\r
+\r
+// Message Handling\r
+       BEGIN_MSG_MAP(thisClass)\r
+               CHAIN_MSG_MAP(baseClass)\r
+       END_MSG_MAP()\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CWizard97ExteriorPageImpl - implements a Wizard 97 style exterior wizard page\r
+\r
+template <class T, class TBase = CWizard97PageWindow>\r
+class ATL_NO_VTABLE CWizard97ExteriorPageImpl : public CPropertyPageImpl< T, TBase >\r
+{\r
+protected:\r
+// Typedefs\r
+       typedef CWizard97ExteriorPageImpl< T, TBase > thisClass;\r
+       typedef CPropertyPageImpl< T, TBase > baseClass;\r
+\r
+public:\r
+// Constructors\r
+       CWizard97ExteriorPageImpl(ATL::_U_STRINGorID title = (LPCTSTR)NULL) : baseClass(title)\r
+       {\r
+               m_psp.dwFlags |= PSP_HASHELP;\r
+               m_psp.dwFlags |= PSP_HIDEHEADER;\r
+       }\r
+\r
+// Message Handling\r
+       BEGIN_MSG_MAP(thisClass)\r
+               CHAIN_MSG_MAP(baseClass)\r
+       END_MSG_MAP()\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CWizard97InteriorPageImpl - implements a Wizard 97 style interior wizard page\r
+\r
+template <class T, class TBase = CWizard97PageWindow>\r
+class ATL_NO_VTABLE CWizard97InteriorPageImpl : public CPropertyPageImpl< T, TBase >\r
+{\r
+protected:\r
+// Typedefs\r
+       typedef CWizard97InteriorPageImpl< T, TBase > thisClass;\r
+       typedef CPropertyPageImpl< T, TBase > baseClass;\r
+\r
+public:\r
+// Constructors\r
+       CWizard97InteriorPageImpl(ATL::_U_STRINGorID title = (LPCTSTR)NULL) : baseClass(title)\r
+       {\r
+               m_psp.dwFlags |= PSP_HASHELP;\r
+               m_psp.dwFlags &= ~PSP_HIDEHEADER;\r
+               m_psp.dwFlags |= PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE;\r
+\r
+               // Be sure to have the derived class define this in the constructor.\r
+               // We'll default it to something obvious in case its forgotten.\r
+               baseClass::SetHeaderTitle(_T("Call SetHeaderTitle in Derived Class"));\r
+               baseClass::SetHeaderSubTitle(_T("Call SetHeaderSubTitle in the constructor of the Derived Class."));\r
+       }\r
+\r
+// Message Handling\r
+       BEGIN_MSG_MAP(thisClass)\r
+               CHAIN_MSG_MAP(baseClass)\r
+       END_MSG_MAP()\r
+};\r
+\r
+#endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Aero Wizard support\r
+\r
+#if (_WIN32_WINNT >= 0x0600) && !defined(_WIN32_WCE)\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CAeroWizardFrameWindow - client side for an Aero Wizard frame window\r
+\r
+class CAeroWizardFrameWindow : public CPropertySheetWindow\r
+{\r
+public:\r
+// Constructors\r
+       CAeroWizardFrameWindow(HWND hWnd = NULL) : CPropertySheetWindow(hWnd)\r
+       { }\r
+\r
+       CAeroWizardFrameWindow& operator =(HWND hWnd)\r
+       {\r
+               m_hWnd = hWnd;\r
+               return *this;\r
+       }\r
+\r
+// Operations - new, Aero Wizard only\r
+       void SetNextText(LPCWSTR lpszText)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, PSM_SETNEXTTEXT, 0, (LPARAM)lpszText);\r
+       }\r
+\r
+       void ShowWizardButtons(DWORD dwButtons, DWORD dwStates)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::PostMessage(m_hWnd, PSM_SHOWWIZBUTTONS, (WPARAM)dwStates, (LPARAM)dwButtons);\r
+       }\r
+\r
+       void EnableWizardButtons(DWORD dwButtons, DWORD dwStates)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::PostMessage(m_hWnd, PSM_ENABLEWIZBUTTONS, (WPARAM)dwStates, (LPARAM)dwButtons);\r
+       }\r
+\r
+       void SetButtonText(DWORD dwButton, LPCWSTR lpszText)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, PSM_SETBUTTONTEXT, (WPARAM)dwButton, (LPARAM)lpszText);\r
+       }\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CAeroWizardFrameImpl - implements an Aero Wizard frame\r
+\r
+template <class T, class TBase = CAeroWizardFrameWindow>\r
+class ATL_NO_VTABLE CAeroWizardFrameImpl : public CPropertySheetImpl<T, TBase >\r
+{\r
+public:\r
+// Constructor\r
+       CAeroWizardFrameImpl(ATL::_U_STRINGorID title = (LPCTSTR)NULL, UINT uStartPage = 0, HWND hWndParent = NULL) :\r
+               CPropertySheetImpl<T, TBase >(title, uStartPage, hWndParent)\r
+       {\r
+               m_psh.dwFlags |= PSH_WIZARD | PSH_AEROWIZARD;\r
+       }\r
+\r
+// Operations\r
+       void EnableResizing()\r
+       {\r
+               ATLASSERT(m_hWnd == NULL);   // can't do this after it's created\r
+               m_psh.dwFlags |= PSH_RESIZABLE;\r
+       }\r
+\r
+       void UseHeaderBitmap()\r
+       {\r
+               ATLASSERT(m_hWnd == NULL);   // can't do this after it's created\r
+               m_psh.dwFlags |= PSH_HEADERBITMAP;\r
+       }\r
+\r
+       void SetNoMargin()\r
+       {\r
+               ATLASSERT(m_hWnd == NULL);   // can't do this after it's created\r
+               m_psh.dwFlags |= PSH_NOMARGIN;\r
+       }\r
+\r
+// Override to prevent use\r
+       HWND Create(HWND /*hWndParent*/ = NULL)\r
+       {\r
+               ATLASSERT(FALSE);   // not supported for Aero Wizard\r
+               return NULL;\r
+       }\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CAeroWizardFrame - for non-customized frames\r
+\r
+class CAeroWizardFrame : public CAeroWizardFrameImpl<CAeroWizardFrame>\r
+{\r
+public:\r
+       CAeroWizardFrame(ATL::_U_STRINGorID title = (LPCTSTR)NULL, UINT uStartPage = 0, HWND hWndParent = NULL)\r
+               : CAeroWizardFrameImpl<CAeroWizardFrame>(title, uStartPage, hWndParent)\r
+       { }\r
+\r
+       BEGIN_MSG_MAP(CAeroWizardFrame)\r
+               MESSAGE_HANDLER(WM_COMMAND, CAeroWizardFrameImpl<CAeroWizardFrame>::OnCommand)\r
+       END_MSG_MAP()\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CAeroWizardPageWindow - client side for an Aero Wizard page\r
+\r
+class CAeroWizardPageWindow : public CPropertyPageWindow\r
+{\r
+public:\r
+// Constructors\r
+       CAeroWizardPageWindow(HWND hWnd = NULL) : CPropertyPageWindow(hWnd)\r
+       { }\r
+\r
+       CAeroWizardPageWindow& operator =(HWND hWnd)\r
+       {\r
+               m_hWnd = hWnd;\r
+               return *this;\r
+       }\r
+\r
+// Attributes\r
+       CAeroWizardFrameWindow GetAeroWizardFrame() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               // This is not really top-level frame window, but it processes all frame messages\r
+               return CAeroWizardFrameWindow(GetParent());\r
+       }\r
+\r
+// Operations - new, Aero Wizard only\r
+       void SetNextText(LPCWSTR lpszText)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(GetParent() != NULL);\r
+               GetAeroWizardFrame().SetNextText(lpszText);\r
+       }\r
+\r
+       void ShowWizardButtons(DWORD dwButtons, DWORD dwStates)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(GetParent() != NULL);\r
+               GetAeroWizardFrame().ShowWizardButtons(dwButtons, dwStates);\r
+       }\r
+\r
+       void EnableWizardButtons(DWORD dwButtons, DWORD dwStates)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(GetParent() != NULL);\r
+               GetAeroWizardFrame().EnableWizardButtons(dwButtons, dwStates);\r
+       }\r
+\r
+       void SetButtonText(DWORD dwButton, LPCWSTR lpszText)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(GetParent() != NULL);\r
+               GetAeroWizardFrame().SetButtonText(dwButton, lpszText);\r
+       }\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CAeroWizardPageImpl - implements an Aero Wizard page\r
+\r
+template <class T, class TBase = CAeroWizardPageWindow>\r
+class ATL_NO_VTABLE CAeroWizardPageImpl : public CPropertyPageImpl<T, TBase >\r
+{\r
+public:\r
+       CAeroWizardPageImpl(ATL::_U_STRINGorID title = (LPCTSTR)NULL) : CPropertyPageImpl<T, TBase >(title)\r
+       { }\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CAeroWizardPage - for non-customized pages\r
+\r
+template <WORD t_wDlgTemplateID>\r
+class CAeroWizardPage : public CAeroWizardPageImpl<CAeroWizardPage<t_wDlgTemplateID> >\r
+{\r
+public:\r
+       enum { IDD = t_wDlgTemplateID };\r
+\r
+       CAeroWizardPage(ATL::_U_STRINGorID title = (LPCTSTR)NULL) : CAeroWizardPageImpl<CAeroWizardPage>(title)\r
+       { }\r
+\r
+       DECLARE_EMPTY_MSG_MAP()\r
+};\r
+\r
+\r
+#ifndef _ATL_NO_HOSTING\r
+\r
+// Note: You must #include <atlhost.h> to use these classes\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CAeroWizardAxPageImpl - Aero Wizard page that hosts ActiveX controls\r
+\r
+template <class T, class TBase = CAeroWizardPageWindow>\r
+class ATL_NO_VTABLE CAeroWizardAxPageImpl : public CAxPropertyPageImpl< T, TBase >\r
+{\r
+public:\r
+       CAeroWizardAxPageImpl(ATL::_U_STRINGorID title = (LPCTSTR)NULL) : CAxPropertyPageImpl< T, TBase >(title)\r
+       { }\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CAeroWizardAxPage - for non-customized pages\r
+\r
+template <WORD t_wDlgTemplateID>\r
+class CAeroWizardAxPage : public CAeroWizardAxPageImpl<CAeroWizardAxPage<t_wDlgTemplateID> >\r
+{\r
+public:\r
+       enum { IDD = t_wDlgTemplateID };\r
+\r
+       CAeroWizardAxPage(ATL::_U_STRINGorID title = (LPCTSTR)NULL) : CAeroWizardAxPageImpl<CAeroWizardAxPage>(title)\r
+       { }\r
+\r
+#if (_WIN32_IE >= 0x0500) || (_ATL_VER >= 0x0700)\r
+       // not empty so we handle accelerators/create controls\r
+       BEGIN_MSG_MAP(CAeroWizardAxPage)\r
+               CHAIN_MSG_MAP(CAeroWizardAxPageImpl<CAeroWizardAxPage<t_wDlgTemplateID> >)\r
+       END_MSG_MAP()\r
+#else // !((_WIN32_IE >= 0x0500) || (_ATL_VER >= 0x0700))\r
+       DECLARE_EMPTY_MSG_MAP()\r
+#endif // !((_WIN32_IE >= 0x0500) || (_ATL_VER >= 0x0700))\r
+};\r
+\r
+#endif // _ATL_NO_HOSTING\r
+\r
+#endif // (_WIN32_WINNT >= 0x0600) && !defined(_WIN32_WCE)\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// TaskDialog support\r
+\r
+#if ((_WIN32_WINNT >= 0x0600) || defined(_WTL_TASKDIALOG)) && !defined(_WIN32_WCE)\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// AtlTaskDialog - support for TaskDialog() function\r
+\r
+inline int AtlTaskDialog(HWND hWndParent, \r
+                         ATL::_U_STRINGorID WindowTitle, ATL::_U_STRINGorID MainInstructionText, ATL::_U_STRINGorID ContentText, \r
+                         TASKDIALOG_COMMON_BUTTON_FLAGS dwCommonButtons = 0U, ATL::_U_STRINGorID Icon = (LPCTSTR)NULL)\r
+{\r
+       int nRet = -1;\r
+\r
+#ifdef _WTL_TASKDIALOG_DIRECT\r
+       USES_CONVERSION;\r
+       HRESULT hRet = ::TaskDialog(hWndParent, ModuleHelper::GetResourceInstance(), T2CW(WindowTitle.m_lpstr), T2CW(MainInstructionText.m_lpstr), T2CW(ContentText.m_lpstr), dwCommonButtons, T2CW(Icon.m_lpstr), &nRet);\r
+       ATLVERIFY(SUCCEEDED(hRet));\r
+#else\r
+       // This allows apps to run on older versions of Windows\r
+       typedef HRESULT (STDAPICALLTYPE *PFN_TaskDialog)(HWND hwndParent, HINSTANCE hInstance, PCWSTR pszWindowTitle, PCWSTR pszMainInstruction, PCWSTR pszContent, TASKDIALOG_COMMON_BUTTON_FLAGS dwCommonButtons, PCWSTR pszIcon, int* pnButton);\r
+\r
+       HMODULE m_hCommCtrlDLL = ::LoadLibrary(_T("comctl32.dll"));\r
+       if(m_hCommCtrlDLL != NULL)\r
+       {\r
+               PFN_TaskDialog pfnTaskDialog = (PFN_TaskDialog)::GetProcAddress(m_hCommCtrlDLL, "TaskDialog");\r
+               if(pfnTaskDialog != NULL)\r
+               {\r
+                       USES_CONVERSION;\r
+                       HRESULT hRet = pfnTaskDialog(hWndParent, ModuleHelper::GetResourceInstance(), T2CW(WindowTitle.m_lpstr), T2CW(MainInstructionText.m_lpstr), T2CW(ContentText.m_lpstr), dwCommonButtons, T2CW(Icon.m_lpstr), &nRet);\r
+                       ATLVERIFY(SUCCEEDED(hRet));\r
+               }\r
+\r
+               ::FreeLibrary(m_hCommCtrlDLL);\r
+       }\r
+#endif\r
+\r
+       return nRet;\r
+}\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CTaskDialogConfig - TASKDIALOGCONFIG wrapper\r
+\r
+class CTaskDialogConfig : public TASKDIALOGCONFIG\r
+{\r
+public:\r
+// Constructor\r
+       CTaskDialogConfig()\r
+       {\r
+               Init();\r
+       }\r
+\r
+       void Init()\r
+       {\r
+               memset(this, 0, sizeof(TASKDIALOGCONFIG));   // initialize structure to 0/NULL\r
+               this->cbSize = sizeof(TASKDIALOGCONFIG);\r
+               this->hInstance = ModuleHelper::GetResourceInstance();\r
+       }\r
+\r
+// Operations - setting values\r
+       // common buttons\r
+       void SetCommonButtons(TASKDIALOG_COMMON_BUTTON_FLAGS dwCommonButtons)\r
+       {\r
+               this->dwCommonButtons = dwCommonButtons;\r
+       }\r
+\r
+       // window title text\r
+       void SetWindowTitle(UINT nID)\r
+       {\r
+               this->pszWindowTitle = MAKEINTRESOURCEW(nID);\r
+       }\r
+\r
+       void SetWindowTitle(LPCWSTR lpstrWindowTitle)\r
+       {\r
+               this->pszWindowTitle = lpstrWindowTitle;\r
+       }\r
+\r
+       // main icon\r
+       void SetMainIcon(HICON hIcon)\r
+       {\r
+               this->dwFlags |= TDF_USE_HICON_MAIN;\r
+               this->hMainIcon = hIcon;\r
+       }\r
+\r
+       void SetMainIcon(UINT nID)\r
+       {\r
+               this->dwFlags &= ~TDF_USE_HICON_MAIN;\r
+               this->pszMainIcon = MAKEINTRESOURCEW(nID);\r
+       }\r
+\r
+       void SetMainIcon(LPCWSTR lpstrMainIcon)\r
+       {\r
+               this->dwFlags &= ~TDF_USE_HICON_MAIN;\r
+               this->pszMainIcon = lpstrMainIcon;\r
+       }\r
+\r
+       // main instruction text\r
+       void SetMainInstructionText(UINT nID)\r
+       {\r
+               this->pszMainInstruction = MAKEINTRESOURCEW(nID);\r
+       }\r
+\r
+       void SetMainInstructionText(LPCWSTR lpstrMainInstruction)\r
+       {\r
+               this->pszMainInstruction = lpstrMainInstruction;\r
+       }\r
+\r
+       // content text\r
+       void SetContentText(UINT nID)\r
+       {\r
+               this->pszContent = MAKEINTRESOURCEW(nID);\r
+       }\r
+\r
+       void SetContentText(LPCWSTR lpstrContent)\r
+       {\r
+               this->pszContent = lpstrContent;\r
+       }\r
+\r
+       // buttons\r
+       void SetButtons(const TASKDIALOG_BUTTON* pButtons, UINT cButtons, int nDefaultButton = 0)\r
+       {\r
+               this->pButtons = pButtons;\r
+               this->cButtons = cButtons;\r
+               if(nDefaultButton != 0)\r
+                       this->nDefaultButton = nDefaultButton;\r
+       }\r
+\r
+       void SetDefaultButton(int nDefaultButton)\r
+       {\r
+               this->nDefaultButton = nDefaultButton;\r
+       }\r
+\r
+       // radio buttons\r
+       void SetRadioButtons(const TASKDIALOG_BUTTON* pRadioButtons, UINT cRadioButtons, int nDefaultRadioButton = 0)\r
+       {\r
+               this->pRadioButtons = pRadioButtons;\r
+               this->cRadioButtons = cRadioButtons;\r
+               if(nDefaultRadioButton != 0)\r
+                       this->nDefaultRadioButton = nDefaultRadioButton;\r
+       }\r
+\r
+       void SetDefaultRadioButton(int nDefaultRadioButton)\r
+       {\r
+               this->nDefaultRadioButton = nDefaultRadioButton;\r
+       }\r
+\r
+       // verification text\r
+       void SetVerificationText(UINT nID)\r
+       {\r
+               this->pszVerificationText = MAKEINTRESOURCEW(nID);\r
+       }\r
+\r
+       void SetVerificationText(LPCWSTR lpstrVerificationText)\r
+       {\r
+               this->pszVerificationText = lpstrVerificationText;\r
+       }\r
+\r
+       // expanded information text\r
+       void SetExpandedInformationText(UINT nID)\r
+       {\r
+               this->pszExpandedInformation = MAKEINTRESOURCEW(nID);\r
+       }\r
+\r
+       void SetExpandedInformationText(LPCWSTR lpstrExpandedInformation)\r
+       {\r
+               this->pszExpandedInformation = lpstrExpandedInformation;\r
+       }\r
+\r
+       // expanded control text\r
+       void SetExpandedControlText(UINT nID)\r
+       {\r
+               this->pszExpandedControlText = MAKEINTRESOURCEW(nID);\r
+       }\r
+\r
+       void SetExpandedControlText(LPCWSTR lpstrExpandedControlText)\r
+       {\r
+               this->pszExpandedControlText = lpstrExpandedControlText;\r
+       }\r
+\r
+       // collapsed control text\r
+       void SetCollapsedControlText(UINT nID)\r
+       {\r
+               this->pszCollapsedControlText = MAKEINTRESOURCEW(nID);\r
+       }\r
+\r
+       void SetCollapsedControlText(LPCWSTR lpstrCollapsedControlText)\r
+       {\r
+               this->pszCollapsedControlText = lpstrCollapsedControlText;\r
+       }\r
+\r
+       // footer icon\r
+       void SetFooterIcon(HICON hIcon)\r
+       {\r
+               this->dwFlags |= TDF_USE_HICON_FOOTER;\r
+               this->hFooterIcon = hIcon;\r
+       }\r
+\r
+       void SetFooterIcon(UINT nID)\r
+       {\r
+               this->dwFlags &= ~TDF_USE_HICON_FOOTER;\r
+               this->pszFooterIcon = MAKEINTRESOURCEW(nID);\r
+       }\r
+\r
+       void SetFooterIcon(LPCWSTR lpstrFooterIcon)\r
+       {\r
+               this->dwFlags &= ~TDF_USE_HICON_FOOTER;\r
+               this->pszFooterIcon = lpstrFooterIcon;\r
+       }\r
+\r
+       // footer text\r
+       void SetFooterText(UINT nID)\r
+       {\r
+               this->pszFooter = MAKEINTRESOURCEW(nID);\r
+       }\r
+\r
+       void SetFooterText(LPCWSTR lpstrFooterText)\r
+       {\r
+               this->pszFooter = lpstrFooterText;\r
+       }\r
+\r
+       // width (in DLUs)\r
+       void SetWidth(UINT cxWidth)\r
+       {\r
+               this->cxWidth = cxWidth;\r
+       }\r
+\r
+       // modify flags\r
+       void ModifyFlags(DWORD dwRemove, DWORD dwAdd)\r
+       {\r
+               this->dwFlags = (this->dwFlags & ~dwRemove) | dwAdd;\r
+       }\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CTaskDialogImpl - implements a Task Dialog\r
+\r
+template <class T>\r
+class ATL_NO_VTABLE CTaskDialogImpl\r
+{\r
+public:\r
+       CTaskDialogConfig m_tdc;\r
+       HWND m_hWnd;   // used only in callback functions\r
+\r
+// Constructor\r
+       CTaskDialogImpl(HWND hWndParent = NULL) : m_hWnd(NULL)\r
+       {\r
+               m_tdc.hwndParent = hWndParent;\r
+               m_tdc.pfCallback = T::TaskDialogCallback;\r
+               m_tdc.lpCallbackData = (LONG_PTR)static_cast<T*>(this);\r
+       }\r
+\r
+// Operations\r
+       HRESULT DoModal(HWND hWndParent = ::GetActiveWindow(), int* pnButton = NULL, int* pnRadioButton = NULL, BOOL* pfVerificationFlagChecked = NULL)\r
+       {\r
+               if(m_tdc.hwndParent == NULL)\r
+                       m_tdc.hwndParent = hWndParent;\r
+\r
+#ifdef _WTL_TASKDIALOG_DIRECT\r
+               return ::TaskDialogIndirect(&m_tdc, pnButton, pnRadioButton, pfVerificationFlagChecked);\r
+#else\r
+\r
+               // This allows apps to run on older versions of Windows\r
+               typedef HRESULT (STDAPICALLTYPE *PFN_TaskDialogIndirect)(const TASKDIALOGCONFIG* pTaskConfig, int* pnButton, int* pnRadioButton, BOOL* pfVerificationFlagChecked);\r
+\r
+               HRESULT hRet = E_UNEXPECTED;\r
+               HMODULE m_hCommCtrlDLL = ::LoadLibrary(_T("comctl32.dll"));\r
+               if(m_hCommCtrlDLL != NULL)\r
+               {\r
+                       PFN_TaskDialogIndirect pfnTaskDialogIndirect = (PFN_TaskDialogIndirect)::GetProcAddress(m_hCommCtrlDLL, "TaskDialogIndirect");\r
+                       if(pfnTaskDialogIndirect != NULL)\r
+                               hRet = pfnTaskDialogIndirect(&m_tdc, pnButton, pnRadioButton, pfVerificationFlagChecked);\r
+\r
+                       ::FreeLibrary(m_hCommCtrlDLL);\r
+               }\r
+\r
+               return hRet;\r
+#endif\r
+       }\r
+\r
+// Operations - setting values of TASKDIALOGCONFIG\r
+       // common buttons\r
+       void SetCommonButtons(TASKDIALOG_COMMON_BUTTON_FLAGS dwCommonButtons)\r
+       {       m_tdc.SetCommonButtons(dwCommonButtons); }\r
+       // window title text\r
+       void SetWindowTitle(UINT nID)\r
+       {       m_tdc.SetWindowTitle(nID); }\r
+       void SetWindowTitle(LPCWSTR lpstrWindowTitle)\r
+       {       m_tdc.SetWindowTitle(lpstrWindowTitle); }\r
+       // main icon\r
+       void SetMainIcon(HICON hIcon)\r
+       {       m_tdc.SetMainIcon(hIcon); }\r
+       void SetMainIcon(UINT nID)\r
+       {       m_tdc.SetMainIcon(nID); }\r
+       void SetMainIcon(LPCWSTR lpstrMainIcon)\r
+       {       m_tdc.SetMainIcon(lpstrMainIcon); }\r
+       // main instruction text\r
+       void SetMainInstructionText(UINT nID)\r
+       {       m_tdc.SetMainInstructionText(nID); }\r
+       void SetMainInstructionText(LPCWSTR lpstrMainInstruction)\r
+       {       m_tdc.SetMainInstructionText(lpstrMainInstruction); }\r
+       // content text\r
+       void SetContentText(UINT nID)\r
+       {       m_tdc.SetContentText(nID); }\r
+       void SetContentText(LPCWSTR lpstrContent)\r
+       {       m_tdc.SetContentText(lpstrContent); }\r
+       // buttons\r
+       void SetButtons(const TASKDIALOG_BUTTON* pButtons, UINT cButtons, int nDefaultButton = 0)\r
+       {       m_tdc.SetButtons(pButtons, cButtons, nDefaultButton); }\r
+       void SetDefaultButton(int nDefaultButton)\r
+       {       m_tdc.SetDefaultButton(nDefaultButton); }\r
+       // radio buttons\r
+       void SetRadioButtons(const TASKDIALOG_BUTTON* pRadioButtons, UINT cRadioButtons, int nDefaultRadioButton = 0)\r
+       {       m_tdc.SetRadioButtons(pRadioButtons, cRadioButtons, nDefaultRadioButton); }\r
+       void SetDefaultRadioButton(int nDefaultRadioButton)\r
+       {       m_tdc.SetDefaultRadioButton(nDefaultRadioButton); }\r
+       // verification text\r
+       void SetVerificationText(UINT nID)\r
+       {       m_tdc.SetVerificationText(nID); }\r
+       void SetVerificationText(LPCWSTR lpstrVerificationText)\r
+       {       m_tdc.SetVerificationText(lpstrVerificationText); }\r
+       // expanded information text\r
+       void SetExpandedInformationText(UINT nID)\r
+       {       m_tdc.SetExpandedInformationText(nID); }\r
+       void SetExpandedInformationText(LPCWSTR lpstrExpandedInformation)\r
+       {       m_tdc.SetExpandedInformationText(lpstrExpandedInformation); }\r
+       // expanded control text\r
+       void SetExpandedControlText(UINT nID)\r
+       {       m_tdc.SetExpandedControlText(nID); }\r
+       void SetExpandedControlText(LPCWSTR lpstrExpandedControlText)\r
+       {       m_tdc.SetExpandedControlText(lpstrExpandedControlText); }\r
+       // collapsed control text\r
+       void SetCollapsedControlText(UINT nID)\r
+       {       m_tdc.SetCollapsedControlText(nID); }\r
+       void SetCollapsedControlText(LPCWSTR lpstrCollapsedControlText)\r
+       {       m_tdc.SetCollapsedControlText(lpstrCollapsedControlText); }\r
+       // footer icon\r
+       void SetFooterIcon(HICON hIcon)\r
+       {       m_tdc.SetFooterIcon(hIcon); }\r
+       void SetFooterIcon(UINT nID)\r
+       {       m_tdc.SetFooterIcon(nID); }\r
+       void SetFooterIcon(LPCWSTR lpstrFooterIcon)\r
+       {       m_tdc.SetFooterIcon(lpstrFooterIcon); }\r
+       // footer text\r
+       void SetFooterText(UINT nID)\r
+       {       m_tdc.SetFooterText(nID); }\r
+       void SetFooterText(LPCWSTR lpstrFooterText)\r
+       {       m_tdc.SetFooterText(lpstrFooterText); }\r
+       // width (in DLUs)\r
+       void SetWidth(UINT cxWidth)\r
+       {       m_tdc.SetWidth(cxWidth); }\r
+       // modify flags\r
+       void ModifyFlags(DWORD dwRemove, DWORD dwAdd)\r
+       {       m_tdc.ModifyFlags(dwRemove, dwAdd); }\r
+\r
+// Implementation\r
+       static HRESULT CALLBACK TaskDialogCallback(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LONG_PTR lpRefData)\r
+       {\r
+               T* pT = (T*)lpRefData;\r
+               ATLASSERT(pT->m_hWnd == NULL || pT->m_hWnd == hWnd);\r
+\r
+               BOOL bRet = FALSE;\r
+               switch(uMsg)\r
+               {\r
+               case TDN_DIALOG_CONSTRUCTED:\r
+                       pT->m_hWnd = hWnd;\r
+                       pT->OnDialogConstructed();\r
+                       break;\r
+               case TDN_CREATED:\r
+                       pT->OnCreated();\r
+                       break;\r
+               case TDN_BUTTON_CLICKED:\r
+                       bRet = pT->OnButtonClicked((int)wParam);\r
+                       break;\r
+               case TDN_RADIO_BUTTON_CLICKED:\r
+                       pT->OnRadioButtonClicked((int)wParam);\r
+                       break;\r
+               case TDN_HYPERLINK_CLICKED:\r
+                       pT->OnHyperlinkClicked((LPCWSTR)lParam);\r
+                       break;\r
+               case TDN_EXPANDO_BUTTON_CLICKED:\r
+                       pT->OnExpandoButtonClicked((wParam != 0));\r
+                       break;\r
+               case TDN_VERIFICATION_CLICKED:\r
+                       pT->OnVerificationClicked((wParam != 0));\r
+                       break;\r
+               case TDN_HELP:\r
+                       pT->OnHelp();\r
+                       break;\r
+               case TDN_TIMER:\r
+                       bRet = pT->OnTimer((DWORD)wParam);\r
+                       break;\r
+               case TDN_NAVIGATED:\r
+                       pT->OnNavigated();\r
+                       break;\r
+               case TDN_DESTROYED:\r
+                       pT->OnDestroyed();\r
+                       pT->m_hWnd = NULL;\r
+                       break;\r
+               default:\r
+                       ATLTRACE2(atlTraceUI, 0, _T("Unknown notification received in CTaskDialogImpl::TaskDialogCallback\n"));\r
+                       break;\r
+               }\r
+\r
+               return (HRESULT)bRet;\r
+       }\r
+\r
+// Overrideables - notification handlers\r
+       void OnDialogConstructed()\r
+       {\r
+       }\r
+\r
+       void OnCreated()\r
+       {\r
+       }\r
+\r
+       BOOL OnButtonClicked(int /*nButton*/)\r
+       {\r
+               return FALSE;   // don't prevent dialog to close\r
+       }\r
+\r
+       void OnRadioButtonClicked(int /*nRadioButton*/)\r
+       {\r
+       }\r
+\r
+       void OnHyperlinkClicked(LPCWSTR /*pszHREF*/)\r
+       {\r
+       }\r
+\r
+       void OnExpandoButtonClicked(bool /*bExpanded*/)\r
+       {\r
+       }\r
+\r
+       void OnVerificationClicked(bool /*bChecked*/)\r
+       {\r
+       }\r
+\r
+       void OnHelp()\r
+       {\r
+       }\r
+\r
+       BOOL OnTimer(DWORD /*dwTickCount*/)\r
+       {\r
+               return FALSE;   // don't reset counter\r
+       }\r
+\r
+       void OnNavigated()\r
+       {\r
+       }\r
+\r
+       void OnDestroyed()\r
+       {\r
+       }\r
+\r
+// Commands - valid to call only from handlers\r
+       void NavigatePage(TASKDIALOGCONFIG& tdc)\r
+       {\r
+               ATLASSERT(m_hWnd != NULL);\r
+\r
+               tdc.cbSize = sizeof(TASKDIALOGCONFIG);\r
+               if(tdc.hwndParent == NULL)\r
+                       tdc.hwndParent = m_tdc.hwndParent;\r
+               tdc.pfCallback = m_tdc.pfCallback;\r
+               tdc.lpCallbackData = m_tdc.lpCallbackData;\r
+               (TASKDIALOGCONFIG)m_tdc = tdc;\r
+\r
+               ::SendMessage(m_hWnd, TDM_NAVIGATE_PAGE, 0, (LPARAM)&tdc);\r
+       }\r
+\r
+       // modify TASKDIALOGCONFIG values, then call this to update task dialog\r
+       void NavigatePage()\r
+       {\r
+               ATLASSERT(m_hWnd != NULL);\r
+               ::SendMessage(m_hWnd, TDM_NAVIGATE_PAGE, 0, (LPARAM)&m_tdc);\r
+       }\r
+\r
+       void ClickButton(int nButton)\r
+       {\r
+               ATLASSERT(m_hWnd != NULL);\r
+               ::SendMessage(m_hWnd, TDM_CLICK_BUTTON, nButton, 0L);\r
+       }\r
+\r
+       void SetMarqueeProgressBar(BOOL bMarquee)\r
+       {\r
+               ATLASSERT(m_hWnd != NULL);\r
+               ::SendMessage(m_hWnd, TDM_SET_MARQUEE_PROGRESS_BAR, bMarquee, 0L);\r
+       }\r
+\r
+       BOOL SetProgressBarState(int nNewState)\r
+       {\r
+               ATLASSERT(m_hWnd != NULL);\r
+               return (BOOL)::SendMessage(m_hWnd, TDM_SET_PROGRESS_BAR_STATE, nNewState, 0L);\r
+       }\r
+\r
+       DWORD SetProgressBarRange(int nMinRange, int nMaxRange)\r
+       {\r
+               ATLASSERT(m_hWnd != NULL);\r
+               return (DWORD)::SendMessage(m_hWnd, TDM_SET_PROGRESS_BAR_RANGE, 0, MAKELPARAM(nMinRange, nMaxRange));\r
+       }\r
+\r
+       int SetProgressBarPos(int nNewPos)\r
+       {\r
+               ATLASSERT(m_hWnd != NULL);\r
+               return (int)::SendMessage(m_hWnd, TDM_SET_PROGRESS_BAR_POS, nNewPos, 0L);\r
+       }\r
+\r
+       BOOL SetProgressBarMarquee(BOOL bMarquee, UINT uSpeed)\r
+       {\r
+               ATLASSERT(m_hWnd != NULL);\r
+               return (BOOL)::SendMessage(m_hWnd, TDM_SET_PROGRESS_BAR_MARQUEE, bMarquee, uSpeed);\r
+       }\r
+\r
+       void SetElementText(TASKDIALOG_ELEMENTS element, LPCWSTR lpstrText)\r
+       {\r
+               ATLASSERT(m_hWnd != NULL);\r
+               ::SendMessage(m_hWnd, TDM_SET_ELEMENT_TEXT, element, (LPARAM)lpstrText);\r
+       }\r
+\r
+       void ClickRadioButton(int nRadioButton)\r
+       {\r
+               ATLASSERT(m_hWnd != NULL);\r
+               ::SendMessage(m_hWnd, TDM_CLICK_RADIO_BUTTON, nRadioButton, 0L);\r
+       }\r
+\r
+       void EnableButton(int nButton, BOOL bEnable)\r
+       {\r
+               ATLASSERT(m_hWnd != NULL);\r
+               ::SendMessage(m_hWnd, TDM_ENABLE_BUTTON, nButton, bEnable);\r
+       }\r
+\r
+       void EnableRadioButton(int nButton, BOOL bEnable)\r
+       {\r
+               ATLASSERT(m_hWnd != NULL);\r
+               ::SendMessage(m_hWnd, TDM_ENABLE_RADIO_BUTTON, nButton, bEnable);\r
+       }\r
+\r
+       void ClickVerification(BOOL bCheck, BOOL bFocus)\r
+       {\r
+               ATLASSERT(m_hWnd != NULL);\r
+               ::SendMessage(m_hWnd, TDM_CLICK_VERIFICATION, bCheck, bFocus);\r
+       }\r
+\r
+       void UpdateElementText(TASKDIALOG_ELEMENTS element, LPCWSTR lpstrText)\r
+       {\r
+               ATLASSERT(m_hWnd != NULL);\r
+               ::SendMessage(m_hWnd, TDM_UPDATE_ELEMENT_TEXT, element, (LPARAM)lpstrText);\r
+       }\r
+\r
+       void SetButtonElevationRequiredState(int nButton, BOOL bElevation)\r
+       {\r
+               ATLASSERT(m_hWnd != NULL);\r
+               ::SendMessage(m_hWnd, TDM_SET_BUTTON_ELEVATION_REQUIRED_STATE, nButton, bElevation);\r
+       }\r
+\r
+       void UpdateIcon(TASKDIALOG_ICON_ELEMENTS element, HICON hIcon)\r
+       {\r
+               ATLASSERT(m_hWnd != NULL);\r
+#ifdef _DEBUG\r
+               if(element == TDIE_ICON_MAIN)\r
+                       ATLASSERT((m_tdc.dwFlags & TDF_USE_HICON_MAIN) != 0);\r
+               else if(element == TDIE_ICON_FOOTER)\r
+                       ATLASSERT((m_tdc.dwFlags & TDF_USE_HICON_FOOTER) != 0);\r
+#endif // _DEBUG\r
+               ::SendMessage(m_hWnd, TDM_UPDATE_ICON, element, (LPARAM)hIcon);\r
+       }\r
+\r
+       void UpdateIcon(TASKDIALOG_ICON_ELEMENTS element, LPCWSTR lpstrIcon)\r
+       {\r
+               ATLASSERT(m_hWnd != NULL);\r
+#ifdef _DEBUG\r
+               if(element == TDIE_ICON_MAIN)\r
+                       ATLASSERT((m_tdc.dwFlags & TDF_USE_HICON_MAIN) == 0);\r
+               else if(element == TDIE_ICON_FOOTER)\r
+                       ATLASSERT((m_tdc.dwFlags & TDF_USE_HICON_FOOTER) == 0);\r
+#endif // _DEBUG\r
+               ::SendMessage(m_hWnd, TDM_UPDATE_ICON, element, (LPARAM)lpstrIcon);\r
+       }\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CTaskDialog - for non-customized task dialogs\r
+\r
+class CTaskDialog : public CTaskDialogImpl<CTaskDialog>\r
+{\r
+public:\r
+       CTaskDialog(HWND hWndParent = NULL) : CTaskDialogImpl<CTaskDialog>(hWndParent)\r
+       {\r
+               m_tdc.pfCallback = NULL;\r
+       }\r
+};\r
+\r
+#endif // ((_WIN32_WINNT >= 0x0600) || defined(_WTL_TASKDIALOG)) && !defined(_WIN32_WCE)\r
+\r
+}; // namespace WTL\r
+\r
+#endif // __ATLDLGS_H__\r
diff --git a/WTL80/include/atlfind.h b/WTL80/include/atlfind.h
new file mode 100644 (file)
index 0000000..a1dd52d
--- /dev/null
@@ -0,0 +1,1036 @@
+// Windows Template Library - WTL version 8.0\r
+// Copyright (C) Microsoft Corporation. All rights reserved.\r
+//\r
+// This file is a part of the Windows Template Library.\r
+// The use and distribution terms for this software are covered by the\r
+// Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php)\r
+// which can be found in the file CPL.TXT at the root of this distribution.\r
+// By using this software in any fashion, you are agreeing to be bound by\r
+// the terms of this license. You must not remove this notice, or\r
+// any other, from this software.\r
+\r
+#ifndef __ATLFIND_H__\r
+#define __ATLFIND_H__\r
+\r
+#pragma once\r
+\r
+#ifndef __cplusplus\r
+       #error ATL requires C++ compilation (use a .cpp suffix)\r
+#endif\r
+\r
+#ifdef _WIN32_WCE\r
+       #error atlfind.h is not supported on Windows CE\r
+#endif\r
+\r
+#ifndef __ATLCTRLS_H__\r
+       #error atlfind.h requires atlctrls.h to be included first\r
+#endif\r
+\r
+#ifndef __ATLDLGS_H__\r
+       #error atlfind.h requires atldlgs.h to be included first\r
+#endif\r
+\r
+#if !((defined(__ATLMISC_H__) && defined(_WTL_USE_CSTRING)) || defined(__ATLSTR_H__))\r
+       #error atlfind.h requires CString (either from ATL's atlstr.h or WTL's atlmisc.h with _WTL_USE_CSTRING)\r
+#endif\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Classes in this file:\r
+//\r
+// CEditFindReplaceImplBase<T, TFindReplaceDialog>\r
+// CEditFindReplaceImpl<T, TFindReplaceDialog>\r
+// CRichEditFindReplaceImpl<T, TFindReplaceDialog>\r
+\r
+\r
+namespace WTL\r
+{\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CEditFindReplaceImplBase - Base class for mixin classes that\r
+// help implement Find/Replace for CEdit or CRichEditCtrl based window classes.\r
+\r
+template <class T, class TFindReplaceDialog = CFindReplaceDialog>\r
+class CEditFindReplaceImplBase\r
+{\r
+protected:\r
+// Typedefs\r
+       typedef CEditFindReplaceImplBase<T, TFindReplaceDialog> thisClass;\r
+\r
+// Data members\r
+       TFindReplaceDialog* m_pFindReplaceDialog;\r
+       _CSTRING_NS::CString m_sFindNext, m_sReplaceWith;\r
+       BOOL m_bFindOnly, m_bFirstSearch, m_bMatchCase, m_bWholeWord, m_bFindDown;\r
+       LONG m_nInitialSearchPos;\r
+       HCURSOR m_hOldCursor;\r
+\r
+// Enumerations\r
+       enum TranslationTextItem\r
+       {\r
+               eText_OnReplaceAllMessage   = 0,\r
+               eText_OnReplaceAllTitle     = 1,\r
+               eText_OnTextNotFoundMessage = 2,\r
+               eText_OnTextNotFoundTitle   = 3\r
+       };\r
+\r
+public:\r
+// Constructors\r
+       CEditFindReplaceImplBase() :\r
+               m_pFindReplaceDialog(NULL),\r
+               m_bFindOnly(TRUE),\r
+               m_bFirstSearch(TRUE),\r
+               m_bMatchCase(FALSE),\r
+               m_bWholeWord(FALSE),\r
+               m_bFindDown(TRUE),\r
+               m_nInitialSearchPos(0),\r
+               m_hOldCursor(NULL)\r
+       {\r
+       }\r
+\r
+// Message Handlers\r
+       BEGIN_MSG_MAP(thisClass)\r
+       ALT_MSG_MAP(1)\r
+               MESSAGE_HANDLER(WM_DESTROY, OnDestroy)\r
+               MESSAGE_HANDLER(TFindReplaceDialog::GetFindReplaceMsg(), OnFindReplaceCmd)\r
+               COMMAND_ID_HANDLER(ID_EDIT_FIND, OnEditFind)\r
+               COMMAND_ID_HANDLER(ID_EDIT_REPEAT, OnEditRepeat)\r
+               COMMAND_ID_HANDLER(ID_EDIT_REPLACE, OnEditReplace)\r
+       END_MSG_MAP()\r
+\r
+       LRESULT OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)\r
+       {\r
+               if(m_pFindReplaceDialog != NULL)\r
+               {\r
+                       m_pFindReplaceDialog->SendMessage(WM_CLOSE);\r
+                       ATLASSERT(m_pFindReplaceDialog == NULL);\r
+               }\r
+\r
+               bHandled = FALSE;\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnFindReplaceCmd(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+\r
+               TFindReplaceDialog* pDialog = TFindReplaceDialog::GetNotifier(lParam);\r
+               if(pDialog == NULL)\r
+               {\r
+                       ATLASSERT(FALSE);\r
+                       ::MessageBeep(MB_ICONERROR);\r
+                       return 1;\r
+               }\r
+               ATLASSERT(pDialog == m_pFindReplaceDialog);\r
+\r
+               LPFINDREPLACE findReplace = (LPFINDREPLACE)lParam;\r
+               if((m_pFindReplaceDialog != NULL) && (findReplace != NULL))\r
+               {\r
+                       if(pDialog->FindNext())\r
+                       {\r
+                               pT->OnFindNext(pDialog->GetFindString(), pDialog->SearchDown(),\r
+                                       pDialog->MatchCase(), pDialog->MatchWholeWord());\r
+                       }\r
+                       else if(pDialog->ReplaceCurrent())\r
+                       {\r
+                               pT->OnReplaceSel(pDialog->GetFindString(),\r
+                                       pDialog->SearchDown(), pDialog->MatchCase(), pDialog->MatchWholeWord(),\r
+                                       pDialog->GetReplaceString());\r
+                       }\r
+                       else if(pDialog->ReplaceAll())\r
+                       {\r
+                               pT->OnReplaceAll(pDialog->GetFindString(), pDialog->GetReplaceString(),\r
+                                       pDialog->MatchCase(), pDialog->MatchWholeWord());\r
+                       }\r
+                       else if(pDialog->IsTerminating())\r
+                       {\r
+                               // Dialog is going away (but hasn't gone away yet)\r
+                               // OnFinalMessage will "delete this"\r
+                               pT->OnTerminatingFindReplaceDialog(m_pFindReplaceDialog);\r
+                               m_pFindReplaceDialog = NULL;\r
+                       }\r
+               }\r
+\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnEditFind(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               pT->FindReplace(TRUE);\r
+\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnEditRepeat(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+\r
+               // If the user is holding down SHIFT when hitting F3, we'll\r
+               // search in reverse. Otherwise, we'll search forward.\r
+               // (be sure to have an accelerator mapped to ID_EDIT_REPEAT\r
+               // for both F3 and Shift+F3)\r
+               m_bFindDown = !((::GetKeyState(VK_SHIFT) & 0x8000) == 0x8000);\r
+\r
+               if(m_sFindNext.IsEmpty())\r
+               {\r
+                       pT->FindReplace(TRUE);\r
+               }\r
+               else\r
+               {\r
+                       if(!pT->FindTextSimple(m_sFindNext, m_bMatchCase, m_bWholeWord, m_bFindDown))\r
+                               pT->TextNotFound(m_sFindNext);\r
+               }\r
+\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnEditReplace(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& bHandled)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+\r
+               DWORD style = pT->GetStyle();\r
+               if((style & ES_READONLY) != ES_READONLY)\r
+               {\r
+                       pT->FindReplace(FALSE);\r
+               }\r
+               else\r
+               {\r
+                       // Don't allow replace when the edit control is read only\r
+                       bHandled = FALSE;\r
+               }\r
+\r
+               return 0;\r
+       }\r
+\r
+// Operations (overrideable)\r
+       TFindReplaceDialog* CreateFindReplaceDialog(BOOL bFindOnly, // TRUE for Find, FALSE for FindReplace\r
+                       LPCTSTR lpszFindWhat,\r
+                       LPCTSTR lpszReplaceWith = NULL,\r
+                       DWORD dwFlags = FR_DOWN,\r
+                       HWND hWndParent = NULL)\r
+       {\r
+               // You can override all of this in a derived class\r
+\r
+               TFindReplaceDialog* findReplaceDialog = new TFindReplaceDialog();\r
+               if(findReplaceDialog == NULL)\r
+               {\r
+                       ::MessageBeep(MB_ICONHAND);\r
+               }\r
+               else\r
+               {\r
+                       HWND hWndFindReplace = findReplaceDialog->Create(bFindOnly,\r
+                               lpszFindWhat, lpszReplaceWith, dwFlags, hWndParent);\r
+                       if(hWndFindReplace == NULL)\r
+                       {\r
+                               delete findReplaceDialog;\r
+                               findReplaceDialog = NULL;\r
+                       }\r
+                       else\r
+                       {\r
+                               findReplaceDialog->SetActiveWindow();\r
+                               findReplaceDialog->ShowWindow(SW_SHOW);\r
+                       }\r
+               }\r
+\r
+               return findReplaceDialog;\r
+       }\r
+\r
+       void AdjustDialogPosition(HWND hWndDialog)\r
+       {\r
+               ATLASSERT((hWndDialog != NULL) && ::IsWindow(hWndDialog));\r
+\r
+               T* pT = static_cast<T*>(this);\r
+               LONG nStartChar = 0, nEndChar = 0;\r
+               // Send EM_GETSEL so we can use both Edit and RichEdit\r
+               // (CEdit::GetSel uses int&, and CRichEditCtrlT::GetSel uses LONG&)\r
+               ::SendMessage(pT->m_hWnd, EM_GETSEL, (WPARAM)&nStartChar, (LPARAM)&nEndChar);\r
+               POINT point = pT->PosFromChar(nStartChar);\r
+               ::ClientToScreen(pT->GetParent(), &point);\r
+               CRect rect;\r
+               ::GetWindowRect(hWndDialog, &rect);\r
+               if(rect.PtInRect(point))\r
+               {\r
+                       if(point.y > rect.Height())\r
+                       {\r
+                               rect.OffsetRect(0, point.y - rect.bottom - 20);\r
+                       }\r
+                       else\r
+                       {\r
+                               int nVertExt = GetSystemMetrics(SM_CYSCREEN);\r
+                               if(point.y + rect.Height() < nVertExt)\r
+                                       rect.OffsetRect(0, 40 + point.y - rect.top);\r
+                       }\r
+\r
+                       ::MoveWindow(hWndDialog, rect.left, rect.top, rect.Width(), rect.Height(), TRUE);\r
+               }\r
+       }\r
+\r
+       DWORD GetFindReplaceDialogFlags(void) const\r
+       {\r
+               DWORD dwFlags = 0;\r
+\r
+               if(m_bFindDown)\r
+                       dwFlags |= FR_DOWN;\r
+               if(m_bMatchCase)\r
+                       dwFlags |= FR_MATCHCASE;\r
+               if(m_bWholeWord)\r
+                       dwFlags |= FR_WHOLEWORD;\r
+\r
+               return dwFlags;\r
+       }\r
+\r
+       void FindReplace(BOOL bFindOnly)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               m_bFirstSearch = TRUE;\r
+               if(m_pFindReplaceDialog != NULL)\r
+               {\r
+                       if(m_bFindOnly == bFindOnly)\r
+                       {\r
+                               m_pFindReplaceDialog->SetActiveWindow();\r
+                               m_pFindReplaceDialog->ShowWindow(SW_SHOW);\r
+                               return;\r
+                       }\r
+                       else\r
+                       {\r
+                               m_pFindReplaceDialog->SendMessage(WM_CLOSE);\r
+                               ATLASSERT(m_pFindReplaceDialog == NULL);\r
+                       }\r
+               }\r
+\r
+               ATLASSERT(m_pFindReplaceDialog == NULL);\r
+\r
+               _CSTRING_NS::CString findNext;\r
+               pT->GetSelText(findNext);\r
+               // if selection is empty or spans multiple lines use old find text\r
+               if(findNext.IsEmpty() || (findNext.FindOneOf(_T("\n\r")) != -1))\r
+                       findNext = m_sFindNext;\r
+               _CSTRING_NS::CString replaceWith = m_sReplaceWith;\r
+               DWORD dwFlags = pT->GetFindReplaceDialogFlags();\r
+\r
+               m_pFindReplaceDialog = pT->CreateFindReplaceDialog(bFindOnly,\r
+                       findNext, replaceWith, dwFlags, pT->operator HWND());\r
+               ATLASSERT(m_pFindReplaceDialog != NULL);\r
+               if(m_pFindReplaceDialog != NULL)\r
+                       m_bFindOnly = bFindOnly;\r
+       }\r
+\r
+       BOOL SameAsSelected(LPCTSTR lpszCompare, BOOL bMatchCase, BOOL /*bWholeWord*/)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+\r
+               // check length first\r
+               size_t nLen = lstrlen(lpszCompare);\r
+               LONG nStartChar = 0, nEndChar = 0;\r
+               // Send EM_GETSEL so we can use both Edit and RichEdit\r
+               // (CEdit::GetSel uses int&, and CRichEditCtrlT::GetSel uses LONG&)\r
+               ::SendMessage(pT->m_hWnd, EM_GETSEL, (WPARAM)&nStartChar, (LPARAM)&nEndChar);\r
+               if(nLen != (size_t)(nEndChar - nStartChar))\r
+                       return FALSE;\r
+\r
+               // length is the same, check contents\r
+               _CSTRING_NS::CString selectedText;\r
+               pT->GetSelText(selectedText);\r
+\r
+               return (bMatchCase && selectedText.Compare(lpszCompare) == 0) ||\r
+                       (!bMatchCase && selectedText.CompareNoCase(lpszCompare) == 0);\r
+       }\r
+\r
+       void TextNotFound(LPCTSTR lpszFind)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               m_bFirstSearch = TRUE;\r
+               pT->OnTextNotFound(lpszFind);\r
+       }\r
+\r
+       _CSTRING_NS::CString GetTranslationText(enum TranslationTextItem eItem) const\r
+       {\r
+               _CSTRING_NS::CString text;\r
+               switch(eItem)\r
+               {\r
+               case eText_OnReplaceAllMessage:\r
+                       text = _T("Replaced %d occurances of \"%s\" with \"%s\"");\r
+                       break;\r
+               case eText_OnReplaceAllTitle:\r
+                       text = _T("Replace All");\r
+                       break;\r
+               case eText_OnTextNotFoundMessage:\r
+                       text = _T("Unable to find the text \"%s\"");\r
+                       break;\r
+               case eText_OnTextNotFoundTitle:\r
+                       text = _T("Text not found");\r
+                       break;\r
+               }\r
+\r
+               return text;\r
+       }\r
+\r
+// Overrideable Handlers\r
+       void OnFindNext(LPCTSTR lpszFind, BOOL bFindDown, BOOL bMatchCase, BOOL bWholeWord)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+\r
+               m_sFindNext = lpszFind;\r
+               m_bMatchCase = bMatchCase;\r
+               m_bWholeWord = bWholeWord;\r
+               m_bFindDown = bFindDown;\r
+\r
+               if(!pT->FindTextSimple(m_sFindNext, m_bMatchCase, m_bWholeWord, m_bFindDown))\r
+                       pT->TextNotFound(m_sFindNext);\r
+               else\r
+                       pT->AdjustDialogPosition(m_pFindReplaceDialog->operator HWND());\r
+       }\r
+\r
+       void OnReplaceSel(LPCTSTR lpszFind, BOOL bFindDown, BOOL bMatchCase, BOOL bWholeWord, LPCTSTR lpszReplace)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+\r
+               m_sFindNext = lpszFind;\r
+               m_sReplaceWith = lpszReplace;\r
+               m_bMatchCase = bMatchCase;\r
+               m_bWholeWord = bWholeWord;\r
+               m_bFindDown = bFindDown;\r
+\r
+               if(pT->SameAsSelected(m_sFindNext, m_bMatchCase, m_bWholeWord))\r
+                       pT->ReplaceSel(m_sReplaceWith);\r
+\r
+               if(!pT->FindTextSimple(m_sFindNext, m_bMatchCase, m_bWholeWord, m_bFindDown))\r
+                       pT->TextNotFound(m_sFindNext);\r
+               else\r
+                       pT->AdjustDialogPosition(m_pFindReplaceDialog->operator HWND());\r
+       }\r
+\r
+       void OnReplaceAll(LPCTSTR lpszFind, LPCTSTR lpszReplace, BOOL bMatchCase, BOOL bWholeWord)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+\r
+               m_sFindNext = lpszFind;\r
+               m_sReplaceWith = lpszReplace;\r
+               m_bMatchCase = bMatchCase;\r
+               m_bWholeWord = bWholeWord;\r
+               m_bFindDown = TRUE;\r
+\r
+               // no selection or different than what looking for\r
+               if(!pT->SameAsSelected(m_sFindNext, m_bMatchCase, m_bWholeWord))\r
+               {\r
+                       if(!pT->FindTextSimple(m_sFindNext, m_bMatchCase, m_bWholeWord, m_bFindDown))\r
+                       {\r
+                               pT->TextNotFound(m_sFindNext);\r
+                               return;\r
+                       }\r
+               }\r
+\r
+               pT->OnReplaceAllCoreBegin();\r
+\r
+               int replaceCount=0;\r
+               do\r
+               {\r
+                       ++replaceCount;\r
+                       pT->ReplaceSel(m_sReplaceWith);\r
+               } while(pT->FindTextSimple(m_sFindNext, m_bMatchCase, m_bWholeWord, m_bFindDown));\r
+\r
+               pT->OnReplaceAllCoreEnd(replaceCount);\r
+       }\r
+\r
+       void OnReplaceAllCoreBegin()\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+\r
+               m_hOldCursor = ::SetCursor(::LoadCursor(NULL, IDC_WAIT));\r
+\r
+               pT->HideSelection(TRUE, FALSE);\r
+\r
+       }\r
+\r
+       void OnReplaceAllCoreEnd(int replaceCount)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               pT->HideSelection(FALSE, FALSE);\r
+\r
+               ::SetCursor(m_hOldCursor);\r
+\r
+               _CSTRING_NS::CString message = pT->GetTranslationText(eText_OnReplaceAllMessage);\r
+               if(message.GetLength() > 0)\r
+               {\r
+                       _CSTRING_NS::CString formattedMessage;\r
+                       formattedMessage.Format(message,\r
+                               replaceCount, m_sFindNext, m_sReplaceWith);\r
+                       if(m_pFindReplaceDialog != NULL)\r
+                       {\r
+                               m_pFindReplaceDialog->MessageBox(formattedMessage,\r
+                                       pT->GetTranslationText(eText_OnReplaceAllTitle),\r
+                                       MB_OK | MB_ICONINFORMATION | MB_APPLMODAL);\r
+                       }\r
+                       else\r
+                       {\r
+                               pT->MessageBox(formattedMessage,\r
+                                       pT->GetTranslationText(eText_OnReplaceAllTitle),\r
+                                       MB_OK | MB_ICONINFORMATION | MB_APPLMODAL);\r
+                       }\r
+               }\r
+       }\r
+\r
+       void OnTextNotFound(LPCTSTR lpszFind)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               _CSTRING_NS::CString message = pT->GetTranslationText(eText_OnTextNotFoundMessage);\r
+               if(message.GetLength() > 0)\r
+               {\r
+                       _CSTRING_NS::CString formattedMessage;\r
+                       formattedMessage.Format(message, lpszFind);\r
+                       if(m_pFindReplaceDialog != NULL)\r
+                       {\r
+                               m_pFindReplaceDialog->MessageBox(formattedMessage,\r
+                                       pT->GetTranslationText(eText_OnTextNotFoundTitle),\r
+                                       MB_OK | MB_ICONINFORMATION | MB_APPLMODAL);\r
+                       }\r
+                       else\r
+                       {\r
+                               pT->MessageBox(formattedMessage,\r
+                                       pT->GetTranslationText(eText_OnTextNotFoundTitle),\r
+                                       MB_OK | MB_ICONINFORMATION | MB_APPLMODAL);\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       ::MessageBeep(MB_ICONHAND);\r
+               }\r
+       }\r
+\r
+       void OnTerminatingFindReplaceDialog(TFindReplaceDialog*& /*findReplaceDialog*/)\r
+       {\r
+       }\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CEditFindReplaceImpl - Mixin class for implementing Find/Replace for CEdit\r
+// based window classes.\r
+\r
+// Chain to CEditFindReplaceImpl message map. Your class must also derive from CEdit.\r
+// Example:\r
+// class CMyEdit : public CWindowImpl<CMyEdit, CEdit>,\r
+//                 public CEditFindReplaceImpl<CMyEdit>\r
+// {\r
+// public:\r
+//      BEGIN_MSG_MAP(CMyEdit)\r
+//              // your handlers...\r
+//              CHAIN_MSG_MAP_ALT(CEditFindReplaceImpl<CMyEdit>, 1)\r
+//      END_MSG_MAP()\r
+//      // other stuff...\r
+// };\r
+\r
+template <class T, class TFindReplaceDialog = CFindReplaceDialog>\r
+class CEditFindReplaceImpl : public CEditFindReplaceImplBase<T, TFindReplaceDialog>\r
+{\r
+protected:\r
+       typedef CEditFindReplaceImpl<T, TFindReplaceDialog> thisClass;\r
+       typedef CEditFindReplaceImplBase<T, TFindReplaceDialog> baseClass;\r
+\r
+// Data members\r
+       LPTSTR m_pShadowBuffer;     // Special shadow buffer only used in some cases.\r
+       UINT m_nShadowSize;\r
+       int m_bShadowBufferNeeded;  // TRUE, FALSE, < 0 => Need to check\r
+\r
+public:\r
+// Constructors\r
+       CEditFindReplaceImpl() :\r
+               m_pShadowBuffer(NULL),\r
+               m_nShadowSize(0),\r
+               m_bShadowBufferNeeded(-1)\r
+       {\r
+       }\r
+\r
+       virtual ~CEditFindReplaceImpl()\r
+       {\r
+               if(m_pShadowBuffer != NULL)\r
+               {\r
+                       delete [] m_pShadowBuffer;\r
+                       m_pShadowBuffer = NULL;\r
+               }\r
+       }\r
+\r
+// Message Handlers\r
+       BEGIN_MSG_MAP(thisClass)\r
+       ALT_MSG_MAP(1)\r
+               CHAIN_MSG_MAP_ALT(baseClass, 1)\r
+       END_MSG_MAP()\r
+\r
+// Operations\r
+       // Supported only for RichEdit, so this does nothing for Edit\r
+       void HideSelection(BOOL /*bHide*/ = TRUE, BOOL /*bChangeStyle*/ = FALSE)\r
+       {\r
+       }\r
+\r
+// Operations (overrideable)\r
+       BOOL FindTextSimple(LPCTSTR lpszFind, BOOL bMatchCase, BOOL bWholeWord, BOOL bFindDown = TRUE)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+\r
+               ATLASSERT(lpszFind != NULL);\r
+               ATLASSERT(*lpszFind != _T('\0'));\r
+\r
+               UINT nLen = pT->GetBufferLength();\r
+               int nStartChar = 0, nEndChar = 0;\r
+               pT->GetSel(nStartChar, nEndChar);\r
+               UINT nStart = nStartChar;\r
+               int iDir = bFindDown ? +1 : -1;\r
+\r
+               // can't find a match before the first character\r
+               if(nStart == 0 && iDir < 0)\r
+                       return FALSE;\r
+\r
+               LPCTSTR lpszText = pT->LockBuffer();\r
+\r
+               bool isDBCS = false;\r
+#ifdef _MBCS\r
+               CPINFO info = { 0 };\r
+               ::GetCPInfo(::GetOEMCP(), &info);\r
+               isDBCS = (info.MaxCharSize > 1);\r
+#endif\r
+\r
+               if(iDir < 0)\r
+               {\r
+                       // always go back one for search backwards\r
+                       nStart -= int((lpszText + nStart) - ::CharPrev(lpszText, lpszText + nStart));\r
+               }\r
+               else if(nStartChar != nEndChar && pT->SameAsSelected(lpszFind, bMatchCase, bWholeWord))\r
+               {\r
+                       // easy to go backward/forward with SBCS\r
+#ifndef _UNICODE\r
+                       if(::IsDBCSLeadByte(lpszText[nStart]))\r
+                               nStart++;\r
+#endif\r
+                       nStart += iDir;\r
+               }\r
+\r
+               // handle search with nStart past end of buffer\r
+               UINT nLenFind = ::lstrlen(lpszFind);\r
+               if(nStart + nLenFind - 1 >= nLen)\r
+               {\r
+                       if(iDir < 0 && nLen >= nLenFind)\r
+                       {\r
+                               if(isDBCS)\r
+                               {\r
+                                       // walk back to previous character n times\r
+                                       nStart = nLen;\r
+                                       int n = nLenFind;\r
+                                       while(n--)\r
+                                       {\r
+                                               nStart -= int((lpszText + nStart) - ::CharPrev(lpszText, lpszText + nStart));\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       // single-byte character set is easy and fast\r
+                                       nStart = nLen - nLenFind;\r
+                               }\r
+                               ATLASSERT(nStart + nLenFind - 1 <= nLen);\r
+                       }\r
+                       else\r
+                       {\r
+                               pT->UnlockBuffer();\r
+                               return FALSE;\r
+                       }\r
+               }\r
+\r
+               // start the search at nStart\r
+               LPCTSTR lpsz = lpszText + nStart;\r
+               typedef int (WINAPI* CompareProc)(LPCTSTR str1, LPCTSTR str2);\r
+               CompareProc pfnCompare = bMatchCase ? lstrcmp : lstrcmpi;\r
+\r
+               if(isDBCS)\r
+               {\r
+                       // double-byte string search\r
+                       LPCTSTR lpszStop = NULL;\r
+                       if(iDir > 0)\r
+                       {\r
+                               // start at current and find _first_ occurrance\r
+                               lpszStop = lpszText + nLen - nLenFind + 1;\r
+                       }\r
+                       else\r
+                       {\r
+                               // start at top and find _last_ occurrance\r
+                               lpszStop = lpsz;\r
+                               lpsz = lpszText;\r
+                       }\r
+\r
+                       LPCTSTR lpszFound = NULL;\r
+                       while(lpsz <= lpszStop)\r
+                       {\r
+#ifndef _UNICODE\r
+                               if(!bMatchCase || (*lpsz == *lpszFind && (!::IsDBCSLeadByte(*lpsz) || lpsz[1] == lpszFind[1])))\r
+#else\r
+                               if(!bMatchCase || (*lpsz == *lpszFind && lpsz[1] == lpszFind[1]))\r
+#endif\r
+                               {\r
+                                       LPTSTR lpch = (LPTSTR)(lpsz + nLenFind);\r
+                                       TCHAR chSave = *lpch;\r
+                                       *lpch = _T('\0');\r
+                                       int nResult = (*pfnCompare)(lpsz, lpszFind);\r
+                                       *lpch = chSave;\r
+                                       if(nResult == 0)\r
+                                       {\r
+                                               lpszFound = lpsz;\r
+                                               if(iDir > 0)\r
+                                                       break;\r
+                                       }\r
+                               }\r
+                               lpsz = ::CharNext(lpsz);\r
+                       }\r
+                       pT->UnlockBuffer();\r
+\r
+                       if(lpszFound != NULL)\r
+                       {\r
+                               int n = (int)(lpszFound - lpszText);\r
+                               pT->SetSel(n, n + nLenFind);\r
+                               return TRUE;\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       // single-byte string search\r
+                       UINT nCompare;\r
+                       if(iDir < 0)\r
+                               nCompare = (UINT)(lpsz - lpszText) + 1;\r
+                       else\r
+                               nCompare = nLen - (UINT)(lpsz - lpszText) - nLenFind + 1;\r
+\r
+                       while(nCompare > 0)\r
+                       {\r
+                               ATLASSERT(lpsz >= lpszText);\r
+                               ATLASSERT(lpsz + nLenFind - 1 <= lpszText + nLen - 1);\r
+\r
+                               LPSTR lpch = (LPSTR)(lpsz + nLenFind);\r
+                               char chSave = *lpch;\r
+                               *lpch = '\0';\r
+                               int nResult = (*pfnCompare)(lpsz, lpszFind);\r
+                               *lpch = chSave;\r
+                               if(nResult == 0)\r
+                               {\r
+                                       pT->UnlockBuffer();\r
+                                       int n = (int)(lpsz - lpszText);\r
+                                       pT->SetSel(n, n + nLenFind);\r
+                                       return TRUE;\r
+                               }\r
+\r
+                               // restore character at end of search\r
+                               *lpch = chSave;\r
+\r
+                               // move on to next substring\r
+                               nCompare--;\r
+                               lpsz += iDir;\r
+                       }\r
+                       pT->UnlockBuffer();\r
+               }\r
+\r
+               return FALSE;\r
+       }\r
+\r
+       LPCTSTR LockBuffer() const\r
+       {\r
+               const T* pT = static_cast<const T*>(this);\r
+\r
+               ATLASSERT(pT->m_hWnd != NULL);\r
+\r
+               BOOL useShadowBuffer = pT->UseShadowBuffer();\r
+               if(useShadowBuffer)\r
+               {\r
+                       if(m_pShadowBuffer == NULL || pT->GetModify())\r
+                       {\r
+                               ATLASSERT(m_pShadowBuffer != NULL || m_nShadowSize == 0);\r
+                               UINT nSize = pT->GetWindowTextLength() + 1;\r
+                               if(nSize > m_nShadowSize)\r
+                               {\r
+                                       // need more room for shadow buffer\r
+                                       T* pThisNoConst = const_cast<T*>(pT);\r
+                                       delete[] m_pShadowBuffer;\r
+                                       pThisNoConst->m_pShadowBuffer = NULL;\r
+                                       pThisNoConst->m_nShadowSize = 0;\r
+                                       pThisNoConst->m_pShadowBuffer = new TCHAR[nSize];\r
+                                       pThisNoConst->m_nShadowSize = nSize;\r
+                               }\r
+\r
+                               // update the shadow buffer with GetWindowText\r
+                               ATLASSERT(m_nShadowSize >= nSize);\r
+                               ATLASSERT(m_pShadowBuffer != NULL);\r
+                               pT->GetWindowText(m_pShadowBuffer, nSize);\r
+                       }\r
+\r
+                       return m_pShadowBuffer;\r
+               }\r
+\r
+               HLOCAL hLocal = pT->GetHandle();\r
+               ATLASSERT(hLocal != NULL);\r
+               LPCTSTR lpszText = (LPCTSTR)::LocalLock(hLocal);\r
+               ATLASSERT(lpszText != NULL);\r
+\r
+               return lpszText;\r
+       }\r
+\r
+       void UnlockBuffer() const\r
+       {\r
+               const T* pT = static_cast<const T*>(this);\r
+\r
+               ATLASSERT(pT->m_hWnd != NULL);\r
+\r
+               BOOL useShadowBuffer = pT->UseShadowBuffer();\r
+               if(!useShadowBuffer)\r
+               {\r
+                       HLOCAL hLocal = pT->GetHandle();\r
+                       ATLASSERT(hLocal != NULL);\r
+                       ::LocalUnlock(hLocal);\r
+               }\r
+       }\r
+\r
+       UINT GetBufferLength() const\r
+       {\r
+               const T* pT = static_cast<const T*>(this);\r
+\r
+               ATLASSERT(pT->m_hWnd != NULL);\r
+               UINT nLen = 0;\r
+               LPCTSTR lpszText = pT->LockBuffer();\r
+               if(lpszText != NULL)\r
+                       nLen = ::lstrlen(lpszText);\r
+               pT->UnlockBuffer();\r
+\r
+               return nLen;\r
+       }\r
+\r
+       LONG EndOfLine(LPCTSTR lpszText, UINT nLen, UINT nIndex) const\r
+       {\r
+               LPCTSTR lpsz = lpszText + nIndex;\r
+               LPCTSTR lpszStop = lpszText + nLen;\r
+               while(lpsz < lpszStop && *lpsz != _T('\r'))\r
+                       ++lpsz;\r
+               return LONG(lpsz - lpszText);\r
+       }\r
+\r
+       LONG GetSelText(_CSTRING_NS::CString& strText) const\r
+       {\r
+               const T* pT = static_cast<const T*>(this);\r
+\r
+               int nStartChar = 0, nEndChar = 0;\r
+               pT->GetSel(nStartChar, nEndChar);\r
+               ATLASSERT((UINT)nEndChar <= pT->GetBufferLength());\r
+               LPCTSTR lpszText = pT->LockBuffer();\r
+               LONG nLen = pT->EndOfLine(lpszText, nEndChar, nStartChar) - nStartChar;\r
+               SecureHelper::memcpy_x(strText.GetBuffer(nLen), nLen * sizeof(TCHAR), lpszText + nStartChar, nLen * sizeof(TCHAR));\r
+               strText.ReleaseBuffer(nLen);\r
+               pT->UnlockBuffer();\r
+\r
+               return nLen;\r
+       }\r
+\r
+       BOOL UseShadowBuffer(void) const\r
+       {\r
+               const T* pT = static_cast<const T*>(this);\r
+\r
+               if(pT->m_bShadowBufferNeeded < 0)\r
+               {\r
+                       T* pThisNoConst = const_cast<T*>(pT);\r
+\r
+                       OSVERSIONINFO ovi = { 0 };\r
+                       ovi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);\r
+                       ::GetVersionEx(&ovi);\r
+\r
+                       bool bWin9x = (ovi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS);\r
+                       if(bWin9x)\r
+                       {\r
+                               // Windows 95, 98, ME\r
+                               // Under Win9x, it is necessary to maintain a shadow buffer.\r
+                               // It is only updated when the control contents have been changed.\r
+                               pThisNoConst->m_bShadowBufferNeeded = TRUE;\r
+                       }\r
+                       else\r
+                       {\r
+                               // Windows NT, 2000, XP, etc.\r
+                               pThisNoConst->m_bShadowBufferNeeded = FALSE;\r
+\r
+#ifndef _UNICODE\r
+                               // On Windows XP (or later), if common controls version 6 is in use\r
+                               // (such as via theming), then EM_GETHANDLE will always return a UNICODE string.\r
+                               // If theming is enabled and Common Controls version 6 is in use,\r
+                               // you're really not suppose to superclass or subclass common controls\r
+                               // with an ANSI windows procedure (so its best to only theme if you use UNICODE).\r
+                               // Using a shadow buffer uses GetWindowText instead, so it solves\r
+                               // this problem for us (although it makes it a little less efficient).\r
+\r
+                               if((ovi.dwMajorVersion == 5 && ovi.dwMinorVersion >= 1) || (ovi.dwMajorVersion > 5))\r
+                               {\r
+                                       // We use DLLVERSIONINFO_private so we don't have to depend on shlwapi.h\r
+                                       typedef struct _DLLVERSIONINFO_private\r
+                                       {\r
+                                               DWORD cbSize;\r
+                                               DWORD dwMajorVersion;\r
+                                               DWORD dwMinorVersion;\r
+                                               DWORD dwBuildNumber;\r
+                                               DWORD dwPlatformID;\r
+                                       } DLLVERSIONINFO_private;\r
+\r
+                                       HMODULE hModule = ::LoadLibrary("comctl32.dll");\r
+                                       if(hModule != NULL)\r
+                                       {\r
+                                               typedef HRESULT (CALLBACK *LPFN_DllGetVersion)(DLLVERSIONINFO_private *);\r
+                                               LPFN_DllGetVersion fnDllGetVersion = (LPFN_DllGetVersion)::GetProcAddress(hModule, "DllGetVersion");\r
+                                               if(fnDllGetVersion != NULL)\r
+                                               {\r
+                                                       DLLVERSIONINFO_private version = { 0 };\r
+                                                       version.cbSize = sizeof(DLLVERSIONINFO_private);\r
+                                                       if(SUCCEEDED(fnDllGetVersion(&version)))\r
+                                                       {\r
+                                                               if(version.dwMajorVersion >= 6)\r
+                                                               {\r
+                                                                       pThisNoConst->m_bShadowBufferNeeded = TRUE;\r
+\r
+                                                                       ATLTRACE2(atlTraceUI, 0, _T("Warning: You have compiled for MBCS/ANSI but are using common controls version 6 or later (likely through a manifest file).\r\n"));\r
+                                                                       ATLTRACE2(atlTraceUI, 0, _T("If you use common controls version 6 or later, you should only do so for UNICODE builds.\r\n"));\r
+                                                               }\r
+                                                       }\r
+                                               }\r
+\r
+                                               ::FreeLibrary(hModule);\r
+                                               hModule = NULL;\r
+                                       }\r
+                               }\r
+#endif // !_UNICODE\r
+                       }\r
+               }\r
+\r
+               return (pT->m_bShadowBufferNeeded == TRUE);\r
+       }\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CRichEditFindReplaceImpl - Mixin class for implementing Find/Replace for CRichEditCtrl\r
+// based window classes.\r
+\r
+// Chain to CRichEditFindReplaceImpl message map. Your class must also derive from CRichEditCtrl.\r
+// Example:\r
+// class CMyRichEdit : public CWindowImpl<CMyRichEdit, CRichEditCtrl>,\r
+//                     public CRichEditFindReplaceImpl<CMyRichEdit>\r
+// {\r
+// public:\r
+//      BEGIN_MSG_MAP(CMyRichEdit)\r
+//              // your handlers...\r
+//              CHAIN_MSG_MAP_ALT(CRichEditFindReplaceImpl<CMyRichEdit>, 1)\r
+//      END_MSG_MAP()\r
+//      // other stuff...\r
+// };\r
+\r
+template <class T, class TFindReplaceDialog = CFindReplaceDialog>\r
+class CRichEditFindReplaceImpl : public CEditFindReplaceImplBase<T, TFindReplaceDialog>\r
+{\r
+protected:\r
+       typedef CRichEditFindReplaceImpl<T, TFindReplaceDialog> thisClass;\r
+       typedef CEditFindReplaceImplBase<T, TFindReplaceDialog> baseClass;\r
+\r
+public:\r
+       BEGIN_MSG_MAP(thisClass)\r
+       ALT_MSG_MAP(1)\r
+               CHAIN_MSG_MAP_ALT(baseClass, 1)\r
+       END_MSG_MAP()\r
+\r
+// Operations (overrideable)\r
+       BOOL FindTextSimple(LPCTSTR lpszFind, BOOL bMatchCase, BOOL bWholeWord, BOOL bFindDown = TRUE)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+\r
+               ATLASSERT(lpszFind != NULL);\r
+               FINDTEXTEX ft = { 0 };\r
+\r
+               pT->GetSel(ft.chrg);\r
+               if(m_bFirstSearch)\r
+               {\r
+                       if(bFindDown)\r
+                               m_nInitialSearchPos = ft.chrg.cpMin;\r
+                       else\r
+                               m_nInitialSearchPos = ft.chrg.cpMax;\r
+                       m_bFirstSearch = FALSE;\r
+               }\r
+\r
+#if (_RICHEDIT_VER >= 0x0200)\r
+               ft.lpstrText = (LPTSTR)lpszFind;\r
+#else // !(_RICHEDIT_VER >= 0x0200)\r
+               USES_CONVERSION;\r
+               ft.lpstrText = T2A((LPTSTR)lpszFind);\r
+#endif // !(_RICHEDIT_VER >= 0x0200)\r
+\r
+               if(ft.chrg.cpMin != ft.chrg.cpMax) // i.e. there is a selection\r
+               {\r
+                       if(bFindDown)\r
+                       {\r
+                               ft.chrg.cpMin++;\r
+                       }\r
+                       else\r
+                       {\r
+                               // won't wraparound backwards\r
+                               ft.chrg.cpMin = max(ft.chrg.cpMin, 0);\r
+                       }\r
+               }\r
+\r
+               DWORD dwFlags = bMatchCase ? FR_MATCHCASE : 0;\r
+               dwFlags |= bWholeWord ? FR_WHOLEWORD : 0;\r
+\r
+               ft.chrg.cpMax = pT->GetTextLength() + m_nInitialSearchPos;\r
+\r
+               if(bFindDown)\r
+               {\r
+                       if(m_nInitialSearchPos >= 0)\r
+                               ft.chrg.cpMax = pT->GetTextLength();\r
+\r
+                       dwFlags |= FR_DOWN;\r
+                       ATLASSERT(ft.chrg.cpMax >= ft.chrg.cpMin);\r
+               }\r
+               else\r
+               {\r
+                       if(m_nInitialSearchPos >= 0)\r
+                               ft.chrg.cpMax = 0;\r
+\r
+                       dwFlags &= ~FR_DOWN;\r
+                       ATLASSERT(ft.chrg.cpMax <= ft.chrg.cpMin);\r
+               }\r
+\r
+               BOOL bRet = FALSE;\r
+\r
+               if(pT->FindAndSelect(dwFlags, ft) != -1)\r
+               {\r
+                       bRet = TRUE;   // we found the text\r
+               }\r
+               else if(m_nInitialSearchPos > 0)\r
+               {\r
+                       // if the original starting point was not the beginning\r
+                       // of the buffer and we haven't already been here\r
+                       if(bFindDown)\r
+                       {\r
+                               ft.chrg.cpMin = 0;\r
+                               ft.chrg.cpMax = m_nInitialSearchPos;\r
+                       }\r
+                       else\r
+                       {\r
+                               ft.chrg.cpMin = pT->GetTextLength();\r
+                               ft.chrg.cpMax = m_nInitialSearchPos;\r
+                       }\r
+                       m_nInitialSearchPos = m_nInitialSearchPos - pT->GetTextLength();\r
+\r
+                       bRet = (pT->FindAndSelect(dwFlags, ft) != -1) ? TRUE : FALSE;\r
+               }\r
+\r
+               return bRet;\r
+       }\r
+\r
+       long FindAndSelect(DWORD dwFlags, FINDTEXTEX& ft)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               LONG index = pT->FindText(dwFlags, ft);\r
+               if(index != -1) // i.e. we found something\r
+                       pT->SetSel(ft.chrgText);\r
+\r
+               return index;\r
+       }\r
+};\r
+\r
+}; // namespace WTL\r
+\r
+#endif // __ATLFIND_H__\r
diff --git a/WTL80/include/atlframe.h b/WTL80/include/atlframe.h
new file mode 100644 (file)
index 0000000..7eb102f
--- /dev/null
@@ -0,0 +1,3465 @@
+// Windows Template Library - WTL version 8.0\r
+// Copyright (C) Microsoft Corporation. All rights reserved.\r
+//\r
+// This file is a part of the Windows Template Library.\r
+// The use and distribution terms for this software are covered by the\r
+// Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php)\r
+// which can be found in the file CPL.TXT at the root of this distribution.\r
+// By using this software in any fashion, you are agreeing to be bound by\r
+// the terms of this license. You must not remove this notice, or\r
+// any other, from this software.\r
+\r
+#ifndef __ATLFRAME_H__\r
+#define __ATLFRAME_H__\r
+\r
+#pragma once\r
+\r
+#ifndef __cplusplus\r
+       #error ATL requires C++ compilation (use a .cpp suffix)\r
+#endif\r
+\r
+#ifndef __ATLAPP_H__\r
+       #error atlframe.h requires atlapp.h to be included first\r
+#endif\r
+\r
+#ifndef __ATLWIN_H__\r
+       #error atlframe.h requires atlwin.h to be included first\r
+#endif\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Classes in this file:\r
+//\r
+// CFrameWindowImpl<T, TBase, TWinTraits>\r
+// CMDIWindow\r
+// CMDIFrameWindowImpl<T, TBase, TWinTraits>\r
+// CMDIChildWindowImpl<T, TBase, TWinTraits>\r
+// COwnerDraw<T>\r
+// CUpdateUIBase\r
+// CUpdateUI<T>\r
+// CDynamicUpdateUI<T>\r
+// CDialogResize<T>\r
+// CDoubleBufferImpl<T>\r
+// CDoubleBufferWindowImpl<T, TBase, TWinTraits>\r
+//\r
+// Global functions:\r
+//   AtlCreateSimpleToolBar()\r
+\r
+\r
+namespace WTL\r
+{\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CFrameWndClassInfo - Manages frame window Windows class information\r
+\r
+class CFrameWndClassInfo\r
+{\r
+public:\r
+#ifndef _WIN32_WCE\r
+       enum { cchAutoName = 5 + sizeof(void*) * 2 };   // sizeof(void*) * 2 is the number of digits %p outputs\r
+       WNDCLASSEX m_wc;\r
+#else // CE specific\r
+       enum { cchAutoName = MAX_PATH };   // MAX_PATH because this can be set in the wizard generated CMainFrame::ActivatePreviousInstance to a user defined string.\r
+       WNDCLASS m_wc;\r
+#endif // !_WIN32_WCE\r
+       LPCTSTR m_lpszOrigName;\r
+       WNDPROC pWndProc;\r
+       LPCTSTR m_lpszCursorID;\r
+       BOOL m_bSystemCursor;\r
+       ATOM m_atom;\r
+       TCHAR m_szAutoName[cchAutoName];\r
+       UINT m_uCommonResourceID;\r
+\r
+#ifndef _WIN32_WCE\r
+       ATOM Register(WNDPROC* pProc)\r
+       {\r
+               if (m_atom == 0)\r
+               {\r
+                       CWindowCreateCriticalSectionLock lock;\r
+                       if(FAILED(lock.Lock()))\r
+                       {\r
+                               ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CFrameWndClassInfo::Register.\n"));\r
+                               ATLASSERT(FALSE);\r
+                               return 0;\r
+                       }\r
+\r
+                       if(m_atom == 0)\r
+                       {\r
+                               HINSTANCE hInst = ModuleHelper::GetModuleInstance();\r
+\r
+                               if (m_lpszOrigName != NULL)\r
+                               {\r
+                                       ATLASSERT(pProc != NULL);\r
+                                       LPCTSTR lpsz = m_wc.lpszClassName;\r
+                                       WNDPROC proc = m_wc.lpfnWndProc;\r
+\r
+                                       WNDCLASSEX wc = { 0 };\r
+                                       wc.cbSize = sizeof(WNDCLASSEX);\r
+                                       // try process local class first\r
+                                       if(!::GetClassInfoEx(ModuleHelper::GetModuleInstance(), m_lpszOrigName, &wc))\r
+                                       {\r
+                                               // try global class\r
+                                               if(!::GetClassInfoEx(NULL, m_lpszOrigName, &wc))\r
+                                               {\r
+                                                       lock.Unlock();\r
+                                                       return 0;\r
+                                               }\r
+                                       }\r
+                                       m_wc = wc;\r
+                                       pWndProc = m_wc.lpfnWndProc;\r
+                                       m_wc.lpszClassName = lpsz;\r
+                                       m_wc.lpfnWndProc = proc;\r
+                               }\r
+                               else\r
+                               {\r
+                                       m_wc.hCursor = ::LoadCursor(m_bSystemCursor ? NULL : hInst, m_lpszCursorID);\r
+                               }\r
+\r
+                               m_wc.hInstance = hInst;\r
+                               m_wc.style &= ~CS_GLOBALCLASS;   // we don't register global classes\r
+                               if (m_wc.lpszClassName == NULL)\r
+                               {\r
+#if (_WIN32_WINNT >= 0x0500) || defined(_WIN64)\r
+                                       SecureHelper::wsprintf_x(m_szAutoName, cchAutoName, _T("ATL:%p"), &m_wc);\r
+#else // !((_WIN32_WINNT >= 0x0500) || defined(_WIN64))\r
+                                       SecureHelper::wsprintf_x(m_szAutoName, cchAutoName, _T("ATL:%8.8X"), (DWORD_PTR)&m_wc);\r
+#endif // !((_WIN32_WINNT >= 0x0500) || defined(_WIN64))\r
+                                       m_wc.lpszClassName = m_szAutoName;\r
+                               }\r
+\r
+                               WNDCLASSEX wcTemp = m_wc;\r
+                               m_atom = (ATOM)::GetClassInfoEx(m_wc.hInstance, m_wc.lpszClassName, &wcTemp);\r
+                               if (m_atom == 0)\r
+                               {\r
+                                       if(m_uCommonResourceID != 0)   // use it if not zero\r
+                                       {\r
+                                               m_wc.hIcon = (HICON)::LoadImage(ModuleHelper::GetResourceInstance(), MAKEINTRESOURCE(m_uCommonResourceID), IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR);\r
+                                               m_wc.hIconSm = (HICON)::LoadImage(ModuleHelper::GetResourceInstance(), MAKEINTRESOURCE(m_uCommonResourceID), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR);\r
+                                       }\r
+                                       m_atom = ::RegisterClassEx(&m_wc);\r
+                               }\r
+                       }\r
+\r
+                       lock.Unlock();\r
+               }\r
+\r
+               if (m_lpszOrigName != NULL)\r
+               {\r
+                       ATLASSERT(pProc != NULL);\r
+                       ATLASSERT(pWndProc != NULL);\r
+                       *pProc = pWndProc;\r
+               }\r
+\r
+               return m_atom;\r
+       }\r
+#else // CE specific\r
+       ATOM Register(WNDPROC* pProc)\r
+       {\r
+               if (m_atom == 0)\r
+               {\r
+                       CWindowCreateCriticalSectionLock lock;\r
+                       if(FAILED(lock.Lock()))\r
+                       {\r
+                               ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CFrameWndClassInfo::Register.\n"));\r
+                               ATLASSERT(FALSE);\r
+                               return 0;\r
+                       }\r
+\r
+                       if(m_atom == 0)\r
+                       {\r
+                               HINSTANCE hInst = ModuleHelper::GetModuleInstance();\r
+\r
+                               if (m_lpszOrigName != NULL)\r
+                               {\r
+                                       ATLASSERT(pProc != NULL);\r
+                                       LPCTSTR lpsz = m_wc.lpszClassName;\r
+                                       WNDPROC proc = m_wc.lpfnWndProc;\r
+\r
+                                       WNDCLASS wc = { 0 };\r
+                                       // try process local class first\r
+                                       if(!::GetClassInfo(ModuleHelper::GetModuleInstance(), m_lpszOrigName, &wc))\r
+                                       {\r
+                                               // try global class\r
+                                               if(!::GetClassInfo(NULL, m_lpszOrigName, &wc))\r
+                                               {\r
+                                                       lock.Unlock();\r
+                                                       return 0;\r
+                                               }\r
+                                       }\r
+                                       m_wc = wc;\r
+                                       pWndProc = m_wc.lpfnWndProc;\r
+                                       m_wc.lpszClassName = lpsz;\r
+                                       m_wc.lpfnWndProc = proc;\r
+                               }\r
+                               else\r
+                               {\r
+#if defined(GWES_CURSOR) || defined(GWES_MCURSOR)\r
+                                       m_wc.hCursor = ::LoadCursor(m_bSystemCursor ? NULL : hInst, m_lpszCursorID);\r
+#else // !(defined(GWES_CURSOR) || defined(GWES_MCURSOR))\r
+                                       m_wc.hCursor = NULL;\r
+#endif // !(defined(GWES_CURSOR) || defined(GWES_MCURSOR))\r
+                               }\r
+\r
+                               m_wc.hInstance = hInst;\r
+                               m_wc.style &= ~CS_GLOBALCLASS;   // we don't register global classes\r
+                               if (m_wc.lpszClassName == NULL)\r
+                               {\r
+                                       wsprintf(m_szAutoName, _T("ATL:%8.8X"), (DWORD_PTR)&m_wc);\r
+                                       m_wc.lpszClassName = m_szAutoName;\r
+                               }\r
+\r
+                               WNDCLASS wcTemp = m_wc;\r
+                               m_atom = (ATOM)::GetClassInfo(m_wc.hInstance, m_wc.lpszClassName, &wcTemp);\r
+                               if (m_atom == 0)\r
+                               {\r
+                                       if(m_uCommonResourceID != 0)   // use it if not zero\r
+                                               m_wc.hIcon = (HICON)::LoadImage(ModuleHelper::GetResourceInstance(), MAKEINTRESOURCE(m_uCommonResourceID), IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR);\r
+                                       m_atom = ::RegisterClass(&m_wc);\r
+                               }\r
+                       }\r
+\r
+                       lock.Unlock();\r
+               }\r
+\r
+               if (m_lpszOrigName != NULL)\r
+               {\r
+                       ATLASSERT(pProc != NULL);\r
+                       ATLASSERT(pWndProc != NULL);\r
+                       *pProc = pWndProc;\r
+               }\r
+\r
+               return m_atom;\r
+       }\r
+#endif // _WIN32_WCE\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Macros for declaring frame window WNDCLASS\r
+\r
+#ifndef _WIN32_WCE\r
+\r
+#define DECLARE_FRAME_WND_CLASS(WndClassName, uCommonResourceID) \\r
+static WTL::CFrameWndClassInfo& GetWndClassInfo() \\r
+{ \\r
+       static WTL::CFrameWndClassInfo wc = \\r
+       { \\r
+               { sizeof(WNDCLASSEX), 0, StartWindowProc, \\r
+                 0, 0, NULL, NULL, NULL, (HBRUSH)(COLOR_WINDOW + 1), NULL, WndClassName, NULL }, \\r
+               NULL, NULL, IDC_ARROW, TRUE, 0, _T(""), uCommonResourceID \\r
+       }; \\r
+       return wc; \\r
+}\r
+\r
+#define DECLARE_FRAME_WND_CLASS_EX(WndClassName, uCommonResourceID, style, bkgnd) \\r
+static WTL::CFrameWndClassInfo& GetWndClassInfo() \\r
+{ \\r
+       static WTL::CFrameWndClassInfo wc = \\r
+       { \\r
+               { sizeof(WNDCLASSEX), style, StartWindowProc, \\r
+                 0, 0, NULL, NULL, NULL, (HBRUSH)(bkgnd + 1), NULL, WndClassName, NULL }, \\r
+               NULL, NULL, IDC_ARROW, TRUE, 0, _T(""), uCommonResourceID \\r
+       }; \\r
+       return wc; \\r
+}\r
+\r
+#define DECLARE_FRAME_WND_SUPERCLASS(WndClassName, OrigWndClassName, uCommonResourceID) \\r
+static WTL::CFrameWndClassInfo& GetWndClassInfo() \\r
+{ \\r
+       static WTL::CFrameWndClassInfo wc = \\r
+       { \\r
+               { sizeof(WNDCLASSEX), 0, StartWindowProc, \\r
+                 0, 0, NULL, NULL, NULL, NULL, NULL, WndClassName, NULL }, \\r
+               OrigWndClassName, NULL, NULL, TRUE, 0, _T(""), uCommonResourceID \\r
+       }; \\r
+       return wc; \\r
+}\r
+\r
+#else // CE specific\r
+\r
+#define DECLARE_FRAME_WND_CLASS(WndClassName, uCommonResourceID) \\r
+static WTL::CFrameWndClassInfo& GetWndClassInfo() \\r
+{ \\r
+       static WTL::CFrameWndClassInfo wc = \\r
+       { \\r
+               { 0, StartWindowProc, \\r
+                 0, 0, NULL, NULL, NULL, (HBRUSH)(COLOR_WINDOW + 1), NULL, WndClassName }, \\r
+               NULL, NULL, IDC_ARROW, TRUE, 0, _T(""), uCommonResourceID \\r
+       }; \\r
+       return wc; \\r
+}\r
+\r
+#define DECLARE_FRAME_WND_CLASS_EX(WndClassName, uCommonResourceID, style, bkgnd) \\r
+static WTL::CFrameWndClassInfo& GetWndClassInfo() \\r
+{ \\r
+       static WTL::CFrameWndClassInfo wc = \\r
+       { \\r
+               { style, StartWindowProc, \\r
+                 0, 0, NULL, NULL, NULL, (HBRUSH)(bkgnd + 1), NULL, WndClassName }, \\r
+               NULL, NULL, IDC_ARROW, TRUE, 0, _T(""), uCommonResourceID \\r
+       }; \\r
+       return wc; \\r
+}\r
+\r
+#define DECLARE_FRAME_WND_SUPERCLASS(WndClassName, OrigWndClassName, uCommonResourceID) \\r
+static WTL::CFrameWndClassInfo& GetWndClassInfo() \\r
+{ \\r
+       static WTL::CFrameWndClassInfo wc = \\r
+       { \\r
+               { NULL, StartWindowProc, \\r
+                 0, 0, NULL, NULL, NULL, NULL, NULL, WndClassName }, \\r
+               OrigWndClassName, NULL, IDC_ARROW, TRUE, 0, _T(""), uCommonResourceID \\r
+       }; \\r
+       return wc; \\r
+}\r
+\r
+#endif // !_WIN32_WCE\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CFrameWindowImpl\r
+\r
+// Client window command chaining macro (only for frame windows)\r
+#define CHAIN_CLIENT_COMMANDS() \\r
+       if(uMsg == WM_COMMAND && m_hWndClient != NULL) \\r
+               ::SendMessage(m_hWndClient, uMsg, wParam, lParam);\r
+\r
+// standard toolbar styles\r
+#define ATL_SIMPLE_TOOLBAR_STYLE \\r
+       (WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | TBSTYLE_TOOLTIPS)\r
+// toolbar in a rebar pane\r
+#define ATL_SIMPLE_TOOLBAR_PANE_STYLE \\r
+       (WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | CCS_NODIVIDER | CCS_NORESIZE | CCS_NOPARENTALIGN | TBSTYLE_TOOLTIPS | TBSTYLE_FLAT)\r
+// standard rebar styles\r
+#if (_WIN32_IE >= 0x0400)\r
+  #define ATL_SIMPLE_REBAR_STYLE \\r
+       (WS_CHILD | WS_VISIBLE | WS_BORDER | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | RBS_VARHEIGHT | RBS_BANDBORDERS | RBS_AUTOSIZE)\r
+#else\r
+  #define ATL_SIMPLE_REBAR_STYLE \\r
+       (WS_CHILD | WS_VISIBLE | WS_BORDER | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | RBS_VARHEIGHT | RBS_BANDBORDERS)\r
+#endif // !(_WIN32_IE >= 0x0400)\r
+// rebar without borders\r
+#if (_WIN32_IE >= 0x0400)\r
+  #define ATL_SIMPLE_REBAR_NOBORDER_STYLE \\r
+       (WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | RBS_VARHEIGHT | RBS_BANDBORDERS | RBS_AUTOSIZE | CCS_NODIVIDER)\r
+#else\r
+  #define ATL_SIMPLE_REBAR_NOBORDER_STYLE \\r
+       (WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | RBS_VARHEIGHT | RBS_BANDBORDERS | CCS_NODIVIDER)\r
+#endif // !(_WIN32_IE >= 0x0400)\r
+\r
+// command bar support\r
+#if !defined(__ATLCTRLW_H__) && !defined(_WIN32_WCE)\r
+\r
+#define CBRM_GETCMDBAR                 (WM_USER + 301) // returns command bar HWND\r
+#define CBRM_GETMENU                   (WM_USER + 302) // returns loaded or attached menu\r
+#define CBRM_TRACKPOPUPMENU            (WM_USER + 303) // displays a popup menu\r
+\r
+struct _AtlFrameWnd_CmdBarPopupMenu\r
+{\r
+       int cbSize;\r
+       HMENU hMenu;\r
+       UINT uFlags;\r
+       int x;\r
+       int y;\r
+       LPTPMPARAMS lptpm;\r
+};\r
+\r
+#define CBRPOPUPMENU _AtlFrameWnd_CmdBarPopupMenu\r
+\r
+#endif // !defined(__ATLCTRLW_H__) && !defined(_WIN32_WCE)\r
+\r
+\r
+template <class TBase = ATL::CWindow, class TWinTraits = ATL::CFrameWinTraits>\r
+class ATL_NO_VTABLE CFrameWindowImplBase : public ATL::CWindowImplBaseT< TBase, TWinTraits >\r
+{\r
+public:\r
+       DECLARE_FRAME_WND_CLASS(NULL, 0)\r
+\r
+// Data members\r
+       HWND m_hWndToolBar;\r
+       HWND m_hWndStatusBar;\r
+       HWND m_hWndClient;\r
+\r
+       HACCEL m_hAccel;\r
+\r
+#ifdef _WIN32_WCE\r
+       HWND m_hWndCECommandBar;\r
+#endif // _WIN32_WCE\r
+\r
+       struct _AtlToolBarData\r
+       {\r
+               WORD wVersion;\r
+               WORD wWidth;\r
+               WORD wHeight;\r
+               WORD wItemCount;\r
+               //WORD aItems[wItemCount]\r
+\r
+               WORD* items()\r
+                       { return (WORD*)(this+1); }\r
+       };\r
+\r
+#if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)\r
+       struct _ChevronMenuInfo\r
+       {\r
+               HMENU hMenu;\r
+               LPNMREBARCHEVRON lpnm;\r
+               bool bCmdBar;\r
+       };\r
+#endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)\r
+\r
+// Constructor\r
+       CFrameWindowImplBase() : \r
+#ifdef _WIN32_WCE\r
+               m_hWndCECommandBar(NULL),\r
+#endif // _WIN32_WCE\r
+               m_hWndToolBar(NULL), \r
+               m_hWndStatusBar(NULL), \r
+               m_hWndClient(NULL), \r
+               m_hAccel(NULL)\r
+       { }\r
+\r
+// Methods\r
+       HWND Create(HWND hWndParent, ATL::_U_RECT rect, LPCTSTR szWindowName, DWORD dwStyle, DWORD dwExStyle, ATL::_U_MENUorID MenuOrID, ATOM atom, LPVOID lpCreateParam)\r
+       {\r
+               ATLASSERT(m_hWnd == NULL);\r
+\r
+               if(atom == 0)\r
+                       return NULL;\r
+\r
+               ModuleHelper::AddCreateWndData(&m_thunk.cd, this);\r
+\r
+               if(MenuOrID.m_hMenu == NULL && (dwStyle & WS_CHILD))\r
+                       MenuOrID.m_hMenu = (HMENU)(UINT_PTR)this;\r
+               if(rect.m_lpRect == NULL)\r
+                       rect.m_lpRect = &TBase::rcDefault;\r
+\r
+               HWND hWnd = ::CreateWindowEx(dwExStyle, MAKEINTATOM(atom), szWindowName,\r
+                       dwStyle, rect.m_lpRect->left, rect.m_lpRect->top, rect.m_lpRect->right - rect.m_lpRect->left,\r
+                       rect.m_lpRect->bottom - rect.m_lpRect->top, hWndParent, MenuOrID.m_hMenu,\r
+                       ModuleHelper::GetModuleInstance(), lpCreateParam);\r
+\r
+               ATLASSERT(hWnd == NULL || m_hWnd == hWnd);\r
+\r
+               return hWnd;\r
+       }\r
+\r
+       static HWND CreateSimpleToolBarCtrl(HWND hWndParent, UINT nResourceID, BOOL bInitialSeparator = FALSE, \r
+                       DWORD dwStyle = ATL_SIMPLE_TOOLBAR_STYLE, UINT nID = ATL_IDW_TOOLBAR)\r
+       {\r
+               HINSTANCE hInst = ModuleHelper::GetResourceInstance();\r
+               HRSRC hRsrc = ::FindResource(hInst, MAKEINTRESOURCE(nResourceID), RT_TOOLBAR);\r
+               if (hRsrc == NULL)\r
+                       return NULL;\r
+\r
+               HGLOBAL hGlobal = ::LoadResource(hInst, hRsrc);\r
+               if (hGlobal == NULL)\r
+                       return NULL;\r
+\r
+               _AtlToolBarData* pData = (_AtlToolBarData*)::LockResource(hGlobal);\r
+               if (pData == NULL)\r
+                       return NULL;\r
+               ATLASSERT(pData->wVersion == 1);\r
+\r
+               WORD* pItems = pData->items();\r
+               int nItems = pData->wItemCount + (bInitialSeparator ? 1 : 0);\r
+               CTempBuffer<TBBUTTON, _WTL_STACK_ALLOC_THRESHOLD> buff;\r
+               TBBUTTON* pTBBtn = buff.Allocate(nItems);\r
+               ATLASSERT(pTBBtn != NULL);\r
+               if(pTBBtn == NULL)\r
+                       return NULL;\r
+\r
+               const int cxSeparator = 8;\r
+\r
+               // set initial separator (half width)\r
+               if(bInitialSeparator)\r
+               {\r
+                       pTBBtn[0].iBitmap = cxSeparator / 2;\r
+                       pTBBtn[0].idCommand = 0;\r
+                       pTBBtn[0].fsState = 0;\r
+                       pTBBtn[0].fsStyle = TBSTYLE_SEP;\r
+                       pTBBtn[0].dwData = 0;\r
+                       pTBBtn[0].iString = 0;\r
+               }\r
+\r
+               int nBmp = 0;\r
+               for(int i = 0, j = bInitialSeparator ? 1 : 0; i < pData->wItemCount; i++, j++)\r
+               {\r
+                       if(pItems[i] != 0)\r
+                       {\r
+                               pTBBtn[j].iBitmap = nBmp++;\r
+                               pTBBtn[j].idCommand = pItems[i];\r
+                               pTBBtn[j].fsState = TBSTATE_ENABLED;\r
+                               pTBBtn[j].fsStyle = TBSTYLE_BUTTON;\r
+                               pTBBtn[j].dwData = 0;\r
+                               pTBBtn[j].iString = 0;\r
+                       }\r
+                       else\r
+                       {\r
+                               pTBBtn[j].iBitmap = cxSeparator;\r
+                               pTBBtn[j].idCommand = 0;\r
+                               pTBBtn[j].fsState = 0;\r
+                               pTBBtn[j].fsStyle = TBSTYLE_SEP;\r
+                               pTBBtn[j].dwData = 0;\r
+                               pTBBtn[j].iString = 0;\r
+                       }\r
+               }\r
+\r
+#ifndef _WIN32_WCE\r
+               HWND hWnd = ::CreateWindowEx(0, TOOLBARCLASSNAME, NULL, dwStyle, 0, 0, 100, 100, hWndParent, (HMENU)LongToHandle(nID), ModuleHelper::GetModuleInstance(), NULL);\r
+               if(hWnd == NULL)\r
+               {\r
+                       ATLASSERT(FALSE);\r
+                       return NULL;\r
+               }\r
+#else // CE specific\r
+               dwStyle;\r
+               nID;\r
+               // The toolbar must go onto the existing CommandBar or MenuBar\r
+               HWND hWnd = hWndParent;\r
+#endif // _WIN32_WCE\r
+\r
+               ::SendMessage(hWnd, TB_BUTTONSTRUCTSIZE, sizeof(TBBUTTON), 0L);\r
+\r
+               // check if font is taller than our bitmaps\r
+               CFontHandle font = (HFONT)::SendMessage(hWnd, WM_GETFONT, 0, 0L);\r
+               if(font.IsNull())\r
+                       font = AtlGetDefaultGuiFont();\r
+               LOGFONT lf = { 0 };\r
+               font.GetLogFont(lf);\r
+               WORD cyFontHeight = (WORD)abs(lf.lfHeight);\r
+\r
+#ifndef _WIN32_WCE\r
+               WORD bitsPerPixel = AtlGetBitmapResourceBitsPerPixel(nResourceID);\r
+               if(bitsPerPixel > 4)\r
+               {\r
+                       COLORREF crMask = CLR_DEFAULT;\r
+                       if(bitsPerPixel == 32)\r
+                       {\r
+                               // 32-bit color bitmap with alpha channel (valid for Windows XP and later)\r
+                               crMask = CLR_NONE;\r
+                       }\r
+                       HIMAGELIST hImageList = ImageList_LoadImage(ModuleHelper::GetResourceInstance(), MAKEINTRESOURCE(nResourceID), pData->wWidth, 1, crMask, IMAGE_BITMAP, LR_CREATEDIBSECTION | LR_DEFAULTSIZE);\r
+                       ATLASSERT(hImageList != NULL);\r
+                       ::SendMessage(hWnd, TB_SETIMAGELIST, 0, (LPARAM)hImageList);\r
+               }\r
+               else\r
+#endif // !_WIN32_WCE\r
+               {\r
+                       TBADDBITMAP tbab = { 0 };\r
+                       tbab.hInst = hInst;\r
+                       tbab.nID = nResourceID;\r
+                       ::SendMessage(hWnd, TB_ADDBITMAP, nBmp, (LPARAM)&tbab);\r
+               }\r
+\r
+               ::SendMessage(hWnd, TB_ADDBUTTONS, nItems, (LPARAM)pTBBtn);\r
+               ::SendMessage(hWnd, TB_SETBITMAPSIZE, 0, MAKELONG(pData->wWidth, max(pData->wHeight, cyFontHeight)));\r
+               const int cxyButtonMargin = 7;\r
+               ::SendMessage(hWnd, TB_SETBUTTONSIZE, 0, MAKELONG(pData->wWidth + cxyButtonMargin, max(pData->wHeight, cyFontHeight) + cxyButtonMargin));\r
+\r
+               return hWnd;\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       static HWND CreateSimpleReBarCtrl(HWND hWndParent, DWORD dwStyle = ATL_SIMPLE_REBAR_STYLE, UINT nID = ATL_IDW_TOOLBAR)\r
+       {\r
+               // Ensure style combinations for proper rebar painting\r
+               if(dwStyle & CCS_NODIVIDER && dwStyle & WS_BORDER)\r
+                       dwStyle &= ~WS_BORDER;\r
+               else if(!(dwStyle & WS_BORDER) && !(dwStyle & CCS_NODIVIDER))\r
+                       dwStyle |= CCS_NODIVIDER;\r
+\r
+               // Create rebar window\r
+               HWND hWndReBar = ::CreateWindowEx(0, REBARCLASSNAME, NULL, dwStyle, 0, 0, 100, 100, hWndParent, (HMENU)LongToHandle(nID), ModuleHelper::GetModuleInstance(), NULL);\r
+               if(hWndReBar == NULL)\r
+               {\r
+                       ATLTRACE2(atlTraceUI, 0, _T("Failed to create rebar.\n"));\r
+                       return NULL;\r
+               }\r
+\r
+               // Initialize and send the REBARINFO structure\r
+               REBARINFO rbi = { 0 };\r
+               rbi.cbSize = sizeof(REBARINFO);\r
+               rbi.fMask  = 0;\r
+               if(!::SendMessage(hWndReBar, RB_SETBARINFO, 0, (LPARAM)&rbi))\r
+               {\r
+                       ATLTRACE2(atlTraceUI, 0, _T("Failed to initialize rebar.\n"));\r
+                       ::DestroyWindow(hWndReBar);\r
+                       return NULL;\r
+               }\r
+\r
+               return hWndReBar;\r
+       }\r
+\r
+       BOOL CreateSimpleReBar(DWORD dwStyle = ATL_SIMPLE_REBAR_STYLE, UINT nID = ATL_IDW_TOOLBAR)\r
+       {\r
+               ATLASSERT(!::IsWindow(m_hWndToolBar));\r
+               m_hWndToolBar = CreateSimpleReBarCtrl(m_hWnd, dwStyle, nID);\r
+               return (m_hWndToolBar != NULL);\r
+       }\r
+\r
+       static BOOL AddSimpleReBarBandCtrl(HWND hWndReBar, HWND hWndBand, int nID = 0, LPCTSTR lpstrTitle = NULL, BOOL bNewRow = FALSE, int cxWidth = 0, BOOL bFullWidthAlways = FALSE)\r
+       {\r
+               ATLASSERT(::IsWindow(hWndReBar));   // must be already created\r
+#ifdef _DEBUG\r
+               // block - check if this is really a rebar\r
+               {\r
+                       TCHAR lpszClassName[sizeof(REBARCLASSNAME)] = { 0 };\r
+                       ::GetClassName(hWndReBar, lpszClassName, sizeof(REBARCLASSNAME));\r
+                       ATLASSERT(lstrcmp(lpszClassName, REBARCLASSNAME) == 0);\r
+               }\r
+#endif // _DEBUG\r
+               ATLASSERT(::IsWindow(hWndBand));   // must be already created\r
+\r
+               // Get number of buttons on the toolbar\r
+               int nBtnCount = (int)::SendMessage(hWndBand, TB_BUTTONCOUNT, 0, 0L);\r
+\r
+               // Set band info structure\r
+               REBARBANDINFO rbBand = { RunTimeHelper::SizeOf_REBARBANDINFO() };\r
+#if (_WIN32_IE >= 0x0400)\r
+               rbBand.fMask = RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_STYLE | RBBIM_ID | RBBIM_SIZE | RBBIM_IDEALSIZE;\r
+#else\r
+               rbBand.fMask = RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_STYLE | RBBIM_ID | RBBIM_SIZE;\r
+#endif // !(_WIN32_IE >= 0x0400)\r
+               if(lpstrTitle != NULL)\r
+                       rbBand.fMask |= RBBIM_TEXT;\r
+               rbBand.fStyle = RBBS_CHILDEDGE;\r
+#if (_WIN32_IE >= 0x0500)\r
+               if(nBtnCount > 0)   // add chevron style for toolbar with buttons\r
+                       rbBand.fStyle |= RBBS_USECHEVRON;\r
+#endif // (_WIN32_IE >= 0x0500)\r
+               if(bNewRow)\r
+                       rbBand.fStyle |= RBBS_BREAK;\r
+\r
+               rbBand.lpText = (LPTSTR)lpstrTitle;\r
+               rbBand.hwndChild = hWndBand;\r
+               if(nID == 0)   // calc band ID\r
+                       nID = ATL_IDW_BAND_FIRST + (int)::SendMessage(hWndReBar, RB_GETBANDCOUNT, 0, 0L);\r
+               rbBand.wID = nID;\r
+\r
+               // Calculate the size of the band\r
+               BOOL bRet = FALSE;\r
+               RECT rcTmp = { 0 };\r
+               if(nBtnCount > 0)\r
+               {\r
+                       bRet = (BOOL)::SendMessage(hWndBand, TB_GETITEMRECT, nBtnCount - 1, (LPARAM)&rcTmp);\r
+                       ATLASSERT(bRet);\r
+                       rbBand.cx = (cxWidth != 0) ? cxWidth : rcTmp.right;\r
+                       rbBand.cyMinChild = rcTmp.bottom - rcTmp.top;\r
+                       if(bFullWidthAlways)\r
+                       {\r
+                               rbBand.cxMinChild = rbBand.cx;\r
+                       }\r
+                       else if(lpstrTitle == NULL)\r
+                       {\r
+                               bRet = (BOOL)::SendMessage(hWndBand, TB_GETITEMRECT, 0, (LPARAM)&rcTmp);\r
+                               ATLASSERT(bRet);\r
+                               rbBand.cxMinChild = rcTmp.right;\r
+                       }\r
+                       else\r
+                       {\r
+                               rbBand.cxMinChild = 0;\r
+                       }\r
+               }\r
+               else    // no buttons, either not a toolbar or really has no buttons\r
+               {\r
+                       bRet = ::GetWindowRect(hWndBand, &rcTmp);\r
+                       ATLASSERT(bRet);\r
+                       rbBand.cx = (cxWidth != 0) ? cxWidth : (rcTmp.right - rcTmp.left);\r
+                       rbBand.cxMinChild = bFullWidthAlways ? rbBand.cx : 0;\r
+                       rbBand.cyMinChild = rcTmp.bottom - rcTmp.top;\r
+               }\r
+\r
+#if (_WIN32_IE >= 0x0400)\r
+               rbBand.cxIdeal = rbBand.cx;\r
+#endif // (_WIN32_IE >= 0x0400)\r
+\r
+               // Add the band\r
+               LRESULT lRes = ::SendMessage(hWndReBar, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbBand);\r
+               if(lRes == 0)\r
+               {\r
+                       ATLTRACE2(atlTraceUI, 0, _T("Failed to add a band to the rebar.\n"));\r
+                       return FALSE;\r
+               }\r
+\r
+#if (_WIN32_IE >= 0x0501)\r
+               DWORD dwExStyle = (DWORD)::SendMessage(hWndBand, TB_GETEXTENDEDSTYLE, 0, 0L);\r
+               ::SendMessage(hWndBand, TB_SETEXTENDEDSTYLE, 0, dwExStyle | TBSTYLE_EX_HIDECLIPPEDBUTTONS);\r
+#endif // (_WIN32_IE >= 0x0501)\r
+\r
+               return TRUE;\r
+       }\r
+\r
+       BOOL AddSimpleReBarBand(HWND hWndBand, LPCTSTR lpstrTitle = NULL, BOOL bNewRow = FALSE, int cxWidth = 0, BOOL bFullWidthAlways = FALSE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWndToolBar));   // must be an existing rebar\r
+               ATLASSERT(::IsWindow(hWndBand));        // must be created\r
+               return AddSimpleReBarBandCtrl(m_hWndToolBar, hWndBand, 0, lpstrTitle, bNewRow, cxWidth, bFullWidthAlways);\r
+       }\r
+\r
+#if (_WIN32_IE >= 0x0400)\r
+       void SizeSimpleReBarBands()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWndToolBar));   // must be an existing rebar\r
+\r
+               int nCount = (int)::SendMessage(m_hWndToolBar, RB_GETBANDCOUNT, 0, 0L);\r
+\r
+               for(int i = 0; i < nCount; i++)\r
+               {\r
+                       REBARBANDINFO rbBand = { RunTimeHelper::SizeOf_REBARBANDINFO() };\r
+                       rbBand.fMask = RBBIM_SIZE;\r
+                       BOOL bRet = (BOOL)::SendMessage(m_hWndToolBar, RB_GETBANDINFO, i, (LPARAM)&rbBand);\r
+                       ATLASSERT(bRet);\r
+                       RECT rect = { 0, 0, 0, 0 };\r
+                       ::SendMessage(m_hWndToolBar, RB_GETBANDBORDERS, i, (LPARAM)&rect);\r
+                       rbBand.cx += rect.left + rect.right;\r
+                       bRet = (BOOL)::SendMessage(m_hWndToolBar, RB_SETBANDINFO, i, (LPARAM)&rbBand);\r
+                       ATLASSERT(bRet);\r
+               }\r
+       }\r
+#endif // (_WIN32_IE >= 0x0400)\r
+#endif // _WIN32_WCE\r
+\r
+#ifndef _WIN32_WCE\r
+       BOOL CreateSimpleStatusBar(LPCTSTR lpstrText, DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | SBARS_SIZEGRIP, UINT nID = ATL_IDW_STATUS_BAR)\r
+#else // CE specific\r
+       BOOL CreateSimpleStatusBar(LPCTSTR lpstrText, DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, UINT nID = ATL_IDW_STATUS_BAR)\r
+#endif // _WIN32_WCE\r
+       {\r
+               ATLASSERT(!::IsWindow(m_hWndStatusBar));\r
+               m_hWndStatusBar = ::CreateStatusWindow(dwStyle, lpstrText, m_hWnd, nID);\r
+               return (m_hWndStatusBar != NULL);\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       BOOL CreateSimpleStatusBar(UINT nTextID = ATL_IDS_IDLEMESSAGE, DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | SBARS_SIZEGRIP, UINT nID = ATL_IDW_STATUS_BAR)\r
+#else // CE specific\r
+       BOOL CreateSimpleStatusBar(UINT nTextID = ATL_IDS_IDLEMESSAGE, DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, UINT nID = ATL_IDW_STATUS_BAR)\r
+#endif // _WIN32_WCE\r
+       {\r
+               const int cchMax = 128;   // max text length is 127 for status bars (+1 for null)\r
+               TCHAR szText[cchMax];\r
+               szText[0] = 0;\r
+               ::LoadString(ModuleHelper::GetResourceInstance(), nTextID, szText, cchMax);\r
+               return CreateSimpleStatusBar(szText, dwStyle, nID);\r
+       }\r
+\r
+#ifdef _WIN32_WCE\r
+       BOOL CreateSimpleCECommandBar(LPTSTR pszMenu = NULL, WORD iButton = 0, DWORD dwFlags = 0, int nCmdBarID = 1)\r
+       {\r
+               ATLASSERT(m_hWndCECommandBar == NULL);\r
+               ATLASSERT(m_hWndToolBar == NULL);\r
+\r
+               m_hWndCECommandBar = ::CommandBar_Create(ModuleHelper::GetModuleInstance(), m_hWnd, nCmdBarID);\r
+               if(m_hWndCECommandBar == NULL)\r
+                       return FALSE;\r
+\r
+               m_hWndToolBar = m_hWndCECommandBar;\r
+\r
+               BOOL bRet = TRUE;\r
+\r
+               if(pszMenu != NULL)\r
+                       bRet &= ::CommandBar_InsertMenubarEx(m_hWndCECommandBar, IS_INTRESOURCE(pszMenu) ? ModuleHelper::GetResourceInstance() : NULL, pszMenu, iButton);\r
+\r
+               bRet &= ::CommandBar_AddAdornments(m_hWndCECommandBar, dwFlags, 0);\r
+\r
+               return bRet;\r
+       }\r
+\r
+#if defined(_AYGSHELL_H_) || defined(__AYGSHELL_H__)\r
+       BOOL CreateSimpleCEMenuBar(UINT nToolBarId = ATL_IDW_MENU_BAR, DWORD dwFlags = 0, int nBmpId = 0, int cBmpImages = 0)\r
+       {\r
+               ATLASSERT(m_hWndCECommandBar == NULL);\r
+\r
+               SHMENUBARINFO mbi = { 0 };\r
+               mbi.cbSize = sizeof(mbi);\r
+               mbi.hwndParent = m_hWnd;\r
+               mbi.dwFlags = dwFlags;\r
+               mbi.nToolBarId = nToolBarId;\r
+               mbi.hInstRes  = ModuleHelper::GetResourceInstance();\r
+               mbi.nBmpId = nBmpId;\r
+               mbi.cBmpImages = cBmpImages;\r
+               mbi.hwndMB = NULL;   // This gets set by SHCreateMenuBar\r
+\r
+               BOOL bRet = ::SHCreateMenuBar(&mbi);\r
+               if(bRet != FALSE)\r
+               {\r
+                       m_hWndCECommandBar = mbi.hwndMB;\r
+                       SizeToMenuBar();\r
+               }\r
+\r
+               return bRet;\r
+       }\r
+\r
+       void SizeToMenuBar()   // for menu bar only\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(::IsWindow(m_hWndCECommandBar));\r
+\r
+               RECT rect = { 0 };\r
+               GetWindowRect(&rect);\r
+               RECT rectMB = { 0 };\r
+               ::GetWindowRect(m_hWndCECommandBar, &rectMB);\r
+               int cy = ::IsWindowVisible(m_hWndCECommandBar) ? rectMB.top - rect.top : rectMB.bottom - rect.top;\r
+               SetWindowPos(NULL, 0, 0, rect.right - rect.left, cy, SWP_NOZORDER | SWP_NOMOVE);\r
+       }\r
+#endif // defined(_AYGSHELL_H_) || defined(__AYGSHELL_H__)\r
+#endif // _WIN32_WCE\r
+\r
+       void UpdateLayout(BOOL bResizeBars = TRUE)\r
+       {\r
+               RECT rect = { 0 };\r
+               GetClientRect(&rect);\r
+\r
+               // position bars and offset their dimensions\r
+               UpdateBarsPosition(rect, bResizeBars);\r
+\r
+               // resize client window\r
+               if(m_hWndClient != NULL)\r
+                       ::SetWindowPos(m_hWndClient, NULL, rect.left, rect.top,\r
+                               rect.right - rect.left, rect.bottom - rect.top,\r
+                               SWP_NOZORDER | SWP_NOACTIVATE);\r
+       }\r
+\r
+       void UpdateBarsPosition(RECT& rect, BOOL bResizeBars = TRUE)\r
+       {\r
+               // resize toolbar\r
+               if(m_hWndToolBar != NULL && ((DWORD)::GetWindowLong(m_hWndToolBar, GWL_STYLE) & WS_VISIBLE))\r
+               {\r
+                       if(bResizeBars)\r
+                       {\r
+                               ::SendMessage(m_hWndToolBar, WM_SIZE, 0, 0);\r
+                               ::InvalidateRect(m_hWndToolBar, NULL, FALSE);\r
+                       }\r
+                       RECT rectTB = { 0 };\r
+                       ::GetWindowRect(m_hWndToolBar, &rectTB);\r
+                       rect.top += rectTB.bottom - rectTB.top;\r
+               }\r
+\r
+               // resize status bar\r
+               if(m_hWndStatusBar != NULL && ((DWORD)::GetWindowLong(m_hWndStatusBar, GWL_STYLE) & WS_VISIBLE))\r
+               {\r
+                       if(bResizeBars)\r
+                               ::SendMessage(m_hWndStatusBar, WM_SIZE, 0, 0);\r
+                       RECT rectSB = { 0 };\r
+                       ::GetWindowRect(m_hWndStatusBar, &rectSB);\r
+                       rect.bottom -= rectSB.bottom - rectSB.top;\r
+               }\r
+       }\r
+\r
+       BOOL PreTranslateMessage(MSG* pMsg)\r
+       {\r
+               if(m_hAccel != NULL && ::TranslateAccelerator(m_hWnd, m_hAccel, pMsg))\r
+                       return TRUE;\r
+               return FALSE;\r
+       }\r
+\r
+       BEGIN_MSG_MAP(CFrameWindowImplBase)\r
+               MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground)\r
+#ifndef _WIN32_WCE\r
+               MESSAGE_HANDLER(WM_MENUSELECT, OnMenuSelect)\r
+#endif // !_WIN32_WCE\r
+               MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)\r
+               MESSAGE_HANDLER(WM_DESTROY, OnDestroy)\r
+#ifndef _WIN32_WCE\r
+               NOTIFY_CODE_HANDLER(TTN_GETDISPINFOA, OnToolTipTextA)\r
+               NOTIFY_CODE_HANDLER(TTN_GETDISPINFOW, OnToolTipTextW)\r
+#endif // !_WIN32_WCE\r
+       END_MSG_MAP()\r
+\r
+       LRESULT OnEraseBackground(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)\r
+       {\r
+               if(m_hWndClient != NULL)   // view will paint itself instead\r
+                       return 1;\r
+\r
+               bHandled = FALSE;\r
+               return 0;\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       LRESULT OnMenuSelect(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled)\r
+       {\r
+               bHandled = FALSE;\r
+\r
+               if(m_hWndStatusBar == NULL)\r
+                       return 1;\r
+\r
+               WORD wFlags = HIWORD(wParam);\r
+               if(wFlags == 0xFFFF && lParam == NULL)   // menu closing\r
+               {\r
+                       ::SendMessage(m_hWndStatusBar, SB_SIMPLE, FALSE, 0L);\r
+               }\r
+               else\r
+               {\r
+                       const int cchBuff = 256;\r
+                       TCHAR szBuff[cchBuff];\r
+                       szBuff[0] = 0;\r
+                       if(!(wFlags & MF_POPUP))\r
+                       {\r
+                               WORD wID = LOWORD(wParam);\r
+                               // check for special cases\r
+                               if(wID >= 0xF000 && wID < 0xF1F0)   // system menu IDs\r
+                                       wID = (WORD)(((wID - 0xF000) >> 4) + ATL_IDS_SCFIRST);\r
+                               else if(wID >= ID_FILE_MRU_FIRST && wID <= ID_FILE_MRU_LAST)   // MRU items\r
+                                       wID = ATL_IDS_MRU_FILE;\r
+                               else if(wID >= ATL_IDM_FIRST_MDICHILD && wID <= ATL_IDM_LAST_MDICHILD)   // MDI child windows\r
+                                       wID = ATL_IDS_MDICHILD;\r
+\r
+                               int nRet = ::LoadString(ModuleHelper::GetResourceInstance(), wID, szBuff, cchBuff);\r
+                               for(int i = 0; i < nRet; i++)\r
+                               {\r
+                                       if(szBuff[i] == _T('\n'))\r
+                                       {\r
+                                               szBuff[i] = 0;\r
+                                               break;\r
+                                       }\r
+                               }\r
+                       }\r
+                       ::SendMessage(m_hWndStatusBar, SB_SIMPLE, TRUE, 0L);\r
+                       ::SendMessage(m_hWndStatusBar, SB_SETTEXT, (255 | SBT_NOBORDERS), (LPARAM)szBuff);\r
+               }\r
+\r
+               return 1;\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       LRESULT OnSetFocus(UINT, WPARAM, LPARAM, BOOL& bHandled)\r
+       {\r
+               if(m_hWndClient != NULL)\r
+                       ::SetFocus(m_hWndClient);\r
+\r
+               bHandled = FALSE;\r
+               return 1;\r
+       }\r
+\r
+       LRESULT OnDestroy(UINT, WPARAM, LPARAM, BOOL& bHandled)\r
+       {\r
+               if((GetStyle() & (WS_CHILD | WS_POPUP)) == 0)\r
+                       ::PostQuitMessage(1);\r
+\r
+               bHandled = FALSE;\r
+               return 1;\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       LRESULT OnToolTipTextA(int idCtrl, LPNMHDR pnmh, BOOL& /*bHandled*/)\r
+       {\r
+               LPNMTTDISPINFOA pDispInfo = (LPNMTTDISPINFOA)pnmh;\r
+               pDispInfo->szText[0] = 0;\r
+\r
+               if((idCtrl != 0) && !(pDispInfo->uFlags & TTF_IDISHWND))\r
+               {\r
+                       const int cchBuff = 256;\r
+                       char szBuff[cchBuff];\r
+                       szBuff[0] = 0;\r
+                       int nRet = ::LoadStringA(ModuleHelper::GetResourceInstance(), idCtrl, szBuff, cchBuff);\r
+                       for(int i = 0; i < nRet; i++)\r
+                       {\r
+                               if(szBuff[i] == '\n')\r
+                               {\r
+                                       SecureHelper::strncpyA_x(pDispInfo->szText, _countof(pDispInfo->szText), &szBuff[i + 1], _TRUNCATE);\r
+                                       break;\r
+                               }\r
+                       }\r
+#if (_WIN32_IE >= 0x0300)\r
+                       if(nRet > 0)   // string was loaded, save it\r
+                               pDispInfo->uFlags |= TTF_DI_SETITEM;\r
+#endif // (_WIN32_IE >= 0x0300)\r
+               }\r
+\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnToolTipTextW(int idCtrl, LPNMHDR pnmh, BOOL& /*bHandled*/)\r
+       {\r
+               LPNMTTDISPINFOW pDispInfo = (LPNMTTDISPINFOW)pnmh;\r
+               pDispInfo->szText[0] = 0;\r
+\r
+               if((idCtrl != 0) && !(pDispInfo->uFlags & TTF_IDISHWND))\r
+               {\r
+                       const int cchBuff = 256;\r
+                       wchar_t szBuff[cchBuff];\r
+                       szBuff[0] = 0;\r
+                       int nRet = ::LoadStringW(ModuleHelper::GetResourceInstance(), idCtrl, szBuff, cchBuff);\r
+                       for(int i = 0; i < nRet; i++)\r
+                       {\r
+                               if(szBuff[i] == L'\n')\r
+                               {\r
+                                       SecureHelper::strncpyW_x(pDispInfo->szText, _countof(pDispInfo->szText), &szBuff[i + 1], _TRUNCATE);\r
+                                       break;\r
+                               }\r
+                       }\r
+#if (_WIN32_IE >= 0x0300)\r
+                       if(nRet > 0)   // string was loaded, save it\r
+                               pDispInfo->uFlags |= TTF_DI_SETITEM;\r
+#endif // (_WIN32_IE >= 0x0300)\r
+               }\r
+\r
+               return 0;\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+// Implementation - chevron menu support\r
+#if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)\r
+       bool PrepareChevronMenu(_ChevronMenuInfo& cmi)\r
+       {\r
+               // get rebar and toolbar\r
+               REBARBANDINFO rbbi = { RunTimeHelper::SizeOf_REBARBANDINFO() };\r
+               rbbi.fMask = RBBIM_CHILD;\r
+               BOOL bRet = (BOOL)::SendMessage(cmi.lpnm->hdr.hwndFrom, RB_GETBANDINFO, cmi.lpnm->uBand, (LPARAM)&rbbi);\r
+               ATLASSERT(bRet);\r
+\r
+               // assume the band is a toolbar\r
+               ATL::CWindow wnd = rbbi.hwndChild;\r
+               int nCount = (int)wnd.SendMessage(TB_BUTTONCOUNT);\r
+               if(nCount <= 0)   // probably not a toolbar\r
+                       return false;\r
+\r
+               // check if it's a command bar\r
+               CMenuHandle menuCmdBar = (HMENU)wnd.SendMessage(CBRM_GETMENU);\r
+               cmi.bCmdBar = (menuCmdBar.m_hMenu != NULL);\r
+\r
+               // build a menu from hidden items\r
+               CMenuHandle menu;\r
+               bRet = menu.CreatePopupMenu();\r
+               ATLASSERT(bRet);\r
+               RECT rcClient = { 0 };\r
+               bRet = wnd.GetClientRect(&rcClient);\r
+               ATLASSERT(bRet);\r
+               for(int i = 0; i < nCount; i++)\r
+               {\r
+                       TBBUTTON tbb = { 0 };\r
+                       bRet = (BOOL)wnd.SendMessage(TB_GETBUTTON, i, (LPARAM)&tbb);\r
+                       ATLASSERT(bRet);\r
+                       // skip hidden buttons\r
+                       if((tbb.fsState & TBSTATE_HIDDEN) != 0)\r
+                               continue;\r
+                       RECT rcButton = { 0 };\r
+                       bRet = (BOOL)wnd.SendMessage(TB_GETITEMRECT, i, (LPARAM)&rcButton);\r
+                       ATLASSERT(bRet);\r
+                       bool bEnabled = ((tbb.fsState & TBSTATE_ENABLED) != 0);\r
+                       if(rcButton.right > rcClient.right)\r
+                       {\r
+                               if(tbb.fsStyle & BTNS_SEP)\r
+                               {\r
+                                       if(menu.GetMenuItemCount() > 0)\r
+                                               menu.AppendMenu(MF_SEPARATOR);\r
+                               }\r
+                               else if(cmi.bCmdBar)\r
+                               {\r
+                                       const int cchBuff = 200;\r
+                                       TCHAR szBuff[cchBuff] = { 0 };\r
+                                       CMenuItemInfo mii;\r
+                                       mii.fMask = MIIM_TYPE | MIIM_SUBMENU;\r
+                                       mii.dwTypeData = szBuff;\r
+                                       mii.cch = cchBuff;\r
+                                       bRet = menuCmdBar.GetMenuItemInfo(i, TRUE, &mii);\r
+                                       ATLASSERT(bRet);\r
+                                       // Note: CmdBar currently supports only drop-down items\r
+                                       ATLASSERT(::IsMenu(mii.hSubMenu));\r
+                                       bRet = menu.AppendMenu(MF_STRING | MF_POPUP | (bEnabled ? MF_ENABLED : MF_GRAYED), (UINT_PTR)mii.hSubMenu, mii.dwTypeData);\r
+                                       ATLASSERT(bRet);\r
+                               }\r
+                               else\r
+                               {\r
+                                       // get button's text\r
+                                       const int cchBuff = 200;\r
+                                       TCHAR szBuff[cchBuff] = { 0 };\r
+                                       LPTSTR lpstrText = szBuff;\r
+                                       TBBUTTONINFO tbbi = { 0 };\r
+                                       tbbi.cbSize = sizeof(TBBUTTONINFO);\r
+                                       tbbi.dwMask = TBIF_TEXT;\r
+                                       tbbi.pszText = szBuff;\r
+                                       tbbi.cchText = cchBuff;\r
+                                       if(wnd.SendMessage(TB_GETBUTTONINFO, tbb.idCommand, (LPARAM)&tbbi) == -1 || lstrlen(szBuff) == 0)\r
+                                       {\r
+                                               // no text for this button, try a resource string\r
+                                               lpstrText = _T("");\r
+                                               int nRet = ::LoadString(ModuleHelper::GetResourceInstance(), tbb.idCommand, szBuff, cchBuff);\r
+                                               for(int n = 0; n < nRet; n++)\r
+                                               {\r
+                                                       if(szBuff[n] == _T('\n'))\r
+                                                       {\r
+                                                               lpstrText = &szBuff[n + 1];\r
+                                                               break;\r
+                                                       }\r
+                                               }\r
+                                       }\r
+                                       bRet = menu.AppendMenu(MF_STRING | (bEnabled ? MF_ENABLED : MF_GRAYED), tbb.idCommand, lpstrText);\r
+                                       ATLASSERT(bRet);\r
+                               }\r
+                       }\r
+               }\r
+\r
+               if(menu.GetMenuItemCount() == 0)   // no hidden buttons after all\r
+               {\r
+                       menu.DestroyMenu();\r
+                       ::MessageBeep((UINT)-1);\r
+                       return false;\r
+               }\r
+\r
+               cmi.hMenu = menu;\r
+               return true;\r
+       }\r
+\r
+       void DisplayChevronMenu(_ChevronMenuInfo& cmi)\r
+       {\r
+#ifndef TPM_VERPOSANIMATION\r
+               const UINT TPM_VERPOSANIMATION = 0x1000L;   // Menu animation flag\r
+#endif\r
+               // convert chevron rect to screen coordinates\r
+               ATL::CWindow wndFrom = cmi.lpnm->hdr.hwndFrom;\r
+               POINT pt = { cmi.lpnm->rc.left, cmi.lpnm->rc.bottom };\r
+               wndFrom.MapWindowPoints(NULL, &pt, 1);\r
+               RECT rc = cmi.lpnm->rc;\r
+               wndFrom.MapWindowPoints(NULL, &rc);\r
+               // set up flags and rect\r
+               UINT uMenuFlags = TPM_LEFTBUTTON | TPM_VERTICAL | TPM_LEFTALIGN | TPM_TOPALIGN | (!AtlIsOldWindows() ? TPM_VERPOSANIMATION : 0);\r
+               TPMPARAMS TPMParams = { 0 };\r
+               TPMParams.cbSize = sizeof(TPMPARAMS);\r
+               TPMParams.rcExclude = rc;\r
+               // check if this window has a command bar\r
+               HWND hWndCmdBar = (HWND)::SendMessage(m_hWnd, CBRM_GETCMDBAR, 0, 0L);\r
+               if(::IsWindow(hWndCmdBar))\r
+               {\r
+                       CBRPOPUPMENU CBRPopupMenu = { sizeof(CBRPOPUPMENU), cmi.hMenu, uMenuFlags, pt.x, pt.y, &TPMParams };\r
+                       ::SendMessage(hWndCmdBar, CBRM_TRACKPOPUPMENU, 0, (LPARAM)&CBRPopupMenu);\r
+               }\r
+               else\r
+               {\r
+                       CMenuHandle menu = cmi.hMenu;\r
+                       menu.TrackPopupMenuEx(uMenuFlags, pt.x, pt.y, m_hWnd, &TPMParams);\r
+               }\r
+       }\r
+\r
+       void CleanupChevronMenu(_ChevronMenuInfo& cmi)\r
+       {\r
+               CMenuHandle menu = cmi.hMenu;\r
+               // if menu is from a command bar, detach submenus so they are not destroyed\r
+               if(cmi.bCmdBar)\r
+               {\r
+                       for(int i = menu.GetMenuItemCount() - 1; i >=0; i--)\r
+                               menu.RemoveMenu(i, MF_BYPOSITION);\r
+               }\r
+               // destroy menu\r
+               menu.DestroyMenu();\r
+               // convert chevron rect to screen coordinates\r
+               ATL::CWindow wndFrom = cmi.lpnm->hdr.hwndFrom;\r
+               RECT rc = cmi.lpnm->rc;\r
+               wndFrom.MapWindowPoints(NULL, &rc);\r
+               // eat next message if click is on the same button\r
+               MSG msg = { 0 };\r
+               if(::PeekMessage(&msg, m_hWnd, WM_LBUTTONDOWN, WM_LBUTTONDOWN, PM_NOREMOVE) && ::PtInRect(&rc, msg.pt))\r
+                       ::PeekMessage(&msg, m_hWnd, WM_LBUTTONDOWN, WM_LBUTTONDOWN, PM_REMOVE);\r
+       }\r
+#endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)\r
+};\r
+\r
+\r
+template <class T, class TBase = ATL::CWindow, class TWinTraits = ATL::CFrameWinTraits>\r
+class ATL_NO_VTABLE CFrameWindowImpl : public CFrameWindowImplBase< TBase, TWinTraits >\r
+{\r
+public:\r
+       HWND Create(HWND hWndParent = NULL, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,\r
+                       DWORD dwStyle = 0, DWORD dwExStyle = 0,\r
+                       HMENU hMenu = NULL, LPVOID lpCreateParam = NULL)\r
+       {\r
+               ATOM atom = T::GetWndClassInfo().Register(&m_pfnSuperWindowProc);\r
+\r
+               dwStyle = T::GetWndStyle(dwStyle);\r
+               dwExStyle = T::GetWndExStyle(dwExStyle);\r
+\r
+               if(rect.m_lpRect == NULL)\r
+                       rect.m_lpRect = &TBase::rcDefault;\r
+\r
+               return CFrameWindowImplBase< TBase, TWinTraits >::Create(hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, hMenu, atom, lpCreateParam);\r
+       }\r
+\r
+       HWND CreateEx(HWND hWndParent = NULL, ATL::_U_RECT rect = NULL, DWORD dwStyle = 0, DWORD dwExStyle = 0, LPVOID lpCreateParam = NULL)\r
+       {\r
+               const int cchName = 256;\r
+               TCHAR szWindowName[cchName];\r
+               szWindowName[0] = 0;\r
+#ifndef _WIN32_WCE\r
+               ::LoadString(ModuleHelper::GetResourceInstance(), T::GetWndClassInfo().m_uCommonResourceID, szWindowName, cchName);\r
+               HMENU hMenu = ::LoadMenu(ModuleHelper::GetResourceInstance(), MAKEINTRESOURCE(T::GetWndClassInfo().m_uCommonResourceID));\r
+#else // CE specific\r
+               ::LoadString(ModuleHelper::GetResourceInstance(), T::GetWndClassInfo().m_uCommonResourceID, szWindowName, cchName);\r
+\r
+               // This always needs to be NULL for Windows CE.\r
+               // Frame Window menus have to go onto the CommandBar.\r
+               // Use CreateSimpleCECommandBar\r
+               HMENU hMenu = NULL;\r
+#endif // _WIN32_WCE\r
+\r
+               T* pT = static_cast<T*>(this);\r
+               HWND hWnd = pT->Create(hWndParent, rect, szWindowName, dwStyle, dwExStyle, hMenu, lpCreateParam);\r
+\r
+               if(hWnd != NULL)\r
+                       m_hAccel = ::LoadAccelerators(ModuleHelper::GetResourceInstance(), MAKEINTRESOURCE(T::GetWndClassInfo().m_uCommonResourceID));\r
+\r
+               return hWnd;\r
+       }\r
+\r
+       BOOL CreateSimpleToolBar(UINT nResourceID = 0, DWORD dwStyle = ATL_SIMPLE_TOOLBAR_STYLE, UINT nID = ATL_IDW_TOOLBAR)\r
+       {\r
+               if(nResourceID == 0)\r
+                       nResourceID = T::GetWndClassInfo().m_uCommonResourceID;\r
+#ifndef _WIN32_WCE\r
+               ATLASSERT(!::IsWindow(m_hWndToolBar));\r
+               m_hWndToolBar = T::CreateSimpleToolBarCtrl(m_hWnd, nResourceID, TRUE, dwStyle, nID);\r
+               return (m_hWndToolBar != NULL);\r
+#else // CE specific\r
+               HWND hWnd= T::CreateSimpleToolBarCtrl(m_hWndCECommandBar, nResourceID, TRUE, dwStyle, nID);\r
+               return (hWnd != NULL);\r
+#endif // _WIN32_WCE\r
+       }\r
+\r
+#ifdef _WIN32_WCE\r
+       // CE specific variant that returns the handle of the toolbar\r
+       HWND CreateSimpleCEToolBar(UINT nResourceID = 0, DWORD dwStyle = ATL_SIMPLE_TOOLBAR_STYLE, UINT nID = ATL_IDW_TOOLBAR)\r
+       {\r
+               if(nResourceID == 0)\r
+                       nResourceID = T::GetWndClassInfo().m_uCommonResourceID;\r
+\r
+               return T::CreateSimpleToolBarCtrl(m_hWndCECommandBar, nResourceID, TRUE, dwStyle, nID);\r
+       }\r
+#endif // _WIN32_WCE\r
+\r
+// message map and handlers\r
+       typedef CFrameWindowImplBase< TBase, TWinTraits >   _baseClass;\r
+\r
+       BEGIN_MSG_MAP(CFrameWindowImpl)\r
+               MESSAGE_HANDLER(WM_SIZE, OnSize)\r
+#ifndef _ATL_NO_REBAR_SUPPORT\r
+#if (_WIN32_IE >= 0x0400)\r
+               NOTIFY_CODE_HANDLER(RBN_AUTOSIZE, OnReBarAutoSize)\r
+#endif // (_WIN32_IE >= 0x0400)\r
+#if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)\r
+               NOTIFY_CODE_HANDLER(RBN_CHEVRONPUSHED, OnChevronPushed)\r
+#endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)\r
+#endif // !_ATL_NO_REBAR_SUPPORT\r
+               CHAIN_MSG_MAP(_baseClass)\r
+       END_MSG_MAP()\r
+\r
+       LRESULT OnSize(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)\r
+       {\r
+               if(wParam != SIZE_MINIMIZED)\r
+               {\r
+                       T* pT = static_cast<T*>(this);\r
+                       pT->UpdateLayout();\r
+               }\r
+               bHandled = FALSE;\r
+               return 1;\r
+       }\r
+\r
+#ifndef _ATL_NO_REBAR_SUPPORT\r
+#if (_WIN32_IE >= 0x0400)\r
+       LRESULT OnReBarAutoSize(int /*idCtrl*/, LPNMHDR /*pnmh*/, BOOL& /*bHandled*/)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               pT->UpdateLayout(FALSE);\r
+               return 0;\r
+       }\r
+#endif // (_WIN32_IE >= 0x0400)\r
+\r
+#if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)\r
+       LRESULT OnChevronPushed(int /*idCtrl*/, LPNMHDR pnmh, BOOL& bHandled)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               _ChevronMenuInfo cmi = { NULL, (LPNMREBARCHEVRON)pnmh, false };\r
+               if(!pT->PrepareChevronMenu(cmi))\r
+               {\r
+                       bHandled = FALSE;\r
+                       return 1;\r
+               }\r
+               // display a popup menu with hidden items\r
+               pT->DisplayChevronMenu(cmi);\r
+               // cleanup\r
+               pT->CleanupChevronMenu(cmi);\r
+               return 0;\r
+       }\r
+#endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)\r
+#endif // !_ATL_NO_REBAR_SUPPORT\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// AtlCreateSimpleToolBar - helper for creating simple toolbars\r
+\r
+#ifndef _WIN32_WCE\r
+\r
+inline HWND AtlCreateSimpleToolBar(HWND hWndParent, UINT nResourceID, BOOL bInitialSeparator = FALSE, \r
+               DWORD dwStyle = ATL_SIMPLE_TOOLBAR_STYLE, UINT nID = ATL_IDW_TOOLBAR)\r
+{\r
+       return CFrameWindowImplBase<>::CreateSimpleToolBarCtrl(hWndParent, nResourceID, bInitialSeparator, dwStyle, nID);\r
+}\r
+\r
+#endif // !_WIN32_WCE\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CMDIWindow\r
+\r
+#ifndef _WIN32_WCE\r
+\r
+#ifndef _WTL_MDIWINDOWMENU_TEXT\r
+#define _WTL_MDIWINDOWMENU_TEXT        _T("&Window")\r
+#endif\r
+\r
+class CMDIWindow : public ATL::CWindow\r
+{\r
+public:\r
+// Data members\r
+       HWND m_hWndMDIClient;\r
+       HMENU m_hMenu;\r
+\r
+// Constructors\r
+       CMDIWindow(HWND hWnd = NULL) : ATL::CWindow(hWnd), m_hWndMDIClient(NULL), m_hMenu(NULL)\r
+       { }\r
+\r
+       CMDIWindow& operator =(HWND hWnd)\r
+       {\r
+               m_hWnd = hWnd;\r
+               return *this;\r
+       }\r
+\r
+// Operations\r
+       HWND MDIGetActive(BOOL* lpbMaximized = NULL)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWndMDIClient));\r
+               return (HWND)::SendMessage(m_hWndMDIClient, WM_MDIGETACTIVE, 0, (LPARAM)lpbMaximized);\r
+       }\r
+\r
+       void MDIActivate(HWND hWndChildToActivate)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWndMDIClient));\r
+               ATLASSERT(::IsWindow(hWndChildToActivate));\r
+               ::SendMessage(m_hWndMDIClient, WM_MDIACTIVATE, (WPARAM)hWndChildToActivate, 0);\r
+       }\r
+\r
+       void MDINext(HWND hWndChild, BOOL bPrevious = FALSE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWndMDIClient));\r
+               ATLASSERT(hWndChild == NULL || ::IsWindow(hWndChild));\r
+               ::SendMessage(m_hWndMDIClient, WM_MDINEXT, (WPARAM)hWndChild, (LPARAM)bPrevious);\r
+       }\r
+\r
+       void MDIMaximize(HWND hWndChildToMaximize)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWndMDIClient));\r
+               ATLASSERT(::IsWindow(hWndChildToMaximize));\r
+               ::SendMessage(m_hWndMDIClient, WM_MDIMAXIMIZE, (WPARAM)hWndChildToMaximize, 0);\r
+       }\r
+\r
+       void MDIRestore(HWND hWndChildToRestore)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWndMDIClient));\r
+               ATLASSERT(::IsWindow(hWndChildToRestore));\r
+               ::SendMessage(m_hWndMDIClient, WM_MDIRESTORE, (WPARAM)hWndChildToRestore, 0);\r
+       }\r
+\r
+       void MDIDestroy(HWND hWndChildToDestroy)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWndMDIClient));\r
+               ATLASSERT(::IsWindow(hWndChildToDestroy));\r
+               ::SendMessage(m_hWndMDIClient, WM_MDIDESTROY, (WPARAM)hWndChildToDestroy, 0);\r
+       }\r
+\r
+       BOOL MDICascade(UINT uFlags = 0)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWndMDIClient));\r
+               return (BOOL)::SendMessage(m_hWndMDIClient, WM_MDICASCADE, (WPARAM)uFlags, 0);\r
+       }\r
+\r
+       BOOL MDITile(UINT uFlags = MDITILE_HORIZONTAL)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWndMDIClient));\r
+               return (BOOL)::SendMessage(m_hWndMDIClient, WM_MDITILE, (WPARAM)uFlags, 0);\r
+       }\r
+\r
+       void MDIIconArrange()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWndMDIClient));\r
+               ::SendMessage(m_hWndMDIClient, WM_MDIICONARRANGE, 0, 0);\r
+       }\r
+\r
+       HMENU MDISetMenu(HMENU hMenuFrame, HMENU hMenuWindow)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWndMDIClient));\r
+               return (HMENU)::SendMessage(m_hWndMDIClient, WM_MDISETMENU, (WPARAM)hMenuFrame, (LPARAM)hMenuWindow);\r
+       }\r
+\r
+       HMENU MDIRefreshMenu()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWndMDIClient));\r
+               return (HMENU)::SendMessage(m_hWndMDIClient, WM_MDIREFRESHMENU, 0, 0);\r
+       }\r
+\r
+// Additional operations\r
+       static HMENU GetStandardWindowMenu(HMENU hMenu)\r
+       {\r
+               int nCount = ::GetMenuItemCount(hMenu);\r
+               if(nCount == -1)\r
+                       return NULL;\r
+               int nLen = ::GetMenuString(hMenu, nCount - 2, NULL, 0, MF_BYPOSITION);\r
+               if(nLen == 0)\r
+                       return NULL;\r
+               CTempBuffer<TCHAR, _WTL_STACK_ALLOC_THRESHOLD> buff;\r
+               LPTSTR lpszText = buff.Allocate(nLen + 1);\r
+               if(lpszText == NULL)\r
+                       return NULL;\r
+               if(::GetMenuString(hMenu, nCount - 2, lpszText, nLen + 1, MF_BYPOSITION) != nLen)\r
+                       return NULL;\r
+               if(lstrcmp(lpszText, _WTL_MDIWINDOWMENU_TEXT) != 0)\r
+                       return NULL;\r
+               return ::GetSubMenu(hMenu, nCount - 2);\r
+       }\r
+\r
+       void SetMDIFrameMenu()\r
+       {\r
+               HMENU hWindowMenu = GetStandardWindowMenu(m_hMenu);\r
+               MDISetMenu(m_hMenu, hWindowMenu);\r
+               MDIRefreshMenu();\r
+               ::DrawMenuBar(GetMDIFrame());\r
+       }\r
+\r
+       HWND GetMDIFrame() const\r
+       {\r
+               return ::GetParent(m_hWndMDIClient);\r
+       }\r
+};\r
+\r
+#endif // !_WIN32_WCE\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CMDIFrameWindowImpl\r
+\r
+#ifndef _WIN32_WCE\r
+\r
+// MDI child command chaining macro (only for MDI frame windows)\r
+#define CHAIN_MDI_CHILD_COMMANDS() \\r
+       if(uMsg == WM_COMMAND) \\r
+       { \\r
+               HWND hWndChild = MDIGetActive(); \\r
+               if(hWndChild != NULL) \\r
+                       ::SendMessage(hWndChild, uMsg, wParam, lParam); \\r
+       }\r
+\r
+template <class T, class TBase = CMDIWindow, class TWinTraits = ATL::CFrameWinTraits>\r
+class ATL_NO_VTABLE CMDIFrameWindowImpl : public CFrameWindowImplBase<TBase, TWinTraits >\r
+{\r
+public:\r
+       HWND Create(HWND hWndParent = NULL, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,\r
+                       DWORD dwStyle = 0, DWORD dwExStyle = 0,\r
+                       HMENU hMenu = NULL, LPVOID lpCreateParam = NULL)\r
+       {\r
+               m_hMenu = hMenu;\r
+               ATOM atom = T::GetWndClassInfo().Register(&m_pfnSuperWindowProc);\r
+\r
+               dwStyle = T::GetWndStyle(dwStyle);\r
+               dwExStyle = T::GetWndExStyle(dwExStyle);\r
+\r
+               if(rect.m_lpRect == NULL)\r
+                       rect.m_lpRect = &TBase::rcDefault;\r
+\r
+               return CFrameWindowImplBase<TBase, TWinTraits >::Create(hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, hMenu, atom, lpCreateParam);\r
+       }\r
+\r
+       HWND CreateEx(HWND hWndParent = NULL, ATL::_U_RECT rect = NULL, DWORD dwStyle = 0, DWORD dwExStyle = 0, LPVOID lpCreateParam = NULL)\r
+       {\r
+               const int cchName = 256;\r
+               TCHAR szWindowName[cchName];\r
+               szWindowName[0] = 0;\r
+               ::LoadString(ModuleHelper::GetResourceInstance(), T::GetWndClassInfo().m_uCommonResourceID, szWindowName, cchName);\r
+               HMENU hMenu = ::LoadMenu(ModuleHelper::GetResourceInstance(), MAKEINTRESOURCE(T::GetWndClassInfo().m_uCommonResourceID));\r
+\r
+               T* pT = static_cast<T*>(this);\r
+               HWND hWnd = pT->Create(hWndParent, rect, szWindowName, dwStyle, dwExStyle, hMenu, lpCreateParam);\r
+\r
+               if(hWnd != NULL)\r
+                       m_hAccel = ::LoadAccelerators(ModuleHelper::GetResourceInstance(), MAKEINTRESOURCE(T::GetWndClassInfo().m_uCommonResourceID));\r
+\r
+               return hWnd;\r
+       }\r
+\r
+       BOOL CreateSimpleToolBar(UINT nResourceID = 0, DWORD dwStyle = ATL_SIMPLE_TOOLBAR_STYLE, UINT nID = ATL_IDW_TOOLBAR)\r
+       {\r
+               ATLASSERT(!::IsWindow(m_hWndToolBar));\r
+               if(nResourceID == 0)\r
+                       nResourceID = T::GetWndClassInfo().m_uCommonResourceID;\r
+               m_hWndToolBar = T::CreateSimpleToolBarCtrl(m_hWnd, nResourceID, TRUE, dwStyle, nID);\r
+               return (m_hWndToolBar != NULL);\r
+       }\r
+\r
+       virtual WNDPROC GetWindowProc()\r
+       {\r
+               return MDIFrameWindowProc;\r
+       }\r
+\r
+       static LRESULT CALLBACK MDIFrameWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)\r
+       {\r
+               CMDIFrameWindowImpl< T, TBase, TWinTraits >* pThis = (CMDIFrameWindowImpl< T, TBase, TWinTraits >*)hWnd;\r
+               // set a ptr to this message and save the old value\r
+#if (_ATL_VER >= 0x0700)\r
+               ATL::_ATL_MSG msg(pThis->m_hWnd, uMsg, wParam, lParam);\r
+               const ATL::_ATL_MSG* pOldMsg = pThis->m_pCurrentMsg;\r
+#else // !(_ATL_VER >= 0x0700)\r
+               MSG msg = { pThis->m_hWnd, uMsg, wParam, lParam, 0, { 0, 0 } };\r
+               const MSG* pOldMsg = pThis->m_pCurrentMsg;\r
+#endif // !(_ATL_VER >= 0x0700)\r
+               pThis->m_pCurrentMsg = &msg;\r
+               // pass to the message map to process\r
+               LRESULT lRes = 0;\r
+               BOOL bRet = pThis->ProcessWindowMessage(pThis->m_hWnd, uMsg, wParam, lParam, lRes, 0);\r
+               // restore saved value for the current message\r
+               ATLASSERT(pThis->m_pCurrentMsg == &msg);\r
+               pThis->m_pCurrentMsg = pOldMsg;\r
+               // do the default processing if message was not handled\r
+               if(!bRet)\r
+               {\r
+                       if(uMsg != WM_NCDESTROY)\r
+                               lRes = pThis->DefWindowProc(uMsg, wParam, lParam);\r
+                       else\r
+                       {\r
+                               // unsubclass, if needed\r
+                               LONG_PTR pfnWndProc = ::GetWindowLongPtr(pThis->m_hWnd, GWLP_WNDPROC);\r
+                               lRes = pThis->DefWindowProc(uMsg, wParam, lParam);\r
+                               if(pThis->m_pfnSuperWindowProc != ::DefWindowProc && ::GetWindowLongPtr(pThis->m_hWnd, GWLP_WNDPROC) == pfnWndProc)\r
+                                       ::SetWindowLongPtr(pThis->m_hWnd, GWLP_WNDPROC, (LONG_PTR)pThis->m_pfnSuperWindowProc);\r
+#if (_ATL_VER >= 0x0700)\r
+                               // mark window as destryed\r
+                               pThis->m_dwState |= WINSTATE_DESTROYED;\r
+#else // !(_ATL_VER >= 0x0700)\r
+                               // clear out window handle\r
+                               HWND hWnd = pThis->m_hWnd;\r
+                               pThis->m_hWnd = NULL;\r
+                               // clean up after window is destroyed\r
+                               pThis->OnFinalMessage(hWnd);\r
+#endif // !(_ATL_VER >= 0x0700)\r
+                       }\r
+               }\r
+#if (_ATL_VER >= 0x0700)\r
+               if(pThis->m_dwState & WINSTATE_DESTROYED && pThis->m_pCurrentMsg == NULL)\r
+               {\r
+                       // clear out window handle\r
+                       HWND hWnd = pThis->m_hWnd;\r
+                       pThis->m_hWnd = NULL;\r
+                       pThis->m_dwState &= ~WINSTATE_DESTROYED;\r
+                       // clean up after window is destroyed\r
+                       pThis->OnFinalMessage(hWnd);\r
+               }\r
+#endif // (_ATL_VER >= 0x0700)\r
+               return lRes;\r
+       }\r
+\r
+       // Overriden to call DefWindowProc which uses DefFrameProc\r
+       LRESULT DefWindowProc()\r
+       {\r
+               const MSG* pMsg = m_pCurrentMsg;\r
+               LRESULT lRes = 0;\r
+               if (pMsg != NULL)\r
+                       lRes = DefWindowProc(pMsg->message, pMsg->wParam, pMsg->lParam);\r
+               return lRes;\r
+       }\r
+\r
+       LRESULT DefWindowProc(UINT uMsg, WPARAM wParam, LPARAM lParam)\r
+       {\r
+               return ::DefFrameProc(m_hWnd, m_hWndMDIClient, uMsg, wParam, lParam);\r
+       }\r
+\r
+       BOOL PreTranslateMessage(MSG* pMsg)\r
+       {\r
+               if(CFrameWindowImplBase<TBase, TWinTraits>::PreTranslateMessage(pMsg))\r
+                       return TRUE;\r
+               return ::TranslateMDISysAccel(m_hWndMDIClient, pMsg);\r
+       }\r
+\r
+       HWND CreateMDIClient(HMENU hWindowMenu = NULL, UINT nID = ATL_IDW_CLIENT, UINT nFirstChildID = ATL_IDM_FIRST_MDICHILD)\r
+       {\r
+               DWORD dwStyle = WS_VISIBLE | WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | MDIS_ALLCHILDSTYLES;\r
+               DWORD dwExStyle = WS_EX_CLIENTEDGE;\r
+\r
+               CLIENTCREATESTRUCT ccs = { 0 };\r
+               ccs.hWindowMenu = hWindowMenu;\r
+               ccs.idFirstChild = nFirstChildID;\r
+\r
+               if((GetStyle() & (WS_HSCROLL | WS_VSCROLL)) != 0)\r
+               {\r
+                       // parent MDI frame's scroll styles move to the MDICLIENT\r
+                       dwStyle |= (GetStyle() & (WS_HSCROLL | WS_VSCROLL));\r
+\r
+                       // fast way to turn off the scrollbar bits (without a resize)\r
+                       ModifyStyle(WS_HSCROLL | WS_VSCROLL, 0, SWP_NOREDRAW | SWP_FRAMECHANGED);\r
+               }\r
+\r
+               // Create MDICLIENT window\r
+               m_hWndClient = ::CreateWindowEx(dwExStyle, _T("MDIClient"), NULL,\r
+                       dwStyle, 0, 0, 1, 1, m_hWnd, (HMENU)LongToHandle(nID),\r
+                       ModuleHelper::GetModuleInstance(), (LPVOID)&ccs);\r
+               if (m_hWndClient == NULL)\r
+               {\r
+                       ATLTRACE2(atlTraceUI, 0, _T("MDI Frame failed to create MDICLIENT.\n"));\r
+                       return NULL;\r
+               }\r
+\r
+               // Move it to the top of z-order\r
+               ::BringWindowToTop(m_hWndClient);\r
+\r
+               // set as MDI client window\r
+               m_hWndMDIClient = m_hWndClient;\r
+\r
+               // update to proper size\r
+               T* pT = static_cast<T*>(this);\r
+               pT->UpdateLayout();\r
+\r
+               return m_hWndClient;\r
+       }\r
+\r
+       typedef CFrameWindowImplBase<TBase, TWinTraits >   _baseClass;\r
+\r
+       BEGIN_MSG_MAP(CMDIFrameWindowImpl)\r
+               MESSAGE_HANDLER(WM_SIZE, OnSize)\r
+               MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)\r
+               MESSAGE_HANDLER(WM_MDISETMENU, OnMDISetMenu)\r
+#ifndef _ATL_NO_REBAR_SUPPORT\r
+#if (_WIN32_IE >= 0x0400)\r
+               NOTIFY_CODE_HANDLER(RBN_AUTOSIZE, OnReBarAutoSize)\r
+#endif // (_WIN32_IE >= 0x0400)\r
+#if (_WIN32_IE >= 0x0500)\r
+               NOTIFY_CODE_HANDLER(RBN_CHEVRONPUSHED, OnChevronPushed)\r
+#endif // (_WIN32_IE >= 0x0500)\r
+#endif // !_ATL_NO_REBAR_SUPPORT\r
+               CHAIN_MSG_MAP(_baseClass)\r
+       END_MSG_MAP()\r
+\r
+       LRESULT OnSize(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)\r
+       {\r
+               if(wParam != SIZE_MINIMIZED)\r
+               {\r
+                       T* pT = static_cast<T*>(this);\r
+                       pT->UpdateLayout();\r
+               }\r
+               // message must be handled, otherwise DefFrameProc would resize the client again\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnSetFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)\r
+       {\r
+               // don't allow CFrameWindowImplBase to handle this one\r
+               return DefWindowProc(uMsg, wParam, lParam);\r
+       }\r
+\r
+       LRESULT OnMDISetMenu(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)\r
+       {\r
+               SetMDIFrameMenu();\r
+               return 0;\r
+       }\r
+\r
+#ifndef _ATL_NO_REBAR_SUPPORT\r
+#if (_WIN32_IE >= 0x0400)\r
+       LRESULT OnReBarAutoSize(int /*idCtrl*/, LPNMHDR /*pnmh*/, BOOL& /*bHandled*/)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               pT->UpdateLayout(FALSE);\r
+               return 0;\r
+       }\r
+#endif // (_WIN32_IE >= 0x0400)\r
+\r
+#if (_WIN32_IE >= 0x0500)\r
+       LRESULT OnChevronPushed(int /*idCtrl*/, LPNMHDR pnmh, BOOL& bHandled)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               _ChevronMenuInfo cmi = { NULL, (LPNMREBARCHEVRON)pnmh, false };\r
+               if(!pT->PrepareChevronMenu(cmi))\r
+               {\r
+                       bHandled = FALSE;\r
+                       return 1;\r
+               }\r
+               // display a popup menu with hidden items\r
+               pT->DisplayChevronMenu(cmi);\r
+               // cleanup\r
+               pT->CleanupChevronMenu(cmi);\r
+               return 0;\r
+       }\r
+#endif // (_WIN32_IE >= 0x0500)\r
+#endif // !_ATL_NO_REBAR_SUPPORT\r
+};\r
+\r
+#endif // !_WIN32_WCE\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CMDIChildWindowImpl\r
+\r
+#ifndef _WIN32_WCE\r
+\r
+template <class T, class TBase = CMDIWindow, class TWinTraits = ATL::CMDIChildWinTraits>\r
+class ATL_NO_VTABLE CMDIChildWindowImpl : public CFrameWindowImplBase<TBase, TWinTraits >\r
+{\r
+public:\r
+       HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,\r
+                       DWORD dwStyle = 0, DWORD dwExStyle = 0,\r
+                       UINT nMenuID = 0, LPVOID lpCreateParam = NULL)\r
+       {\r
+               ATOM atom = T::GetWndClassInfo().Register(&m_pfnSuperWindowProc);\r
+\r
+               if(nMenuID != 0)\r
+                       m_hMenu = ::LoadMenu(ModuleHelper::GetResourceInstance(), MAKEINTRESOURCE(nMenuID));\r
+\r
+               dwStyle = T::GetWndStyle(dwStyle);\r
+               dwExStyle = T::GetWndExStyle(dwExStyle);\r
+\r
+               dwExStyle |= WS_EX_MDICHILD;   // force this one\r
+               m_pfnSuperWindowProc = ::DefMDIChildProc;\r
+               m_hWndMDIClient = hWndParent;\r
+               ATLASSERT(::IsWindow(m_hWndMDIClient));\r
+\r
+               if(rect.m_lpRect == NULL)\r
+                       rect.m_lpRect = &TBase::rcDefault;\r
+\r
+               // If the currently active MDI child is maximized, we want to create this one maximized too\r
+               ATL::CWindow wndParent = hWndParent;\r
+               BOOL bMaximized = FALSE;\r
+               wndParent.SendMessage(WM_MDIGETACTIVE, 0, (LPARAM)&bMaximized);\r
+               if(bMaximized)\r
+                       wndParent.SetRedraw(FALSE);\r
+\r
+               HWND hWnd = CFrameWindowImplBase<TBase, TWinTraits >::Create(hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, (UINT)0U, atom, lpCreateParam);\r
+\r
+               if(bMaximized)\r
+               {\r
+                       // Maximize and redraw everything\r
+                       if(hWnd != NULL)\r
+                               MDIMaximize(hWnd);\r
+                       wndParent.SetRedraw(TRUE);\r
+                       wndParent.RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN);\r
+                       ::SetFocus(GetMDIFrame());   // focus will be set back to this window\r
+               }\r
+               else if(hWnd != NULL && ::IsWindowVisible(m_hWnd) && !::IsChild(hWnd, ::GetFocus()))\r
+               {\r
+                       ::SetFocus(hWnd);\r
+               }\r
+\r
+               return hWnd;\r
+       }\r
+\r
+       HWND CreateEx(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR lpcstrWindowName = NULL, DWORD dwStyle = 0, DWORD dwExStyle = 0, LPVOID lpCreateParam = NULL)\r
+       {\r
+               const int cchName = 256;\r
+               TCHAR szWindowName[cchName];\r
+               szWindowName[0] = 0;\r
+               if(lpcstrWindowName == NULL)\r
+               {\r
+                       ::LoadString(ModuleHelper::GetResourceInstance(), T::GetWndClassInfo().m_uCommonResourceID, szWindowName, cchName);\r
+                       lpcstrWindowName = szWindowName;\r
+               }\r
+\r
+               T* pT = static_cast<T*>(this);\r
+               HWND hWnd = pT->Create(hWndParent, rect, lpcstrWindowName, dwStyle, dwExStyle, T::GetWndClassInfo().m_uCommonResourceID, lpCreateParam);\r
+\r
+               if(hWnd != NULL)\r
+                       m_hAccel = ::LoadAccelerators(ModuleHelper::GetResourceInstance(), MAKEINTRESOURCE(T::GetWndClassInfo().m_uCommonResourceID));\r
+\r
+               return hWnd;\r
+       }\r
+\r
+       BOOL CreateSimpleToolBar(UINT nResourceID = 0, DWORD dwStyle = ATL_SIMPLE_TOOLBAR_STYLE, UINT nID = ATL_IDW_TOOLBAR)\r
+       {\r
+               ATLASSERT(!::IsWindow(m_hWndToolBar));\r
+               if(nResourceID == 0)\r
+                       nResourceID = T::GetWndClassInfo().m_uCommonResourceID;\r
+               m_hWndToolBar = T::CreateSimpleToolBarCtrl(m_hWnd, nResourceID, TRUE, dwStyle, nID);\r
+               return (m_hWndToolBar != NULL);\r
+       }\r
+\r
+       BOOL UpdateClientEdge(LPRECT lpRect = NULL)\r
+       {\r
+               // only adjust for active MDI child window\r
+               HWND hWndChild = MDIGetActive();\r
+               if(hWndChild != NULL && hWndChild != m_hWnd)\r
+                       return FALSE;\r
+\r
+               // need to adjust the client edge style as max/restore happens\r
+               DWORD dwStyle = ::GetWindowLong(m_hWndMDIClient, GWL_EXSTYLE);\r
+               DWORD dwNewStyle = dwStyle;\r
+               if(hWndChild != NULL && ((GetExStyle() & WS_EX_CLIENTEDGE) == 0) && ((GetStyle() & WS_MAXIMIZE) != 0))\r
+                       dwNewStyle &= ~(WS_EX_CLIENTEDGE);\r
+               else\r
+                       dwNewStyle |= WS_EX_CLIENTEDGE;\r
+\r
+               if(dwStyle != dwNewStyle)\r
+               {\r
+                       // SetWindowPos will not move invalid bits\r
+                       ::RedrawWindow(m_hWndMDIClient, NULL, NULL,\r
+                               RDW_INVALIDATE | RDW_ALLCHILDREN);\r
+                       // remove/add WS_EX_CLIENTEDGE to MDI client area\r
+                       ::SetWindowLong(m_hWndMDIClient, GWL_EXSTYLE, dwNewStyle);\r
+                       ::SetWindowPos(m_hWndMDIClient, NULL, 0, 0, 0, 0,\r
+                               SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE |\r
+                               SWP_NOZORDER | SWP_NOCOPYBITS);\r
+\r
+                       // return new client area\r
+                       if (lpRect != NULL)\r
+                               ::GetClientRect(m_hWndMDIClient, lpRect);\r
+\r
+                       return TRUE;\r
+               }\r
+\r
+               return FALSE;\r
+       }\r
+\r
+       typedef CFrameWindowImplBase<TBase, TWinTraits >   _baseClass;\r
+       BEGIN_MSG_MAP(CMDIChildWindowImpl)\r
+               MESSAGE_HANDLER(WM_SIZE, OnSize)\r
+               MESSAGE_HANDLER(WM_WINDOWPOSCHANGED, OnWindowPosChanged)\r
+               MESSAGE_HANDLER(WM_MOUSEACTIVATE, OnMouseActivate)\r
+               MESSAGE_HANDLER(WM_MENUSELECT, OnMenuSelect)\r
+               MESSAGE_HANDLER(WM_MDIACTIVATE, OnMDIActivate)\r
+               MESSAGE_HANDLER(WM_DESTROY, OnDestroy)\r
+#ifndef _ATL_NO_REBAR_SUPPORT\r
+#if (_WIN32_IE >= 0x0400)\r
+               NOTIFY_CODE_HANDLER(RBN_AUTOSIZE, OnReBarAutoSize)\r
+#endif // (_WIN32_IE >= 0x0400)\r
+#if (_WIN32_IE >= 0x0500)\r
+               NOTIFY_CODE_HANDLER(RBN_CHEVRONPUSHED, OnChevronPushed)\r
+#endif // (_WIN32_IE >= 0x0500)\r
+#endif // !_ATL_NO_REBAR_SUPPORT\r
+               CHAIN_MSG_MAP(_baseClass)\r
+       END_MSG_MAP()\r
+\r
+       LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)\r
+       {\r
+               DefWindowProc(uMsg, wParam, lParam);   // needed for MDI children\r
+               if(wParam != SIZE_MINIMIZED)\r
+               {\r
+                       T* pT = static_cast<T*>(this);\r
+                       pT->UpdateLayout();\r
+               }\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnWindowPosChanged(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled)\r
+       {\r
+               // update MDI client edge and adjust MDI child rect\r
+               LPWINDOWPOS lpWndPos = (LPWINDOWPOS)lParam;\r
+\r
+               if(!(lpWndPos->flags & SWP_NOSIZE))\r
+               {\r
+                       RECT rectClient;\r
+                       if(UpdateClientEdge(&rectClient) && ((GetStyle() & WS_MAXIMIZE) != 0))\r
+                       {\r
+                               ::AdjustWindowRectEx(&rectClient, GetStyle(), FALSE, GetExStyle());\r
+                               lpWndPos->x = rectClient.left;\r
+                               lpWndPos->y = rectClient.top;\r
+                               lpWndPos->cx = rectClient.right - rectClient.left;\r
+                               lpWndPos->cy = rectClient.bottom - rectClient.top;\r
+                       }\r
+               }\r
+\r
+               bHandled = FALSE;\r
+               return 1;\r
+       }\r
+\r
+       LRESULT OnMouseActivate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)\r
+       {\r
+               LRESULT lRes = DefWindowProc(uMsg, wParam, lParam);\r
+\r
+               // Activate this MDI window if needed\r
+               if(lRes == MA_ACTIVATE || lRes == MA_ACTIVATEANDEAT)\r
+               {\r
+                       if(MDIGetActive() != m_hWnd)\r
+                               MDIActivate(m_hWnd);\r
+               }\r
+\r
+               return lRes;\r
+       }\r
+\r
+       LRESULT OnMenuSelect(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)\r
+       {\r
+               return ::SendMessage(GetMDIFrame(), uMsg, wParam, lParam);\r
+       }\r
+\r
+       LRESULT OnMDIActivate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled)\r
+       {\r
+               if((HWND)lParam == m_hWnd && m_hMenu != NULL)\r
+                       SetMDIFrameMenu();\r
+               else if((HWND)lParam == NULL)\r
+                       ::SendMessage(GetMDIFrame(), WM_MDISETMENU, 0, 0);\r
+\r
+               bHandled = FALSE;\r
+               return 1;\r
+       }\r
+\r
+       LRESULT OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)\r
+       {\r
+               if(m_hMenu != NULL)\r
+               {\r
+                       ::DestroyMenu(m_hMenu);\r
+                       m_hMenu = NULL;\r
+               }\r
+               UpdateClientEdge();\r
+               bHandled = FALSE;\r
+               return 1;\r
+       }\r
+\r
+#ifndef _ATL_NO_REBAR_SUPPORT\r
+#if (_WIN32_IE >= 0x0400)\r
+       LRESULT OnReBarAutoSize(int /*idCtrl*/, LPNMHDR /*pnmh*/, BOOL& /*bHandled*/)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               pT->UpdateLayout(FALSE);\r
+               return 0;\r
+       }\r
+#endif // (_WIN32_IE >= 0x0400)\r
+\r
+#if (_WIN32_IE >= 0x0500)\r
+       LRESULT OnChevronPushed(int /*idCtrl*/, LPNMHDR pnmh, BOOL& bHandled)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               _ChevronMenuInfo cmi = { NULL, (LPNMREBARCHEVRON)pnmh, false };\r
+               if(!pT->PrepareChevronMenu(cmi))\r
+               {\r
+                       bHandled = FALSE;\r
+                       return 1;\r
+               }\r
+               // display a popup menu with hidden items\r
+               pT->DisplayChevronMenu(cmi);\r
+               // cleanup\r
+               pT->CleanupChevronMenu(cmi);\r
+               return 0;\r
+       }\r
+#endif // (_WIN32_IE >= 0x0500)\r
+#endif // !_ATL_NO_REBAR_SUPPORT\r
+};\r
+\r
+#endif // !_WIN32_WCE\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// COwnerDraw - MI class for owner-draw support\r
+\r
+template <class T>\r
+class COwnerDraw\r
+{\r
+public:\r
+#if (_ATL_VER < 0x0700)\r
+       BOOL m_bHandledOD;\r
+\r
+       BOOL IsMsgHandled() const\r
+       {\r
+               return m_bHandledOD;\r
+       }\r
+       void SetMsgHandled(BOOL bHandled)\r
+       {\r
+               m_bHandledOD = bHandled;\r
+       }\r
+#endif // (_ATL_VER < 0x0700)\r
+\r
+// Message map and handlers\r
+       BEGIN_MSG_MAP(COwnerDraw< T >)\r
+               MESSAGE_HANDLER(WM_DRAWITEM, OnDrawItem)\r
+               MESSAGE_HANDLER(WM_MEASUREITEM, OnMeasureItem)\r
+               MESSAGE_HANDLER(WM_COMPAREITEM, OnCompareItem)\r
+               MESSAGE_HANDLER(WM_DELETEITEM, OnDeleteItem)\r
+       ALT_MSG_MAP(1)\r
+               MESSAGE_HANDLER(OCM_DRAWITEM, OnDrawItem)\r
+               MESSAGE_HANDLER(OCM_MEASUREITEM, OnMeasureItem)\r
+               MESSAGE_HANDLER(OCM_COMPAREITEM, OnCompareItem)\r
+               MESSAGE_HANDLER(OCM_DELETEITEM, OnDeleteItem)\r
+       END_MSG_MAP()\r
+\r
+       LRESULT OnDrawItem(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               pT->SetMsgHandled(TRUE);\r
+               pT->DrawItem((LPDRAWITEMSTRUCT)lParam);\r
+               bHandled = pT->IsMsgHandled();\r
+               return (LRESULT)TRUE;\r
+       }\r
+\r
+       LRESULT OnMeasureItem(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               pT->SetMsgHandled(TRUE);\r
+               pT->MeasureItem((LPMEASUREITEMSTRUCT)lParam);\r
+               bHandled = pT->IsMsgHandled();\r
+               return (LRESULT)TRUE;\r
+       }\r
+\r
+       LRESULT OnCompareItem(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               pT->SetMsgHandled(TRUE);\r
+               bHandled = pT->IsMsgHandled();\r
+               return (LRESULT)pT->CompareItem((LPCOMPAREITEMSTRUCT)lParam);\r
+       }\r
+\r
+       LRESULT OnDeleteItem(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               pT->SetMsgHandled(TRUE);\r
+               pT->DeleteItem((LPDELETEITEMSTRUCT)lParam);\r
+               bHandled = pT->IsMsgHandled();\r
+               return (LRESULT)TRUE;\r
+       }\r
+\r
+// Overrideables\r
+       void DrawItem(LPDRAWITEMSTRUCT /*lpDrawItemStruct*/)\r
+       {\r
+               // must be implemented\r
+               ATLASSERT(FALSE);\r
+       }\r
+\r
+       void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)\r
+       {\r
+               if(lpMeasureItemStruct->CtlType != ODT_MENU)\r
+               {\r
+                       // return default height for a system font\r
+                       T* pT = static_cast<T*>(this);\r
+                       HWND hWnd = pT->GetDlgItem(lpMeasureItemStruct->CtlID);\r
+                       CClientDC dc(hWnd);\r
+                       TEXTMETRIC tm = { 0 };\r
+                       dc.GetTextMetrics(&tm);\r
+\r
+                       lpMeasureItemStruct->itemHeight = tm.tmHeight;\r
+               }\r
+               else\r
+                       lpMeasureItemStruct->itemHeight = ::GetSystemMetrics(SM_CYMENU);\r
+       }\r
+\r
+       int CompareItem(LPCOMPAREITEMSTRUCT /*lpCompareItemStruct*/)\r
+       {\r
+               // all items are equal\r
+               return 0;\r
+       }\r
+\r
+       void DeleteItem(LPDELETEITEMSTRUCT /*lpDeleteItemStruct*/)\r
+       {\r
+               // default - nothing\r
+       }\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Update UI macros\r
+\r
+// these build the Update UI map inside a class definition\r
+#define BEGIN_UPDATE_UI_MAP(thisClass) \\r
+       static const CUpdateUIBase::_AtlUpdateUIMap* GetUpdateUIMap() \\r
+       { \\r
+               static const _AtlUpdateUIMap theMap[] = \\r
+               {\r
+\r
+#define UPDATE_ELEMENT(nID, wType) \\r
+                       { nID,  wType },\r
+\r
+#define END_UPDATE_UI_MAP() \\r
+                       { (WORD)-1, 0 } \\r
+               }; \\r
+               return theMap; \\r
+       }\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CUpdateUI - manages UI elements updating\r
+\r
+class CUpdateUIBase\r
+{\r
+public:\r
+       // constants\r
+       enum\r
+       {\r
+               // UI element type\r
+               UPDUI_MENUPOPUP         = 0x0001,\r
+               UPDUI_MENUBAR           = 0x0002,\r
+               UPDUI_CHILDWINDOW       = 0x0004,\r
+               UPDUI_TOOLBAR           = 0x0008,\r
+               UPDUI_STATUSBAR         = 0x0010,\r
+               // state\r
+               UPDUI_ENABLED           = 0x0000,\r
+               UPDUI_DISABLED          = 0x0100,\r
+               UPDUI_CHECKED           = 0x0200,\r
+               UPDUI_CHECKED2          = 0x0400,\r
+               UPDUI_RADIO             = 0x0800,\r
+               UPDUI_DEFAULT           = 0x1000,\r
+               UPDUI_TEXT              = 0x2000,\r
+               // internal state\r
+               UPDUI_CLEARDEFAULT      = 0x4000,\r
+       };\r
+\r
+       // element data\r
+       struct _AtlUpdateUIElement\r
+       {\r
+               HWND m_hWnd;\r
+               WORD m_wType;\r
+\r
+               bool operator ==(const _AtlUpdateUIElement& e) const\r
+               { return (m_hWnd == e.m_hWnd && m_wType == e.m_wType); }\r
+       };\r
+\r
+       // map data\r
+       struct _AtlUpdateUIMap\r
+       {\r
+               WORD m_nID;\r
+               WORD m_wType;\r
+\r
+               bool operator ==(const _AtlUpdateUIMap& e) const\r
+               { return (m_nID == e.m_nID && m_wType == e.m_wType); }\r
+       };\r
+\r
+       // instance data\r
+       struct _AtlUpdateUIData\r
+       {\r
+               WORD m_wState;\r
+               union\r
+               {\r
+                       void* m_lpData;\r
+                       LPTSTR m_lpstrText;\r
+               };\r
+\r
+               bool operator ==(const _AtlUpdateUIData& e) const\r
+               { return (m_wState == e.m_wState && m_lpData == e.m_lpData); }\r
+       };\r
+\r
+       ATL::CSimpleArray<_AtlUpdateUIElement> m_UIElements;   // elements data\r
+       const _AtlUpdateUIMap* m_pUIMap;                       // static UI data\r
+       _AtlUpdateUIData* m_pUIData;                           // instance UI data\r
+       WORD m_wDirtyType;                                     // global dirty flag\r
+\r
+       bool m_bBlockAccelerators;\r
+\r
+\r
+// Constructor, destructor\r
+       CUpdateUIBase() : m_pUIMap(NULL), m_pUIData(NULL), m_wDirtyType(0), m_bBlockAccelerators(false)\r
+       { }\r
+\r
+       ~CUpdateUIBase()\r
+       {\r
+               if(m_pUIMap != NULL && m_pUIData != NULL)\r
+               {\r
+                       const _AtlUpdateUIMap* pUIMap = m_pUIMap;\r
+                       _AtlUpdateUIData* pUIData = m_pUIData;\r
+                       while(pUIMap->m_nID != (WORD)-1)\r
+                       {\r
+                               if(pUIData->m_wState & UPDUI_TEXT)\r
+                                       delete [] pUIData->m_lpstrText;\r
+                               pUIMap++;\r
+                               pUIData++;\r
+                       }\r
+                       delete [] m_pUIData;\r
+               }\r
+       }\r
+\r
+// Check for disabled commands\r
+       bool UIGetBlockAccelerators() const\r
+       {\r
+               return m_bBlockAccelerators;\r
+       }\r
+\r
+       bool UISetBlockAccelerators(bool bBlock)\r
+       {\r
+               bool bOld = m_bBlockAccelerators;\r
+               m_bBlockAccelerators = bBlock;\r
+               return bOld;\r
+       }\r
+\r
+// Add elements\r
+       BOOL UIAddMenuBar(HWND hWnd)                // menu bar (main menu)\r
+       {\r
+               if(hWnd == NULL)\r
+                       return FALSE;\r
+               _AtlUpdateUIElement e;\r
+               e.m_hWnd = hWnd;\r
+               e.m_wType = UPDUI_MENUBAR;\r
+               return m_UIElements.Add(e);\r
+       }\r
+\r
+       BOOL UIAddToolBar(HWND hWnd)                // toolbar\r
+       {\r
+               if(hWnd == NULL)\r
+                       return FALSE;\r
+               _AtlUpdateUIElement e;\r
+               e.m_hWnd = hWnd;\r
+               e.m_wType = UPDUI_TOOLBAR;\r
+               return m_UIElements.Add(e);\r
+       }\r
+\r
+       BOOL UIAddStatusBar(HWND hWnd)              // status bar\r
+       {\r
+               if(hWnd == NULL)\r
+                       return FALSE;\r
+               _AtlUpdateUIElement e;\r
+               e.m_hWnd = hWnd;\r
+               e.m_wType = UPDUI_STATUSBAR;\r
+               return m_UIElements.Add(e);\r
+       }\r
+\r
+       BOOL UIAddChildWindowContainer(HWND hWnd)   // child window\r
+       {\r
+               if(hWnd == NULL)\r
+                       return FALSE;\r
+               _AtlUpdateUIElement e;\r
+               e.m_hWnd = hWnd;\r
+               e.m_wType = UPDUI_CHILDWINDOW;\r
+               return m_UIElements.Add(e);\r
+       }\r
+\r
+// Message map for popup menu updates and accelerator blocking\r
+       BEGIN_MSG_MAP(CUpdateUIBase)\r
+               MESSAGE_HANDLER(WM_INITMENUPOPUP, OnInitMenuPopup)\r
+               MESSAGE_HANDLER(WM_COMMAND, OnCommand)\r
+       END_MSG_MAP()\r
+\r
+       LRESULT OnInitMenuPopup(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)\r
+       {\r
+               bHandled = FALSE;\r
+               HMENU hMenu = (HMENU)wParam;\r
+               if(hMenu == NULL)\r
+                       return 1;\r
+               _AtlUpdateUIData* pUIData = m_pUIData;\r
+               if(pUIData == NULL)\r
+                       return 1;\r
+               const _AtlUpdateUIMap* pMap = m_pUIMap;\r
+               while(pMap->m_nID != (WORD)-1)\r
+               {\r
+                       if(pMap->m_wType & UPDUI_MENUPOPUP)\r
+                               UIUpdateMenuBarElement(pMap->m_nID, pUIData, hMenu);\r
+                       pMap++;\r
+                       pUIData++;\r
+               }\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnCommand(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)\r
+       {\r
+               bHandled = FALSE;\r
+               if(m_bBlockAccelerators && HIWORD(wParam) == 1)   // accelerators only\r
+               {\r
+                       int nID = LOWORD(wParam);\r
+                       if((UIGetState(nID) & UPDUI_DISABLED) == UPDUI_DISABLED)\r
+                       {\r
+                               ATLTRACE2(atlTraceUI, 0, _T("CUpdateUIBase::OnCommand - blocked disabled command 0x%4.4X\n"), nID);\r
+                               bHandled = TRUE;   // eat the command, UI item is disabled\r
+                       }\r
+               }\r
+               return 0;\r
+       }\r
+\r
+// methods for setting UI element state\r
+       BOOL UIEnable(int nID, BOOL bEnable, BOOL bForceUpdate = FALSE)\r
+       {\r
+               const _AtlUpdateUIMap* pMap = m_pUIMap;\r
+               _AtlUpdateUIData* pUIData = m_pUIData;\r
+               if(pUIData == NULL)\r
+                       return FALSE;\r
+\r
+               for( ; pMap->m_nID != (WORD)-1; pMap++, pUIData++)\r
+               {\r
+                       if(nID == (int)pMap->m_nID)\r
+                       {\r
+                               if(bEnable)\r
+                               {\r
+                                       if(pUIData->m_wState & UPDUI_DISABLED)\r
+                                       {\r
+                                               pUIData->m_wState |= pMap->m_wType;\r
+                                               pUIData->m_wState &= ~UPDUI_DISABLED;\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       if(!(pUIData->m_wState & UPDUI_DISABLED))\r
+                                       {\r
+                                               pUIData->m_wState |= pMap->m_wType;\r
+                                               pUIData->m_wState |= UPDUI_DISABLED;\r
+                                       }\r
+                               }\r
+\r
+                               if(bForceUpdate)\r
+                                       pUIData->m_wState |= pMap->m_wType;\r
+                               if(pUIData->m_wState & pMap->m_wType)\r
+                                       m_wDirtyType |= pMap->m_wType;\r
+\r
+                               break;   // found\r
+                       }\r
+               }\r
+\r
+               return TRUE;\r
+       }\r
+\r
+       BOOL UISetCheck(int nID, int nCheck, BOOL bForceUpdate = FALSE)\r
+       {\r
+               const _AtlUpdateUIMap* pMap = m_pUIMap;\r
+               _AtlUpdateUIData* pUIData = m_pUIData;\r
+               if(pUIData == NULL)\r
+                       return FALSE;\r
+\r
+               for( ; pMap->m_nID != (WORD)-1; pMap++, pUIData++)\r
+               {\r
+                       if(nID == (int)pMap->m_nID)\r
+                       {\r
+                               switch(nCheck)\r
+                               {\r
+                               case 0:\r
+                                       if((pUIData->m_wState & UPDUI_CHECKED) || (pUIData->m_wState & UPDUI_CHECKED2))\r
+                                       {\r
+                                               pUIData->m_wState |= pMap->m_wType;\r
+                                               pUIData->m_wState &= ~(UPDUI_CHECKED | UPDUI_CHECKED2);\r
+                                       }\r
+                                       break;\r
+                               case 1:\r
+                                       if(!(pUIData->m_wState & UPDUI_CHECKED))\r
+                                       {\r
+                                               pUIData->m_wState |= pMap->m_wType;\r
+                                               pUIData->m_wState &= ~UPDUI_CHECKED2;\r
+                                               pUIData->m_wState |= UPDUI_CHECKED;\r
+                                       }\r
+                                       break;\r
+                               case 2:\r
+                                       if(!(pUIData->m_wState & UPDUI_CHECKED2))\r
+                                       {\r
+                                               pUIData->m_wState |= pMap->m_wType;\r
+                                               pUIData->m_wState &= ~UPDUI_CHECKED;\r
+                                               pUIData->m_wState |= UPDUI_CHECKED2;\r
+                                       }\r
+                                       break;\r
+                               }\r
+\r
+                               if(bForceUpdate)\r
+                                       pUIData->m_wState |= pMap->m_wType;\r
+                               if(pUIData->m_wState & pMap->m_wType)\r
+                                       m_wDirtyType |= pMap->m_wType;\r
+\r
+                               break;   // found\r
+                       }\r
+               }\r
+\r
+               return TRUE;\r
+       }\r
+\r
+       // variant that supports bool (checked/not-checked, no intermediate state)\r
+       BOOL UISetCheck(int nID, bool bCheck, BOOL bForceUpdate = FALSE)\r
+       {\r
+               return UISetCheck(nID, bCheck ? 1 : 0, bForceUpdate);\r
+       }\r
+\r
+       BOOL UISetRadio(int nID, BOOL bRadio, BOOL bForceUpdate = FALSE)\r
+       {\r
+               const _AtlUpdateUIMap* pMap = m_pUIMap;\r
+               _AtlUpdateUIData* pUIData = m_pUIData;\r
+               if(pUIData == NULL)\r
+                       return FALSE;\r
+\r
+               for( ; pMap->m_nID != (WORD)-1; pMap++, pUIData++)\r
+               {\r
+                       if(nID == (int)pMap->m_nID)\r
+                       {\r
+                               if(bRadio)\r
+                               {\r
+                                       if(!(pUIData->m_wState & UPDUI_RADIO))\r
+                                       {\r
+                                               pUIData->m_wState |= pMap->m_wType;\r
+                                               pUIData->m_wState |= UPDUI_RADIO;\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       if(pUIData->m_wState & UPDUI_RADIO)\r
+                                       {\r
+                                               pUIData->m_wState |= pMap->m_wType;\r
+                                               pUIData->m_wState &= ~UPDUI_RADIO;\r
+                                       }\r
+                               }\r
+\r
+                               if(bForceUpdate)\r
+                                       pUIData->m_wState |= pMap->m_wType;\r
+                               if(pUIData->m_wState & pMap->m_wType)\r
+                                       m_wDirtyType |= pMap->m_wType;\r
+\r
+                               break;   // found\r
+                       }\r
+               }\r
+\r
+               return TRUE;\r
+       }\r
+\r
+       BOOL UISetText(int nID, LPCTSTR lpstrText, BOOL bForceUpdate = FALSE)\r
+       {\r
+               const _AtlUpdateUIMap* pMap = m_pUIMap;\r
+               _AtlUpdateUIData* pUIData = m_pUIData;\r
+               if(pUIData == NULL)\r
+                       return FALSE;\r
+               if(lpstrText == NULL)\r
+                       lpstrText = _T("");\r
+\r
+               for( ; pMap->m_nID != (WORD)-1; pMap++, pUIData++)\r
+               {\r
+                       if(nID == (int)pMap->m_nID)\r
+                       {\r
+                               if(pUIData->m_lpstrText == NULL || lstrcmp(pUIData->m_lpstrText, lpstrText))\r
+                               {\r
+                                       delete [] pUIData->m_lpstrText;\r
+                                       pUIData->m_lpstrText = NULL;\r
+                                       int nStrLen = lstrlen(lpstrText);\r
+                                       ATLTRY(pUIData->m_lpstrText = new TCHAR[nStrLen + 1]);\r
+                                       if(pUIData->m_lpstrText == NULL)\r
+                                       {\r
+                                               ATLTRACE2(atlTraceUI, 0, _T("UISetText - memory allocation failed\n"));\r
+                                               break;\r
+                                       }\r
+                                       SecureHelper::strcpy_x(pUIData->m_lpstrText, nStrLen + 1, lpstrText);\r
+                                       pUIData->m_wState |= (UPDUI_TEXT | pMap->m_wType);\r
+                               }\r
+\r
+                               if(bForceUpdate)\r
+                                       pUIData->m_wState |= (UPDUI_TEXT | pMap->m_wType);\r
+                               if(pUIData->m_wState & pMap->m_wType)\r
+                                       m_wDirtyType |= pMap->m_wType;\r
+\r
+                               break;   // found\r
+                       }\r
+               }\r
+\r
+               return TRUE;\r
+       }\r
+\r
+       BOOL UISetDefault(int nID, BOOL bDefault, BOOL bForceUpdate = FALSE)\r
+       {\r
+               const _AtlUpdateUIMap* pMap = m_pUIMap;\r
+               _AtlUpdateUIData* pUIData = m_pUIData;\r
+               if(pUIData == NULL)\r
+                       return FALSE;\r
+\r
+               for( ; pMap->m_nID != (WORD)-1; pMap++, pUIData++)\r
+               {\r
+                       if(nID == (int)pMap->m_nID)\r
+                       {\r
+                               if(bDefault)\r
+                               {\r
+                                       if((pUIData->m_wState & UPDUI_DEFAULT) == 0)\r
+                                       {\r
+                                               pUIData->m_wState |= pMap->m_wType;\r
+                                               pUIData->m_wState |= UPDUI_DEFAULT;\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       if((pUIData->m_wState & UPDUI_DEFAULT) != 0)\r
+                                       {\r
+                                               pUIData->m_wState |= pMap->m_wType;\r
+                                               pUIData->m_wState &= ~UPDUI_DEFAULT;\r
+                                               pUIData->m_wState |= UPDUI_CLEARDEFAULT;\r
+                                       }\r
+                               }\r
+\r
+                               if(bForceUpdate)\r
+                                       pUIData->m_wState |= pMap->m_wType;\r
+                               if(pUIData->m_wState & pMap->m_wType)\r
+                                       m_wDirtyType |= pMap->m_wType;\r
+\r
+                               break;   // found\r
+                       }\r
+               }\r
+\r
+               return TRUE;\r
+       }\r
+\r
+// methods for complete state set/get\r
+       BOOL UISetState(int nID, DWORD dwState)\r
+       {\r
+               const _AtlUpdateUIMap* pMap = m_pUIMap;\r
+               _AtlUpdateUIData* pUIData = m_pUIData;\r
+               if(pUIData == NULL)\r
+                       return FALSE;\r
+               for( ; pMap->m_nID != (WORD)-1; pMap++, pUIData++)\r
+               {\r
+                       if(nID == (int)pMap->m_nID)\r
+                       {               \r
+                               pUIData->m_wState = (WORD)(dwState | pMap->m_wType);\r
+                               m_wDirtyType |= pMap->m_wType;\r
+                               break;   // found\r
+                       }\r
+               }\r
+               return TRUE;\r
+       }\r
+\r
+       DWORD UIGetState(int nID)\r
+       {\r
+               const _AtlUpdateUIMap* pMap = m_pUIMap;\r
+               _AtlUpdateUIData* pUIData = m_pUIData;\r
+               if(pUIData == NULL)\r
+                       return 0;\r
+               for( ; pMap->m_nID != (WORD)-1; pMap++, pUIData++)\r
+               {\r
+                       if(nID == (int)pMap->m_nID)\r
+                               return pUIData->m_wState;\r
+               }\r
+               return 0;\r
+       }\r
+\r
+// methods for updating UI\r
+#ifndef _WIN32_WCE\r
+       BOOL UIUpdateMenuBar(BOOL bForceUpdate = FALSE, BOOL bMainMenu = FALSE)\r
+       {\r
+               if(!(m_wDirtyType & UPDUI_MENUBAR) && !bForceUpdate)\r
+                       return TRUE;\r
+\r
+               const _AtlUpdateUIMap* pMap = m_pUIMap;\r
+               _AtlUpdateUIData* pUIData = m_pUIData;\r
+               if(pUIData == NULL)\r
+                       return FALSE;\r
+\r
+               while(pMap->m_nID != (WORD)-1)\r
+               {\r
+                       for(int i = 0; i < m_UIElements.GetSize(); i++)\r
+                       {\r
+                               if(m_UIElements[i].m_wType == UPDUI_MENUBAR)\r
+                               {\r
+                                       HMENU hMenu = ::GetMenu(m_UIElements[i].m_hWnd);\r
+                                       if(hMenu != NULL && (pUIData->m_wState & UPDUI_MENUBAR) && (pMap->m_wType & UPDUI_MENUBAR))\r
+                                               UIUpdateMenuBarElement(pMap->m_nID, pUIData, hMenu);\r
+                               }\r
+                               if(bMainMenu)\r
+                                       ::DrawMenuBar(m_UIElements[i].m_hWnd);\r
+                       }\r
+                       pMap++;\r
+                       pUIData->m_wState &= ~UPDUI_MENUBAR;\r
+                       if(pUIData->m_wState & UPDUI_TEXT)\r
+                       {\r
+                               delete [] pUIData->m_lpstrText;\r
+                               pUIData->m_lpstrText = NULL;\r
+                               pUIData->m_wState &= ~UPDUI_TEXT;\r
+                       }\r
+                       pUIData++;\r
+               }\r
+\r
+               m_wDirtyType &= ~UPDUI_MENUBAR;\r
+               return TRUE;\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       BOOL UIUpdateToolBar(BOOL bForceUpdate = FALSE)\r
+       {\r
+               if(!(m_wDirtyType & UPDUI_TOOLBAR) && !bForceUpdate)\r
+                       return TRUE;\r
+\r
+               const _AtlUpdateUIMap* pMap = m_pUIMap;\r
+               _AtlUpdateUIData* pUIData = m_pUIData;\r
+               if(pUIData == NULL)\r
+                       return FALSE;\r
+\r
+               while(pMap->m_nID != (WORD)-1)\r
+               {\r
+                       for(int i = 0; i < m_UIElements.GetSize(); i++)\r
+                       {\r
+                               if(m_UIElements[i].m_wType == UPDUI_TOOLBAR)\r
+                               {\r
+                                       if((pUIData->m_wState & UPDUI_TOOLBAR) && (pMap->m_wType & UPDUI_TOOLBAR))\r
+                                               UIUpdateToolBarElement(pMap->m_nID, pUIData, m_UIElements[i].m_hWnd);\r
+                               }\r
+                       }\r
+                       pMap++;\r
+                       pUIData->m_wState &= ~UPDUI_TOOLBAR;\r
+                       pUIData++;\r
+               }\r
+\r
+               m_wDirtyType &= ~UPDUI_TOOLBAR;\r
+               return TRUE;\r
+       }\r
+\r
+       BOOL UIUpdateStatusBar(BOOL bForceUpdate = FALSE)\r
+       {\r
+               if(!(m_wDirtyType & UPDUI_STATUSBAR) && !bForceUpdate)\r
+                       return TRUE;\r
+\r
+               const _AtlUpdateUIMap* pMap = m_pUIMap;\r
+               _AtlUpdateUIData* pUIData = m_pUIData;\r
+               if(pUIData == NULL)\r
+                       return FALSE;\r
+\r
+               while(pMap->m_nID != (WORD)-1)\r
+               {\r
+                       for(int i = 0; i < m_UIElements.GetSize(); i++)\r
+                       {\r
+                               if(m_UIElements[i].m_wType == UPDUI_STATUSBAR)\r
+                               {\r
+                                       if((pUIData->m_wState & UPDUI_STATUSBAR) && (pMap->m_wType & UPDUI_STATUSBAR))\r
+                                               UIUpdateStatusBarElement(pMap->m_nID, pUIData, m_UIElements[i].m_hWnd);\r
+                               }\r
+                       }\r
+                       pMap++;\r
+                       pUIData->m_wState &= ~UPDUI_STATUSBAR;\r
+                       if(pUIData->m_wState & UPDUI_TEXT)\r
+                       {\r
+                               delete [] pUIData->m_lpstrText;\r
+                               pUIData->m_lpstrText = NULL;\r
+                               pUIData->m_wState &= ~UPDUI_TEXT;\r
+                       }\r
+                       pUIData++;\r
+               }\r
+\r
+               m_wDirtyType &= ~UPDUI_STATUSBAR;\r
+               return TRUE;\r
+       }\r
+\r
+       BOOL UIUpdateChildWindows(BOOL bForceUpdate = FALSE)\r
+       {\r
+               if(!(m_wDirtyType & UPDUI_CHILDWINDOW) && !bForceUpdate)\r
+                       return TRUE;\r
+\r
+               const _AtlUpdateUIMap* pMap = m_pUIMap;\r
+               _AtlUpdateUIData* pUIData = m_pUIData;\r
+               if(pUIData == NULL)\r
+                       return FALSE;\r
+\r
+               while(pMap->m_nID != (WORD)-1)\r
+               {\r
+                       for(int i = 0; i < m_UIElements.GetSize(); i++)\r
+                       {\r
+                               if(m_UIElements[i].m_wType == UPDUI_CHILDWINDOW)\r
+                               {\r
+                                       if((pUIData->m_wState & UPDUI_CHILDWINDOW) && (pMap->m_wType & UPDUI_CHILDWINDOW))\r
+                                               UIUpdateChildWindow(pMap->m_nID, pUIData, m_UIElements[i].m_hWnd);\r
+                               }\r
+                       }\r
+                       pMap++;\r
+                       pUIData->m_wState &= ~UPDUI_CHILDWINDOW;\r
+                       if(pUIData->m_wState & UPDUI_TEXT)\r
+                       {\r
+                               delete [] pUIData->m_lpstrText;\r
+                               pUIData->m_lpstrText = NULL;\r
+                               pUIData->m_wState &= ~UPDUI_TEXT;\r
+                       }\r
+                       pUIData++;\r
+               }\r
+\r
+               m_wDirtyType &= ~UPDUI_CHILDWINDOW;\r
+               return TRUE;\r
+       }\r
+\r
+// internal element specific methods\r
+       static void UIUpdateMenuBarElement(int nID, _AtlUpdateUIData* pUIData, HMENU hMenu)\r
+       {\r
+#ifndef _WIN32_WCE\r
+               if((pUIData->m_wState & UPDUI_CLEARDEFAULT) != 0)\r
+               {\r
+                       ::SetMenuDefaultItem(hMenu, (UINT)-1, 0);\r
+                       pUIData->m_wState &= ~UPDUI_CLEARDEFAULT;\r
+               }\r
+#endif // !_WIN32_WCE\r
+\r
+               CMenuItemInfo mii;\r
+               mii.fMask = MIIM_STATE;\r
+               mii.wID = nID;\r
+\r
+#ifndef _WIN32_WCE\r
+               if((pUIData->m_wState & UPDUI_DISABLED) != 0)\r
+                       mii.fState |= MFS_DISABLED | MFS_GRAYED;\r
+               else\r
+                       mii.fState |= MFS_ENABLED;\r
+\r
+               if((pUIData->m_wState & UPDUI_CHECKED) != 0)\r
+                       mii.fState |= MFS_CHECKED;\r
+               else\r
+                       mii.fState |= MFS_UNCHECKED;\r
+\r
+               if((pUIData->m_wState & UPDUI_DEFAULT) != 0)\r
+                       mii.fState |= MFS_DEFAULT;\r
+#else // CE specific\r
+               // ::SetMenuItemInfo() can't disable or check menu items\r
+               // on Windows CE, so we have to do that directly\r
+               UINT uEnable = MF_BYCOMMAND;\r
+               if((pUIData->m_wState & UPDUI_DISABLED) != 0)\r
+                       uEnable |= MF_GRAYED;\r
+               else\r
+                       uEnable |= MF_ENABLED;\r
+               ::EnableMenuItem(hMenu, nID, uEnable);\r
+\r
+               UINT uCheck = MF_BYCOMMAND;\r
+               if((pUIData->m_wState & UPDUI_CHECKED) != 0)\r
+                       uCheck |= MF_CHECKED;\r
+               else\r
+                       uCheck |= MF_UNCHECKED;\r
+               ::CheckMenuItem(hMenu, nID, uCheck);\r
+#endif // _WIN32_WCE\r
+\r
+               if((pUIData->m_wState & UPDUI_TEXT) != 0)\r
+               {\r
+                       CMenuItemInfo miiNow;\r
+                       miiNow.fMask = MIIM_TYPE;\r
+                       miiNow.wID = nID;\r
+                       if(::GetMenuItemInfo(hMenu, nID, FALSE, &miiNow))\r
+                       {\r
+                               mii.fMask |= MIIM_TYPE;\r
+                               // MFT_BITMAP and MFT_SEPARATOR don't go together with MFT_STRING\r
+#ifndef _WIN32_WCE\r
+                               mii.fType |= (miiNow.fType & ~(MFT_BITMAP | MFT_SEPARATOR)) | MFT_STRING;\r
+#else // CE specific\r
+                               mii.fType |= (miiNow.fType & ~(MFT_SEPARATOR)) | MFT_STRING;\r
+#endif // _WIN32_WCE\r
+                               mii.dwTypeData = pUIData->m_lpstrText;\r
+                       }\r
+               }\r
+\r
+               ::SetMenuItemInfo(hMenu, nID, FALSE, &mii);\r
+       }\r
+\r
+       static void UIUpdateToolBarElement(int nID, _AtlUpdateUIData* pUIData, HWND hWndToolBar)\r
+       {\r
+               // Note: only handles enabled/disabled, checked state, and radio (press)\r
+               ::SendMessage(hWndToolBar, TB_ENABLEBUTTON, nID, (LPARAM)(pUIData->m_wState & UPDUI_DISABLED) ? FALSE : TRUE);\r
+               ::SendMessage(hWndToolBar, TB_CHECKBUTTON, nID, (LPARAM)(pUIData->m_wState & UPDUI_CHECKED) ? TRUE : FALSE);\r
+               ::SendMessage(hWndToolBar, TB_INDETERMINATE, nID, (LPARAM)(pUIData->m_wState & UPDUI_CHECKED2) ? TRUE : FALSE);\r
+               ::SendMessage(hWndToolBar, TB_PRESSBUTTON, nID, (LPARAM)(pUIData->m_wState & UPDUI_RADIO) ? TRUE : FALSE);\r
+       }\r
+\r
+       static void UIUpdateStatusBarElement(int nID, _AtlUpdateUIData* pUIData, HWND hWndStatusBar)\r
+       {\r
+               // Note: only handles text\r
+               if(pUIData->m_wState & UPDUI_TEXT)\r
+                       ::SendMessage(hWndStatusBar, SB_SETTEXT, nID, (LPARAM)pUIData->m_lpstrText);\r
+       }\r
+\r
+       static void UIUpdateChildWindow(int nID, _AtlUpdateUIData* pUIData, HWND hWnd)\r
+       {\r
+               HWND hChild = ::GetDlgItem(hWnd, nID);\r
+\r
+               ::EnableWindow(hChild, (pUIData->m_wState & UPDUI_DISABLED) ? FALSE : TRUE);\r
+               // for check and radio, assume that window is a button\r
+               int nCheck = BST_UNCHECKED;\r
+               if(pUIData->m_wState & UPDUI_CHECKED || pUIData->m_wState & UPDUI_RADIO)\r
+                       nCheck = BST_CHECKED;\r
+               else if(pUIData->m_wState & UPDUI_CHECKED2)\r
+                       nCheck = BST_INDETERMINATE;\r
+               ::SendMessage(hChild, BM_SETCHECK, nCheck, 0L);\r
+               if(pUIData->m_wState & UPDUI_DEFAULT)\r
+               {\r
+                       DWORD dwRet = (DWORD)::SendMessage(hWnd, DM_GETDEFID, 0, 0L);\r
+                       if(HIWORD(dwRet) == DC_HASDEFID)\r
+                       {\r
+                               HWND hOldDef = ::GetDlgItem(hWnd, (int)(short)LOWORD(dwRet));\r
+                               // remove BS_DEFPUSHBUTTON\r
+                               ::SendMessage(hOldDef, BM_SETSTYLE, BS_PUSHBUTTON, MAKELPARAM(TRUE, 0));\r
+                       }\r
+                       ::SendMessage(hWnd, DM_SETDEFID, nID, 0L);\r
+               }\r
+               if(pUIData->m_wState & UPDUI_TEXT)\r
+                       ::SetWindowText(hChild, pUIData->m_lpstrText);\r
+       }\r
+};\r
+\r
+template <class T>\r
+class CUpdateUI : public CUpdateUIBase\r
+{\r
+public:\r
+       CUpdateUI()\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               pT;\r
+               const _AtlUpdateUIMap* pMap = pT->GetUpdateUIMap();\r
+               m_pUIMap = pMap;\r
+               ATLASSERT(m_pUIMap != NULL);\r
+               int nCount;\r
+               for(nCount = 1; pMap->m_nID != (WORD)-1; nCount++)\r
+                       pMap++;\r
+\r
+               // check for duplicates (debug only)\r
+#ifdef _DEBUG\r
+               for(int i = 0; i < nCount; i++)\r
+               {\r
+                       for(int j = 0; j < nCount; j++)\r
+                       {\r
+                               // shouldn't have duplicates in the update UI map\r
+                               if(i != j)\r
+                                       ATLASSERT(m_pUIMap[j].m_nID != m_pUIMap[i].m_nID);\r
+                       }\r
+               }\r
+#endif // _DEBUG\r
+\r
+               ATLTRY(m_pUIData = new _AtlUpdateUIData[nCount]);\r
+               ATLASSERT(m_pUIData != NULL);\r
+\r
+               if(m_pUIData != NULL)\r
+                       memset(m_pUIData, 0, sizeof(_AtlUpdateUIData) * nCount);\r
+       }\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CDynamicUpdateUI - allows update elements to dynamically added and removed\r
+//                    in addition to a static update UI map\r
+\r
+template <class T>\r
+class CDynamicUpdateUI : public CUpdateUIBase\r
+{\r
+public:\r
+// Data members\r
+       ATL::CSimpleArray<_AtlUpdateUIMap> m_arrUIMap;     // copy of the static UI data\r
+       ATL::CSimpleArray<_AtlUpdateUIData> m_arrUIData;   // instance UI data\r
+\r
+// Constructor/destructor\r
+       CDynamicUpdateUI()\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               pT;\r
+               const _AtlUpdateUIMap* pMap = pT->GetUpdateUIMap();\r
+               ATLASSERT(pMap != NULL);\r
+\r
+               for(;;)\r
+               {\r
+                       BOOL bRet = m_arrUIMap.Add(*(_AtlUpdateUIMap*)pMap);\r
+                       ATLASSERT(bRet);\r
+\r
+                       if(bRet != FALSE)\r
+                       {\r
+                               _AtlUpdateUIData data = { 0, NULL };\r
+                               bRet = m_arrUIData.Add(data);\r
+                               ATLASSERT(bRet);\r
+                       }\r
+\r
+                       if(pMap->m_nID == (WORD)-1)\r
+                               break;\r
+\r
+                       pMap++;\r
+               }\r
+\r
+               ATLASSERT(m_arrUIMap.GetSize() == m_arrUIData.GetSize());\r
+\r
+#ifdef _DEBUG\r
+               // check for duplicates (debug only)\r
+               for(int i = 0; i < m_arrUIMap.GetSize(); i++)\r
+               {\r
+                       for(int j = 0; j < m_arrUIMap.GetSize(); j++)\r
+                       {\r
+                               // shouldn't have duplicates in the update UI map\r
+                               if(i != j)\r
+                                       ATLASSERT(m_arrUIMap[j].m_nID != m_arrUIMap[i].m_nID);\r
+                       }\r
+               }\r
+#endif // _DEBUG\r
+\r
+               // Set internal data pointers to point to the new data arrays\r
+               m_pUIMap = m_arrUIMap.m_aT;\r
+               m_pUIData = m_arrUIData.m_aT;\r
+       }\r
+\r
+       ~CDynamicUpdateUI()\r
+       {\r
+               for(int i = 0; i < m_arrUIData.GetSize(); i++)\r
+               {\r
+                       if((m_arrUIData[i].m_wState & UPDUI_TEXT) != 0)\r
+                               delete [] m_arrUIData[i].m_lpstrText;\r
+               }\r
+\r
+               // Reset internal data pointers (memory will be released by CSimpleArray d-tor)\r
+               m_pUIMap = NULL;\r
+               m_pUIData = NULL;\r
+       }\r
+\r
+// Methods for dynamically adding and removing update elements\r
+       bool UIAddUpdateElement(WORD nID, WORD wType)\r
+       {\r
+               // check for duplicates\r
+               for(int i = 0; i < m_arrUIMap.GetSize(); i++)\r
+               {\r
+                       // shouldn't have duplicates in the update UI map\r
+                       ATLASSERT(m_arrUIMap[i].m_nID != nID);\r
+                       if(m_arrUIMap[i].m_nID == nID)\r
+                               return false;\r
+               }\r
+\r
+               bool bRetVal = false;\r
+\r
+               // Add new end element\r
+               _AtlUpdateUIMap uumEnd = { (WORD)-1, 0 };\r
+               BOOL bRet = m_arrUIMap.Add(uumEnd);\r
+               ATLASSERT(bRet);\r
+\r
+               if(bRet != FALSE)\r
+               {\r
+                       _AtlUpdateUIData uud = { 0, NULL };\r
+                       bRet = m_arrUIData.Add(uud);\r
+                       ATLASSERT(bRet);\r
+\r
+                       // Set new data to the previous end element\r
+                       if(bRet != FALSE)\r
+                       {\r
+                               int nSize = m_arrUIMap.GetSize();\r
+                               _AtlUpdateUIMap uum = { nID, wType };\r
+                               m_arrUIMap.SetAtIndex(nSize - 2, uum);\r
+                               m_arrUIData.SetAtIndex(nSize - 2, uud);\r
+\r
+                               // Set internal data pointers again, just in case that memory moved\r
+                               m_pUIMap = m_arrUIMap.m_aT;\r
+                               m_pUIData = m_arrUIData.m_aT;\r
+\r
+                               bRetVal = true;\r
+                       }\r
+               }\r
+\r
+               return bRetVal;\r
+       }\r
+\r
+       bool UIRemoveUpdateElement(WORD nID)\r
+       {\r
+               bool bRetVal = false;\r
+\r
+               for(int i = 0; i < m_arrUIMap.GetSize(); i++)\r
+               {\r
+                       if(m_arrUIMap[i].m_nID == nID)\r
+                       {\r
+                               BOOL bRet = m_arrUIMap.RemoveAt(i);\r
+                               ATLASSERT(bRet);\r
+                               bRet = m_arrUIData.RemoveAt(i);\r
+                               ATLASSERT(bRet);\r
+\r
+                               bRetVal = true;\r
+                               break;\r
+                       }\r
+               }\r
+\r
+               return bRetVal;\r
+       }\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CDialogResize - provides support for resizing dialog controls\r
+//                 (works for any window that has child controls)\r
+\r
+// Put CDialogResize in the list of base classes for a dialog (or even plain window),\r
+// then implement DLGRESIZE map by specifying controls and groups of control\r
+// and using DLSZ_* values to specify how are they supposed to be resized.\r
+//\r
+// Notes:\r
+// - Resizeable border (WS_THICKFRAME style) should be set in the dialog template\r
+//   for top level dialogs (popup or overlapped), so that users can resize the dialog.\r
+// - Some flags cannot be combined; for instance DLSZ_CENTER_X overrides DLSZ_SIZE_X,\r
+//   DLSZ_SIZE_X overrides DLSZ_MOVE_X. X and Y flags can be combined.\r
+// - Order of controls is important - group controls are resized and moved based\r
+//   on the position of the previous control in a group.\r
+\r
+// dialog resize map macros\r
+#define BEGIN_DLGRESIZE_MAP(thisClass) \\r
+       static const _AtlDlgResizeMap* GetDlgResizeMap() \\r
+       { \\r
+               static const _AtlDlgResizeMap theMap[] = \\r
+               {\r
+\r
+#define END_DLGRESIZE_MAP() \\r
+                       { -1, 0 }, \\r
+               }; \\r
+               return theMap; \\r
+       }\r
+\r
+#define DLGRESIZE_CONTROL(id, flags) \\r
+               { id, flags },\r
+\r
+#define BEGIN_DLGRESIZE_GROUP() \\r
+               { -1, _DLSZ_BEGIN_GROUP },\r
+\r
+#define END_DLGRESIZE_GROUP() \\r
+               { -1, _DLSZ_END_GROUP },\r
+\r
+\r
+template <class T>\r
+class CDialogResize\r
+{\r
+public:\r
+// Data declarations and members\r
+       enum\r
+       {\r
+               DLSZ_SIZE_X             = 0x00000001,\r
+               DLSZ_SIZE_Y             = 0x00000002,\r
+               DLSZ_MOVE_X             = 0x00000004,\r
+               DLSZ_MOVE_Y             = 0x00000008,\r
+               DLSZ_REPAINT            = 0x00000010,\r
+               DLSZ_CENTER_X           = 0x00000020,\r
+               DLSZ_CENTER_Y           = 0x00000040,\r
+\r
+               // internal use only\r
+               _DLSZ_BEGIN_GROUP       = 0x00001000,\r
+               _DLSZ_END_GROUP         = 0x00002000,\r
+               _DLSZ_GRIPPER           = 0x00004000\r
+       };\r
+\r
+       struct _AtlDlgResizeMap\r
+       {\r
+               int m_nCtlID;\r
+               DWORD m_dwResizeFlags;\r
+       };\r
+\r
+       struct _AtlDlgResizeData\r
+       {\r
+               int m_nCtlID;\r
+               DWORD m_dwResizeFlags;\r
+               RECT m_rect;\r
+\r
+               int GetGroupCount() const\r
+               {\r
+                       return (int)LOBYTE(HIWORD(m_dwResizeFlags));\r
+               }\r
+\r
+               void SetGroupCount(int nCount)\r
+               {\r
+                       ATLASSERT(nCount > 0 && nCount < 256);\r
+                       DWORD dwCount = (DWORD)MAKELONG(0, MAKEWORD(nCount, 0));\r
+                       m_dwResizeFlags &= 0xFF00FFFF;\r
+                       m_dwResizeFlags |= dwCount;\r
+               }\r
+\r
+               bool operator ==(const _AtlDlgResizeData& r) const\r
+               { return (m_nCtlID == r.m_nCtlID && m_dwResizeFlags == r.m_dwResizeFlags); }\r
+       };\r
+\r
+       ATL::CSimpleArray<_AtlDlgResizeData> m_arrData;\r
+       SIZE m_sizeDialog;\r
+       POINT m_ptMinTrackSize;\r
+       bool m_bGripper;\r
+\r
+\r
+// Constructor\r
+       CDialogResize() : m_bGripper(false)\r
+       {\r
+               m_sizeDialog.cx = 0;\r
+               m_sizeDialog.cy = 0;\r
+               m_ptMinTrackSize.x = -1;\r
+               m_ptMinTrackSize.y = -1;\r
+       }\r
+\r
+// Operations\r
+       void DlgResize_Init(bool bAddGripper = true, bool bUseMinTrackSize = true, DWORD dwForceStyle = WS_CLIPCHILDREN)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(::IsWindow(pT->m_hWnd));\r
+\r
+               DWORD dwStyle = pT->GetStyle();\r
+\r
+#ifdef _DEBUG\r
+               // Debug only: Check if top level dialogs have a resizeable border.\r
+               if(((dwStyle & WS_CHILD) == 0) && ((dwStyle & WS_THICKFRAME) == 0))\r
+                       ATLTRACE2(atlTraceUI, 0, _T("DlgResize_Init - warning: top level dialog without the WS_THICKFRAME style - user cannot resize it\n"));\r
+#endif // _DEBUG\r
+\r
+               // Force specified styles (default WS_CLIPCHILDREN reduces flicker)\r
+               if((dwStyle & dwForceStyle) != dwForceStyle)\r
+                       pT->ModifyStyle(0, dwForceStyle);\r
+\r
+               // Adding this style removes an empty icon that dialogs with WS_THICKFRAME have.\r
+               // Setting icon to NULL is required when XP themes are active.\r
+               // Note: This will not prevent adding an icon for the dialog using SetIcon()\r
+               if((dwStyle & WS_CHILD) == 0)\r
+               {\r
+                       pT->ModifyStyleEx(0, WS_EX_DLGMODALFRAME);\r
+                       if(pT->GetIcon(FALSE) == NULL)\r
+                               pT->SetIcon(NULL, FALSE);\r
+               }\r
+\r
+               // Cleanup in case of multiple initialization\r
+               // block: first check for the gripper control, destroy it if needed\r
+               {\r
+                       ATL::CWindow wndGripper = pT->GetDlgItem(ATL_IDW_STATUS_BAR);\r
+                       if(wndGripper.IsWindow() && m_arrData.GetSize() > 0 && (m_arrData[0].m_dwResizeFlags & _DLSZ_GRIPPER) != 0)\r
+                               wndGripper.DestroyWindow();\r
+               }\r
+               // clear out everything else\r
+               m_arrData.RemoveAll();\r
+               m_sizeDialog.cx = 0;\r
+               m_sizeDialog.cy = 0;\r
+               m_ptMinTrackSize.x = -1;\r
+               m_ptMinTrackSize.y = -1;\r
+\r
+               // Get initial dialog client size\r
+               RECT rectDlg = { 0 };\r
+               pT->GetClientRect(&rectDlg);\r
+               m_sizeDialog.cx = rectDlg.right;\r
+               m_sizeDialog.cy = rectDlg.bottom;\r
+\r
+#ifndef _WIN32_WCE\r
+               // Create gripper if requested\r
+               m_bGripper = false;\r
+               if(bAddGripper)\r
+               {\r
+                       // shouldn't exist already\r
+                       ATLASSERT(!::IsWindow(pT->GetDlgItem(ATL_IDW_STATUS_BAR)));\r
+                       if(!::IsWindow(pT->GetDlgItem(ATL_IDW_STATUS_BAR)))\r
+                       {\r
+                               ATL::CWindow wndGripper;\r
+                               wndGripper.Create(_T("SCROLLBAR"), pT->m_hWnd, rectDlg, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | SBS_SIZEBOX | SBS_SIZEGRIP | SBS_SIZEBOXBOTTOMRIGHTALIGN, 0, ATL_IDW_STATUS_BAR);\r
+                               ATLASSERT(wndGripper.IsWindow());\r
+                               if(wndGripper.IsWindow())\r
+                               {\r
+                                       m_bGripper = true;\r
+                                       RECT rectCtl = { 0 };\r
+                                       wndGripper.GetWindowRect(&rectCtl);\r
+                                       ::MapWindowPoints(NULL, pT->m_hWnd, (LPPOINT)&rectCtl, 2);\r
+                                       _AtlDlgResizeData data = { ATL_IDW_STATUS_BAR, DLSZ_MOVE_X | DLSZ_MOVE_Y | DLSZ_REPAINT | _DLSZ_GRIPPER, { rectCtl.left, rectCtl.top, rectCtl.right, rectCtl.bottom } };\r
+                                       m_arrData.Add(data);\r
+                               }\r
+                       }\r
+               }\r
+#else // CE specific\r
+               bAddGripper;   // avoid level 4 warning\r
+#endif // _WIN32_WCE\r
+\r
+               // Get min track position if requested\r
+               if(bUseMinTrackSize)\r
+               {\r
+                       if((dwStyle & WS_CHILD) != 0)\r
+                       {\r
+                               RECT rect = { 0 };\r
+                               pT->GetClientRect(&rect);\r
+                               m_ptMinTrackSize.x = rect.right - rect.left;\r
+                               m_ptMinTrackSize.y = rect.bottom - rect.top;\r
+                       }\r
+                       else\r
+                       {\r
+                               RECT rect = { 0 };\r
+                               pT->GetWindowRect(&rect);\r
+                               m_ptMinTrackSize.x = rect.right - rect.left;\r
+                               m_ptMinTrackSize.y = rect.bottom - rect.top;\r
+                       }\r
+               }\r
+\r
+               // Walk the map and initialize data\r
+               const _AtlDlgResizeMap* pMap = pT->GetDlgResizeMap();\r
+               ATLASSERT(pMap != NULL);\r
+               int nGroupStart = -1;\r
+               for(int nCount = 1; !(pMap->m_nCtlID == -1 && pMap->m_dwResizeFlags == 0); nCount++, pMap++)\r
+               {\r
+                       if(pMap->m_nCtlID == -1)\r
+                       {\r
+                               switch(pMap->m_dwResizeFlags)\r
+                               {\r
+                               case _DLSZ_BEGIN_GROUP:\r
+                                       ATLASSERT(nGroupStart == -1);\r
+                                       nGroupStart = m_arrData.GetSize();\r
+                                       break;\r
+                               case _DLSZ_END_GROUP:\r
+                                       {\r
+                                               ATLASSERT(nGroupStart != -1);\r
+                                               int nGroupCount = m_arrData.GetSize() - nGroupStart;\r
+                                               m_arrData[nGroupStart].SetGroupCount(nGroupCount);\r
+                                               nGroupStart = -1;\r
+                                       }\r
+                                       break;\r
+                               default:\r
+                                       ATLASSERT(FALSE && _T("Invalid DLGRESIZE Map Entry"));\r
+                                       break;\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               // this ID conflicts with the default gripper one\r
+                               ATLASSERT(m_bGripper ? (pMap->m_nCtlID != ATL_IDW_STATUS_BAR) : TRUE);\r
+\r
+                               ATL::CWindow ctl = pT->GetDlgItem(pMap->m_nCtlID);\r
+                               ATLASSERT(ctl.IsWindow());\r
+                               RECT rectCtl = { 0 };\r
+                               ctl.GetWindowRect(&rectCtl);\r
+                               ::MapWindowPoints(NULL, pT->m_hWnd, (LPPOINT)&rectCtl, 2);\r
+\r
+                               DWORD dwGroupFlag = (nGroupStart != -1 && m_arrData.GetSize() == nGroupStart) ? _DLSZ_BEGIN_GROUP : 0;\r
+                               _AtlDlgResizeData data = { pMap->m_nCtlID, pMap->m_dwResizeFlags | dwGroupFlag, { rectCtl.left, rectCtl.top, rectCtl.right, rectCtl.bottom } };\r
+                               m_arrData.Add(data);\r
+                       }\r
+               }\r
+               ATLASSERT((nGroupStart == -1) && _T("No End Group Entry in the DLGRESIZE Map"));\r
+       }\r
+\r
+       void DlgResize_UpdateLayout(int cxWidth, int cyHeight)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(::IsWindow(pT->m_hWnd));\r
+\r
+               // Restrict minimum size if requested\r
+               if(((pT->GetStyle() & WS_CHILD) != 0) && m_ptMinTrackSize.x != -1 && m_ptMinTrackSize.y != -1)\r
+               {\r
+                       if(cxWidth < m_ptMinTrackSize.x)\r
+                               cxWidth = m_ptMinTrackSize.x;\r
+                       if(cyHeight < m_ptMinTrackSize.y)\r
+                               cyHeight = m_ptMinTrackSize.y;\r
+               }\r
+\r
+               BOOL bVisible = pT->IsWindowVisible();\r
+               if(bVisible)\r
+                       pT->SetRedraw(FALSE);\r
+\r
+               for(int i = 0; i < m_arrData.GetSize(); i++)\r
+               {\r
+                       if((m_arrData[i].m_dwResizeFlags & _DLSZ_BEGIN_GROUP) != 0)   // start of a group\r
+                       {\r
+                               int nGroupCount = m_arrData[i].GetGroupCount();\r
+                               ATLASSERT(nGroupCount > 0 && i + nGroupCount - 1 < m_arrData.GetSize());\r
+                               RECT rectGroup = m_arrData[i].m_rect;\r
+\r
+                               int j = 1;\r
+                               for(j = 1; j < nGroupCount; j++)\r
+                               {\r
+                                       rectGroup.left = min(rectGroup.left, m_arrData[i + j].m_rect.left);\r
+                                       rectGroup.top = min(rectGroup.top, m_arrData[i + j].m_rect.top);\r
+                                       rectGroup.right = max(rectGroup.right, m_arrData[i + j].m_rect.right);\r
+                                       rectGroup.bottom = max(rectGroup.bottom, m_arrData[i + j].m_rect.bottom);\r
+                               }\r
+\r
+                               for(j = 0; j < nGroupCount; j++)\r
+                               {\r
+                                       _AtlDlgResizeData* pDataPrev = NULL;\r
+                                       if(j > 0)\r
+                                               pDataPrev = &(m_arrData[i + j - 1]);\r
+                                       pT->DlgResize_PositionControl(cxWidth, cyHeight, rectGroup, m_arrData[i + j], true, pDataPrev);\r
+                               }\r
+\r
+                               i += nGroupCount - 1;   // increment to skip all group controls\r
+                       }\r
+                       else // one control entry\r
+                       {\r
+                               RECT rectGroup = { 0, 0, 0, 0 };\r
+                               pT->DlgResize_PositionControl(cxWidth, cyHeight, rectGroup, m_arrData[i], false);\r
+                       }\r
+               }\r
+\r
+               if(bVisible)\r
+                       pT->SetRedraw(TRUE);\r
+\r
+               pT->RedrawWindow(NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_UPDATENOW | RDW_ALLCHILDREN);\r
+       }\r
+\r
+// Message map and handlers\r
+       BEGIN_MSG_MAP(CDialogResize)\r
+               MESSAGE_HANDLER(WM_SIZE, OnSize)\r
+#ifndef _WIN32_WCE\r
+               MESSAGE_HANDLER(WM_GETMINMAXINFO, OnGetMinMaxInfo)\r
+#endif // _WIN32_WCE\r
+       END_MSG_MAP()\r
+\r
+       LRESULT OnSize(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+#ifndef _WIN32_WCE\r
+               if(m_bGripper)\r
+               {\r
+                       ATL::CWindow wndGripper = pT->GetDlgItem(ATL_IDW_STATUS_BAR);\r
+                       if(wParam == SIZE_MAXIMIZED)\r
+                               wndGripper.ShowWindow(SW_HIDE);\r
+                       else if(wParam == SIZE_RESTORED)\r
+                               wndGripper.ShowWindow(SW_SHOW);\r
+               }\r
+#endif // _WIN32_WCE\r
+               if(wParam != SIZE_MINIMIZED)\r
+               {\r
+                       ATLASSERT(::IsWindow(pT->m_hWnd));\r
+                       pT->DlgResize_UpdateLayout(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));\r
+               }\r
+               return 0;\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       LRESULT OnGetMinMaxInfo(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/)\r
+       {\r
+               if(m_ptMinTrackSize.x != -1 && m_ptMinTrackSize.y != -1)\r
+               {\r
+                       LPMINMAXINFO lpMMI = (LPMINMAXINFO)lParam;\r
+                       lpMMI->ptMinTrackSize =  m_ptMinTrackSize;\r
+               }\r
+               return 0;\r
+       }\r
+#endif // _WIN32_WCE\r
+\r
+// Implementation\r
+       bool DlgResize_PositionControl(int cxWidth, int cyHeight, RECT& rectGroup, _AtlDlgResizeData& data, bool bGroup, \r
+                                      _AtlDlgResizeData* pDataPrev = NULL)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(::IsWindow(pT->m_hWnd));\r
+               ATL::CWindow ctl;\r
+               RECT rectCtl = { 0 };\r
+\r
+               ctl = pT->GetDlgItem(data.m_nCtlID);\r
+               if(!ctl.GetWindowRect(&rectCtl))\r
+                       return false;\r
+               ::MapWindowPoints(NULL, pT->m_hWnd, (LPPOINT)&rectCtl, 2);\r
+\r
+               if(bGroup)\r
+               {\r
+                       if((data.m_dwResizeFlags & DLSZ_CENTER_X) != 0)\r
+                       {\r
+                               int cxRight = rectGroup.right + cxWidth - m_sizeDialog.cx;\r
+                               int cxCtl = data.m_rect.right - data.m_rect.left;\r
+                               rectCtl.left = rectGroup.left + (cxRight - rectGroup.left - cxCtl) / 2;\r
+                               rectCtl.right = rectCtl.left + cxCtl;\r
+                       }\r
+                       else if((data.m_dwResizeFlags & (DLSZ_SIZE_X | DLSZ_MOVE_X)) != 0)\r
+                       {\r
+                               rectCtl.left = rectGroup.left + ::MulDiv(data.m_rect.left - rectGroup.left, rectGroup.right - rectGroup.left + (cxWidth - m_sizeDialog.cx), rectGroup.right - rectGroup.left);\r
+\r
+                               if((data.m_dwResizeFlags & DLSZ_SIZE_X) != 0)\r
+                               {\r
+                                       rectCtl.right = rectGroup.left + ::MulDiv(data.m_rect.right - rectGroup.left, rectGroup.right - rectGroup.left + (cxWidth - m_sizeDialog.cx), rectGroup.right - rectGroup.left);\r
+\r
+                                       if(pDataPrev != NULL)\r
+                                       {\r
+                                               ATL::CWindow ctlPrev = pT->GetDlgItem(pDataPrev->m_nCtlID);\r
+                                               RECT rcPrev = { 0 };\r
+                                               ctlPrev.GetWindowRect(&rcPrev);\r
+                                               ::MapWindowPoints(NULL, pT->m_hWnd, (LPPOINT)&rcPrev, 2);\r
+                                               int dxAdjust = (rectCtl.left - rcPrev.right) - (data.m_rect.left - pDataPrev->m_rect.right);\r
+                                               rcPrev.right += dxAdjust;\r
+                                               ctlPrev.SetWindowPos(NULL, &rcPrev, SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOMOVE);\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       rectCtl.right = rectCtl.left + (data.m_rect.right - data.m_rect.left);\r
+                               }\r
+                       }\r
+\r
+                       if((data.m_dwResizeFlags & DLSZ_CENTER_Y) != 0)\r
+                       {\r
+                               int cyBottom = rectGroup.bottom + cyHeight - m_sizeDialog.cy;\r
+                               int cyCtl = data.m_rect.bottom - data.m_rect.top;\r
+                               rectCtl.top = rectGroup.top + (cyBottom - rectGroup.top - cyCtl) / 2;\r
+                               rectCtl.bottom = rectCtl.top + cyCtl;\r
+                       }\r
+                       else if((data.m_dwResizeFlags & (DLSZ_SIZE_Y | DLSZ_MOVE_Y)) != 0)\r
+                       {\r
+                               rectCtl.top = rectGroup.top + ::MulDiv(data.m_rect.top - rectGroup.top, rectGroup.bottom - rectGroup.top + (cyHeight - m_sizeDialog.cy), rectGroup.bottom - rectGroup.top);\r
+\r
+                               if((data.m_dwResizeFlags & DLSZ_SIZE_Y) != 0)\r
+                               {\r
+                                       rectCtl.bottom = rectGroup.top + ::MulDiv(data.m_rect.bottom - rectGroup.top, rectGroup.bottom - rectGroup.top + (cyHeight - m_sizeDialog.cy), rectGroup.bottom - rectGroup.top);\r
+\r
+                                       if(pDataPrev != NULL)\r
+                                       {\r
+                                               ATL::CWindow ctlPrev = pT->GetDlgItem(pDataPrev->m_nCtlID);\r
+                                               RECT rcPrev = { 0 };\r
+                                               ctlPrev.GetWindowRect(&rcPrev);\r
+                                               ::MapWindowPoints(NULL, pT->m_hWnd, (LPPOINT)&rcPrev, 2);\r
+                                               int dxAdjust = (rectCtl.top - rcPrev.bottom) - (data.m_rect.top - pDataPrev->m_rect.bottom);\r
+                                               rcPrev.bottom += dxAdjust;\r
+                                               ctlPrev.SetWindowPos(NULL, &rcPrev, SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOMOVE);\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       rectCtl.bottom = rectCtl.top + (data.m_rect.bottom - data.m_rect.top);\r
+                               }\r
+                       }\r
+               }\r
+               else // no group\r
+               {\r
+                       if((data.m_dwResizeFlags & DLSZ_CENTER_X) != 0)\r
+                       {\r
+                               int cxCtl = data.m_rect.right - data.m_rect.left;\r
+                               rectCtl.left = (cxWidth - cxCtl) / 2;\r
+                               rectCtl.right = rectCtl.left + cxCtl;\r
+                       }\r
+                       else if((data.m_dwResizeFlags & (DLSZ_SIZE_X | DLSZ_MOVE_X)) != 0)\r
+                       {\r
+                               rectCtl.right = data.m_rect.right + (cxWidth - m_sizeDialog.cx);\r
+\r
+                               if((data.m_dwResizeFlags & DLSZ_MOVE_X) != 0)\r
+                                       rectCtl.left = rectCtl.right - (data.m_rect.right - data.m_rect.left);\r
+                       }\r
+\r
+                       if((data.m_dwResizeFlags & DLSZ_CENTER_Y) != 0)\r
+                       {\r
+                               int cyCtl = data.m_rect.bottom - data.m_rect.top;\r
+                               rectCtl.top = (cyHeight - cyCtl) / 2;\r
+                               rectCtl.bottom = rectCtl.top + cyCtl;\r
+                       }\r
+                       else if((data.m_dwResizeFlags & (DLSZ_SIZE_Y | DLSZ_MOVE_Y)) != 0)\r
+                       {\r
+                               rectCtl.bottom = data.m_rect.bottom + (cyHeight - m_sizeDialog.cy);\r
+\r
+                               if((data.m_dwResizeFlags & DLSZ_MOVE_Y) != 0)\r
+                                       rectCtl.top = rectCtl.bottom - (data.m_rect.bottom - data.m_rect.top);\r
+                       }\r
+               }\r
+\r
+               if((data.m_dwResizeFlags & DLSZ_REPAINT) != 0)\r
+                       ctl.Invalidate();\r
+\r
+               if((data.m_dwResizeFlags & (DLSZ_SIZE_X | DLSZ_SIZE_Y | DLSZ_MOVE_X | DLSZ_MOVE_Y | DLSZ_REPAINT | DLSZ_CENTER_X | DLSZ_CENTER_Y)) != 0)\r
+                       ctl.SetWindowPos(NULL, &rectCtl, SWP_NOZORDER | SWP_NOACTIVATE);\r
+\r
+               return true;\r
+       }\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CDoubleBufferImpl - Provides double-buffer painting support to any window\r
+\r
+template <class T>\r
+class CDoubleBufferImpl\r
+{\r
+public:\r
+// Overrideables\r
+       void DoPaint(CDCHandle /*dc*/)\r
+       {\r
+               // must be implemented in a derived class\r
+               ATLASSERT(FALSE);\r
+       }\r
+\r
+// Message map and handlers\r
+       BEGIN_MSG_MAP(CDoubleBufferImpl)\r
+               MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground)\r
+               MESSAGE_HANDLER(WM_PAINT, OnPaint)\r
+#ifndef _WIN32_WCE\r
+               MESSAGE_HANDLER(WM_PRINTCLIENT, OnPaint)\r
+#endif // !_WIN32_WCE\r
+       END_MSG_MAP()\r
+\r
+       LRESULT OnEraseBackground(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)\r
+       {\r
+               return 1;   // no background painting needed\r
+       }\r
+\r
+       LRESULT OnPaint(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(::IsWindow(pT->m_hWnd));\r
+\r
+               if(wParam != NULL)\r
+               {\r
+                       RECT rect = { 0 };\r
+                       pT->GetClientRect(&rect);\r
+                       CMemoryDC dcMem((HDC)wParam, rect);\r
+                       pT->DoPaint(dcMem.m_hDC);\r
+               }\r
+               else\r
+               {\r
+                       CPaintDC dc(pT->m_hWnd);\r
+                       CMemoryDC dcMem(dc.m_hDC, dc.m_ps.rcPaint);\r
+                       pT->DoPaint(dcMem.m_hDC);\r
+               }\r
+\r
+               return 0;\r
+       }\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CDoubleBufferWindowImpl - Implements a double-buffer painting window\r
+\r
+template <class T, class TBase = ATL::CWindow, class TWinTraits = ATL::CControlWinTraits>\r
+class ATL_NO_VTABLE CDoubleBufferWindowImpl : public ATL::CWindowImpl< T, TBase, TWinTraits >, public CDoubleBufferImpl< T >\r
+{\r
+public:\r
+       BEGIN_MSG_MAP(CDoubleBufferWindowImpl)\r
+               CHAIN_MSG_MAP(CDoubleBufferImpl< T >)\r
+       END_MSG_MAP()\r
+};\r
+\r
+\r
+// command bar support\r
+#if !defined(__ATLCTRLW_H__) && !defined(_WIN32_WCE)\r
+  #undef CBRM_GETMENU\r
+  #undef CBRM_TRACKPOPUPMENU\r
+  #undef CBRM_GETCMDBAR\r
+  #undef CBRPOPUPMENU\r
+#endif // !defined(__ATLCTRLW_H__) && !defined(_WIN32_WCE)\r
+\r
+}; // namespace WTL\r
+\r
+#endif // __ATLFRAME_H__\r
diff --git a/WTL80/include/atlgdi.h b/WTL80/include/atlgdi.h
new file mode 100644 (file)
index 0000000..49a1371
--- /dev/null
@@ -0,0 +1,3850 @@
+// Windows Template Library - WTL version 8.0\r
+// Copyright (C) Microsoft Corporation. All rights reserved.\r
+//\r
+// This file is a part of the Windows Template Library.\r
+// The use and distribution terms for this software are covered by the\r
+// Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php)\r
+// which can be found in the file CPL.TXT at the root of this distribution.\r
+// By using this software in any fashion, you are agreeing to be bound by\r
+// the terms of this license. You must not remove this notice, or\r
+// any other, from this software.\r
+\r
+#ifndef __ATLGDI_H__\r
+#define __ATLGDI_H__\r
+\r
+#pragma once\r
+\r
+#ifndef __cplusplus\r
+       #error ATL requires C++ compilation (use a .cpp suffix)\r
+#endif\r
+\r
+#ifndef __ATLAPP_H__\r
+       #error atlgdi.h requires atlapp.h to be included first\r
+#endif\r
+\r
+\r
+// protect template members from windowsx.h macros\r
+#ifdef _INC_WINDOWSX\r
+  #undef CopyRgn\r
+  #undef CreateBrush\r
+  #undef CreatePen\r
+  #undef SelectBrush\r
+  #undef SelectPen\r
+  #undef SelectFont\r
+  #undef SelectBitmap\r
+#endif // _INC_WINDOWSX\r
+\r
+// required libraries\r
+#if !defined(_ATL_NO_MSIMG) && !defined(_WIN32_WCE)\r
+  #pragma comment(lib, "msimg32.lib")\r
+#endif // !defined(_ATL_NO_MSIMG) && !defined(_WIN32_WCE)\r
+#if !defined(_ATL_NO_OPENGL) && !defined(_WIN32_WCE)\r
+  #pragma comment(lib, "opengl32.lib")\r
+#endif // !defined(_ATL_NO_OPENGL) && !defined(_WIN32_WCE)\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Classes in this file:\r
+//\r
+// CPenT<t_bManaged>\r
+// CBrushT<t_bManaged>\r
+// CLogFont\r
+// CFontT<t_bManaged>\r
+// CBitmapT<t_bManaged>\r
+// CPaletteT<t_bManaged>\r
+// CRgnT<t_bManaged>\r
+// CDCT<t_bManaged>\r
+// CPaintDC\r
+// CClientDC\r
+// CWindowDC\r
+// CMemoryDC\r
+// CEnhMetaFileInfo\r
+// CEnhMetaFileT<t_bManaged>\r
+// CEnhMetaFileDC\r
+//\r
+// Global functions:\r
+//   AtlGetBitmapResourceInfo()\r
+//   AtlGetBitmapResourceBitsPerPixel()\r
+//   AtlIsAlphaBitmapResource()\r
+//   AtlIsDib16()\r
+//   AtlGetDibColorTableSize()\r
+//   AtlGetDibNumColors(),\r
+//   AtlGetDibBitmap()\r
+//   AtlCopyBitmap()\r
+//   AtlCreatePackedDib16()\r
+//   AtlSetClipboardDib16()\r
+//   AtlGetClipboardDib()\r
+\r
+\r
+namespace WTL\r
+{\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Bitmap resource helpers to extract bitmap information for a bitmap resource\r
+\r
+inline LPBITMAPINFOHEADER AtlGetBitmapResourceInfo(HMODULE hModule, ATL::_U_STRINGorID image)\r
+{\r
+       HRSRC hResource = ::FindResource(hModule, image.m_lpstr, RT_BITMAP);\r
+       ATLASSERT(hResource != NULL);\r
+       HGLOBAL hGlobal = ::LoadResource(hModule, hResource);\r
+       ATLASSERT(hGlobal != NULL);\r
+       LPBITMAPINFOHEADER pBitmapInfoHeader = (LPBITMAPINFOHEADER)::LockResource(hGlobal);\r
+       ATLASSERT(pBitmapInfoHeader != NULL);\r
+       return pBitmapInfoHeader;\r
+}\r
+\r
+inline WORD AtlGetBitmapResourceBitsPerPixel(HMODULE hModule, ATL::_U_STRINGorID image)\r
+{\r
+       LPBITMAPINFOHEADER pBitmapInfoHeader = AtlGetBitmapResourceInfo(hModule, image);\r
+       ATLASSERT(pBitmapInfoHeader != NULL);\r
+       return pBitmapInfoHeader->biBitCount;\r
+}\r
+\r
+inline WORD AtlGetBitmapResourceBitsPerPixel(ATL::_U_STRINGorID image)\r
+{\r
+       return AtlGetBitmapResourceBitsPerPixel(ModuleHelper::GetResourceInstance(), image);\r
+}\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// 32-bit (alpha channel) bitmap resource helper\r
+\r
+// Note: 32-bit (alpha channel) images work only on Windows XP with Common Controls version 6.\r
+// If you want your app to work on older version of Windows, load non-alpha images if Common\r
+// Controls version is less than 6.\r
+\r
+inline bool AtlIsAlphaBitmapResource(ATL::_U_STRINGorID image)\r
+{\r
+       return (AtlGetBitmapResourceBitsPerPixel(image) == 32);\r
+}\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CPen\r
+\r
+template <bool t_bManaged>\r
+class CPenT\r
+{\r
+public:\r
+// Data members\r
+       HPEN m_hPen;\r
+\r
+// Constructor/destructor/operators\r
+       CPenT(HPEN hPen = NULL) : m_hPen(hPen)\r
+       { }\r
+\r
+       ~CPenT()\r
+       {\r
+               if(t_bManaged && m_hPen != NULL)\r
+                       DeleteObject();\r
+       }\r
+\r
+       CPenT<t_bManaged>& operator =(HPEN hPen)\r
+       {\r
+               Attach(hPen);\r
+               return *this;\r
+       }\r
+\r
+       void Attach(HPEN hPen)\r
+       {\r
+               if(t_bManaged && m_hPen != NULL && m_hPen != hPen)\r
+                       ::DeleteObject(m_hPen);\r
+               m_hPen = hPen;\r
+       }\r
+\r
+       HPEN Detach()\r
+       {\r
+               HPEN hPen = m_hPen;\r
+               m_hPen = NULL;\r
+               return hPen;\r
+       }\r
+\r
+       operator HPEN() const { return m_hPen; }\r
+\r
+       bool IsNull() const { return (m_hPen == NULL); }\r
+\r
+// Create methods\r
+       HPEN CreatePen(int nPenStyle, int nWidth, COLORREF crColor)\r
+       {\r
+               ATLASSERT(m_hPen == NULL);\r
+               m_hPen = ::CreatePen(nPenStyle, nWidth, crColor);\r
+               return m_hPen;\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       HPEN CreatePen(int nPenStyle, int nWidth, const LOGBRUSH* pLogBrush, int nStyleCount = 0, const DWORD* lpStyle = NULL)\r
+       {\r
+               ATLASSERT(m_hPen == NULL);\r
+               m_hPen = ::ExtCreatePen(nPenStyle, nWidth, pLogBrush, nStyleCount, lpStyle);\r
+               return m_hPen;\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       HPEN CreatePenIndirect(LPLOGPEN lpLogPen)\r
+       {\r
+               ATLASSERT(m_hPen == NULL);\r
+               m_hPen = ::CreatePenIndirect(lpLogPen);\r
+               return m_hPen;\r
+       }\r
+\r
+       BOOL DeleteObject()\r
+       {\r
+               ATLASSERT(m_hPen != NULL);\r
+               BOOL bRet = ::DeleteObject(m_hPen);\r
+               if(bRet)\r
+                       m_hPen = NULL;\r
+               return bRet;\r
+       }\r
+\r
+// Attributes\r
+       int GetLogPen(LOGPEN* pLogPen) const\r
+       {\r
+               ATLASSERT(m_hPen != NULL);\r
+               return ::GetObject(m_hPen, sizeof(LOGPEN), pLogPen);\r
+       }\r
+\r
+       bool GetLogPen(LOGPEN& LogPen) const\r
+       {\r
+               ATLASSERT(m_hPen != NULL);\r
+               return (::GetObject(m_hPen, sizeof(LOGPEN), &LogPen) == sizeof(LOGPEN));\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       int GetExtLogPen(EXTLOGPEN* pLogPen) const\r
+       {\r
+               ATLASSERT(m_hPen != NULL);\r
+               return ::GetObject(m_hPen, sizeof(EXTLOGPEN), pLogPen);\r
+       }\r
+\r
+       bool GetExtLogPen(EXTLOGPEN& ExtLogPen) const\r
+       {\r
+               ATLASSERT(m_hPen != NULL);\r
+               return (::GetObject(m_hPen, sizeof(EXTLOGPEN), &ExtLogPen) == sizeof(EXTLOGPEN));\r
+       }\r
+#endif // !_WIN32_WCE\r
+};\r
+\r
+typedef CPenT<false>   CPenHandle;\r
+typedef CPenT<true>    CPen;\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CBrush\r
+\r
+template <bool t_bManaged>\r
+class CBrushT\r
+{\r
+public:\r
+// Data members\r
+       HBRUSH m_hBrush;\r
+\r
+// Constructor/destructor/operators\r
+       CBrushT(HBRUSH hBrush = NULL) : m_hBrush(hBrush)\r
+       { }\r
+\r
+       ~CBrushT()\r
+       {\r
+               if(t_bManaged && m_hBrush != NULL)\r
+                       DeleteObject();\r
+       }\r
+\r
+       CBrushT<t_bManaged>& operator =(HBRUSH hBrush)\r
+       {\r
+               Attach(hBrush);\r
+               return *this;\r
+       }\r
+\r
+       void Attach(HBRUSH hBrush)\r
+       {\r
+               if(t_bManaged && m_hBrush != NULL && m_hBrush != hBrush)\r
+                       ::DeleteObject(m_hBrush);\r
+               m_hBrush = hBrush;\r
+       }\r
+\r
+       HBRUSH Detach()\r
+       {\r
+               HBRUSH hBrush = m_hBrush;\r
+               m_hBrush = NULL;\r
+               return hBrush;\r
+       }\r
+\r
+       operator HBRUSH() const { return m_hBrush; }\r
+\r
+       bool IsNull() const { return (m_hBrush == NULL); }\r
+\r
+// Create methods\r
+       HBRUSH CreateSolidBrush(COLORREF crColor)\r
+       {\r
+               ATLASSERT(m_hBrush == NULL);\r
+               m_hBrush = ::CreateSolidBrush(crColor);\r
+               return m_hBrush;\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       HBRUSH CreateHatchBrush(int nIndex, COLORREF crColor)\r
+       {\r
+               ATLASSERT(m_hBrush == NULL);\r
+               m_hBrush = ::CreateHatchBrush(nIndex, crColor);\r
+               return m_hBrush;\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+#if !defined(_WIN32_WCE) || (_ATL_VER >= 0x0800)\r
+       HBRUSH CreateBrushIndirect(const LOGBRUSH* lpLogBrush)\r
+       {\r
+               ATLASSERT(m_hBrush == NULL);\r
+#ifndef _WIN32_WCE\r
+               m_hBrush = ::CreateBrushIndirect(lpLogBrush);\r
+#else // CE specific\r
+               m_hBrush = ATL::CreateBrushIndirect(lpLogBrush);\r
+#endif // _WIN32_WCE\r
+               return m_hBrush;\r
+       }\r
+#endif // !defined(_WIN32_WCE) || (_ATL_VER >= 0x0800)\r
+\r
+       HBRUSH CreatePatternBrush(HBITMAP hBitmap)\r
+       {\r
+               ATLASSERT(m_hBrush == NULL);\r
+               m_hBrush = ::CreatePatternBrush(hBitmap);\r
+               return m_hBrush;\r
+       }\r
+\r
+       HBRUSH CreateDIBPatternBrush(HGLOBAL hPackedDIB, UINT nUsage)\r
+       {\r
+               ATLASSERT(hPackedDIB != NULL);\r
+               const void* lpPackedDIB = GlobalLock(hPackedDIB);\r
+               ATLASSERT(lpPackedDIB != NULL);\r
+               m_hBrush = ::CreateDIBPatternBrushPt(lpPackedDIB, nUsage);\r
+               GlobalUnlock(hPackedDIB);\r
+               return m_hBrush;\r
+       }\r
+\r
+       HBRUSH CreateDIBPatternBrush(const void* lpPackedDIB, UINT nUsage)\r
+       {\r
+               ATLASSERT(m_hBrush == NULL);\r
+               m_hBrush = ::CreateDIBPatternBrushPt(lpPackedDIB, nUsage);\r
+               return m_hBrush;\r
+       }\r
+\r
+       HBRUSH CreateSysColorBrush(int nIndex)\r
+       {\r
+               ATLASSERT(m_hBrush == NULL);\r
+               m_hBrush = ::GetSysColorBrush(nIndex);\r
+               return m_hBrush;\r
+       }\r
+\r
+       BOOL DeleteObject()\r
+       {\r
+               ATLASSERT(m_hBrush != NULL);\r
+               BOOL bRet = ::DeleteObject(m_hBrush);\r
+               if(bRet)\r
+                       m_hBrush = NULL;\r
+               return bRet;\r
+       }\r
+\r
+// Attributes\r
+       int GetLogBrush(LOGBRUSH* pLogBrush) const\r
+       {\r
+               ATLASSERT(m_hBrush != NULL);\r
+               return ::GetObject(m_hBrush, sizeof(LOGBRUSH), pLogBrush);\r
+       }\r
+\r
+       bool GetLogBrush(LOGBRUSH& LogBrush) const\r
+       {\r
+               ATLASSERT(m_hBrush != NULL);\r
+               return (::GetObject(m_hBrush, sizeof(LOGBRUSH), &LogBrush) == sizeof(LOGBRUSH));\r
+       }\r
+};\r
+\r
+typedef CBrushT<false>   CBrushHandle;\r
+typedef CBrushT<true>    CBrush;\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CFont\r
+\r
+class CLogFont : public LOGFONT\r
+{\r
+public:\r
+       CLogFont()\r
+       {\r
+               memset(this, 0, sizeof(LOGFONT));\r
+       }\r
+\r
+       CLogFont(const LOGFONT& lf)\r
+       {\r
+               Copy(&lf);\r
+       }\r
+\r
+       CLogFont(HFONT hFont)\r
+       {\r
+               ATLASSERT(::GetObjectType(hFont) == OBJ_FONT);\r
+               ::GetObject(hFont, sizeof(LOGFONT), (LOGFONT*)this);\r
+       }\r
+\r
+       HFONT CreateFontIndirect()\r
+       {\r
+               return ::CreateFontIndirect(this);\r
+       }\r
+\r
+       void SetBold()\r
+       {\r
+               lfWeight = FW_BOLD;\r
+       }\r
+\r
+       bool IsBold() const\r
+       {\r
+               return (lfWeight >= FW_BOLD);\r
+       }\r
+\r
+       void MakeBolder(int iScale = 1)\r
+       {\r
+               lfWeight += FW_BOLD * iScale;\r
+       }\r
+\r
+       void MakeLarger(int iScale)\r
+       {\r
+               if(lfHeight > 0)\r
+                       lfHeight += iScale;\r
+               else\r
+                       lfHeight -= iScale;\r
+       }\r
+\r
+       void SetHeight(LONG nPointSize, HDC hDC = NULL)\r
+       {\r
+               // For MM_TEXT mapping mode\r
+               lfHeight = -::MulDiv(nPointSize, ::GetDeviceCaps(hDC, LOGPIXELSY), 72);\r
+       }\r
+\r
+       LONG GetHeight(HDC hDC = NULL) const\r
+       {\r
+               // For MM_TEXT mapping mode\r
+               return ::MulDiv(-lfHeight, 72, ::GetDeviceCaps(hDC, LOGPIXELSY));\r
+       }\r
+\r
+       LONG GetDeciPointHeight(HDC hDC = NULL) const\r
+       {\r
+#ifndef _WIN32_WCE\r
+               POINT ptOrg = { 0, 0 };\r
+               ::DPtoLP(hDC, &ptOrg, 1);\r
+               POINT pt = { 0, 0 };\r
+               pt.y = abs(lfHeight) + ptOrg.y;\r
+               ::LPtoDP(hDC,&pt,1);\r
+               return ::MulDiv(pt.y, 720, ::GetDeviceCaps(hDC, LOGPIXELSY));   // 72 points/inch, 10 decipoints/point\r
+#else // CE specific\r
+               // DP and LP are always the same on CE\r
+               return ::MulDiv(abs(lfHeight), 720, ::GetDeviceCaps(hDC, LOGPIXELSY));   // 72 points/inch, 10 decipoints/point\r
+#endif // _WIN32_WCE\r
+       }\r
+\r
+       void SetHeightFromDeciPoint(LONG nDeciPtHeight, HDC hDC = NULL)\r
+       {\r
+#ifndef _WIN32_WCE\r
+               POINT pt = { 0, 0 };\r
+               pt.y = ::MulDiv(::GetDeviceCaps(hDC, LOGPIXELSY), nDeciPtHeight, 720);   // 72 points/inch, 10 decipoints/point\r
+               ::DPtoLP(hDC, &pt, 1);\r
+               POINT ptOrg = { 0, 0 };\r
+               ::DPtoLP(hDC, &ptOrg, 1);\r
+               lfHeight = -abs(pt.y - ptOrg.y);\r
+#else // CE specific\r
+               // DP and LP are always the same on CE\r
+               lfHeight = -abs(::MulDiv(::GetDeviceCaps(hDC, LOGPIXELSY), nDeciPtHeight, 720));   // 72 points/inch, 10 decipoints/point\r
+#endif // _WIN32_WCE\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       void SetCaptionFont()\r
+       {\r
+               NONCLIENTMETRICS ncm = { RunTimeHelper::SizeOf_NONCLIENTMETRICS() };\r
+               ATLVERIFY(::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(ncm), &ncm, 0));\r
+               Copy(&ncm.lfCaptionFont);\r
+       }\r
+\r
+       void SetMenuFont()\r
+       {\r
+               NONCLIENTMETRICS ncm = { RunTimeHelper::SizeOf_NONCLIENTMETRICS() };\r
+               ATLVERIFY(::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(ncm), &ncm, 0));\r
+               Copy(&ncm.lfMenuFont);\r
+       }\r
+\r
+       void SetStatusFont()\r
+       {\r
+               NONCLIENTMETRICS ncm = { RunTimeHelper::SizeOf_NONCLIENTMETRICS() };\r
+               ATLVERIFY(::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(ncm), &ncm, 0));\r
+               Copy(&ncm.lfStatusFont);\r
+       }\r
+\r
+       void SetMessageBoxFont()\r
+       {\r
+               NONCLIENTMETRICS ncm = { RunTimeHelper::SizeOf_NONCLIENTMETRICS() };\r
+               ATLVERIFY(::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(ncm), &ncm, 0));\r
+               Copy(&ncm.lfMessageFont);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       void Copy(const LOGFONT* pLogFont)\r
+       {\r
+               ATLASSERT(pLogFont != NULL);\r
+               *(LOGFONT*)this = *pLogFont;\r
+       }\r
+\r
+       CLogFont& operator =(const CLogFont& src)\r
+       {\r
+               Copy(&src);\r
+               return *this;\r
+       }\r
+\r
+       CLogFont& operator =(const LOGFONT& src)\r
+       {\r
+               Copy(&src);\r
+               return *this;\r
+       }\r
+\r
+       CLogFont& operator =(HFONT hFont)\r
+       {\r
+               ATLASSERT(::GetObjectType(hFont) == OBJ_FONT);\r
+               ::GetObject(hFont, sizeof(LOGFONT), (LOGFONT*)this);\r
+               return *this;\r
+       }\r
+\r
+       bool operator ==(const LOGFONT& logfont) const\r
+       {\r
+               return(logfont.lfHeight == lfHeight &&\r
+                      logfont.lfWidth == lfWidth &&\r
+                      logfont.lfEscapement == lfEscapement &&\r
+                      logfont.lfOrientation == lfOrientation &&\r
+                      logfont.lfWeight == lfWeight &&\r
+                      logfont.lfItalic == lfItalic &&\r
+                      logfont.lfUnderline == lfUnderline &&\r
+                      logfont.lfStrikeOut == lfStrikeOut &&\r
+                      logfont.lfCharSet == lfCharSet &&\r
+                      logfont.lfOutPrecision == lfOutPrecision &&\r
+                      logfont.lfClipPrecision == lfClipPrecision &&\r
+                      logfont.lfQuality == lfQuality &&\r
+                      logfont.lfPitchAndFamily == lfPitchAndFamily &&\r
+                      lstrcmp(logfont.lfFaceName, lfFaceName) == 0);\r
+       }\r
+};\r
+\r
+\r
+template <bool t_bManaged>\r
+class CFontT\r
+{\r
+public:\r
+// Data members\r
+       HFONT m_hFont;\r
+\r
+// Constructor/destructor/operators\r
+       CFontT(HFONT hFont = NULL) : m_hFont(hFont)\r
+       { }\r
+\r
+       ~CFontT()\r
+       {\r
+               if(t_bManaged && m_hFont != NULL)\r
+                       DeleteObject();\r
+       }\r
+\r
+       CFontT<t_bManaged>& operator =(HFONT hFont)\r
+       {\r
+               Attach(hFont);\r
+               return *this;\r
+       }\r
+\r
+       void Attach(HFONT hFont)\r
+       {\r
+               if(t_bManaged && m_hFont != NULL && m_hFont != hFont)\r
+                       ::DeleteObject(m_hFont);\r
+               m_hFont = hFont;\r
+       }\r
+\r
+       HFONT Detach()\r
+       {\r
+               HFONT hFont = m_hFont;\r
+               m_hFont = NULL;\r
+               return hFont;\r
+       }\r
+\r
+       operator HFONT() const { return m_hFont; }\r
+\r
+       bool IsNull() const { return (m_hFont == NULL); }\r
+\r
+// Create methods\r
+       HFONT CreateFontIndirect(const LOGFONT* lpLogFont)\r
+       {\r
+               ATLASSERT(m_hFont == NULL);\r
+               m_hFont = ::CreateFontIndirect(lpLogFont);\r
+               return m_hFont;\r
+       }\r
+\r
+#if !defined(_WIN32_WCE) && (_WIN32_WINNT >= 0x0500)\r
+       HFONT CreateFontIndirectEx(CONST ENUMLOGFONTEXDV* penumlfex)\r
+       {\r
+               ATLASSERT(m_hFont == NULL);\r
+               m_hFont = ::CreateFontIndirectEx(penumlfex);\r
+               return m_hFont;\r
+       }\r
+#endif // !defined(_WIN32_WCE) && (_WIN32_WINNT >= 0x0500)\r
+\r
+#if !defined(_WIN32_WCE) || (_ATL_VER >= 0x0800)\r
+       HFONT CreateFont(int nHeight, int nWidth, int nEscapement,\r
+                       int nOrientation, int nWeight, BYTE bItalic, BYTE bUnderline,\r
+                       BYTE cStrikeOut, BYTE nCharSet, BYTE nOutPrecision,\r
+                       BYTE nClipPrecision, BYTE nQuality, BYTE nPitchAndFamily,\r
+                       LPCTSTR lpszFacename)\r
+       {\r
+               ATLASSERT(m_hFont == NULL);\r
+#ifndef _WIN32_WCE\r
+               m_hFont = ::CreateFont(nHeight, nWidth, nEscapement,\r
+                       nOrientation, nWeight, bItalic, bUnderline, cStrikeOut,\r
+                       nCharSet, nOutPrecision, nClipPrecision, nQuality,\r
+                       nPitchAndFamily, lpszFacename);\r
+#else // CE specific\r
+               m_hFont = ATL::CreateFont(nHeight, nWidth, nEscapement,\r
+                       nOrientation, nWeight, bItalic, bUnderline, cStrikeOut,\r
+                       nCharSet, nOutPrecision, nClipPrecision, nQuality,\r
+                       nPitchAndFamily, lpszFacename);\r
+#endif // _WIN32_WCE\r
+               return m_hFont;\r
+       }\r
+#endif // !defined(_WIN32_WCE) || (_ATL_VER >= 0x0800)\r
+\r
+       HFONT CreatePointFont(int nPointSize, LPCTSTR lpszFaceName, HDC hDC = NULL, bool bBold = false, bool bItalic = false)\r
+       {\r
+               LOGFONT logFont = { 0 };\r
+               logFont.lfCharSet = DEFAULT_CHARSET;\r
+               logFont.lfHeight = nPointSize;\r
+               SecureHelper::strncpy_x(logFont.lfFaceName, _countof(logFont.lfFaceName), lpszFaceName, _TRUNCATE);\r
+\r
+               if(bBold)\r
+                       logFont.lfWeight = FW_BOLD;\r
+               if(bItalic)\r
+                       logFont.lfItalic = (BYTE)TRUE;\r
+\r
+               return CreatePointFontIndirect(&logFont, hDC);\r
+       }\r
+\r
+       HFONT CreatePointFontIndirect(const LOGFONT* lpLogFont, HDC hDC = NULL)\r
+       {\r
+               HDC hDC1 = (hDC != NULL) ? hDC : ::GetDC(NULL);\r
+\r
+               // convert nPointSize to logical units based on hDC\r
+               LOGFONT logFont = *lpLogFont;\r
+#ifndef _WIN32_WCE\r
+               POINT pt = { 0, 0 };\r
+               pt.y = ::MulDiv(::GetDeviceCaps(hDC1, LOGPIXELSY), logFont.lfHeight, 720);   // 72 points/inch, 10 decipoints/point\r
+               ::DPtoLP(hDC1, &pt, 1);\r
+               POINT ptOrg = { 0, 0 };\r
+               ::DPtoLP(hDC1, &ptOrg, 1);\r
+               logFont.lfHeight = -abs(pt.y - ptOrg.y);\r
+#else // CE specific\r
+               // DP and LP are always the same on CE\r
+               logFont.lfHeight = -abs(::MulDiv(::GetDeviceCaps(hDC1, LOGPIXELSY), logFont.lfHeight, 720));   // 72 points/inch, 10 decipoints/point\r
+#endif // _WIN32_WCE\r
+\r
+               if(hDC == NULL)\r
+                       ::ReleaseDC(NULL, hDC1);\r
+\r
+               return CreateFontIndirect(&logFont);\r
+       }\r
+\r
+       BOOL DeleteObject()\r
+       {\r
+               ATLASSERT(m_hFont != NULL);\r
+               BOOL bRet = ::DeleteObject(m_hFont);\r
+               if(bRet)\r
+                       m_hFont = NULL;\r
+               return bRet;\r
+       }\r
+\r
+// Attributes\r
+       int GetLogFont(LOGFONT* pLogFont) const\r
+       {\r
+               ATLASSERT(m_hFont != NULL);\r
+               return ::GetObject(m_hFont, sizeof(LOGFONT), pLogFont);\r
+       }\r
+\r
+       bool GetLogFont(LOGFONT& LogFont) const\r
+       {\r
+               ATLASSERT(m_hFont != NULL);\r
+               return (::GetObject(m_hFont, sizeof(LOGFONT), &LogFont) == sizeof(LOGFONT));\r
+       }\r
+};\r
+\r
+typedef CFontT<false>   CFontHandle;\r
+typedef CFontT<true>    CFont;\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CBitmap\r
+\r
+template <bool t_bManaged>\r
+class CBitmapT\r
+{\r
+public:\r
+// Data members\r
+       HBITMAP m_hBitmap;\r
+\r
+// Constructor/destructor/operators\r
+       CBitmapT(HBITMAP hBitmap = NULL) : m_hBitmap(hBitmap)\r
+       { }\r
+\r
+       ~CBitmapT()\r
+       {\r
+               if(t_bManaged && m_hBitmap != NULL)\r
+                       DeleteObject();\r
+       }\r
+\r
+       CBitmapT<t_bManaged>& operator =(HBITMAP hBitmap)\r
+       {\r
+               Attach(hBitmap);\r
+               return *this;\r
+       }\r
+\r
+       void Attach(HBITMAP hBitmap)\r
+       {\r
+               if(t_bManaged && m_hBitmap != NULL&& m_hBitmap != hBitmap)\r
+                       ::DeleteObject(m_hBitmap);\r
+               m_hBitmap = hBitmap;\r
+       }\r
+\r
+       HBITMAP Detach()\r
+       {\r
+               HBITMAP hBitmap = m_hBitmap;\r
+               m_hBitmap = NULL;\r
+               return hBitmap;\r
+       }\r
+\r
+       operator HBITMAP() const { return m_hBitmap; }\r
+\r
+       bool IsNull() const { return (m_hBitmap == NULL); }\r
+\r
+// Create and load methods\r
+       HBITMAP LoadBitmap(ATL::_U_STRINGorID bitmap)\r
+       {\r
+               ATLASSERT(m_hBitmap == NULL);\r
+               m_hBitmap = ::LoadBitmap(ModuleHelper::GetResourceInstance(), bitmap.m_lpstr);\r
+               return m_hBitmap;\r
+       }\r
+\r
+       HBITMAP LoadOEMBitmap(UINT nIDBitmap) // for OBM_/OCR_/OIC_\r
+       {\r
+               ATLASSERT(m_hBitmap == NULL);\r
+               m_hBitmap = ::LoadBitmap(NULL, MAKEINTRESOURCE(nIDBitmap));\r
+               return m_hBitmap;\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       HBITMAP LoadMappedBitmap(UINT nIDBitmap, UINT nFlags = 0, LPCOLORMAP lpColorMap = NULL, int nMapSize = 0)\r
+       {\r
+               ATLASSERT(m_hBitmap == NULL);\r
+               m_hBitmap = ::CreateMappedBitmap(ModuleHelper::GetResourceInstance(), nIDBitmap, (WORD)nFlags, lpColorMap, nMapSize);\r
+               return m_hBitmap;\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       HBITMAP CreateBitmap(int nWidth, int nHeight, UINT nPlanes, UINT nBitsPerPixel, const void* lpBits)\r
+       {\r
+               ATLASSERT(m_hBitmap == NULL);\r
+               m_hBitmap = ::CreateBitmap(nWidth, nHeight, nPlanes, nBitsPerPixel, lpBits);\r
+               return m_hBitmap;\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       HBITMAP CreateBitmapIndirect(LPBITMAP lpBitmap)\r
+       {\r
+               ATLASSERT(m_hBitmap == NULL);\r
+               m_hBitmap = ::CreateBitmapIndirect(lpBitmap);\r
+               return m_hBitmap;\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       HBITMAP CreateCompatibleBitmap(HDC hDC, int nWidth, int nHeight)\r
+       {\r
+               ATLASSERT(m_hBitmap == NULL);\r
+               m_hBitmap = ::CreateCompatibleBitmap(hDC, nWidth, nHeight);\r
+               return m_hBitmap;\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       HBITMAP CreateDiscardableBitmap(HDC hDC, int nWidth, int nHeight)\r
+       {\r
+               ATLASSERT(m_hBitmap == NULL);\r
+               m_hBitmap = ::CreateDiscardableBitmap(hDC, nWidth, nHeight);\r
+               return m_hBitmap;\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       BOOL DeleteObject()\r
+       {\r
+               ATLASSERT(m_hBitmap != NULL);\r
+               BOOL bRet = ::DeleteObject(m_hBitmap);\r
+               if(bRet)\r
+                       m_hBitmap = NULL;\r
+               return bRet;\r
+       }\r
+\r
+// Attributes\r
+       int GetBitmap(BITMAP* pBitMap) const\r
+       {\r
+               ATLASSERT(m_hBitmap != NULL);\r
+               return ::GetObject(m_hBitmap, sizeof(BITMAP), pBitMap);\r
+       }\r
+\r
+       bool GetBitmap(BITMAP& bm) const\r
+       {\r
+               ATLASSERT(m_hBitmap != NULL);\r
+               return (::GetObject(m_hBitmap, sizeof(BITMAP), &bm) == sizeof(BITMAP));\r
+       }\r
+\r
+       bool GetSize(SIZE& size) const\r
+       {\r
+               ATLASSERT(m_hBitmap != NULL);\r
+               BITMAP bm = { 0 };\r
+               if(!GetBitmap(&bm))\r
+                       return false;\r
+               size.cx = bm.bmWidth;\r
+               size.cy = bm.bmHeight;\r
+               return true;\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       DWORD GetBitmapBits(DWORD dwCount, LPVOID lpBits) const\r
+       {\r
+               ATLASSERT(m_hBitmap != NULL);\r
+               return ::GetBitmapBits(m_hBitmap, dwCount, lpBits);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+#if !defined(_WIN32_WCE) || (_WIN32_WCE >= 410)\r
+       DWORD SetBitmapBits(DWORD dwCount, const void* lpBits)\r
+       {\r
+               ATLASSERT(m_hBitmap != NULL);\r
+               return ::SetBitmapBits(m_hBitmap, dwCount, lpBits);\r
+       }\r
+#endif // !defined(_WIN32_WCE) || (_WIN32_WCE >= 410)\r
+\r
+#ifndef _WIN32_WCE\r
+       BOOL GetBitmapDimension(LPSIZE lpSize) const\r
+       {\r
+               ATLASSERT(m_hBitmap != NULL);\r
+               return ::GetBitmapDimensionEx(m_hBitmap, lpSize);\r
+       }\r
+\r
+       BOOL SetBitmapDimension(int nWidth, int nHeight, LPSIZE lpSize = NULL)\r
+       {\r
+               ATLASSERT(m_hBitmap != NULL);\r
+               return ::SetBitmapDimensionEx(m_hBitmap, nWidth, nHeight, lpSize);\r
+       }\r
+\r
+// DIB support\r
+       HBITMAP CreateDIBitmap(HDC hDC, CONST BITMAPINFOHEADER* lpbmih, DWORD dwInit, CONST VOID* lpbInit, CONST BITMAPINFO* lpbmi, UINT uColorUse)\r
+       {\r
+               ATLASSERT(m_hBitmap == NULL);\r
+               m_hBitmap = ::CreateDIBitmap(hDC, lpbmih, dwInit, lpbInit, lpbmi, uColorUse);\r
+               return m_hBitmap;\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       HBITMAP CreateDIBSection(HDC hDC, CONST BITMAPINFO* lpbmi, UINT uColorUse, VOID** ppvBits, HANDLE hSection, DWORD dwOffset)\r
+       {\r
+               ATLASSERT(m_hBitmap == NULL);\r
+               m_hBitmap = ::CreateDIBSection(hDC, lpbmi, uColorUse, ppvBits, hSection, dwOffset);\r
+               return m_hBitmap;\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       int GetDIBits(HDC hDC, UINT uStartScan, UINT cScanLines,  LPVOID lpvBits, LPBITMAPINFO lpbmi, UINT uColorUse) const\r
+       {\r
+               ATLASSERT(m_hBitmap != NULL);\r
+               return ::GetDIBits(hDC, m_hBitmap, uStartScan, cScanLines,  lpvBits, lpbmi, uColorUse);\r
+       }\r
+\r
+       int SetDIBits(HDC hDC, UINT uStartScan, UINT cScanLines, CONST VOID* lpvBits, CONST BITMAPINFO* lpbmi, UINT uColorUse)\r
+       {\r
+               ATLASSERT(m_hBitmap != NULL);\r
+               return ::SetDIBits(hDC, m_hBitmap, uStartScan, cScanLines, lpvBits, lpbmi, uColorUse);\r
+       }\r
+#endif // !_WIN32_WCE\r
+};\r
+\r
+typedef CBitmapT<false>   CBitmapHandle;\r
+typedef CBitmapT<true>    CBitmap;\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CPalette\r
+\r
+template <bool t_bManaged>\r
+class CPaletteT\r
+{\r
+public:\r
+// Data members\r
+       HPALETTE m_hPalette;\r
+\r
+// Constructor/destructor/operators\r
+       CPaletteT(HPALETTE hPalette = NULL) : m_hPalette(hPalette)\r
+       { }\r
+\r
+       ~CPaletteT()\r
+       {\r
+               if(t_bManaged && m_hPalette != NULL)\r
+                       DeleteObject();\r
+       }\r
+\r
+       CPaletteT<t_bManaged>& operator =(HPALETTE hPalette)\r
+       {\r
+               Attach(hPalette);\r
+               return *this;\r
+       }\r
+\r
+       void Attach(HPALETTE hPalette)\r
+       {\r
+               if(t_bManaged && m_hPalette != NULL && m_hPalette != hPalette)\r
+                       ::DeleteObject(m_hPalette);\r
+               m_hPalette = hPalette;\r
+       }\r
+\r
+       HPALETTE Detach()\r
+       {\r
+               HPALETTE hPalette = m_hPalette;\r
+               m_hPalette = NULL;\r
+               return hPalette;\r
+       }\r
+\r
+       operator HPALETTE() const { return m_hPalette; }\r
+\r
+       bool IsNull() const { return (m_hPalette == NULL); }\r
+\r
+// Create methods\r
+       HPALETTE CreatePalette(LPLOGPALETTE lpLogPalette)\r
+       {\r
+               ATLASSERT(m_hPalette == NULL);\r
+               m_hPalette = ::CreatePalette(lpLogPalette);\r
+               return m_hPalette;\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       HPALETTE CreateHalftonePalette(HDC hDC)\r
+       {\r
+               ATLASSERT(m_hPalette == NULL);\r
+               ATLASSERT(hDC != NULL);\r
+               m_hPalette = ::CreateHalftonePalette(hDC);\r
+               return m_hPalette;\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       BOOL DeleteObject()\r
+       {\r
+               ATLASSERT(m_hPalette != NULL);\r
+               BOOL bRet = ::DeleteObject(m_hPalette);\r
+               if(bRet)\r
+                       m_hPalette = NULL;\r
+               return bRet;\r
+       }\r
+\r
+// Attributes\r
+       int GetEntryCount() const\r
+       {\r
+               ATLASSERT(m_hPalette != NULL);\r
+               WORD nEntries = 0;\r
+               ::GetObject(m_hPalette, sizeof(WORD), &nEntries);\r
+               return (int)nEntries;\r
+       }\r
+\r
+       UINT GetPaletteEntries(UINT nStartIndex, UINT nNumEntries, LPPALETTEENTRY lpPaletteColors) const\r
+       {\r
+               ATLASSERT(m_hPalette != NULL);\r
+               return ::GetPaletteEntries(m_hPalette, nStartIndex, nNumEntries, lpPaletteColors);\r
+       }\r
+\r
+       UINT SetPaletteEntries(UINT nStartIndex, UINT nNumEntries, LPPALETTEENTRY lpPaletteColors)\r
+       {\r
+               ATLASSERT(m_hPalette != NULL);\r
+               return ::SetPaletteEntries(m_hPalette, nStartIndex, nNumEntries, lpPaletteColors);\r
+       }\r
+\r
+// Operations\r
+#ifndef _WIN32_WCE\r
+       void AnimatePalette(UINT nStartIndex, UINT nNumEntries, LPPALETTEENTRY lpPaletteColors)\r
+       {\r
+               ATLASSERT(m_hPalette != NULL);\r
+               ::AnimatePalette(m_hPalette, nStartIndex, nNumEntries, lpPaletteColors);\r
+       }\r
+\r
+       BOOL ResizePalette(UINT nNumEntries)\r
+       {\r
+               ATLASSERT(m_hPalette != NULL);\r
+               return ::ResizePalette(m_hPalette, nNumEntries);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       UINT GetNearestPaletteIndex(COLORREF crColor) const\r
+       {\r
+               ATLASSERT(m_hPalette != NULL);\r
+               return ::GetNearestPaletteIndex(m_hPalette, crColor);\r
+       }\r
+};\r
+\r
+typedef CPaletteT<false>   CPaletteHandle;\r
+typedef CPaletteT<true>    CPalette;\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CRgn\r
+\r
+template <bool t_bManaged>\r
+class CRgnT\r
+{\r
+public:\r
+// Data members\r
+       HRGN m_hRgn;\r
+\r
+// Constructor/destructor/operators\r
+       CRgnT(HRGN hRgn = NULL) : m_hRgn(hRgn)\r
+       { }\r
+\r
+       ~CRgnT()\r
+       {\r
+               if(t_bManaged && m_hRgn != NULL)\r
+                       DeleteObject();\r
+       }\r
+\r
+       CRgnT<t_bManaged>& operator =(HRGN hRgn)\r
+       {\r
+               Attach(hRgn);\r
+               return *this;\r
+       }\r
+\r
+       void Attach(HRGN hRgn)\r
+       {\r
+               if(t_bManaged && m_hRgn != NULL && m_hRgn != hRgn)\r
+                       ::DeleteObject(m_hRgn);\r
+               m_hRgn = hRgn;\r
+       }\r
+\r
+       HRGN Detach()\r
+       {\r
+               HRGN hRgn = m_hRgn;\r
+               m_hRgn = NULL;\r
+               return hRgn;\r
+       }\r
+\r
+       operator HRGN() const { return m_hRgn; }\r
+\r
+       bool IsNull() const { return (m_hRgn == NULL); }\r
+\r
+// Create methods\r
+       HRGN CreateRectRgn(int x1, int y1, int x2, int y2)\r
+       {\r
+               ATLASSERT(m_hRgn == NULL);\r
+               m_hRgn = ::CreateRectRgn(x1, y1, x2, y2);\r
+               return m_hRgn;\r
+       }\r
+\r
+       HRGN CreateRectRgnIndirect(LPCRECT lpRect)\r
+       {\r
+               ATLASSERT(m_hRgn == NULL);\r
+               m_hRgn = ::CreateRectRgnIndirect(lpRect);\r
+               return m_hRgn;\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       HRGN CreateEllipticRgn(int x1, int y1, int x2, int y2)\r
+       {\r
+               ATLASSERT(m_hRgn == NULL);\r
+               m_hRgn = ::CreateEllipticRgn(x1, y1, x2, y2);\r
+               return m_hRgn;\r
+       }\r
+\r
+       HRGN CreateEllipticRgnIndirect(LPCRECT lpRect)\r
+       {\r
+               ATLASSERT(m_hRgn == NULL);\r
+               m_hRgn = ::CreateEllipticRgnIndirect(lpRect);\r
+               return m_hRgn;\r
+       }\r
+\r
+       HRGN CreatePolygonRgn(LPPOINT lpPoints, int nCount, int nMode)\r
+       {\r
+               ATLASSERT(m_hRgn == NULL);\r
+               m_hRgn = ::CreatePolygonRgn(lpPoints, nCount, nMode);\r
+               return m_hRgn;\r
+       }\r
+\r
+       HRGN CreatePolyPolygonRgn(LPPOINT lpPoints, LPINT lpPolyCounts, int nCount, int nPolyFillMode)\r
+       {\r
+               ATLASSERT(m_hRgn == NULL);\r
+               m_hRgn = ::CreatePolyPolygonRgn(lpPoints, lpPolyCounts, nCount, nPolyFillMode);\r
+               return m_hRgn;\r
+       }\r
+\r
+       HRGN CreateRoundRectRgn(int x1, int y1, int x2, int y2, int x3, int y3)\r
+       {\r
+               ATLASSERT(m_hRgn == NULL);\r
+               m_hRgn = ::CreateRoundRectRgn(x1, y1, x2, y2, x3, y3);\r
+               return m_hRgn;\r
+       }\r
+\r
+       HRGN CreateFromPath(HDC hDC)\r
+       {\r
+               ATLASSERT(m_hRgn == NULL);\r
+               ATLASSERT(hDC != NULL);\r
+               m_hRgn = ::PathToRegion(hDC);\r
+               return m_hRgn;\r
+       }\r
+\r
+       HRGN CreateFromData(const XFORM* lpXForm, int nCount, const RGNDATA* pRgnData)\r
+       {\r
+               ATLASSERT(m_hRgn == NULL);\r
+               m_hRgn = ::ExtCreateRegion(lpXForm, nCount, pRgnData);\r
+               return m_hRgn;\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       BOOL DeleteObject()\r
+       {\r
+               ATLASSERT(m_hRgn != NULL);\r
+               BOOL bRet = ::DeleteObject(m_hRgn);\r
+               if(bRet)\r
+                       m_hRgn = NULL;\r
+               return bRet;\r
+       }\r
+\r
+// Operations\r
+       void SetRectRgn(int x1, int y1, int x2, int y2)\r
+       {\r
+               ATLASSERT(m_hRgn != NULL);\r
+               ::SetRectRgn(m_hRgn, x1, y1, x2, y2);\r
+       }\r
+\r
+       void SetRectRgn(LPCRECT lpRect)\r
+       {\r
+               ATLASSERT(m_hRgn != NULL);\r
+               ::SetRectRgn(m_hRgn, lpRect->left, lpRect->top, lpRect->right, lpRect->bottom);\r
+       }\r
+\r
+       int CombineRgn(HRGN hRgnSrc1, HRGN hRgnSrc2, int nCombineMode)\r
+       {\r
+               ATLASSERT(m_hRgn != NULL);\r
+               return ::CombineRgn(m_hRgn, hRgnSrc1, hRgnSrc2, nCombineMode);\r
+       }\r
+\r
+       int CombineRgn(HRGN hRgnSrc, int nCombineMode)\r
+       {\r
+               ATLASSERT(m_hRgn != NULL);\r
+               return ::CombineRgn(m_hRgn, m_hRgn, hRgnSrc, nCombineMode);\r
+       }\r
+\r
+       int CopyRgn(HRGN hRgnSrc)\r
+       {\r
+               ATLASSERT(m_hRgn != NULL);\r
+               return ::CombineRgn(m_hRgn, hRgnSrc, NULL, RGN_COPY);\r
+       }\r
+\r
+       BOOL EqualRgn(HRGN hRgn) const\r
+       {\r
+               ATLASSERT(m_hRgn != NULL);\r
+               return ::EqualRgn(m_hRgn, hRgn);\r
+       }\r
+\r
+       int OffsetRgn(int x, int y)\r
+       {\r
+               ATLASSERT(m_hRgn != NULL);\r
+               return ::OffsetRgn(m_hRgn, x, y);\r
+       }\r
+\r
+       int OffsetRgn(POINT point)\r
+       {\r
+               ATLASSERT(m_hRgn != NULL);\r
+               return ::OffsetRgn(m_hRgn, point.x, point.y);\r
+       }\r
+\r
+       int GetRgnBox(LPRECT lpRect) const\r
+       {\r
+               ATLASSERT(m_hRgn != NULL);\r
+               return ::GetRgnBox(m_hRgn, lpRect);\r
+       }\r
+\r
+       BOOL PtInRegion(int x, int y) const\r
+       {\r
+               ATLASSERT(m_hRgn != NULL);\r
+               return ::PtInRegion(m_hRgn, x, y);\r
+       }\r
+\r
+       BOOL PtInRegion(POINT point) const\r
+       {\r
+               ATLASSERT(m_hRgn != NULL);\r
+               return ::PtInRegion(m_hRgn, point.x, point.y);\r
+       }\r
+\r
+       BOOL RectInRegion(LPCRECT lpRect) const\r
+       {\r
+               ATLASSERT(m_hRgn != NULL);\r
+               return ::RectInRegion(m_hRgn, lpRect);\r
+       }\r
+\r
+       int GetRegionData(LPRGNDATA lpRgnData, int nDataSize) const\r
+       {\r
+               ATLASSERT(m_hRgn != NULL);\r
+               return (int)::GetRegionData(m_hRgn, nDataSize, lpRgnData);\r
+       }\r
+};\r
+\r
+typedef CRgnT<false>   CRgnHandle;\r
+typedef CRgnT<true>    CRgn;\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CDC - The device context class\r
+\r
+template <bool t_bManaged>\r
+class CDCT\r
+{\r
+public:\r
+// Data members\r
+       HDC m_hDC;\r
+\r
+// Constructor/destructor/operators\r
+       CDCT(HDC hDC = NULL) : m_hDC(hDC)\r
+       {\r
+       }\r
+\r
+       ~CDCT()\r
+       {\r
+               if(t_bManaged && m_hDC != NULL)\r
+                       ::DeleteDC(Detach());\r
+       }\r
+\r
+       CDCT<t_bManaged>& operator =(HDC hDC)\r
+       {\r
+               Attach(hDC);\r
+               return *this;\r
+       }\r
+\r
+       void Attach(HDC hDC)\r
+       {\r
+               if(t_bManaged && m_hDC != NULL && m_hDC != hDC)\r
+                       ::DeleteDC(m_hDC);\r
+               m_hDC = hDC;\r
+       }\r
+\r
+       HDC Detach()\r
+       {\r
+               HDC hDC = m_hDC;\r
+               m_hDC = NULL;\r
+               return hDC;\r
+       }\r
+\r
+       operator HDC() const { return m_hDC; }\r
+\r
+       bool IsNull() const { return (m_hDC == NULL); }\r
+\r
+// Operations\r
+#ifndef _WIN32_WCE\r
+       HWND WindowFromDC() const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::WindowFromDC(m_hDC);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       CPenHandle GetCurrentPen() const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return CPenHandle((HPEN)::GetCurrentObject(m_hDC, OBJ_PEN));\r
+       }\r
+\r
+       CBrushHandle GetCurrentBrush() const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return CBrushHandle((HBRUSH)::GetCurrentObject(m_hDC, OBJ_BRUSH));\r
+       }\r
+\r
+       CPaletteHandle GetCurrentPalette() const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return CPaletteHandle((HPALETTE)::GetCurrentObject(m_hDC, OBJ_PAL));\r
+       }\r
+\r
+       CFontHandle GetCurrentFont() const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return CFontHandle((HFONT)::GetCurrentObject(m_hDC, OBJ_FONT));\r
+       }\r
+\r
+       CBitmapHandle GetCurrentBitmap() const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return CBitmapHandle((HBITMAP)::GetCurrentObject(m_hDC, OBJ_BITMAP));\r
+       }\r
+\r
+       HDC CreateDC(LPCTSTR lpszDriverName, LPCTSTR lpszDeviceName, LPCTSTR lpszOutput, const DEVMODE* lpInitData)\r
+       {\r
+               ATLASSERT(m_hDC == NULL);\r
+               m_hDC = ::CreateDC(lpszDriverName, lpszDeviceName, lpszOutput, lpInitData);\r
+               return m_hDC;\r
+       }\r
+\r
+       HDC CreateCompatibleDC(HDC hDC = NULL)\r
+       {\r
+               ATLASSERT(m_hDC == NULL);\r
+               m_hDC = ::CreateCompatibleDC(hDC);\r
+               return m_hDC;\r
+       }\r
+\r
+       BOOL DeleteDC()\r
+       {\r
+               if(m_hDC == NULL)\r
+                       return FALSE;\r
+               BOOL bRet = ::DeleteDC(m_hDC);\r
+               if(bRet)\r
+                       m_hDC = NULL;\r
+               return bRet;\r
+       }\r
+\r
+// Device-Context Functions\r
+       int SaveDC()\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::SaveDC(m_hDC);\r
+       }\r
+\r
+       BOOL RestoreDC(int nSavedDC)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::RestoreDC(m_hDC, nSavedDC);\r
+       }\r
+\r
+       int GetDeviceCaps(int nIndex) const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::GetDeviceCaps(m_hDC, nIndex);\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       UINT SetBoundsRect(LPCRECT lpRectBounds, UINT flags)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::SetBoundsRect(m_hDC, lpRectBounds, flags);\r
+       }\r
+\r
+       UINT GetBoundsRect(LPRECT lpRectBounds, UINT flags) const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::GetBoundsRect(m_hDC, lpRectBounds, flags);\r
+       }\r
+\r
+       BOOL ResetDC(const DEVMODE* lpDevMode)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::ResetDC(m_hDC, lpDevMode) != NULL;\r
+       }\r
+\r
+// Drawing-Tool Functions\r
+       BOOL GetBrushOrg(LPPOINT lpPoint) const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::GetBrushOrgEx(m_hDC, lpPoint);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       BOOL SetBrushOrg(int x, int y, LPPOINT lpPoint = NULL)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::SetBrushOrgEx(m_hDC, x, y, lpPoint);\r
+       }\r
+\r
+       BOOL SetBrushOrg(POINT point, LPPOINT lpPointRet = NULL)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::SetBrushOrgEx(m_hDC, point.x, point.y, lpPointRet);\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       int EnumObjects(int nObjectType, int (CALLBACK* lpfn)(LPVOID, LPARAM), LPARAM lpData)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+#ifdef STRICT\r
+               return ::EnumObjects(m_hDC, nObjectType, (GOBJENUMPROC)lpfn, lpData);\r
+#else\r
+               return ::EnumObjects(m_hDC, nObjectType, (GOBJENUMPROC)lpfn, (LPVOID)lpData);\r
+#endif\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+// Type-safe selection helpers\r
+       HPEN SelectPen(HPEN hPen)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+#ifndef _WIN32_WCE\r
+               ATLASSERT(hPen == NULL || ::GetObjectType(hPen) == OBJ_PEN || ::GetObjectType(hPen) == OBJ_EXTPEN);\r
+#else // CE specific\r
+               ATLASSERT(hPen == NULL || ::GetObjectType(hPen) == OBJ_PEN);\r
+#endif // _WIN32_WCE\r
+               return (HPEN)::SelectObject(m_hDC, hPen);\r
+       }\r
+\r
+       HBRUSH SelectBrush(HBRUSH hBrush)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               ATLASSERT(hBrush == NULL || ::GetObjectType(hBrush) == OBJ_BRUSH);\r
+               return (HBRUSH)::SelectObject(m_hDC, hBrush);\r
+       }\r
+\r
+       HFONT SelectFont(HFONT hFont)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               ATLASSERT(hFont == NULL || ::GetObjectType(hFont) == OBJ_FONT);\r
+               return (HFONT)::SelectObject(m_hDC, hFont);\r
+       }\r
+\r
+       HBITMAP SelectBitmap(HBITMAP hBitmap)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               ATLASSERT(hBitmap == NULL || ::GetObjectType(hBitmap) == OBJ_BITMAP);\r
+               return (HBITMAP)::SelectObject(m_hDC, hBitmap);\r
+       }\r
+\r
+       int SelectRgn(HRGN hRgn)       // special return for regions\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               ATLASSERT(hRgn == NULL || ::GetObjectType(hRgn) == OBJ_REGION);\r
+               return PtrToInt(::SelectObject(m_hDC, hRgn));\r
+       }\r
+\r
+// Type-safe selection helpers for stock objects\r
+       HPEN SelectStockPen(int nPen)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+#if (_WIN32_WINNT >= 0x0500)\r
+               ATLASSERT(nPen == WHITE_PEN || nPen == BLACK_PEN || nPen == NULL_PEN || nPen == DC_PEN);\r
+#else\r
+               ATLASSERT(nPen == WHITE_PEN || nPen == BLACK_PEN || nPen == NULL_PEN);\r
+#endif // !(_WIN32_WINNT >= 0x0500)\r
+               return SelectPen((HPEN)::GetStockObject(nPen));\r
+       }\r
+\r
+       HBRUSH SelectStockBrush(int nBrush)\r
+       {\r
+#if (_WIN32_WINNT >= 0x0500)\r
+               ATLASSERT((nBrush >= WHITE_BRUSH && nBrush <= HOLLOW_BRUSH) || nBrush == DC_BRUSH);\r
+#else\r
+               ATLASSERT(nBrush >= WHITE_BRUSH && nBrush <= HOLLOW_BRUSH);\r
+#endif // !(_WIN32_WINNT >= 0x0500)\r
+               return SelectBrush((HBRUSH)::GetStockObject(nBrush));\r
+       }\r
+\r
+       HFONT SelectStockFont(int nFont)\r
+       {\r
+#ifndef _WIN32_WCE\r
+               ATLASSERT((nFont >= OEM_FIXED_FONT && nFont <= SYSTEM_FIXED_FONT) || nFont == DEFAULT_GUI_FONT);\r
+#else // CE specific\r
+               ATLASSERT(nFont == SYSTEM_FONT);\r
+#endif // _WIN32_WCE\r
+               return SelectFont((HFONT)::GetStockObject(nFont));\r
+       }\r
+\r
+       HPALETTE SelectStockPalette(int nPalette, BOOL bForceBackground)\r
+       {\r
+               ATLASSERT(nPalette == DEFAULT_PALETTE); // the only one supported\r
+               return SelectPalette((HPALETTE)::GetStockObject(nPalette), bForceBackground);\r
+       }\r
+\r
+// Color and Color Palette Functions\r
+       COLORREF GetNearestColor(COLORREF crColor) const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::GetNearestColor(m_hDC, crColor);\r
+       }\r
+\r
+       HPALETTE SelectPalette(HPALETTE hPalette, BOOL bForceBackground)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+\r
+               return ::SelectPalette(m_hDC, hPalette, bForceBackground);\r
+       }\r
+\r
+       UINT RealizePalette()\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::RealizePalette(m_hDC);\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       void UpdateColors()\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               ::UpdateColors(m_hDC);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+// Drawing-Attribute Functions\r
+       COLORREF GetBkColor() const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::GetBkColor(m_hDC);\r
+       }\r
+\r
+       int GetBkMode() const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::GetBkMode(m_hDC);\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       int GetPolyFillMode() const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::GetPolyFillMode(m_hDC);\r
+       }\r
+\r
+       int GetROP2() const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::GetROP2(m_hDC);\r
+       }\r
+\r
+       int GetStretchBltMode() const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::GetStretchBltMode(m_hDC);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       COLORREF GetTextColor() const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::GetTextColor(m_hDC);\r
+       }\r
+\r
+       COLORREF SetBkColor(COLORREF crColor)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::SetBkColor(m_hDC, crColor);\r
+       }\r
+\r
+       int SetBkMode(int nBkMode)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::SetBkMode(m_hDC, nBkMode);\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       int SetPolyFillMode(int nPolyFillMode)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::SetPolyFillMode(m_hDC, nPolyFillMode);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       int SetROP2(int nDrawMode)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::SetROP2(m_hDC, nDrawMode);\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       int SetStretchBltMode(int nStretchMode)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::SetStretchBltMode(m_hDC, nStretchMode);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       COLORREF SetTextColor(COLORREF crColor)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::SetTextColor(m_hDC, crColor);\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       BOOL GetColorAdjustment(LPCOLORADJUSTMENT lpColorAdjust) const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::GetColorAdjustment(m_hDC, lpColorAdjust);\r
+       }\r
+\r
+       BOOL SetColorAdjustment(const COLORADJUSTMENT* lpColorAdjust)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::SetColorAdjustment(m_hDC, lpColorAdjust);\r
+       }\r
+\r
+// Mapping Functions\r
+       int GetMapMode() const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::GetMapMode(m_hDC);\r
+       }\r
+\r
+       BOOL GetViewportOrg(LPPOINT lpPoint) const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::GetViewportOrgEx(m_hDC, lpPoint);\r
+       }\r
+\r
+       int SetMapMode(int nMapMode)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::SetMapMode(m_hDC, nMapMode);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       // Viewport Origin\r
+       BOOL SetViewportOrg(int x, int y, LPPOINT lpPoint = NULL)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::SetViewportOrgEx(m_hDC, x, y, lpPoint);\r
+       }\r
+\r
+       BOOL SetViewportOrg(POINT point, LPPOINT lpPointRet = NULL)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return SetViewportOrg(point.x, point.y, lpPointRet);\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       BOOL OffsetViewportOrg(int nWidth, int nHeight, LPPOINT lpPoint = NULL)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::OffsetViewportOrgEx(m_hDC, nWidth, nHeight, lpPoint);\r
+       }\r
+\r
+       // Viewport Extent\r
+       BOOL GetViewportExt(LPSIZE lpSize) const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::GetViewportExtEx(m_hDC, lpSize);\r
+       }\r
+\r
+       BOOL SetViewportExt(int x, int y, LPSIZE lpSize = NULL)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::SetViewportExtEx(m_hDC, x, y, lpSize);\r
+       }\r
+\r
+       BOOL SetViewportExt(SIZE size, LPSIZE lpSizeRet = NULL)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return SetViewportExt(size.cx, size.cy, lpSizeRet);\r
+       }\r
+\r
+       BOOL ScaleViewportExt(int xNum, int xDenom, int yNum, int yDenom, LPSIZE lpSize = NULL)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::ScaleViewportExtEx(m_hDC, xNum, xDenom, yNum, yDenom, lpSize);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       // Window Origin\r
+#ifndef _WIN32_WCE\r
+       BOOL GetWindowOrg(LPPOINT lpPoint) const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::GetWindowOrgEx(m_hDC, lpPoint);\r
+       }\r
+\r
+       BOOL SetWindowOrg(int x, int y, LPPOINT lpPoint = NULL)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::SetWindowOrgEx(m_hDC, x, y, lpPoint);\r
+       }\r
+\r
+       BOOL SetWindowOrg(POINT point, LPPOINT lpPointRet = NULL)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return SetWindowOrg(point.x, point.y, lpPointRet);\r
+       }\r
+\r
+       BOOL OffsetWindowOrg(int nWidth, int nHeight, LPPOINT lpPoint = NULL)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::OffsetWindowOrgEx(m_hDC, nWidth, nHeight, lpPoint);\r
+       }\r
+\r
+       // Window extent\r
+       BOOL GetWindowExt(LPSIZE lpSize) const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::GetWindowExtEx(m_hDC, lpSize);\r
+       }\r
+\r
+       BOOL SetWindowExt(int x, int y, LPSIZE lpSize = NULL)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::SetWindowExtEx(m_hDC, x, y, lpSize);\r
+       }\r
+\r
+       BOOL SetWindowExt(SIZE size, LPSIZE lpSizeRet = NULL)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return SetWindowExt(size.cx, size.cy, lpSizeRet);\r
+       }\r
+\r
+       BOOL ScaleWindowExt(int xNum, int xDenom, int yNum, int yDenom, LPSIZE lpSize = NULL)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::ScaleWindowExtEx(m_hDC, xNum, xDenom, yNum, yDenom, lpSize);\r
+       }\r
+\r
+// Coordinate Functions\r
+       BOOL DPtoLP(LPPOINT lpPoints, int nCount = 1) const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::DPtoLP(m_hDC, lpPoints, nCount);\r
+       }\r
+\r
+       BOOL DPtoLP(LPRECT lpRect) const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::DPtoLP(m_hDC, (LPPOINT)lpRect, 2);\r
+       }\r
+\r
+       BOOL DPtoLP(LPSIZE lpSize) const\r
+       {\r
+               SIZE sizeWinExt = { 0, 0 };\r
+               if(!GetWindowExt(&sizeWinExt))\r
+                       return FALSE;\r
+               SIZE sizeVpExt = { 0, 0 };\r
+               if(!GetViewportExt(&sizeVpExt))\r
+                       return FALSE;\r
+               lpSize->cx = ::MulDiv(lpSize->cx, abs(sizeWinExt.cx), abs(sizeVpExt.cx));\r
+               lpSize->cy = ::MulDiv(lpSize->cy, abs(sizeWinExt.cy), abs(sizeVpExt.cy));\r
+               return TRUE;\r
+       }\r
+\r
+       BOOL LPtoDP(LPPOINT lpPoints, int nCount = 1) const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::LPtoDP(m_hDC, lpPoints, nCount);\r
+       }\r
+\r
+       BOOL LPtoDP(LPRECT lpRect) const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::LPtoDP(m_hDC, (LPPOINT)lpRect, 2);\r
+       }\r
+\r
+       BOOL LPtoDP(LPSIZE lpSize) const\r
+       {\r
+               SIZE sizeWinExt = { 0, 0 };\r
+               if(!GetWindowExt(&sizeWinExt))\r
+                       return FALSE;\r
+               SIZE sizeVpExt = { 0, 0 };\r
+               if(!GetViewportExt(&sizeVpExt))\r
+                       return FALSE;\r
+               lpSize->cx = ::MulDiv(lpSize->cx, abs(sizeVpExt.cx), abs(sizeWinExt.cx));\r
+               lpSize->cy = ::MulDiv(lpSize->cy, abs(sizeVpExt.cy), abs(sizeWinExt.cy));\r
+               return TRUE;\r
+       }\r
+\r
+// Special Coordinate Functions (useful for dealing with metafiles and OLE)\r
+       #define HIMETRIC_INCH   2540    // HIMETRIC units per inch\r
+\r
+       void DPtoHIMETRIC(LPSIZE lpSize) const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               int nMapMode;\r
+               if((nMapMode = GetMapMode()) < MM_ISOTROPIC && nMapMode != MM_TEXT)\r
+               {\r
+                       // when using a constrained map mode, map against physical inch\r
+                       ((CDCHandle*)this)->SetMapMode(MM_HIMETRIC);\r
+                       DPtoLP(lpSize);\r
+                       ((CDCHandle*)this)->SetMapMode(nMapMode);\r
+               }\r
+               else\r
+               {\r
+                       // map against logical inch for non-constrained mapping modes\r
+                       int cxPerInch = GetDeviceCaps(LOGPIXELSX);\r
+                       int cyPerInch = GetDeviceCaps(LOGPIXELSY);\r
+                       ATLASSERT(cxPerInch != 0 && cyPerInch != 0);\r
+                       lpSize->cx = ::MulDiv(lpSize->cx, HIMETRIC_INCH, cxPerInch);\r
+                       lpSize->cy = ::MulDiv(lpSize->cy, HIMETRIC_INCH, cyPerInch);\r
+               }\r
+       }\r
+\r
+       void HIMETRICtoDP(LPSIZE lpSize) const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               int nMapMode;\r
+               if((nMapMode = GetMapMode()) < MM_ISOTROPIC && nMapMode != MM_TEXT)\r
+               {\r
+                       // when using a constrained map mode, map against physical inch\r
+                       ((CDCHandle*)this)->SetMapMode(MM_HIMETRIC);\r
+                       LPtoDP(lpSize);\r
+                       ((CDCHandle*)this)->SetMapMode(nMapMode);\r
+               }\r
+               else\r
+               {\r
+                       // map against logical inch for non-constrained mapping modes\r
+                       int cxPerInch = GetDeviceCaps(LOGPIXELSX);\r
+                       int cyPerInch = GetDeviceCaps(LOGPIXELSY);\r
+                       ATLASSERT(cxPerInch != 0 && cyPerInch != 0);\r
+                       lpSize->cx = ::MulDiv(lpSize->cx, cxPerInch, HIMETRIC_INCH);\r
+                       lpSize->cy = ::MulDiv(lpSize->cy, cyPerInch, HIMETRIC_INCH);\r
+               }\r
+       }\r
+\r
+       void LPtoHIMETRIC(LPSIZE lpSize) const\r
+       {\r
+               LPtoDP(lpSize);\r
+               DPtoHIMETRIC(lpSize);\r
+       }\r
+\r
+       void HIMETRICtoLP(LPSIZE lpSize) const\r
+       {\r
+               HIMETRICtoDP(lpSize);\r
+               DPtoLP(lpSize);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+// Region Functions\r
+       BOOL FillRgn(HRGN hRgn, HBRUSH hBrush)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::FillRgn(m_hDC, hRgn, hBrush);\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       BOOL FrameRgn(HRGN hRgn, HBRUSH hBrush, int nWidth, int nHeight)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::FrameRgn(m_hDC, hRgn, hBrush, nWidth, nHeight);\r
+       }\r
+\r
+       BOOL InvertRgn(HRGN hRgn)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::InvertRgn(m_hDC, hRgn);\r
+       }\r
+\r
+       BOOL PaintRgn(HRGN hRgn)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::PaintRgn(m_hDC, hRgn);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+// Clipping Functions\r
+       int GetClipBox(LPRECT lpRect) const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::GetClipBox(m_hDC, lpRect);\r
+       }\r
+\r
+       int GetClipRgn(CRgn& region) const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               if(region.IsNull())\r
+                       region.CreateRectRgn(0, 0, 0, 0);\r
+\r
+               int nRet = ::GetClipRgn(m_hDC, region);\r
+               if(nRet != 1)\r
+                       region.DeleteObject();\r
+\r
+               return nRet;\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       BOOL PtVisible(int x, int y) const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::PtVisible(m_hDC, x, y);\r
+       }\r
+\r
+       BOOL PtVisible(POINT point) const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::PtVisible(m_hDC, point.x, point.y);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       BOOL RectVisible(LPCRECT lpRect) const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::RectVisible(m_hDC, lpRect);\r
+       }\r
+\r
+       int SelectClipRgn(HRGN hRgn)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::SelectClipRgn(m_hDC, (HRGN)hRgn);\r
+       }\r
+\r
+       int ExcludeClipRect(int x1, int y1, int x2, int y2)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::ExcludeClipRect(m_hDC, x1, y1, x2, y2);\r
+       }\r
+\r
+       int ExcludeClipRect(LPCRECT lpRect)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::ExcludeClipRect(m_hDC, lpRect->left, lpRect->top, lpRect->right, lpRect->bottom);\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       int ExcludeUpdateRgn(HWND hWnd)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::ExcludeUpdateRgn(m_hDC, hWnd);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       int IntersectClipRect(int x1, int y1, int x2, int y2)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::IntersectClipRect(m_hDC, x1, y1, x2, y2);\r
+       }\r
+\r
+       int IntersectClipRect(LPCRECT lpRect)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::IntersectClipRect(m_hDC, lpRect->left, lpRect->top, lpRect->right, lpRect->bottom);\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       int OffsetClipRgn(int x, int y)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::OffsetClipRgn(m_hDC, x, y);\r
+       }\r
+\r
+       int OffsetClipRgn(SIZE size)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::OffsetClipRgn(m_hDC, size.cx, size.cy);\r
+       }\r
+\r
+       int SelectClipRgn(HRGN hRgn, int nMode)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::ExtSelectClipRgn(m_hDC, hRgn, nMode);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+// Line-Output Functions\r
+#if !defined(_WIN32_WCE) || (_WIN32_WCE >= 400)\r
+       BOOL GetCurrentPosition(LPPOINT lpPoint) const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::GetCurrentPositionEx(m_hDC, lpPoint);\r
+       }\r
+\r
+       BOOL MoveTo(int x, int y, LPPOINT lpPoint = NULL)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::MoveToEx(m_hDC, x, y, lpPoint);\r
+       }\r
+\r
+       BOOL MoveTo(POINT point, LPPOINT lpPointRet = NULL)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return MoveTo(point.x, point.y, lpPointRet);\r
+       }\r
+\r
+       BOOL LineTo(int x, int y)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::LineTo(m_hDC, x, y);\r
+       }\r
+\r
+       BOOL LineTo(POINT point)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return LineTo(point.x, point.y);\r
+       }\r
+#endif // !defined(_WIN32_WCE) || (_WIN32_WCE >= 400)\r
+\r
+#ifndef _WIN32_WCE\r
+       BOOL Arc(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::Arc(m_hDC, x1, y1, x2, y2, x3, y3, x4, y4);\r
+       }\r
+\r
+       BOOL Arc(LPCRECT lpRect, POINT ptStart, POINT ptEnd)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::Arc(m_hDC, lpRect->left, lpRect->top,\r
+                       lpRect->right, lpRect->bottom, ptStart.x, ptStart.y,\r
+                       ptEnd.x, ptEnd.y);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       BOOL Polyline(LPPOINT lpPoints, int nCount)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::Polyline(m_hDC, lpPoints, nCount);\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       BOOL AngleArc(int x, int y, int nRadius, float fStartAngle, float fSweepAngle)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::AngleArc(m_hDC, x, y, nRadius, fStartAngle, fSweepAngle);\r
+       }\r
+\r
+       BOOL ArcTo(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::ArcTo(m_hDC, x1, y1, x2, y2, x3, y3, x4, y4);\r
+       }\r
+\r
+       BOOL ArcTo(LPCRECT lpRect, POINT ptStart, POINT ptEnd)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ArcTo(lpRect->left, lpRect->top, lpRect->right,\r
+               lpRect->bottom, ptStart.x, ptStart.y, ptEnd.x, ptEnd.y);\r
+       }\r
+\r
+       int GetArcDirection() const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::GetArcDirection(m_hDC);\r
+       }\r
+\r
+       int SetArcDirection(int nArcDirection)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::SetArcDirection(m_hDC, nArcDirection);\r
+       }\r
+\r
+       BOOL PolyDraw(const POINT* lpPoints, const BYTE* lpTypes, int nCount)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::PolyDraw(m_hDC, lpPoints, lpTypes, nCount);\r
+       }\r
+\r
+       BOOL PolylineTo(const POINT* lpPoints, int nCount)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::PolylineTo(m_hDC, lpPoints, nCount);\r
+       }\r
+\r
+       BOOL PolyPolyline(const POINT* lpPoints,\r
+               const DWORD* lpPolyPoints, int nCount)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::PolyPolyline(m_hDC, lpPoints, lpPolyPoints, nCount);\r
+       }\r
+\r
+       BOOL PolyBezier(const POINT* lpPoints, int nCount)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::PolyBezier(m_hDC, lpPoints, nCount);\r
+       }\r
+\r
+       BOOL PolyBezierTo(const POINT* lpPoints, int nCount)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::PolyBezierTo(m_hDC, lpPoints, nCount);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+// Simple Drawing Functions\r
+       BOOL FillRect(LPCRECT lpRect, HBRUSH hBrush)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::FillRect(m_hDC, lpRect, hBrush);\r
+       }\r
+\r
+       BOOL FillRect(LPCRECT lpRect, int nColorIndex)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+#ifndef _WIN32_WCE\r
+               return ::FillRect(m_hDC, lpRect, (HBRUSH)LongToPtr(nColorIndex + 1));\r
+#else // CE specific\r
+               return ::FillRect(m_hDC, lpRect, ::GetSysColorBrush(nColorIndex));\r
+#endif // _WIN32_WCE\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       BOOL FrameRect(LPCRECT lpRect, HBRUSH hBrush)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::FrameRect(m_hDC, lpRect, hBrush);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+#if !defined(_WIN32_WCE) || (_WIN32_WCE >= 420)\r
+       BOOL InvertRect(LPCRECT lpRect)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::InvertRect(m_hDC, lpRect);\r
+       }\r
+#endif // !defined(_WIN32_WCE) || (_WIN32_WCE >= 420)\r
+\r
+       BOOL DrawIcon(int x, int y, HICON hIcon)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+#ifndef _WIN32_WCE\r
+               return ::DrawIcon(m_hDC, x, y, hIcon);\r
+#else // CE specific\r
+               return ::DrawIconEx(m_hDC, x, y, hIcon, 0, 0, 0, NULL, DI_NORMAL);\r
+#endif // _WIN32_WCE\r
+       }\r
+\r
+       BOOL DrawIcon(POINT point, HICON hIcon)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+#ifndef _WIN32_WCE\r
+               return ::DrawIcon(m_hDC, point.x, point.y, hIcon);\r
+#else // CE specific\r
+               return ::DrawIconEx(m_hDC, point.x, point.y, hIcon, 0, 0, 0, NULL, DI_NORMAL);\r
+#endif // _WIN32_WCE\r
+       }\r
+\r
+       BOOL DrawIconEx(int x, int y, HICON hIcon, int cxWidth, int cyWidth, UINT uStepIfAniCur = 0, HBRUSH hbrFlickerFreeDraw = NULL, UINT uFlags = DI_NORMAL)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::DrawIconEx(m_hDC, x, y, hIcon, cxWidth, cyWidth, uStepIfAniCur, hbrFlickerFreeDraw, uFlags);\r
+       }\r
+\r
+       BOOL DrawIconEx(POINT point, HICON hIcon, SIZE size, UINT uStepIfAniCur = 0, HBRUSH hbrFlickerFreeDraw = NULL, UINT uFlags = DI_NORMAL)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::DrawIconEx(m_hDC, point.x, point.y, hIcon, size.cx, size.cy, uStepIfAniCur, hbrFlickerFreeDraw, uFlags);\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       BOOL DrawState(POINT pt, SIZE size, HBITMAP hBitmap, UINT nFlags, HBRUSH hBrush = NULL)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::DrawState(m_hDC, hBrush, NULL, (LPARAM)hBitmap, 0, pt.x, pt.y, size.cx, size.cy, nFlags | DST_BITMAP);\r
+       }\r
+\r
+       BOOL DrawState(POINT pt, SIZE size, HICON hIcon, UINT nFlags, HBRUSH hBrush = NULL)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::DrawState(m_hDC, hBrush, NULL, (LPARAM)hIcon, 0, pt.x, pt.y, size.cx, size.cy, nFlags | DST_ICON);\r
+       }\r
+\r
+       BOOL DrawState(POINT pt, SIZE size, LPCTSTR lpszText, UINT nFlags, BOOL bPrefixText = TRUE, int nTextLen = 0, HBRUSH hBrush = NULL)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::DrawState(m_hDC, hBrush, NULL, (LPARAM)lpszText, (WPARAM)nTextLen, pt.x, pt.y, size.cx, size.cy, nFlags | (bPrefixText ? DST_PREFIXTEXT : DST_TEXT));\r
+       }\r
+\r
+       BOOL DrawState(POINT pt, SIZE size, DRAWSTATEPROC lpDrawProc, LPARAM lData, UINT nFlags, HBRUSH hBrush = NULL)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::DrawState(m_hDC, hBrush, lpDrawProc, lData, 0, pt.x, pt.y, size.cx, size.cy, nFlags | DST_COMPLEX);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+// Ellipse and Polygon Functions\r
+#ifndef _WIN32_WCE\r
+       BOOL Chord(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::Chord(m_hDC, x1, y1, x2, y2, x3, y3, x4, y4);\r
+       }\r
+\r
+       BOOL Chord(LPCRECT lpRect, POINT ptStart, POINT ptEnd)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::Chord(m_hDC, lpRect->left, lpRect->top, lpRect->right, lpRect->bottom, ptStart.x, ptStart.y, ptEnd.x, ptEnd.y);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       void DrawFocusRect(LPCRECT lpRect)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               ::DrawFocusRect(m_hDC, lpRect);\r
+       }\r
+\r
+       BOOL Ellipse(int x1, int y1, int x2, int y2)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::Ellipse(m_hDC, x1, y1, x2, y2);\r
+       }\r
+\r
+       BOOL Ellipse(LPCRECT lpRect)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::Ellipse(m_hDC, lpRect->left, lpRect->top, lpRect->right, lpRect->bottom);\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       BOOL Pie(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::Pie(m_hDC, x1, y1, x2, y2, x3, y3, x4, y4);\r
+       }\r
+\r
+       BOOL Pie(LPCRECT lpRect, POINT ptStart, POINT ptEnd)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::Pie(m_hDC, lpRect->left, lpRect->top, lpRect->right, lpRect->bottom, ptStart.x, ptStart.y, ptEnd.x, ptEnd.y);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       BOOL Polygon(LPPOINT lpPoints, int nCount)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::Polygon(m_hDC, lpPoints, nCount);\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       BOOL PolyPolygon(LPPOINT lpPoints, LPINT lpPolyCounts, int nCount)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::PolyPolygon(m_hDC, lpPoints, lpPolyCounts, nCount);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       BOOL Rectangle(int x1, int y1, int x2, int y2)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::Rectangle(m_hDC, x1, y1, x2, y2);\r
+       }\r
+\r
+       BOOL Rectangle(LPCRECT lpRect)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::Rectangle(m_hDC, lpRect->left, lpRect->top, lpRect->right, lpRect->bottom);\r
+       }\r
+\r
+       BOOL RoundRect(int x1, int y1, int x2, int y2, int x3, int y3)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::RoundRect(m_hDC, x1, y1, x2, y2, x3, y3);\r
+       }\r
+\r
+       BOOL RoundRect(LPCRECT lpRect, POINT point)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::RoundRect(m_hDC, lpRect->left, lpRect->top, lpRect->right, lpRect->bottom, point.x, point.y);\r
+       }\r
+\r
+// Bitmap Functions\r
+       BOOL PatBlt(int x, int y, int nWidth, int nHeight, DWORD dwRop)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::PatBlt(m_hDC, x, y, nWidth, nHeight, dwRop);\r
+       }\r
+\r
+       BOOL BitBlt(int x, int y, int nWidth, int nHeight, HDC hSrcDC,\r
+               int xSrc, int ySrc, DWORD dwRop)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::BitBlt(m_hDC, x, y, nWidth, nHeight, hSrcDC, xSrc, ySrc, dwRop);\r
+       }\r
+\r
+       BOOL StretchBlt(int x, int y, int nWidth, int nHeight, HDC hSrcDC, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, DWORD dwRop)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::StretchBlt(m_hDC, x, y, nWidth, nHeight, hSrcDC, xSrc, ySrc, nSrcWidth, nSrcHeight, dwRop);\r
+       }\r
+\r
+       COLORREF GetPixel(int x, int y) const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::GetPixel(m_hDC, x, y);\r
+       }\r
+\r
+       COLORREF GetPixel(POINT point) const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::GetPixel(m_hDC, point.x, point.y);\r
+       }\r
+\r
+       COLORREF SetPixel(int x, int y, COLORREF crColor)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::SetPixel(m_hDC, x, y, crColor);\r
+       }\r
+\r
+       COLORREF SetPixel(POINT point, COLORREF crColor)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::SetPixel(m_hDC, point.x, point.y, crColor);\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       BOOL FloodFill(int x, int y, COLORREF crColor)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::FloodFill(m_hDC, x, y, crColor);\r
+       }\r
+\r
+       BOOL ExtFloodFill(int x, int y, COLORREF crColor, UINT nFillType)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::ExtFloodFill(m_hDC, x, y, crColor, nFillType);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       BOOL MaskBlt(int x, int y, int nWidth, int nHeight, HDC hSrcDC, int xSrc, int ySrc, HBITMAP hMaskBitmap, int xMask, int yMask, DWORD dwRop)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::MaskBlt(m_hDC, x, y, nWidth, nHeight, hSrcDC, xSrc, ySrc, hMaskBitmap, xMask, yMask, dwRop);\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       BOOL PlgBlt(LPPOINT lpPoint, HDC hSrcDC, int xSrc, int ySrc, int nWidth, int nHeight, HBITMAP hMaskBitmap, int xMask, int yMask)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::PlgBlt(m_hDC, lpPoint, hSrcDC, xSrc, ySrc, nWidth, nHeight, hMaskBitmap, xMask, yMask);\r
+       }\r
+\r
+       BOOL SetPixelV(int x, int y, COLORREF crColor)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::SetPixelV(m_hDC, x, y, crColor);\r
+       }\r
+\r
+       BOOL SetPixelV(POINT point, COLORREF crColor)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::SetPixelV(m_hDC, point.x, point.y, crColor);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+#if !defined(_ATL_NO_MSIMG) || defined(_WIN32_WCE)\r
+#ifndef _WIN32_WCE\r
+       BOOL TransparentBlt(int x, int y, int nWidth, int nHeight, HDC hSrcDC, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, UINT crTransparent)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::TransparentBlt(m_hDC, x, y, nWidth, nHeight, hSrcDC, xSrc, ySrc, nSrcWidth, nSrcHeight, crTransparent);\r
+       }\r
+#else // CE specific\r
+       BOOL TransparentImage(int x, int y, int nWidth, int nHeight, HDC hSrcDC, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, UINT crTransparent)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::TransparentImage(m_hDC, x, y, nWidth, nHeight, hSrcDC, xSrc, ySrc, nSrcWidth, nSrcHeight, crTransparent);\r
+       }\r
+#endif // _WIN32_WCE\r
+\r
+#if (!defined(_WIN32_WCE) || (_WIN32_WCE >= 420))\r
+       BOOL GradientFill(const PTRIVERTEX pVertices, DWORD nVertices, void* pMeshElements, DWORD nMeshElements, DWORD dwMode)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::GradientFill(m_hDC, pVertices, nVertices, pMeshElements, nMeshElements, dwMode);\r
+       }\r
+#endif // !defined(_WIN32_WCE) || (_WIN32_WCE >= 420)\r
+\r
+#if !defined(_WIN32_WCE) || (_WIN32_WCE > 0x500)\r
+       BOOL AlphaBlend(int x, int y, int nWidth, int nHeight, HDC hSrcDC, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, BLENDFUNCTION bf)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::AlphaBlend(m_hDC, x, y, nWidth, nHeight, hSrcDC, xSrc, ySrc, nSrcWidth, nSrcHeight, bf);\r
+       }\r
+#endif // !defined(_WIN32_WCE) || (_WIN32_WCE > 0x500)\r
+#endif //  !defined(_ATL_NO_MSIMG) || defined(_WIN32_WCE)\r
+\r
+// Extra bitmap functions\r
+       // Helper function for painting a disabled toolbar or menu bitmap\r
+       // This function can take either an HBITMAP (for SS) or a DC with \r
+       //           the bitmap already painted (for cmdbar)\r
+       BOOL DitherBlt(int x, int y, int nWidth, int nHeight, HDC hSrcDC, HBITMAP hBitmap, int xSrc, int ySrc,\r
+                       HBRUSH hBrushBackground = ::GetSysColorBrush(COLOR_3DFACE),\r
+                       HBRUSH hBrush3DEffect = ::GetSysColorBrush(COLOR_3DHILIGHT),\r
+                       HBRUSH hBrushDisabledImage = ::GetSysColorBrush(COLOR_3DSHADOW))\r
+       {\r
+               ATLASSERT(m_hDC != NULL || hBitmap != NULL);\r
+               ATLASSERT(nWidth > 0 && nHeight > 0);\r
+               \r
+               // Create a generic DC for all BitBlts\r
+               CDCHandle dc = (hSrcDC != NULL) ? hSrcDC : ::CreateCompatibleDC(m_hDC);\r
+               ATLASSERT(dc.m_hDC != NULL);\r
+               if(dc.m_hDC == NULL)\r
+                       return FALSE;\r
+               \r
+               // Create a DC for the monochrome DIB section\r
+               CDC dcBW = ::CreateCompatibleDC(m_hDC);\r
+               ATLASSERT(dcBW.m_hDC != NULL);\r
+               if(dcBW.m_hDC == NULL)\r
+               {\r
+                       if(hSrcDC == NULL)\r
+                               dc.DeleteDC();\r
+                       return FALSE;\r
+               }\r
+\r
+               // Create the monochrome DIB section with a black and white palette\r
+               struct RGBBWBITMAPINFO\r
+               {\r
+                       BITMAPINFOHEADER bmiHeader; \r
+                       RGBQUAD bmiColors[2]; \r
+               };\r
+\r
+               RGBBWBITMAPINFO rgbBWBitmapInfo = \r
+               {\r
+                       { sizeof(BITMAPINFOHEADER), nWidth, nHeight, 1, 1, BI_RGB, 0, 0, 0, 0, 0 },\r
+                       { { 0x00, 0x00, 0x00, 0x00 }, { 0xFF, 0xFF, 0xFF, 0x00 } }\r
+               };\r
+\r
+               VOID* pbitsBW;\r
+               CBitmap bmpBW = ::CreateDIBSection(dcBW, (LPBITMAPINFO)&rgbBWBitmapInfo, DIB_RGB_COLORS, &pbitsBW, NULL, 0);\r
+               ATLASSERT(bmpBW.m_hBitmap != NULL);\r
+               if(bmpBW.m_hBitmap == NULL)\r
+               {\r
+                       if(hSrcDC == NULL)\r
+                               dc.DeleteDC();\r
+                       return FALSE;\r
+               }\r
+               \r
+               // Attach the monochrome DIB section and the bitmap to the DCs\r
+               HBITMAP hbmOldBW = dcBW.SelectBitmap(bmpBW);\r
+               HBITMAP hbmOldDC = NULL;\r
+               if(hBitmap != NULL)\r
+                       hbmOldDC = dc.SelectBitmap(hBitmap);\r
+\r
+               // Block: Dark gray removal: we want (128, 128, 128) pixels to become black and not white\r
+               {\r
+                       CDC dcTemp1 = ::CreateCompatibleDC(m_hDC);\r
+                       CDC dcTemp2 = ::CreateCompatibleDC(m_hDC);\r
+                       CBitmap bmpTemp1;\r
+                       bmpTemp1.CreateCompatibleBitmap(dc, nWidth, nHeight);\r
+                       CBitmap bmpTemp2;\r
+                       bmpTemp2.CreateBitmap(nWidth, nHeight, 1, 1, NULL);\r
+                       HBITMAP hOldBmp1 = dcTemp1.SelectBitmap(bmpTemp1);\r
+                       HBITMAP hOldBmp2 = dcTemp2.SelectBitmap(bmpTemp2);\r
+                       // Let's copy our image, it will be altered\r
+                       dcTemp1.BitBlt(0, 0, nWidth, nHeight, dc, xSrc, ySrc, SRCCOPY);\r
+\r
+                       // All dark gray pixels will become white, the others black\r
+                       dcTemp1.SetBkColor(RGB(128, 128, 128));\r
+                       dcTemp2.BitBlt(0, 0, nWidth, nHeight, dcTemp1, 0, 0, SRCCOPY);\r
+                       // Do an XOR to set to black these white pixels\r
+                       dcTemp1.BitBlt(0, 0, nWidth, nHeight, dcTemp2, 0, 0, SRCINVERT);\r
+\r
+                       // BitBlt the bitmap into the monochrome DIB section\r
+                       // The DIB section will do a true monochrome conversion\r
+                       // The magenta background being closer to white will become white\r
+                       dcBW.BitBlt(0, 0, nWidth, nHeight, dcTemp1, 0, 0, SRCCOPY);\r
+\r
+                       // Cleanup\r
+                       dcTemp1.SelectBitmap(hOldBmp1);\r
+                       dcTemp2.SelectBitmap(hOldBmp2);\r
+               }\r
+               \r
+               // Paint the destination rectangle using hBrushBackground\r
+               if(hBrushBackground != NULL)\r
+               {\r
+                       RECT rc = { x, y, x + nWidth, y + nHeight };\r
+                       FillRect(&rc, hBrushBackground);\r
+               }\r
+\r
+               // BitBlt the black bits in the monochrome bitmap into hBrush3DEffect color in the destination DC\r
+               // The magic ROP comes from the Charles Petzold's book\r
+               HBRUSH hOldBrush = SelectBrush(hBrush3DEffect);\r
+               BitBlt(x + 1, y + 1, nWidth, nHeight, dcBW, 0, 0, 0xB8074A);\r
+\r
+               // BitBlt the black bits in the monochrome bitmap into hBrushDisabledImage color in the destination DC\r
+               SelectBrush(hBrushDisabledImage);\r
+               BitBlt(x, y, nWidth, nHeight, dcBW, 0, 0, 0xB8074A);\r
+\r
+               SelectBrush(hOldBrush);\r
+               dcBW.SelectBitmap(hbmOldBW);\r
+               dc.SelectBitmap(hbmOldDC);\r
+\r
+               if(hSrcDC == NULL)\r
+                       dc.DeleteDC();\r
+\r
+               return TRUE;\r
+       }\r
+\r
+// Text Functions\r
+#ifndef _WIN32_WCE\r
+       BOOL TextOut(int x, int y, LPCTSTR lpszString, int nCount = -1)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               if(nCount == -1)\r
+                       nCount = lstrlen(lpszString);\r
+               return ::TextOut(m_hDC, x, y, lpszString, nCount);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       BOOL ExtTextOut(int x, int y, UINT nOptions, LPCRECT lpRect, LPCTSTR lpszString, UINT nCount = -1, LPINT lpDxWidths = NULL)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               if(nCount == -1)\r
+                       nCount = lstrlen(lpszString);\r
+               return ::ExtTextOut(m_hDC, x, y, nOptions, lpRect, lpszString, nCount, lpDxWidths);\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       SIZE TabbedTextOut(int x, int y, LPCTSTR lpszString, int nCount = -1, int nTabPositions = 0, LPINT lpnTabStopPositions = NULL, int nTabOrigin = 0)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               if(nCount == -1)\r
+                       nCount = lstrlen(lpszString);\r
+               LONG lRes = ::TabbedTextOut(m_hDC, x, y, lpszString, nCount, nTabPositions, lpnTabStopPositions, nTabOrigin);\r
+               SIZE size = { GET_X_LPARAM(lRes), GET_Y_LPARAM(lRes) };\r
+               return size;\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       int DrawText(LPCTSTR lpstrText, int cchText, LPRECT lpRect, UINT uFormat)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+#ifndef _WIN32_WCE\r
+               ATLASSERT((uFormat & DT_MODIFYSTRING) == 0);\r
+#endif // !_WIN32_WCE\r
+               return ::DrawText(m_hDC, lpstrText, cchText, lpRect, uFormat);\r
+       }\r
+\r
+       int DrawText(LPTSTR lpstrText, int cchText, LPRECT lpRect, UINT uFormat)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::DrawText(m_hDC, lpstrText, cchText, lpRect, uFormat);\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       int DrawTextEx(LPTSTR lpstrText, int cchText, LPRECT lpRect, UINT uFormat, LPDRAWTEXTPARAMS lpDTParams = NULL)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::DrawTextEx(m_hDC, lpstrText, cchText, lpRect, uFormat, lpDTParams);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+#if (_WIN32_WINNT >= 0x0501)\r
+       int DrawShadowText(LPCWSTR lpstrText, int cchText, LPRECT lpRect, DWORD dwFlags, COLORREF clrText, COLORREF clrShadow, int xOffset, int yOffset)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               // This function is present only if comctl32.dll version 6 is loaded;\r
+               // we use LoadLibrary/GetProcAddress to allow apps compiled with\r
+               // _WIN32_WINNT >= 0x0501 to run on older Windows/CommCtrl\r
+               int nRet = 0;\r
+               HMODULE hCommCtrlDLL = ::LoadLibrary(_T("comctl32.dll"));\r
+               ATLASSERT(hCommCtrlDLL != NULL);\r
+               if(hCommCtrlDLL != NULL)\r
+               {\r
+                       typedef int (WINAPI *PFN_DrawShadowText)(HDC hDC, LPCWSTR lpstrText, UINT cchText, LPRECT lpRect, DWORD dwFlags, COLORREF clrText, COLORREF clrShadow, int xOffset, int yOffset);\r
+                       PFN_DrawShadowText pfnDrawShadowText = (PFN_DrawShadowText)::GetProcAddress(hCommCtrlDLL, "DrawShadowText");\r
+                       ATLASSERT(pfnDrawShadowText != NULL);   // this function requires CommCtrl6\r
+                       if(pfnDrawShadowText != NULL)\r
+                               nRet = pfnDrawShadowText(m_hDC, lpstrText, cchText, lpRect, dwFlags, clrText, clrShadow, xOffset, yOffset);\r
+                       ::FreeLibrary(hCommCtrlDLL);\r
+               }\r
+               return nRet;\r
+       }\r
+#endif // (_WIN32_WINNT >= 0x0501)\r
+\r
+       BOOL GetTextExtent(LPCTSTR lpszString, int nCount, LPSIZE lpSize) const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               if(nCount == -1)\r
+                       nCount = lstrlen(lpszString);\r
+               return ::GetTextExtentPoint32(m_hDC, lpszString, nCount, lpSize);\r
+       }\r
+\r
+       BOOL GetTextExtentExPoint(LPCTSTR lpszString, int cchString, LPSIZE lpSize, int nMaxExtent, LPINT lpnFit = NULL, LPINT alpDx = NULL)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::GetTextExtentExPoint(m_hDC, lpszString, cchString, nMaxExtent, lpnFit, alpDx, lpSize);\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       DWORD GetTabbedTextExtent(LPCTSTR lpszString, int nCount = -1, int nTabPositions = 0, LPINT lpnTabStopPositions = NULL) const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               if(nCount == -1)\r
+                       nCount = lstrlen(lpszString);\r
+               return ::GetTabbedTextExtent(m_hDC, lpszString, nCount, nTabPositions, lpnTabStopPositions);\r
+       }\r
+\r
+       BOOL GrayString(HBRUSH hBrush, BOOL (CALLBACK* lpfnOutput)(HDC, LPARAM, int), LPARAM lpData, int nCount, int x, int y, int nWidth, int nHeight)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::GrayString(m_hDC, hBrush, (GRAYSTRINGPROC)lpfnOutput, lpData, nCount, x, y, nWidth, nHeight);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+#if !defined(_WIN32_WCE) || (_WIN32_WCE >= 400)\r
+       UINT GetTextAlign() const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::GetTextAlign(m_hDC);\r
+       }\r
+\r
+       UINT SetTextAlign(UINT nFlags)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::SetTextAlign(m_hDC, nFlags);\r
+       }\r
+#endif // !defined(_WIN32_WCE) || (_WIN32_WCE >= 400)\r
+\r
+       int GetTextFace(LPTSTR lpszFacename, int nCount) const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::GetTextFace(m_hDC, nCount, lpszFacename);\r
+       }\r
+\r
+       int GetTextFaceLen() const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::GetTextFace(m_hDC, 0, NULL);\r
+       }\r
+\r
+#ifndef _ATL_NO_COM\r
+#ifdef _OLEAUTO_H_\r
+       BOOL GetTextFace(BSTR& bstrFace) const\r
+       {\r
+               USES_CONVERSION;\r
+               ATLASSERT(m_hDC != NULL);\r
+               ATLASSERT(bstrFace == NULL);\r
+\r
+               int nLen = GetTextFaceLen();\r
+               if(nLen == 0)\r
+                       return FALSE;\r
+\r
+               CTempBuffer<TCHAR, _WTL_STACK_ALLOC_THRESHOLD> buff;\r
+               LPTSTR lpszText = buff.Allocate(nLen);\r
+               if(lpszText == NULL)\r
+                       return FALSE;\r
+\r
+               if(!GetTextFace(lpszText, nLen))\r
+                       return FALSE;\r
+\r
+               bstrFace = ::SysAllocString(T2OLE(lpszText));\r
+               return (bstrFace != NULL) ? TRUE : FALSE;\r
+       }\r
+#endif\r
+#endif // !_ATL_NO_COM\r
+\r
+#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)\r
+       int GetTextFace(_CSTRING_NS::CString& strFace) const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+\r
+               int nLen = GetTextFaceLen();\r
+               if(nLen == 0)\r
+                       return 0;\r
+\r
+               LPTSTR lpstr = strFace.GetBufferSetLength(nLen);\r
+               if(lpstr == NULL)\r
+                       return 0;\r
+               int nRet = GetTextFace(lpstr, nLen);\r
+               strFace.ReleaseBuffer();\r
+               return nRet;\r
+       }\r
+#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)\r
+\r
+       BOOL GetTextMetrics(LPTEXTMETRIC lpMetrics) const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::GetTextMetrics(m_hDC, lpMetrics);\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       int SetTextJustification(int nBreakExtra, int nBreakCount)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::SetTextJustification(m_hDC, nBreakExtra, nBreakCount);\r
+       }\r
+\r
+       int GetTextCharacterExtra() const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::GetTextCharacterExtra(m_hDC);\r
+       }\r
+\r
+       int SetTextCharacterExtra(int nCharExtra)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::SetTextCharacterExtra(m_hDC, nCharExtra);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+// Advanced Drawing\r
+       BOOL DrawEdge(LPRECT lpRect, UINT nEdge, UINT nFlags)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::DrawEdge(m_hDC, lpRect, nEdge, nFlags);\r
+       }\r
+\r
+       BOOL DrawFrameControl(LPRECT lpRect, UINT nType, UINT nState)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::DrawFrameControl(m_hDC, lpRect, nType, nState);\r
+       }\r
+\r
+// Scrolling Functions\r
+       BOOL ScrollDC(int dx, int dy, LPCRECT lpRectScroll, LPCRECT lpRectClip, HRGN hRgnUpdate, LPRECT lpRectUpdate)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::ScrollDC(m_hDC, dx, dy, lpRectScroll, lpRectClip, hRgnUpdate, lpRectUpdate);\r
+       }\r
+\r
+// Font Functions\r
+#ifndef _WIN32_WCE\r
+       BOOL GetCharWidth(UINT nFirstChar, UINT nLastChar, LPINT lpBuffer) const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::GetCharWidth(m_hDC, nFirstChar, nLastChar, lpBuffer);\r
+       }\r
+\r
+       // GetCharWidth32 is not supported under Win9x\r
+       BOOL GetCharWidth32(UINT nFirstChar, UINT nLastChar, LPINT lpBuffer) const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::GetCharWidth32(m_hDC, nFirstChar, nLastChar, lpBuffer);\r
+       }\r
+\r
+       DWORD SetMapperFlags(DWORD dwFlag)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::SetMapperFlags(m_hDC, dwFlag);\r
+       }\r
+\r
+       BOOL GetAspectRatioFilter(LPSIZE lpSize) const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::GetAspectRatioFilterEx(m_hDC, lpSize);\r
+       }\r
+\r
+       BOOL GetCharABCWidths(UINT nFirstChar, UINT nLastChar, LPABC lpabc) const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::GetCharABCWidths(m_hDC, nFirstChar, nLastChar, lpabc);\r
+       }\r
+\r
+       DWORD GetFontData(DWORD dwTable, DWORD dwOffset, LPVOID lpData, DWORD cbData) const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::GetFontData(m_hDC, dwTable, dwOffset, lpData, cbData);\r
+       }\r
+\r
+       int GetKerningPairs(int nPairs, LPKERNINGPAIR lpkrnpair) const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::GetKerningPairs(m_hDC, nPairs, lpkrnpair);\r
+       }\r
+\r
+       UINT GetOutlineTextMetrics(UINT cbData, LPOUTLINETEXTMETRIC lpotm) const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::GetOutlineTextMetrics(m_hDC, cbData, lpotm);\r
+       }\r
+\r
+       DWORD GetGlyphOutline(UINT nChar, UINT nFormat, LPGLYPHMETRICS lpgm, DWORD cbBuffer, LPVOID lpBuffer, const MAT2* lpmat2) const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::GetGlyphOutline(m_hDC, nChar, nFormat, lpgm, cbBuffer, lpBuffer, lpmat2);\r
+       }\r
+\r
+       BOOL GetCharABCWidths(UINT nFirstChar, UINT nLastChar, LPABCFLOAT lpABCF) const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::GetCharABCWidthsFloat(m_hDC, nFirstChar, nLastChar, lpABCF);\r
+       }\r
+\r
+       BOOL GetCharWidth(UINT nFirstChar, UINT nLastChar, float* lpFloatBuffer) const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::GetCharWidthFloat(m_hDC, nFirstChar, nLastChar, lpFloatBuffer);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+// Printer/Device Escape Functions\r
+#ifndef _WIN32_WCE\r
+       int Escape(int nEscape, int nCount, LPCSTR lpszInData, LPVOID lpOutData)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::Escape(m_hDC, nEscape, nCount, lpszInData, lpOutData);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       int Escape(int nEscape, int nInputSize, LPCSTR lpszInputData,\r
+               int nOutputSize, LPSTR lpszOutputData)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::ExtEscape(m_hDC, nEscape, nInputSize, lpszInputData, nOutputSize, lpszOutputData);\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       int DrawEscape(int nEscape, int nInputSize, LPCSTR lpszInputData)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::DrawEscape(m_hDC, nEscape, nInputSize, lpszInputData);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       // Escape helpers\r
+#if !defined(_WIN32_WCE) || ((_WIN32_WCE >= 200) && defined(StartDoc))\r
+       int StartDoc(LPCTSTR lpszDocName)  // old Win3.0 version\r
+       {\r
+               DOCINFO di = { 0 };\r
+               di.cbSize = sizeof(DOCINFO);\r
+               di.lpszDocName = lpszDocName;\r
+               return StartDoc(&di);\r
+       }\r
+\r
+       int StartDoc(LPDOCINFO lpDocInfo)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::StartDoc(m_hDC, lpDocInfo);\r
+       }\r
+\r
+       int StartPage()\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::StartPage(m_hDC);\r
+       }\r
+\r
+       int EndPage()\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::EndPage(m_hDC);\r
+       }\r
+\r
+       int SetAbortProc(BOOL (CALLBACK* lpfn)(HDC, int))\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::SetAbortProc(m_hDC, (ABORTPROC)lpfn);\r
+       }\r
+\r
+       int AbortDoc()\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::AbortDoc(m_hDC);\r
+       }\r
+\r
+       int EndDoc()\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::EndDoc(m_hDC);\r
+       }\r
+#endif // !defined(_WIN32_WCE) || ((_WIN32_WCE >= 200) && defined(StartDoc))\r
+\r
+// MetaFile Functions\r
+#ifndef _WIN32_WCE\r
+       BOOL PlayMetaFile(HMETAFILE hMF)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               if(::GetDeviceCaps(m_hDC, TECHNOLOGY) == DT_METAFILE)\r
+               {\r
+                       // playing metafile in metafile, just use core windows API\r
+                       return ::PlayMetaFile(m_hDC, hMF);\r
+               }\r
+\r
+               // for special playback, lParam == pDC\r
+               return ::EnumMetaFile(m_hDC, hMF, EnumMetaFileProc, (LPARAM)this);\r
+       }\r
+\r
+       BOOL PlayMetaFile(HENHMETAFILE hEnhMetaFile, LPCRECT lpBounds)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::PlayEnhMetaFile(m_hDC, hEnhMetaFile, lpBounds);\r
+       }\r
+\r
+       BOOL AddMetaFileComment(UINT nDataSize, const BYTE* pCommentData) // can be used for enhanced metafiles only\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::GdiComment(m_hDC, nDataSize, pCommentData);\r
+       }\r
+\r
+       // Special handling for metafile playback\r
+       static int CALLBACK EnumMetaFileProc(HDC hDC, HANDLETABLE* pHandleTable, METARECORD* pMetaRec, int nHandles, LPARAM lParam)\r
+       {\r
+               CDCHandle* pDC = (CDCHandle*)lParam;\r
+\r
+               switch (pMetaRec->rdFunction)\r
+               {\r
+               case META_SETMAPMODE:\r
+                       pDC->SetMapMode((int)(short)pMetaRec->rdParm[0]);\r
+                       break;\r
+               case META_SETWINDOWEXT:\r
+                       pDC->SetWindowExt((int)(short)pMetaRec->rdParm[1], (int)(short)pMetaRec->rdParm[0]);\r
+                       break;\r
+               case META_SETWINDOWORG:\r
+                       pDC->SetWindowOrg((int)(short)pMetaRec->rdParm[1], (int)(short)pMetaRec->rdParm[0]);\r
+                       break;\r
+               case META_SETVIEWPORTEXT:\r
+                       pDC->SetViewportExt((int)(short)pMetaRec->rdParm[1], (int)(short)pMetaRec->rdParm[0]);\r
+                       break;\r
+               case META_SETVIEWPORTORG:\r
+                       pDC->SetViewportOrg((int)(short)pMetaRec->rdParm[1], (int)(short)pMetaRec->rdParm[0]);\r
+                       break;\r
+               case META_SCALEWINDOWEXT:\r
+                       pDC->ScaleWindowExt((int)(short)pMetaRec->rdParm[3], (int)(short)pMetaRec->rdParm[2], \r
+                               (int)(short)pMetaRec->rdParm[1], (int)(short)pMetaRec->rdParm[0]);\r
+                       break;\r
+               case META_SCALEVIEWPORTEXT:\r
+                       pDC->ScaleViewportExt((int)(short)pMetaRec->rdParm[3], (int)(short)pMetaRec->rdParm[2],\r
+                               (int)(short)pMetaRec->rdParm[1], (int)(short)pMetaRec->rdParm[0]);\r
+                       break;\r
+               case META_OFFSETVIEWPORTORG:\r
+                       pDC->OffsetViewportOrg((int)(short)pMetaRec->rdParm[1], (int)(short)pMetaRec->rdParm[0]);\r
+                       break;\r
+               case META_SAVEDC:\r
+                       pDC->SaveDC();\r
+                       break;\r
+               case META_RESTOREDC:\r
+                       pDC->RestoreDC((int)(short)pMetaRec->rdParm[0]);\r
+                       break;\r
+               case META_SETBKCOLOR:\r
+                       pDC->SetBkColor(*(UNALIGNED COLORREF*)&pMetaRec->rdParm[0]);\r
+                       break;\r
+               case META_SETTEXTCOLOR:\r
+                       pDC->SetTextColor(*(UNALIGNED COLORREF*)&pMetaRec->rdParm[0]);\r
+                       break;\r
+\r
+               // need to watch out for SelectObject(HFONT), for custom font mapping\r
+               case META_SELECTOBJECT:\r
+                       {\r
+                               HGDIOBJ hObject = pHandleTable->objectHandle[pMetaRec->rdParm[0]];\r
+                               UINT nObjType = ::GetObjectType(hObject);\r
+                               if(nObjType == 0)\r
+                               {\r
+                                       // object type is unknown, determine if it is a font\r
+                                       HFONT hStockFont = (HFONT)::GetStockObject(SYSTEM_FONT);\r
+                                       HFONT hFontOld = (HFONT)::SelectObject(pDC->m_hDC, hStockFont);\r
+                                       HGDIOBJ hObjOld = ::SelectObject(pDC->m_hDC, hObject);\r
+                                       if(hObjOld == hStockFont)\r
+                                       {\r
+                                               // got the stock object back, so must be selecting a font\r
+                                               pDC->SelectFont((HFONT)hObject);\r
+                                               break;  // don't play the default record\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               // didn't get the stock object back, so restore everything\r
+                                               ::SelectObject(pDC->m_hDC, hFontOld);\r
+                                               ::SelectObject(pDC->m_hDC, hObjOld);\r
+                                       }\r
+                                       // and fall through to PlayMetaFileRecord...\r
+                               }\r
+                               else if(nObjType == OBJ_FONT)\r
+                               {\r
+                                       // play back as CDCHandle::SelectFont(HFONT)\r
+                                       pDC->SelectFont((HFONT)hObject);\r
+                                       break;  // don't play the default record\r
+                               }\r
+                       }\r
+                       // fall through...\r
+\r
+               default:\r
+                       ::PlayMetaFileRecord(hDC, pHandleTable, pMetaRec, nHandles);\r
+                       break;\r
+               }\r
+\r
+               return 1;\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+// Path Functions\r
+#ifndef _WIN32_WCE\r
+       BOOL AbortPath()\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::AbortPath(m_hDC);\r
+       }\r
+\r
+       BOOL BeginPath()\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::BeginPath(m_hDC);\r
+       }\r
+\r
+       BOOL CloseFigure()\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::CloseFigure(m_hDC);\r
+       }\r
+\r
+       BOOL EndPath()\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::EndPath(m_hDC);\r
+       }\r
+\r
+       BOOL FillPath()\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::FillPath(m_hDC);\r
+       }\r
+\r
+       BOOL FlattenPath()\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::FlattenPath(m_hDC);\r
+       }\r
+\r
+       BOOL StrokeAndFillPath()\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::StrokeAndFillPath(m_hDC);\r
+       }\r
+\r
+       BOOL StrokePath()\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::StrokePath(m_hDC);\r
+       }\r
+\r
+       BOOL WidenPath()\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::WidenPath(m_hDC);\r
+       }\r
+\r
+       BOOL GetMiterLimit(PFLOAT pfMiterLimit) const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::GetMiterLimit(m_hDC, pfMiterLimit);\r
+       }\r
+\r
+       BOOL SetMiterLimit(float fMiterLimit)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::SetMiterLimit(m_hDC, fMiterLimit, NULL);\r
+       }\r
+\r
+       int GetPath(LPPOINT lpPoints, LPBYTE lpTypes, int nCount) const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::GetPath(m_hDC, lpPoints, lpTypes, nCount);\r
+       }\r
+\r
+       BOOL SelectClipPath(int nMode)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::SelectClipPath(m_hDC, nMode);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+// Misc Helper Functions\r
+       static CBrushHandle PASCAL GetHalftoneBrush()\r
+       {\r
+               HBRUSH halftoneBrush = NULL;\r
+               WORD grayPattern[8];\r
+               for(int i = 0; i < 8; i++)\r
+                       grayPattern[i] = (WORD)(0x5555 << (i & 1));\r
+               HBITMAP grayBitmap = CreateBitmap(8, 8, 1, 1, &grayPattern);\r
+               if(grayBitmap != NULL)\r
+               {\r
+                       halftoneBrush = ::CreatePatternBrush(grayBitmap);\r
+                       DeleteObject(grayBitmap);\r
+               }\r
+               return CBrushHandle(halftoneBrush);\r
+       }\r
+\r
+       void DrawDragRect(LPCRECT lpRect, SIZE size, LPCRECT lpRectLast, SIZE sizeLast, HBRUSH hBrush = NULL, HBRUSH hBrushLast = NULL)\r
+       {\r
+               // first, determine the update region and select it\r
+               CRgn rgnOutside;\r
+               rgnOutside.CreateRectRgnIndirect(lpRect);\r
+               RECT rect = *lpRect;\r
+               ::InflateRect(&rect, -size.cx, -size.cy);\r
+               ::IntersectRect(&rect, &rect, lpRect);\r
+               CRgn rgnInside;\r
+               rgnInside.CreateRectRgnIndirect(&rect);\r
+               CRgn rgnNew;\r
+               rgnNew.CreateRectRgn(0, 0, 0, 0);\r
+               rgnNew.CombineRgn(rgnOutside, rgnInside, RGN_XOR);\r
+\r
+               HBRUSH hBrushOld = NULL;\r
+               CBrush brushHalftone;\r
+               if(hBrush == NULL)\r
+                       brushHalftone = hBrush = CDCHandle::GetHalftoneBrush();\r
+               if(hBrushLast == NULL)\r
+                       hBrushLast = hBrush;\r
+\r
+               CRgn rgnLast;\r
+               CRgn rgnUpdate;\r
+               if(lpRectLast != NULL)\r
+               {\r
+                       // find difference between new region and old region\r
+                       rgnLast.CreateRectRgn(0, 0, 0, 0);\r
+                       rgnOutside.SetRectRgn(lpRectLast->left, lpRectLast->top, lpRectLast->right, lpRectLast->bottom);\r
+                       rect = *lpRectLast;\r
+                       ::InflateRect(&rect, -sizeLast.cx, -sizeLast.cy);\r
+                       ::IntersectRect(&rect, &rect, lpRectLast);\r
+                       rgnInside.SetRectRgn(rect.left, rect.top, rect.right, rect.bottom);\r
+                       rgnLast.CombineRgn(rgnOutside, rgnInside, RGN_XOR);\r
+\r
+                       // only diff them if brushes are the same\r
+                       if(hBrush == hBrushLast)\r
+                       {\r
+                               rgnUpdate.CreateRectRgn(0, 0, 0, 0);\r
+                               rgnUpdate.CombineRgn(rgnLast, rgnNew, RGN_XOR);\r
+                       }\r
+               }\r
+               if(hBrush != hBrushLast && lpRectLast != NULL)\r
+               {\r
+                       // brushes are different -- erase old region first\r
+                       SelectClipRgn(rgnLast);\r
+                       GetClipBox(&rect);\r
+                       hBrushOld = SelectBrush(hBrushLast);\r
+                       PatBlt(rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, PATINVERT);\r
+                       SelectBrush(hBrushOld);\r
+                       hBrushOld = NULL;\r
+               }\r
+\r
+               // draw into the update/new region\r
+               SelectClipRgn(rgnUpdate.IsNull() ? rgnNew : rgnUpdate);\r
+               GetClipBox(&rect);\r
+               hBrushOld = SelectBrush(hBrush);\r
+               PatBlt(rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, PATINVERT);\r
+\r
+               // cleanup DC\r
+               if(hBrushOld != NULL)\r
+                       SelectBrush(hBrushOld);\r
+               SelectClipRgn(NULL);\r
+       }\r
+\r
+       void FillSolidRect(LPCRECT lpRect, COLORREF clr)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+\r
+               COLORREF clrOld = ::SetBkColor(m_hDC, clr);\r
+               ATLASSERT(clrOld != CLR_INVALID);\r
+               if(clrOld != CLR_INVALID)\r
+               {\r
+                       ::ExtTextOut(m_hDC, 0, 0, ETO_OPAQUE, lpRect, NULL, 0, NULL);\r
+                       ::SetBkColor(m_hDC, clrOld);\r
+               }\r
+       }\r
+\r
+       void FillSolidRect(int x, int y, int cx, int cy, COLORREF clr)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+\r
+               RECT rect = { x, y, x + cx, y + cy };\r
+               FillSolidRect(&rect, clr);\r
+       }\r
+\r
+       void Draw3dRect(LPCRECT lpRect, COLORREF clrTopLeft, COLORREF clrBottomRight)\r
+       {\r
+               Draw3dRect(lpRect->left, lpRect->top, lpRect->right - lpRect->left,\r
+                       lpRect->bottom - lpRect->top, clrTopLeft, clrBottomRight);\r
+       }\r
+\r
+       void Draw3dRect(int x, int y, int cx, int cy, COLORREF clrTopLeft, COLORREF clrBottomRight)\r
+       {\r
+               FillSolidRect(x, y, cx - 1, 1, clrTopLeft);\r
+               FillSolidRect(x, y, 1, cy - 1, clrTopLeft);\r
+               FillSolidRect(x + cx, y, -1, cy, clrBottomRight);\r
+               FillSolidRect(x, y + cy, cx, -1, clrBottomRight);\r
+       }\r
+\r
+// DIB support\r
+#if !defined(_WIN32_WCE) || (_WIN32_WCE >= 410)\r
+       int SetDIBitsToDevice(int x, int y, DWORD dwWidth, DWORD dwHeight, int xSrc, int ySrc, UINT uStartScan, UINT cScanLines, CONST VOID* lpvBits, CONST BITMAPINFO* lpbmi, UINT uColorUse)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::SetDIBitsToDevice(m_hDC, x, y, dwWidth, dwHeight, xSrc, ySrc, uStartScan, cScanLines, lpvBits, lpbmi, uColorUse);\r
+       }\r
+#endif // !defined(_WIN32_WCE) || (_WIN32_WCE >= 410)\r
+\r
+#if !defined(_WIN32_WCE) || (_WIN32_WCE >= 400)\r
+       int StretchDIBits(int x, int y, int nWidth, int nHeight, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, CONST VOID* lpvBits, CONST BITMAPINFO* lpbmi, UINT uColorUse, DWORD dwRop)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::StretchDIBits(m_hDC, x, y, nWidth, nHeight, xSrc, ySrc, nSrcWidth, nSrcHeight, lpvBits, lpbmi, uColorUse, dwRop);\r
+       }\r
+\r
+       UINT GetDIBColorTable(UINT uStartIndex, UINT cEntries, RGBQUAD* pColors) const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::GetDIBColorTable(m_hDC, uStartIndex, cEntries, pColors);\r
+       }\r
+\r
+       UINT SetDIBColorTable(UINT uStartIndex, UINT cEntries, CONST RGBQUAD* pColors)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::SetDIBColorTable(m_hDC, uStartIndex, cEntries, pColors);\r
+       }\r
+#endif // !defined(_WIN32_WCE) || (_WIN32_WCE >= 400)\r
+\r
+// OpenGL support\r
+#if !defined(_ATL_NO_OPENGL) && !defined(_WIN32_WCE)\r
+       int ChoosePixelFormat(CONST PIXELFORMATDESCRIPTOR* ppfd)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::ChoosePixelFormat(m_hDC, ppfd);\r
+       }\r
+\r
+       int DescribePixelFormat(int iPixelFormat, UINT nBytes, LPPIXELFORMATDESCRIPTOR ppfd)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::DescribePixelFormat(m_hDC, iPixelFormat, nBytes, ppfd);\r
+       }\r
+\r
+       int GetPixelFormat() const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::GetPixelFormat(m_hDC);\r
+       }\r
+\r
+       BOOL SetPixelFormat(int iPixelFormat, CONST PIXELFORMATDESCRIPTOR* ppfd)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::SetPixelFormat(m_hDC, iPixelFormat, ppfd);\r
+       }\r
+\r
+       BOOL SwapBuffers()\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::SwapBuffers(m_hDC);\r
+       }\r
+\r
+       HGLRC wglCreateContext()\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::wglCreateContext(m_hDC);\r
+       }\r
+\r
+       HGLRC wglCreateLayerContext(int iLayerPlane)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::wglCreateLayerContext(m_hDC, iLayerPlane);\r
+       }\r
+\r
+       BOOL wglMakeCurrent(HGLRC hglrc)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::wglMakeCurrent(m_hDC, hglrc);\r
+       }\r
+\r
+       BOOL wglUseFontBitmaps(DWORD dwFirst, DWORD dwCount, DWORD listBase)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::wglUseFontBitmaps(m_hDC, dwFirst, dwCount, listBase);\r
+       }\r
+\r
+       BOOL wglUseFontOutlines(DWORD dwFirst, DWORD dwCount, DWORD listBase, FLOAT deviation, FLOAT extrusion, int format, LPGLYPHMETRICSFLOAT lpgmf)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::wglUseFontOutlines(m_hDC, dwFirst, dwCount, listBase, deviation, extrusion, format, lpgmf);\r
+       }\r
+\r
+       BOOL wglDescribeLayerPlane(int iPixelFormat, int iLayerPlane, UINT nBytes, LPLAYERPLANEDESCRIPTOR plpd)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::wglDescribeLayerPlane(m_hDC, iPixelFormat, iLayerPlane, nBytes, plpd);\r
+       }\r
+\r
+       int wglSetLayerPaletteEntries(int iLayerPlane, int iStart, int cEntries, CONST COLORREF* pclr)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::wglSetLayerPaletteEntries(m_hDC, iLayerPlane, iStart, cEntries, pclr);\r
+       }\r
+\r
+       int wglGetLayerPaletteEntries(int iLayerPlane, int iStart, int cEntries, COLORREF* pclr)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::wglGetLayerPaletteEntries(m_hDC, iLayerPlane, iStart, cEntries, pclr);\r
+       }\r
+\r
+       BOOL wglRealizeLayerPalette(int iLayerPlane, BOOL bRealize)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::wglRealizeLayerPalette(m_hDC, iLayerPlane, bRealize);\r
+       }\r
+\r
+       BOOL wglSwapLayerBuffers(UINT uPlanes)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::wglSwapLayerBuffers(m_hDC, uPlanes);\r
+       }\r
+#endif // !defined(_ATL_NO_OPENGL) && !defined(_WIN32_WCE)\r
+\r
+// New for Windows 2000 only\r
+#if (_WIN32_WINNT >= 0x0500)\r
+       COLORREF GetDCPenColor() const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::GetDCPenColor(m_hDC);\r
+       }\r
+\r
+       COLORREF SetDCPenColor(COLORREF clr)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::SetDCPenColor(m_hDC, clr);\r
+       }\r
+\r
+       COLORREF GetDCBrushColor() const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::GetDCBrushColor(m_hDC);\r
+       }\r
+\r
+       COLORREF SetDCBrushColor(COLORREF clr)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::SetDCBrushColor(m_hDC, clr);\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       DWORD GetFontUnicodeRanges(LPGLYPHSET lpgs) const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::GetFontUnicodeRanges(m_hDC, lpgs);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       DWORD GetGlyphIndices(LPCTSTR lpstr, int cch, LPWORD pgi, DWORD dwFlags) const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::GetGlyphIndices(m_hDC, lpstr, cch, pgi, dwFlags);\r
+       }\r
+\r
+       BOOL GetTextExtentPointI(LPWORD pgiIn, int cgi, LPSIZE lpSize) const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::GetTextExtentPointI(m_hDC, pgiIn, cgi, lpSize);\r
+       }\r
+\r
+       BOOL GetTextExtentExPointI(LPWORD pgiIn, int cgi, int nMaxExtent, LPINT lpnFit, LPINT alpDx, LPSIZE lpSize) const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::GetTextExtentExPointI(m_hDC, pgiIn, cgi, nMaxExtent, lpnFit, alpDx, lpSize);\r
+       }\r
+\r
+       BOOL GetCharWidthI(UINT giFirst, UINT cgi, LPWORD pgi, LPINT lpBuffer) const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::GetCharWidthI(m_hDC, giFirst, cgi, pgi, lpBuffer);\r
+       }\r
+\r
+       BOOL GetCharABCWidthsI(UINT giFirst, UINT cgi, LPWORD pgi, LPABC lpabc) const\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::GetCharABCWidthsI(m_hDC, giFirst, cgi, pgi, lpabc);\r
+       }\r
+#endif // (_WIN32_WINNT >= 0x0500)\r
+\r
+// New for Windows 2000 and Windows 98\r
+#if (WINVER >= 0x0500) && !defined(_WIN32_WCE)\r
+       BOOL ColorCorrectPalette(HPALETTE hPalette, DWORD dwFirstEntry, DWORD dwNumOfEntries)\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               return ::ColorCorrectPalette(m_hDC, hPalette, dwFirstEntry, dwNumOfEntries);\r
+       }\r
+#endif // (WINVER >= 0x0500) && !defined(_WIN32_WCE)\r
+};\r
+\r
+typedef CDCT<false>   CDCHandle;\r
+typedef CDCT<true>    CDC;\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CDC Helpers\r
+\r
+class CPaintDC : public CDC\r
+{\r
+public:\r
+// Data members\r
+       HWND m_hWnd;\r
+       PAINTSTRUCT m_ps;\r
+\r
+// Constructor/destructor\r
+       CPaintDC(HWND hWnd)\r
+       {\r
+               ATLASSERT(::IsWindow(hWnd));\r
+               m_hWnd = hWnd;\r
+               m_hDC = ::BeginPaint(hWnd, &m_ps);\r
+       }\r
+\r
+       ~CPaintDC()\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::EndPaint(m_hWnd, &m_ps);\r
+               Detach();\r
+       }\r
+};\r
+\r
+class CClientDC : public CDC\r
+{\r
+public:\r
+// Data members\r
+       HWND m_hWnd;\r
+\r
+// Constructor/destructor\r
+       CClientDC(HWND hWnd)\r
+       {\r
+               ATLASSERT(hWnd == NULL || ::IsWindow(hWnd));\r
+               m_hWnd = hWnd;\r
+               m_hDC = ::GetDC(hWnd);\r
+       }\r
+\r
+       ~CClientDC()\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               ::ReleaseDC(m_hWnd, Detach());\r
+       }\r
+};\r
+\r
+class CWindowDC : public CDC\r
+{\r
+public:\r
+// Data members\r
+       HWND m_hWnd;\r
+\r
+// Constructor/destructor\r
+       CWindowDC(HWND hWnd)\r
+       {\r
+               ATLASSERT(hWnd == NULL || ::IsWindow(hWnd));\r
+               m_hWnd = hWnd;\r
+               m_hDC = ::GetWindowDC(hWnd);\r
+       }\r
+\r
+       ~CWindowDC()\r
+       {\r
+               ATLASSERT(m_hDC != NULL);\r
+               ::ReleaseDC(m_hWnd, Detach());\r
+       }\r
+};\r
+\r
+class CMemoryDC : public CDC\r
+{\r
+public:\r
+// Data members\r
+       HDC m_hDCOriginal;\r
+       RECT m_rcPaint;\r
+       CBitmap m_bmp;\r
+       HBITMAP m_hBmpOld;\r
+\r
+// Constructor/destructor\r
+       CMemoryDC(HDC hDC, RECT& rcPaint) : m_hDCOriginal(hDC), m_hBmpOld(NULL)\r
+       {\r
+               m_rcPaint = rcPaint;\r
+               CreateCompatibleDC(m_hDCOriginal);\r
+               ATLASSERT(m_hDC != NULL);\r
+               m_bmp.CreateCompatibleBitmap(m_hDCOriginal, m_rcPaint.right - m_rcPaint.left, m_rcPaint.bottom - m_rcPaint.top);\r
+               ATLASSERT(m_bmp.m_hBitmap != NULL);\r
+               m_hBmpOld = SelectBitmap(m_bmp);\r
+               SetViewportOrg(-m_rcPaint.left, -m_rcPaint.top);\r
+       }\r
+\r
+       ~CMemoryDC()\r
+       {\r
+               ::BitBlt(m_hDCOriginal, m_rcPaint.left, m_rcPaint.top, m_rcPaint.right - m_rcPaint.left, m_rcPaint.bottom - m_rcPaint.top, m_hDC, m_rcPaint.left, m_rcPaint.top, SRCCOPY);\r
+               SelectBitmap(m_hBmpOld);\r
+       }\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Enhanced metafile support\r
+\r
+#ifndef _WIN32_WCE\r
+\r
+class CEnhMetaFileInfo\r
+{\r
+public:\r
+// Data members\r
+       HENHMETAFILE m_hEMF;\r
+       BYTE* m_pBits;\r
+       TCHAR* m_pDesc;\r
+       ENHMETAHEADER m_header;\r
+       PIXELFORMATDESCRIPTOR m_pfd;\r
+\r
+// Constructor/destructor\r
+       CEnhMetaFileInfo(HENHMETAFILE hEMF) : m_pBits(NULL), m_pDesc(NULL), m_hEMF(hEMF)\r
+       { }\r
+\r
+       ~CEnhMetaFileInfo()\r
+       {\r
+               delete [] m_pBits;\r
+               delete [] m_pDesc;\r
+       }\r
+\r
+// Operations\r
+       BYTE* GetEnhMetaFileBits()\r
+       {\r
+               ATLASSERT(m_hEMF != NULL);\r
+               UINT nBytes = ::GetEnhMetaFileBits(m_hEMF, 0, NULL);\r
+               delete [] m_pBits;\r
+               m_pBits = NULL;\r
+               ATLTRY(m_pBits = new BYTE[nBytes]);\r
+               if (m_pBits != NULL)\r
+                       ::GetEnhMetaFileBits(m_hEMF, nBytes, m_pBits);\r
+               return m_pBits;\r
+       }\r
+\r
+       LPTSTR GetEnhMetaFileDescription()\r
+       {\r
+               ATLASSERT(m_hEMF != NULL);\r
+               UINT nLen = ::GetEnhMetaFileDescription(m_hEMF, 0, NULL);\r
+               delete [] m_pDesc;\r
+               m_pDesc = NULL;\r
+               ATLTRY(m_pDesc = new TCHAR[nLen]);\r
+               if (m_pDesc != NULL)\r
+                       nLen = ::GetEnhMetaFileDescription(m_hEMF, nLen, m_pDesc);\r
+               return m_pDesc;\r
+       }\r
+\r
+       ENHMETAHEADER* GetEnhMetaFileHeader()\r
+       {\r
+               ATLASSERT(m_hEMF != NULL);\r
+               memset(&m_header, 0, sizeof(m_header));\r
+               m_header.iType = EMR_HEADER;\r
+               m_header.nSize = sizeof(ENHMETAHEADER);\r
+               UINT n = ::GetEnhMetaFileHeader(m_hEMF, sizeof(ENHMETAHEADER), &m_header);\r
+               return (n != 0) ? &m_header : NULL;\r
+       }\r
+\r
+       PIXELFORMATDESCRIPTOR* GetEnhMetaFilePixelFormat()\r
+       {\r
+               ATLASSERT(m_hEMF != NULL);\r
+               memset(&m_pfd, 0, sizeof(m_pfd));\r
+               UINT n = ::GetEnhMetaFilePixelFormat(m_hEMF, sizeof(m_pfd), &m_pfd);\r
+               return (n != 0) ? &m_pfd : NULL;\r
+       }\r
+};\r
+\r
+\r
+template <bool t_bManaged>\r
+class CEnhMetaFileT\r
+{\r
+public:\r
+// Data members\r
+       HENHMETAFILE m_hEMF;\r
+\r
+// Constructor/destructor\r
+       CEnhMetaFileT(HENHMETAFILE hEMF = NULL) : m_hEMF(hEMF)\r
+       {\r
+       }\r
+\r
+       ~CEnhMetaFileT()\r
+       {\r
+               if(t_bManaged && m_hEMF != NULL)\r
+                       DeleteObject();\r
+       }\r
+\r
+// Operations\r
+       CEnhMetaFileT<t_bManaged>& operator =(HENHMETAFILE hEMF)\r
+       {\r
+               Attach(hEMF);\r
+               return *this;\r
+       }\r
+\r
+       void Attach(HENHMETAFILE hEMF)\r
+       {\r
+               if(t_bManaged && m_hEMF != NULL && m_hEMF != hEMF)\r
+                       DeleteObject();\r
+               m_hEMF = hEMF;\r
+       }\r
+\r
+       HENHMETAFILE Detach()\r
+       {\r
+               HENHMETAFILE hEMF = m_hEMF;\r
+               m_hEMF = NULL;\r
+               return hEMF;\r
+       }\r
+\r
+       operator HENHMETAFILE() const { return m_hEMF; }\r
+\r
+       bool IsNull() const { return (m_hEMF == NULL); }\r
+\r
+       BOOL DeleteObject()\r
+       {\r
+               ATLASSERT(m_hEMF != NULL);\r
+               BOOL bRet = ::DeleteEnhMetaFile(m_hEMF);\r
+               m_hEMF = NULL;\r
+               return bRet;\r
+       }\r
+\r
+       UINT GetEnhMetaFileBits(UINT cbBuffer, LPBYTE lpbBuffer) const\r
+       {\r
+               ATLASSERT(m_hEMF != NULL);\r
+               return ::GetEnhMetaFileBits(m_hEMF, cbBuffer, lpbBuffer);\r
+       }\r
+\r
+       UINT GetEnhMetaFileDescription(UINT cchBuffer, LPTSTR lpszDescription) const\r
+       {\r
+               ATLASSERT(m_hEMF != NULL);\r
+               return ::GetEnhMetaFileDescription(m_hEMF, cchBuffer, lpszDescription);\r
+       }\r
+\r
+       UINT GetEnhMetaFileHeader(LPENHMETAHEADER lpemh) const\r
+       {\r
+               ATLASSERT(m_hEMF != NULL);\r
+               lpemh->iType = EMR_HEADER;\r
+               lpemh->nSize = sizeof(ENHMETAHEADER);\r
+               return ::GetEnhMetaFileHeader(m_hEMF, sizeof(ENHMETAHEADER), lpemh);\r
+       }\r
+\r
+       UINT GetEnhMetaFilePaletteEntries(UINT cEntries, LPPALETTEENTRY lppe) const\r
+       {\r
+               ATLASSERT(m_hEMF != NULL);\r
+               return ::GetEnhMetaFilePaletteEntries(m_hEMF, cEntries, lppe);\r
+       }\r
+\r
+       UINT GetEnhMetaFilePixelFormat(DWORD cbBuffer, PIXELFORMATDESCRIPTOR* ppfd) const\r
+       {\r
+               ATLASSERT(m_hEMF != NULL);\r
+               return ::GetEnhMetaFilePixelFormat(m_hEMF, cbBuffer, ppfd);\r
+       }\r
+};\r
+\r
+typedef CEnhMetaFileT<false>   CEnhMetaFileHandle;\r
+typedef CEnhMetaFileT<true>    CEnhMetaFile;\r
+\r
+\r
+class CEnhMetaFileDC : public CDC\r
+{\r
+public:\r
+// Constructor/destructor\r
+       CEnhMetaFileDC()\r
+       {\r
+       }\r
+\r
+       CEnhMetaFileDC(HDC hdc, LPCRECT lpRect)\r
+       {\r
+               Create(hdc, NULL, lpRect, NULL);\r
+               ATLASSERT(m_hDC != NULL);\r
+       }\r
+\r
+       CEnhMetaFileDC(HDC hdcRef, LPCTSTR lpFilename, LPCRECT lpRect, LPCTSTR lpDescription)\r
+       {\r
+               Create(hdcRef, lpFilename, lpRect, lpDescription);\r
+               ATLASSERT(m_hDC != NULL);\r
+       }\r
+\r
+       ~CEnhMetaFileDC()\r
+       {\r
+               HENHMETAFILE hEMF = Close();\r
+               if (hEMF != NULL)\r
+                       ::DeleteEnhMetaFile(hEMF);\r
+       }\r
+\r
+// Operations\r
+       void Create(HDC hdcRef, LPCTSTR lpFilename, LPCRECT lpRect, LPCTSTR lpDescription)\r
+       {\r
+               ATLASSERT(m_hDC == NULL);\r
+               m_hDC = ::CreateEnhMetaFile(hdcRef, lpFilename, lpRect, lpDescription);\r
+       }\r
+\r
+       HENHMETAFILE Close()\r
+       {\r
+               HENHMETAFILE hEMF = NULL;\r
+               if (m_hDC != NULL)\r
+               {\r
+                       hEMF = ::CloseEnhMetaFile(m_hDC);\r
+                       m_hDC = NULL;\r
+               }\r
+               return hEMF;\r
+       }\r
+};\r
+\r
+#endif // !_WIN32_WCE\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// WinCE compatible clipboard CF_DIB format support functions\r
+\r
+#ifndef _WTL_NO_DIB16\r
+\r
+#define DIBINFO16_BITFIELDS { 31744, 992, 31 }\r
+\r
+// DIBINFO16 - To avoid color table problems in WinCE we only create this type of Dib\r
+struct DIBINFO16 // a BITMAPINFO with 2 additional color bitfields\r
+{\r
+    BITMAPINFOHEADER    bmiHeader;\r
+    RGBQUAD             bmiColors[3];\r
+\r
+       DIBINFO16(SIZE size) \r
+       {\r
+               BITMAPINFOHEADER bmih = { sizeof(BITMAPINFOHEADER), size.cx, size.cy, \r
+                                         1, 16, BI_BITFIELDS, 2 * size.cx * size.cy , 0, 0, 3 };\r
+               DWORD dw[3] = DIBINFO16_BITFIELDS ;\r
+\r
+               bmiHeader = bmih;\r
+               memcpy(bmiColors, dw, 3 * sizeof(DWORD));\r
+       }\r
+};\r
+\r
+\r
+// AtlxxxDibxxx minimal packed DIB implementation and helpers to copy and paste CF_DIB\r
\r
+inline bool AtlIsDib16(LPBITMAPINFOHEADER pbmih)\r
+{\r
+       return (pbmih->biBitCount == 16) && (pbmih->biCompression == BI_BITFIELDS);\r
+}\r
+\r
+inline int AtlGetDibColorTableSize(LPBITMAPINFOHEADER pbmih)\r
+{\r
+       switch (pbmih->biBitCount) \r
+       {\r
+               case  2:\r
+               case  4:\r
+               case  8:\r
+                       return pbmih->biClrUsed ? pbmih->biClrUsed : 1 << pbmih->biBitCount;\r
+               case 24:\r
+                       break;\r
+               case 16:\r
+               case 32:\r
+                       return pbmih->biCompression == BI_BITFIELDS ? 3 : 0;\r
+               default:\r
+                       ATLASSERT(FALSE);   // should never come here\r
+       }\r
+\r
+       return 0;\r
+}\r
+\r
+inline int AtlGetDibNumColors(LPBITMAPINFOHEADER pbmih)\r
+{\r
+       switch (pbmih->biBitCount) \r
+       {\r
+               case  2:\r
+               case  4:\r
+               case  8: \r
+                       if (pbmih->biClrUsed)\r
+                               return pbmih->biClrUsed;\r
+                       else\r
+                               break;\r
+               case 16: \r
+                       if (pbmih->biCompression == BI_BITFIELDS )\r
+                               return 1 << 15;\r
+                       else\r
+                               break;\r
+               case 24:\r
+                       break;\r
+               case 32: \r
+                       if (pbmih->biCompression == BI_BITFIELDS )\r
+                               return 1 << 24;\r
+                       else\r
+                               break;\r
+               default:\r
+                       ATLASSERT(FALSE);\r
+       }\r
+\r
+       return 1 << pbmih->biBitCount;\r
+}\r
+\r
+inline HBITMAP AtlGetDibBitmap(LPBITMAPINFO pbmi)\r
+{\r
+       HBITMAP hbm = NULL;\r
+       CDC dc(NULL);\r
+       void * pBits = NULL;\r
+\r
+       LPBYTE pDibBits = (LPBYTE)pbmi + sizeof(BITMAPINFOHEADER) + AtlGetDibColorTableSize(&pbmi->bmiHeader) * sizeof(RGBQUAD);\r
+       if (hbm = CreateDIBSection(dc, pbmi, DIB_RGB_COLORS, &pBits, NULL, NULL)) \r
+               memcpy(pBits, pDibBits, pbmi->bmiHeader.biSizeImage);\r
+\r
+       return hbm;\r
+}\r
+       \r
+inline HBITMAP AtlCopyBitmap(HBITMAP hbm , SIZE sizeDst, bool bAsBitmap = false)\r
+{\r
+       CDC hdcSrc = CreateCompatibleDC(NULL);\r
+       CDC hdcDst = CreateCompatibleDC(NULL);\r
+\r
+       CBitmapHandle hbmOld = NULL, hbmOld2 = NULL, bmSrc = hbm;\r
+\r
+       CBitmap bmNew = NULL;\r
+\r
+       SIZE sizeSrc = { 0 };\r
+       bmSrc.GetSize(sizeSrc);\r
+\r
+       hbmOld = hdcSrc.SelectBitmap(bmSrc);\r
+\r
+       if (bAsBitmap)\r
+       {\r
+               bmNew.CreateCompatibleBitmap(hdcSrc, sizeDst.cx, sizeDst.cy);\r
+       }\r
+       else\r
+       {\r
+               DIBINFO16 dib16(sizeDst);\r
+               LPVOID pBits = NULL;\r
+               bmNew = CreateDIBSection(hdcDst, (const BITMAPINFO*)&dib16, DIB_RGB_COLORS, &pBits, NULL, NULL);\r
+       }\r
+       \r
+       ATLASSERT(!bmNew.IsNull());\r
+\r
+       hbmOld2 = hdcDst.SelectBitmap(bmNew);\r
+       BOOL bOK = FALSE;\r
+\r
+       if ((sizeDst.cx == sizeSrc.cx) && (sizeDst.cy == sizeSrc.cy))\r
+               bOK = hdcDst.BitBlt(0, 0, sizeDst.cx, sizeDst.cy, hdcSrc, 0, 0, SRCCOPY);\r
+       else\r
+               bOK = hdcDst.StretchBlt(0, 0, sizeDst.cx, sizeDst.cy, hdcSrc, 0, 0, sizeSrc.cx, sizeSrc.cy, SRCCOPY);\r
+\r
+       hdcSrc.SelectBitmap(hbmOld);\r
+       hdcDst.SelectBitmap(hbmOld2);\r
+\r
+       if (bOK == FALSE)\r
+               bmNew.DeleteObject();\r
+\r
+       return bmNew.Detach();\r
+}\r
+\r
+inline HLOCAL AtlCreatePackedDib16(HBITMAP hbm, SIZE size)\r
+{\r
+       DIBSECTION ds = { 0 };\r
+       LPBYTE pDib = NULL;\r
+       bool bCopied = false;\r
+\r
+       bool bOK = GetObject(hbm, sizeof(ds), &ds) == sizeof(ds);\r
+       if ((bOK == FALSE) || (ds.dsBm.bmBits == NULL) || (AtlIsDib16(&ds.dsBmih) == FALSE) || \r
+           (ds.dsBmih.biWidth != size.cx ) || (ds.dsBmih.biHeight != size.cy ))\r
+       {\r
+               if ((hbm = AtlCopyBitmap(hbm, size)) != NULL)\r
+               {\r
+                       bCopied = true;\r
+                       bOK = GetObject(hbm, sizeof(ds), &ds) == sizeof(ds);\r
+               }\r
+               else\r
+               {\r
+                       bOK = FALSE;\r
+               }\r
+       }\r
+\r
+       if((bOK == TRUE) && (AtlIsDib16(&ds.dsBmih) == TRUE) && (ds.dsBm.bmBits != NULL))\r
+       {\r
+               pDib = (LPBYTE)LocalAlloc(LMEM_ZEROINIT, sizeof(DIBINFO16) + ds.dsBmih.biSizeImage);\r
+               if (pDib != NULL)\r
+               {\r
+                       memcpy(pDib , &ds.dsBmih, sizeof(DIBINFO16));\r
+                       memcpy(pDib + sizeof(DIBINFO16), ds.dsBm.bmBits, ds.dsBmih.biSizeImage);\r
+               }\r
+       }\r
+\r
+       if (bCopied == true)\r
+               DeleteObject(hbm);\r
+\r
+       return (HLOCAL)pDib;\r
+}\r
+\r
+inline bool AtlSetClipboardDib16(HBITMAP hbm, SIZE size, HWND hWnd)\r
+{\r
+       ATLASSERT(::IsWindow(hWnd));\r
+       BOOL bOK = OpenClipboard(hWnd);\r
+       if (bOK == TRUE)\r
+       {\r
+               if ((bOK = EmptyClipboard()) == TRUE)\r
+               {\r
+                       HLOCAL hDib = AtlCreatePackedDib16(hbm, size);\r
+                       if (hDib != NULL)\r
+                       {\r
+                               bOK = SetClipboardData(CF_DIB, hDib) != NULL;\r
+                               if (bOK == FALSE)  \r
+                                       LocalFree(hDib);\r
+                       }\r
+                       else\r
+                       {\r
+                               bOK = FALSE;\r
+                       }\r
+               }\r
+               CloseClipboard();\r
+       }\r
+\r
+       return bOK == TRUE;\r
+}\r
+\r
+inline HBITMAP AtlGetClipboardDib(HWND hWnd)\r
+{\r
+       ATLASSERT(::IsWindow(hWnd) == TRUE);\r
+       HBITMAP hbm = NULL;\r
+       if  (OpenClipboard(hWnd) == TRUE)\r
+       {\r
+               LPBITMAPINFO pbmi = (LPBITMAPINFO)GetClipboardData(CF_DIB);\r
+               if (pbmi != NULL)\r
+                       hbm = AtlGetDibBitmap(pbmi);\r
+               CloseClipboard();\r
+       }\r
+\r
+       return hbm;\r
+}\r
+\r
+#endif // _WTL_NO_DIB16\r
+\r
+}; // namespace WTL\r
+\r
+#endif // __ATLGDI_H__\r
diff --git a/WTL80/include/atlmisc.h b/WTL80/include/atlmisc.h
new file mode 100644 (file)
index 0000000..70c8745
--- /dev/null
@@ -0,0 +1,4021 @@
+// Windows Template Library - WTL version 8.0\r
+// Copyright (C) Microsoft Corporation. All rights reserved.\r
+//\r
+// This file is a part of the Windows Template Library.\r
+// The use and distribution terms for this software are covered by the\r
+// Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php)\r
+// which can be found in the file CPL.TXT at the root of this distribution.\r
+// By using this software in any fashion, you are agreeing to be bound by\r
+// the terms of this license. You must not remove this notice, or\r
+// any other, from this software.\r
+\r
+#ifndef __ATLMISC_H__\r
+#define __ATLMISC_H__\r
+\r
+#pragma once\r
+\r
+#ifndef __cplusplus\r
+       #error ATL requires C++ compilation (use a .cpp suffix)\r
+#endif\r
+\r
+#ifndef __ATLAPP_H__\r
+       #error atlmisc.h requires atlapp.h to be included first\r
+#endif\r
+\r
+\r
+#ifdef _ATL_TMP_NO_CSTRING\r
+  #define _WTL_NO_CSTRING\r
+#endif\r
+\r
+#if defined(_WTL_USE_CSTRING) && defined(_WTL_NO_CSTRING)\r
+       #error Conflicting options - both _WTL_USE_CSTRING and _WTL_NO_CSTRING are defined\r
+#endif // defined(_WTL_USE_CSTRING) && defined(_WTL_NO_CSTRING)\r
+\r
+#if !defined(_WTL_USE_CSTRING) && !defined(_WTL_NO_CSTRING)\r
+  #define _WTL_USE_CSTRING\r
+#endif // !defined(_WTL_USE_CSTRING) && !defined(_WTL_NO_CSTRING)\r
+\r
+#ifndef _WTL_NO_CSTRING\r
+  #if defined(_ATL_USE_CSTRING_FLOAT) && defined(_ATL_MIN_CRT)\r
+       #error Cannot use CString floating point formatting with _ATL_MIN_CRT defined\r
+  #endif // defined(_ATL_USE_CSTRING_FLOAT) && defined(_ATL_MIN_CRT)\r
+#endif // !_WTL_NO_CSTRING\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Classes in this file:\r
+//\r
+// CSize\r
+// CPoint\r
+// CRect\r
+// CString\r
+//\r
+// CRecentDocumentListBase<T, t_cchItemLen, t_nFirstID, t_nLastID>\r
+// CRecentDocumentList\r
+// CFindFile\r
+//\r
+// Global functions:\r
+//   AtlLoadAccelerators()\r
+//   AtlLoadMenu()\r
+//   AtlLoadBitmap()\r
+//   AtlLoadSysBitmap()\r
+//   AtlLoadCursor()\r
+//   AtlLoadSysCursor()\r
+//   AtlLoadIcon()\r
+//   AtlLoadSysIcon()\r
+//   AtlLoadBitmapImage()\r
+//   AtlLoadCursorImage()\r
+//   AtlLoadIconImage()\r
+//   AtlLoadSysBitmapImage()\r
+//   AtlLoadSysCursorImage()\r
+//   AtlLoadSysIconImage()\r
+//   AtlLoadString()\r
+//\r
+//   AtlGetStockPen()\r
+//   AtlGetStockBrush()\r
+//   AtlGetStockFont()\r
+//   AtlGetStockPalette()\r
+//\r
+//   AtlCompactPath()\r
+\r
+\r
+namespace WTL\r
+{\r
+\r
+#ifndef _WTL_NO_WTYPES\r
+\r
+// forward declarations\r
+class CSize;\r
+class CPoint;\r
+class CRect;\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CSize - Wrapper for Windows SIZE structure.\r
+\r
+class CSize : public SIZE\r
+{\r
+public:\r
+// Constructors\r
+       CSize()\r
+       {\r
+               cx = 0;\r
+               cy = 0;\r
+       }\r
+\r
+       CSize(int initCX, int initCY)\r
+       {\r
+               cx = initCX;\r
+               cy = initCY;\r
+       }\r
+\r
+       CSize(SIZE initSize)\r
+       {\r
+               *(SIZE*)this = initSize;\r
+       }\r
+\r
+       CSize(POINT initPt)\r
+       {\r
+               *(POINT*)this = initPt;\r
+       }\r
+\r
+       CSize(DWORD dwSize)\r
+       {\r
+               cx = (short)LOWORD(dwSize);\r
+               cy = (short)HIWORD(dwSize);\r
+       }\r
+\r
+// Operations\r
+       BOOL operator ==(SIZE size) const\r
+       {\r
+               return (cx == size.cx && cy == size.cy);\r
+       }\r
+\r
+       BOOL operator !=(SIZE size) const\r
+       {\r
+               return (cx != size.cx || cy != size.cy);\r
+       }\r
+\r
+       void operator +=(SIZE size)\r
+       {\r
+               cx += size.cx;\r
+               cy += size.cy;\r
+       }\r
+\r
+       void operator -=(SIZE size)\r
+       {\r
+               cx -= size.cx;\r
+               cy -= size.cy;\r
+       }\r
+\r
+       void SetSize(int CX, int CY)\r
+       {\r
+               cx = CX;\r
+               cy = CY;\r
+       }\r
+\r
+// Operators returning CSize values\r
+       CSize operator +(SIZE size) const\r
+       {\r
+               return CSize(cx + size.cx, cy + size.cy);\r
+       }\r
+\r
+       CSize operator -(SIZE size) const\r
+       {\r
+               return CSize(cx - size.cx, cy - size.cy);\r
+       }\r
+\r
+       CSize operator -() const\r
+       {\r
+               return CSize(-cx, -cy);\r
+       }\r
+\r
+// Operators returning CPoint values\r
+       CPoint operator +(POINT point) const;\r
+       CPoint operator -(POINT point) const;\r
+\r
+// Operators returning CRect values\r
+       CRect operator +(const RECT* lpRect) const;\r
+       CRect operator -(const RECT* lpRect) const;\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CPoint - Wrapper for Windows POINT structure.\r
+\r
+class CPoint : public POINT\r
+{\r
+public:\r
+// Constructors\r
+       CPoint()\r
+       {\r
+               x = 0;\r
+               y = 0;\r
+       }\r
+\r
+       CPoint(int initX, int initY)\r
+       {\r
+               x = initX;\r
+               y = initY;\r
+       }\r
+\r
+       CPoint(POINT initPt)\r
+       {\r
+               *(POINT*)this = initPt;\r
+       }\r
+\r
+       CPoint(SIZE initSize)\r
+       {\r
+               *(SIZE*)this = initSize;\r
+       }\r
+\r
+       CPoint(DWORD dwPoint)\r
+       {\r
+               x = (short)LOWORD(dwPoint);\r
+               y = (short)HIWORD(dwPoint);\r
+       }\r
+\r
+// Operations\r
+       void Offset(int xOffset, int yOffset)\r
+       {\r
+               x += xOffset;\r
+               y += yOffset;\r
+       }\r
+\r
+       void Offset(POINT point)\r
+       {\r
+               x += point.x;\r
+               y += point.y;\r
+       }\r
+\r
+       void Offset(SIZE size)\r
+       {\r
+               x += size.cx;\r
+               y += size.cy;\r
+       }\r
+\r
+       BOOL operator ==(POINT point) const\r
+       {\r
+               return (x == point.x && y == point.y);\r
+       }\r
+\r
+       BOOL operator !=(POINT point) const\r
+       {\r
+               return (x != point.x || y != point.y);\r
+       }\r
+\r
+       void operator +=(SIZE size)\r
+       {\r
+               x += size.cx;\r
+               y += size.cy;\r
+       }\r
+\r
+       void operator -=(SIZE size)\r
+       {\r
+               x -= size.cx;\r
+               y -= size.cy;\r
+       }\r
+\r
+       void operator +=(POINT point)\r
+       {\r
+               x += point.x;\r
+               y += point.y;\r
+       }\r
+\r
+       void operator -=(POINT point)\r
+       {\r
+               x -= point.x;\r
+               y -= point.y;\r
+       }\r
+\r
+       void SetPoint(int X, int Y)\r
+       {\r
+               x = X;\r
+               y = Y;\r
+       }\r
+\r
+// Operators returning CPoint values\r
+       CPoint operator +(SIZE size) const\r
+       {\r
+               return CPoint(x + size.cx, y + size.cy);\r
+       }\r
+\r
+       CPoint operator -(SIZE size) const\r
+       {\r
+               return CPoint(x - size.cx, y - size.cy);\r
+       }\r
+\r
+       CPoint operator -() const\r
+       {\r
+               return CPoint(-x, -y);\r
+       }\r
+\r
+       CPoint operator +(POINT point) const\r
+       {\r
+               return CPoint(x + point.x, y + point.y);\r
+       }\r
+\r
+// Operators returning CSize values\r
+       CSize operator -(POINT point) const\r
+       {\r
+               return CSize(x - point.x, y - point.y);\r
+       }\r
+\r
+// Operators returning CRect values\r
+       CRect operator +(const RECT* lpRect) const;\r
+       CRect operator -(const RECT* lpRect) const;\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CRect - Wrapper for Windows RECT structure.\r
+\r
+class CRect : public RECT\r
+{\r
+public:\r
+// Constructors\r
+       CRect()\r
+       {\r
+               left = 0;\r
+               top = 0;\r
+               right = 0;\r
+               bottom = 0;\r
+       }\r
+\r
+       CRect(int l, int t, int r, int b)\r
+       {\r
+               left = l;\r
+               top = t;\r
+               right = r;\r
+               bottom = b;\r
+       }\r
+\r
+       CRect(const RECT& srcRect)\r
+       {\r
+               ::CopyRect(this, &srcRect);\r
+       }\r
+\r
+       CRect(LPCRECT lpSrcRect)\r
+       {\r
+               ::CopyRect(this, lpSrcRect);\r
+       }\r
+\r
+       CRect(POINT point, SIZE size)\r
+       {\r
+               right = (left = point.x) + size.cx;\r
+               bottom = (top = point.y) + size.cy;\r
+       }\r
+\r
+       CRect(POINT topLeft, POINT bottomRight)\r
+       {\r
+               left = topLeft.x;\r
+               top = topLeft.y;\r
+               right = bottomRight.x;\r
+               bottom = bottomRight.y;\r
+       }\r
+\r
+// Attributes (in addition to RECT members)\r
+       int Width() const\r
+       {\r
+               return right - left;\r
+       }\r
+\r
+       int Height() const\r
+       {\r
+               return bottom - top;\r
+       }\r
+\r
+       CSize Size() const\r
+       {\r
+               return CSize(right - left, bottom - top);\r
+       }\r
+\r
+       CPoint& TopLeft()\r
+       {\r
+               return *((CPoint*)this);\r
+       }\r
+\r
+       CPoint& BottomRight()\r
+       {\r
+               return *((CPoint*)this + 1);\r
+       }\r
+\r
+       const CPoint& TopLeft() const\r
+       {\r
+               return *((CPoint*)this);\r
+       }\r
+\r
+       const CPoint& BottomRight() const\r
+       {\r
+               return *((CPoint*)this + 1);\r
+       }\r
+\r
+       CPoint CenterPoint() const\r
+       {\r
+               return CPoint((left + right) / 2, (top + bottom) / 2);\r
+       }\r
+\r
+       // convert between CRect and LPRECT/LPCRECT (no need for &)\r
+       operator LPRECT()\r
+       {\r
+               return this;\r
+       }\r
+\r
+       operator LPCRECT() const\r
+       {\r
+               return this;\r
+       }\r
+\r
+       BOOL IsRectEmpty() const\r
+       {\r
+               return ::IsRectEmpty(this);\r
+       }\r
+\r
+       BOOL IsRectNull() const\r
+       {\r
+               return (left == 0 && right == 0 && top == 0 && bottom == 0);\r
+       }\r
+\r
+       BOOL PtInRect(POINT point) const\r
+       {\r
+               return ::PtInRect(this, point);\r
+       }\r
+\r
+// Operations\r
+       void SetRect(int x1, int y1, int x2, int y2)\r
+       {\r
+               ::SetRect(this, x1, y1, x2, y2);\r
+       }\r
+\r
+       void SetRect(POINT topLeft, POINT bottomRight)\r
+       {\r
+               ::SetRect(this, topLeft.x, topLeft.y, bottomRight.x, bottomRight.y);\r
+       }\r
+\r
+       void SetRectEmpty()\r
+       {\r
+               ::SetRectEmpty(this);\r
+       }\r
+\r
+       void CopyRect(LPCRECT lpSrcRect)\r
+       {\r
+               ::CopyRect(this, lpSrcRect);\r
+       }\r
+\r
+       BOOL EqualRect(LPCRECT lpRect) const\r
+       {\r
+               return ::EqualRect(this, lpRect);\r
+       }\r
+\r
+       void InflateRect(int x, int y)\r
+       {\r
+               ::InflateRect(this, x, y);\r
+       }\r
+\r
+       void InflateRect(SIZE size)\r
+       {\r
+               ::InflateRect(this, size.cx, size.cy);\r
+       }\r
+\r
+       void InflateRect(LPCRECT lpRect)\r
+       {\r
+               left -= lpRect->left;\r
+               top -= lpRect->top;\r
+               right += lpRect->right;\r
+               bottom += lpRect->bottom;\r
+       }\r
+\r
+       void InflateRect(int l, int t, int r, int b)\r
+       {\r
+               left -= l;\r
+               top -= t;\r
+               right += r;\r
+               bottom += b;\r
+       }\r
+\r
+       void DeflateRect(int x, int y)\r
+       {\r
+               ::InflateRect(this, -x, -y);\r
+       }\r
+\r
+       void DeflateRect(SIZE size)\r
+       {\r
+               ::InflateRect(this, -size.cx, -size.cy);\r
+       }\r
+\r
+       void DeflateRect(LPCRECT lpRect)\r
+       {\r
+               left += lpRect->left;\r
+               top += lpRect->top;\r
+               right -= lpRect->right;\r
+               bottom -= lpRect->bottom;\r
+       }\r
+\r
+       void DeflateRect(int l, int t, int r, int b)\r
+       {\r
+               left += l;\r
+               top += t;\r
+               right -= r;\r
+               bottom -= b;\r
+       }\r
+\r
+       void OffsetRect(int x, int y)\r
+       {\r
+               ::OffsetRect(this, x, y);\r
+       }\r
+       void OffsetRect(SIZE size)\r
+       {\r
+               ::OffsetRect(this, size.cx, size.cy);\r
+       }\r
+\r
+       void OffsetRect(POINT point)\r
+       {\r
+               ::OffsetRect(this, point.x, point.y);\r
+       }\r
+\r
+       void NormalizeRect()\r
+       {\r
+               int nTemp;\r
+               if (left > right)\r
+               {\r
+                       nTemp = left;\r
+                       left = right;\r
+                       right = nTemp;\r
+               }\r
+               if (top > bottom)\r
+               {\r
+                       nTemp = top;\r
+                       top = bottom;\r
+                       bottom = nTemp;\r
+               }\r
+       }\r
+\r
+       // absolute position of rectangle\r
+       void MoveToY(int y)\r
+       {\r
+               bottom = Height() + y;\r
+               top = y;\r
+       }\r
+\r
+       void MoveToX(int x)\r
+       {\r
+               right = Width() + x;\r
+               left = x;\r
+       }\r
+\r
+       void MoveToXY(int x, int y)\r
+       {\r
+               MoveToX(x);\r
+               MoveToY(y);\r
+       }\r
+\r
+       void MoveToXY(POINT pt)\r
+       {\r
+               MoveToX(pt.x);\r
+               MoveToY(pt.y);\r
+       }\r
+\r
+       // operations that fill '*this' with result\r
+       BOOL IntersectRect(LPCRECT lpRect1, LPCRECT lpRect2)\r
+       {\r
+               return ::IntersectRect(this, lpRect1, lpRect2);\r
+       }\r
+\r
+       BOOL UnionRect(LPCRECT lpRect1, LPCRECT lpRect2)\r
+       {\r
+               return ::UnionRect(this, lpRect1, lpRect2);\r
+       }\r
+\r
+       BOOL SubtractRect(LPCRECT lpRectSrc1, LPCRECT lpRectSrc2)\r
+       {\r
+               return ::SubtractRect(this, lpRectSrc1, lpRectSrc2);\r
+       }\r
+\r
+// Additional Operations\r
+       void operator =(const RECT& srcRect)\r
+       {\r
+               ::CopyRect(this, &srcRect);\r
+       }\r
+\r
+       BOOL operator ==(const RECT& rect) const\r
+       {\r
+               return ::EqualRect(this, &rect);\r
+       }\r
+\r
+       BOOL operator !=(const RECT& rect) const\r
+       {\r
+               return !::EqualRect(this, &rect);\r
+       }\r
+\r
+       void operator +=(POINT point)\r
+       {\r
+               ::OffsetRect(this, point.x, point.y);\r
+       }\r
+\r
+       void operator +=(SIZE size)\r
+       {\r
+               ::OffsetRect(this, size.cx, size.cy);\r
+       }\r
+\r
+       void operator +=(LPCRECT lpRect)\r
+       {\r
+               InflateRect(lpRect);\r
+       }\r
+\r
+       void operator -=(POINT point)\r
+       {\r
+               ::OffsetRect(this, -point.x, -point.y);\r
+       }\r
+\r
+       void operator -=(SIZE size)\r
+       {\r
+               ::OffsetRect(this, -size.cx, -size.cy);\r
+       }\r
+\r
+       void operator -=(LPCRECT lpRect)\r
+       {\r
+               DeflateRect(lpRect);\r
+       }\r
+\r
+       void operator &=(const RECT& rect)\r
+       {\r
+               ::IntersectRect(this, this, &rect);\r
+       }\r
+\r
+       void operator |=(const RECT& rect)\r
+       {\r
+               ::UnionRect(this, this, &rect);\r
+       }\r
+\r
+// Operators returning CRect values\r
+       CRect operator +(POINT pt) const\r
+       {\r
+               CRect rect(*this);\r
+               ::OffsetRect(&rect, pt.x, pt.y);\r
+               return rect;\r
+       }\r
+\r
+       CRect operator -(POINT pt) const\r
+       {\r
+               CRect rect(*this);\r
+               ::OffsetRect(&rect, -pt.x, -pt.y);\r
+               return rect;\r
+       }\r
+\r
+       CRect operator +(LPCRECT lpRect) const\r
+       {\r
+               CRect rect(this);\r
+               rect.InflateRect(lpRect);\r
+               return rect;\r
+       }\r
+\r
+       CRect operator +(SIZE size) const\r
+       {\r
+               CRect rect(*this);\r
+               ::OffsetRect(&rect, size.cx, size.cy);\r
+               return rect;\r
+       }\r
+\r
+       CRect operator -(SIZE size) const\r
+       {\r
+               CRect rect(*this);\r
+               ::OffsetRect(&rect, -size.cx, -size.cy);\r
+               return rect;\r
+       }\r
+\r
+       CRect operator -(LPCRECT lpRect) const\r
+       {\r
+               CRect rect(this);\r
+               rect.DeflateRect(lpRect);\r
+               return rect;\r
+       }\r
+\r
+       CRect operator &(const RECT& rect2) const\r
+       {\r
+               CRect rect;\r
+               ::IntersectRect(&rect, this, &rect2);\r
+               return rect;\r
+       }\r
+\r
+       CRect operator |(const RECT& rect2) const\r
+       {\r
+               CRect rect;\r
+               ::UnionRect(&rect, this, &rect2);\r
+               return rect;\r
+       }\r
+\r
+       CRect MulDiv(int nMultiplier, int nDivisor) const\r
+       {\r
+               return CRect(\r
+                       ::MulDiv(left, nMultiplier, nDivisor),\r
+                       ::MulDiv(top, nMultiplier, nDivisor),\r
+                       ::MulDiv(right, nMultiplier, nDivisor),\r
+                       ::MulDiv(bottom, nMultiplier, nDivisor));\r
+       }\r
+};\r
+\r
+\r
+// CSize implementation\r
+\r
+inline CPoint CSize::operator +(POINT point) const\r
+{ return CPoint(cx + point.x, cy + point.y); }\r
+\r
+inline CPoint CSize::operator -(POINT point) const\r
+{ return CPoint(cx - point.x, cy - point.y); }\r
+\r
+inline CRect CSize::operator +(const RECT* lpRect) const\r
+{ return CRect(lpRect) + *this; }\r
+\r
+inline CRect CSize::operator -(const RECT* lpRect) const\r
+{ return CRect(lpRect) - *this; }\r
+\r
+\r
+// CPoint implementation\r
+\r
+inline CRect CPoint::operator +(const RECT* lpRect) const\r
+{ return CRect(lpRect) + *this; }\r
+\r
+inline CRect CPoint::operator -(const RECT* lpRect) const\r
+{ return CRect(lpRect) - *this; }\r
+\r
+#endif // !_WTL_NO_WTYPES\r
+\r
+\r
+// WTL::CSize or ATL::CSize scalar operators \r
+\r
+#if !defined(_WTL_NO_SIZE_SCALAR) && (!defined(_WTL_NO_WTYPES) || defined(__ATLTYPES_H__))\r
+\r
+template <class Num>\r
+inline CSize operator *(SIZE s, Num n) \r
+{\r
+       return CSize((int)(s.cx * n), (int)(s.cy * n));\r
+};\r
+\r
+template <class Num>\r
+inline void operator *=(SIZE & s, Num n)\r
+{\r
+       s = s * n;\r
+};     \r
+\r
+template <class Num>\r
+inline CSize operator /(SIZE s, Num n) \r
+{\r
+       return CSize((int)(s.cx / n), (int)(s.cy / n));\r
+};\r
+\r
+template <class Num>\r
+inline void operator /=(SIZE & s, Num n)\r
+{\r
+       s = s / n;\r
+};     \r
+\r
+#endif // !defined(_WTL_NO_SIZE_SCALAR) && (!defined(_WTL_NO_WTYPES) || defined(__ATLTYPES_H__))\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CString - String class\r
+\r
+#ifndef _WTL_NO_CSTRING\r
+\r
+struct CStringData\r
+{\r
+       long nRefs;     // reference count\r
+       int nDataLength;\r
+       int nAllocLength;\r
+       // TCHAR data[nAllocLength]\r
+\r
+       TCHAR* data()\r
+       { return (TCHAR*)(this + 1); }\r
+};\r
+\r
+// Globals\r
+\r
+// For an empty string, m_pchData will point here\r
+// (note: avoids special case of checking for NULL m_pchData)\r
+// empty string data (and locked)\r
+_declspec(selectany) int rgInitData[] = { -1, 0, 0, 0 };\r
+_declspec(selectany) CStringData* _atltmpDataNil = (CStringData*)&rgInitData;\r
+_declspec(selectany) LPCTSTR _atltmpPchNil = (LPCTSTR)(((BYTE*)&rgInitData) + sizeof(CStringData));\r
+\r
+\r
+class CString\r
+{\r
+public:\r
+// Constructors\r
+       CString()\r
+       {\r
+               Init();\r
+       }\r
+\r
+       CString(const CString& stringSrc)\r
+       {\r
+               ATLASSERT(stringSrc.GetData()->nRefs != 0);\r
+               if (stringSrc.GetData()->nRefs >= 0)\r
+               {\r
+                       ATLASSERT(stringSrc.GetData() != _atltmpDataNil);\r
+                       m_pchData = stringSrc.m_pchData;\r
+                       InterlockedIncrement(&GetData()->nRefs);\r
+               }\r
+               else\r
+               {\r
+                       Init();\r
+                       *this = stringSrc.m_pchData;\r
+               }\r
+       }\r
+\r
+       CString(TCHAR ch, int nRepeat = 1)\r
+       {\r
+               ATLASSERT(!_istlead(ch));   // can't create a lead byte string\r
+               Init();\r
+               if (nRepeat >= 1)\r
+               {\r
+                       if(AllocBuffer(nRepeat))\r
+                       {\r
+#ifdef _UNICODE\r
+                               for (int i = 0; i < nRepeat; i++)\r
+                                       m_pchData[i] = ch;\r
+#else\r
+                               memset(m_pchData, ch, nRepeat);\r
+#endif\r
+                       }\r
+               }\r
+       }\r
+\r
+       CString(LPCTSTR lpsz)\r
+       {\r
+               Init();\r
+               if (lpsz != NULL && HIWORD(lpsz) == NULL)\r
+               {\r
+                       UINT nID = LOWORD((DWORD_PTR)lpsz);\r
+                       if (!LoadString(nID))\r
+                               ATLTRACE2(atlTraceUI, 0, _T("Warning: implicit LoadString(%u) in CString failed\n"), nID);\r
+               }\r
+               else\r
+               {\r
+                       int nLen = SafeStrlen(lpsz);\r
+                       if (nLen != 0)\r
+                       {\r
+                               if(AllocBuffer(nLen))\r
+                                       SecureHelper::memcpy_x(m_pchData, (nLen + 1) * sizeof(TCHAR), lpsz, nLen * sizeof(TCHAR));\r
+                       }\r
+               }\r
+       }\r
+\r
+#ifdef _UNICODE\r
+       CString(LPCSTR lpsz)\r
+       {\r
+               Init();\r
+#if defined(_WIN32_WCE) && (_ATL_VER >= 0x0800)\r
+               int nSrcLen = (lpsz != NULL) ? ATL::lstrlenA(lpsz) : 0;\r
+#else\r
+               int nSrcLen = (lpsz != NULL) ? lstrlenA(lpsz) : 0;\r
+#endif\r
+               if (nSrcLen != 0)\r
+               {\r
+                       if(AllocBuffer(nSrcLen))\r
+                       {\r
+                               _mbstowcsz(m_pchData, lpsz, nSrcLen + 1);\r
+                               ReleaseBuffer();\r
+                       }\r
+               }\r
+       }\r
+#else // !_UNICODE\r
+       CString(LPCWSTR lpsz)\r
+       {\r
+               Init();\r
+               int nSrcLen = (lpsz != NULL) ? (int)wcslen(lpsz) : 0;\r
+               if (nSrcLen != 0)\r
+               {\r
+                       if(AllocBuffer(nSrcLen * 2))\r
+                       {\r
+                               _wcstombsz(m_pchData, lpsz, (nSrcLen * 2) + 1);\r
+                               ReleaseBuffer();\r
+                       }\r
+               }\r
+       }\r
+#endif // !_UNICODE\r
+\r
+       CString(LPCTSTR lpch, int nLength)\r
+       {\r
+               Init();\r
+               if (nLength != 0)\r
+               {\r
+                       if(AllocBuffer(nLength))\r
+                               SecureHelper::memcpy_x(m_pchData, (nLength + 1) * sizeof(TCHAR), lpch, nLength * sizeof(TCHAR));\r
+               }\r
+       }\r
+\r
+#ifdef _UNICODE\r
+       CString(LPCSTR lpsz, int nLength)\r
+       {\r
+               Init();\r
+               if (nLength != 0)\r
+               {\r
+                       if(AllocBuffer(nLength))\r
+                       {\r
+                               int n = ::MultiByteToWideChar(CP_ACP, 0, lpsz, nLength, m_pchData, nLength + 1);\r
+                               ReleaseBuffer((n >= 0) ? n : -1);\r
+                       }\r
+               }\r
+       }\r
+#else // !_UNICODE\r
+       CString(LPCWSTR lpsz, int nLength)\r
+       {\r
+               Init();\r
+               if (nLength != 0)\r
+               {\r
+                       if(((nLength * 2) > nLength) && AllocBuffer(nLength * 2))\r
+                       {\r
+                               int n = ::WideCharToMultiByte(CP_ACP, 0, lpsz, nLength, m_pchData, (nLength * 2) + 1, NULL, NULL);\r
+                               ReleaseBuffer((n >= 0) ? n : -1);\r
+                       }\r
+               }\r
+       }\r
+#endif // !_UNICODE\r
+\r
+       CString(const unsigned char* lpsz)\r
+       {\r
+               Init();\r
+               *this = (LPCSTR)lpsz;\r
+       }\r
+\r
+// Attributes & Operations\r
+       int GetLength() const   // as an array of characters\r
+       {\r
+               return GetData()->nDataLength;\r
+       }\r
+\r
+       BOOL IsEmpty() const\r
+       {\r
+               return GetData()->nDataLength == 0;\r
+       }\r
+\r
+       void Empty()   // free up the data\r
+       {\r
+               if (GetData()->nDataLength == 0)\r
+                       return;\r
+\r
+               if (GetData()->nRefs >= 0)\r
+                       Release();\r
+               else\r
+                       *this = _T("");\r
+\r
+               ATLASSERT(GetData()->nDataLength == 0);\r
+               ATLASSERT(GetData()->nRefs < 0 || GetData()->nAllocLength == 0);\r
+       }\r
+\r
+       TCHAR GetAt(int nIndex) const   // 0 based\r
+       {\r
+               ATLASSERT(nIndex >= 0);\r
+               ATLASSERT(nIndex < GetData()->nDataLength);\r
+               return m_pchData[nIndex];\r
+       }\r
+\r
+       TCHAR operator [](int nIndex) const   // same as GetAt\r
+       {\r
+               // same as GetAt\r
+               ATLASSERT(nIndex >= 0);\r
+               ATLASSERT(nIndex < GetData()->nDataLength);\r
+               return m_pchData[nIndex];\r
+       }\r
+\r
+       void SetAt(int nIndex, TCHAR ch)\r
+       {\r
+               ATLASSERT(nIndex >= 0);\r
+               ATLASSERT(nIndex < GetData()->nDataLength);\r
+\r
+               CopyBeforeWrite();\r
+               m_pchData[nIndex] = ch;\r
+       }\r
+\r
+       operator LPCTSTR() const   // as a C string\r
+       {\r
+               return m_pchData;\r
+       }\r
+\r
+       // overloaded assignment\r
+       CString& operator =(const CString& stringSrc)\r
+       {\r
+               if (m_pchData != stringSrc.m_pchData)\r
+               {\r
+                       if ((GetData()->nRefs < 0 && GetData() != _atltmpDataNil) || stringSrc.GetData()->nRefs < 0)\r
+                       {\r
+                               // actual copy necessary since one of the strings is locked\r
+                               AssignCopy(stringSrc.GetData()->nDataLength, stringSrc.m_pchData);\r
+                       }\r
+                       else\r
+                       {\r
+                               // can just copy references around\r
+                               Release();\r
+                               ATLASSERT(stringSrc.GetData() != _atltmpDataNil);\r
+                               m_pchData = stringSrc.m_pchData;\r
+                               InterlockedIncrement(&GetData()->nRefs);\r
+                       }\r
+               }\r
+               return *this;\r
+       }\r
+\r
+       CString& operator =(TCHAR ch)\r
+       {\r
+               ATLASSERT(!_istlead(ch));   // can't set single lead byte\r
+               AssignCopy(1, &ch);\r
+               return *this;\r
+       }\r
+\r
+#ifdef _UNICODE\r
+       CString& operator =(char ch)\r
+       {\r
+               *this = (TCHAR)ch;\r
+               return *this;\r
+       }\r
+#endif\r
+\r
+       CString& operator =(LPCTSTR lpsz)\r
+       {\r
+               ATLASSERT(lpsz == NULL || _IsValidString(lpsz));\r
+               AssignCopy(SafeStrlen(lpsz), lpsz);\r
+               return *this;\r
+       }\r
+\r
+#ifdef _UNICODE\r
+       CString& operator =(LPCSTR lpsz)\r
+       {\r
+#if defined(_WIN32_WCE) && (_ATL_VER >= 0x0800)\r
+               int nSrcLen = (lpsz != NULL) ? ATL::lstrlenA(lpsz) : 0;\r
+#else\r
+               int nSrcLen = (lpsz != NULL) ? lstrlenA(lpsz) : 0;\r
+#endif\r
+               if(AllocBeforeWrite(nSrcLen))\r
+               {\r
+                       _mbstowcsz(m_pchData, lpsz, nSrcLen + 1);\r
+                       ReleaseBuffer();\r
+               }\r
+               return *this;\r
+       }\r
+#else // !_UNICODE\r
+       CString& operator =(LPCWSTR lpsz)\r
+       {\r
+               int nSrcLen = (lpsz != NULL) ? (int)wcslen(lpsz) : 0;\r
+               if(AllocBeforeWrite(nSrcLen * 2))\r
+               {\r
+                       _wcstombsz(m_pchData, lpsz, (nSrcLen * 2) + 1);\r
+                       ReleaseBuffer();\r
+               }\r
+               return *this;\r
+       }\r
+#endif  // !_UNICODE\r
+\r
+       CString& operator =(const unsigned char* lpsz)\r
+       {\r
+               *this = (LPCSTR)lpsz;\r
+               return *this;\r
+       }\r
+\r
+       // string concatenation\r
+       CString& operator +=(const CString& string)\r
+       {\r
+               ConcatInPlace(string.GetData()->nDataLength, string.m_pchData);\r
+               return *this;\r
+       }\r
+\r
+       CString& operator +=(TCHAR ch)\r
+       {\r
+               ConcatInPlace(1, &ch);\r
+               return *this;\r
+       }\r
+\r
+#ifdef _UNICODE\r
+       CString& operator +=(char ch)\r
+       {\r
+               *this += (TCHAR)ch;\r
+               return *this;\r
+       }\r
+#endif\r
+\r
+       CString& operator +=(LPCTSTR lpsz)\r
+       {\r
+               ATLASSERT(lpsz == NULL || _IsValidString(lpsz));\r
+               ConcatInPlace(SafeStrlen(lpsz), lpsz);\r
+               return *this;\r
+       }\r
+\r
+       friend CString __stdcall operator +(const CString& string1, const CString& string2);\r
+       friend CString __stdcall operator +(const CString& string, TCHAR ch);\r
+       friend CString __stdcall operator +(TCHAR ch, const CString& string);\r
+#ifdef _UNICODE\r
+       friend CString __stdcall operator +(const CString& string, char ch);\r
+       friend CString __stdcall operator +(char ch, const CString& string);\r
+#endif\r
+       friend CString __stdcall operator +(const CString& string, LPCTSTR lpsz);\r
+       friend CString __stdcall operator +(LPCTSTR lpsz, const CString& string);\r
+\r
+       // string comparison\r
+       int Compare(LPCTSTR lpsz) const   // straight character (MBCS/Unicode aware)\r
+       {\r
+               return _cstrcmp(m_pchData, lpsz);\r
+       }\r
+\r
+       int CompareNoCase(LPCTSTR lpsz) const   // ignore case (MBCS/Unicode aware)\r
+       {\r
+               return _cstrcmpi(m_pchData, lpsz);\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       // CString::Collate is often slower than Compare but is MBSC/Unicode\r
+       //  aware as well as locale-sensitive with respect to sort order.\r
+       int Collate(LPCTSTR lpsz) const   // NLS aware\r
+       {\r
+               return _cstrcoll(m_pchData, lpsz);\r
+       }\r
+\r
+       int CollateNoCase(LPCTSTR lpsz) const   // ignore case\r
+       {\r
+               return _cstrcolli(m_pchData, lpsz);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       // simple sub-string extraction\r
+       CString Mid(int nFirst, int nCount) const\r
+       {\r
+               // out-of-bounds requests return sensible things\r
+               if (nFirst < 0)\r
+                       nFirst = 0;\r
+               if (nCount < 0)\r
+                       nCount = 0;\r
+\r
+               if (nFirst + nCount > GetData()->nDataLength)\r
+                       nCount = GetData()->nDataLength - nFirst;\r
+               if (nFirst > GetData()->nDataLength)\r
+                       nCount = 0;\r
+\r
+               CString dest;\r
+               AllocCopy(dest, nCount, nFirst, 0);\r
+               return dest;\r
+       }\r
+\r
+       CString Mid(int nFirst) const\r
+       {\r
+               return Mid(nFirst, GetData()->nDataLength - nFirst);\r
+       }\r
+\r
+       CString Left(int nCount) const\r
+       {\r
+               if (nCount < 0)\r
+                       nCount = 0;\r
+               else if (nCount > GetData()->nDataLength)\r
+                       nCount = GetData()->nDataLength;\r
+\r
+               CString dest;\r
+               AllocCopy(dest, nCount, 0, 0);\r
+               return dest;\r
+       }\r
+\r
+       CString Right(int nCount) const\r
+       {\r
+               if (nCount < 0)\r
+                       nCount = 0;\r
+               else if (nCount > GetData()->nDataLength)\r
+                       nCount = GetData()->nDataLength;\r
+\r
+               CString dest;\r
+               AllocCopy(dest, nCount, GetData()->nDataLength-nCount, 0);\r
+               return dest;\r
+       }\r
+\r
+       CString SpanIncluding(LPCTSTR lpszCharSet) const   // strspn equivalent\r
+       {\r
+               ATLASSERT(_IsValidString(lpszCharSet));\r
+               return Left(_cstrspn(m_pchData, lpszCharSet));\r
+       }\r
+\r
+       CString SpanExcluding(LPCTSTR lpszCharSet) const   // strcspn equivalent\r
+       {\r
+               ATLASSERT(_IsValidString(lpszCharSet));\r
+               return Left(_cstrcspn(m_pchData, lpszCharSet));\r
+       }\r
+\r
+       // upper/lower/reverse conversion\r
+       void MakeUpper()\r
+       {\r
+               CopyBeforeWrite();\r
+               CharUpper(m_pchData);\r
+       }\r
+\r
+       void MakeLower()\r
+       {\r
+               CopyBeforeWrite();\r
+               CharLower(m_pchData);\r
+       }\r
+\r
+       void MakeReverse()\r
+       {\r
+               CopyBeforeWrite();\r
+               _cstrrev(m_pchData);\r
+       }\r
+\r
+       // trimming whitespace (either side)\r
+       void TrimRight()\r
+       {\r
+               CopyBeforeWrite();\r
+\r
+               // find beginning of trailing spaces by starting at beginning (DBCS aware)\r
+               LPTSTR lpsz = m_pchData;\r
+               LPTSTR lpszLast = NULL;\r
+               while (*lpsz != _T('\0'))\r
+               {\r
+                       if (_cstrisspace(*lpsz))\r
+                       {\r
+                               if (lpszLast == NULL)\r
+                                       lpszLast = lpsz;\r
+                       }\r
+                       else\r
+                       {\r
+                               lpszLast = NULL;\r
+                       }\r
+                       lpsz = ::CharNext(lpsz);\r
+               }\r
+\r
+               if (lpszLast != NULL)\r
+               {\r
+                       // truncate at trailing space start\r
+                       *lpszLast = _T('\0');\r
+                       GetData()->nDataLength = (int)(DWORD_PTR)(lpszLast - m_pchData);\r
+               }\r
+       }\r
+\r
+       void TrimLeft()\r
+       {\r
+               CopyBeforeWrite();\r
+\r
+               // find first non-space character\r
+               LPCTSTR lpsz = m_pchData;\r
+               while (_cstrisspace(*lpsz))\r
+                       lpsz = ::CharNext(lpsz);\r
+\r
+               // fix up data and length\r
+               int nDataLength = GetData()->nDataLength - (int)(DWORD_PTR)(lpsz - m_pchData);\r
+               SecureHelper::memmove_x(m_pchData, (GetData()->nAllocLength + 1) * sizeof(TCHAR), lpsz, (nDataLength + 1) * sizeof(TCHAR));\r
+               GetData()->nDataLength = nDataLength;\r
+       }\r
+\r
+       // remove continuous occurrences of chTarget starting from right\r
+       void TrimRight(TCHAR chTarget)\r
+       {\r
+               // find beginning of trailing matches\r
+               // by starting at beginning (DBCS aware)\r
+\r
+               CopyBeforeWrite();\r
+               LPTSTR lpsz = m_pchData;\r
+               LPTSTR lpszLast = NULL;\r
+\r
+               while (*lpsz != _T('\0'))\r
+               {\r
+                       if (*lpsz == chTarget)\r
+                       {\r
+                               if (lpszLast == NULL)\r
+                                       lpszLast = lpsz;\r
+                       }\r
+                       else\r
+                               lpszLast = NULL;\r
+                       lpsz = ::CharNext(lpsz);\r
+               }\r
+\r
+               if (lpszLast != NULL)\r
+               {\r
+                       // truncate at left-most matching character\r
+                       *lpszLast = _T('\0');\r
+                       GetData()->nDataLength = (int)(DWORD_PTR)(lpszLast - m_pchData);\r
+               }\r
+       }\r
+\r
+       // remove continuous occcurrences of characters in passed string, starting from right\r
+       void TrimRight(LPCTSTR lpszTargetList)\r
+       {\r
+               // find beginning of trailing matches by starting at beginning (DBCS aware)\r
+\r
+               CopyBeforeWrite();\r
+               LPTSTR lpsz = m_pchData;\r
+               LPTSTR lpszLast = NULL;\r
+\r
+               while (*lpsz != _T('\0'))\r
+               {\r
+                       TCHAR* pNext = ::CharNext(lpsz);\r
+                       if(pNext > lpsz + 1)\r
+                       {\r
+                               if (_cstrchr_db(lpszTargetList, *lpsz, *(lpsz + 1)) != NULL)\r
+                               {\r
+                                       if (lpszLast == NULL)\r
+                                               lpszLast = lpsz;\r
+                               }\r
+                               else\r
+                               {\r
+                                       lpszLast = NULL;\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               if (_cstrchr(lpszTargetList, *lpsz) != NULL)\r
+                               {\r
+                                       if (lpszLast == NULL)\r
+                                               lpszLast = lpsz;\r
+                               }\r
+                               else\r
+                               {\r
+                                       lpszLast = NULL;\r
+                               }\r
+                       }\r
+\r
+                       lpsz = pNext;\r
+               }\r
+\r
+               if (lpszLast != NULL)\r
+               {\r
+                       // truncate at left-most matching character\r
+                       *lpszLast = _T('\0');\r
+                       GetData()->nDataLength = (int)(DWORD_PTR)(lpszLast - m_pchData);\r
+               }\r
+       }\r
+\r
+       // remove continuous occurrences of chTarget starting from left\r
+       void TrimLeft(TCHAR chTarget)\r
+       {\r
+               // find first non-matching character\r
+\r
+               CopyBeforeWrite();\r
+               LPCTSTR lpsz = m_pchData;\r
+\r
+               while (chTarget == *lpsz)\r
+                       lpsz = ::CharNext(lpsz);\r
+\r
+               if (lpsz != m_pchData)\r
+               {\r
+                       // fix up data and length\r
+                       int nDataLength = GetData()->nDataLength - (int)(DWORD_PTR)(lpsz - m_pchData);\r
+                       SecureHelper::memmove_x(m_pchData, (GetData()->nAllocLength + 1) * sizeof(TCHAR), lpsz, (nDataLength + 1) * sizeof(TCHAR));\r
+                       GetData()->nDataLength = nDataLength;\r
+               }\r
+       }\r
+\r
+       // remove continuous occcurrences of characters in passed string, starting from left\r
+       void TrimLeft(LPCTSTR lpszTargets)\r
+       {\r
+               // if we're not trimming anything, we're not doing any work\r
+               if (SafeStrlen(lpszTargets) == 0)\r
+                       return;\r
+\r
+               CopyBeforeWrite();\r
+               LPCTSTR lpsz = m_pchData;\r
+\r
+               while (*lpsz != _T('\0'))\r
+               {\r
+                       TCHAR* pNext = ::CharNext(lpsz);\r
+                       if(pNext > lpsz + 1)\r
+                       {\r
+                               if (_cstrchr_db(lpszTargets, *lpsz, *(lpsz + 1)) == NULL)\r
+                                       break;\r
+                       }\r
+                       else\r
+                       {\r
+                               if (_cstrchr(lpszTargets, *lpsz) == NULL)\r
+                                       break;\r
+                       }\r
+                       lpsz = pNext;\r
+               }\r
+\r
+               if (lpsz != m_pchData)\r
+               {\r
+                       // fix up data and length\r
+                       int nDataLength = GetData()->nDataLength - (int)(DWORD_PTR)(lpsz - m_pchData);\r
+                       SecureHelper::memmove_x(m_pchData, (GetData()->nAllocLength + 1) * sizeof(TCHAR), lpsz, (nDataLength + 1) * sizeof(TCHAR));\r
+                       GetData()->nDataLength = nDataLength;\r
+               }\r
+       }\r
+\r
+       // advanced manipulation\r
+       // replace occurrences of chOld with chNew\r
+       int Replace(TCHAR chOld, TCHAR chNew)\r
+       {\r
+               int nCount = 0;\r
+\r
+               // short-circuit the nop case\r
+               if (chOld != chNew)\r
+               {\r
+                       // otherwise modify each character that matches in the string\r
+                       CopyBeforeWrite();\r
+                       LPTSTR psz = m_pchData;\r
+                       LPTSTR pszEnd = psz + GetData()->nDataLength;\r
+                       while (psz < pszEnd)\r
+                       {\r
+                               // replace instances of the specified character only\r
+                               if (*psz == chOld)\r
+                               {\r
+                                       *psz = chNew;\r
+                                       nCount++;\r
+                               }\r
+                               psz = ::CharNext(psz);\r
+                       }\r
+               }\r
+               return nCount;\r
+       }\r
+\r
+       // replace occurrences of substring lpszOld with lpszNew;\r
+       // empty lpszNew removes instances of lpszOld\r
+       int Replace(LPCTSTR lpszOld, LPCTSTR lpszNew)\r
+       {\r
+               // can't have empty or NULL lpszOld\r
+\r
+               int nSourceLen = SafeStrlen(lpszOld);\r
+               if (nSourceLen == 0)\r
+                       return 0;\r
+               int nReplacementLen = SafeStrlen(lpszNew);\r
+\r
+               // loop once to figure out the size of the result string\r
+               int nCount = 0;\r
+               LPTSTR lpszStart = m_pchData;\r
+               LPTSTR lpszEnd = m_pchData + GetData()->nDataLength;\r
+               LPTSTR lpszTarget = NULL;\r
+               while (lpszStart < lpszEnd)\r
+               {\r
+                       while ((lpszTarget = (TCHAR*)_cstrstr(lpszStart, lpszOld)) != NULL)\r
+                       {\r
+                               nCount++;\r
+                               lpszStart = lpszTarget + nSourceLen;\r
+                       }\r
+                       lpszStart += lstrlen(lpszStart) + 1;\r
+               }\r
+\r
+               // if any changes were made, make them\r
+               if (nCount > 0)\r
+               {\r
+                       CopyBeforeWrite();\r
+\r
+                       // if the buffer is too small, just allocate a new buffer (slow but sure)\r
+                       int nOldLength = GetData()->nDataLength;\r
+                       int nNewLength =  nOldLength + (nReplacementLen - nSourceLen) * nCount;\r
+                       if (GetData()->nAllocLength < nNewLength || GetData()->nRefs > 1)\r
+                       {\r
+                               CStringData* pOldData = GetData();\r
+                               LPTSTR pstr = m_pchData;\r
+                               if(!AllocBuffer(nNewLength))\r
+                                       return -1;\r
+                               SecureHelper::memcpy_x(m_pchData, (nNewLength + 1) * sizeof(TCHAR), pstr, pOldData->nDataLength * sizeof(TCHAR));\r
+                               CString::Release(pOldData);\r
+                       }\r
+                       // else, we just do it in-place\r
+                       lpszStart = m_pchData;\r
+                       lpszEnd = m_pchData + GetData()->nDataLength;\r
+\r
+                       // loop again to actually do the work\r
+                       while (lpszStart < lpszEnd)\r
+                       {\r
+                               while ((lpszTarget = (TCHAR*)_cstrstr(lpszStart, lpszOld)) != NULL)\r
+                               {\r
+                                       int nBalance = nOldLength - ((int)(DWORD_PTR)(lpszTarget - m_pchData) + nSourceLen);\r
+                                       int cchBuffLen = GetData()->nAllocLength - (int)(DWORD_PTR)(lpszTarget - m_pchData);\r
+                                       SecureHelper::memmove_x(lpszTarget + nReplacementLen, (cchBuffLen - nReplacementLen + 1) * sizeof(TCHAR), lpszTarget + nSourceLen, nBalance * sizeof(TCHAR));\r
+                                       SecureHelper::memcpy_x(lpszTarget, (cchBuffLen + 1) * sizeof(TCHAR), lpszNew, nReplacementLen * sizeof(TCHAR));\r
+                                       lpszStart = lpszTarget + nReplacementLen;\r
+                                       lpszStart[nBalance] = _T('\0');\r
+                                       nOldLength += (nReplacementLen - nSourceLen);\r
+                               }\r
+                               lpszStart += lstrlen(lpszStart) + 1;\r
+                       }\r
+                       ATLASSERT(m_pchData[nNewLength] == _T('\0'));\r
+                       GetData()->nDataLength = nNewLength;\r
+               }\r
+\r
+               return nCount;\r
+       }\r
+\r
+       // remove occurrences of chRemove\r
+       int Remove(TCHAR chRemove)\r
+       {\r
+               CopyBeforeWrite();\r
+\r
+               LPTSTR pstrSource = m_pchData;\r
+               LPTSTR pstrDest = m_pchData;\r
+               LPTSTR pstrEnd = m_pchData + GetData()->nDataLength;\r
+\r
+               while (pstrSource < pstrEnd)\r
+               {\r
+                       if (*pstrSource != chRemove)\r
+                       {\r
+                               *pstrDest = *pstrSource;\r
+                               pstrDest = ::CharNext(pstrDest);\r
+                       }\r
+                       pstrSource = ::CharNext(pstrSource);\r
+               }\r
+               *pstrDest = _T('\0');\r
+               int nCount = (int)(DWORD_PTR)(pstrSource - pstrDest);\r
+               GetData()->nDataLength -= nCount;\r
+\r
+               return nCount;\r
+       }\r
+\r
+       // insert character at zero-based index; concatenates if index is past end of string\r
+       int Insert(int nIndex, TCHAR ch)\r
+       {\r
+               CopyBeforeWrite();\r
+\r
+               if (nIndex < 0)\r
+                       nIndex = 0;\r
+\r
+               int nNewLength = GetData()->nDataLength;\r
+               if (nIndex > nNewLength)\r
+                       nIndex = nNewLength;\r
+               nNewLength++;\r
+\r
+               if (GetData()->nAllocLength < nNewLength)\r
+               {\r
+                       CStringData* pOldData = GetData();\r
+                       LPTSTR pstr = m_pchData;\r
+                       if(!AllocBuffer(nNewLength))\r
+                               return -1;\r
+                       SecureHelper::memcpy_x(m_pchData, (nNewLength + 1) * sizeof(TCHAR), pstr, (pOldData->nDataLength + 1) * sizeof(TCHAR));\r
+                       CString::Release(pOldData);\r
+               }\r
+\r
+               // move existing bytes down\r
+               SecureHelper::memmove_x(m_pchData + nIndex + 1, (GetData()->nAllocLength - nIndex) * sizeof(TCHAR), m_pchData + nIndex, (nNewLength - nIndex) * sizeof(TCHAR));\r
+               m_pchData[nIndex] = ch;\r
+               GetData()->nDataLength = nNewLength;\r
+\r
+               return nNewLength;\r
+       }\r
+\r
+       // insert substring at zero-based index; concatenates if index is past end of string\r
+       int Insert(int nIndex, LPCTSTR pstr)\r
+       {\r
+               if (nIndex < 0)\r
+                       nIndex = 0;\r
+\r
+               int nInsertLength = SafeStrlen(pstr);\r
+               int nNewLength = GetData()->nDataLength;\r
+               if (nInsertLength > 0)\r
+               {\r
+                       CopyBeforeWrite();\r
+                       if (nIndex > nNewLength)\r
+                               nIndex = nNewLength;\r
+                       nNewLength += nInsertLength;\r
+\r
+                       if (GetData()->nAllocLength < nNewLength)\r
+                       {\r
+                               CStringData* pOldData = GetData();\r
+                               LPTSTR pstr = m_pchData;\r
+                               if(!AllocBuffer(nNewLength))\r
+                                       return -1;\r
+                               SecureHelper::memcpy_x(m_pchData, (nNewLength + 1) * sizeof(TCHAR), pstr, (pOldData->nDataLength + 1) * sizeof(TCHAR));\r
+                               CString::Release(pOldData);\r
+                       }\r
+\r
+                       // move existing bytes down\r
+                       SecureHelper::memmove_x(m_pchData + nIndex + nInsertLength, (GetData()->nAllocLength + 1 - nIndex - nInsertLength) * sizeof(TCHAR), m_pchData + nIndex, (nNewLength - nIndex - nInsertLength + 1) * sizeof(TCHAR));\r
+                       SecureHelper::memcpy_x(m_pchData + nIndex, (GetData()->nAllocLength + 1 - nIndex) * sizeof(TCHAR), pstr, nInsertLength * sizeof(TCHAR));\r
+                       GetData()->nDataLength = nNewLength;\r
+               }\r
+\r
+               return nNewLength;\r
+       }\r
+\r
+       // delete nCount characters starting at zero-based index\r
+       int Delete(int nIndex, int nCount = 1)\r
+       {\r
+               if (nIndex < 0)\r
+                       nIndex = 0;\r
+               int nLength = GetData()->nDataLength;\r
+               if (nCount > 0 && nIndex < nLength)\r
+               {\r
+                       if((nIndex + nCount) > nLength)\r
+                               nCount = nLength - nIndex;\r
+                       CopyBeforeWrite();\r
+                       int nBytesToCopy = nLength - (nIndex + nCount) + 1;\r
+\r
+                       SecureHelper::memmove_x(m_pchData + nIndex, (GetData()->nAllocLength + 1 - nIndex) * sizeof(TCHAR), m_pchData + nIndex + nCount, nBytesToCopy * sizeof(TCHAR));\r
+                       nLength -= nCount;\r
+                       GetData()->nDataLength = nLength;\r
+               }\r
+\r
+               return nLength;\r
+       }\r
+\r
+       // searching (return starting index, or -1 if not found)\r
+       // look for a single character match\r
+       int Find(TCHAR ch) const   // like "C" strchr\r
+       {\r
+               return Find(ch, 0);\r
+       }\r
+\r
+       int ReverseFind(TCHAR ch) const\r
+       {\r
+               // find last single character\r
+               LPCTSTR lpsz = _cstrrchr(m_pchData, (_TUCHAR)ch);\r
+\r
+               // return -1 if not found, distance from beginning otherwise\r
+               return (lpsz == NULL) ? -1 : (int)(lpsz - m_pchData);\r
+       }\r
+\r
+       int Find(TCHAR ch, int nStart) const   // starting at index\r
+       {\r
+               int nLength = GetData()->nDataLength;\r
+               if (nStart < 0 || nStart >= nLength)\r
+                       return -1;\r
+\r
+               // find first single character\r
+               LPCTSTR lpsz = _cstrchr(m_pchData + nStart, (_TUCHAR)ch);\r
+\r
+               // return -1 if not found and index otherwise\r
+               return (lpsz == NULL) ? -1 : (int)(lpsz - m_pchData);\r
+       }\r
+\r
+       int FindOneOf(LPCTSTR lpszCharSet) const\r
+       {\r
+               ATLASSERT(_IsValidString(lpszCharSet));\r
+               LPCTSTR lpsz = _cstrpbrk(m_pchData, lpszCharSet);\r
+               return (lpsz == NULL) ? -1 : (int)(lpsz - m_pchData);\r
+       }\r
+\r
+       // look for a specific sub-string\r
+       // find a sub-string (like strstr)\r
+       int Find(LPCTSTR lpszSub) const   // like "C" strstr\r
+       {\r
+               return Find(lpszSub, 0);\r
+       }\r
+\r
+       int Find(LPCTSTR lpszSub, int nStart) const   // starting at index\r
+       {\r
+               ATLASSERT(_IsValidString(lpszSub));\r
+\r
+               int nLength = GetData()->nDataLength;\r
+               if (nStart < 0 || nStart > nLength)\r
+                       return -1;\r
+\r
+               // find first matching substring\r
+               LPCTSTR lpsz = _cstrstr(m_pchData + nStart, lpszSub);\r
+\r
+               // return -1 for not found, distance from beginning otherwise\r
+               return (lpsz == NULL) ? -1 : (int)(lpsz - m_pchData);\r
+       }\r
+\r
+       // Concatentation for non strings\r
+       CString& Append(int n)\r
+       {\r
+               const int cchBuff = 12;\r
+               TCHAR szBuffer[cchBuff] = { 0 };\r
+               SecureHelper::wsprintf_x(szBuffer, cchBuff, _T("%d"), n);\r
+               ConcatInPlace(SafeStrlen(szBuffer), szBuffer);\r
+               return *this;\r
+       }\r
+\r
+       // simple formatting\r
+       // formatting (using wsprintf style formatting)\r
+       BOOL __cdecl Format(LPCTSTR lpszFormat, ...)\r
+       {\r
+               ATLASSERT(_IsValidString(lpszFormat));\r
+\r
+               va_list argList;\r
+               va_start(argList, lpszFormat);\r
+               BOOL bRet = FormatV(lpszFormat, argList);\r
+               va_end(argList);\r
+               return bRet;\r
+       }\r
+\r
+       BOOL __cdecl Format(UINT nFormatID, ...)\r
+       {\r
+               CString strFormat;\r
+               BOOL bRet = strFormat.LoadString(nFormatID);\r
+               ATLASSERT(bRet != 0);\r
+\r
+               va_list argList;\r
+               va_start(argList, nFormatID);\r
+               bRet = FormatV(strFormat, argList);\r
+               va_end(argList);\r
+               return bRet;\r
+       }\r
+\r
+       BOOL FormatV(LPCTSTR lpszFormat, va_list argList)\r
+       {\r
+               ATLASSERT(_IsValidString(lpszFormat));\r
+\r
+               enum _FormatModifiers\r
+               {\r
+                       FORCE_ANSI =    0x10000,\r
+                       FORCE_UNICODE = 0x20000,\r
+                       FORCE_INT64 =   0x40000\r
+               };\r
+\r
+               va_list argListSave = argList;\r
+\r
+               // make a guess at the maximum length of the resulting string\r
+               int nMaxLen = 0;\r
+               for (LPCTSTR lpsz = lpszFormat; *lpsz != _T('\0'); lpsz = ::CharNext(lpsz))\r
+               {\r
+                       // handle '%' character, but watch out for '%%'\r
+                       if (*lpsz != _T('%') || *(lpsz = ::CharNext(lpsz)) == _T('%'))\r
+                       {\r
+                               nMaxLen += (int)(::CharNext(lpsz) - lpsz);\r
+                               continue;\r
+                       }\r
+\r
+                       int nItemLen = 0;\r
+\r
+                       // handle '%' character with format\r
+                       int nWidth = 0;\r
+                       for (; *lpsz != _T('\0'); lpsz = ::CharNext(lpsz))\r
+                       {\r
+                               // check for valid flags\r
+                               if (*lpsz == _T('#'))\r
+                                       nMaxLen += 2;   // for '0x'\r
+                               else if (*lpsz == _T('*'))\r
+                                       nWidth = va_arg(argList, int);\r
+                               else if (*lpsz == _T('-') || *lpsz == _T('+') || *lpsz == _T('0') || *lpsz == _T(' '))\r
+                                       ;\r
+                               else // hit non-flag character\r
+                                       break;\r
+                       }\r
+                       // get width and skip it\r
+                       if (nWidth == 0)\r
+                       {\r
+                               // width indicated by\r
+                               nWidth = _cstrtoi(lpsz);\r
+                               for (; *lpsz != _T('\0') && _cstrisdigit(*lpsz); lpsz = ::CharNext(lpsz))\r
+                                       ;\r
+                       }\r
+                       ATLASSERT(nWidth >= 0);\r
+\r
+                       int nPrecision = 0;\r
+                       if (*lpsz == _T('.'))\r
+                       {\r
+                               // skip past '.' separator (width.precision)\r
+                               lpsz = ::CharNext(lpsz);\r
+\r
+                               // get precision and skip it\r
+                               if (*lpsz == _T('*'))\r
+                               {\r
+                                       nPrecision = va_arg(argList, int);\r
+                                       lpsz = ::CharNext(lpsz);\r
+                               }\r
+                               else\r
+                               {\r
+                                       nPrecision = _cstrtoi(lpsz);\r
+                                       for (; *lpsz != _T('\0') && _cstrisdigit(*lpsz); lpsz = ::CharNext(lpsz))\r
+                                               ;\r
+                               }\r
+                               ATLASSERT(nPrecision >= 0);\r
+                       }\r
+\r
+                       // should be on type modifier or specifier\r
+                       int nModifier = 0;\r
+                       if(lpsz[0] == _T('I') && lpsz[1] == _T('6') && lpsz[2] == _T('4'))\r
+                       {\r
+                               lpsz += 3;\r
+                               nModifier = FORCE_INT64;\r
+                       }\r
+                       else\r
+                       {\r
+                               switch (*lpsz)\r
+                               {\r
+                               // modifiers that affect size\r
+                               case _T('h'):\r
+                                       nModifier = FORCE_ANSI;\r
+                                       lpsz = ::CharNext(lpsz);\r
+                                       break;\r
+                               case _T('l'):\r
+                                       nModifier = FORCE_UNICODE;\r
+                                       lpsz = ::CharNext(lpsz);\r
+                                       break;\r
+\r
+                               // modifiers that do not affect size\r
+                               case _T('F'):\r
+                               case _T('N'):\r
+                               case _T('L'):\r
+                                       lpsz = ::CharNext(lpsz);\r
+                                       break;\r
+                               }\r
+                       }\r
+\r
+                       // now should be on specifier\r
+                       switch (*lpsz | nModifier)\r
+                       {\r
+                       // single characters\r
+                       case _T('c'):\r
+                       case _T('C'):\r
+                               nItemLen = 2;\r
+                               va_arg(argList, TCHAR);\r
+                               break;\r
+                       case _T('c') | FORCE_ANSI:\r
+                       case _T('C') | FORCE_ANSI:\r
+                               nItemLen = 2;\r
+                               va_arg(argList, char);\r
+                               break;\r
+                       case _T('c') | FORCE_UNICODE:\r
+                       case _T('C') | FORCE_UNICODE:\r
+                               nItemLen = 2;\r
+                               va_arg(argList, WCHAR);\r
+                               break;\r
+\r
+                       // strings\r
+                       case _T('s'):\r
+                       {\r
+                               LPCTSTR pstrNextArg = va_arg(argList, LPCTSTR);\r
+                               if (pstrNextArg == NULL)\r
+                               {\r
+                                       nItemLen = 6;  // "(null)"\r
+                               }\r
+                               else\r
+                               {\r
+                                       nItemLen = lstrlen(pstrNextArg);\r
+                                       nItemLen = max(1, nItemLen);\r
+                               }\r
+                               break;\r
+                       }\r
+\r
+                       case _T('S'):\r
+                       {\r
+#ifndef _UNICODE\r
+                               LPWSTR pstrNextArg = va_arg(argList, LPWSTR);\r
+                               if (pstrNextArg == NULL)\r
+                               {\r
+                                       nItemLen = 6;  // "(null)"\r
+                               }\r
+                               else\r
+                               {\r
+                                       nItemLen = (int)wcslen(pstrNextArg);\r
+                                       nItemLen = max(1, nItemLen);\r
+                               }\r
+#else // _UNICODE\r
+                               LPCSTR pstrNextArg = va_arg(argList, LPCSTR);\r
+                               if (pstrNextArg == NULL)\r
+                               {\r
+                                       nItemLen = 6; // "(null)"\r
+                               }\r
+                               else\r
+                               {\r
+#if defined(_WIN32_WCE) && (_ATL_VER >= 0x0800)\r
+                                       nItemLen = ATL::lstrlenA(pstrNextArg);\r
+#else\r
+                                       nItemLen = lstrlenA(pstrNextArg);\r
+#endif\r
+                                       nItemLen = max(1, nItemLen);\r
+                               }\r
+#endif // _UNICODE\r
+                               break;\r
+                       }\r
+\r
+                       case _T('s') | FORCE_ANSI:\r
+                       case _T('S') | FORCE_ANSI:\r
+                       {\r
+                               LPCSTR pstrNextArg = va_arg(argList, LPCSTR);\r
+                               if (pstrNextArg == NULL)\r
+                               {\r
+                                       nItemLen = 6; // "(null)"\r
+                               }\r
+                               else\r
+                               {\r
+#if defined(_WIN32_WCE) && (_ATL_VER >= 0x0800)\r
+                                       nItemLen = ATL::lstrlenA(pstrNextArg);\r
+#else\r
+                                       nItemLen = lstrlenA(pstrNextArg);\r
+#endif\r
+                                       nItemLen = max(1, nItemLen);\r
+                               }\r
+                               break;\r
+                       }\r
+\r
+                       case _T('s') | FORCE_UNICODE:\r
+                       case _T('S') | FORCE_UNICODE:\r
+                       {\r
+                               LPWSTR pstrNextArg = va_arg(argList, LPWSTR);\r
+                               if (pstrNextArg == NULL)\r
+                               {\r
+                                       nItemLen = 6; // "(null)"\r
+                               }\r
+                               else\r
+                               {\r
+                                       nItemLen = (int)wcslen(pstrNextArg);\r
+                                       nItemLen = max(1, nItemLen);\r
+                               }\r
+                               break;\r
+                       }\r
+                       }\r
+\r
+                       // adjust nItemLen for strings\r
+                       if (nItemLen != 0)\r
+                       {\r
+                               nItemLen = max(nItemLen, nWidth);\r
+                               if (nPrecision != 0)\r
+                                       nItemLen = min(nItemLen, nPrecision);\r
+                       }\r
+                       else\r
+                       {\r
+                               switch (*lpsz)\r
+                               {\r
+                               // integers\r
+                               case _T('d'):\r
+                               case _T('i'):\r
+                               case _T('u'):\r
+                               case _T('x'):\r
+                               case _T('X'):\r
+                               case _T('o'):\r
+                                       if (nModifier & FORCE_INT64)\r
+                                               va_arg(argList, __int64);\r
+                                       else\r
+                                               va_arg(argList, int);\r
+                                       nItemLen = 32;\r
+                                       nItemLen = max(nItemLen, nWidth + nPrecision);\r
+                                       break;\r
+\r
+#ifndef _ATL_USE_CSTRING_FLOAT\r
+                               case _T('e'):\r
+                               case _T('E'):\r
+                               case _T('f'):\r
+                               case _T('g'):\r
+                               case _T('G'):\r
+                                       ATLASSERT(!"Floating point (%%e, %%E, %%f, %%g, and %%G) is not supported by the WTL::CString class.");\r
+#ifndef _DEBUG\r
+                                       ::OutputDebugString(_T("Floating point (%%e, %%f, %%g, and %%G) is not supported by the WTL::CString class."));\r
+#ifndef _WIN32_WCE\r
+                                       ::DebugBreak();\r
+#else // CE specific\r
+                                       DebugBreak();\r
+#endif // _WIN32_WCE\r
+#endif // !_DEBUG\r
+                                       break;\r
+#else // _ATL_USE_CSTRING_FLOAT\r
+                               case _T('e'):\r
+                               case _T('E'):\r
+                               case _T('g'):\r
+                               case _T('G'):\r
+                                       va_arg(argList, double);\r
+                                       nItemLen = 128;\r
+                                       nItemLen = max(nItemLen, nWidth + nPrecision);\r
+                                       break;\r
+                               case _T('f'):\r
+                                       {\r
+                                               double f = va_arg(argList, double);\r
+                                               // 312 == strlen("-1+(309 zeroes).")\r
+                                               // 309 zeroes == max precision of a double\r
+                                               // 6 == adjustment in case precision is not specified,\r
+                                               //   which means that the precision defaults to 6\r
+                                               int cchLen = max(nWidth, 312 + nPrecision + 6);\r
+                                               CTempBuffer<TCHAR, _WTL_STACK_ALLOC_THRESHOLD> buff;\r
+                                               LPTSTR pszTemp = buff.Allocate(cchLen);\r
+                                               if(pszTemp != NULL)\r
+                                               {\r
+                                                       SecureHelper::sprintf_x(pszTemp, cchLen, _T("%*.*f"), nWidth, nPrecision + 6, f);\r
+                                                       nItemLen = (int)_tcslen(pszTemp);\r
+                                               }\r
+                                               else\r
+                                               {\r
+                                                       nItemLen = cchLen;\r
+                                               }\r
+                                       }\r
+                                       break;\r
+#endif // _ATL_USE_CSTRING_FLOAT\r
+\r
+                               case _T('p'):\r
+                                       va_arg(argList, void*);\r
+                                       nItemLen = 32;\r
+                                       nItemLen = max(nItemLen, nWidth + nPrecision);\r
+                                       break;\r
+\r
+                               // no output\r
+                               case _T('n'):\r
+                                       va_arg(argList, int*);\r
+                                       break;\r
+\r
+                               default:\r
+                                       ATLASSERT(FALSE);  // unknown formatting option\r
+                               }\r
+                       }\r
+\r
+                       // adjust nMaxLen for output nItemLen\r
+                       nMaxLen += nItemLen;\r
+               }\r
+\r
+               if(GetBuffer(nMaxLen) == NULL)\r
+                       return FALSE;\r
+#ifndef _ATL_USE_CSTRING_FLOAT\r
+               int nRet = SecureHelper::wvsprintf_x(m_pchData, GetAllocLength() + 1, lpszFormat, argListSave);\r
+#else // _ATL_USE_CSTRING_FLOAT\r
+               int nRet = SecureHelper::vsprintf_x(m_pchData, GetAllocLength() + 1, lpszFormat, argListSave);\r
+#endif // _ATL_USE_CSTRING_FLOAT\r
+               nRet;   // ref\r
+               ATLASSERT(nRet <= GetAllocLength());\r
+               ReleaseBuffer();\r
+\r
+               va_end(argListSave);\r
+               return TRUE;\r
+       }\r
+\r
+       // formatting for localization (uses FormatMessage API)\r
+       // formatting (using FormatMessage style formatting)\r
+       BOOL __cdecl FormatMessage(LPCTSTR lpszFormat, ...)\r
+       {\r
+               // format message into temporary buffer lpszTemp\r
+               va_list argList;\r
+               va_start(argList, lpszFormat);\r
+               LPTSTR lpszTemp;\r
+               BOOL bRet = TRUE;\r
+\r
+               if (::FormatMessage(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ALLOCATE_BUFFER,\r
+                               lpszFormat, 0, 0, (LPTSTR)&lpszTemp, 0, &argList) == 0 || lpszTemp == NULL)\r
+                       bRet = FALSE;\r
+\r
+               // assign lpszTemp into the resulting string and free the temporary\r
+               *this = lpszTemp;\r
+               LocalFree(lpszTemp);\r
+               va_end(argList);\r
+               return bRet;\r
+       }\r
+\r
+       BOOL __cdecl FormatMessage(UINT nFormatID, ...)\r
+       {\r
+               // get format string from string table\r
+               CString strFormat;\r
+               BOOL bRetTmp = strFormat.LoadString(nFormatID);\r
+               bRetTmp;   // ref\r
+               ATLASSERT(bRetTmp != 0);\r
+\r
+               // format message into temporary buffer lpszTemp\r
+               va_list argList;\r
+               va_start(argList, nFormatID);\r
+               LPTSTR lpszTemp;\r
+               BOOL bRet = TRUE;\r
+\r
+               if (::FormatMessage(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ALLOCATE_BUFFER,\r
+                               strFormat, 0, 0, (LPTSTR)&lpszTemp, 0, &argList) == 0 || lpszTemp == NULL)\r
+                       bRet = FALSE;\r
+\r
+               // assign lpszTemp into the resulting string and free lpszTemp\r
+               *this = lpszTemp;\r
+               LocalFree(lpszTemp);\r
+               va_end(argList);\r
+               return bRet;\r
+       }\r
+\r
+       // Windows support\r
+       BOOL LoadString(UINT nID)   // load from string resource (255 chars max.)\r
+       {\r
+#ifdef _UNICODE\r
+               const int CHAR_FUDGE = 1;   // one TCHAR unused is good enough\r
+#else\r
+               const int CHAR_FUDGE = 2;   // two BYTES unused for case of DBC last char\r
+#endif\r
+\r
+               // try fixed buffer first (to avoid wasting space in the heap)\r
+               TCHAR szTemp[256];\r
+               int nCount =  sizeof(szTemp) / sizeof(szTemp[0]);\r
+               int nLen = _LoadString(nID, szTemp, nCount);\r
+               if (nCount - nLen > CHAR_FUDGE)\r
+               {\r
+                       *this = szTemp;\r
+                       return (nLen > 0);\r
+               }\r
+\r
+               // try buffer size of 512, then larger size until entire string is retrieved\r
+               int nSize = 256;\r
+               do\r
+               {\r
+                       nSize += 256;\r
+                       LPTSTR lpstr = GetBuffer(nSize - 1);\r
+                       if(lpstr == NULL)\r
+                       {\r
+                               nLen = 0;\r
+                               break;\r
+                       }\r
+                       nLen = _LoadString(nID, lpstr, nSize);\r
+               } while (nSize - nLen <= CHAR_FUDGE);\r
+               ReleaseBuffer();\r
+\r
+               return (nLen > 0);\r
+       }\r
+\r
+#ifndef _UNICODE\r
+       // ANSI <-> OEM support (convert string in place)\r
+       void AnsiToOem()\r
+       {\r
+               CopyBeforeWrite();\r
+               ::AnsiToOem(m_pchData, m_pchData);\r
+       }\r
+\r
+       void OemToAnsi()\r
+       {\r
+               CopyBeforeWrite();\r
+               ::OemToAnsi(m_pchData, m_pchData);\r
+       }\r
+#endif\r
+\r
+#ifndef _ATL_NO_COM\r
+       // OLE BSTR support (use for OLE automation)\r
+       BSTR AllocSysString() const\r
+       {\r
+#if defined(_UNICODE) || defined(OLE2ANSI)\r
+               BSTR bstr = ::SysAllocStringLen(m_pchData, GetData()->nDataLength);\r
+#else\r
+               int nLen = MultiByteToWideChar(CP_ACP, 0, m_pchData,\r
+                       GetData()->nDataLength, NULL, NULL);\r
+               BSTR bstr = ::SysAllocStringLen(NULL, nLen);\r
+               if(bstr != NULL)\r
+                       MultiByteToWideChar(CP_ACP, 0, m_pchData, GetData()->nDataLength, bstr, nLen);\r
+#endif\r
+               return bstr;\r
+       }\r
+\r
+       BSTR SetSysString(BSTR* pbstr) const\r
+       {\r
+#if defined(_UNICODE) || defined(OLE2ANSI)\r
+               ::SysReAllocStringLen(pbstr, m_pchData, GetData()->nDataLength);\r
+#else\r
+               int nLen = MultiByteToWideChar(CP_ACP, 0, m_pchData,\r
+                       GetData()->nDataLength, NULL, NULL);\r
+               if(::SysReAllocStringLen(pbstr, NULL, nLen))\r
+                       MultiByteToWideChar(CP_ACP, 0, m_pchData, GetData()->nDataLength, *pbstr, nLen);\r
+#endif\r
+               ATLASSERT(*pbstr != NULL);\r
+               return *pbstr;\r
+       }\r
+#endif // !_ATL_NO_COM\r
+\r
+       // Access to string implementation buffer as "C" character array\r
+       LPTSTR GetBuffer(int nMinBufLength)\r
+       {\r
+               ATLASSERT(nMinBufLength >= 0);\r
+\r
+               if (GetData()->nRefs > 1 || nMinBufLength > GetData()->nAllocLength)\r
+               {\r
+                       // we have to grow the buffer\r
+                       CStringData* pOldData = GetData();\r
+                       int nOldLen = GetData()->nDataLength;   // AllocBuffer will tromp it\r
+                       if (nMinBufLength < nOldLen)\r
+                               nMinBufLength = nOldLen;\r
+\r
+                       if(!AllocBuffer(nMinBufLength))\r
+                               return NULL;\r
+\r
+                       SecureHelper::memcpy_x(m_pchData, (nMinBufLength + 1) * sizeof(TCHAR), pOldData->data(), (nOldLen + 1) * sizeof(TCHAR));\r
+                       GetData()->nDataLength = nOldLen;\r
+                       CString::Release(pOldData);\r
+               }\r
+               ATLASSERT(GetData()->nRefs <= 1);\r
+\r
+               // return a pointer to the character storage for this string\r
+               ATLASSERT(m_pchData != NULL);\r
+               return m_pchData;\r
+       }\r
+\r
+       void ReleaseBuffer(int nNewLength = -1)\r
+       {\r
+               CopyBeforeWrite();   // just in case GetBuffer was not called\r
+\r
+               if (nNewLength == -1)\r
+                       nNewLength = lstrlen(m_pchData);   // zero terminated\r
+\r
+               ATLASSERT(nNewLength <= GetData()->nAllocLength);\r
+               GetData()->nDataLength = nNewLength;\r
+               m_pchData[nNewLength] = _T('\0');\r
+       }\r
+\r
+       LPTSTR GetBufferSetLength(int nNewLength)\r
+       {\r
+               ATLASSERT(nNewLength >= 0);\r
+\r
+               if(GetBuffer(nNewLength) == NULL)\r
+                       return NULL;\r
+\r
+               GetData()->nDataLength = nNewLength;\r
+               m_pchData[nNewLength] = _T('\0');\r
+               return m_pchData;\r
+       }\r
+\r
+       void FreeExtra()\r
+       {\r
+               ATLASSERT(GetData()->nDataLength <= GetData()->nAllocLength);\r
+               if (GetData()->nDataLength != GetData()->nAllocLength)\r
+               {\r
+                       CStringData* pOldData = GetData();\r
+                       if(AllocBuffer(GetData()->nDataLength))\r
+                       {\r
+                               SecureHelper::memcpy_x(m_pchData, (GetData()->nAllocLength + 1) * sizeof(TCHAR), pOldData->data(), pOldData->nDataLength * sizeof(TCHAR));\r
+                               ATLASSERT(m_pchData[GetData()->nDataLength] == _T('\0'));\r
+                               CString::Release(pOldData);\r
+                       }\r
+               }\r
+               ATLASSERT(GetData() != NULL);\r
+       }\r
+\r
+       // Use LockBuffer/UnlockBuffer to turn refcounting off\r
+       LPTSTR LockBuffer()\r
+       {\r
+               LPTSTR lpsz = GetBuffer(0);\r
+               if(lpsz != NULL)\r
+                       GetData()->nRefs = -1;\r
+               return lpsz;\r
+       }\r
+\r
+       void UnlockBuffer()\r
+       {\r
+               ATLASSERT(GetData()->nRefs == -1);\r
+               if (GetData() != _atltmpDataNil)\r
+                       GetData()->nRefs = 1;\r
+       }\r
+\r
+// Implementation\r
+public:\r
+       ~CString()   //  free any attached data\r
+       {\r
+               if (GetData() != _atltmpDataNil)\r
+               {\r
+                       if (InterlockedDecrement(&GetData()->nRefs) <= 0)\r
+                               delete[] (BYTE*)GetData();\r
+               }\r
+       }\r
+\r
+       int GetAllocLength() const\r
+       {\r
+               return GetData()->nAllocLength;\r
+       }\r
+\r
+       static BOOL __stdcall _IsValidString(LPCTSTR lpsz, int /*nLength*/ = -1)\r
+       {\r
+               return (lpsz != NULL) ? TRUE : FALSE;\r
+       }\r
+\r
+protected:\r
+       LPTSTR m_pchData;   // pointer to ref counted string data\r
+\r
+       // implementation helpers\r
+       CStringData* GetData() const\r
+       {\r
+               ATLASSERT(m_pchData != NULL);\r
+               return ((CStringData*)m_pchData) - 1;\r
+       }\r
+\r
+       void Init()\r
+       {\r
+               m_pchData = _GetEmptyString().m_pchData;\r
+       }\r
+\r
+       BOOL AllocCopy(CString& dest, int nCopyLen, int nCopyIndex, int nExtraLen) const\r
+       {\r
+               // will clone the data attached to this string\r
+               // allocating 'nExtraLen' characters\r
+               // Places results in uninitialized string 'dest'\r
+               // Will copy the part or all of original data to start of new string\r
+\r
+               BOOL bRet = FALSE;\r
+               int nNewLen = nCopyLen + nExtraLen;\r
+               if (nNewLen == 0)\r
+               {\r
+                       dest.Init();\r
+                       bRet = TRUE;\r
+               }\r
+               else if(nNewLen >= nCopyLen)\r
+               {\r
+                       if(dest.AllocBuffer(nNewLen))\r
+                       {\r
+                               SecureHelper::memcpy_x(dest.m_pchData, (nNewLen + 1) * sizeof(TCHAR), m_pchData + nCopyIndex, nCopyLen * sizeof(TCHAR));\r
+                               bRet = TRUE;\r
+                       }\r
+               }\r
+\r
+               return bRet;\r
+       }\r
+\r
+       // always allocate one extra character for '\0' termination\r
+       // assumes [optimistically] that data length will equal allocation length\r
+       BOOL AllocBuffer(int nLen)\r
+       {\r
+               ATLASSERT(nLen >= 0);\r
+               ATLASSERT(nLen <= INT_MAX - 1);   // max size (enough room for 1 extra)\r
+\r
+               if (nLen == 0)\r
+               {\r
+                       Init();\r
+               }\r
+               else\r
+               {\r
+                       CStringData* pData = NULL;\r
+                       ATLTRY(pData = (CStringData*)new BYTE[sizeof(CStringData) + (nLen + 1) * sizeof(TCHAR)]);\r
+                       if(pData == NULL)\r
+                               return FALSE;\r
+\r
+                       pData->nRefs = 1;\r
+                       pData->data()[nLen] = _T('\0');\r
+                       pData->nDataLength = nLen;\r
+                       pData->nAllocLength = nLen;\r
+                       m_pchData = pData->data();\r
+               }\r
+\r
+               return TRUE;\r
+       }\r
+\r
+       // Assignment operators\r
+       //  All assign a new value to the string\r
+       //      (a) first see if the buffer is big enough\r
+       //      (b) if enough room, copy on top of old buffer, set size and type\r
+       //      (c) otherwise free old string data, and create a new one\r
+       //\r
+       //  All routines return the new string (but as a 'const CString&' so that\r
+       //      assigning it again will cause a copy, eg: s1 = s2 = "hi there".\r
+       //\r
+       void AssignCopy(int nSrcLen, LPCTSTR lpszSrcData)\r
+       {\r
+               if(AllocBeforeWrite(nSrcLen))\r
+               {\r
+                       SecureHelper::memcpy_x(m_pchData, (nSrcLen + 1) * sizeof(TCHAR), lpszSrcData, nSrcLen * sizeof(TCHAR));\r
+                       GetData()->nDataLength = nSrcLen;\r
+                       m_pchData[nSrcLen] = _T('\0');\r
+               }\r
+       }\r
+\r
+       // Concatenation\r
+       // NOTE: "operator +" is done as friend functions for simplicity\r
+       //      There are three variants:\r
+       //          CString + CString\r
+       // and for ? = TCHAR, LPCTSTR\r
+       //          CString + ?\r
+       //          ? + CString\r
+       BOOL ConcatCopy(int nSrc1Len, LPCTSTR lpszSrc1Data, int nSrc2Len, LPCTSTR lpszSrc2Data)\r
+       {\r
+               // -- master concatenation routine\r
+               // Concatenate two sources\r
+               // -- assume that 'this' is a new CString object\r
+\r
+               BOOL bRet = TRUE;\r
+               int nNewLen = nSrc1Len + nSrc2Len;\r
+               if(nNewLen < nSrc1Len || nNewLen < nSrc2Len)\r
+               {\r
+                       bRet = FALSE;\r
+               }\r
+               else if(nNewLen != 0)\r
+               {\r
+                       bRet = AllocBuffer(nNewLen);\r
+                       if (bRet)\r
+                       {\r
+                               SecureHelper::memcpy_x(m_pchData, (nNewLen + 1) * sizeof(TCHAR), lpszSrc1Data, nSrc1Len * sizeof(TCHAR));\r
+                               SecureHelper::memcpy_x(m_pchData + nSrc1Len, (nNewLen + 1 - nSrc1Len) * sizeof(TCHAR), lpszSrc2Data, nSrc2Len * sizeof(TCHAR));\r
+                       }\r
+               }\r
+               return bRet;\r
+       }\r
+\r
+       void ConcatInPlace(int nSrcLen, LPCTSTR lpszSrcData)\r
+       {\r
+               //  -- the main routine for += operators\r
+\r
+               // concatenating an empty string is a no-op!\r
+               if (nSrcLen == 0)\r
+                       return;\r
+\r
+               // if the buffer is too small, or we have a width mis-match, just\r
+               //   allocate a new buffer (slow but sure)\r
+               if (GetData()->nRefs > 1 || GetData()->nDataLength + nSrcLen > GetData()->nAllocLength)\r
+               {\r
+                       // we have to grow the buffer, use the ConcatCopy routine\r
+                       CStringData* pOldData = GetData();\r
+                       if (ConcatCopy(GetData()->nDataLength, m_pchData, nSrcLen, lpszSrcData))\r
+                       {\r
+                               ATLASSERT(pOldData != NULL);\r
+                               CString::Release(pOldData);\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       // fast concatenation when buffer big enough\r
+                       SecureHelper::memcpy_x(m_pchData + GetData()->nDataLength, (GetData()->nAllocLength + 1) * sizeof(TCHAR), lpszSrcData, nSrcLen * sizeof(TCHAR));\r
+                       GetData()->nDataLength += nSrcLen;\r
+                       ATLASSERT(GetData()->nDataLength <= GetData()->nAllocLength);\r
+                       m_pchData[GetData()->nDataLength] = _T('\0');\r
+               }\r
+       }\r
+\r
+       void CopyBeforeWrite()\r
+       {\r
+               if (GetData()->nRefs > 1)\r
+               {\r
+                       CStringData* pData = GetData();\r
+                       Release();\r
+                       if(AllocBuffer(pData->nDataLength))\r
+                               SecureHelper::memcpy_x(m_pchData, (GetData()->nAllocLength + 1) * sizeof(TCHAR), pData->data(), (pData->nDataLength + 1) * sizeof(TCHAR));\r
+               }\r
+               ATLASSERT(GetData()->nRefs <= 1);\r
+       }\r
+\r
+       BOOL AllocBeforeWrite(int nLen)\r
+       {\r
+               BOOL bRet = TRUE;\r
+               if (GetData()->nRefs > 1 || nLen > GetData()->nAllocLength)\r
+               {\r
+                       Release();\r
+                       bRet = AllocBuffer(nLen);\r
+               }\r
+               ATLASSERT(GetData()->nRefs <= 1);\r
+               return bRet;\r
+       }\r
+\r
+       void Release()\r
+       {\r
+               if (GetData() != _atltmpDataNil)\r
+               {\r
+                       ATLASSERT(GetData()->nRefs != 0);\r
+                       if (InterlockedDecrement(&GetData()->nRefs) <= 0)\r
+                               delete[] (BYTE*)GetData();\r
+                       Init();\r
+               }\r
+       }\r
+\r
+       static void PASCAL Release(CStringData* pData)\r
+       {\r
+               if (pData != _atltmpDataNil)\r
+               {\r
+                       ATLASSERT(pData->nRefs != 0);\r
+                       if (InterlockedDecrement(&pData->nRefs) <= 0)\r
+                               delete[] (BYTE*)pData;\r
+               }\r
+       }\r
+\r
+       static int PASCAL SafeStrlen(LPCTSTR lpsz)\r
+       {\r
+               return (lpsz == NULL) ? 0 : lstrlen(lpsz);\r
+       }\r
+\r
+       static int __stdcall _LoadString(UINT nID, LPTSTR lpszBuf, UINT nMaxBuf)\r
+       {\r
+#ifdef _DEBUG\r
+               // LoadString without annoying warning from the Debug kernel if the\r
+               //  segment containing the string is not present\r
+               if (::FindResource(ModuleHelper::GetResourceInstance(), MAKEINTRESOURCE((nID >> 4) + 1), RT_STRING) == NULL)\r
+               {\r
+                       lpszBuf[0] = _T('\0');\r
+                       return 0;   // not found\r
+               }\r
+#endif // _DEBUG\r
+\r
+               int nLen = ::LoadString(ModuleHelper::GetResourceInstance(), nID, lpszBuf, nMaxBuf);\r
+               if (nLen == 0)\r
+                       lpszBuf[0] = _T('\0');\r
+\r
+               return nLen;\r
+       }\r
+\r
+       static const CString& __stdcall _GetEmptyString()\r
+       {\r
+               return *(CString*)&_atltmpPchNil;\r
+       }\r
+\r
+// CString conversion helpers\r
+       static int __cdecl _wcstombsz(char* mbstr, const wchar_t* wcstr, size_t count)\r
+       {\r
+               if (count == 0 && mbstr != NULL)\r
+                       return 0;\r
+\r
+               int result = ::WideCharToMultiByte(CP_ACP, 0, wcstr, -1, mbstr, (int)count, NULL, NULL);\r
+               ATLASSERT(mbstr == NULL || result <= (int)count);\r
+               if (result > 0)\r
+                       mbstr[result - 1] = 0;\r
+               return result;\r
+       }\r
+\r
+       static int __cdecl _mbstowcsz(wchar_t* wcstr, const char* mbstr, size_t count)\r
+       {\r
+               if (count == 0 && wcstr != NULL)\r
+                       return 0;\r
+\r
+               int result = ::MultiByteToWideChar(CP_ACP, 0, mbstr, -1, wcstr, (int)count);\r
+               ATLASSERT(wcstr == NULL || result <= (int)count);\r
+               if (result > 0)\r
+                       wcstr[result - 1] = 0;\r
+               return result;\r
+       }\r
+\r
+// Helpers to avoid CRT startup code\r
+#ifdef _ATL_MIN_CRT\r
+       static const TCHAR* _cstrchr(const TCHAR* p, TCHAR ch)\r
+       {\r
+               // strchr for '\0' should succeed\r
+               while (*p != 0)\r
+               {\r
+                       if (*p == ch)\r
+                               break;\r
+                       p = ::CharNext(p);\r
+               }\r
+               return (*p == ch) ? p : NULL;\r
+       }\r
+\r
+       static const TCHAR* _cstrrchr(const TCHAR* p, TCHAR ch)\r
+       {\r
+               const TCHAR* lpsz = NULL;\r
+               while (*p != 0)\r
+               {\r
+                       if (*p == ch)\r
+                               lpsz = p;\r
+                       p = ::CharNext(p);\r
+               }\r
+               return lpsz;\r
+       }\r
+\r
+       static TCHAR* _cstrrev(TCHAR* pStr)\r
+       {\r
+               // optimize NULL, zero-length, and single-char case\r
+               if ((pStr == NULL) || (pStr[0] == _T('\0')) || (pStr[1] == _T('\0')))\r
+                       return pStr;\r
+\r
+               TCHAR* p = pStr;\r
+\r
+               while (*p != 0) \r
+               {\r
+                       TCHAR* pNext = ::CharNext(p);\r
+                       if(pNext > p + 1)\r
+                       {\r
+                               char p1 = *(char*)p;\r
+                               *(char*)p = *(char*)(p + 1);\r
+                               *(char*)(p + 1) = p1;\r
+                       }\r
+                       p = pNext;\r
+               }\r
+\r
+               p--;\r
+               TCHAR* q = pStr;\r
+\r
+               while (q < p)\r
+               {\r
+                       TCHAR t = *q;\r
+                       *q = *p;\r
+                       *p = t;\r
+                       q++;\r
+                       p--;\r
+               }\r
+               return pStr;\r
+       }\r
+\r
+       static const TCHAR* _cstrstr(const TCHAR* pStr, const TCHAR* pCharSet)\r
+       {\r
+               int nLen = lstrlen(pCharSet);\r
+               if (nLen == 0)\r
+                       return (TCHAR*)pStr;\r
+\r
+               const TCHAR* pRet = NULL;\r
+               const TCHAR* pCur = pStr;\r
+               while((pCur = _cstrchr(pCur, *pCharSet)) != NULL)\r
+               {\r
+                       if(memcmp(pCur, pCharSet, nLen * sizeof(TCHAR)) == 0)\r
+                       {\r
+                               pRet = pCur;\r
+                               break;\r
+                       }\r
+                       pCur = ::CharNext(pCur);\r
+               }\r
+               return pRet;\r
+       }\r
+\r
+       static int _cstrspn(const TCHAR* pStr, const TCHAR* pCharSet)\r
+       {\r
+               int nRet = 0;\r
+               const TCHAR* p = pStr;\r
+               while (*p != 0)\r
+               {\r
+                       const TCHAR* pNext = ::CharNext(p);\r
+                       if(pNext > p + 1)\r
+                       {\r
+                               if(_cstrchr_db(pCharSet, *p, *(p + 1)) == NULL)\r
+                                       break;\r
+                               nRet += 2;\r
+                       }\r
+                       else\r
+                       {\r
+                               if(_cstrchr(pCharSet, *p) == NULL)\r
+                                       break;\r
+                               nRet++;\r
+                       }\r
+                       p = pNext;\r
+               }\r
+               return nRet;\r
+       }\r
+\r
+       static int _cstrcspn(const TCHAR* pStr, const TCHAR* pCharSet)\r
+       {\r
+               int nRet = 0;\r
+               TCHAR* p = (TCHAR*)pStr;\r
+               while (*p != 0)\r
+               {\r
+                       TCHAR* pNext = ::CharNext(p);\r
+                       if(pNext > p + 1)\r
+                       {\r
+                               if(_cstrchr_db(pCharSet, *p, *(p + 1)) != NULL)\r
+                                       break;\r
+                               nRet += 2;\r
+                       }\r
+                       else\r
+                       {\r
+                               if(_cstrchr(pCharSet, *p) != NULL)\r
+                                       break;\r
+                               nRet++;\r
+                       }\r
+                       p = pNext;\r
+               }\r
+               return nRet;\r
+       }\r
+\r
+       static const TCHAR* _cstrpbrk(const TCHAR* p, const TCHAR* lpszCharSet)\r
+       {\r
+               int n = _cstrcspn(p, lpszCharSet);\r
+               return (p[n] != 0) ? &p[n] : NULL;\r
+       }\r
+\r
+       static int _cstrisdigit(TCHAR ch)\r
+       {\r
+               WORD type;\r
+               GetStringTypeEx(GetThreadLocale(), CT_CTYPE1, &ch, 1, &type);\r
+               return (type & C1_DIGIT) == C1_DIGIT;\r
+       }\r
+\r
+       static int _cstrisspace(TCHAR ch)\r
+       {\r
+               WORD type;\r
+               GetStringTypeEx(GetThreadLocale(), CT_CTYPE1, &ch, 1, &type);\r
+               return (type & C1_SPACE) == C1_SPACE;\r
+       }\r
+\r
+       static int _cstrcmp(const TCHAR* pstrOne, const TCHAR* pstrOther)\r
+       {\r
+               return lstrcmp(pstrOne, pstrOther);\r
+       }\r
+\r
+       static int _cstrcmpi(const TCHAR* pstrOne, const TCHAR* pstrOther)\r
+       {\r
+               return lstrcmpi(pstrOne, pstrOther);\r
+       }\r
+\r
+       static int _cstrcoll(const TCHAR* pstrOne, const TCHAR* pstrOther)\r
+       {\r
+               int nRet = CompareString(GetThreadLocale(), 0, pstrOne, -1, pstrOther, -1);\r
+               ATLASSERT(nRet != 0);\r
+               return nRet - 2;   // convert to strcmp convention\r
+       }\r
+\r
+       static int _cstrcolli(const TCHAR* pstrOne, const TCHAR* pstrOther)\r
+       {\r
+               int nRet = CompareString(GetThreadLocale(), NORM_IGNORECASE, pstrOne, -1, pstrOther, -1);\r
+               ATLASSERT(nRet != 0);\r
+               return nRet - 2;   // convert to strcmp convention\r
+       }\r
+\r
+       static int _cstrtoi(const TCHAR* nptr)\r
+       {\r
+               int c;       // current char\r
+               int total;   // current total\r
+               int sign;    // if '-', then negative, otherwise positive\r
+\r
+               while (_cstrisspace(*nptr))\r
+                       ++nptr;\r
+\r
+               c = (int)(_TUCHAR)*nptr++;\r
+               sign = c;   // save sign indication\r
+               if (c == _T('-') || c == _T('+'))\r
+                       c = (int)(_TUCHAR)*nptr++;   // skip sign\r
+\r
+               total = 0;\r
+\r
+               while (_cstrisdigit((TCHAR)c))\r
+               {\r
+                       total = 10 * total + (c - '0');   // accumulate digit\r
+                       c = (int)(_TUCHAR)*nptr++;        // get next char\r
+               }\r
+\r
+               if (sign == '-')\r
+                       return -total;\r
+               else\r
+                       return total;   // return result, negated if necessary\r
+       }\r
+#else // !_ATL_MIN_CRT\r
+       static const TCHAR* _cstrchr(const TCHAR* p, TCHAR ch)\r
+       {\r
+               return _tcschr(p, ch);\r
+       }\r
+\r
+       static const TCHAR* _cstrrchr(const TCHAR* p, TCHAR ch)\r
+       {\r
+               return _tcsrchr(p, ch);\r
+       }\r
+\r
+       static TCHAR* _cstrrev(TCHAR* pStr)\r
+       {\r
+               return _tcsrev(pStr);\r
+       }\r
+\r
+       static const TCHAR* _cstrstr(const TCHAR* pStr, const TCHAR* pCharSet)\r
+       {\r
+               return _tcsstr(pStr, pCharSet);\r
+       }\r
+\r
+       static int _cstrspn(const TCHAR* pStr, const TCHAR* pCharSet)\r
+       {\r
+               return (int)_tcsspn(pStr, pCharSet);\r
+       }\r
+\r
+       static int _cstrcspn(const TCHAR* pStr, const TCHAR* pCharSet)\r
+       {\r
+               return (int)_tcscspn(pStr, pCharSet);\r
+       }\r
+\r
+       static const TCHAR* _cstrpbrk(const TCHAR* p, const TCHAR* lpszCharSet)\r
+       {\r
+               return _tcspbrk(p, lpszCharSet);\r
+       }\r
+\r
+       static int _cstrisdigit(TCHAR ch)\r
+       {\r
+               return _istdigit(ch);\r
+       }\r
+\r
+       static int _cstrisspace(TCHAR ch)\r
+       {\r
+               return _istspace((_TUCHAR)ch);\r
+       }\r
+\r
+       static int _cstrcmp(const TCHAR* pstrOne, const TCHAR* pstrOther)\r
+       {\r
+               return _tcscmp(pstrOne, pstrOther);\r
+       }\r
+\r
+       static int _cstrcmpi(const TCHAR* pstrOne, const TCHAR* pstrOther)\r
+       {\r
+               return _tcsicmp(pstrOne, pstrOther);\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       static int _cstrcoll(const TCHAR* pstrOne, const TCHAR* pstrOther)\r
+       {\r
+               return _tcscoll(pstrOne, pstrOther);\r
+       }\r
+\r
+       static int _cstrcolli(const TCHAR* pstrOne, const TCHAR* pstrOther)\r
+       {\r
+               return _tcsicoll(pstrOne, pstrOther);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       static int _cstrtoi(const TCHAR* nptr)\r
+       {\r
+               return _ttoi(nptr);\r
+       }\r
+#endif // !_ATL_MIN_CRT\r
+\r
+       static const TCHAR* _cstrchr_db(const TCHAR* p, TCHAR ch1, TCHAR ch2)\r
+       {\r
+               const TCHAR* lpsz = NULL;\r
+               while (*p != 0)\r
+               {\r
+                       if (*p == ch1 && *(p + 1) == ch2)\r
+                       {\r
+                               lpsz = p;\r
+                               break;\r
+                       }\r
+                       p = ::CharNext(p);\r
+               }\r
+               return lpsz;\r
+       }\r
+};\r
+\r
+\r
+// Compare helpers\r
+\r
+inline bool __stdcall operator ==(const CString& s1, const CString& s2)\r
+{ return s1.Compare(s2) == 0; }\r
+\r
+inline bool __stdcall operator ==(const CString& s1, LPCTSTR s2)\r
+{ return s1.Compare(s2) == 0; }\r
+\r
+inline bool __stdcall operator ==(LPCTSTR s1, const CString& s2)\r
+{ return s2.Compare(s1) == 0; }\r
+\r
+inline bool __stdcall operator !=(const CString& s1, const CString& s2)\r
+{ return s1.Compare(s2) != 0; }\r
+\r
+inline bool __stdcall operator !=(const CString& s1, LPCTSTR s2)\r
+{ return s1.Compare(s2) != 0; }\r
+\r
+inline bool __stdcall operator !=(LPCTSTR s1, const CString& s2)\r
+{ return s2.Compare(s1) != 0; }\r
+\r
+inline bool __stdcall operator <(const CString& s1, const CString& s2)\r
+{ return s1.Compare(s2) < 0; }\r
+\r
+inline bool __stdcall operator <(const CString& s1, LPCTSTR s2)\r
+{ return s1.Compare(s2) < 0; }\r
+\r
+inline bool __stdcall operator <(LPCTSTR s1, const CString& s2)\r
+{ return s2.Compare(s1) > 0; }\r
+\r
+inline bool __stdcall operator >(const CString& s1, const CString& s2)\r
+{ return s1.Compare(s2) > 0; }\r
+\r
+inline bool __stdcall operator >(const CString& s1, LPCTSTR s2)\r
+{ return s1.Compare(s2) > 0; }\r
+\r
+inline bool __stdcall operator >(LPCTSTR s1, const CString& s2)\r
+{ return s2.Compare(s1) < 0; }\r
+\r
+inline bool __stdcall operator <=(const CString& s1, const CString& s2)\r
+{ return s1.Compare(s2) <= 0; }\r
+\r
+inline bool __stdcall operator <=(const CString& s1, LPCTSTR s2)\r
+{ return s1.Compare(s2) <= 0; }\r
+\r
+inline bool __stdcall operator <=(LPCTSTR s1, const CString& s2)\r
+{ return s2.Compare(s1) >= 0; }\r
+\r
+inline bool __stdcall operator >=(const CString& s1, const CString& s2)\r
+{ return s1.Compare(s2) >= 0; }\r
+\r
+inline bool __stdcall operator >=(const CString& s1, LPCTSTR s2)\r
+{ return s1.Compare(s2) >= 0; }\r
+\r
+inline bool __stdcall operator >=(LPCTSTR s1, const CString& s2)\r
+{ return s2.Compare(s1) <= 0; }\r
+\r
+\r
+// CString "operator +" functions\r
+\r
+inline CString __stdcall operator +(const CString& string1, const CString& string2)\r
+{\r
+       CString s;\r
+       s.ConcatCopy(string1.GetData()->nDataLength, string1.m_pchData, string2.GetData()->nDataLength, string2.m_pchData);\r
+       return s;\r
+}\r
+\r
+inline CString __stdcall operator +(const CString& string, TCHAR ch)\r
+{\r
+       CString s;\r
+       s.ConcatCopy(string.GetData()->nDataLength, string.m_pchData, 1, &ch);\r
+       return s;\r
+}\r
+\r
+inline CString __stdcall operator +(TCHAR ch, const CString& string)\r
+{\r
+       CString s;\r
+       s.ConcatCopy(1, &ch, string.GetData()->nDataLength, string.m_pchData);\r
+       return s;\r
+}\r
+\r
+#ifdef _UNICODE\r
+inline CString __stdcall operator +(const CString& string, char ch)\r
+{\r
+       return string + (TCHAR)ch;\r
+}\r
+\r
+inline CString __stdcall operator +(char ch, const CString& string)\r
+{\r
+       return (TCHAR)ch + string;\r
+}\r
+#endif // _UNICODE\r
+\r
+inline CString __stdcall operator +(const CString& string, LPCTSTR lpsz)\r
+{\r
+       ATLASSERT(lpsz == NULL || CString::_IsValidString(lpsz));\r
+       CString s;\r
+       s.ConcatCopy(string.GetData()->nDataLength, string.m_pchData, CString::SafeStrlen(lpsz), lpsz);\r
+       return s;\r
+}\r
+\r
+inline CString __stdcall operator +(LPCTSTR lpsz, const CString& string)\r
+{\r
+       ATLASSERT(lpsz == NULL || CString::_IsValidString(lpsz));\r
+       CString s;\r
+       s.ConcatCopy(CString::SafeStrlen(lpsz), lpsz, string.GetData()->nDataLength, string.m_pchData);\r
+       return s;\r
+}\r
+\r
+#endif // !_WTL_NO_CSTRING\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CRecentDocumentList - MRU List Support\r
+\r
+#ifndef _WIN32_WCE\r
+\r
+#ifndef _WTL_MRUEMPTY_TEXT\r
+  #define _WTL_MRUEMPTY_TEXT   _T("(empty)")\r
+#endif\r
+\r
+// forward declaration\r
+inline bool AtlCompactPath(LPTSTR lpstrOut, LPCTSTR lpstrIn, int cchLen);\r
+\r
+template <class T, int t_cchItemLen = MAX_PATH, int t_nFirstID = ID_FILE_MRU_FIRST, int t_nLastID = ID_FILE_MRU_LAST>\r
+class CRecentDocumentListBase\r
+{\r
+public:\r
+// Declarations\r
+       struct _DocEntry\r
+       {\r
+               TCHAR szDocName[t_cchItemLen];\r
+               bool operator ==(const _DocEntry& de) const\r
+               { return (lstrcmpi(szDocName, de.szDocName) == 0); }\r
+       };\r
+\r
+       enum\r
+       {\r
+               m_nMaxEntries_Min = 2,\r
+               m_nMaxEntries_Max = t_nLastID - t_nFirstID + 1,\r
+               m_cchMaxItemLen_Min = 6,\r
+               m_cchMaxItemLen_Max = t_cchItemLen,\r
+               m_cchItemNameLen = 11\r
+       };\r
+\r
+// Data members\r
+       ATL::CSimpleArray<_DocEntry> m_arrDocs;\r
+       int m_nMaxEntries;   // default is 4\r
+       HMENU m_hMenu;\r
+\r
+       TCHAR m_szNoEntries[t_cchItemLen];\r
+\r
+       int m_cchMaxItemLen;\r
+\r
+// Constructor\r
+       CRecentDocumentListBase() : m_hMenu(NULL), m_nMaxEntries(4), m_cchMaxItemLen(-1)\r
+       {\r
+               // These ASSERTs verify values of the template arguments\r
+               ATLASSERT(t_cchItemLen > m_cchMaxItemLen_Min);\r
+               ATLASSERT(m_nMaxEntries_Max > m_nMaxEntries_Min);\r
+       }\r
+\r
+// Attributes\r
+       HMENU GetMenuHandle() const\r
+       {\r
+               return m_hMenu;\r
+       }\r
+\r
+       void SetMenuHandle(HMENU hMenu)\r
+       {\r
+               ATLASSERT(hMenu == NULL || ::IsMenu(hMenu));\r
+               m_hMenu = hMenu;\r
+               if(m_hMenu == NULL || (::GetMenuString(m_hMenu, t_nFirstID, m_szNoEntries, t_cchItemLen, MF_BYCOMMAND) == 0))\r
+               {\r
+                       T* pT = static_cast<T*>(this);\r
+                       pT;   // avoid level 4 warning\r
+                       SecureHelper::strncpy_x(m_szNoEntries, _countof(m_szNoEntries), pT->GetMRUEmptyText(), _TRUNCATE);\r
+               }\r
+       }\r
+\r
+       int GetMaxEntries() const\r
+       {\r
+               return m_nMaxEntries;\r
+       }\r
+\r
+       void SetMaxEntries(int nMaxEntries)\r
+       {\r
+               ATLASSERT(nMaxEntries >= m_nMaxEntries_Min && nMaxEntries <= m_nMaxEntries_Max);\r
+               if(nMaxEntries < m_nMaxEntries_Min)\r
+                       nMaxEntries = m_nMaxEntries_Min;\r
+               else if(nMaxEntries > m_nMaxEntries_Max)\r
+                       nMaxEntries = m_nMaxEntries_Max;\r
+               m_nMaxEntries = nMaxEntries;\r
+       }\r
+\r
+       int GetMaxItemLength() const\r
+       {\r
+               return m_cchMaxItemLen;\r
+       }\r
+\r
+       void SetMaxItemLength(int cchMaxLen)\r
+       {\r
+               ATLASSERT((cchMaxLen >= m_cchMaxItemLen_Min && cchMaxLen <= m_cchMaxItemLen_Max) || cchMaxLen == -1);\r
+               if(cchMaxLen != -1)\r
+               {\r
+                       if(cchMaxLen < m_cchMaxItemLen_Min)\r
+                               cchMaxLen = m_cchMaxItemLen_Min;\r
+                       else if(cchMaxLen > m_cchMaxItemLen_Max)\r
+                               cchMaxLen = m_cchMaxItemLen_Max;\r
+               }\r
+               m_cchMaxItemLen = cchMaxLen;\r
+               T* pT = static_cast<T*>(this);\r
+               pT->UpdateMenu();\r
+       }\r
+\r
+// Operations\r
+       BOOL AddToList(LPCTSTR lpstrDocName)\r
+       {\r
+               _DocEntry de;\r
+               errno_t nRet = SecureHelper::strncpy_x(de.szDocName, _countof(de.szDocName), lpstrDocName, _TRUNCATE);\r
+               if(nRet != 0 && nRet != STRUNCATE)\r
+                       return FALSE;\r
+\r
+               for(int i = 0; i < m_arrDocs.GetSize(); i++)\r
+               {\r
+                       if(lstrcmpi(m_arrDocs[i].szDocName, lpstrDocName) == 0)\r
+                       {\r
+                               m_arrDocs.RemoveAt(i);\r
+                               break;\r
+                       }\r
+               }\r
+\r
+               if(m_arrDocs.GetSize() == m_nMaxEntries)\r
+                       m_arrDocs.RemoveAt(0);\r
+\r
+               BOOL bRet = m_arrDocs.Add(de);\r
+               if(bRet)\r
+               {\r
+                       T* pT = static_cast<T*>(this);\r
+                       bRet = pT->UpdateMenu();\r
+               }\r
+               return bRet;\r
+       }\r
+\r
+       // This function is deprecated because it is not safe. \r
+       // Use the version below that accepts the buffer length.\r
+#if (_MSC_VER >= 1300)\r
+       __declspec(deprecated)\r
+#endif\r
+       BOOL GetFromList(int /*nItemID*/, LPTSTR /*lpstrDocName*/)\r
+       {\r
+               ATLASSERT(FALSE);\r
+               return FALSE;\r
+       }\r
+\r
+       BOOL GetFromList(int nItemID, LPTSTR lpstrDocName, int cchLength)\r
+       {\r
+               int nIndex = m_arrDocs.GetSize() - (nItemID - t_nFirstID) - 1;\r
+               if(nIndex < 0 || nIndex >= m_arrDocs.GetSize())\r
+                       return FALSE;\r
+               if(lstrlen(m_arrDocs[nIndex].szDocName) >= cchLength)\r
+                       return FALSE;\r
+               SecureHelper::strcpy_x(lpstrDocName, cchLength, m_arrDocs[nIndex].szDocName);\r
+\r
+               return TRUE;\r
+       }\r
+\r
+#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)\r
+       BOOL GetFromList(int nItemID, _CSTRING_NS::CString& strDocName)\r
+       {\r
+               int nIndex = m_arrDocs.GetSize() - (nItemID - t_nFirstID) - 1;\r
+               if(nIndex < 0 || nIndex >= m_arrDocs.GetSize())\r
+                       return FALSE;\r
+               strDocName = m_arrDocs[nIndex].szDocName;\r
+               return TRUE;\r
+       }\r
+#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)\r
+\r
+       BOOL RemoveFromList(int nItemID)\r
+       {\r
+               int nIndex = m_arrDocs.GetSize() - (nItemID - t_nFirstID) - 1;\r
+               BOOL bRet = m_arrDocs.RemoveAt(nIndex);\r
+               if(bRet)\r
+               {\r
+                       T* pT = static_cast<T*>(this);\r
+                       bRet = pT->UpdateMenu();\r
+               }\r
+               return bRet;\r
+       }\r
+\r
+       BOOL MoveToTop(int nItemID)\r
+       {\r
+               int nIndex = m_arrDocs.GetSize() - (nItemID - t_nFirstID) - 1;\r
+               if(nIndex < 0 || nIndex >= m_arrDocs.GetSize())\r
+                       return FALSE;\r
+               _DocEntry de;\r
+               de = m_arrDocs[nIndex];\r
+               m_arrDocs.RemoveAt(nIndex);\r
+               BOOL bRet = m_arrDocs.Add(de);\r
+               if(bRet)\r
+               {\r
+                       T* pT = static_cast<T*>(this);\r
+                       bRet = pT->UpdateMenu();\r
+               }\r
+               return bRet;\r
+       }\r
+\r
+       BOOL ReadFromRegistry(LPCTSTR lpstrRegKey)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATL::CRegKey rkParent;\r
+               ATL::CRegKey rk;\r
+\r
+               LONG lRet = rkParent.Open(HKEY_CURRENT_USER, lpstrRegKey);\r
+               if(lRet != ERROR_SUCCESS)\r
+                       return FALSE;\r
+               lRet = rk.Open(rkParent, pT->GetRegKeyName());\r
+               if(lRet != ERROR_SUCCESS)\r
+                       return FALSE;\r
+\r
+               DWORD dwRet = 0;\r
+#if (_ATL_VER >= 0x0700)\r
+               lRet = rk.QueryDWORDValue(pT->GetRegCountName(), dwRet);\r
+#else\r
+               lRet = rk.QueryValue(dwRet, pT->GetRegCountName());\r
+#endif\r
+               if(lRet != ERROR_SUCCESS)\r
+                       return FALSE;\r
+               SetMaxEntries(dwRet);\r
+\r
+               m_arrDocs.RemoveAll();\r
+\r
+               TCHAR szRetString[t_cchItemLen] = { 0 };\r
+               _DocEntry de;\r
+\r
+               for(int nItem = m_nMaxEntries; nItem > 0; nItem--)\r
+               {\r
+                       TCHAR szBuff[m_cchItemNameLen] = { 0 };\r
+                       SecureHelper::wsprintf_x(szBuff, m_cchItemNameLen, pT->GetRegItemName(), nItem);\r
+#if (_ATL_VER >= 0x0700)\r
+                       ULONG ulCount = t_cchItemLen;\r
+                       lRet = rk.QueryStringValue(szBuff, szRetString, &ulCount);\r
+#else\r
+                       DWORD dwCount = t_cchItemLen * sizeof(TCHAR);\r
+                       lRet = rk.QueryValue(szRetString, szBuff, &dwCount);\r
+#endif\r
+                       if(lRet == ERROR_SUCCESS)\r
+                       {\r
+                               SecureHelper::strcpy_x(de.szDocName, _countof(de.szDocName), szRetString);\r
+                               m_arrDocs.Add(de);\r
+                       }\r
+               }\r
+\r
+               rk.Close();\r
+               rkParent.Close();\r
+\r
+               return pT->UpdateMenu();\r
+       }\r
+\r
+       BOOL WriteToRegistry(LPCTSTR lpstrRegKey)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               pT;   // avoid level 4 warning\r
+               ATL::CRegKey rkParent;\r
+               ATL::CRegKey rk;\r
+\r
+               LONG lRet = rkParent.Create(HKEY_CURRENT_USER, lpstrRegKey);\r
+               if(lRet != ERROR_SUCCESS)\r
+                       return FALSE;\r
+               lRet = rk.Create(rkParent, pT->GetRegKeyName());\r
+               if(lRet != ERROR_SUCCESS)\r
+                       return FALSE;\r
+\r
+#if (_ATL_VER >= 0x0700)\r
+               lRet = rk.SetDWORDValue(pT->GetRegCountName(), m_nMaxEntries);\r
+#else\r
+               lRet = rk.SetValue(m_nMaxEntries, pT->GetRegCountName());\r
+#endif\r
+               ATLASSERT(lRet == ERROR_SUCCESS);\r
+\r
+               // set new values\r
+               int nItem;\r
+               for(nItem = m_arrDocs.GetSize(); nItem > 0; nItem--)\r
+               {\r
+                       TCHAR szBuff[m_cchItemNameLen] = { 0 };\r
+                       SecureHelper::wsprintf_x(szBuff, m_cchItemNameLen, pT->GetRegItemName(), nItem);\r
+                       TCHAR szDocName[t_cchItemLen] = { 0 };\r
+                       GetFromList(t_nFirstID + nItem - 1, szDocName, t_cchItemLen);\r
+#if (_ATL_VER >= 0x0700)\r
+                       lRet = rk.SetStringValue(szBuff, szDocName);\r
+#else\r
+                       lRet = rk.SetValue(szDocName, szBuff);\r
+#endif\r
+                       ATLASSERT(lRet == ERROR_SUCCESS);\r
+               }\r
+\r
+               // delete unused keys\r
+               for(nItem = m_arrDocs.GetSize() + 1; nItem < m_nMaxEntries_Max; nItem++)\r
+               {\r
+                       TCHAR szBuff[m_cchItemNameLen] = { 0 };\r
+                       SecureHelper::wsprintf_x(szBuff, m_cchItemNameLen, pT->GetRegItemName(), nItem);\r
+                       rk.DeleteValue(szBuff);\r
+               }\r
+\r
+               rk.Close();\r
+               rkParent.Close();\r
+\r
+               return TRUE;\r
+       }\r
+\r
+// Implementation\r
+       BOOL UpdateMenu()\r
+       {\r
+               if(m_hMenu == NULL)\r
+                       return FALSE;\r
+               ATLASSERT(::IsMenu(m_hMenu));\r
+\r
+               int nItems = ::GetMenuItemCount(m_hMenu);\r
+               int nInsertPoint;\r
+               for(nInsertPoint = 0; nInsertPoint < nItems; nInsertPoint++)\r
+               {\r
+                       CMenuItemInfo mi;\r
+                       mi.fMask = MIIM_ID;\r
+                       ::GetMenuItemInfo(m_hMenu, nInsertPoint, TRUE, &mi);\r
+                       if (mi.wID == t_nFirstID)\r
+                               break;\r
+               }\r
+               ATLASSERT(nInsertPoint < nItems && "You need a menu item with an ID = t_nFirstID");\r
+\r
+               int nItem;\r
+               for(nItem = t_nFirstID; nItem < t_nFirstID + m_nMaxEntries; nItem++)\r
+               {\r
+                       // keep the first one as an insertion point\r
+                       if (nItem != t_nFirstID)\r
+                               ::DeleteMenu(m_hMenu, nItem, MF_BYCOMMAND);\r
+               }\r
+\r
+               TCHAR szItemText[t_cchItemLen + 6] = { 0 };   // add space for &, 2 digits, and a space\r
+               int nSize = m_arrDocs.GetSize();\r
+               nItem = 0;\r
+               if(nSize > 0)\r
+               {\r
+                       for(nItem = 0; nItem < nSize; nItem++)\r
+                       {\r
+                               if(m_cchMaxItemLen == -1)\r
+                               {\r
+                                       SecureHelper::wsprintf_x(szItemText, t_cchItemLen + 6, _T("&%i %s"), nItem + 1, m_arrDocs[nSize - 1 - nItem].szDocName);\r
+                               }\r
+                               else\r
+                               {\r
+                                       TCHAR szBuff[t_cchItemLen] = { 0 };\r
+                                       T* pT = static_cast<T*>(this);\r
+                                       pT;   // avoid level 4 warning\r
+                                       bool bRet = pT->CompactDocumentName(szBuff, m_arrDocs[nSize - 1 - nItem].szDocName, m_cchMaxItemLen);\r
+                                       bRet;   // avoid level 4 warning\r
+                                       ATLASSERT(bRet);\r
+                                       SecureHelper::wsprintf_x(szItemText, t_cchItemLen + 6, _T("&%i %s"), nItem + 1, szBuff);\r
+                               }\r
+                               ::InsertMenu(m_hMenu, nInsertPoint + nItem, MF_BYPOSITION | MF_STRING, t_nFirstID + nItem, szItemText);\r
+                       }\r
+               }\r
+               else    // empty\r
+               {\r
+                       ::InsertMenu(m_hMenu, nInsertPoint, MF_BYPOSITION | MF_STRING, t_nFirstID, m_szNoEntries);\r
+                       ::EnableMenuItem(m_hMenu, t_nFirstID, MF_GRAYED);\r
+                       nItem++;\r
+               }\r
+               ::DeleteMenu(m_hMenu, nInsertPoint + nItem, MF_BYPOSITION);\r
+\r
+               return TRUE;\r
+       }\r
+\r
+// Overrideables\r
+       // override to provide a different method of compacting document names\r
+       static bool CompactDocumentName(LPTSTR lpstrOut, LPCTSTR lpstrIn, int cchLen)\r
+       {\r
+               return AtlCompactPath(lpstrOut, lpstrIn, cchLen);\r
+       }\r
+\r
+       static LPCTSTR GetRegKeyName()\r
+       {\r
+               return _T("Recent Document List");\r
+       }\r
+\r
+       static LPCTSTR GetRegCountName()\r
+       {\r
+               return _T("DocumentCount");\r
+       }\r
+\r
+       static LPCTSTR GetRegItemName()\r
+       {\r
+               // Note: This string is a format string used with wsprintf().\r
+               // Resulting formatted string must be m_cchItemNameLen or less \r
+               // characters long, including the terminating null character.\r
+               return _T("Document%i");\r
+       }\r
+\r
+       static LPCTSTR GetMRUEmptyText()\r
+       {\r
+               return _WTL_MRUEMPTY_TEXT;\r
+       }\r
+};\r
+\r
+class CRecentDocumentList : public CRecentDocumentListBase<CRecentDocumentList>\r
+{\r
+public:\r
+// nothing here\r
+};\r
+\r
+#endif // _WIN32_WCE\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CFindFile - file search helper class\r
+\r
+class CFindFile\r
+{\r
+public:\r
+// Data members\r
+       WIN32_FIND_DATA m_fd;\r
+       TCHAR m_lpszRoot[MAX_PATH];\r
+       TCHAR m_chDirSeparator;\r
+       HANDLE m_hFind;\r
+       BOOL m_bFound;\r
+\r
+// Constructor/destructor\r
+       CFindFile() : m_hFind(NULL), m_chDirSeparator(_T('\\')), m_bFound(FALSE)\r
+       { }\r
+\r
+       ~CFindFile()\r
+       {\r
+               Close();\r
+       }\r
+\r
+// Attributes\r
+       ULONGLONG GetFileSize() const\r
+       {\r
+               ATLASSERT(m_hFind != NULL);\r
+\r
+               ULARGE_INTEGER nFileSize = { 0 };\r
+\r
+               if(m_bFound)\r
+               {\r
+                       nFileSize.LowPart = m_fd.nFileSizeLow;\r
+                       nFileSize.HighPart = m_fd.nFileSizeHigh;\r
+               }\r
+               else\r
+               {\r
+                       nFileSize.QuadPart = 0;\r
+               }\r
+\r
+               return nFileSize.QuadPart;\r
+       }\r
+\r
+       BOOL GetFileName(LPTSTR lpstrFileName, int cchLength) const\r
+       {\r
+               ATLASSERT(m_hFind != NULL);\r
+               if(lstrlen(m_fd.cFileName) >= cchLength)\r
+                       return FALSE;\r
+\r
+               if(m_bFound)\r
+                       SecureHelper::strcpy_x(lpstrFileName, cchLength, m_fd.cFileName);\r
+\r
+               return m_bFound;\r
+       }\r
+\r
+       BOOL GetFilePath(LPTSTR lpstrFilePath, int cchLength) const\r
+       {\r
+               ATLASSERT(m_hFind != NULL);\r
+\r
+               int nLen = lstrlen(m_lpszRoot);\r
+#ifndef _WIN32_WCE\r
+               ATLASSERT(nLen > 0);\r
+               if(nLen == 0)\r
+                       return FALSE;\r
+\r
+               bool bAddSep = (m_lpszRoot[nLen - 1] != _T('\\') && m_lpszRoot[nLen - 1] !=_T('/'));\r
+#else // CE specific\r
+               // allow diskless devices (nLen == 0)\r
+               bool bAddSep = ((nLen == 0) || (m_lpszRoot[nLen - 1] != _T('\\') && m_lpszRoot[nLen - 1] !=_T('/')));\r
+#endif // _WIN32_WCE\r
+\r
+               if((lstrlen(m_lpszRoot) + (bAddSep ?  1 : 0)) >= cchLength)\r
+                       return FALSE;\r
+\r
+               SecureHelper::strcpy_x(lpstrFilePath, cchLength, m_lpszRoot);\r
+\r
+               if(bAddSep)\r
+               {\r
+                       TCHAR szSeparator[2] = { m_chDirSeparator, 0 };\r
+                       SecureHelper::strcat_x(lpstrFilePath, cchLength, szSeparator);\r
+               }\r
+\r
+               SecureHelper::strcat_x(lpstrFilePath, cchLength, m_fd.cFileName);\r
+\r
+               return TRUE;\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       BOOL GetFileTitle(LPTSTR lpstrFileTitle, int cchLength) const\r
+       {\r
+               ATLASSERT(m_hFind != NULL);\r
+\r
+               TCHAR szBuff[MAX_PATH] = { 0 };\r
+               if(!GetFileName(szBuff, MAX_PATH))\r
+                       return FALSE;\r
+\r
+               if(lstrlen(szBuff) >= cchLength || cchLength < 1)\r
+                       return FALSE;\r
+\r
+               // find the last dot\r
+               LPTSTR pstrDot  = (LPTSTR)_cstrrchr(szBuff, _T('.'));\r
+               if(pstrDot != NULL)\r
+                       *pstrDot = 0;\r
+\r
+               SecureHelper::strcpy_x(lpstrFileTitle, cchLength, szBuff);\r
+\r
+               return TRUE;\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       BOOL GetFileURL(LPTSTR lpstrFileURL, int cchLength) const\r
+       {\r
+               ATLASSERT(m_hFind != NULL);\r
+\r
+               TCHAR szBuff[MAX_PATH] = { 0 };\r
+               if(!GetFilePath(szBuff, MAX_PATH))\r
+                       return FALSE;\r
+               LPCTSTR lpstrFileURLPrefix = _T("file://");\r
+               if(lstrlen(szBuff) + lstrlen(lpstrFileURLPrefix) >= cchLength)\r
+                       return FALSE;\r
+               SecureHelper::strcpy_x(lpstrFileURL, cchLength, lpstrFileURLPrefix);\r
+               SecureHelper::strcat_x(lpstrFileURL, cchLength, szBuff);\r
+\r
+               return TRUE;\r
+       }\r
+\r
+       BOOL GetRoot(LPTSTR lpstrRoot, int cchLength) const\r
+       {\r
+               ATLASSERT(m_hFind != NULL);\r
+               if(lstrlen(m_lpszRoot) >= cchLength)\r
+                       return FALSE;\r
+\r
+               SecureHelper::strcpy_x(lpstrRoot, cchLength, m_lpszRoot);\r
+\r
+               return TRUE;\r
+       }\r
+\r
+#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)\r
+       _CSTRING_NS::CString GetFileName() const\r
+       {\r
+               ATLASSERT(m_hFind != NULL);\r
+\r
+               _CSTRING_NS::CString ret;\r
+\r
+               if(m_bFound)\r
+                       ret = m_fd.cFileName;\r
+               return ret;\r
+       }\r
+\r
+       _CSTRING_NS::CString GetFilePath() const\r
+       {\r
+               ATLASSERT(m_hFind != NULL);\r
+\r
+               _CSTRING_NS::CString strResult = m_lpszRoot;\r
+               int nLen = strResult.GetLength();\r
+#ifndef _WIN32_WCE\r
+               ATLASSERT(nLen > 0);\r
+               if(nLen == 0)\r
+                       return strResult;\r
+\r
+               if((strResult[nLen - 1] != _T('\\')) && (strResult[nLen - 1] != _T('/')))\r
+#else // CE specific\r
+               // allow diskless devices (nLen == 0)\r
+               if((nLen == 0) || ((strResult[nLen - 1] != _T('\\')) && (strResult[nLen - 1] != _T('/'))))\r
+#endif // _WIN32_WCE\r
+                       strResult += m_chDirSeparator;\r
+               strResult += GetFileName();\r
+               return strResult;\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       _CSTRING_NS::CString GetFileTitle() const\r
+       {\r
+               ATLASSERT(m_hFind != NULL);\r
+\r
+               _CSTRING_NS::CString strResult;\r
+               GetFileTitle(strResult.GetBuffer(MAX_PATH), MAX_PATH);\r
+               strResult.ReleaseBuffer();\r
+\r
+               return strResult;\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       _CSTRING_NS::CString GetFileURL() const\r
+       {\r
+               ATLASSERT(m_hFind != NULL);\r
+\r
+               _CSTRING_NS::CString strResult("file://");\r
+               strResult += GetFilePath();\r
+               return strResult;\r
+       }\r
+\r
+       _CSTRING_NS::CString GetRoot() const\r
+       {\r
+               ATLASSERT(m_hFind != NULL);\r
+\r
+               _CSTRING_NS::CString str = m_lpszRoot;\r
+               return str;\r
+       }\r
+#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)\r
+\r
+       BOOL GetLastWriteTime(FILETIME* pTimeStamp) const\r
+       {\r
+               ATLASSERT(m_hFind != NULL);\r
+               ATLASSERT(pTimeStamp != NULL);\r
+\r
+               if(m_bFound && pTimeStamp != NULL)\r
+               {\r
+                       *pTimeStamp = m_fd.ftLastWriteTime;\r
+                       return TRUE;\r
+               }\r
+\r
+               return FALSE;\r
+       }\r
+\r
+       BOOL GetLastAccessTime(FILETIME* pTimeStamp) const\r
+       {\r
+               ATLASSERT(m_hFind != NULL);\r
+               ATLASSERT(pTimeStamp != NULL);\r
+\r
+               if(m_bFound && pTimeStamp != NULL)\r
+               {\r
+                       *pTimeStamp = m_fd.ftLastAccessTime;\r
+                       return TRUE;\r
+               }\r
+\r
+               return FALSE;\r
+       }\r
+\r
+       BOOL GetCreationTime(FILETIME* pTimeStamp) const\r
+       {\r
+               ATLASSERT(m_hFind != NULL);\r
+\r
+               if(m_bFound && pTimeStamp != NULL)\r
+               {\r
+                       *pTimeStamp = m_fd.ftCreationTime;\r
+                       return TRUE;\r
+               }\r
+\r
+               return FALSE;\r
+       }\r
+\r
+       BOOL MatchesMask(DWORD dwMask) const\r
+       {\r
+               ATLASSERT(m_hFind != NULL);\r
+\r
+               if(m_bFound)\r
+                       return ((m_fd.dwFileAttributes & dwMask) != 0);\r
+\r
+               return FALSE;\r
+       }\r
+\r
+       BOOL IsDots() const\r
+       {\r
+               ATLASSERT(m_hFind != NULL);\r
+\r
+               // return TRUE if the file name is "." or ".." and\r
+               // the file is a directory\r
+\r
+               BOOL bResult = FALSE;\r
+               if(m_bFound && IsDirectory())\r
+               {\r
+                       if(m_fd.cFileName[0] == _T('.') && (m_fd.cFileName[1] == _T('\0') || (m_fd.cFileName[1] == _T('.') && m_fd.cFileName[2] == _T('\0'))))\r
+                               bResult = TRUE;\r
+               }\r
+\r
+               return bResult;\r
+       }\r
+\r
+       BOOL IsReadOnly() const\r
+       {\r
+               return MatchesMask(FILE_ATTRIBUTE_READONLY);\r
+       }\r
+\r
+       BOOL IsDirectory() const\r
+       {\r
+               return MatchesMask(FILE_ATTRIBUTE_DIRECTORY);\r
+       }\r
+\r
+       BOOL IsCompressed() const\r
+       {\r
+               return MatchesMask(FILE_ATTRIBUTE_COMPRESSED);\r
+       }\r
+\r
+       BOOL IsSystem() const\r
+       {\r
+               return MatchesMask(FILE_ATTRIBUTE_SYSTEM);\r
+       }\r
+\r
+       BOOL IsHidden() const\r
+       {\r
+               return MatchesMask(FILE_ATTRIBUTE_HIDDEN);\r
+       }\r
+\r
+       BOOL IsTemporary() const\r
+       {\r
+               return MatchesMask(FILE_ATTRIBUTE_TEMPORARY);\r
+       }\r
+\r
+       BOOL IsNormal() const\r
+       {\r
+               return MatchesMask(FILE_ATTRIBUTE_NORMAL);\r
+       }\r
+\r
+       BOOL IsArchived() const\r
+       {\r
+               return MatchesMask(FILE_ATTRIBUTE_ARCHIVE);\r
+       }\r
+\r
+// Operations\r
+       BOOL FindFile(LPCTSTR pstrName = NULL)\r
+       {\r
+               Close();\r
+\r
+               if(pstrName == NULL)\r
+               {\r
+                       pstrName = _T("*.*");\r
+               }\r
+               else if(lstrlen(pstrName) >= MAX_PATH)\r
+               {\r
+                       ATLASSERT(FALSE);\r
+                       return FALSE;\r
+               }\r
+\r
+               SecureHelper::strcpy_x(m_fd.cFileName, _countof(m_fd.cFileName), pstrName);\r
+\r
+               m_hFind = ::FindFirstFile(pstrName, &m_fd);\r
+\r
+               if(m_hFind == INVALID_HANDLE_VALUE)\r
+                       return FALSE;\r
+\r
+#ifndef _WIN32_WCE\r
+               bool bFullPath = (::GetFullPathName(pstrName, MAX_PATH, m_lpszRoot, NULL) != 0);\r
+#else // CE specific\r
+               errno_t nRet = SecureHelper::strncpy_x(m_lpszRoot, _countof(m_lpszRoot), pstrName, _TRUNCATE);\r
+               bool bFullPath = (nRet == 0 || nRet == STRUNCATE);\r
+#endif // _WIN32_WCE\r
+\r
+               // passed name isn't a valid path but was found by the API\r
+               ATLASSERT(bFullPath);\r
+               if(!bFullPath)\r
+               {\r
+                       Close();\r
+                       ::SetLastError(ERROR_INVALID_NAME);\r
+                       return FALSE;\r
+               }\r
+               else\r
+               {\r
+                       // find the last forward or backward whack\r
+                       LPTSTR pstrBack  = (LPTSTR)_cstrrchr(m_lpszRoot, _T('\\'));\r
+                       LPTSTR pstrFront = (LPTSTR)_cstrrchr(m_lpszRoot, _T('/'));\r
+\r
+                       if(pstrFront != NULL || pstrBack != NULL)\r
+                       {\r
+                               if(pstrFront == NULL)\r
+                                       pstrFront = m_lpszRoot;\r
+                               if(pstrBack == NULL)\r
+                                       pstrBack = m_lpszRoot;\r
+\r
+                               // from the start to the last whack is the root\r
+\r
+                               if(pstrFront >= pstrBack)\r
+                                       *pstrFront = _T('\0');\r
+                               else\r
+                                       *pstrBack = _T('\0');\r
+                       }\r
+               }\r
+\r
+               m_bFound = TRUE;\r
+\r
+               return TRUE;\r
+       }\r
+\r
+       BOOL FindNextFile()\r
+       {\r
+               ATLASSERT(m_hFind != NULL);\r
+\r
+               if(m_hFind == NULL)\r
+                       return FALSE;\r
+\r
+               if(!m_bFound)\r
+                       return FALSE;\r
+\r
+               m_bFound = ::FindNextFile(m_hFind, &m_fd);\r
+\r
+               return m_bFound;\r
+       }\r
+\r
+       void Close()\r
+       {\r
+               m_bFound = FALSE;\r
+\r
+               if(m_hFind != NULL && m_hFind != INVALID_HANDLE_VALUE)\r
+               {\r
+                       ::FindClose(m_hFind);\r
+                       m_hFind = NULL;\r
+               }\r
+       }\r
+\r
+// Helper\r
+       static const TCHAR* _cstrrchr(const TCHAR* p, TCHAR ch)\r
+       {\r
+#ifdef _ATL_MIN_CRT\r
+               const TCHAR* lpsz = NULL;\r
+               while (*p != 0)\r
+               {\r
+                       if (*p == ch)\r
+                               lpsz = p;\r
+                       p = ::CharNext(p);\r
+               }\r
+               return lpsz;\r
+#else // !_ATL_MIN_CRT\r
+               return _tcsrchr(p, ch);\r
+#endif // !_ATL_MIN_CRT\r
+       }\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Global functions for loading resources\r
+\r
+inline HACCEL AtlLoadAccelerators(ATL::_U_STRINGorID table)\r
+{\r
+       return ::LoadAccelerators(ModuleHelper::GetResourceInstance(), table.m_lpstr);\r
+}\r
+\r
+inline HMENU AtlLoadMenu(ATL::_U_STRINGorID menu)\r
+{\r
+       return ::LoadMenu(ModuleHelper::GetResourceInstance(), menu.m_lpstr);\r
+}\r
+\r
+inline HBITMAP AtlLoadBitmap(ATL::_U_STRINGorID bitmap)\r
+{\r
+       return ::LoadBitmap(ModuleHelper::GetResourceInstance(), bitmap.m_lpstr);\r
+}\r
+\r
+#ifdef OEMRESOURCE\r
+inline HBITMAP AtlLoadSysBitmap(ATL::_U_STRINGorID bitmap)\r
+{\r
+#ifdef _DEBUG\r
+       WORD wID = (WORD)bitmap.m_lpstr;\r
+       ATLASSERT(wID >= 32734 && wID <= 32767);\r
+#endif // _DEBUG\r
+       return ::LoadBitmap(NULL, bitmap.m_lpstr);\r
+}\r
+#endif // OEMRESOURCE\r
+\r
+inline HCURSOR AtlLoadCursor(ATL::_U_STRINGorID cursor)\r
+{\r
+       return ::LoadCursor(ModuleHelper::GetResourceInstance(), cursor.m_lpstr);\r
+}\r
+\r
+inline HCURSOR AtlLoadSysCursor(LPCTSTR lpCursorName)\r
+{\r
+#if (WINVER >= 0x0500)\r
+       ATLASSERT(lpCursorName == IDC_ARROW || lpCursorName == IDC_IBEAM || lpCursorName == IDC_WAIT ||\r
+               lpCursorName == IDC_CROSS || lpCursorName == IDC_UPARROW || lpCursorName == IDC_SIZE ||\r
+               lpCursorName == IDC_ICON || lpCursorName == IDC_SIZENWSE || lpCursorName == IDC_SIZENESW ||\r
+               lpCursorName == IDC_SIZEWE || lpCursorName == IDC_SIZENS || lpCursorName == IDC_SIZEALL ||\r
+               lpCursorName == IDC_NO || lpCursorName == IDC_APPSTARTING || lpCursorName == IDC_HELP ||\r
+               lpCursorName == IDC_HAND);\r
+#else // !(WINVER >= 0x0500)\r
+       ATLASSERT(lpCursorName == IDC_ARROW || lpCursorName == IDC_IBEAM || lpCursorName == IDC_WAIT ||\r
+               lpCursorName == IDC_CROSS || lpCursorName == IDC_UPARROW || lpCursorName == IDC_SIZE ||\r
+               lpCursorName == IDC_ICON || lpCursorName == IDC_SIZENWSE || lpCursorName == IDC_SIZENESW ||\r
+               lpCursorName == IDC_SIZEWE || lpCursorName == IDC_SIZENS || lpCursorName == IDC_SIZEALL ||\r
+               lpCursorName == IDC_NO || lpCursorName == IDC_APPSTARTING || lpCursorName == IDC_HELP);\r
+#endif // !(WINVER >= 0x0500)\r
+       return ::LoadCursor(NULL, lpCursorName);\r
+}\r
+\r
+inline HICON AtlLoadIcon(ATL::_U_STRINGorID icon)\r
+{\r
+       return ::LoadIcon(ModuleHelper::GetResourceInstance(), icon.m_lpstr);\r
+}\r
+\r
+#ifndef _WIN32_WCE\r
+inline HICON AtlLoadSysIcon(LPCTSTR lpIconName)\r
+{\r
+#if (WINVER >= 0x0600)\r
+       ATLASSERT(lpIconName == IDI_APPLICATION || lpIconName == IDI_ASTERISK || lpIconName == IDI_EXCLAMATION ||\r
+                 lpIconName == IDI_HAND || lpIconName == IDI_QUESTION || lpIconName == IDI_WINLOGO ||\r
+                 lpIconName == IDI_SHIELD);\r
+#else // !(WINVER >= 0x0600)\r
+       ATLASSERT(lpIconName == IDI_APPLICATION || lpIconName == IDI_ASTERISK || lpIconName == IDI_EXCLAMATION ||\r
+                 lpIconName == IDI_HAND || lpIconName == IDI_QUESTION || lpIconName == IDI_WINLOGO);\r
+#endif // !(WINVER >= 0x0600)\r
+       return ::LoadIcon(NULL, lpIconName);\r
+}\r
+#endif // !_WIN32_WCE\r
+\r
+inline HBITMAP AtlLoadBitmapImage(ATL::_U_STRINGorID bitmap, UINT fuLoad = LR_DEFAULTCOLOR)\r
+{\r
+       return (HBITMAP)::LoadImage(ModuleHelper::GetResourceInstance(), bitmap.m_lpstr, IMAGE_BITMAP, 0, 0, fuLoad);\r
+}\r
+\r
+inline HCURSOR AtlLoadCursorImage(ATL::_U_STRINGorID cursor, UINT fuLoad = LR_DEFAULTCOLOR | LR_DEFAULTSIZE, int cxDesired = 0, int cyDesired = 0)\r
+{\r
+       return (HCURSOR)::LoadImage(ModuleHelper::GetResourceInstance(), cursor.m_lpstr, IMAGE_CURSOR, cxDesired, cyDesired, fuLoad);\r
+}\r
+\r
+inline HICON AtlLoadIconImage(ATL::_U_STRINGorID icon, UINT fuLoad = LR_DEFAULTCOLOR | LR_DEFAULTSIZE, int cxDesired = 0, int cyDesired = 0)\r
+{\r
+       return (HICON)::LoadImage(ModuleHelper::GetResourceInstance(), icon.m_lpstr, IMAGE_ICON, cxDesired, cyDesired, fuLoad);\r
+}\r
+\r
+#ifdef OEMRESOURCE\r
+inline HBITMAP AtlLoadSysBitmapImage(WORD wBitmapID, UINT fuLoad = LR_DEFAULTCOLOR)\r
+{\r
+       ATLASSERT(wBitmapID >= 32734 && wBitmapID <= 32767);\r
+       ATLASSERT((fuLoad & LR_LOADFROMFILE) == 0);   // this one doesn't load from a file\r
+       return (HBITMAP)::LoadImage(NULL, MAKEINTRESOURCE(wBitmapID), IMAGE_BITMAP, 0, 0, fuLoad);\r
+}\r
+#endif // OEMRESOURCE\r
+\r
+inline HCURSOR AtlLoadSysCursorImage(ATL::_U_STRINGorID cursor, UINT fuLoad = LR_DEFAULTCOLOR | LR_DEFAULTSIZE, int cxDesired = 0, int cyDesired = 0)\r
+{\r
+#ifdef _DEBUG\r
+       WORD wID = (WORD)cursor.m_lpstr;\r
+       ATLASSERT((wID >= 32512 && wID <= 32516) || (wID >= 32640 && wID <= 32648) || (wID == 32650) || (wID == 32651));\r
+       ATLASSERT((fuLoad & LR_LOADFROMFILE) == 0);   // this one doesn't load from a file\r
+#endif // _DEBUG\r
+       return (HCURSOR)::LoadImage(NULL, cursor.m_lpstr, IMAGE_CURSOR, cxDesired, cyDesired, fuLoad);\r
+}\r
+\r
+inline HICON AtlLoadSysIconImage(ATL::_U_STRINGorID icon, UINT fuLoad = LR_DEFAULTCOLOR | LR_DEFAULTSIZE, int cxDesired = 0, int cyDesired = 0)\r
+{\r
+#ifdef _DEBUG\r
+       WORD wID = (WORD)icon.m_lpstr;\r
+       ATLASSERT(wID >= 32512 && wID <= 32517);\r
+       ATLASSERT((fuLoad & LR_LOADFROMFILE) == 0);   // this one doesn't load from a file\r
+#endif // _DEBUG\r
+       return (HICON)::LoadImage(NULL, icon.m_lpstr, IMAGE_ICON, cxDesired, cyDesired, fuLoad);\r
+}\r
+\r
+#if (_ATL_VER < 0x0700)\r
+inline int AtlLoadString(UINT uID, LPTSTR lpBuffer, int nBufferMax)\r
+{\r
+       return ::LoadString(_Module.GetResourceInstance(), uID, lpBuffer, nBufferMax);\r
+}\r
+#endif // (_ATL_VER < 0x0700)\r
+\r
+#ifdef _WIN32_WCE // CE only direct access to the resource\r
+inline LPCTSTR AtlLoadString(UINT uID)\r
+{\r
+       LPCTSTR s = (LPCTSTR)::LoadString(ModuleHelper::GetResourceInstance(), uID, NULL, 0);\r
+#ifdef DEBUG // Check for null-termination\r
+       if(s != NULL)\r
+               // Note: RC -n <file.rc> compiles null-terminated resource strings\r
+               ATLASSERT(s[*((WORD*)s -1) - 1] == L'\0');\r
+#endif\r
+       return s;\r
+}\r
+#endif // _WIN32_WCE\r
+\r
+inline bool AtlLoadString(UINT uID, BSTR& bstrText)\r
+{\r
+       USES_CONVERSION;\r
+       ATLASSERT(bstrText == NULL);\r
+\r
+       LPTSTR lpstrText = NULL;\r
+       int nRes = 0;\r
+       for(int nLen = 256; ; nLen *= 2)\r
+       {\r
+               ATLTRY(lpstrText = new TCHAR[nLen]);\r
+               if(lpstrText == NULL)\r
+                       break;\r
+               nRes = ::LoadString(ModuleHelper::GetResourceInstance(), uID, lpstrText, nLen);\r
+               if(nRes < nLen - 1)\r
+                       break;\r
+               delete [] lpstrText;\r
+               lpstrText = NULL;\r
+       }\r
+\r
+       if(lpstrText != NULL)\r
+       {\r
+               if(nRes != 0)\r
+                       bstrText = ::SysAllocString(T2OLE(lpstrText));\r
+               delete [] lpstrText;\r
+       }\r
+\r
+       return (bstrText != NULL) ? true : false;\r
+}\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Global functions for stock GDI objects\r
+\r
+inline HPEN AtlGetStockPen(int nPen)\r
+{\r
+#if (_WIN32_WINNT >= 0x0500) && !defined(_WIN32_WCE)\r
+       ATLASSERT(nPen == WHITE_PEN || nPen == BLACK_PEN || nPen == NULL_PEN || nPen == DC_PEN);\r
+#else\r
+       ATLASSERT(nPen == WHITE_PEN || nPen == BLACK_PEN || nPen == NULL_PEN);\r
+#endif\r
+       return (HPEN)::GetStockObject(nPen);\r
+}\r
+\r
+inline HBRUSH AtlGetStockBrush(int nBrush)\r
+{\r
+#if (_WIN32_WINNT >= 0x0500) && !defined(_WIN32_WCE)\r
+       ATLASSERT((nBrush >= WHITE_BRUSH && nBrush <= HOLLOW_BRUSH) || nBrush == DC_BRUSH);\r
+#else\r
+       ATLASSERT(nBrush >= WHITE_BRUSH && nBrush <= HOLLOW_BRUSH);\r
+#endif\r
+       return (HBRUSH)::GetStockObject(nBrush);\r
+}\r
+\r
+inline HFONT AtlGetStockFont(int nFont)\r
+{\r
+#ifndef _WIN32_WCE\r
+       ATLASSERT((nFont >= OEM_FIXED_FONT && nFont <= SYSTEM_FIXED_FONT) || nFont == DEFAULT_GUI_FONT);\r
+#else // CE specific\r
+       ATLASSERT(nFont == SYSTEM_FONT);\r
+#endif // _WIN32_WCE\r
+       return (HFONT)::GetStockObject(nFont);\r
+}\r
+\r
+inline HPALETTE AtlGetStockPalette(int nPalette)\r
+{\r
+       ATLASSERT(nPalette == DEFAULT_PALETTE); // the only one supported\r
+       return (HPALETTE)::GetStockObject(nPalette);\r
+}\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Global function for compacting a path by replacing parts with ellipsis\r
+\r
+// helper for multi-byte character sets\r
+inline bool _IsDBCSTrailByte(LPCTSTR lpstr, int nChar)\r
+{\r
+#ifndef _UNICODE\r
+       int i = nChar;\r
+       for( ; i > 0; i--)\r
+       {\r
+               if(!::IsDBCSLeadByte(lpstr[i - 1]))\r
+                       break;\r
+       }\r
+       return ((nChar > 0) && (((nChar - i) & 1) != 0));\r
+#else // _UNICODE\r
+       lpstr; nChar;\r
+       return false;\r
+#endif // _UNICODE\r
+}\r
+\r
+inline bool AtlCompactPath(LPTSTR lpstrOut, LPCTSTR lpstrIn, int cchLen)\r
+{\r
+       ATLASSERT(lpstrOut != NULL);\r
+       ATLASSERT(lpstrIn != NULL);\r
+       ATLASSERT(cchLen > 0);\r
+\r
+       LPCTSTR szEllipsis = _T("...");\r
+       const int cchEndEllipsis = 3;\r
+       const int cchMidEllipsis = 4;\r
+\r
+       if(lstrlen(lpstrIn) < cchLen)\r
+       {\r
+               SecureHelper::strcpy_x(lpstrOut, cchLen, lpstrIn);\r
+               return true;\r
+       }\r
+\r
+       lpstrOut[0] = 0;\r
+\r
+       // check if the separator is a slash or a backslash\r
+       TCHAR chSlash = _T('\\');\r
+       for(LPTSTR lpstr = (LPTSTR)lpstrIn; *lpstr != 0; lpstr = ::CharNext(lpstr))\r
+       {\r
+               if((*lpstr == _T('/')) || (*lpstr == _T('\\')))\r
+                       chSlash = *lpstr;\r
+       }\r
+\r
+       // find the filename portion of the path\r
+       LPCTSTR lpstrFileName = lpstrIn;\r
+       for(LPCTSTR pPath = lpstrIn; *pPath; pPath = ::CharNext(pPath))\r
+       {\r
+               if((pPath[0] == _T('\\') || pPath[0] == _T(':') || pPath[0] == _T('/'))\r
+                               && pPath[1] && pPath[1] != _T('\\') && pPath[1] != _T('/'))\r
+                       lpstrFileName = pPath + 1;\r
+       }\r
+       int cchFileName = lstrlen(lpstrFileName);\r
+\r
+       // handle just the filename without a path\r
+       if(lpstrFileName == lpstrIn && cchLen > cchEndEllipsis)\r
+       {\r
+               bool bRet = (SecureHelper::strncpy_x(lpstrOut, cchLen, lpstrIn, cchLen - cchEndEllipsis - 1) == 0);\r
+               if(bRet)\r
+               {\r
+#ifndef _UNICODE\r
+                       if(_IsDBCSTrailByte(lpstrIn, cchLen - cchEndEllipsis))\r
+                               lpstrOut[cchLen - cchEndEllipsis - 1] = 0;\r
+#endif // _UNICODE\r
+                       SecureHelper::strcat_x(lpstrOut, cchLen, szEllipsis);\r
+               }\r
+               return bRet;\r
+       }\r
+\r
+       // handle just ellipsis\r
+       if((cchLen < (cchMidEllipsis + cchEndEllipsis)))\r
+       {\r
+               for(int i = 0; i < cchLen - 1; i++)\r
+                       lpstrOut[i] = ((i + 1) == cchMidEllipsis) ? chSlash : _T('.');\r
+               lpstrOut[cchLen - 1] = 0;\r
+               return true;\r
+       }\r
+\r
+       // calc how much we have to copy\r
+       int cchToCopy = cchLen - (cchMidEllipsis + cchFileName) - 1;\r
+\r
+       if(cchToCopy < 0)\r
+               cchToCopy = 0;\r
+\r
+#ifndef _UNICODE\r
+       if(cchToCopy > 0 && _IsDBCSTrailByte(lpstrIn, cchToCopy))\r
+               cchToCopy--;\r
+#endif // _UNICODE\r
+\r
+       bool bRet = (SecureHelper::strncpy_x(lpstrOut, cchLen, lpstrIn, cchToCopy) == 0);\r
+       if(!bRet)\r
+               return false;\r
+\r
+       // add ellipsis\r
+       SecureHelper::strcat_x(lpstrOut, cchLen, szEllipsis);\r
+       if(!bRet)\r
+               return false;\r
+       TCHAR szSlash[2] = { chSlash, 0 };\r
+       SecureHelper::strcat_x(lpstrOut, cchLen, szSlash);\r
+       if(!bRet)\r
+               return false;\r
+\r
+       // add filename (and ellipsis, if needed)\r
+       if(cchLen > (cchMidEllipsis + cchFileName))\r
+       {\r
+               SecureHelper::strcat_x(lpstrOut, cchLen, lpstrFileName);\r
+       }\r
+       else\r
+       {\r
+               cchToCopy = cchLen - cchMidEllipsis - cchEndEllipsis - 1;\r
+#ifndef _UNICODE\r
+               if(cchToCopy > 0 && _IsDBCSTrailByte(lpstrFileName, cchToCopy))\r
+                       cchToCopy--;\r
+#endif // _UNICODE\r
+               bRet = (SecureHelper::strncpy_x(&lpstrOut[cchMidEllipsis], cchLen - cchMidEllipsis, lpstrFileName, cchToCopy) == 0);\r
+               if(bRet)\r
+                       SecureHelper::strcat_x(lpstrOut, cchLen, szEllipsis);\r
+       }\r
+\r
+       return bRet;\r
+}\r
+\r
+}; // namespace WTL\r
+\r
+#endif // __ATLMISC_H__\r
diff --git a/WTL80/include/atlprint.h b/WTL80/include/atlprint.h
new file mode 100644 (file)
index 0000000..fed9a3f
--- /dev/null
@@ -0,0 +1,1113 @@
+// Windows Template Library - WTL version 8.0\r
+// Copyright (C) Microsoft Corporation. All rights reserved.\r
+//\r
+// This file is a part of the Windows Template Library.\r
+// The use and distribution terms for this software are covered by the\r
+// Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php)\r
+// which can be found in the file CPL.TXT at the root of this distribution.\r
+// By using this software in any fashion, you are agreeing to be bound by\r
+// the terms of this license. You must not remove this notice, or\r
+// any other, from this software.\r
+\r
+#ifndef __ATLPRINT_H__\r
+#define __ATLPRINT_H__\r
+\r
+#pragma once\r
+\r
+#ifndef __cplusplus\r
+       #error ATL requires C++ compilation (use a .cpp suffix)\r
+#endif\r
+\r
+#ifdef _WIN32_WCE\r
+       #error atlprint.h is not supported on Windows CE\r
+#endif\r
+\r
+#ifndef __ATLAPP_H__\r
+       #error atlprint.h requires atlapp.h to be included first\r
+#endif\r
+\r
+#ifndef __ATLWIN_H__\r
+       #error atlprint.h requires atlwin.h to be included first\r
+#endif\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Classes in this file:\r
+//\r
+// CPrinterInfo<t_nInfo>\r
+// CPrinterT<t_bManaged>\r
+// CDevModeT<t_bManaged>\r
+// CPrinterDC\r
+// CPrintJobInfo\r
+// CPrintJob\r
+// CPrintPreview\r
+// CPrintPreviewWindowImpl<T, TBase, TWinTraits>\r
+// CPrintPreviewWindow\r
+// CZoomPrintPreviewWindowImpl<T, TBase, TWinTraits>\r
+// CZoomPrintPreviewWindow\r
+\r
+namespace WTL\r
+{\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CPrinterInfo - This class wraps all of the PRINTER_INFO_* structures\r
+//                and provided by ::GetPrinter.\r
+\r
+template <unsigned int t_nInfo>\r
+class _printer_info\r
+{\r
+public:\r
+       typedef void infotype;\r
+};\r
+\r
+template <> class _printer_info<1> { public: typedef PRINTER_INFO_1 infotype; };\r
+template <> class _printer_info<2> { public: typedef PRINTER_INFO_2 infotype; };\r
+template <> class _printer_info<3> { public: typedef PRINTER_INFO_3 infotype; };\r
+template <> class _printer_info<4> { public: typedef PRINTER_INFO_4 infotype; };\r
+template <> class _printer_info<5> { public: typedef PRINTER_INFO_5 infotype; };\r
+template <> class _printer_info<6> { public: typedef PRINTER_INFO_6 infotype; };\r
+template <> class _printer_info<7> { public: typedef PRINTER_INFO_7 infotype; };\r
+// these are not in the old (vc6.0) headers\r
+#ifdef _ATL_USE_NEW_PRINTER_INFO\r
+template <> class _printer_info<8> { public: typedef PRINTER_INFO_8 infotype; };\r
+template <> class _printer_info<9> { public: typedef PRINTER_INFO_9 infotype; };\r
+#endif // _ATL_USE_NEW_PRINTER_INFO\r
+\r
+\r
+template <unsigned int t_nInfo>\r
+class CPrinterInfo\r
+{\r
+public:\r
+// Data members\r
+       typename _printer_info<t_nInfo>::infotype* m_pi;\r
+\r
+// Constructor/destructor\r
+       CPrinterInfo() : m_pi(NULL)\r
+       { }\r
+\r
+       CPrinterInfo(HANDLE hPrinter) : m_pi(NULL)\r
+       {\r
+               GetPrinterInfo(hPrinter);\r
+       }\r
+\r
+       ~CPrinterInfo()\r
+       {\r
+               Cleanup();\r
+       }\r
+\r
+// Operations\r
+       bool GetPrinterInfo(HANDLE hPrinter)\r
+       {\r
+               Cleanup();\r
+               return GetPrinterInfoHelper(hPrinter, (BYTE**)&m_pi, t_nInfo);\r
+       }\r
+\r
+// Implementation\r
+       void Cleanup()\r
+       {\r
+               delete [] (BYTE*)m_pi;\r
+               m_pi = NULL;\r
+       }\r
+\r
+       static bool GetPrinterInfoHelper(HANDLE hPrinter, BYTE** pi, int nIndex)\r
+       {\r
+               ATLASSERT(pi != NULL);\r
+               DWORD dw = 0;\r
+               BYTE* pb = NULL;\r
+               ::GetPrinter(hPrinter, nIndex, NULL, 0, &dw);\r
+               if (dw > 0)\r
+               {\r
+                       ATLTRY(pb = new BYTE[dw]);\r
+                       if (pb != NULL)\r
+                       {\r
+                               memset(pb, 0, dw);\r
+                               DWORD dwNew;\r
+                               if (!::GetPrinter(hPrinter, nIndex, pb, dw, &dwNew))\r
+                               {\r
+                                       delete [] pb;\r
+                                       pb = NULL;\r
+                               }\r
+                       }\r
+               }\r
+               *pi = pb;\r
+               return (pb != NULL);\r
+       }\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CPrinter - Wrapper class for a HANDLE to a printer\r
+\r
+template <bool t_bManaged>\r
+class CPrinterT\r
+{\r
+public:\r
+// Data members\r
+       HANDLE m_hPrinter;\r
+\r
+// Constructor/destructor\r
+       CPrinterT(HANDLE hPrinter = NULL) : m_hPrinter(hPrinter)\r
+       { }\r
+\r
+       ~CPrinterT()\r
+       {\r
+               ClosePrinter();\r
+       }\r
+\r
+// Operations\r
+       CPrinterT& operator =(HANDLE hPrinter)\r
+       {\r
+               if (hPrinter != m_hPrinter)\r
+               {\r
+                       ClosePrinter();\r
+                       m_hPrinter = hPrinter;\r
+               }\r
+               return *this;\r
+       }\r
+\r
+       bool IsNull() const { return (m_hPrinter == NULL); }\r
+\r
+       bool OpenPrinter(HANDLE hDevNames, const DEVMODE* pDevMode = NULL)\r
+       {\r
+               bool b = false;\r
+               DEVNAMES* pdn = (DEVNAMES*)::GlobalLock(hDevNames);\r
+               if (pdn != NULL)\r
+               {\r
+                       LPTSTR lpszPrinterName = (LPTSTR)pdn + pdn->wDeviceOffset;\r
+                       b = OpenPrinter(lpszPrinterName, pDevMode);\r
+                       ::GlobalUnlock(hDevNames);\r
+               }\r
+               return b;\r
+       }\r
+\r
+       bool OpenPrinter(LPCTSTR lpszPrinterName, const DEVMODE* pDevMode = NULL)\r
+       {\r
+               ClosePrinter();\r
+               PRINTER_DEFAULTS pdefs = { NULL, (DEVMODE*)pDevMode, PRINTER_ACCESS_USE };\r
+               ::OpenPrinter((LPTSTR) lpszPrinterName, &m_hPrinter, (pDevMode == NULL) ? NULL : &pdefs);\r
+\r
+               return (m_hPrinter != NULL);\r
+       }\r
+\r
+       bool OpenPrinter(LPCTSTR lpszPrinterName, PRINTER_DEFAULTS* pprintdefs)\r
+       {\r
+               ClosePrinter();\r
+               ::OpenPrinter((LPTSTR) lpszPrinterName, &m_hPrinter, pprintdefs);\r
+               return (m_hPrinter != NULL);\r
+       }\r
+\r
+       bool OpenDefaultPrinter(const DEVMODE* pDevMode = NULL)\r
+       {\r
+               ClosePrinter();\r
+               const int cchBuff = 512;\r
+               TCHAR buffer[cchBuff];\r
+               buffer[0] = 0;\r
+               ::GetProfileString(_T("windows"), _T("device"), _T(",,,"), buffer, cchBuff);\r
+               int nLen = lstrlen(buffer);\r
+               if (nLen != 0)\r
+               {\r
+                       LPTSTR lpsz = buffer;\r
+                       while (*lpsz)\r
+                       {\r
+                               if (*lpsz == _T(','))\r
+                               {\r
+                                       *lpsz = 0;\r
+                                       break;\r
+                               }\r
+                               lpsz = CharNext(lpsz);\r
+                       }\r
+                       PRINTER_DEFAULTS pdefs = { NULL, (DEVMODE*)pDevMode, PRINTER_ACCESS_USE };\r
+                       ::OpenPrinter(buffer, &m_hPrinter, (pDevMode == NULL) ? NULL : &pdefs);\r
+               }\r
+               return m_hPrinter != NULL;\r
+       }\r
+\r
+       void ClosePrinter()\r
+       {\r
+               if (m_hPrinter != NULL)\r
+               {\r
+                       if (t_bManaged)\r
+                               ::ClosePrinter(m_hPrinter);\r
+                       m_hPrinter = NULL;\r
+               }\r
+       }\r
+\r
+       bool PrinterProperties(HWND hWnd = NULL)\r
+       {\r
+               if (hWnd == NULL)\r
+                       hWnd = ::GetActiveWindow();\r
+               return !!::PrinterProperties(hWnd, m_hPrinter);\r
+       }\r
+\r
+       HANDLE CopyToHDEVNAMES() const\r
+       {\r
+               HANDLE h = NULL;\r
+               CPrinterInfo<5> pinfon5;\r
+               CPrinterInfo<2> pinfon2;\r
+               LPTSTR lpszPrinterName = NULL;\r
+               // Some printers fail for PRINTER_INFO_5 in some situations\r
+               if (pinfon5.GetPrinterInfo(m_hPrinter))\r
+                       lpszPrinterName = pinfon5.m_pi->pPrinterName;\r
+               else if (pinfon2.GetPrinterInfo(m_hPrinter))\r
+                       lpszPrinterName = pinfon2.m_pi->pPrinterName;\r
+               if (lpszPrinterName != NULL)\r
+               {\r
+                       int nLen = sizeof(DEVNAMES) + (lstrlen(lpszPrinterName) + 1) * sizeof(TCHAR);\r
+                       h = ::GlobalAlloc(GMEM_MOVEABLE, nLen);\r
+                       BYTE* pv = (BYTE*)::GlobalLock(h);\r
+                       DEVNAMES* pdev = (DEVNAMES*)pv;\r
+                       if (pv != NULL)\r
+                       {\r
+                               memset(pv, 0, nLen);\r
+                               pdev->wDeviceOffset = sizeof(DEVNAMES) / sizeof(TCHAR);\r
+                               pv = pv + sizeof(DEVNAMES); // now points to end\r
+                               SecureHelper::strcpy_x((LPTSTR)pv, lstrlen(lpszPrinterName) + 1, lpszPrinterName);\r
+                               ::GlobalUnlock(h);\r
+                       }\r
+               }\r
+               return h;\r
+       }\r
+\r
+       HDC CreatePrinterDC(const DEVMODE* pdm = NULL) const\r
+       {\r
+               CPrinterInfo<5> pinfo5;\r
+               CPrinterInfo<2> pinfo2;\r
+               HDC hDC = NULL;\r
+               LPTSTR lpszPrinterName = NULL;\r
+               // Some printers fail for PRINTER_INFO_5 in some situations\r
+               if (pinfo5.GetPrinterInfo(m_hPrinter))\r
+                       lpszPrinterName = pinfo5.m_pi->pPrinterName;\r
+               else if (pinfo2.GetPrinterInfo(m_hPrinter))\r
+                       lpszPrinterName = pinfo2.m_pi->pPrinterName;\r
+               if (lpszPrinterName != NULL)\r
+                       hDC = ::CreateDC(NULL, lpszPrinterName, NULL, pdm);\r
+               return hDC;\r
+       }\r
+\r
+       HDC CreatePrinterIC(const DEVMODE* pdm = NULL) const\r
+       {\r
+               CPrinterInfo<5> pinfo5;\r
+               CPrinterInfo<2> pinfo2;\r
+               HDC hDC = NULL;\r
+               LPTSTR lpszPrinterName = NULL;\r
+               // Some printers fail for PRINTER_INFO_5 in some situations\r
+               if (pinfo5.GetPrinterInfo(m_hPrinter))\r
+                       lpszPrinterName = pinfo5.m_pi->pPrinterName;\r
+               else if (pinfo2.GetPrinterInfo(m_hPrinter))\r
+                       lpszPrinterName = pinfo2.m_pi->pPrinterName;\r
+               if (lpszPrinterName != NULL)\r
+                       hDC = ::CreateIC(NULL, lpszPrinterName, NULL, pdm);\r
+               return hDC;\r
+       }\r
+\r
+       void Attach(HANDLE hPrinter)\r
+       {\r
+               ClosePrinter();\r
+               m_hPrinter = hPrinter;\r
+       }\r
+\r
+       HANDLE Detach()\r
+       {\r
+               HANDLE hPrinter = m_hPrinter;\r
+               m_hPrinter = NULL;\r
+               return hPrinter;\r
+       }\r
+\r
+       operator HANDLE() const { return m_hPrinter; }\r
+};\r
+\r
+typedef CPrinterT<false>   CPrinterHandle;\r
+typedef CPrinterT<true>    CPrinter;\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CDevMode - Wrapper class for DEVMODE\r
+\r
+template <bool t_bManaged>\r
+class CDevModeT\r
+{\r
+public:\r
+// Data members\r
+       HANDLE m_hDevMode;\r
+       DEVMODE* m_pDevMode;\r
+\r
+// Constructor/destructor\r
+       CDevModeT(HANDLE hDevMode = NULL) : m_hDevMode(hDevMode)\r
+       {\r
+               m_pDevMode = (m_hDevMode != NULL) ? (DEVMODE*)::GlobalLock(m_hDevMode) : NULL;\r
+       }\r
+\r
+       ~CDevModeT()\r
+       {\r
+               Cleanup();\r
+       }\r
+\r
+// Operations\r
+       CDevModeT<t_bManaged>& operator =(HANDLE hDevMode)\r
+       {\r
+               Attach(hDevMode);\r
+               return *this;\r
+       }\r
+\r
+       void Attach(HANDLE hDevModeNew)\r
+       {\r
+               Cleanup();\r
+               m_hDevMode = hDevModeNew;\r
+               m_pDevMode = (m_hDevMode != NULL) ? (DEVMODE*)::GlobalLock(m_hDevMode) : NULL;\r
+       }\r
+\r
+       HANDLE Detach()\r
+       {\r
+               if (m_hDevMode != NULL)\r
+                       ::GlobalUnlock(m_hDevMode);\r
+               HANDLE hDevMode = m_hDevMode;\r
+               m_hDevMode = NULL;\r
+               return hDevMode;\r
+       }\r
+\r
+       bool IsNull() const { return (m_hDevMode == NULL); }\r
+\r
+       bool CopyFromPrinter(HANDLE hPrinter)\r
+       {\r
+               CPrinterInfo<2> pinfo;\r
+               bool b = pinfo.GetPrinterInfo(hPrinter);\r
+               if (b)\r
+                b = CopyFromDEVMODE(pinfo.m_pi->pDevMode);\r
+               return b;\r
+       }\r
+\r
+       bool CopyFromDEVMODE(const DEVMODE* pdm)\r
+       {\r
+               if (pdm == NULL)\r
+                       return false;\r
+               int nSize = pdm->dmSize + pdm->dmDriverExtra;\r
+               HANDLE h = ::GlobalAlloc(GMEM_MOVEABLE, nSize);\r
+               if (h != NULL)\r
+               {\r
+                       void* p = ::GlobalLock(h);\r
+                       SecureHelper::memcpy_x(p, nSize, pdm, nSize);\r
+                       ::GlobalUnlock(h);\r
+               }\r
+               Attach(h);\r
+               return (h != NULL);\r
+       }\r
+\r
+       bool CopyFromHDEVMODE(HANDLE hdm)\r
+       {\r
+               bool b = false;\r
+               if (hdm != NULL)\r
+               {\r
+                       DEVMODE* pdm = (DEVMODE*)::GlobalLock(hdm);\r
+                       b = CopyFromDEVMODE(pdm);\r
+                       ::GlobalUnlock(hdm);\r
+               }\r
+               return b;\r
+       }\r
+\r
+       HANDLE CopyToHDEVMODE()\r
+       {\r
+               if ((m_hDevMode == NULL) || (m_pDevMode == NULL))\r
+                       return NULL;\r
+               int nSize = m_pDevMode->dmSize + m_pDevMode->dmDriverExtra;\r
+               HANDLE h = ::GlobalAlloc(GMEM_MOVEABLE, nSize);\r
+               if (h != NULL)\r
+               {\r
+                       void* p = ::GlobalLock(h);\r
+                       SecureHelper::memcpy_x(p, nSize, m_pDevMode, nSize);\r
+                       ::GlobalUnlock(h);\r
+               }\r
+               return h;\r
+       }\r
+\r
+       // If this devmode was for another printer, this will create a new devmode\r
+       // based on the existing devmode, but retargeted at the new printer\r
+       bool UpdateForNewPrinter(HANDLE hPrinter)\r
+       {\r
+               bool bRet = false;\r
+               LONG nLen = ::DocumentProperties(NULL, hPrinter, NULL, NULL, NULL, 0);\r
+               CTempBuffer<DEVMODE, _WTL_STACK_ALLOC_THRESHOLD> buff;\r
+               DEVMODE* pdm = buff.AllocateBytes(nLen);\r
+               if(pdm != NULL)\r
+               {\r
+                       memset(pdm, 0, nLen);\r
+                       LONG l = ::DocumentProperties(NULL, hPrinter, NULL, pdm, m_pDevMode, DM_IN_BUFFER | DM_OUT_BUFFER);\r
+                       if (l == IDOK)\r
+                               bRet = CopyFromDEVMODE(pdm);\r
+               }\r
+\r
+               return bRet;\r
+       }\r
+\r
+       bool DocumentProperties(HANDLE hPrinter, HWND hWnd = NULL)\r
+       {\r
+               CPrinterInfo<1> pi;\r
+               pi.GetPrinterInfo(hPrinter);\r
+               if (hWnd == NULL)\r
+                       hWnd = ::GetActiveWindow();\r
+\r
+               bool bRet = false;\r
+               LONG nLen = ::DocumentProperties(hWnd, hPrinter, pi.m_pi->pName, NULL, NULL, 0);\r
+               CTempBuffer<DEVMODE, _WTL_STACK_ALLOC_THRESHOLD> buff;\r
+               DEVMODE* pdm = buff.AllocateBytes(nLen);\r
+               if(pdm != NULL)\r
+               {\r
+                       memset(pdm, 0, nLen);\r
+                       LONG l = ::DocumentProperties(hWnd, hPrinter, pi.m_pi->pName, pdm, m_pDevMode, DM_IN_BUFFER | DM_OUT_BUFFER | DM_PROMPT);\r
+                       if (l == IDOK)\r
+                               bRet = CopyFromDEVMODE(pdm);\r
+               }\r
+\r
+               return bRet;\r
+       }\r
+\r
+       operator HANDLE() const { return m_hDevMode; }\r
+\r
+       operator DEVMODE*() const { return m_pDevMode; }\r
+\r
+// Implementation\r
+       void Cleanup()\r
+       {\r
+               if (m_hDevMode != NULL)\r
+               {\r
+                       ::GlobalUnlock(m_hDevMode);\r
+                       if(t_bManaged)\r
+                               ::GlobalFree(m_hDevMode);\r
+                       m_hDevMode = NULL;\r
+               }\r
+       }\r
+};\r
+\r
+typedef CDevModeT<false>   CDevModeHandle;\r
+typedef CDevModeT<true>    CDevMode;\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CPrinterDC\r
+\r
+class CPrinterDC : public CDC\r
+{\r
+public:\r
+// Constructors/destructor\r
+       CPrinterDC()\r
+       {\r
+               CPrinter printer;\r
+               printer.OpenDefaultPrinter();\r
+               Attach(printer.CreatePrinterDC());\r
+               ATLASSERT(m_hDC != NULL);\r
+       }\r
+\r
+       CPrinterDC(HANDLE hPrinter, const DEVMODE* pdm = NULL)\r
+       {\r
+               CPrinterHandle p;\r
+               p.Attach(hPrinter);\r
+               Attach(p.CreatePrinterDC(pdm));\r
+               ATLASSERT(m_hDC != NULL);\r
+       }\r
+\r
+       ~CPrinterDC()\r
+       {\r
+               DeleteDC();\r
+       }\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CPrintJob - Wraps a set of tasks for a specific printer (StartDoc/EndDoc)\r
+//             Handles aborting, background printing\r
+\r
+// Defines callbacks used by CPrintJob (not a COM interface)\r
+class ATL_NO_VTABLE IPrintJobInfo\r
+{\r
+public:\r
+       virtual void BeginPrintJob(HDC hDC) = 0;                // allocate handles needed, etc.\r
+       virtual void EndPrintJob(HDC hDC, bool bAborted) = 0;   // free handles, etc.\r
+       virtual void PrePrintPage(UINT nPage, HDC hDC) = 0;\r
+       virtual bool PrintPage(UINT nPage, HDC hDC) = 0;\r
+       virtual void PostPrintPage(UINT nPage, HDC hDC) = 0;\r
+       // If you want per page devmodes, return the DEVMODE* to use for nPage.\r
+       // You can optimize by only returning a new DEVMODE* when it is different\r
+       // from the one for nLastPage, otherwise return NULL.\r
+       // When nLastPage==0, the current DEVMODE* will be the default passed to\r
+       // StartPrintJob.\r
+       // Note: During print preview, nLastPage will always be "0".\r
+       virtual DEVMODE* GetNewDevModeForPage(UINT nLastPage, UINT nPage) = 0;\r
+       virtual bool IsValidPage(UINT nPage) = 0;\r
+};\r
+\r
+// Provides a default implementatin for IPrintJobInfo\r
+// Typically, MI'd into a document or view class\r
+class ATL_NO_VTABLE CPrintJobInfo : public IPrintJobInfo\r
+{\r
+public:\r
+       virtual void BeginPrintJob(HDC /*hDC*/)   // allocate handles needed, etc\r
+       {\r
+       }\r
+\r
+       virtual void EndPrintJob(HDC /*hDC*/, bool /*bAborted*/)   // free handles, etc\r
+       {\r
+       }\r
+\r
+       virtual void PrePrintPage(UINT /*nPage*/, HDC hDC)\r
+       {\r
+               m_nPJState = ::SaveDC(hDC);\r
+       }\r
+\r
+       virtual bool PrintPage(UINT /*nPage*/, HDC /*hDC*/) = 0;\r
+\r
+       virtual void PostPrintPage(UINT /*nPage*/, HDC hDC)\r
+       {\r
+               RestoreDC(hDC, m_nPJState);\r
+       }\r
+\r
+       virtual DEVMODE* GetNewDevModeForPage(UINT /*nLastPage*/, UINT /*nPage*/)\r
+       {\r
+               return NULL;\r
+       }\r
+\r
+       virtual bool IsValidPage(UINT /*nPage*/)\r
+       {\r
+               return true;\r
+       }\r
+\r
+// Implementation - data\r
+       int m_nPJState;\r
+};\r
+\r
+\r
+class CPrintJob\r
+{\r
+public:\r
+// Data members\r
+       CPrinterHandle m_printer;\r
+       IPrintJobInfo* m_pInfo;\r
+       DEVMODE* m_pDefDevMode;\r
+       DOCINFO m_docinfo;\r
+       int m_nJobID;\r
+       bool m_bCancel;\r
+       bool m_bComplete;\r
+       unsigned long m_nStartPage;\r
+       unsigned long m_nEndPage;\r
+\r
+// Constructor/destructor\r
+       CPrintJob() : m_nJobID(0), m_bCancel(false), m_bComplete(true)\r
+       { }\r
+\r
+       ~CPrintJob()\r
+       {\r
+               ATLASSERT(IsJobComplete()); // premature destruction?\r
+       }\r
+\r
+// Operations\r
+       bool IsJobComplete() const\r
+       {\r
+               return m_bComplete;\r
+       }\r
+\r
+       bool StartPrintJob(bool bBackground, HANDLE hPrinter, DEVMODE* pDefaultDevMode,\r
+                       IPrintJobInfo* pInfo, LPCTSTR lpszDocName, \r
+                       unsigned long nStartPage, unsigned long nEndPage,\r
+                       bool bPrintToFile = false, LPCTSTR lpstrOutputFile = NULL)\r
+       {\r
+               ATLASSERT(m_bComplete); // previous job not done yet?\r
+               if (pInfo == NULL)\r
+                       return false;\r
+\r
+               memset(&m_docinfo, 0, sizeof(m_docinfo));\r
+               m_docinfo.cbSize = sizeof(m_docinfo);\r
+               m_docinfo.lpszDocName = lpszDocName;\r
+               m_pInfo = pInfo;\r
+               m_nStartPage = nStartPage;\r
+               m_nEndPage = nEndPage;\r
+               m_printer.Attach(hPrinter);\r
+               m_pDefDevMode = pDefaultDevMode;\r
+               m_bComplete = false;\r
+\r
+               if(bPrintToFile)\r
+                       m_docinfo.lpszOutput = (lpstrOutputFile != NULL) ? lpstrOutputFile : _T("FILE:");\r
+\r
+               if (!bBackground)\r
+               {\r
+                       m_bComplete = true;\r
+                       return StartHelper();\r
+               }\r
+\r
+               // Create a thread and return\r
+               DWORD dwThreadID = 0;\r
+#if !defined(_ATL_MIN_CRT) && defined(_MT)\r
+               HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, (UINT (WINAPI*)(void*))StartProc, this, 0, (UINT*)&dwThreadID);\r
+#else\r
+               HANDLE hThread = ::CreateThread(NULL, 0, StartProc, (void*)this, 0, &dwThreadID);\r
+#endif\r
+               if (hThread == NULL)\r
+                       return false;\r
+\r
+               ::CloseHandle(hThread);\r
+\r
+               return true;\r
+       }\r
+\r
+// Implementation\r
+       static DWORD WINAPI StartProc(void* p)\r
+       {\r
+               CPrintJob* pThis = (CPrintJob*)p;\r
+               pThis->StartHelper();\r
+               pThis->m_bComplete = true;\r
+               return 0;\r
+       }\r
+\r
+       bool StartHelper()\r
+       {\r
+               CDC dcPrinter;\r
+               dcPrinter.Attach(m_printer.CreatePrinterDC(m_pDefDevMode));\r
+               if (dcPrinter.IsNull())\r
+                       return false;\r
+                       \r
+               m_nJobID = ::StartDoc(dcPrinter, &m_docinfo);\r
+               if (m_nJobID <= 0)\r
+                       return false;\r
+\r
+               m_pInfo->BeginPrintJob(dcPrinter);\r
+\r
+               // print all the pages now\r
+               unsigned long nLastPage = 0;\r
+               for (unsigned long nPage = m_nStartPage; nPage <= m_nEndPage; nPage++)\r
+               {\r
+                       if (!m_pInfo->IsValidPage(nPage))\r
+                               break;\r
+                       DEVMODE* pdm = m_pInfo->GetNewDevModeForPage(nLastPage, nPage);\r
+                       if (pdm != NULL)\r
+                               dcPrinter.ResetDC(pdm);\r
+                       dcPrinter.StartPage();\r
+                       m_pInfo->PrePrintPage(nPage, dcPrinter);\r
+                       if (!m_pInfo->PrintPage(nPage, dcPrinter))\r
+                               m_bCancel = true;\r
+                       m_pInfo->PostPrintPage(nPage, dcPrinter);\r
+                       dcPrinter.EndPage();\r
+                       if (m_bCancel)\r
+                               break;\r
+                       nLastPage = nPage;\r
+               }\r
+\r
+               m_pInfo->EndPrintJob(dcPrinter, m_bCancel);\r
+               if (m_bCancel)\r
+                       ::AbortDoc(dcPrinter);\r
+               else\r
+                       ::EndDoc(dcPrinter);\r
+               m_nJobID = 0;\r
+               return true;\r
+       }\r
+\r
+       // Cancels a print job. Can be called asynchronously.\r
+       void CancelPrintJob()\r
+       {\r
+               m_bCancel = true;\r
+       }\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CPrintPreview - Adds print preview support to an existing window\r
+\r
+class CPrintPreview\r
+{\r
+public:\r
+// Data members\r
+       IPrintJobInfo* m_pInfo;\r
+       CPrinterHandle m_printer;\r
+       CEnhMetaFile m_meta;\r
+       DEVMODE* m_pDefDevMode;\r
+       DEVMODE* m_pCurDevMode;\r
+       SIZE m_sizeCurPhysOffset;\r
+\r
+// Constructor\r
+       CPrintPreview() : m_pInfo(NULL), m_pDefDevMode(NULL), m_pCurDevMode(NULL)\r
+       {\r
+               m_sizeCurPhysOffset.cx = 0;\r
+               m_sizeCurPhysOffset.cy = 0;\r
+       }\r
+\r
+// Operations\r
+       void SetPrintPreviewInfo(HANDLE hPrinter, DEVMODE* pDefaultDevMode, IPrintJobInfo* pji)\r
+       {\r
+               m_printer.Attach(hPrinter);\r
+               m_pDefDevMode = pDefaultDevMode;\r
+               m_pInfo = pji;\r
+               m_nCurPage = 0;\r
+               m_pCurDevMode = NULL;\r
+       }\r
+\r
+       void SetEnhMetaFile(HENHMETAFILE hEMF)\r
+       {\r
+               m_meta = hEMF;\r
+       }\r
+\r
+       void SetPage(int nPage)\r
+       {\r
+               if (!m_pInfo->IsValidPage(nPage))\r
+                       return;\r
+               m_nCurPage = nPage;\r
+               m_pCurDevMode = m_pInfo->GetNewDevModeForPage(0, nPage);\r
+               if (m_pCurDevMode == NULL)\r
+                       m_pCurDevMode = m_pDefDevMode;\r
+               CDC dcPrinter = m_printer.CreatePrinterDC(m_pCurDevMode);\r
+\r
+               int iWidth = dcPrinter.GetDeviceCaps(PHYSICALWIDTH); \r
+               int iHeight = dcPrinter.GetDeviceCaps(PHYSICALHEIGHT); \r
+               int nLogx = dcPrinter.GetDeviceCaps(LOGPIXELSX);\r
+               int nLogy = dcPrinter.GetDeviceCaps(LOGPIXELSY);\r
+\r
+               RECT rcMM = { 0, 0, ::MulDiv(iWidth, 2540, nLogx), ::MulDiv(iHeight, 2540, nLogy) };\r
+\r
+               m_sizeCurPhysOffset.cx = dcPrinter.GetDeviceCaps(PHYSICALOFFSETX);\r
+               m_sizeCurPhysOffset.cy = dcPrinter.GetDeviceCaps(PHYSICALOFFSETY);\r
+               \r
+               CEnhMetaFileDC dcMeta(dcPrinter, &rcMM);\r
+               m_pInfo->PrePrintPage(nPage, dcMeta);\r
+               m_pInfo->PrintPage(nPage, dcMeta);\r
+               m_pInfo->PostPrintPage(nPage, dcMeta);\r
+               m_meta.Attach(dcMeta.Close());\r
+       }\r
+\r
+       void GetPageRect(RECT& rc, LPRECT prc)\r
+       {\r
+               int x1 = rc.right-rc.left;\r
+               int y1 = rc.bottom - rc.top;\r
+               if ((x1 < 0) || (y1 < 0))\r
+                       return;\r
+\r
+               CEnhMetaFileInfo emfinfo(m_meta);\r
+               ENHMETAHEADER* pmh = emfinfo.GetEnhMetaFileHeader();\r
+\r
+               // Compute whether we are OK vertically or horizontally\r
+               int x2 = pmh->szlDevice.cx;\r
+               int y2 = pmh->szlDevice.cy;\r
+               int y1p = MulDiv(x1, y2, x2);\r
+               int x1p = MulDiv(y1, x2, y2);\r
+               ATLASSERT((x1p <= x1) || (y1p <= y1));\r
+               if (x1p <= x1)\r
+               {\r
+                       prc->left = rc.left + (x1 - x1p) / 2;\r
+                       prc->right = prc->left + x1p;\r
+                       prc->top = rc.top;\r
+                       prc->bottom = rc.bottom;\r
+               }\r
+               else\r
+               {\r
+                       prc->left = rc.left;\r
+                       prc->right = rc.right;\r
+                       prc->top = rc.top + (y1 - y1p) / 2;\r
+                       prc->bottom = prc->top + y1p;\r
+               }\r
+       }\r
+\r
+// Painting helpers\r
+       void DoPaint(CDCHandle dc)\r
+       {\r
+               // this one is not used\r
+       }\r
+\r
+       void DoPaint(CDCHandle dc, RECT& rc)\r
+       {\r
+               CEnhMetaFileInfo emfinfo(m_meta);\r
+               ENHMETAHEADER* pmh = emfinfo.GetEnhMetaFileHeader();\r
+               int nOffsetX = MulDiv(m_sizeCurPhysOffset.cx, rc.right-rc.left, pmh->szlDevice.cx);\r
+               int nOffsetY = MulDiv(m_sizeCurPhysOffset.cy, rc.bottom-rc.top, pmh->szlDevice.cy);\r
+\r
+               dc.OffsetWindowOrg(-nOffsetX, -nOffsetY);\r
+               dc.PlayMetaFile(m_meta, &rc);\r
+       }\r
+\r
+// Implementation - data\r
+       int m_nCurPage;\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CPrintPreviewWindow - Implements a print preview window\r
+\r
+template <class T, class TBase = ATL::CWindow, class TWinTraits = ATL::CControlWinTraits>\r
+class ATL_NO_VTABLE CPrintPreviewWindowImpl : public ATL::CWindowImpl<T, TBase, TWinTraits>, public CPrintPreview\r
+{\r
+public:\r
+       DECLARE_WND_CLASS_EX(NULL, CS_VREDRAW | CS_HREDRAW, -1)\r
+\r
+       enum { m_cxOffset = 10, m_cyOffset = 10 };\r
+\r
+// Constructor\r
+       CPrintPreviewWindowImpl() : m_nMaxPage(0), m_nMinPage(0)\r
+       { }\r
+\r
+// Operations\r
+       void SetPrintPreviewInfo(HANDLE hPrinter, DEVMODE* pDefaultDevMode, \r
+               IPrintJobInfo* pji, int nMinPage, int nMaxPage)\r
+       {\r
+               CPrintPreview::SetPrintPreviewInfo(hPrinter, pDefaultDevMode, pji);\r
+               m_nMinPage = nMinPage;\r
+               m_nMaxPage = nMaxPage;\r
+       }\r
+\r
+       bool NextPage()\r
+       {\r
+               if (m_nCurPage == m_nMaxPage)\r
+                       return false;\r
+               SetPage(m_nCurPage + 1);\r
+               Invalidate();\r
+               return true;\r
+       }\r
+\r
+       bool PrevPage()\r
+       {\r
+               if (m_nCurPage == m_nMinPage)\r
+                       return false;\r
+               if (m_nCurPage == 0)\r
+                       return false;\r
+               SetPage(m_nCurPage - 1);\r
+               Invalidate();\r
+               return true;\r
+       }\r
+\r
+// Message map and handlers\r
+       BEGIN_MSG_MAP(CPrintPreviewWindowImpl)\r
+               MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBkgnd)\r
+               MESSAGE_HANDLER(WM_PAINT, OnPaint)\r
+               MESSAGE_HANDLER(WM_PRINTCLIENT, OnPaint)\r
+       END_MSG_MAP()\r
+\r
+       LRESULT OnEraseBkgnd(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)\r
+       {\r
+               return 1;   // no need for the background\r
+       }\r
+\r
+       LRESULT OnPaint(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               RECT rc = { 0 };\r
+\r
+               if(wParam != NULL)\r
+               {\r
+                       pT->DoPrePaint((HDC)wParam, rc);\r
+                       pT->DoPaint((HDC)wParam, rc);\r
+               }\r
+               else\r
+               {\r
+                       CPaintDC dc(m_hWnd);\r
+                       pT->DoPrePaint(dc.m_hDC, rc);\r
+                       pT->DoPaint(dc.m_hDC, rc);\r
+               }\r
+\r
+               return 0;\r
+       }\r
+\r
+// Painting helper\r
+       void DoPrePaint(CDCHandle dc, RECT& rc)\r
+       {\r
+               RECT rcClient = { 0 };\r
+               GetClientRect(&rcClient);\r
+               RECT rcArea = rcClient;\r
+               T* pT = static_cast<T*>(this);\r
+               pT;   // avoid level 4 warning\r
+               ::InflateRect(&rcArea, -pT->m_cxOffset, -pT->m_cyOffset);\r
+               if (rcArea.left > rcArea.right)\r
+                       rcArea.right = rcArea.left;\r
+               if (rcArea.top > rcArea.bottom)\r
+                       rcArea.bottom = rcArea.top;\r
+               GetPageRect(rcArea, &rc);\r
+               CRgn rgn1, rgn2;\r
+               rgn1.CreateRectRgnIndirect(&rc);\r
+               rgn2.CreateRectRgnIndirect(&rcClient);\r
+               rgn2.CombineRgn(rgn1, RGN_DIFF);\r
+               dc.SelectClipRgn(rgn2);\r
+               dc.FillRect(&rcClient, COLOR_BTNSHADOW);\r
+               dc.SelectClipRgn(NULL);\r
+               dc.FillRect(&rc, (HBRUSH)::GetStockObject(WHITE_BRUSH));\r
+       }\r
+\r
+// Implementation - data\r
+       int m_nMinPage;\r
+       int m_nMaxPage;\r
+};\r
+\r
+\r
+class CPrintPreviewWindow : public CPrintPreviewWindowImpl<CPrintPreviewWindow>\r
+{\r
+public:\r
+       DECLARE_WND_CLASS_EX(_T("WTL_PrintPreview"), CS_VREDRAW | CS_HREDRAW, -1)\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CZoomPrintPreviewWindowImpl - Implements print preview window with zooming\r
+\r
+#ifdef __ATLSCRL_H__\r
+\r
+template <class T, class TBase = ATL::CWindow, class TWinTraits = ATL::CControlWinTraits>\r
+class ATL_NO_VTABLE CZoomPrintPreviewWindowImpl : public CPrintPreviewWindowImpl< T, TBase, TWinTraits >, public CZoomScrollImpl< T >\r
+{\r
+public:\r
+       bool m_bSized;\r
+\r
+       CZoomPrintPreviewWindowImpl()  \r
+       {\r
+               SetScrollExtendedStyle(SCRL_DISABLENOSCROLL);\r
+               InitZoom();\r
+       }\r
+\r
+       // should be called to reset data members before recreating window \r
+       void InitZoom()\r
+       {\r
+               m_bSized = false;       \r
+               m_nZoomMode = ZOOMMODE_OFF;\r
+               m_fZoomScaleMin = 1.0;\r
+               m_fZoomScale = 1.0;\r
+       }\r
+\r
+       BEGIN_MSG_MAP(CZoomPrintPreviewWindowImpl)\r
+               MESSAGE_HANDLER(WM_SETCURSOR, CZoomScrollImpl< T >::OnSetCursor)\r
+               MESSAGE_HANDLER(WM_VSCROLL, CScrollImpl< T >::OnVScroll)\r
+               MESSAGE_HANDLER(WM_HSCROLL, CScrollImpl< T >::OnHScroll)\r
+               MESSAGE_HANDLER(WM_MOUSEWHEEL, CScrollImpl< T >::OnMouseWheel)\r
+#if !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400))\r
+               MESSAGE_HANDLER(m_uMsgMouseWheel, CScrollImpl< T >::OnMouseWheel)\r
+#endif // !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400))\r
+               MESSAGE_HANDLER(WM_SETTINGCHANGE, CScrollImpl< T >::OnSettingChange)\r
+               MESSAGE_HANDLER(WM_LBUTTONDOWN, CZoomScrollImpl< T >::OnLButtonDown)\r
+               MESSAGE_HANDLER(WM_MOUSEMOVE, CZoomScrollImpl< T >::OnMouseMove)\r
+               MESSAGE_HANDLER(WM_LBUTTONUP, CZoomScrollImpl< T >::OnLButtonUp)\r
+               MESSAGE_HANDLER(WM_CAPTURECHANGED, CZoomScrollImpl< T >::OnCaptureChanged)\r
+               MESSAGE_HANDLER(WM_SIZE, OnSize)\r
+               MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBkgnd)\r
+               MESSAGE_HANDLER(WM_PAINT, OnPaint)\r
+               MESSAGE_HANDLER(WM_PRINTCLIENT, OnPaint)\r
+       ALT_MSG_MAP(1)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_UP, CScrollImpl< T >::OnScrollUp)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_DOWN, CScrollImpl< T >::OnScrollDown)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_PAGE_UP, CScrollImpl< T >::OnScrollPageUp)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_PAGE_DOWN, CScrollImpl< T >::OnScrollPageDown)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_TOP, CScrollImpl< T >::OnScrollTop)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_BOTTOM, CScrollImpl< T >::OnScrollBottom)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_LEFT, CScrollImpl< T >::OnScrollLeft)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_RIGHT, CScrollImpl< T >::OnScrollRight)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_PAGE_LEFT, CScrollImpl< T >::OnScrollPageLeft)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_PAGE_RIGHT, CScrollImpl< T >::OnScrollPageRight)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_ALL_LEFT, CScrollImpl< T >::OnScrollAllLeft)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_ALL_RIGHT, CScrollImpl< T >::OnScrollAllRight)\r
+       END_MSG_MAP()\r
+       \r
+       LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)\r
+       {\r
+               SIZE sizeClient = {GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)};\r
+               POINT ptOffset = m_ptOffset;\r
+               SIZE sizeAll = m_sizeAll;\r
+               SetScrollSize(sizeClient);\r
+               if(sizeAll.cx > 0)\r
+                       ptOffset.x = ::MulDiv(ptOffset.x, m_sizeAll.cx, sizeAll.cx);\r
+               if(sizeAll.cy > 0)\r
+                       ptOffset.y = ::MulDiv(ptOffset.y, m_sizeAll.cy, sizeAll.cy);\r
+               SetScrollOffset(ptOffset);\r
+               CScrollImpl< T >::OnSize(uMsg, wParam, lParam, bHandled);\r
+               if(!m_bSized)\r
+               {\r
+                       m_bSized = true;\r
+                       T* pT = static_cast<T*>(this);\r
+                       pT->ShowScrollBar(SB_HORZ, TRUE);\r
+                       pT->ShowScrollBar(SB_VERT, TRUE);\r
+               }\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnEraseBkgnd(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)\r
+       {\r
+               return 1;\r
+       }\r
+\r
+       LRESULT OnPaint(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               RECT rc = { 0 };\r
+\r
+               if(wParam != NULL)\r
+               {\r
+                       CDCHandle dc = (HDC)wParam;\r
+                       int nMapModeSav = dc.GetMapMode();\r
+                       dc.SetMapMode(MM_ANISOTROPIC);\r
+                       SIZE szWindowExt = { 0, 0 };\r
+                       dc.SetWindowExt(m_sizeLogAll, &szWindowExt);\r
+                       SIZE szViewportExt = { 0, 0 };\r
+                       dc.SetViewportExt(m_sizeAll, &szViewportExt);\r
+                       POINT ptViewportOrg = { 0, 0 };\r
+                       dc.SetViewportOrg(-m_ptOffset.x, -m_ptOffset.y, &ptViewportOrg);\r
+\r
+                       pT->DoPrePaint(dc, rc);\r
+                       pT->DoPaint(dc, rc);\r
+\r
+                       dc.SetMapMode(nMapModeSav);\r
+                       dc.SetWindowExt(szWindowExt);\r
+                       dc.SetViewportExt(szViewportExt);\r
+                       dc.SetViewportOrg(ptViewportOrg);\r
+               }\r
+               else\r
+               {\r
+                       CPaintDC dc(pT->m_hWnd);\r
+                       pT->PrepareDC(dc.m_hDC);\r
+                       pT->DoPrePaint(dc.m_hDC, rc);\r
+                       pT->DoPaint(dc.m_hDC, rc);\r
+               }\r
+\r
+               return 0;\r
+       }\r
+\r
+       // Painting helpers\r
+       void DoPaint(CDCHandle dc)\r
+       {\r
+               // this one is not used\r
+       }\r
+\r
+       void DoPrePaint(CDCHandle dc, RECT& rc)\r
+       {\r
+               RECT rcClient;\r
+               GetClientRect(&rcClient);\r
+               RECT rcArea = rcClient;\r
+               T* pT = static_cast<T*>(this);\r
+               pT;   // avoid level 4 warning\r
+               ::InflateRect(&rcArea, -pT->m_cxOffset, -pT->m_cyOffset);\r
+               if (rcArea.left > rcArea.right)\r
+                       rcArea.right = rcArea.left;\r
+               if (rcArea.top > rcArea.bottom)\r
+                       rcArea.bottom = rcArea.top;\r
+               GetPageRect(rcArea, &rc);\r
+               HBRUSH hbrOld = dc.SelectBrush(::GetSysColorBrush(COLOR_BTNSHADOW));\r
+               dc.PatBlt(rcClient.left, rcClient.top, rc.left - rcClient.left, rcClient.bottom - rcClient.top, PATCOPY);\r
+               dc.PatBlt(rc.left, rcClient.top, rc.right - rc.left, rc.top - rcClient.top, PATCOPY);\r
+               dc.PatBlt(rc.right, rcClient.top, rcClient.right - rc.right, rcClient.bottom - rcClient.top, PATCOPY);\r
+               dc.PatBlt(rc.left, rc.bottom, rc.right - rc.left, rcClient.bottom - rc.bottom, PATCOPY);\r
+               dc.SelectBrush((HBRUSH)::GetStockObject(WHITE_BRUSH));\r
+               dc.PatBlt(rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, PATCOPY);\r
+               dc.SelectBrush(::GetSysColorBrush(COLOR_3DDKSHADOW));\r
+               dc.PatBlt(rc.right, rc.top + 4, 4, rc.bottom - rc.top, PATCOPY);\r
+               dc.PatBlt(rc.left + 4, rc.bottom, rc.right - rc.left, 4, PATCOPY);\r
+               dc.SelectBrush(hbrOld);\r
+       }\r
+\r
+       void DoPaint(CDCHandle dc, RECT& rc)\r
+       {\r
+               CEnhMetaFileInfo emfinfo(m_meta);\r
+               ENHMETAHEADER* pmh = emfinfo.GetEnhMetaFileHeader();\r
+               int nOffsetX = MulDiv(m_sizeCurPhysOffset.cx, rc.right-rc.left, pmh->szlDevice.cx);\r
+               int nOffsetY = MulDiv(m_sizeCurPhysOffset.cy, rc.bottom-rc.top, pmh->szlDevice.cy);\r
+\r
+               dc.OffsetWindowOrg(-nOffsetX, -nOffsetY);\r
+               dc.PlayMetaFile(m_meta, &rc);\r
+       }\r
+};\r
+\r
+class CZoomPrintPreviewWindow : public CZoomPrintPreviewWindowImpl<CZoomPrintPreviewWindow>\r
+{\r
+public:\r
+       DECLARE_WND_CLASS_EX(_T("WTL_ZoomPrintPreview"), CS_VREDRAW | CS_HREDRAW, -1)\r
+};\r
+\r
+#endif // __ATLSCRL_H__\r
+\r
+}; // namespace WTL\r
+\r
+#endif // __ATLPRINT_H__\r
diff --git a/WTL80/include/atlres.h b/WTL80/include/atlres.h
new file mode 100644 (file)
index 0000000..ae05887
--- /dev/null
@@ -0,0 +1,262 @@
+// Windows Template Library - WTL version 8.0\r
+// Copyright (C) Microsoft Corporation. All rights reserved.\r
+//\r
+// This file is a part of the Windows Template Library.\r
+// The use and distribution terms for this software are covered by the\r
+// Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php)\r
+// which can be found in the file CPL.TXT at the root of this distribution.\r
+// By using this software in any fashion, you are agreeing to be bound by\r
+// the terms of this license. You must not remove this notice, or\r
+// any other, from this software.\r
+\r
+#ifndef __ATLRES_H__\r
+#define __ATLRES_H__\r
+\r
+#pragma once\r
+\r
+#if defined(_WIN32_WCE) && !defined(__ATLRESCE_H__)\r
+       #error Use atlresCE.h instead of atlres.h for Windows CE\r
+#endif\r
+\r
+\r
+#ifdef RC_INVOKED\r
+#ifndef _INC_WINDOWS\r
+\r
+  #define _INC_WINDOWS\r
+\r
+  #ifndef _WIN32_WCE\r
+    #define VS_VERSION_INFO     1\r
+\r
+    #ifdef APSTUDIO_INVOKED\r
+      #define APSTUDIO_HIDDEN_SYMBOLS // Ignore following symbols\r
+    #endif // APSTUDIO_INVOKED\r
+\r
+    #ifndef WINVER\r
+      #define WINVER 0x0400   // default to Windows Version 4.0\r
+    #endif // !WINVER\r
+\r
+    #include <winresrc.h>\r
+\r
+    // operation messages sent to DLGINIT\r
+    #define LB_ADDSTRING    (WM_USER+1)\r
+    #define CB_ADDSTRING    (WM_USER+3)\r
+  #endif // !_WIN32_WCE\r
+\r
+  #ifdef APSTUDIO_INVOKED\r
+    #undef APSTUDIO_HIDDEN_SYMBOLS\r
+  #endif // APSTUDIO_INVOKED\r
+\r
+  #ifdef IDC_STATIC\r
+    #undef IDC_STATIC\r
+  #endif // IDC_STATIC\r
+  #define IDC_STATIC      (-1)\r
+\r
+#endif // !_INC_WINDOWS\r
+#endif // RC_INVOKED\r
+\r
+#ifdef APSTUDIO_INVOKED\r
+  #define APSTUDIO_HIDDEN_SYMBOLS\r
+#endif // APSTUDIO_INVOKED\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// ATL resource types\r
+\r
+#ifndef RC_INVOKED\r
+  #define RT_DLGINIT  MAKEINTRESOURCE(240)\r
+  #define RT_TOOLBAR  MAKEINTRESOURCE(241)\r
+#endif // RC_INVOKED\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+\r
+#ifdef APSTUDIO_INVOKED\r
+  #undef APSTUDIO_HIDDEN_SYMBOLS\r
+#endif // APSTUDIO_INVOKED\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Standard window components\r
+\r
+#define ID_SEPARATOR                    0       // special separator value\r
+#define ID_DEFAULT_PANE                 0       // default status bar pane\r
+\r
+#ifndef RC_INVOKED  // code only\r
+// standard control bars (IDW = window ID)\r
+  #define ATL_IDW_TOOLBAR               0xE800  // main Toolbar for window\r
+  #define ATL_IDW_STATUS_BAR            0xE801  // Status bar window\r
+  #define ATL_IDW_COMMAND_BAR           0xE802  // Command bar window\r
+\r
+// parts of a frame window\r
+  #define ATL_IDW_CLIENT                0xE900\r
+  #define ATL_IDW_PANE_FIRST            0xE900  // first pane (256 max)\r
+  #define ATL_IDW_PANE_LAST             0xE9FF\r
+  #define ATL_IDW_HSCROLL_FIRST         0xEA00  // first Horz scrollbar (16 max)\r
+  #define ATL_IDW_VSCROLL_FIRST         0xEA10  // first Vert scrollbar (16 max)\r
+\r
+  #define ATL_IDW_SIZE_BOX              0xEA20  // size box for splitters\r
+  #define ATL_IDW_PANE_SAVE             0xEA21  // to shift ATL_IDW_PANE_FIRST\r
+\r
+// bands for a rebar\r
+  #define ATL_IDW_BAND_FIRST            0xEB00\r
+  #define ATL_IDW_BAND_LAST             0xEBFF\r
+#endif // !RC_INVOKED\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Standard Commands\r
+\r
+// File commands\r
+#define ID_FILE_NEW                     0xE100\r
+#define ID_FILE_OPEN                    0xE101\r
+#define ID_FILE_CLOSE                   0xE102\r
+#define ID_FILE_SAVE                    0xE103\r
+#define ID_FILE_SAVE_AS                 0xE104\r
+#define ID_FILE_PAGE_SETUP              0xE105\r
+#define ID_FILE_PRINT_SETUP             0xE106\r
+#define ID_FILE_PRINT                   0xE107\r
+#define ID_FILE_PRINT_DIRECT            0xE108\r
+#define ID_FILE_PRINT_PREVIEW           0xE109\r
+#define ID_FILE_UPDATE                  0xE10A\r
+#define ID_FILE_SAVE_COPY_AS            0xE10B\r
+#define ID_FILE_SEND_MAIL               0xE10C\r
+\r
+#define ID_FILE_MRU_FIRST               0xE110\r
+#define ID_FILE_MRU_FILE1               0xE110          // range - 16 max\r
+#define ID_FILE_MRU_FILE2               0xE111\r
+#define ID_FILE_MRU_FILE3               0xE112\r
+#define ID_FILE_MRU_FILE4               0xE113\r
+#define ID_FILE_MRU_FILE5               0xE114\r
+#define ID_FILE_MRU_FILE6               0xE115\r
+#define ID_FILE_MRU_FILE7               0xE116\r
+#define ID_FILE_MRU_FILE8               0xE117\r
+#define ID_FILE_MRU_FILE9               0xE118\r
+#define ID_FILE_MRU_FILE10              0xE119\r
+#define ID_FILE_MRU_FILE11              0xE11A\r
+#define ID_FILE_MRU_FILE12              0xE11B\r
+#define ID_FILE_MRU_FILE13              0xE11C\r
+#define ID_FILE_MRU_FILE14              0xE11D\r
+#define ID_FILE_MRU_FILE15              0xE11E\r
+#define ID_FILE_MRU_FILE16              0xE11F\r
+#define ID_FILE_MRU_LAST                0xE11F\r
+\r
+// Edit commands\r
+#define ID_EDIT_CLEAR                   0xE120\r
+#define ID_EDIT_CLEAR_ALL               0xE121\r
+#define ID_EDIT_COPY                    0xE122\r
+#define ID_EDIT_CUT                     0xE123\r
+#define ID_EDIT_FIND                    0xE124\r
+#define ID_EDIT_PASTE                   0xE125\r
+#define ID_EDIT_PASTE_LINK              0xE126\r
+#define ID_EDIT_PASTE_SPECIAL           0xE127\r
+#define ID_EDIT_REPEAT                  0xE128\r
+#define ID_EDIT_REPLACE                 0xE129\r
+#define ID_EDIT_SELECT_ALL              0xE12A\r
+#define ID_EDIT_UNDO                    0xE12B\r
+#define ID_EDIT_REDO                    0xE12C\r
+\r
+// Window commands\r
+#define ID_WINDOW_NEW                   0xE130\r
+#define ID_WINDOW_ARRANGE               0xE131\r
+#define ID_WINDOW_CASCADE               0xE132\r
+#define ID_WINDOW_TILE_HORZ             0xE133\r
+#define ID_WINDOW_TILE_VERT             0xE134\r
+#define ID_WINDOW_SPLIT                 0xE135\r
+#ifndef RC_INVOKED      // code only\r
+  #define ATL_IDM_WINDOW_FIRST          0xE130\r
+  #define ATL_IDM_WINDOW_LAST           0xE13F\r
+  #define ATL_IDM_FIRST_MDICHILD        0xFF00  // window list starts here\r
+  #define ATL_IDM_LAST_MDICHILD         0xFFFD\r
+#endif // !RC_INVOKED\r
+// TabView\r
+#define ID_WINDOW_TABFIRST              0xFF00 // = ATL_IDM_FIRST_MDICHILD\r
+#define ID_WINDOW_TABLAST               0xFFFD\r
+#define ID_WINDOW_SHOWTABLIST           0xFFFE\r
+\r
+// Help and App commands\r
+#define ID_APP_ABOUT                    0xE140\r
+#define ID_APP_EXIT                     0xE141\r
+#define ID_HELP_INDEX                   0xE142\r
+#define ID_HELP_FINDER                  0xE143\r
+#define ID_HELP_USING                   0xE144\r
+#define ID_CONTEXT_HELP                 0xE145      // shift-F1\r
+// special commands for processing help\r
+#define ID_HELP                         0xE146      // first attempt for F1\r
+#define ID_DEFAULT_HELP                 0xE147      // last attempt\r
+\r
+// Misc\r
+#define ID_NEXT_PANE                    0xE150\r
+#define ID_PREV_PANE                    0xE151\r
+#define ID_PANE_CLOSE                   0xE152\r
+\r
+// Format\r
+#define ID_FORMAT_FONT                  0xE160\r
+\r
+// Scroll\r
+#define ID_SCROLL_UP                    0xE170\r
+#define ID_SCROLL_DOWN                  0xE171\r
+#define ID_SCROLL_PAGE_UP               0xE172\r
+#define ID_SCROLL_PAGE_DOWN             0xE173\r
+#define ID_SCROLL_TOP                   0xE174\r
+#define ID_SCROLL_BOTTOM                0xE175\r
+#define ID_SCROLL_LEFT                  0xE176\r
+#define ID_SCROLL_RIGHT                 0xE177\r
+#define ID_SCROLL_PAGE_LEFT             0xE178\r
+#define ID_SCROLL_PAGE_RIGHT            0xE179\r
+#define ID_SCROLL_ALL_LEFT              0xE17A\r
+#define ID_SCROLL_ALL_RIGHT             0xE17B\r
+\r
+// OLE commands\r
+#define ID_OLE_INSERT_NEW               0xE200\r
+#define ID_OLE_EDIT_LINKS               0xE201\r
+#define ID_OLE_EDIT_CONVERT             0xE202\r
+#define ID_OLE_EDIT_CHANGE_ICON         0xE203\r
+#define ID_OLE_EDIT_PROPERTIES          0xE204\r
+#define ID_OLE_VERB_FIRST               0xE210     // range - 16 max\r
+#ifndef RC_INVOKED      // code only\r
+  #define ID_OLE_VERB_LAST              0xE21F\r
+#endif // !RC_INVOKED\r
+\r
+// View commands (same number used as IDW used for toolbar and status bar)\r
+#define ID_VIEW_TOOLBAR                 0xE800\r
+#define ID_VIEW_STATUS_BAR              0xE801\r
+#define ID_VIEW_REFRESH                 0xE803\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Standard control IDs\r
+\r
+#ifdef IDC_STATIC\r
+  #undef IDC_STATIC\r
+#endif // IDC_STATIC\r
+#define IDC_STATIC              (-1)     // all static controls\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Standard string error/warnings\r
+\r
+// idle status bar message\r
+#define ATL_IDS_IDLEMESSAGE             0xE001\r
+\r
+#ifndef RC_INVOKED      // code only\r
+  #define ATL_IDS_SCFIRST               0xEF00\r
+#endif // !RC_INVOKED\r
+\r
+#define ATL_IDS_SCSIZE                  0xEF00\r
+#define ATL_IDS_SCMOVE                  0xEF01\r
+#define ATL_IDS_SCMINIMIZE              0xEF02\r
+#define ATL_IDS_SCMAXIMIZE              0xEF03\r
+#define ATL_IDS_SCNEXTWINDOW            0xEF04\r
+#define ATL_IDS_SCPREVWINDOW            0xEF05\r
+#define ATL_IDS_SCCLOSE                 0xEF06\r
+#define ATL_IDS_SCRESTORE               0xEF12\r
+#define ATL_IDS_SCTASKLIST              0xEF13\r
+\r
+#define ATL_IDS_MDICHILD                0xEF1F\r
+#define ATL_IDS_MRU_FILE                0xEFDA\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Misc. control IDs\r
+\r
+// Property Sheet control id's (determined with Spy++)\r
+#define ID_APPLY_NOW                    0x3021\r
+#define ID_WIZBACK                      0x3023\r
+#define ID_WIZNEXT                      0x3024\r
+#define ID_WIZFINISH                    0x3025\r
+#define ATL_IDC_TAB_CONTROL             0x3020\r
+\r
+#endif // __ATLRES_H__\r
diff --git a/WTL80/include/atlresce.h b/WTL80/include/atlresce.h
new file mode 100644 (file)
index 0000000..64346b1
--- /dev/null
@@ -0,0 +1,93 @@
+// Windows Template Library - WTL version 8.0\r
+// Copyright (C) Microsoft Corporation. All rights reserved.\r
+//\r
+// This file is a part of the Windows Template Library.\r
+// The use and distribution terms for this software are covered by the\r
+// Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php)\r
+// which can be found in the file CPL.TXT at the root of this distribution.\r
+// By using this software in any fashion, you are agreeing to be bound by\r
+// the terms of this license. You must not remove this notice, or\r
+// any other, from this software.\r
+\r
+#ifndef __ATLRESCE_H__\r
+#define __ATLRESCE_H__\r
+\r
+#pragma once\r
+\r
+#ifndef _WIN32_WCE\r
+       #error atlresCE.h is only for Windows CE\r
+#endif\r
+\r
+\r
+#ifdef RC_INVOKED\r
+#ifndef _INC_WINDOWS\r
+\r
+  #define VS_VERSION_INFO     1\r
+\r
+  #ifdef APSTUDIO_INVOKED\r
+    #define APSTUDIO_HIDDEN_SYMBOLS // Ignore following symbols\r
+  #endif // APSTUDIO_INVOKED\r
+\r
+  #ifndef WINVER\r
+    #define WINVER 0x0400   // default to Windows Version 4.0\r
+  #endif // !WINVER\r
+\r
+  #if !defined(WCEOLE_ENABLE_DIALOGEX)\r
+    #define DIALOGEX DIALOG DISCARDABLE\r
+  #endif\r
+\r
+  #include <commctrl.h>\r
+  #define  SHMENUBAR RCDATA\r
+\r
+  #if defined(SHELLSDK_MODULES_AYGSHELL)\r
+    #include <aygshell.h> \r
+  #else\r
+    #define NOMENU                 0xFFFF\r
+    #define IDS_SHNEW              1\r
+    #define IDM_SHAREDNEW          10\r
+    #define IDM_SHAREDNEWDEFAULT   11\r
+  #endif\r
+  #ifndef I_IMAGENONE\r
+       #define I_IMAGENONE            (-2)\r
+  #endif\r
+\r
+  #include <windows.h>\r
+\r
+#endif // !_INC_WINDOWS\r
+#endif // RC_INVOKED\r
+\r
+#include "atlres.h"\r
+\r
+#ifdef APSTUDIO_INVOKED\r
+       #undef APSTUDIO_HIDDEN_SYMBOLS\r
+#endif // APSTUDIO_INVOKED\r
+\r
+// Visual Studio dialog editor bug fix\r
+#ifndef DS_FIXEDSYS \r
+       #define DS_FIXEDSYS 0\r
+#endif\r
+\r
+#define IDC_INFOSTATIC 0xFFFE   // == IDC_STATIC -1\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Smartphone and PPC 2005 Resource IDs\r
+\r
+// Command and associated string resource IDs\r
+#define ID_MENU_OK                      0xE790\r
+#define ID_MENU_CANCEL                  0xE791\r
+#define ID_MENU                                                        0xE792\r
+#define ID_ACTION                                              0xE793\r
+#define ID_VIEW_FULLSCREEN              0xE802\r
+\r
+// MenuBar resource IDs\r
+#define ATL_IDM_MENU_DONE               0xE701\r
+#define ATL_IDM_MENU_CANCEL             0xE702\r
+#define ATL_IDM_MENU_DONECANCEL         0xE703\r
+\r
+// Default device MenuBar control ID and MenuBar resource ID\r
+#define ATL_IDW_MENU_BAR                               0xE802  \r
+\r
+// SmartPhone spinned controls ID offset for CSpinCtrl\r
+#define ATL_IDW_SPIN_ID                 9999\r
+\r
+#endif // __ATLRESCE_H__\r
diff --git a/WTL80/include/atlscrl.h b/WTL80/include/atlscrl.h
new file mode 100644 (file)
index 0000000..9eb32ed
--- /dev/null
@@ -0,0 +1,2015 @@
+// Windows Template Library - WTL version 8.0\r
+// Copyright (C) Microsoft Corporation. All rights reserved.\r
+//\r
+// This file is a part of the Windows Template Library.\r
+// The use and distribution terms for this software are covered by the\r
+// Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php)\r
+// which can be found in the file CPL.TXT at the root of this distribution.\r
+// By using this software in any fashion, you are agreeing to be bound by\r
+// the terms of this license. You must not remove this notice, or\r
+// any other, from this software.\r
+\r
+#ifndef __ATLSCRL_H__\r
+#define __ATLSCRL_H__\r
+\r
+#pragma once\r
+\r
+#ifndef __cplusplus\r
+       #error ATL requires C++ compilation (use a .cpp suffix)\r
+#endif\r
+\r
+#ifndef __ATLAPP_H__\r
+       #error atlscrl.h requires atlapp.h to be included first\r
+#endif\r
+\r
+#ifndef __ATLWIN_H__\r
+       #error atlscrl.h requires atlwin.h to be included first\r
+#endif\r
+\r
+#if !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) && !defined(_WIN32_WCE)\r
+  #include <zmouse.h>\r
+#endif // !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) && !defined(_WIN32_WCE)\r
+\r
+#ifndef GET_WHEEL_DELTA_WPARAM\r
+  #define GET_WHEEL_DELTA_WPARAM(wParam)  ((short)HIWORD(wParam))\r
+#endif\r
+\r
+#ifndef WM_MOUSEHWHEEL\r
+  #define WM_MOUSEHWHEEL                  0x020E\r
+#endif\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Classes in this file:\r
+//\r
+// CScrollImpl<T>\r
+// CScrollWindowImpl<T, TBase, TWinTraits>\r
+// CMapScrollImpl<T>\r
+// CMapScrollWindowImpl<T, TBase, TWinTraits>\r
+// CFSBWindowT<TBase>\r
+// CZoomScrollImpl<T>\r
+// CZoomScrollWindowImpl<T, TBase, TWinTraits>\r
+// CScrollContainerImpl<T, TBase, TWinTraits>\r
+// CScrollContainer\r
+\r
+namespace WTL\r
+{\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CScrollImpl - Provides scrolling support to any window\r
+\r
+// Scroll extended styles\r
+#define SCRL_SCROLLCHILDREN    0x00000001\r
+#define SCRL_ERASEBACKGROUND   0x00000002\r
+#define SCRL_NOTHUMBTRACKING   0x00000004\r
+#if (WINVER >= 0x0500)\r
+#define SCRL_SMOOTHSCROLL      0x00000008\r
+#endif // (WINVER >= 0x0500)\r
+#define SCRL_DISABLENOSCROLLV  0x00000010\r
+#define SCRL_DISABLENOSCROLLH  0x00000020\r
+#define SCRL_DISABLENOSCROLL   (SCRL_DISABLENOSCROLLV | SCRL_DISABLENOSCROLLH)\r
+\r
+\r
+template <class T>\r
+class CScrollImpl\r
+{\r
+public:\r
+       enum { uSCROLL_FLAGS = SW_INVALIDATE };\r
+\r
+       POINT m_ptOffset;\r
+       SIZE m_sizeAll;\r
+       SIZE m_sizeLine;\r
+       SIZE m_sizePage;\r
+       SIZE m_sizeClient;\r
+       int m_zDelta;              // current wheel value\r
+       int m_nWheelLines;         // number of lines to scroll on wheel\r
+#if !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) && !defined(_WIN32_WCE)\r
+       // Note that this message must be forwarded from a top level window\r
+       UINT m_uMsgMouseWheel;     // MSH_MOUSEWHEEL\r
+#endif // !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) && !defined(_WIN32_WCE)\r
+       int m_zHDelta;              // current horizontal wheel value\r
+       int m_nHWheelChars;         // number of chars to scroll on horizontal wheel\r
+       UINT m_uScrollFlags;\r
+       DWORD m_dwExtendedStyle;   // scroll specific extended styles\r
+\r
+// Constructor\r
+       CScrollImpl() : m_zDelta(0), m_nWheelLines(3), \r
+#if !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) && !defined(_WIN32_WCE)\r
+                       m_uMsgMouseWheel(0U), \r
+#endif // !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) && !defined(_WIN32_WCE)\r
+                       m_zHDelta(0), m_nHWheelChars(3), \r
+                       m_uScrollFlags(0U), m_dwExtendedStyle(0)\r
+       {\r
+               m_ptOffset.x = 0;\r
+               m_ptOffset.y = 0;\r
+               m_sizeAll.cx = 0;\r
+               m_sizeAll.cy = 0;\r
+               m_sizePage.cx = 0;\r
+               m_sizePage.cy = 0;\r
+               m_sizeLine.cx = 0;\r
+               m_sizeLine.cy = 0;\r
+               m_sizeClient.cx = 0;\r
+               m_sizeClient.cy = 0;\r
+\r
+               SetScrollExtendedStyle(SCRL_SCROLLCHILDREN | SCRL_ERASEBACKGROUND);\r
+       }\r
+\r
+// Attributes & Operations\r
+       DWORD GetScrollExtendedStyle() const\r
+       {\r
+               return m_dwExtendedStyle;\r
+       }\r
+\r
+       DWORD SetScrollExtendedStyle(DWORD dwExtendedStyle, DWORD dwMask = 0)\r
+       {\r
+               DWORD dwPrevStyle = m_dwExtendedStyle;\r
+               if(dwMask == 0)\r
+                       m_dwExtendedStyle = dwExtendedStyle;\r
+               else\r
+                       m_dwExtendedStyle = (m_dwExtendedStyle & ~dwMask) | (dwExtendedStyle & dwMask);\r
+               // cache scroll flags\r
+               T* pT = static_cast<T*>(this);\r
+               pT;   // avoid level 4 warning\r
+               m_uScrollFlags = pT->uSCROLL_FLAGS | (IsScrollingChildren() ? SW_SCROLLCHILDREN : 0) | (IsErasingBackground() ? SW_ERASE : 0);\r
+#if (WINVER >= 0x0500) && !defined(_WIN32_WCE)\r
+               m_uScrollFlags |= (IsSmoothScroll() ? SW_SMOOTHSCROLL : 0);\r
+#endif // (WINVER >= 0x0500) && !defined(_WIN32_WCE)\r
+               return dwPrevStyle;\r
+       }\r
+\r
+       // offset operations\r
+       void SetScrollOffset(int x, int y, BOOL bRedraw = TRUE)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(::IsWindow(pT->m_hWnd));\r
+\r
+               pT->AdjustScrollOffset(x, y);\r
+\r
+               int dx = m_ptOffset.x - x;\r
+               int dy = m_ptOffset.y - y;\r
+               m_ptOffset.x = x;\r
+               m_ptOffset.y = y;\r
+\r
+               // block: set horizontal scroll bar\r
+               {\r
+                       SCROLLINFO si = { sizeof(SCROLLINFO) };\r
+                       si.fMask = SIF_POS;\r
+                       if((m_dwExtendedStyle & SCRL_DISABLENOSCROLLH) != 0)\r
+                               si.fMask |= SIF_DISABLENOSCROLL;\r
+                       si.nPos = m_ptOffset.x;\r
+                       pT->SetScrollInfo(SB_HORZ, &si, bRedraw);\r
+               }\r
+\r
+               // block: set vertical scroll bar\r
+               {\r
+                       SCROLLINFO si = { sizeof(SCROLLINFO) };\r
+                       si.fMask = SIF_POS;\r
+                       if((m_dwExtendedStyle & SCRL_DISABLENOSCROLLV) != 0)\r
+                               si.fMask |= SIF_DISABLENOSCROLL;\r
+                       si.nPos = m_ptOffset.y;\r
+                       pT->SetScrollInfo(SB_VERT, &si, bRedraw);\r
+               }\r
+\r
+               // Move all children if needed\r
+               if(IsScrollingChildren() && (dx != 0 || dy != 0))\r
+               {\r
+                       for(HWND hWndChild = ::GetWindow(pT->m_hWnd, GW_CHILD); hWndChild != NULL; hWndChild = ::GetWindow(hWndChild, GW_HWNDNEXT))\r
+                       {\r
+                               RECT rect = { 0 };\r
+                               ::GetWindowRect(hWndChild, &rect);\r
+                               ::MapWindowPoints(NULL, pT->m_hWnd, (LPPOINT)&rect, 1);\r
+                               ::SetWindowPos(hWndChild, NULL, rect.left + dx, rect.top + dy, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE);\r
+                       }\r
+               }\r
+\r
+               if(bRedraw)\r
+                       pT->Invalidate();\r
+       }\r
+\r
+       void SetScrollOffset(POINT ptOffset, BOOL bRedraw = TRUE)\r
+       {\r
+               SetScrollOffset(ptOffset.x, ptOffset.y, bRedraw);\r
+       }\r
+\r
+       void GetScrollOffset(POINT& ptOffset) const\r
+       {\r
+               ptOffset = m_ptOffset;\r
+       }\r
+\r
+       // size operations\r
+       void SetScrollSize(int cx, int cy, BOOL bRedraw = TRUE, bool bResetOffset = true)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(::IsWindow(pT->m_hWnd));\r
+\r
+               m_sizeAll.cx = cx;\r
+               m_sizeAll.cy = cy;\r
+\r
+               int x = 0;\r
+               int y = 0;\r
+               if(!bResetOffset)\r
+               {\r
+                       x = m_ptOffset.x;\r
+                       y = m_ptOffset.y;\r
+                       pT->AdjustScrollOffset(x, y);\r
+               }\r
+\r
+               int dx = m_ptOffset.x - x;\r
+               int dy = m_ptOffset.y - y;\r
+               m_ptOffset.x = x;\r
+               m_ptOffset.y = y;\r
+\r
+               // block: set horizontal scroll bar\r
+               {\r
+                       SCROLLINFO si = { sizeof(SCROLLINFO) };\r
+                       si.fMask = SIF_PAGE | SIF_RANGE | SIF_POS;\r
+                       if((m_dwExtendedStyle & SCRL_DISABLENOSCROLLH) != 0)\r
+                               si.fMask |= SIF_DISABLENOSCROLL;\r
+                       si.nMin = 0;\r
+                       si.nMax = m_sizeAll.cx - 1;\r
+                       si.nPage = m_sizeClient.cx;\r
+                       si.nPos = m_ptOffset.x;\r
+                       pT->SetScrollInfo(SB_HORZ, &si, bRedraw);\r
+               }\r
+\r
+               // block: set vertical scroll bar\r
+               {\r
+                       SCROLLINFO si = { sizeof(SCROLLINFO) };\r
+                       si.fMask = SIF_PAGE | SIF_RANGE | SIF_POS;\r
+                       if((m_dwExtendedStyle & SCRL_DISABLENOSCROLLV) != 0)\r
+                               si.fMask |= SIF_DISABLENOSCROLL;\r
+                       si.nMin = 0;\r
+                       si.nMax = m_sizeAll.cy - 1;\r
+                       si.nPage = m_sizeClient.cy;\r
+                       si.nPos = m_ptOffset.y;\r
+                       pT->SetScrollInfo(SB_VERT, &si, bRedraw);\r
+               }\r
+\r
+               // Move all children if needed\r
+               if(IsScrollingChildren() && (dx != 0 || dy != 0))\r
+               {\r
+                       for(HWND hWndChild = ::GetWindow(pT->m_hWnd, GW_CHILD); hWndChild != NULL; hWndChild = ::GetWindow(hWndChild, GW_HWNDNEXT))\r
+                       {\r
+                               RECT rect = { 0 };\r
+                               ::GetWindowRect(hWndChild, &rect);\r
+                               ::MapWindowPoints(NULL, pT->m_hWnd, (LPPOINT)&rect, 1);\r
+                               ::SetWindowPos(hWndChild, NULL, rect.left + dx, rect.top + dy, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE);\r
+                       }\r
+               }\r
+\r
+               SetScrollLine(0, 0);\r
+               SetScrollPage(0, 0);\r
+\r
+               if(bRedraw)\r
+                       pT->Invalidate();\r
+       }\r
+\r
+       void SetScrollSize(SIZE size, BOOL bRedraw = TRUE, bool bResetOffset = true)\r
+       {\r
+               SetScrollSize(size.cx, size.cy, bRedraw, bResetOffset);\r
+       }\r
+\r
+       void GetScrollSize(SIZE& sizeWnd) const\r
+       {\r
+               sizeWnd = m_sizeAll;\r
+       }\r
+\r
+       // line operations\r
+       void SetScrollLine(int cxLine, int cyLine)\r
+       {\r
+               ATLASSERT(cxLine >= 0 && cyLine >= 0);\r
+               ATLASSERT(m_sizeAll.cx != 0 && m_sizeAll.cy != 0);\r
+\r
+               m_sizeLine.cx = T::CalcLineOrPage(cxLine, m_sizeAll.cx, 100);\r
+               m_sizeLine.cy = T::CalcLineOrPage(cyLine, m_sizeAll.cy, 100);\r
+       }\r
+\r
+       void SetScrollLine(SIZE sizeLine)\r
+       {\r
+               SetScrollLine(sizeLine.cx, sizeLine.cy);\r
+       }\r
+\r
+       void GetScrollLine(SIZE& sizeLine) const\r
+       {\r
+               sizeLine = m_sizeLine;\r
+       }\r
+\r
+       // page operations\r
+       void SetScrollPage(int cxPage, int cyPage)\r
+       {\r
+               ATLASSERT(cxPage >= 0 && cyPage >= 0);\r
+               ATLASSERT(m_sizeAll.cx != 0 && m_sizeAll.cy != 0);\r
+\r
+               m_sizePage.cx = T::CalcLineOrPage(cxPage, m_sizeAll.cx, 10);\r
+               m_sizePage.cy = T::CalcLineOrPage(cyPage, m_sizeAll.cy, 10);\r
+       }\r
+\r
+       void SetScrollPage(SIZE sizePage)\r
+       {\r
+               SetScrollPage(sizePage.cx, sizePage.cy);\r
+       }\r
+\r
+       void GetScrollPage(SIZE& sizePage) const\r
+       {\r
+               sizePage = m_sizePage;\r
+       }\r
+\r
+       // commands\r
+       void ScrollLineDown()\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(::IsWindow(pT->m_hWnd));\r
+               pT->DoScroll(SB_VERT, SB_LINEDOWN, (int&)m_ptOffset.y, m_sizeAll.cy, m_sizePage.cy, m_sizeLine.cy);\r
+       }\r
+\r
+       void ScrollLineUp()\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(::IsWindow(pT->m_hWnd));\r
+               pT->DoScroll(SB_VERT, SB_LINEUP, (int&)m_ptOffset.y, m_sizeAll.cy, m_sizePage.cy, m_sizeLine.cy);\r
+       }\r
+\r
+       void ScrollPageDown()\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(::IsWindow(pT->m_hWnd));\r
+               pT->DoScroll(SB_VERT, SB_PAGEDOWN, (int&)m_ptOffset.y, m_sizeAll.cy, m_sizePage.cy, m_sizeLine.cy);\r
+       }\r
+\r
+       void ScrollPageUp()\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(::IsWindow(pT->m_hWnd));\r
+               pT->DoScroll(SB_VERT, SB_PAGEUP, (int&)m_ptOffset.y, m_sizeAll.cy, m_sizePage.cy, m_sizeLine.cy);\r
+       }\r
+\r
+       void ScrollTop()\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(::IsWindow(pT->m_hWnd));\r
+               pT->DoScroll(SB_VERT, SB_TOP, (int&)m_ptOffset.y, m_sizeAll.cy, m_sizePage.cy, m_sizeLine.cy);\r
+       }\r
+\r
+       void ScrollBottom()\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(::IsWindow(pT->m_hWnd));\r
+               pT->DoScroll(SB_VERT, SB_BOTTOM, (int&)m_ptOffset.y, m_sizeAll.cy, m_sizePage.cy, m_sizeLine.cy);\r
+       }\r
+\r
+       void ScrollLineRight()\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(::IsWindow(pT->m_hWnd));\r
+               pT->DoScroll(SB_HORZ, SB_LINEDOWN, (int&)m_ptOffset.x, m_sizeAll.cx, m_sizePage.cx, m_sizeLine.cx);\r
+       }\r
+\r
+       void ScrollLineLeft()\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(::IsWindow(pT->m_hWnd));\r
+               pT->DoScroll(SB_HORZ, SB_LINEUP, (int&)m_ptOffset.x, m_sizeAll.cx, m_sizePage.cx, m_sizeLine.cx);\r
+       }\r
+\r
+       void ScrollPageRight()\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(::IsWindow(pT->m_hWnd));\r
+               pT->DoScroll(SB_HORZ, SB_PAGEDOWN, (int&)m_ptOffset.x, m_sizeAll.cx, m_sizePage.cx, m_sizeLine.cx);\r
+       }\r
+\r
+       void ScrollPageLeft()\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(::IsWindow(pT->m_hWnd));\r
+               pT->DoScroll(SB_HORZ, SB_PAGEUP, (int&)m_ptOffset.x, m_sizeAll.cx, m_sizePage.cx, m_sizeLine.cx);\r
+       }\r
+\r
+       void ScrollAllLeft()\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(::IsWindow(pT->m_hWnd));\r
+               pT->DoScroll(SB_HORZ, SB_TOP, (int&)m_ptOffset.x, m_sizeAll.cx, m_sizePage.cx, m_sizeLine.cx);\r
+       }\r
+\r
+       void ScrollAllRight()\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(::IsWindow(pT->m_hWnd));\r
+               pT->DoScroll(SB_HORZ, SB_BOTTOM, (int&)m_ptOffset.x, m_sizeAll.cx, m_sizePage.cx, m_sizeLine.cx);\r
+       }\r
+\r
+       // scroll to make point/view/window visible\r
+       void ScrollToView(POINT pt)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(::IsWindow(pT->m_hWnd));\r
+               RECT rect = { pt.x, pt.y, pt.x, pt.y };\r
+               pT->ScrollToView(rect);\r
+       }\r
+\r
+       void ScrollToView(RECT& rect)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(::IsWindow(pT->m_hWnd));\r
+\r
+               RECT rcClient = { 0 };\r
+               pT->GetClientRect(&rcClient);\r
+\r
+               int x = m_ptOffset.x;\r
+               if(rect.left < m_ptOffset.x)\r
+                       x = rect.left;\r
+               else if(rect.right > (m_ptOffset.x + rcClient.right))\r
+                       x = rect.right - rcClient.right;\r
+\r
+               int y = m_ptOffset.y;\r
+               if(rect.top < m_ptOffset.y)\r
+                       y = rect.top;\r
+               else if(rect.bottom > (m_ptOffset.y + rcClient.bottom))\r
+                       y = rect.bottom - rcClient.bottom;\r
+\r
+               SetScrollOffset(x, y);\r
+       }\r
+\r
+       void ScrollToView(HWND hWnd)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(::IsWindow(pT->m_hWnd));\r
+\r
+               RECT rect = { 0 };\r
+               ::GetWindowRect(hWnd, &rect);\r
+               ::MapWindowPoints(NULL, pT->m_hWnd, (LPPOINT)&rect, 2);\r
+               ScrollToView(rect);\r
+       }\r
+\r
+       BEGIN_MSG_MAP(CScrollImpl)\r
+               MESSAGE_HANDLER(WM_CREATE, OnCreate)\r
+               MESSAGE_HANDLER(WM_VSCROLL, OnVScroll)\r
+               MESSAGE_HANDLER(WM_HSCROLL, OnHScroll)\r
+               MESSAGE_HANDLER(WM_MOUSEWHEEL, OnMouseWheel)\r
+#if !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) && !defined(_WIN32_WCE)\r
+               MESSAGE_HANDLER(m_uMsgMouseWheel, OnMouseWheel)\r
+#endif // !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) && !defined(_WIN32_WCE)\r
+               MESSAGE_HANDLER(WM_MOUSEHWHEEL, OnMouseHWheel)\r
+               MESSAGE_HANDLER(WM_SETTINGCHANGE, OnSettingChange)\r
+               MESSAGE_HANDLER(WM_SIZE, OnSize)\r
+               MESSAGE_HANDLER(WM_PAINT, OnPaint)\r
+#ifndef _WIN32_WCE\r
+               MESSAGE_HANDLER(WM_PRINTCLIENT, OnPaint)\r
+#endif // !_WIN32_WCE\r
+       // standard scroll commands\r
+       ALT_MSG_MAP(1)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_UP, OnScrollUp)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_DOWN, OnScrollDown)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_PAGE_UP, OnScrollPageUp)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_PAGE_DOWN, OnScrollPageDown)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_TOP, OnScrollTop)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_BOTTOM, OnScrollBottom)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_LEFT, OnScrollLeft)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_RIGHT, OnScrollRight)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_PAGE_LEFT, OnScrollPageLeft)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_PAGE_RIGHT, OnScrollPageRight)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_ALL_LEFT, OnScrollAllLeft)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_ALL_RIGHT, OnScrollAllRight)\r
+       END_MSG_MAP()\r
+\r
+       LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)\r
+       {\r
+               GetSystemSettings();\r
+               bHandled = FALSE;\r
+               return 1;\r
+       }\r
+\r
+       LRESULT OnVScroll(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(::IsWindow(pT->m_hWnd));\r
+               pT->DoScroll(SB_VERT, (int)(short)LOWORD(wParam), (int&)m_ptOffset.y, m_sizeAll.cy, m_sizePage.cy, m_sizeLine.cy);\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnHScroll(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(::IsWindow(pT->m_hWnd));\r
+               pT->DoScroll(SB_HORZ, (int)(short)LOWORD(wParam), (int&)m_ptOffset.x, m_sizeAll.cx, m_sizePage.cx, m_sizeLine.cx);\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnMouseWheel(UINT uMsg, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(::IsWindow(pT->m_hWnd));\r
+\r
+#if (_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400) || defined(_WIN32_WCE)\r
+               uMsg;\r
+               int zDelta = (int)GET_WHEEL_DELTA_WPARAM(wParam);\r
+#else\r
+               int zDelta = (uMsg == WM_MOUSEWHEEL) ? (int)GET_WHEEL_DELTA_WPARAM(wParam) : (int)wParam;\r
+#endif // !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400) || defined(_WIN32_WCE))\r
+               int nScrollCode = (m_nWheelLines == WHEEL_PAGESCROLL) ? ((zDelta > 0) ? SB_PAGEUP : SB_PAGEDOWN) : ((zDelta > 0) ? SB_LINEUP : SB_LINEDOWN);\r
+               m_zDelta += zDelta;   // cumulative\r
+               int zTotal = (m_nWheelLines == WHEEL_PAGESCROLL) ? abs(m_zDelta) : abs(m_zDelta) * m_nWheelLines;\r
+               if(m_sizeAll.cy > m_sizeClient.cy)\r
+               {\r
+                       for(int i = 0; i < zTotal; i += WHEEL_DELTA)\r
+                       {\r
+                               pT->DoScroll(SB_VERT, nScrollCode, (int&)m_ptOffset.y, m_sizeAll.cy, m_sizePage.cy, m_sizeLine.cy);\r
+                               pT->UpdateWindow();\r
+                       }\r
+               }\r
+               else            // can't scroll vertically, scroll horizontally\r
+               {\r
+                       for(int i = 0; i < zTotal; i += WHEEL_DELTA)\r
+                       {\r
+                               pT->DoScroll(SB_HORZ, nScrollCode, (int&)m_ptOffset.x, m_sizeAll.cx, m_sizePage.cx, m_sizeLine.cx);\r
+                               pT->UpdateWindow();\r
+                       }\r
+               }\r
+               m_zDelta %= WHEEL_DELTA;\r
+\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnMouseHWheel(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(::IsWindow(pT->m_hWnd));\r
+\r
+               int zDelta = (int)GET_WHEEL_DELTA_WPARAM(wParam);\r
+               int nScrollCode = (m_nHWheelChars == WHEEL_PAGESCROLL) ? ((zDelta > 0) ? SB_PAGERIGHT : SB_PAGELEFT) : ((zDelta > 0) ? SB_LINERIGHT : SB_LINELEFT);\r
+               m_zHDelta += zDelta;   // cumulative\r
+               int zTotal = (m_nHWheelChars == WHEEL_PAGESCROLL) ? abs(m_zHDelta) : abs(m_zHDelta) * m_nHWheelChars;\r
+               if(m_sizeAll.cx > m_sizeClient.cx)\r
+               {\r
+                       for(int i = 0; i < zTotal; i += WHEEL_DELTA)\r
+                       {\r
+                               pT->DoScroll(SB_HORZ, nScrollCode, (int&)m_ptOffset.x, m_sizeAll.cx, m_sizePage.cx, m_sizeLine.cx);\r
+                               pT->UpdateWindow();\r
+                       }\r
+               }\r
+               m_zHDelta %= WHEEL_DELTA;\r
+\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnSettingChange(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)\r
+       {\r
+               GetSystemSettings();\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnSize(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(::IsWindow(pT->m_hWnd));\r
+\r
+               m_sizeClient.cx = GET_X_LPARAM(lParam);\r
+               m_sizeClient.cy = GET_Y_LPARAM(lParam);\r
+\r
+               // block: set horizontal scroll bar\r
+               {\r
+                       SCROLLINFO si = { sizeof(SCROLLINFO) };\r
+                       si.fMask = SIF_PAGE | SIF_RANGE | SIF_POS;\r
+                       si.nMin = 0;\r
+                       si.nMax = m_sizeAll.cx - 1;\r
+                       if((m_dwExtendedStyle & SCRL_DISABLENOSCROLLH) != 0)\r
+                               si.fMask |= SIF_DISABLENOSCROLL;\r
+                       si.nPage = m_sizeClient.cx;\r
+                       si.nPos = m_ptOffset.x;\r
+                       pT->SetScrollInfo(SB_HORZ, &si, TRUE);\r
+               }\r
+\r
+               // block: set vertical scroll bar\r
+               {\r
+                       SCROLLINFO si = { sizeof(SCROLLINFO) };\r
+                       si.fMask = SIF_PAGE | SIF_RANGE | SIF_POS;\r
+                       si.nMin = 0;\r
+                       si.nMax = m_sizeAll.cy - 1;\r
+                       if((m_dwExtendedStyle & SCRL_DISABLENOSCROLLV) != 0)\r
+                               si.fMask |= SIF_DISABLENOSCROLL;\r
+                       si.nPage = m_sizeClient.cy;\r
+                       si.nPos = m_ptOffset.y;\r
+                       pT->SetScrollInfo(SB_VERT, &si, TRUE);\r
+               }\r
+\r
+               int x = m_ptOffset.x;\r
+               int y = m_ptOffset.y;\r
+               if(pT->AdjustScrollOffset(x, y))\r
+               {\r
+                       // Children will be moved in SetScrollOffset, if needed\r
+                       pT->ScrollWindowEx(m_ptOffset.x - x, m_ptOffset.y - y, (m_uScrollFlags & ~SCRL_SCROLLCHILDREN));\r
+                       SetScrollOffset(x, y, FALSE);\r
+               }\r
+\r
+               bHandled = FALSE;\r
+               return 1;\r
+       }\r
+\r
+       LRESULT OnPaint(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(::IsWindow(pT->m_hWnd));\r
+               if(wParam != NULL)\r
+               {\r
+                       CDCHandle dc = (HDC)wParam;\r
+                       POINT ptViewportOrg = { 0, 0 };\r
+                       dc.SetViewportOrg(-m_ptOffset.x, -m_ptOffset.y, &ptViewportOrg);\r
+                       pT->DoPaint(dc);\r
+                       dc.SetViewportOrg(ptViewportOrg);\r
+               }\r
+               else\r
+               {\r
+                       CPaintDC dc(pT->m_hWnd);\r
+                       dc.SetViewportOrg(-m_ptOffset.x, -m_ptOffset.y);\r
+                       pT->DoPaint(dc.m_hDC);\r
+               }\r
+               return 0;\r
+       }\r
+\r
+       // scrolling handlers\r
+       LRESULT OnScrollUp(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)\r
+       {\r
+               ScrollLineUp();\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnScrollDown(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)\r
+       {\r
+               ScrollLineDown();\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnScrollPageUp(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)\r
+       {\r
+               ScrollPageUp();\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnScrollPageDown(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)\r
+       {\r
+               ScrollPageDown();\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnScrollTop(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)\r
+       {\r
+               ScrollTop();\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnScrollBottom(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)\r
+       {\r
+               ScrollBottom();\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnScrollLeft(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)\r
+       {\r
+               ScrollLineLeft();\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnScrollRight(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)\r
+       {\r
+               ScrollLineRight();\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnScrollPageLeft(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)\r
+       {\r
+               ScrollPageLeft();\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnScrollPageRight(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)\r
+       {\r
+               ScrollPageRight();\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnScrollAllLeft(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)\r
+       {\r
+               ScrollAllLeft();\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnScrollAllRight(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)\r
+       {\r
+               ScrollAllRight();\r
+               return 0;\r
+       }\r
+\r
+// Overrideables\r
+       void DoPaint(CDCHandle /*dc*/)\r
+       {\r
+               // must be implemented in a derived class\r
+               ATLASSERT(FALSE);\r
+       }\r
+\r
+// Implementation\r
+       void DoScroll(int nType, int nScrollCode, int& cxyOffset, int cxySizeAll, int cxySizePage, int cxySizeLine)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               RECT rect = { 0 };\r
+               pT->GetClientRect(&rect);\r
+               int cxyClient = (nType == SB_VERT) ? rect.bottom : rect.right;\r
+               int cxyMax = cxySizeAll - cxyClient;\r
+\r
+               if(cxyMax < 0)   // can't scroll, client area is bigger\r
+                       return;\r
+\r
+               bool bUpdate = true;\r
+               int cxyScroll = 0;\r
+\r
+               switch(nScrollCode)\r
+               {\r
+               case SB_TOP:            // top or all left\r
+                       cxyScroll = cxyOffset;\r
+                       cxyOffset = 0;\r
+                       break;\r
+               case SB_BOTTOM:         // bottom or all right\r
+                       cxyScroll = cxyOffset - cxyMax;\r
+                       cxyOffset = cxyMax;\r
+                       break;\r
+               case SB_LINEUP:         // line up or line left\r
+                       if(cxyOffset >= cxySizeLine)\r
+                       {\r
+                               cxyScroll = cxySizeLine;\r
+                               cxyOffset -= cxySizeLine;\r
+                       }\r
+                       else\r
+                       {\r
+                               cxyScroll = cxyOffset;\r
+                               cxyOffset = 0;\r
+                       }\r
+                       break;\r
+               case SB_LINEDOWN:       // line down or line right\r
+                       if(cxyOffset < cxyMax - cxySizeLine)\r
+                       {\r
+                               cxyScroll = -cxySizeLine;\r
+                               cxyOffset += cxySizeLine;\r
+                       }\r
+                       else\r
+                       {\r
+                               cxyScroll = cxyOffset - cxyMax;\r
+                               cxyOffset = cxyMax;\r
+                       }\r
+                       break;\r
+               case SB_PAGEUP:         // page up or page left\r
+                       if(cxyOffset >= cxySizePage)\r
+                       {\r
+                               cxyScroll = cxySizePage;\r
+                               cxyOffset -= cxySizePage;\r
+                       }\r
+                       else\r
+                       {\r
+                               cxyScroll = cxyOffset;\r
+                               cxyOffset = 0;\r
+                       }\r
+                       break;\r
+               case SB_PAGEDOWN:       // page down or page right\r
+                       if(cxyOffset < cxyMax - cxySizePage)\r
+                       {\r
+                               cxyScroll = -cxySizePage;\r
+                               cxyOffset += cxySizePage;\r
+                       }\r
+                       else\r
+                       {\r
+                               cxyScroll = cxyOffset - cxyMax;\r
+                               cxyOffset = cxyMax;\r
+                       }\r
+                       break;\r
+               case SB_THUMBTRACK:\r
+                       if(IsNoThumbTracking())\r
+                               break;\r
+                       // else fall through\r
+               case SB_THUMBPOSITION:\r
+                       {\r
+                               SCROLLINFO si = { sizeof(SCROLLINFO), SIF_TRACKPOS };\r
+                               if(pT->GetScrollInfo(nType, &si))\r
+                               {\r
+                                       cxyScroll = cxyOffset - si.nTrackPos;\r
+                                       cxyOffset = si.nTrackPos;\r
+                               }\r
+                       }\r
+                       break;\r
+               case SB_ENDSCROLL:\r
+               default:\r
+                       bUpdate = false;\r
+                       break;\r
+               }\r
+\r
+               if(bUpdate && cxyScroll != 0)\r
+               {\r
+                       pT->SetScrollPos(nType, cxyOffset, TRUE);\r
+                       if(nType == SB_VERT)\r
+                               pT->ScrollWindowEx(0, cxyScroll, m_uScrollFlags);\r
+                       else\r
+                               pT->ScrollWindowEx(cxyScroll, 0, m_uScrollFlags);\r
+               }\r
+       }\r
+\r
+       static int CalcLineOrPage(int nVal, int nMax, int nDiv)\r
+       {\r
+               if(nVal == 0)\r
+               {\r
+                       nVal = nMax / nDiv;\r
+                       if(nVal < 1)\r
+                               nVal = 1;\r
+               }\r
+               else if(nVal > nMax)\r
+               {\r
+                       nVal = nMax;\r
+               }\r
+\r
+               return nVal;\r
+       }\r
+\r
+       bool AdjustScrollOffset(int& x, int& y)\r
+       {\r
+               int xOld = x;\r
+               int yOld = y;\r
+\r
+               int cxMax = m_sizeAll.cx - m_sizeClient.cx;\r
+               if(x > cxMax)\r
+                       x = (cxMax >= 0) ? cxMax : 0;\r
+               else if(x < 0)\r
+                       x = 0;\r
+\r
+               int cyMax = m_sizeAll.cy - m_sizeClient.cy;\r
+               if(y > cyMax)\r
+                       y = (cyMax >= 0) ? cyMax : 0;\r
+               else if(y < 0)\r
+                       y = 0;\r
+\r
+               return (x != xOld || y != yOld);\r
+       }\r
+\r
+       void GetSystemSettings()\r
+       {\r
+#ifndef _WIN32_WCE\r
+#ifndef SPI_GETWHEELSCROLLLINES\r
+               const UINT SPI_GETWHEELSCROLLLINES = 104;\r
+#endif // !SPI_GETWHEELSCROLLLINES\r
+               ::SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, &m_nWheelLines, 0);\r
+\r
+#ifndef SPI_GETWHEELSCROLLCHARS\r
+               const UINT SPI_GETWHEELSCROLLCHARS = 0x006C;\r
+#endif // !SPI_GETWHEELSCROLLCHARS\r
+               ::SystemParametersInfo(SPI_GETWHEELSCROLLCHARS, 0, &m_nHWheelChars, 0);\r
+\r
+#if !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400))\r
+               if(m_uMsgMouseWheel != 0)\r
+                       m_uMsgMouseWheel = ::RegisterWindowMessage(MSH_MOUSEWHEEL);\r
+\r
+               HWND hWndWheel = FindWindow(MSH_WHEELMODULE_CLASS, MSH_WHEELMODULE_TITLE);\r
+               if(::IsWindow(hWndWheel))\r
+               {\r
+                       UINT uMsgScrollLines = ::RegisterWindowMessage(MSH_SCROLL_LINES);\r
+                       if(uMsgScrollLines != 0)\r
+                               m_nWheelLines = (int)::SendMessage(hWndWheel, uMsgScrollLines, 0, 0L);\r
+               }\r
+#endif // !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400))\r
+#endif // !_WIN32_WCE\r
+       }\r
+\r
+       bool IsScrollingChildren() const\r
+       {\r
+               return (m_dwExtendedStyle & SCRL_SCROLLCHILDREN) != 0;\r
+       }\r
+\r
+       bool IsErasingBackground() const\r
+       {\r
+               return (m_dwExtendedStyle & SCRL_ERASEBACKGROUND) != 0;\r
+       }\r
+\r
+       bool IsNoThumbTracking() const\r
+       {\r
+               return (m_dwExtendedStyle & SCRL_NOTHUMBTRACKING) != 0;\r
+       }\r
+\r
+#if (WINVER >= 0x0500)\r
+       bool IsSmoothScroll() const\r
+       {\r
+               return (m_dwExtendedStyle & SCRL_SMOOTHSCROLL) != 0;\r
+       }\r
+#endif // (WINVER >= 0x0500)\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CScrollWindowImpl - Implements a scrollable window\r
+\r
+template <class T, class TBase = ATL::CWindow, class TWinTraits = ATL::CControlWinTraits>\r
+class ATL_NO_VTABLE CScrollWindowImpl : public ATL::CWindowImpl<T, TBase, TWinTraits>, public CScrollImpl< T >\r
+{\r
+public:\r
+       BEGIN_MSG_MAP(CScrollWindowImpl)\r
+               MESSAGE_HANDLER(WM_VSCROLL, CScrollImpl< T >::OnVScroll)\r
+               MESSAGE_HANDLER(WM_HSCROLL, CScrollImpl< T >::OnHScroll)\r
+               MESSAGE_HANDLER(WM_MOUSEWHEEL, CScrollImpl< T >::OnMouseWheel)\r
+#if !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) && !defined(_WIN32_WCE)\r
+               MESSAGE_HANDLER(m_uMsgMouseWheel, CScrollImpl< T >::OnMouseWheel)\r
+#endif // !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) && !defined(_WIN32_WCE)\r
+               MESSAGE_HANDLER(WM_MOUSEHWHEEL, CScrollImpl< T >::OnMouseHWheel)\r
+               MESSAGE_HANDLER(WM_SETTINGCHANGE, CScrollImpl< T >::OnSettingChange)\r
+               MESSAGE_HANDLER(WM_SIZE, CScrollImpl< T >::OnSize)\r
+               MESSAGE_HANDLER(WM_PAINT, CScrollImpl< T >::OnPaint)\r
+#ifndef _WIN32_WCE\r
+               MESSAGE_HANDLER(WM_PRINTCLIENT, CScrollImpl< T >::OnPaint)\r
+#endif // !_WIN32_WCE\r
+       ALT_MSG_MAP(1)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_UP, CScrollImpl< T >::OnScrollUp)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_DOWN, CScrollImpl< T >::OnScrollDown)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_PAGE_UP, CScrollImpl< T >::OnScrollPageUp)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_PAGE_DOWN, CScrollImpl< T >::OnScrollPageDown)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_TOP, CScrollImpl< T >::OnScrollTop)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_BOTTOM, CScrollImpl< T >::OnScrollBottom)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_LEFT, CScrollImpl< T >::OnScrollLeft)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_RIGHT, CScrollImpl< T >::OnScrollRight)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_PAGE_LEFT, CScrollImpl< T >::OnScrollPageLeft)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_PAGE_RIGHT, CScrollImpl< T >::OnScrollPageRight)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_ALL_LEFT, CScrollImpl< T >::OnScrollAllLeft)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_ALL_RIGHT, CScrollImpl< T >::OnScrollAllRight)\r
+       END_MSG_MAP()\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CMapScrollImpl - Provides mapping and scrolling support to any window\r
+\r
+#ifndef _WIN32_WCE\r
+\r
+template <class T>\r
+class CMapScrollImpl : public CScrollImpl< T >\r
+{\r
+public:\r
+       int m_nMapMode;\r
+       RECT m_rectLogAll;\r
+       SIZE m_sizeLogLine;\r
+       SIZE m_sizeLogPage;\r
+\r
+// Constructor\r
+       CMapScrollImpl() : m_nMapMode(MM_TEXT)\r
+       {\r
+               ::SetRectEmpty(&m_rectLogAll);\r
+               m_sizeLogPage.cx = 0;\r
+               m_sizeLogPage.cy = 0;\r
+               m_sizeLogLine.cx = 0;\r
+               m_sizeLogLine.cy = 0;\r
+       }\r
+\r
+// Attributes & Operations\r
+       // mapping mode operations\r
+       void SetScrollMapMode(int nMapMode)\r
+       {\r
+               ATLASSERT(nMapMode >= MM_MIN && nMapMode <= MM_MAX_FIXEDSCALE);\r
+               m_nMapMode = nMapMode;\r
+       }\r
+\r
+       int GetScrollMapMode() const\r
+       {\r
+               ATLASSERT(m_nMapMode >= MM_MIN && m_nMapMode <= MM_MAX_FIXEDSCALE);\r
+               return m_nMapMode;\r
+       }\r
+\r
+       // offset operations\r
+       void SetScrollOffset(int x, int y, BOOL bRedraw = TRUE)\r
+       {\r
+               ATLASSERT(m_nMapMode >= MM_MIN && m_nMapMode <= MM_MAX_FIXEDSCALE);\r
+               POINT ptOff = { x, y };\r
+               // block: convert logical to device units\r
+               {\r
+                       CWindowDC dc(NULL);\r
+                       dc.SetMapMode(m_nMapMode);\r
+                       dc.LPtoDP(&ptOff);\r
+               }\r
+               CScrollImpl< T >::SetScrollOffset(ptOff, bRedraw);\r
+       }\r
+\r
+       void SetScrollOffset(POINT ptOffset, BOOL bRedraw = TRUE)\r
+       {\r
+               SetScrollOffset(ptOffset.x, ptOffset.y, bRedraw);\r
+       }\r
+\r
+       void GetScrollOffset(POINT& ptOffset) const\r
+       {\r
+               ATLASSERT(m_nMapMode >= MM_MIN && m_nMapMode <= MM_MAX_FIXEDSCALE);\r
+               ptOffset = m_ptOffset;\r
+               // block: convert device to logical units\r
+               {\r
+                       CWindowDC dc(NULL);\r
+                       dc.SetMapMode(m_nMapMode);\r
+                       dc.DPtoLP(&ptOffset);\r
+               }\r
+       }\r
+\r
+       // size operations\r
+       void SetScrollSize(int xMin, int yMin, int xMax, int yMax, BOOL bRedraw = TRUE, bool bResetOffset = true)\r
+       {\r
+               ATLASSERT(xMax > xMin && yMax > yMin);\r
+               ATLASSERT(m_nMapMode >= MM_MIN && m_nMapMode <= MM_MAX_FIXEDSCALE);\r
+\r
+               ::SetRect(&m_rectLogAll, xMin, yMin, xMax, yMax);\r
+\r
+               SIZE sizeAll = { 0 };\r
+               sizeAll.cx = xMax - xMin + 1;\r
+               sizeAll.cy = yMax - yMin + 1;\r
+               // block: convert logical to device units\r
+               {\r
+                       CWindowDC dc(NULL);\r
+                       dc.SetMapMode(m_nMapMode);\r
+                       dc.LPtoDP(&sizeAll);\r
+               }\r
+               CScrollImpl< T >::SetScrollSize(sizeAll, bRedraw, bResetOffset);\r
+               SetScrollLine(0, 0);\r
+               SetScrollPage(0, 0);\r
+       }\r
+\r
+       void SetScrollSize(RECT& rcScroll, BOOL bRedraw = TRUE, bool bResetOffset = true)\r
+       {\r
+               SetScrollSize(rcScroll.left, rcScroll.top, rcScroll.right, rcScroll.bottom, bRedraw, bResetOffset);\r
+       }\r
+\r
+       void SetScrollSize(int cx, int cy, BOOL bRedraw = TRUE, bool bResetOffset = true)\r
+       {\r
+               SetScrollSize(0, 0, cx, cy, bRedraw, bResetOffset);\r
+       }\r
+\r
+       void SetScrollSize(SIZE size, BOOL bRedraw = TRUE, bool bResetOffset = true)\r
+       {\r
+               SetScrollSize(0, 0, size.cx, size.cy, bRedraw, bResetOffset);\r
+       }\r
+\r
+       void GetScrollSize(RECT& rcScroll) const\r
+       {\r
+               ATLASSERT(m_nMapMode >= MM_MIN && m_nMapMode <= MM_MAX_FIXEDSCALE);\r
+               rcScroll = m_rectLogAll;\r
+       }\r
+\r
+       // line operations\r
+       void SetScrollLine(int cxLine, int cyLine)\r
+       {\r
+               ATLASSERT(cxLine >= 0 && cyLine >= 0);\r
+               ATLASSERT(m_nMapMode >= MM_MIN && m_nMapMode <= MM_MAX_FIXEDSCALE);\r
+\r
+               m_sizeLogLine.cx = cxLine;\r
+               m_sizeLogLine.cy = cyLine;\r
+               SIZE sizeLine = m_sizeLogLine;\r
+               // block: convert logical to device units\r
+               {\r
+                       CWindowDC dc(NULL);\r
+                       dc.SetMapMode(m_nMapMode);\r
+                       dc.LPtoDP(&sizeLine);\r
+               }\r
+               CScrollImpl< T >::SetScrollLine(sizeLine);\r
+       }\r
+\r
+       void SetScrollLine(SIZE sizeLine)\r
+       {\r
+               SetScrollLine(sizeLine.cx, sizeLine.cy);\r
+       }\r
+\r
+       void GetScrollLine(SIZE& sizeLine) const\r
+       {\r
+               ATLASSERT(m_nMapMode >= MM_MIN && m_nMapMode <= MM_MAX_FIXEDSCALE);\r
+               sizeLine = m_sizeLogLine;\r
+       }\r
+\r
+       // page operations\r
+       void SetScrollPage(int cxPage, int cyPage)\r
+       {\r
+               ATLASSERT(cxPage >= 0 && cyPage >= 0);\r
+               ATLASSERT(m_nMapMode >= MM_MIN && m_nMapMode <= MM_MAX_FIXEDSCALE);\r
+\r
+               m_sizeLogPage.cx = cxPage;\r
+               m_sizeLogPage.cy = cyPage;\r
+               SIZE sizePage = m_sizeLogPage;\r
+               // block: convert logical to device units\r
+               {\r
+                       CWindowDC dc(NULL);\r
+                       dc.SetMapMode(m_nMapMode);\r
+                       dc.LPtoDP(&sizePage);\r
+               }\r
+               CScrollImpl< T >::SetScrollPage(sizePage);\r
+       }\r
+\r
+       void SetScrollPage(SIZE sizePage)\r
+       {\r
+               SetScrollPage(sizePage.cx, sizePage.cy);\r
+       }\r
+\r
+       void GetScrollPage(SIZE& sizePage) const\r
+       {\r
+               ATLASSERT(m_nMapMode >= MM_MIN && m_nMapMode <= MM_MAX_FIXEDSCALE);\r
+               sizePage = m_sizeLogPage;\r
+       }\r
+\r
+       BEGIN_MSG_MAP(CMapScrollImpl)\r
+               MESSAGE_HANDLER(WM_VSCROLL, CScrollImpl< T >::OnVScroll)\r
+               MESSAGE_HANDLER(WM_HSCROLL, CScrollImpl< T >::OnHScroll)\r
+               MESSAGE_HANDLER(WM_MOUSEWHEEL, CScrollImpl< T >::OnMouseWheel)\r
+#if !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400))\r
+               MESSAGE_HANDLER(m_uMsgMouseWheel, CScrollImpl< T >::OnMouseWheel)\r
+#endif // !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400))\r
+               MESSAGE_HANDLER(WM_MOUSEHWHEEL, CScrollImpl< T >::OnMouseHWheel)\r
+               MESSAGE_HANDLER(WM_SETTINGCHANGE, CScrollImpl< T >::OnSettingChange)\r
+               MESSAGE_HANDLER(WM_SIZE, CScrollImpl< T >::OnSize)\r
+               MESSAGE_HANDLER(WM_PAINT, OnPaint)\r
+               MESSAGE_HANDLER(WM_PRINTCLIENT, OnPaint)\r
+       ALT_MSG_MAP(1)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_UP, CScrollImpl< T >::OnScrollUp)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_DOWN, CScrollImpl< T >::OnScrollDown)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_PAGE_UP, CScrollImpl< T >::OnScrollPageUp)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_PAGE_DOWN, CScrollImpl< T >::OnScrollPageDown)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_TOP, CScrollImpl< T >::OnScrollTop)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_BOTTOM, CScrollImpl< T >::OnScrollBottom)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_LEFT, CScrollImpl< T >::OnScrollLeft)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_RIGHT, CScrollImpl< T >::OnScrollRight)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_PAGE_LEFT, CScrollImpl< T >::OnScrollPageLeft)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_PAGE_RIGHT, CScrollImpl< T >::OnScrollPageRight)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_ALL_LEFT, CScrollImpl< T >::OnScrollAllLeft)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_ALL_RIGHT, CScrollImpl< T >::OnScrollAllRight)\r
+       END_MSG_MAP()\r
+\r
+       LRESULT OnPaint(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(::IsWindow(pT->m_hWnd));\r
+               if(wParam != NULL)\r
+               {\r
+                       CDCHandle dc = (HDC)wParam;\r
+                       int nMapModeSav = dc.GetMapMode();\r
+                       dc.SetMapMode(m_nMapMode);\r
+                       POINT ptViewportOrg = { 0, 0 };\r
+                       if(m_nMapMode == MM_TEXT)\r
+                               dc.SetViewportOrg(-m_ptOffset.x, -m_ptOffset.y, &ptViewportOrg);\r
+                       else\r
+                               dc.SetViewportOrg(-m_ptOffset.x, -m_ptOffset.y + m_sizeAll.cy, &ptViewportOrg);\r
+                       POINT ptWindowOrg = { 0, 0 };\r
+                       dc.SetWindowOrg(m_rectLogAll.left, m_rectLogAll.top, &ptWindowOrg);\r
+\r
+                       pT->DoPaint(dc);\r
+\r
+                       dc.SetMapMode(nMapModeSav);\r
+                       dc.SetViewportOrg(ptViewportOrg);\r
+                       dc.SetWindowOrg(ptWindowOrg);\r
+               }\r
+               else\r
+               {\r
+                       CPaintDC dc(pT->m_hWnd);\r
+                       dc.SetMapMode(m_nMapMode);\r
+                       if(m_nMapMode == MM_TEXT)\r
+                               dc.SetViewportOrg(-m_ptOffset.x, -m_ptOffset.y);\r
+                       else\r
+                               dc.SetViewportOrg(-m_ptOffset.x, -m_ptOffset.y + m_sizeAll.cy);\r
+                       dc.SetWindowOrg(m_rectLogAll.left, m_rectLogAll.top);\r
+                       pT->DoPaint(dc.m_hDC);\r
+               }\r
+               return 0;\r
+       }\r
+};\r
+\r
+#endif // !_WIN32_WCE\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CMapScrollWindowImpl - Implements scrolling window with mapping\r
+\r
+#ifndef _WIN32_WCE\r
+\r
+template <class T, class TBase = ATL::CWindow, class TWinTraits = ATL::CControlWinTraits>\r
+class ATL_NO_VTABLE CMapScrollWindowImpl : public ATL::CWindowImpl< T, TBase, TWinTraits >, public CMapScrollImpl< T >\r
+{\r
+public:\r
+       BEGIN_MSG_MAP(CMapScrollWindowImpl)\r
+               MESSAGE_HANDLER(WM_VSCROLL, CScrollImpl< T >::OnVScroll)\r
+               MESSAGE_HANDLER(WM_HSCROLL, CScrollImpl< T >::OnHScroll)\r
+               MESSAGE_HANDLER(WM_MOUSEWHEEL, CScrollImpl< T >::OnMouseWheel)\r
+#if !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400))\r
+               MESSAGE_HANDLER(m_uMsgMouseWheel, CScrollImpl< T >::OnMouseWheel)\r
+#endif // !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400))\r
+               MESSAGE_HANDLER(WM_MOUSEHWHEEL, CScrollImpl< T >::OnMouseHWheel)\r
+               MESSAGE_HANDLER(WM_SETTINGCHANGE, CScrollImpl< T >::OnSettingChange)\r
+               MESSAGE_HANDLER(WM_SIZE, CScrollImpl< T >::OnSize)\r
+               MESSAGE_HANDLER(WM_PAINT, CMapScrollImpl< T >::OnPaint)\r
+               MESSAGE_HANDLER(WM_PRINTCLIENT, CMapScrollImpl< T >::OnPaint)\r
+       ALT_MSG_MAP(1)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_UP, CScrollImpl< T >::OnScrollUp)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_DOWN, CScrollImpl< T >::OnScrollDown)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_PAGE_UP, CScrollImpl< T >::OnScrollPageUp)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_PAGE_DOWN, CScrollImpl< T >::OnScrollPageDown)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_TOP, CScrollImpl< T >::OnScrollTop)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_BOTTOM, CScrollImpl< T >::OnScrollBottom)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_LEFT, CScrollImpl< T >::OnScrollLeft)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_RIGHT, CScrollImpl< T >::OnScrollRight)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_PAGE_LEFT, CScrollImpl< T >::OnScrollPageLeft)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_PAGE_RIGHT, CScrollImpl< T >::OnScrollPageRight)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_ALL_LEFT, CScrollImpl< T >::OnScrollAllLeft)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_ALL_RIGHT, CScrollImpl< T >::OnScrollAllRight)\r
+       END_MSG_MAP()\r
+};\r
+\r
+#endif // !_WIN32_WCE\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CFSBWindow - Use as a base instead of CWindow to get flat scroll bar support\r
+\r
+#if defined(__ATLCTRLS_H__) && (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)\r
+\r
+template <class TBase = ATL::CWindow>\r
+class CFSBWindowT : public TBase, public CFlatScrollBarImpl<CFSBWindowT< TBase > >\r
+{\r
+public:\r
+// Constructors\r
+       CFSBWindowT(HWND hWnd = NULL) : TBase(hWnd)\r
+       { }\r
+\r
+       CFSBWindowT< TBase >& operator =(HWND hWnd)\r
+       {\r
+               m_hWnd = hWnd;\r
+               return *this;\r
+       }\r
+\r
+// CWindow overrides that use flat scroll bar API\r
+// (only those methods that are used by scroll window classes)\r
+       int SetScrollPos(int nBar, int nPos, BOOL bRedraw = TRUE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return FlatSB_SetScrollPos(nBar, nPos, bRedraw);\r
+       }\r
+\r
+       BOOL GetScrollInfo(int nBar, LPSCROLLINFO lpScrollInfo)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return FlatSB_GetScrollInfo(nBar, lpScrollInfo);\r
+       }\r
+\r
+       BOOL SetScrollInfo(int nBar, LPSCROLLINFO lpScrollInfo, BOOL bRedraw = TRUE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return FlatSB_SetScrollInfo(nBar, lpScrollInfo, bRedraw);\r
+       }\r
+};\r
+\r
+typedef CFSBWindowT<ATL::CWindow>   CFSBWindow;\r
+\r
+#endif // defined(__ATLCTRLS_H__) && (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CZoomScrollImpl - Provides zooming and scrolling support to any window\r
+\r
+#ifndef _WIN32_WCE\r
+\r
+// The zoom modes that can be set with the SetZoomMode method\r
+enum\r
+{\r
+       ZOOMMODE_OFF, \r
+       ZOOMMODE_IN,   // If left mouse button is clicked or dragged, zoom in on point clicked or rectangle dragged.\r
+       ZOOMMODE_OUT   // If left mouse button clicked, zoom out on point clicked.\r
+};\r
+\r
+// Notification to parent that zoom scale changed as a result of user mouse action.\r
+#define ZSN_ZOOMCHANGED        (NM_FIRST - 50) \r
+\r
+template <class T>\r
+class CZoomScrollImpl : public CScrollImpl< T >\r
+{\r
+public:\r
+       enum { m_cxyMinZoomRect = 12 };   // min rect size to zoom in on rect.\r
+\r
+// Data members\r
+       SIZE m_sizeLogAll;              \r
+       SIZE m_sizeLogLine;     \r
+       SIZE m_sizeLogPage;\r
+       float m_fZoomScale;\r
+       float m_fZoomScaleMin;\r
+       float m_fZoomDelta;   // Used in ZOOMMODE_IN and ZOOMMODE_OUT on left-button click.\r
+       int m_nZoomMode;                \r
+       RECT m_rcTrack;\r
+       bool m_bTracking;\r
+\r
+// Constructor\r
+       CZoomScrollImpl():\r
+                       m_fZoomScale(1.0),\r
+                       m_fZoomScaleMin(0.5),\r
+                       m_fZoomDelta(0.5),\r
+                       m_nZoomMode(ZOOMMODE_OFF),\r
+                       m_bTracking(false)\r
+       {\r
+               m_sizeLogAll.cx = 0;\r
+               m_sizeLogAll.cy = 0;\r
+               m_sizeLogPage.cx = 0;\r
+               m_sizeLogPage.cy = 0;\r
+               m_sizeLogLine.cx = 0;\r
+               m_sizeLogLine.cy = 0;\r
+               ::SetRectEmpty(&m_rcTrack);\r
+       }\r
+\r
+// Attributes & Operations\r
+\r
+       // size operations\r
+       void SetScrollSize(int cxLog, int cyLog, BOOL bRedraw = TRUE, bool bResetOffset = true)\r
+       {\r
+               ATLASSERT(cxLog >= 0 && cyLog >= 0);\r
+\r
+               // Set up the defaults\r
+               if (cxLog == 0 && cyLog == 0)\r
+               {\r
+                       cxLog = 1;\r
+                       cyLog = 1;\r
+               }\r
+\r
+               m_sizeLogAll.cx = cxLog;\r
+               m_sizeLogAll.cy = cyLog;\r
+               SIZE sizeAll = { 0 };\r
+               sizeAll.cx = (int)((float)m_sizeLogAll.cx * m_fZoomScale);\r
+               sizeAll.cy = (int)((float)m_sizeLogAll.cy * m_fZoomScale);\r
+\r
+               CScrollImpl< T >::SetScrollSize(sizeAll, bRedraw, bResetOffset);\r
+       }\r
+\r
+       void SetScrollSize(SIZE sizeLog, BOOL bRedraw = TRUE, bool bResetOffset = true)\r
+       {\r
+               SetScrollSize(sizeLog.cx, sizeLog.cy, bRedraw, bResetOffset);\r
+       }\r
+\r
+       void GetScrollSize(SIZE& sizeLog) const\r
+       {\r
+               sizeLog = m_sizeLogAll;\r
+       }\r
+\r
+       // line operations\r
+       void SetScrollLine(int cxLogLine, int cyLogLine)\r
+       {\r
+               ATLASSERT(cxLogLine >= 0 && cyLogLine >= 0);\r
+\r
+               m_sizeLogLine.cx = cxLogLine;\r
+               m_sizeLogLine.cy = cyLogLine;\r
+\r
+               SIZE sizeLine = { 0 };\r
+               sizeLine.cx = (int)((float)m_sizeLogLine.cx * m_fZoomScale);\r
+               sizeLine.cy = (int)((float)m_sizeLogLine.cy * m_fZoomScale);\r
+               CScrollImpl< T >::SetScrollLine(sizeLine);\r
+       }\r
+\r
+       void SetScrollLine(SIZE sizeLogLine)\r
+       {\r
+               SetScrollLine(sizeLogLine.cx, sizeLogLine.cy);\r
+       }\r
+\r
+       void GetScrollLine(SIZE& sizeLogLine) const\r
+       {\r
+               sizeLogLine = m_sizeLogLine;\r
+       }\r
+\r
+       // page operations\r
+       void SetScrollPage(int cxLogPage, int cyLogPage)\r
+       {\r
+               ATLASSERT(cxLogPage >= 0 && cyLogPage >= 0);\r
+\r
+               m_sizeLogPage.cx = cxLogPage;\r
+               m_sizeLogPage.cy = cyLogPage;\r
+\r
+               SIZE sizePage = { 0 };\r
+               sizePage.cx = (int)((float)m_sizeLogPage.cx * m_fZoomScale);\r
+               sizePage.cy = (int)((float)m_sizeLogPage.cy * m_fZoomScale);\r
+\r
+               CScrollImpl< T >::SetScrollPage(sizePage);\r
+       }\r
+\r
+       void SetScrollPage(SIZE sizeLogPage)\r
+       {\r
+               SetScrollPage(sizeLogPage.cx, sizeLogPage.cy);\r
+       }\r
+\r
+       void GetScrollPage(SIZE& sizeLogPage) const\r
+       {\r
+               sizeLogPage = m_sizeLogPage;\r
+       }\r
+\r
+       void SetZoomScale(float fZoomScale)\r
+       {\r
+               ATLASSERT(fZoomScale > 0);\r
+\r
+               if(fZoomScale > 0 && fZoomScale >= m_fZoomScaleMin)\r
+                       m_fZoomScale = fZoomScale;\r
+       }\r
+\r
+       float GetZoomScale() const\r
+       {\r
+               return m_fZoomScale;\r
+       }\r
+\r
+       void SetZoomScaleMin(float fZoomScaleMin)\r
+       {\r
+               m_fZoomScaleMin = fZoomScaleMin;\r
+       }\r
+\r
+       float GetZoomScaleMin() const\r
+       {\r
+               return m_fZoomScaleMin;\r
+       }\r
+\r
+       void SetZoomDelta(float fZoomDelta)\r
+       {\r
+               ATLASSERT(fZoomDelta >= 0);\r
+\r
+               if(fZoomDelta >= 0)\r
+                       m_fZoomDelta = fZoomDelta;\r
+       }\r
+\r
+       float GetZoomDelta() const\r
+       {\r
+               return m_fZoomDelta;\r
+       }\r
+\r
+       void SetZoomMode(int nZoomMode)\r
+       {\r
+               m_nZoomMode = nZoomMode;\r
+       }\r
+\r
+       int GetZoomMode() const\r
+       {\r
+               return m_nZoomMode;\r
+       }\r
+\r
+       void Zoom(int x, int y, float fZoomScale)\r
+       {\r
+               if(fZoomScale <= 0)\r
+                       return;\r
+\r
+               fZoomScale = max(fZoomScale, m_fZoomScaleMin);\r
+\r
+               T* pT = static_cast<T*>(this);\r
+               POINT pt = { x, y };\r
+               if(!pT->PtInDevRect(pt))\r
+                       return;\r
+\r
+               pT->ViewDPtoLP(&pt);\r
+               pT->Zoom(fZoomScale, false);\r
+               pT->CenterOnLogicalPoint(pt);\r
+       }\r
+\r
+       void Zoom(POINT pt, float fZoomScale)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               pT->Zoom(pt.x, pt.y, fZoomScale);\r
+       }\r
+\r
+       void Zoom(RECT& rc)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               RECT rcZoom = rc;\r
+               pT->NormalizeRect(rcZoom);\r
+               SIZE size = { rcZoom.right - rcZoom.left, rcZoom.bottom - rcZoom.top };\r
+               POINT pt = { rcZoom.left + size.cx / 2, rcZoom.top + size.cy / 2 };\r
+               if(size.cx < m_cxyMinZoomRect || size.cy < m_cxyMinZoomRect)\r
+               {\r
+                       pT->Zoom(pt, m_fZoomScale + m_fZoomDelta);\r
+                       return;\r
+               }\r
+\r
+               ATLASSERT(size.cx > 0 && size.cy > 0);\r
+               \r
+               float fScaleH = (float)(m_sizeClient.cx  + 1) / (float)size.cx;\r
+               float fScaleV = (float)(m_sizeClient.cy + 1) / (float)size.cy;\r
+               float fZoomScale = min(fScaleH, fScaleV) * m_fZoomScale;\r
+               pT->Zoom(pt, fZoomScale);               \r
+       }\r
+\r
+       void Zoom(float fZoomScale, bool bCenter = true)\r
+       {\r
+               if(fZoomScale <= 0)\r
+                       return;\r
+\r
+               fZoomScale = max(fZoomScale, m_fZoomScaleMin);\r
+\r
+\r
+               T* pT = static_cast<T*>(this);\r
+               POINT pt = { 0 };\r
+               if(bCenter)\r
+               {\r
+                       RECT rc;\r
+                       ::GetClientRect(pT->m_hWnd, &rc);\r
+                       pt.x = rc.right / 2;\r
+                       pt.y = rc.bottom / 2;\r
+                       pT->ViewDPtoLP(&pt);\r
+               }\r
+\r
+               // Modify the Viewport extent\r
+               m_fZoomScale = fZoomScale;\r
+               SIZE sizeAll = { 0 };\r
+               sizeAll.cx = (int)((float)m_sizeLogAll.cx * fZoomScale);\r
+               sizeAll.cy = (int)((float)m_sizeLogAll.cy * fZoomScale);\r
+               \r
+               // Update scroll bars and window\r
+               CScrollImpl< T >::SetScrollSize(sizeAll);\r
+\r
+               if(bCenter)\r
+                       pT->CenterOnLogicalPoint(pt);\r
+       }\r
+\r
+       // Helper functions\r
+       void PrepareDC(CDCHandle dc)\r
+       {\r
+               ATLASSERT(m_sizeAll.cx >= 0 && m_sizeAll.cy >= 0);\r
+               dc.SetMapMode(MM_ANISOTROPIC);\r
+               dc.SetWindowExt(m_sizeLogAll);\r
+               dc.SetViewportExt(m_sizeAll);\r
+               dc.SetViewportOrg(-m_ptOffset.x, -m_ptOffset.y);\r
+       }\r
+\r
+       void ViewDPtoLP(LPPOINT lpPoints, int nCount = 1)\r
+       {\r
+               ATLASSERT(lpPoints);\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(::IsWindow(pT->m_hWnd));\r
+\r
+               CWindowDC dc(pT->m_hWnd);\r
+               pT->PrepareDC(dc.m_hDC);\r
+               dc.DPtoLP(lpPoints, nCount);\r
+       }\r
+\r
+       void ViewLPtoDP(LPPOINT lpPoints, int nCount = 1)\r
+       {\r
+               ATLASSERT(lpPoints);\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(::IsWindow(pT->m_hWnd));\r
+       \r
+               CWindowDC dc(pT->m_hWnd);\r
+               pT->PrepareDC(dc.m_hDC);\r
+               dc.LPtoDP(lpPoints, nCount);\r
+       }\r
+\r
+       void ClientToDevice(POINT &pt)\r
+       {\r
+               pt.x += m_ptOffset.x;\r
+               pt.y += m_ptOffset.y;\r
+       }        \r
+\r
+       void DeviceToClient(POINT &pt)\r
+       {\r
+               pt.x -= m_ptOffset.x;\r
+               pt.y -= m_ptOffset.y;\r
+       }\r
+\r
+       void CenterOnPoint(POINT pt)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               RECT rect;\r
+               pT->GetClientRect(&rect);\r
+\r
+               int xOfs = pt.x - (rect.right / 2) + m_ptOffset.x;\r
+               if(xOfs < 0)\r
+               {\r
+                       xOfs = 0;\r
+               }\r
+               else \r
+               {\r
+                       int xMax = max((int)(m_sizeAll.cx - rect.right), 0);\r
+                       if(xOfs > xMax)\r
+                               xOfs = xMax;\r
+               }\r
+               \r
+               int yOfs = pt.y - (rect.bottom / 2) + m_ptOffset.y;\r
+               if(yOfs < 0)\r
+               {\r
+                       yOfs = 0;\r
+               }\r
+               else \r
+               {\r
+                       int yMax = max((int)(m_sizeAll.cy - rect.bottom), 0);\r
+                       if(yOfs > yMax)\r
+                               yOfs = yMax;\r
+               }\r
+\r
+               CScrollImpl< T >::SetScrollOffset(xOfs, yOfs);\r
+       }\r
+\r
+       void CenterOnLogicalPoint(POINT ptLog)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               pT->ViewLPtoDP(&ptLog);\r
+               pT->DeviceToClient(ptLog);\r
+               pT->CenterOnPoint(ptLog);\r
+       }\r
+\r
+       BOOL PtInDevRect(POINT pt)\r
+       {\r
+               RECT rc = { 0, 0, m_sizeAll.cx, m_sizeAll.cy };\r
+               ::OffsetRect(&rc, -m_ptOffset.x, -m_ptOffset.y);\r
+               return ::PtInRect(&rc, pt);\r
+       }\r
+\r
+       void NormalizeRect(RECT& rc)\r
+       {\r
+               if(rc.left > rc.right) \r
+               {\r
+                       int r = rc.right;\r
+                       rc.right = rc.left;\r
+                       rc.left = r;\r
+               }\r
+               if(rc.top > rc.bottom)\r
+               {\r
+                       int b = rc.bottom;\r
+                       rc.bottom = rc.top;\r
+                       rc.top = b;\r
+               }\r
+       }\r
+\r
+       void DrawTrackRect()\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               const SIZE sizeLines = { 2, 2 };\r
+               RECT rc = m_rcTrack;\r
+               pT->NormalizeRect(rc);\r
+               if(!::IsRectEmpty(&rc))\r
+               {\r
+                       ::MapWindowPoints(pT->m_hWnd, NULL, (LPPOINT)&rc, 2);\r
+                       CWindowDC dc(NULL);\r
+                       dc.DrawDragRect(&rc, sizeLines, NULL, sizeLines);\r
+               }\r
+       }\r
+\r
+       void NotifyParentZoomChanged()\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               int nId = pT->GetDlgCtrlID();\r
+               NMHDR nmhdr = { pT->m_hWnd, nId, ZSN_ZOOMCHANGED };\r
+               ::SendMessage(pT->GetParent(), WM_NOTIFY, (WPARAM)nId, (LPARAM)&nmhdr);\r
+       }\r
+\r
+       BEGIN_MSG_MAP(CZoomScrollImpl)\r
+               MESSAGE_HANDLER(WM_SETCURSOR, OnSetCursor)\r
+               MESSAGE_HANDLER(WM_VSCROLL, CScrollImpl< T >::OnVScroll)\r
+               MESSAGE_HANDLER(WM_HSCROLL, CScrollImpl< T >::OnHScroll)\r
+               MESSAGE_HANDLER(WM_MOUSEWHEEL, CScrollImpl< T >::OnMouseWheel)\r
+#if !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400))\r
+               MESSAGE_HANDLER(m_uMsgMouseWheel, CScrollImpl< T >::OnMouseWheel)\r
+#endif // !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400))\r
+               MESSAGE_HANDLER(WM_MOUSEHWHEEL, CScrollImpl< T >::OnMouseHWheel)\r
+               MESSAGE_HANDLER(WM_SETTINGCHANGE, CScrollImpl< T >::OnSettingChange)\r
+               MESSAGE_HANDLER(WM_SIZE, CScrollImpl< T >::OnSize)\r
+               MESSAGE_HANDLER(WM_PAINT, OnPaint)\r
+               MESSAGE_HANDLER(WM_PRINTCLIENT, OnPaint)\r
+               MESSAGE_HANDLER(WM_LBUTTONDOWN, OnLButtonDown)\r
+               MESSAGE_HANDLER(WM_MOUSEMOVE, OnMouseMove)\r
+               MESSAGE_HANDLER(WM_LBUTTONUP, OnLButtonUp)\r
+               MESSAGE_HANDLER(WM_CAPTURECHANGED, OnCaptureChanged)\r
+       ALT_MSG_MAP(1)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_UP, CScrollImpl< T >::OnScrollUp)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_DOWN, CScrollImpl< T >::OnScrollDown)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_PAGE_UP, CScrollImpl< T >::OnScrollPageUp)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_PAGE_DOWN, CScrollImpl< T >::OnScrollPageDown)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_TOP, CScrollImpl< T >::OnScrollTop)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_BOTTOM, CScrollImpl< T >::OnScrollBottom)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_LEFT, CScrollImpl< T >::OnScrollLeft)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_RIGHT, CScrollImpl< T >::OnScrollRight)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_PAGE_LEFT, CScrollImpl< T >::OnScrollPageLeft)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_PAGE_RIGHT, CScrollImpl< T >::OnScrollPageRight)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_ALL_LEFT, CScrollImpl< T >::OnScrollAllLeft)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_ALL_RIGHT, CScrollImpl< T >::OnScrollAllRight)\r
+       END_MSG_MAP()\r
+\r
+       LRESULT OnPaint(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(::IsWindow(pT->m_hWnd));\r
+               ATLASSERT(m_sizeLogAll.cx >= 0 && m_sizeLogAll.cy >= 0);\r
+               ATLASSERT(m_sizeAll.cx >= 0 && m_sizeAll.cy >= 0);\r
+\r
+               if(wParam != NULL)\r
+               {\r
+                       CDCHandle dc = (HDC)wParam;\r
+                       int nMapModeSav = dc.GetMapMode();\r
+                       dc.SetMapMode(MM_ANISOTROPIC);\r
+                       SIZE szWindowExt = { 0, 0 };\r
+                       dc.SetWindowExt(m_sizeLogAll, &szWindowExt);\r
+                       SIZE szViewportExt = { 0, 0 };\r
+                       dc.SetViewportExt(m_sizeAll, &szViewportExt);\r
+                       POINT ptViewportOrg = { 0, 0 };\r
+                       dc.SetViewportOrg(-m_ptOffset.x, -m_ptOffset.y, &ptViewportOrg);\r
+\r
+                       pT->DoPaint(dc);\r
+\r
+                       dc.SetMapMode(nMapModeSav);\r
+                       dc.SetWindowExt(szWindowExt);\r
+                       dc.SetViewportExt(szViewportExt);\r
+                       dc.SetViewportOrg(ptViewportOrg);\r
+               }\r
+               else\r
+               {\r
+                       CPaintDC dc(pT->m_hWnd);\r
+                       pT->PrepareDC(dc.m_hDC);\r
+                       pT->DoPaint(dc.m_hDC);\r
+               }\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnLButtonDown(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled)\r
+       {\r
+               if(m_nZoomMode == ZOOMMODE_IN && !m_bTracking)\r
+               {\r
+                       T* pT = static_cast<T*>(this);\r
+                       POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };\r
+                       if(pT->PtInDevRect(pt))\r
+                       {\r
+                               pT->SetCapture();\r
+                               m_bTracking = true;\r
+                               ::SetRect(&m_rcTrack, pt.x, pt.y, pt.x, pt.y);\r
+                       }       \r
+               }\r
+               bHandled = FALSE;\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnMouseMove(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled)\r
+       {\r
+               if(m_bTracking)\r
+               {\r
+                       T* pT = static_cast<T*>(this);\r
+                       POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };\r
+                       if(pT->PtInDevRect(pt))\r
+                       {\r
+                               pT->DrawTrackRect();\r
+                               m_rcTrack.right = pt.x;\r
+                               m_rcTrack.bottom = pt.y;\r
+                               pT->DrawTrackRect();\r
+                       }\r
+               }\r
+               bHandled = FALSE;\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnLButtonUp(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled)\r
+       {\r
+               ::ReleaseCapture();\r
+               if(m_nZoomMode == ZOOMMODE_OUT)\r
+               {\r
+                       T* pT = static_cast<T*>(this);\r
+                       pT->Zoom(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam), m_fZoomScale - m_fZoomDelta);\r
+                       pT->NotifyParentZoomChanged();\r
+               }\r
+               bHandled = FALSE;\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnCaptureChanged(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)\r
+       {\r
+               if(m_bTracking)\r
+               {\r
+                       m_bTracking = false;\r
+                       T* pT = static_cast<T*>(this);\r
+                       pT->DrawTrackRect();\r
+                       pT->Zoom(m_rcTrack);\r
+                       pT->NotifyParentZoomChanged();\r
+                       ::SetRectEmpty(&m_rcTrack);\r
+               }\r
+               bHandled = FALSE;\r
+               return 0;\r
+       }       \r
+\r
+       LRESULT OnSetCursor(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled)\r
+       {\r
+               if(LOWORD(lParam) == HTCLIENT && m_nZoomMode != ZOOMMODE_OFF)\r
+               {\r
+                       T* pT = static_cast<T*>(this);\r
+                       if((HWND)wParam == pT->m_hWnd)\r
+                       {\r
+                               DWORD dwPos = ::GetMessagePos();\r
+                               POINT pt = { GET_X_LPARAM(dwPos), GET_Y_LPARAM(dwPos) };\r
+                               pT->ScreenToClient(&pt);\r
+                               if(pT->PtInDevRect(pt))\r
+                               {\r
+                                       ::SetCursor(::LoadCursor(NULL, IDC_CROSS));\r
+                                       return 1;\r
+                               }\r
+                       }\r
+               }\r
+               bHandled = FALSE;\r
+               return 0;\r
+       }\r
+};\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CZoomScrollWindowImpl - Implements scrolling window with zooming\r
+\r
+template <class T, class TBase = ATL::CWindow, class TWinTraits = ATL::CControlWinTraits>\r
+class ATL_NO_VTABLE CZoomScrollWindowImpl : public ATL::CWindowImpl< T, TBase, TWinTraits >, public CZoomScrollImpl< T >\r
+{\r
+public:\r
+       BEGIN_MSG_MAP(CZoomScrollWindowImpl)\r
+               MESSAGE_HANDLER(WM_SETCURSOR, CZoomScrollImpl< T >::OnSetCursor)\r
+               MESSAGE_HANDLER(WM_VSCROLL, CScrollImpl< T >::OnVScroll)\r
+               MESSAGE_HANDLER(WM_HSCROLL, CScrollImpl< T >::OnHScroll)\r
+               MESSAGE_HANDLER(WM_MOUSEWHEEL, CScrollImpl< T >::OnMouseWheel)\r
+#if !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400))\r
+               MESSAGE_HANDLER(m_uMsgMouseWheel, CScrollImpl< T >::OnMouseWheel)\r
+#endif // !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400))\r
+               MESSAGE_HANDLER(WM_MOUSEHWHEEL, CScrollImpl< T >::OnMouseHWheel)\r
+               MESSAGE_HANDLER(WM_SETTINGCHANGE, CScrollImpl< T >::OnSettingChange)\r
+               MESSAGE_HANDLER(WM_SIZE, CScrollImpl< T >::OnSize)\r
+               MESSAGE_HANDLER(WM_PAINT, CZoomScrollImpl< T >::OnPaint)\r
+               MESSAGE_HANDLER(WM_PRINTCLIENT, CZoomScrollImpl< T >::OnPaint)\r
+               MESSAGE_HANDLER(WM_LBUTTONDOWN, CZoomScrollImpl< T >::OnLButtonDown)\r
+               MESSAGE_HANDLER(WM_MOUSEMOVE, CZoomScrollImpl< T >::OnMouseMove)\r
+               MESSAGE_HANDLER(WM_LBUTTONUP, CZoomScrollImpl< T >::OnLButtonUp)\r
+               MESSAGE_HANDLER(WM_CAPTURECHANGED, CZoomScrollImpl< T >::OnCaptureChanged)\r
+       ALT_MSG_MAP(1)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_UP, CScrollImpl< T >::OnScrollUp)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_DOWN, CScrollImpl< T >::OnScrollDown)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_PAGE_UP, CScrollImpl< T >::OnScrollPageUp)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_PAGE_DOWN, CScrollImpl< T >::OnScrollPageDown)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_TOP, CScrollImpl< T >::OnScrollTop)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_BOTTOM, CScrollImpl< T >::OnScrollBottom)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_LEFT, CScrollImpl< T >::OnScrollLeft)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_RIGHT, CScrollImpl< T >::OnScrollRight)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_PAGE_LEFT, CScrollImpl< T >::OnScrollPageLeft)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_PAGE_RIGHT, CScrollImpl< T >::OnScrollPageRight)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_ALL_LEFT, CScrollImpl< T >::OnScrollAllLeft)\r
+               COMMAND_ID_HANDLER(ID_SCROLL_ALL_RIGHT, CScrollImpl< T >::OnScrollAllRight)\r
+       END_MSG_MAP()\r
+};\r
+\r
+#endif // !_WIN32_WCE\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CScrollContainer\r
+\r
+template <class T, class TBase = ATL::CWindow, class TWinTraits = ATL::CControlWinTraits>\r
+class ATL_NO_VTABLE CScrollContainerImpl : public CScrollWindowImpl< T, TBase, TWinTraits >\r
+{\r
+public:\r
+       DECLARE_WND_CLASS_EX(NULL, 0, -1)\r
+\r
+       typedef CScrollWindowImpl< T, TBase, TWinTraits >   _baseClass;\r
+\r
+// Data members\r
+       ATL::CWindow m_wndClient;\r
+       bool m_bAutoSizeClient;\r
+       bool m_bDrawEdgeIfEmpty;\r
+\r
+// Constructor\r
+       CScrollContainerImpl() : m_bAutoSizeClient(true), m_bDrawEdgeIfEmpty(false)\r
+       {\r
+               // Set CScrollWindowImpl extended style\r
+               SetScrollExtendedStyle(SCRL_SCROLLCHILDREN);\r
+       }\r
+\r
+// Attributes\r
+       HWND GetClient() const\r
+       {\r
+               return m_wndClient;\r
+       }\r
+\r
+       HWND SetClient(HWND hWndClient, bool bClientSizeAsMin = true)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+\r
+               HWND hWndOldClient = m_wndClient;\r
+               m_wndClient = hWndClient;\r
+\r
+               SetRedraw(FALSE);\r
+               SetScrollSize(1, 1, FALSE);\r
+\r
+               if(m_wndClient.m_hWnd != NULL)\r
+               {\r
+                       m_wndClient.SetWindowPos(NULL, 0, 0, 0, 0, SWP_NOZORDER | SWP_NOSIZE);\r
+\r
+                       if(bClientSizeAsMin)\r
+                       {\r
+                               RECT rect = { 0 };\r
+                               m_wndClient.GetWindowRect(&rect);\r
+                               if((rect.right - rect.left) > 0 && (rect.bottom - rect.top) > 0)\r
+                                       SetScrollSize(rect.right - rect.left, rect.bottom - rect.top, FALSE);\r
+                       }\r
+\r
+                       T* pT = static_cast<T*>(this);\r
+                       pT->UpdateLayout();\r
+               }\r
+\r
+               SetRedraw(TRUE);\r
+               RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_FRAME | RDW_UPDATENOW | RDW_ALLCHILDREN);\r
+\r
+               return hWndOldClient;\r
+       }\r
+\r
+// Message map and handlers\r
+       BEGIN_MSG_MAP(CScrollContainerImpl)\r
+               MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)\r
+               MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground)\r
+               MESSAGE_HANDLER(WM_SIZE, OnSize)\r
+               CHAIN_MSG_MAP(_baseClass)\r
+               FORWARD_NOTIFICATIONS()\r
+       ALT_MSG_MAP(1)\r
+               CHAIN_MSG_MAP_ALT(_baseClass, 1)\r
+       END_MSG_MAP()\r
+\r
+       LRESULT OnSetFocus(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)\r
+       {\r
+               if(m_wndClient.m_hWnd != NULL)\r
+                       m_wndClient.SetFocus();\r
+\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnEraseBackground(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)\r
+       {\r
+               return 1;   // no background needed\r
+       }\r
+\r
+       LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)\r
+       {\r
+               BOOL bTmp = TRUE;\r
+               LRESULT lRet = _baseClass::OnSize(uMsg, wParam, lParam, bTmp);\r
+\r
+               T* pT = static_cast<T*>(this);\r
+               pT->UpdateLayout();\r
+\r
+               return lRet;\r
+       }\r
+\r
+// Overrides for CScrollWindowImpl\r
+       void DoPaint(CDCHandle dc)\r
+       {\r
+               if(!m_bAutoSizeClient || m_wndClient.m_hWnd == NULL)\r
+               {\r
+                       T* pT = static_cast<T*>(this);\r
+                       RECT rect = { 0 };\r
+                       pT->GetContainerRect(rect);\r
+\r
+                       if(m_bDrawEdgeIfEmpty && m_wndClient.m_hWnd == NULL)\r
+                               dc.DrawEdge(&rect, EDGE_SUNKEN, BF_RECT | BF_ADJUST);\r
+\r
+                       dc.FillRect(&rect, COLOR_APPWORKSPACE);\r
+               }\r
+       }\r
+\r
+       void ScrollToView(POINT pt)\r
+       {\r
+               CScrollWindowImpl< T, TBase, TWinTraits >::ScrollToView(pt);\r
+       }\r
+\r
+       void ScrollToView(RECT& rect)\r
+       {\r
+               CScrollWindowImpl< T, TBase, TWinTraits >::ScrollToView(rect);\r
+       }\r
+\r
+       void ScrollToView(HWND hWnd)   // client window coordinates\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               pT;   // avoid level 4 warning\r
+               ATLASSERT(::IsWindow(pT->m_hWnd));\r
+               ATLASSERT(m_wndClient.IsWindow());\r
+\r
+               RECT rect = { 0 };\r
+               ::GetWindowRect(hWnd, &rect);\r
+               ::MapWindowPoints(NULL, m_wndClient.m_hWnd, (LPPOINT)&rect, 2);\r
+               ScrollToView(rect);\r
+       }\r
+\r
+// Implementation - overrideable methods\r
+       void UpdateLayout()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+\r
+               if(m_bAutoSizeClient && m_wndClient.m_hWnd != NULL)\r
+               {\r
+                       T* pT = static_cast<T*>(this);\r
+                       RECT rect = { 0 };\r
+                       pT->GetContainerRect(rect);\r
+\r
+                       m_wndClient.SetWindowPos(NULL, &rect, SWP_NOZORDER | SWP_NOMOVE);\r
+               }\r
+               else\r
+               {\r
+                       Invalidate();\r
+               }\r
+       }\r
+\r
+       void GetContainerRect(RECT& rect)\r
+       {\r
+               GetClientRect(&rect);\r
+\r
+               if(rect.right < m_sizeAll.cx)\r
+                       rect.right = m_sizeAll.cx;\r
+\r
+               if(rect.bottom < m_sizeAll.cy)\r
+                       rect.bottom = m_sizeAll.cy;\r
+       }\r
+};\r
+\r
+class CScrollContainer : public CScrollContainerImpl<CScrollContainer>\r
+{\r
+public:\r
+       DECLARE_WND_CLASS_EX(_T("WTL_ScrollContainer"), 0, -1)\r
+};\r
+\r
+}; // namespace WTL\r
+\r
+#endif // __ATLSCRL_H__\r
diff --git a/WTL80/include/atlsplit.h b/WTL80/include/atlsplit.h
new file mode 100644 (file)
index 0000000..df879db
--- /dev/null
@@ -0,0 +1,892 @@
+// Windows Template Library - WTL version 8.0\r
+// Copyright (C) Microsoft Corporation. All rights reserved.\r
+//\r
+// This file is a part of the Windows Template Library.\r
+// The use and distribution terms for this software are covered by the\r
+// Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php)\r
+// which can be found in the file CPL.TXT at the root of this distribution.\r
+// By using this software in any fashion, you are agreeing to be bound by\r
+// the terms of this license. You must not remove this notice, or\r
+// any other, from this software.\r
+\r
+#ifndef __ATLSPLIT_H__\r
+#define __ATLSPLIT_H__\r
+\r
+#pragma once\r
+\r
+#ifndef __cplusplus\r
+       #error ATL requires C++ compilation (use a .cpp suffix)\r
+#endif\r
+\r
+#ifndef __ATLAPP_H__\r
+       #error atlsplit.h requires atlapp.h to be included first\r
+#endif\r
+\r
+#ifndef __ATLWIN_H__\r
+       #error atlsplit.h requires atlwin.h to be included first\r
+#endif\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Classes in this file:\r
+//\r
+// CSplitterImpl<T, t_bVertical>\r
+// CSplitterWindowImpl<T, t_bVertical, TBase, TWinTraits>\r
+// CSplitterWindowT<t_bVertical>\r
+\r
+\r
+namespace WTL\r
+{\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CSplitterImpl - Provides splitter support to any window\r
+\r
+// Splitter panes constants\r
+#define SPLIT_PANE_LEFT                         0\r
+#define SPLIT_PANE_RIGHT                1\r
+#define SPLIT_PANE_TOP                  SPLIT_PANE_LEFT\r
+#define SPLIT_PANE_BOTTOM               SPLIT_PANE_RIGHT\r
+#define SPLIT_PANE_NONE                        -1\r
+\r
+// Splitter extended styles\r
+#define SPLIT_PROPORTIONAL             0x00000001\r
+#define SPLIT_NONINTERACTIVE           0x00000002\r
+#define SPLIT_RIGHTALIGNED             0x00000004\r
+#define SPLIT_BOTTOMALIGNED            SPLIT_RIGHTALIGNED\r
+\r
+// Note: SPLIT_PROPORTIONAL and SPLIT_RIGHTALIGNED/SPLIT_BOTTOMALIGNED are \r
+// mutually exclusive. If both are set, splitter defaults to SPLIT_PROPORTIONAL\r
+\r
+\r
+template <class T, bool t_bVertical = true>\r
+class CSplitterImpl\r
+{\r
+public:\r
+       enum { m_nPanesCount = 2, m_nPropMax = 10000 };\r
+\r
+       HWND m_hWndPane[m_nPanesCount];\r
+       RECT m_rcSplitter;\r
+       int m_xySplitterPos;\r
+       int m_nDefActivePane;\r
+       int m_cxySplitBar;              // splitter bar width/height\r
+       static HCURSOR m_hCursor;\r
+       int m_cxyMin;                   // minimum pane size\r
+       int m_cxyBarEdge;               // splitter bar edge\r
+       bool m_bFullDrag;\r
+       int m_cxyDragOffset;\r
+       int m_nProportionalPos;\r
+       bool m_bUpdateProportionalPos;\r
+       DWORD m_dwExtendedStyle;       // splitter specific extended styles\r
+       int m_nSinglePane;             // single pane mode\r
+\r
+// Constructor\r
+       CSplitterImpl() :\r
+                       m_xySplitterPos(-1), m_nDefActivePane(SPLIT_PANE_NONE), \r
+                       m_cxySplitBar(0), m_cxyMin(0), m_cxyBarEdge(0), m_bFullDrag(true), \r
+                       m_cxyDragOffset(0), m_nProportionalPos(0), m_bUpdateProportionalPos(true),\r
+                       m_dwExtendedStyle(SPLIT_PROPORTIONAL),\r
+                       m_nSinglePane(SPLIT_PANE_NONE)\r
+       {\r
+               m_hWndPane[SPLIT_PANE_LEFT] = NULL;\r
+               m_hWndPane[SPLIT_PANE_RIGHT] = NULL;\r
+\r
+               ::SetRectEmpty(&m_rcSplitter);\r
+\r
+               if(m_hCursor == NULL)\r
+               {\r
+                       CStaticDataInitCriticalSectionLock lock;\r
+                       if(FAILED(lock.Lock()))\r
+                       {\r
+                               ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CSplitterImpl::CSplitterImpl.\n"));\r
+                               ATLASSERT(FALSE);\r
+                               return;\r
+                       }\r
+\r
+                       if(m_hCursor == NULL)\r
+                               m_hCursor = ::LoadCursor(NULL, t_bVertical ? IDC_SIZEWE : IDC_SIZENS);\r
+\r
+                       lock.Unlock();\r
+               }\r
+       }\r
+\r
+// Attributes\r
+       void SetSplitterRect(LPRECT lpRect = NULL, bool bUpdate = true)\r
+       {\r
+               if(lpRect == NULL)\r
+               {\r
+                       T* pT = static_cast<T*>(this);\r
+                       pT->GetClientRect(&m_rcSplitter);\r
+               }\r
+               else\r
+               {\r
+                       m_rcSplitter = *lpRect;\r
+               }\r
+\r
+               if(IsProportional())\r
+                       UpdateProportionalPos();\r
+               else if(IsRightAligned())\r
+                       UpdateRightAlignPos();\r
+\r
+               if(bUpdate)\r
+                       UpdateSplitterLayout();\r
+       }\r
+\r
+       void GetSplitterRect(LPRECT lpRect) const\r
+       {\r
+               ATLASSERT(lpRect != NULL);\r
+               *lpRect = m_rcSplitter;\r
+       }\r
+\r
+       bool SetSplitterPos(int xyPos = -1, bool bUpdate = true)\r
+       {\r
+               if(xyPos == -1)   // -1 == middle\r
+               {\r
+                       if(t_bVertical)\r
+                               xyPos = (m_rcSplitter.right - m_rcSplitter.left - m_cxySplitBar - m_cxyBarEdge) / 2;\r
+                       else\r
+                               xyPos = (m_rcSplitter.bottom - m_rcSplitter.top - m_cxySplitBar - m_cxyBarEdge) / 2;\r
+               }\r
+\r
+               // Adjust if out of valid range\r
+               int cxyMax = 0;\r
+               if(t_bVertical)\r
+                       cxyMax = m_rcSplitter.right - m_rcSplitter.left;\r
+               else\r
+                       cxyMax = m_rcSplitter.bottom - m_rcSplitter.top;\r
+\r
+               if(xyPos < m_cxyMin + m_cxyBarEdge)\r
+                       xyPos = m_cxyMin;\r
+               else if(xyPos > (cxyMax - m_cxySplitBar - m_cxyBarEdge - m_cxyMin))\r
+                       xyPos = cxyMax - m_cxySplitBar - m_cxyBarEdge - m_cxyMin;\r
+\r
+               // Set new position and update if requested\r
+               bool bRet = (m_xySplitterPos != xyPos);\r
+               m_xySplitterPos = xyPos;\r
+\r
+               if(m_bUpdateProportionalPos)\r
+               {\r
+                       if(IsProportional())\r
+                               StoreProportionalPos();\r
+                       else if(IsRightAligned())\r
+                               StoreRightAlignPos();\r
+               }\r
+               else\r
+               {\r
+                       m_bUpdateProportionalPos = true;\r
+               }\r
+\r
+               if(bUpdate && bRet)\r
+                       UpdateSplitterLayout();\r
+\r
+               return bRet;\r
+       }\r
+\r
+       void SetSplitterPosPct(int nPct, bool bUpdate = true)\r
+       {\r
+               ATLASSERT(nPct >= 0 && nPct <= 100);\r
+\r
+               m_nProportionalPos = ::MulDiv(nPct, m_nPropMax, 100);\r
+               UpdateProportionalPos();\r
+\r
+               if(bUpdate)\r
+                       UpdateSplitterLayout();\r
+       }\r
+\r
+       int GetSplitterPos() const\r
+       {\r
+               return m_xySplitterPos;\r
+       }\r
+\r
+       bool SetSinglePaneMode(int nPane = SPLIT_PANE_NONE)\r
+       {\r
+               ATLASSERT(nPane == SPLIT_PANE_LEFT || nPane == SPLIT_PANE_RIGHT || nPane == SPLIT_PANE_NONE);\r
+               if(!(nPane == SPLIT_PANE_LEFT || nPane == SPLIT_PANE_RIGHT || nPane == SPLIT_PANE_NONE))\r
+                       return false;\r
+\r
+               if(nPane != SPLIT_PANE_NONE)\r
+               {\r
+                       if(!::IsWindowVisible(m_hWndPane[nPane]))\r
+                               ::ShowWindow(m_hWndPane[nPane], SW_SHOW);\r
+                       int nOtherPane = (nPane == SPLIT_PANE_LEFT) ? SPLIT_PANE_RIGHT : SPLIT_PANE_LEFT;\r
+                       ::ShowWindow(m_hWndPane[nOtherPane], SW_HIDE);\r
+                       if(m_nDefActivePane != nPane)\r
+                               m_nDefActivePane = nPane;\r
+               }\r
+               else if(m_nSinglePane != SPLIT_PANE_NONE)\r
+               {\r
+                       int nOtherPane = (m_nSinglePane == SPLIT_PANE_LEFT) ? SPLIT_PANE_RIGHT : SPLIT_PANE_LEFT;\r
+                       ::ShowWindow(m_hWndPane[nOtherPane], SW_SHOW);\r
+               }\r
+\r
+               m_nSinglePane = nPane;\r
+               UpdateSplitterLayout();\r
+               return true;\r
+       }\r
+\r
+       int GetSinglePaneMode() const\r
+       {\r
+               return m_nSinglePane;\r
+       }\r
+\r
+       DWORD GetSplitterExtendedStyle() const\r
+       {\r
+               return m_dwExtendedStyle;\r
+       }\r
+\r
+       DWORD SetSplitterExtendedStyle(DWORD dwExtendedStyle, DWORD dwMask = 0)\r
+       {\r
+               DWORD dwPrevStyle = m_dwExtendedStyle;\r
+               if(dwMask == 0)\r
+                       m_dwExtendedStyle = dwExtendedStyle;\r
+               else\r
+                       m_dwExtendedStyle = (m_dwExtendedStyle & ~dwMask) | (dwExtendedStyle & dwMask);\r
+#ifdef _DEBUG\r
+               if(IsProportional() && IsRightAligned())\r
+                       ATLTRACE2(atlTraceUI, 0, _T("CSplitterImpl::SetSplitterExtendedStyle - SPLIT_PROPORTIONAL and SPLIT_RIGHTALIGNED are mutually exclusive, defaulting to SPLIT_PROPORTIONAL.\n"));\r
+#endif // _DEBUG\r
+               return dwPrevStyle;\r
+       }\r
+\r
+// Splitter operations\r
+       void SetSplitterPanes(HWND hWndLeftTop, HWND hWndRightBottom, bool bUpdate = true)\r
+       {\r
+               m_hWndPane[SPLIT_PANE_LEFT] = hWndLeftTop;\r
+               m_hWndPane[SPLIT_PANE_RIGHT] = hWndRightBottom;\r
+               ATLASSERT(m_hWndPane[SPLIT_PANE_LEFT] == NULL || m_hWndPane[SPLIT_PANE_RIGHT] == NULL || m_hWndPane[SPLIT_PANE_LEFT] != m_hWndPane[SPLIT_PANE_RIGHT]);\r
+               if(bUpdate)\r
+                       UpdateSplitterLayout();\r
+       }\r
+\r
+       bool SetSplitterPane(int nPane, HWND hWnd, bool bUpdate = true)\r
+       {\r
+               ATLASSERT(nPane == SPLIT_PANE_LEFT || nPane == SPLIT_PANE_RIGHT);\r
+\r
+               if(nPane != SPLIT_PANE_LEFT && nPane != SPLIT_PANE_RIGHT)\r
+                       return false;\r
+               m_hWndPane[nPane] = hWnd;\r
+               ATLASSERT(m_hWndPane[SPLIT_PANE_LEFT] == NULL || m_hWndPane[SPLIT_PANE_RIGHT] == NULL || m_hWndPane[SPLIT_PANE_LEFT] != m_hWndPane[SPLIT_PANE_RIGHT]);\r
+               if(bUpdate)\r
+                       UpdateSplitterLayout();\r
+               return true;\r
+       }\r
+\r
+       HWND GetSplitterPane(int nPane) const\r
+       {\r
+               ATLASSERT(nPane == SPLIT_PANE_LEFT || nPane == SPLIT_PANE_RIGHT);\r
+\r
+               if(nPane != SPLIT_PANE_LEFT && nPane != SPLIT_PANE_RIGHT)\r
+                       return false;\r
+               return m_hWndPane[nPane];\r
+       }\r
+\r
+       bool SetActivePane(int nPane)\r
+       {\r
+               ATLASSERT(nPane == SPLIT_PANE_LEFT || nPane == SPLIT_PANE_RIGHT);\r
+\r
+               if(nPane != SPLIT_PANE_LEFT && nPane != SPLIT_PANE_RIGHT)\r
+                       return false;\r
+               if(m_nSinglePane != SPLIT_PANE_NONE && nPane != m_nSinglePane)\r
+                       return false;\r
+               ::SetFocus(m_hWndPane[nPane]);\r
+               m_nDefActivePane = nPane;\r
+               return true;\r
+       }\r
+\r
+       int GetActivePane() const\r
+       {\r
+               int nRet = SPLIT_PANE_NONE;\r
+               HWND hWndFocus = ::GetFocus();\r
+               if(hWndFocus != NULL)\r
+               {\r
+                       for(int nPane = 0; nPane < m_nPanesCount; nPane++)\r
+                       {\r
+                               if(hWndFocus == m_hWndPane[nPane] || ::IsChild(m_hWndPane[nPane], hWndFocus))\r
+                               {\r
+                                       nRet = nPane;\r
+                                       break;\r
+                               }\r
+                       }\r
+               }\r
+               return nRet;\r
+       }\r
+\r
+       bool ActivateNextPane(bool bNext = true)\r
+       {\r
+               int nPane = m_nSinglePane;\r
+               if(nPane == SPLIT_PANE_NONE)\r
+               {\r
+                       switch(GetActivePane())\r
+                       {\r
+                       case SPLIT_PANE_LEFT:\r
+                               nPane = SPLIT_PANE_RIGHT;\r
+                               break;\r
+                       case SPLIT_PANE_RIGHT:\r
+                               nPane = SPLIT_PANE_LEFT;\r
+                               break;\r
+                       default:\r
+                               nPane = bNext ? SPLIT_PANE_LEFT : SPLIT_PANE_RIGHT;\r
+                               break;\r
+                       }\r
+               }\r
+               return SetActivePane(nPane);\r
+       }\r
+\r
+       bool SetDefaultActivePane(int nPane)\r
+       {\r
+               ATLASSERT(nPane == SPLIT_PANE_LEFT || nPane == SPLIT_PANE_RIGHT);\r
+\r
+               if(nPane != SPLIT_PANE_LEFT && nPane != SPLIT_PANE_RIGHT)\r
+                       return false;\r
+               m_nDefActivePane = nPane;\r
+               return true;\r
+       }\r
+\r
+       bool SetDefaultActivePane(HWND hWnd)\r
+       {\r
+               for(int nPane = 0; nPane < m_nPanesCount; nPane++)\r
+               {\r
+                       if(hWnd == m_hWndPane[nPane])\r
+                       {\r
+                               m_nDefActivePane = nPane;\r
+                               return true;\r
+                       }\r
+               }\r
+               return false;   // not found\r
+       }\r
+\r
+       int GetDefaultActivePane() const\r
+       {\r
+               return m_nDefActivePane;\r
+       }\r
+\r
+       void DrawSplitter(CDCHandle dc)\r
+       {\r
+               ATLASSERT(dc.m_hDC != NULL);\r
+               if(m_nSinglePane == SPLIT_PANE_NONE && m_xySplitterPos == -1)\r
+                       return;\r
+\r
+               T* pT = static_cast<T*>(this);\r
+               if(m_nSinglePane == SPLIT_PANE_NONE)\r
+               {\r
+                       pT->DrawSplitterBar(dc);\r
+\r
+                       for(int nPane = 0; nPane < m_nPanesCount; nPane++)\r
+                       {\r
+                               if(m_hWndPane[nPane] == NULL)\r
+                                       pT->DrawSplitterPane(dc, nPane);\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       if(m_hWndPane[m_nSinglePane] == NULL)\r
+                               pT->DrawSplitterPane(dc, m_nSinglePane);\r
+               }\r
+       }\r
+\r
+// Overrideables\r
+       void DrawSplitterBar(CDCHandle dc)\r
+       {\r
+               RECT rect;\r
+               if(GetSplitterBarRect(&rect))\r
+               {\r
+                       dc.FillRect(&rect, COLOR_3DFACE);\r
+                       // draw 3D edge if needed\r
+                       T* pT = static_cast<T*>(this);\r
+                       if((pT->GetExStyle() & WS_EX_CLIENTEDGE) != 0)\r
+                               dc.DrawEdge(&rect, EDGE_RAISED, t_bVertical ? (BF_LEFT | BF_RIGHT) : (BF_TOP | BF_BOTTOM));\r
+               }\r
+       }\r
+\r
+       // called only if pane is empty\r
+       void DrawSplitterPane(CDCHandle dc, int nPane)\r
+       {\r
+               RECT rect;\r
+               if(GetSplitterPaneRect(nPane, &rect))\r
+               {\r
+                       T* pT = static_cast<T*>(this);\r
+                       if((pT->GetExStyle() & WS_EX_CLIENTEDGE) == 0)\r
+                               dc.DrawEdge(&rect, EDGE_SUNKEN, BF_RECT | BF_ADJUST);\r
+                       dc.FillRect(&rect, COLOR_APPWORKSPACE);\r
+               }\r
+       }\r
+\r
+// Message map and handlers\r
+       BEGIN_MSG_MAP(CSplitterImpl)\r
+               MESSAGE_HANDLER(WM_CREATE, OnCreate)\r
+               MESSAGE_HANDLER(WM_PAINT, OnPaint)\r
+#ifndef _WIN32_WCE\r
+               MESSAGE_HANDLER(WM_PRINTCLIENT, OnPaint)\r
+#endif // !_WIN32_WCE\r
+               if(IsInteractive())\r
+               {\r
+                       MESSAGE_HANDLER(WM_SETCURSOR, OnSetCursor)\r
+                       MESSAGE_HANDLER(WM_MOUSEMOVE, OnMouseMove)\r
+                       MESSAGE_HANDLER(WM_LBUTTONDOWN, OnLButtonDown)\r
+                       MESSAGE_HANDLER(WM_LBUTTONUP, OnLButtonUp)\r
+                       MESSAGE_HANDLER(WM_LBUTTONDBLCLK, OnLButtonDoubleClick)\r
+                       MESSAGE_HANDLER(WM_CAPTURECHANGED, OnCaptureChanged)\r
+               }\r
+               MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)\r
+#ifndef _WIN32_WCE\r
+               MESSAGE_HANDLER(WM_MOUSEACTIVATE, OnMouseActivate)\r
+#endif // !_WIN32_WCE\r
+               MESSAGE_HANDLER(WM_SETTINGCHANGE, OnSettingChange)\r
+       END_MSG_MAP()\r
+\r
+       LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)\r
+       {\r
+               GetSystemSettings(false);\r
+               bHandled = FALSE;\r
+               return 1;\r
+       }\r
+\r
+       LRESULT OnPaint(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               // try setting position if not set\r
+               if(m_nSinglePane == SPLIT_PANE_NONE && m_xySplitterPos == -1)\r
+                       pT->SetSplitterPos();\r
+               // do painting\r
+               CPaintDC dc(pT->m_hWnd);\r
+               pT->DrawSplitter(dc.m_hDC);\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnSetCursor(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               if((HWND)wParam == pT->m_hWnd && LOWORD(lParam) == HTCLIENT)\r
+               {\r
+                       DWORD dwPos = ::GetMessagePos();\r
+                       POINT ptPos = { GET_X_LPARAM(dwPos), GET_Y_LPARAM(dwPos) };\r
+                       pT->ScreenToClient(&ptPos);\r
+                       if(IsOverSplitterBar(ptPos.x, ptPos.y))\r
+                               return 1;\r
+               }\r
+\r
+               bHandled = FALSE;\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnMouseMove(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               int xPos = GET_X_LPARAM(lParam);\r
+               int yPos = GET_Y_LPARAM(lParam);\r
+               if((wParam & MK_LBUTTON) && ::GetCapture() == pT->m_hWnd)\r
+               {\r
+                       int xyNewSplitPos = 0;\r
+                       if(t_bVertical)\r
+                               xyNewSplitPos = xPos - m_rcSplitter.left - m_cxyDragOffset;\r
+                       else\r
+                               xyNewSplitPos = yPos - m_rcSplitter.top - m_cxyDragOffset;\r
+\r
+                       if(xyNewSplitPos == -1)   // avoid -1, that means middle\r
+                               xyNewSplitPos = -2;\r
+\r
+                       if(m_xySplitterPos != xyNewSplitPos)\r
+                       {\r
+                               if(m_bFullDrag)\r
+                               {\r
+                                       if(pT->SetSplitterPos(xyNewSplitPos, true))\r
+                                               pT->UpdateWindow();\r
+                               }\r
+                               else\r
+                               {\r
+                                       DrawGhostBar();\r
+                                       pT->SetSplitterPos(xyNewSplitPos, false);\r
+                                       DrawGhostBar();\r
+                               }\r
+                       }\r
+               }\r
+               else            // not dragging, just set cursor\r
+               {\r
+                       if(IsOverSplitterBar(xPos, yPos))\r
+                               ::SetCursor(m_hCursor);\r
+                       bHandled = FALSE;\r
+               }\r
+\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnLButtonDown(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled)\r
+       {\r
+               int xPos = GET_X_LPARAM(lParam);\r
+               int yPos = GET_Y_LPARAM(lParam);\r
+               if(IsOverSplitterBar(xPos, yPos))\r
+               {\r
+                       T* pT = static_cast<T*>(this);\r
+                       pT->SetCapture();\r
+                       ::SetCursor(m_hCursor);\r
+                       if(!m_bFullDrag)\r
+                               DrawGhostBar();\r
+                       if(t_bVertical)\r
+                               m_cxyDragOffset = xPos - m_rcSplitter.left - m_xySplitterPos;\r
+                       else\r
+                               m_cxyDragOffset = yPos - m_rcSplitter.top - m_xySplitterPos;\r
+               }\r
+               bHandled = FALSE;\r
+               return 1;\r
+       }\r
+\r
+       LRESULT OnLButtonUp(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)\r
+       {\r
+               ::ReleaseCapture();\r
+               bHandled = FALSE;\r
+               return 1;\r
+       }\r
+\r
+       LRESULT OnLButtonDoubleClick(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               pT->SetSplitterPos();   // middle\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnCaptureChanged(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)\r
+       {\r
+               if(!m_bFullDrag)\r
+               {\r
+                       DrawGhostBar();\r
+                       UpdateSplitterLayout();\r
+                       T* pT = static_cast<T*>(this);\r
+                       pT->UpdateWindow();\r
+               }\r
+               return 0;\r
+       }\r
+\r
+       LRESULT OnSetFocus(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM, BOOL& bHandled)\r
+       {\r
+               if(m_nSinglePane == SPLIT_PANE_NONE)\r
+               {\r
+                       if(m_nDefActivePane == SPLIT_PANE_LEFT || m_nDefActivePane == SPLIT_PANE_RIGHT)\r
+                               ::SetFocus(m_hWndPane[m_nDefActivePane]);\r
+               }\r
+               else\r
+               {\r
+                       ::SetFocus(m_hWndPane[m_nSinglePane]);\r
+               }\r
+               bHandled = FALSE;\r
+               return 1;\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       LRESULT OnMouseActivate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               LRESULT lRet = pT->DefWindowProc(uMsg, wParam, lParam);\r
+               if(lRet == MA_ACTIVATE || lRet == MA_ACTIVATEANDEAT)\r
+               {\r
+                       DWORD dwPos = ::GetMessagePos();\r
+                       POINT pt = { GET_X_LPARAM(dwPos), GET_Y_LPARAM(dwPos) };\r
+                       pT->ScreenToClient(&pt);\r
+                       RECT rcPane;\r
+                       for(int nPane = 0; nPane < m_nPanesCount; nPane++)\r
+                       {\r
+                               if(GetSplitterPaneRect(nPane, &rcPane) && ::PtInRect(&rcPane, pt))\r
+                               {\r
+                                       m_nDefActivePane = nPane;\r
+                                       break;\r
+                               }\r
+                       }\r
+               }\r
+               return lRet;\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       LRESULT OnSettingChange(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)\r
+       {\r
+               GetSystemSettings(true);\r
+               return 0;\r
+       }\r
+\r
+// Implementation - internal helpers\r
+       void UpdateSplitterLayout()\r
+       {\r
+               if(m_nSinglePane == SPLIT_PANE_NONE && m_xySplitterPos == -1)\r
+                       return;\r
+\r
+               T* pT = static_cast<T*>(this);\r
+               RECT rect = { 0, 0, 0, 0 };\r
+               if(m_nSinglePane == SPLIT_PANE_NONE)\r
+               {\r
+                       if(GetSplitterBarRect(&rect))\r
+                               pT->InvalidateRect(&rect);\r
+\r
+                       for(int nPane = 0; nPane < m_nPanesCount; nPane++)\r
+                       {\r
+                               if(GetSplitterPaneRect(nPane, &rect))\r
+                               {\r
+                                       if(m_hWndPane[nPane] != NULL)\r
+                                               ::SetWindowPos(m_hWndPane[nPane], NULL, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, SWP_NOZORDER);\r
+                                       else\r
+                                               pT->InvalidateRect(&rect);\r
+                               }\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       if(GetSplitterPaneRect(m_nSinglePane, &rect))\r
+                       {\r
+                               if(m_hWndPane[m_nSinglePane] != NULL)\r
+                                       ::SetWindowPos(m_hWndPane[m_nSinglePane], NULL, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, SWP_NOZORDER);\r
+                               else\r
+                                       pT->InvalidateRect(&rect);\r
+                       }\r
+               }\r
+       }\r
+\r
+       bool GetSplitterBarRect(LPRECT lpRect) const\r
+       {\r
+               ATLASSERT(lpRect != NULL);\r
+               if(m_nSinglePane != SPLIT_PANE_NONE || m_xySplitterPos == -1)\r
+                       return false;\r
+\r
+               if(t_bVertical)\r
+               {\r
+                       lpRect->left = m_rcSplitter.left + m_xySplitterPos;\r
+                       lpRect->top = m_rcSplitter.top;\r
+                       lpRect->right = m_rcSplitter.left + m_xySplitterPos + m_cxySplitBar + m_cxyBarEdge;\r
+                       lpRect->bottom = m_rcSplitter.bottom;\r
+               }\r
+               else\r
+               {\r
+                       lpRect->left = m_rcSplitter.left;\r
+                       lpRect->top = m_rcSplitter.top + m_xySplitterPos;\r
+                       lpRect->right = m_rcSplitter.right;\r
+                       lpRect->bottom = m_rcSplitter.top + m_xySplitterPos + m_cxySplitBar + m_cxyBarEdge;\r
+               }\r
+\r
+               return true;\r
+       }\r
+\r
+       bool GetSplitterPaneRect(int nPane, LPRECT lpRect) const\r
+       {\r
+               ATLASSERT(nPane == SPLIT_PANE_LEFT || nPane == SPLIT_PANE_RIGHT);\r
+               ATLASSERT(lpRect != NULL);\r
+               bool bRet = true;\r
+               if(m_nSinglePane != SPLIT_PANE_NONE)\r
+               {\r
+                       if(nPane == m_nSinglePane)\r
+                               *lpRect = m_rcSplitter;\r
+                       else\r
+                               bRet = false;\r
+               }\r
+               else if(nPane == SPLIT_PANE_LEFT)\r
+               {\r
+                       if(t_bVertical)\r
+                       {\r
+                               lpRect->left = m_rcSplitter.left;\r
+                               lpRect->top = m_rcSplitter.top;\r
+                               lpRect->right = m_rcSplitter.left + m_xySplitterPos;\r
+                               lpRect->bottom = m_rcSplitter.bottom;\r
+                       }\r
+                       else\r
+                       {\r
+                               lpRect->left = m_rcSplitter.left;\r
+                               lpRect->top = m_rcSplitter.top;\r
+                               lpRect->right = m_rcSplitter.right;\r
+                               lpRect->bottom = m_rcSplitter.top + m_xySplitterPos;\r
+                       }\r
+               }\r
+               else if(nPane == SPLIT_PANE_RIGHT)\r
+               {\r
+                       if(t_bVertical)\r
+                       {\r
+                               lpRect->left = m_rcSplitter.left + m_xySplitterPos + m_cxySplitBar + m_cxyBarEdge;\r
+                               lpRect->top = m_rcSplitter.top;\r
+                               lpRect->right = m_rcSplitter.right;\r
+                               lpRect->bottom = m_rcSplitter.bottom;\r
+                       }\r
+                       else\r
+                       {\r
+                               lpRect->left = m_rcSplitter.left;\r
+                               lpRect->top = m_rcSplitter.top + m_xySplitterPos + m_cxySplitBar + m_cxyBarEdge;\r
+                               lpRect->right = m_rcSplitter.right;\r
+                               lpRect->bottom = m_rcSplitter.bottom;\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       bRet = false;\r
+               }\r
+               return bRet;\r
+       }\r
+\r
+       bool IsOverSplitterRect(int x, int y) const\r
+       {\r
+               // -1 == don't check\r
+               return ((x == -1 || (x >= m_rcSplitter.left && x <= m_rcSplitter.right)) &&\r
+                       (y == -1 || (y >= m_rcSplitter.top && y <= m_rcSplitter.bottom)));\r
+       }\r
+\r
+       bool IsOverSplitterBar(int x, int y) const\r
+       {\r
+               if(m_nSinglePane != SPLIT_PANE_NONE)\r
+                       return false;\r
+               if(m_xySplitterPos == -1 || !IsOverSplitterRect(x, y))\r
+                       return false;\r
+               int xy = t_bVertical ? x : y;\r
+               int xyOff = t_bVertical ? m_rcSplitter.left : m_rcSplitter.top;\r
+               return ((xy >= (xyOff + m_xySplitterPos)) && (xy < xyOff + m_xySplitterPos + m_cxySplitBar + m_cxyBarEdge));\r
+       }\r
+\r
+       void DrawGhostBar()\r
+       {\r
+               RECT rect = { 0, 0, 0, 0 };\r
+               if(GetSplitterBarRect(&rect))\r
+               {\r
+                       // invert the brush pattern (looks just like frame window sizing)\r
+                       T* pT = static_cast<T*>(this);\r
+                       CWindowDC dc(pT->m_hWnd);\r
+                       CBrush brush = CDCHandle::GetHalftoneBrush();\r
+                       if(brush.m_hBrush != NULL)\r
+                       {\r
+                               CBrushHandle brushOld = dc.SelectBrush(brush);\r
+                               dc.PatBlt(rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, PATINVERT);\r
+                               dc.SelectBrush(brushOld);\r
+                       }\r
+               }\r
+       }\r
+\r
+       void GetSystemSettings(bool bUpdate)\r
+       {\r
+#ifndef _WIN32_WCE\r
+               m_cxySplitBar = ::GetSystemMetrics(t_bVertical ? SM_CXSIZEFRAME : SM_CYSIZEFRAME);\r
+#else // CE specific\r
+               m_cxySplitBar = 2 * ::GetSystemMetrics(t_bVertical ? SM_CXEDGE : SM_CYEDGE);\r
+#endif // _WIN32_WCE\r
+\r
+               T* pT = static_cast<T*>(this);\r
+               if((pT->GetExStyle() & WS_EX_CLIENTEDGE))\r
+               {\r
+                       m_cxyBarEdge = 2 * ::GetSystemMetrics(t_bVertical ? SM_CXEDGE : SM_CYEDGE);\r
+                       m_cxyMin = 0;\r
+               }\r
+               else\r
+               {\r
+                       m_cxyBarEdge = 0;\r
+                       m_cxyMin = 2 * ::GetSystemMetrics(t_bVertical ? SM_CXEDGE : SM_CYEDGE);\r
+               }\r
+\r
+#ifndef _WIN32_WCE\r
+               ::SystemParametersInfo(SPI_GETDRAGFULLWINDOWS, 0, &m_bFullDrag, 0);\r
+#endif // !_WIN32_WCE\r
+\r
+               if(bUpdate)\r
+                       UpdateSplitterLayout();\r
+       }\r
+\r
+       bool IsProportional() const\r
+       {\r
+               return ((m_dwExtendedStyle & SPLIT_PROPORTIONAL) != 0);\r
+       }\r
+\r
+       void StoreProportionalPos()\r
+       {\r
+               int cxyTotal = t_bVertical ? (m_rcSplitter.right - m_rcSplitter.left - m_cxySplitBar - m_cxyBarEdge) : (m_rcSplitter.bottom - m_rcSplitter.top - m_cxySplitBar - m_cxyBarEdge);\r
+               if(cxyTotal > 0)\r
+                       m_nProportionalPos = ::MulDiv(m_xySplitterPos, m_nPropMax, cxyTotal);\r
+               else\r
+                       m_nProportionalPos = 0;\r
+               ATLTRACE2(atlTraceUI, 0, _T("CSplitterImpl::StoreProportionalPos - %i\n"), m_nProportionalPos);\r
+       }\r
+\r
+       void UpdateProportionalPos()\r
+       {\r
+               int cxyTotal = t_bVertical ? (m_rcSplitter.right - m_rcSplitter.left - m_cxySplitBar - m_cxyBarEdge) : (m_rcSplitter.bottom - m_rcSplitter.top - m_cxySplitBar - m_cxyBarEdge);\r
+               if(cxyTotal > 0)\r
+               {\r
+                       int xyNewPos = ::MulDiv(m_nProportionalPos, cxyTotal, m_nPropMax);\r
+                       m_bUpdateProportionalPos = false;\r
+                       T* pT = static_cast<T*>(this);\r
+                       pT->SetSplitterPos(xyNewPos, false);\r
+               }\r
+       }\r
+\r
+       bool IsRightAligned() const\r
+       {\r
+               return ((m_dwExtendedStyle & SPLIT_RIGHTALIGNED) != 0);\r
+       }\r
+\r
+       void StoreRightAlignPos()\r
+       {\r
+               int cxyTotal = t_bVertical ? (m_rcSplitter.right - m_rcSplitter.left - m_cxySplitBar - m_cxyBarEdge) : (m_rcSplitter.bottom - m_rcSplitter.top - m_cxySplitBar - m_cxyBarEdge);\r
+               if(cxyTotal > 0)\r
+                       m_nProportionalPos = cxyTotal - m_xySplitterPos;\r
+               else\r
+                       m_nProportionalPos = 0;\r
+               ATLTRACE2(atlTraceUI, 0, _T("CSplitterImpl::StoreRightAlignPos - %i\n"), m_nProportionalPos);\r
+       }\r
+\r
+       void UpdateRightAlignPos()\r
+       {\r
+               int cxyTotal = t_bVertical ? (m_rcSplitter.right - m_rcSplitter.left - m_cxySplitBar - m_cxyBarEdge) : (m_rcSplitter.bottom - m_rcSplitter.top - m_cxySplitBar - m_cxyBarEdge);\r
+               if(cxyTotal > 0)\r
+               {\r
+                       m_bUpdateProportionalPos = false;\r
+                       T* pT = static_cast<T*>(this);\r
+                       pT->SetSplitterPos(cxyTotal - m_nProportionalPos, false);\r
+               }\r
+       }\r
+\r
+       bool IsInteractive() const\r
+       {\r
+               return ((m_dwExtendedStyle & SPLIT_NONINTERACTIVE) == 0);\r
+       }\r
+};\r
+\r
+template <class T, bool t_bVertical> HCURSOR CSplitterImpl< T, t_bVertical>::m_hCursor = NULL;\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CSplitterWindowImpl - Implements a splitter window\r
+\r
+template <class T, bool t_bVertical = true, class TBase = ATL::CWindow, class TWinTraits = ATL::CControlWinTraits>\r
+class ATL_NO_VTABLE CSplitterWindowImpl : public ATL::CWindowImpl< T, TBase, TWinTraits >, public CSplitterImpl< T , t_bVertical >\r
+{\r
+public:\r
+       DECLARE_WND_CLASS_EX(NULL, CS_DBLCLKS, COLOR_WINDOW)\r
+\r
+       typedef CSplitterImpl< T , t_bVertical >   _baseClass;\r
+\r
+       BEGIN_MSG_MAP(CSplitterWindowImpl)\r
+               MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground)\r
+               MESSAGE_HANDLER(WM_SIZE, OnSize)\r
+               CHAIN_MSG_MAP(_baseClass)\r
+               FORWARD_NOTIFICATIONS()\r
+       END_MSG_MAP()\r
+\r
+       LRESULT OnEraseBackground(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)\r
+       {\r
+               // handled, no background painting needed\r
+               return 1;\r
+       }\r
+\r
+       LRESULT OnSize(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)\r
+       {\r
+               if(wParam != SIZE_MINIMIZED)\r
+                       SetSplitterRect();\r
+\r
+               bHandled = FALSE;\r
+               return 1;\r
+       }\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CSplitterWindow - Implements a splitter window to be used as is\r
+\r
+template <bool t_bVertical = true>\r
+class CSplitterWindowT : public CSplitterWindowImpl<CSplitterWindowT<t_bVertical>, t_bVertical>\r
+{\r
+public:\r
+       DECLARE_WND_CLASS_EX(_T("WTL_SplitterWindow"), CS_DBLCLKS, COLOR_WINDOW)\r
+};\r
+\r
+typedef CSplitterWindowT<true>    CSplitterWindow;\r
+typedef CSplitterWindowT<false>   CHorSplitterWindow;\r
+\r
+}; // namespace WTL\r
+\r
+#endif // __ATLSPLIT_H__\r
diff --git a/WTL80/include/atltheme.h b/WTL80/include/atltheme.h
new file mode 100644 (file)
index 0000000..4c0725f
--- /dev/null
@@ -0,0 +1,1218 @@
+// Windows Template Library - WTL version 8.0\r
+// Copyright (C) Microsoft Corporation. All rights reserved.\r
+//\r
+// This file is a part of the Windows Template Library.\r
+// The use and distribution terms for this software are covered by the\r
+// Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php)\r
+// which can be found in the file CPL.TXT at the root of this distribution.\r
+// By using this software in any fashion, you are agreeing to be bound by\r
+// the terms of this license. You must not remove this notice, or\r
+// any other, from this software.\r
+\r
+#ifndef __ATLTHEME_H__\r
+#define __ATLTHEME_H__\r
+\r
+#pragma once\r
+\r
+#ifndef __cplusplus\r
+       #error ATL requires C++ compilation (use a .cpp suffix)\r
+#endif\r
+\r
+#ifdef _WIN32_WCE\r
+       #error atltheme.h is not supported on Windows CE\r
+#endif\r
+\r
+#ifndef __ATLAPP_H__\r
+       #error atltheme.h requires atlapp.h to be included first\r
+#endif\r
+\r
+#ifndef __ATLWIN_H__\r
+       #error atltheme.h requires atlwin.h to be included first\r
+#endif\r
+\r
+#if (_WIN32_WINNT < 0x0501)\r
+       #error atltheme.h requires _WIN32_WINNT >= 0x0501\r
+#endif // (_WIN32_WINNT < 0x0501)\r
+\r
+#if defined(_WTL_USE_VSSYM32) || (defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN))\r
+  #include <vssym32.h>\r
+#else\r
+  #include <tmschema.h>\r
+#endif\r
+\r
+#include <uxtheme.h>\r
+#pragma comment(lib, "uxtheme.lib")\r
+\r
+// Note: To create an application that also runs on older versions of Windows,\r
+// use delay load of uxtheme.dll and ensure that no calls to the Theme API are\r
+// made if theming is not supported. It is enough to check if m_hTheme is NULL.\r
+// Example:\r
+//     if(m_hTheme != NULL)\r
+//     {\r
+//             DrawThemeBackground(dc, BP_PUSHBUTTON, PBS_NORMAL, &rect, NULL);\r
+//             DrawThemeText(dc, BP_PUSHBUTTON, PBS_NORMAL, L"Button", -1, DT_SINGLELINE | DT_CENTER | DT_VCENTER, 0, &rect);\r
+//     }\r
+//     else\r
+//     {\r
+//             dc.DrawFrameControl(&rect, DFC_BUTTON, DFCS_BUTTONPUSH);\r
+//             dc.DrawText(_T("Button"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);\r
+//     }\r
+//\r
+// Delay load is NOT AUTOMATIC for VC++ 7, you have to link to delayimp.lib, \r
+// and add uxtheme.dll in the Linker.Input.Delay Loaded DLLs section of the \r
+// project properties.\r
+#if (_MSC_VER < 1300) && !defined(_WTL_NO_THEME_DELAYLOAD)\r
+  #pragma comment(lib, "delayimp.lib")\r
+  #pragma comment(linker, "/delayload:uxtheme.dll")\r
+#endif // (_MSC_VER < 1300) && !defined(_WTL_NO_THEME_DELAYLOAD)\r
+\r
+// Hack: Signatures in uxtheme.h changed - the only way to check which variant of uxtheme.h\r
+// is included is to check for presence of new defines MAX_THEMECOLOR and MAX_THEMESIZE\r
+#ifndef _WTL_NEW_UXTHEME\r
+  #if defined(MAX_THEMECOLOR) && defined(MAX_THEMESIZE)\r
+    #define _WTL_NEW_UXTHEME\r
+  #endif // defined(MAX_THEMECOLOR) && defined(MAX_THEMESIZE)\r
+#endif // _WTL_NEW_UXTHEME\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Classes in this file:\r
+//\r
+// CTheme\r
+// CThemeImpl<T, TBase>\r
+//\r
+// CBufferedPaint\r
+// CBufferedPaintImpl<T>\r
+// CBufferedPaintWindowImpl<T, TBase, TWinTraits>\r
+// CBufferedAnimation\r
+// CBufferedAnimationImpl<T, TState>\r
+// CBufferedAnimationWindowImpl<T, TState, TBase, TWinTraits>\r
+//\r
+// Global functions:\r
+//   AtlDrawThemeClientEdge()\r
+\r
+\r
+namespace WTL\r
+{\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CTheme - wrapper for theme handle\r
+\r
+class CTheme\r
+{\r
+public:\r
+// Data members\r
+       HTHEME m_hTheme;\r
+       static int m_nIsThemingSupported;\r
+\r
+// Constructor\r
+       CTheme(HTHEME hTheme = NULL) : m_hTheme(hTheme)\r
+       {\r
+               IsThemingSupported();\r
+       }\r
+\r
+// Operators and helpers\r
+       bool IsThemeNull() const\r
+       {\r
+               return (m_hTheme == NULL);\r
+       }\r
+\r
+       CTheme& operator =(HTHEME hTheme)\r
+       {\r
+               m_hTheme = hTheme;\r
+               return *this;\r
+       }\r
+\r
+       operator HTHEME() const\r
+       {\r
+               return m_hTheme;\r
+       }\r
+\r
+       void Attach(HTHEME hTheme)\r
+       {\r
+               m_hTheme = hTheme;\r
+       }\r
+\r
+       HTHEME Detach()\r
+       {\r
+               HTHEME hTheme = m_hTheme;\r
+               m_hTheme = NULL;\r
+               return hTheme;\r
+       }\r
+\r
+// Theme support helper\r
+       static bool IsThemingSupported()\r
+       {\r
+               if(m_nIsThemingSupported == -1)\r
+               {\r
+                       CStaticDataInitCriticalSectionLock lock;\r
+                       if(FAILED(lock.Lock()))\r
+                       {\r
+                               ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CTheme::IsThemingSupported.\n"));\r
+                               ATLASSERT(FALSE);\r
+                               return false;\r
+                       }\r
+\r
+                       if(m_nIsThemingSupported == -1)\r
+                       {\r
+                               HMODULE hThemeDLL = ::LoadLibrary(_T("uxtheme.dll"));\r
+                               m_nIsThemingSupported = (hThemeDLL != NULL) ? 1 : 0;\r
+                               if(hThemeDLL != NULL)\r
+                                       ::FreeLibrary(hThemeDLL);\r
+                       }\r
+\r
+                       lock.Unlock();\r
+               }\r
+\r
+               ATLASSERT(m_nIsThemingSupported != -1);\r
+               return (m_nIsThemingSupported == 1);\r
+       }\r
+\r
+// Operations and theme properties\r
+       HTHEME OpenThemeData(HWND hWnd, LPCWSTR pszClassList)\r
+       {\r
+               if(!IsThemingSupported())\r
+                       return NULL;\r
+\r
+               ATLASSERT(m_hTheme == NULL);\r
+               m_hTheme = ::OpenThemeData(hWnd, pszClassList);\r
+               return m_hTheme;\r
+       }\r
+\r
+       HRESULT CloseThemeData()\r
+       {\r
+               HRESULT hRet = S_FALSE;\r
+               if(m_hTheme != NULL)\r
+               {\r
+                       hRet = ::CloseThemeData(m_hTheme);\r
+                       if(SUCCEEDED(hRet))\r
+                               m_hTheme = NULL;\r
+               }\r
+               return hRet;\r
+       }\r
+\r
+       HRESULT DrawThemeBackground(HDC hDC, int nPartID, int nStateID, LPCRECT pRect, LPCRECT pClipRect = NULL)\r
+       {\r
+               ATLASSERT(m_hTheme != NULL);\r
+               return ::DrawThemeBackground(m_hTheme, hDC, nPartID, nStateID, pRect, pClipRect);\r
+       }\r
+\r
+       HRESULT DrawThemeBackgroundEx(HDC hDC, int nPartID, int nStateID, LPCRECT pRect, const DTBGOPTS* pOptions = NULL)\r
+       {\r
+               ATLASSERT(m_hTheme != NULL);\r
+               return ::DrawThemeBackgroundEx(m_hTheme, hDC, nPartID, nStateID, pRect, pOptions);\r
+       }\r
+\r
+       HRESULT DrawThemeText(HDC hDC, int nPartID, int nStateID, LPCWSTR pszText, int nCharCount, DWORD dwTextFlags, DWORD dwTextFlags2, LPCRECT pRect)\r
+       {\r
+               ATLASSERT(m_hTheme != NULL);\r
+               return ::DrawThemeText(m_hTheme, hDC, nPartID, nStateID, pszText, nCharCount, dwTextFlags, dwTextFlags2, pRect);\r
+       }\r
+\r
+       HRESULT GetThemeBackgroundContentRect(HDC hDC, int nPartID, int nStateID,  LPCRECT pBoundingRect, LPRECT pContentRect) const\r
+       {\r
+               ATLASSERT(m_hTheme != NULL);\r
+               return ::GetThemeBackgroundContentRect(m_hTheme, hDC, nPartID, nStateID,  pBoundingRect, pContentRect);\r
+       }\r
+\r
+       HRESULT GetThemeBackgroundExtent(HDC hDC, int nPartID, int nStateID, LPCRECT pContentRect, LPRECT pExtentRect) const\r
+       {\r
+               ATLASSERT(m_hTheme != NULL);\r
+               return ::GetThemeBackgroundExtent(m_hTheme, hDC, nPartID, nStateID, pContentRect, pExtentRect);\r
+       }\r
+\r
+       HRESULT GetThemePartSize(HDC hDC, int nPartID, int nStateID, LPRECT pRect, enum THEMESIZE eSize, LPSIZE pSize) const\r
+       {\r
+               ATLASSERT(m_hTheme != NULL);\r
+               return ::GetThemePartSize(m_hTheme, hDC, nPartID, nStateID, pRect, eSize, pSize);\r
+       }\r
+\r
+       HRESULT GetThemeTextExtent(HDC hDC, int nPartID, int nStateID, LPCWSTR pszText, int nCharCount, DWORD dwTextFlags, LPCRECT  pBoundingRect, LPRECT pExtentRect) const\r
+       {\r
+               ATLASSERT(m_hTheme != NULL);\r
+               return ::GetThemeTextExtent(m_hTheme, hDC, nPartID, nStateID, pszText, nCharCount, dwTextFlags, pBoundingRect, pExtentRect);\r
+       }\r
+\r
+       HRESULT GetThemeTextMetrics(HDC hDC, int nPartID, int nStateID, PTEXTMETRICW pTextMetric) const\r
+       {\r
+               ATLASSERT(m_hTheme != NULL);\r
+#ifdef _WTL_NEW_UXTHEME\r
+               return ::GetThemeTextMetrics(m_hTheme, hDC, nPartID, nStateID, pTextMetric);\r
+#else // !_WTL_NEW_UXTHEME\r
+               // Note: The cast to PTEXTMETRIC is because uxtheme.h incorrectly uses it instead of PTEXTMETRICW\r
+               return ::GetThemeTextMetrics(m_hTheme, hDC, nPartID, nStateID, (PTEXTMETRIC)pTextMetric);\r
+#endif // !_WTL_NEW_UXTHEME\r
+       }\r
+\r
+       HRESULT GetThemeBackgroundRegion(HDC hDC, int nPartID, int nStateID, LPCRECT pRect, HRGN* pRegion) const\r
+       {\r
+               ATLASSERT(m_hTheme != NULL);\r
+               return ::GetThemeBackgroundRegion(m_hTheme, hDC, nPartID, nStateID, pRect, pRegion);\r
+       }\r
+\r
+       HRESULT HitTestThemeBackground(HDC hDC, int nPartID, int nStateID, DWORD dwOptions, LPCRECT pRect, HRGN hrgn, POINT ptTest, WORD* pwHitTestCode) const\r
+       {\r
+               ATLASSERT(m_hTheme != NULL);\r
+               return ::HitTestThemeBackground(m_hTheme, hDC, nPartID, nStateID, dwOptions, pRect, hrgn, ptTest, pwHitTestCode);\r
+       }\r
+\r
+       HRESULT DrawThemeEdge(HDC hDC, int nPartID, int nStateID, LPCRECT pDestRect, UINT uEdge, UINT uFlags, LPRECT pContentRect = NULL)\r
+       {\r
+               ATLASSERT(m_hTheme != NULL);\r
+               return ::DrawThemeEdge(m_hTheme, hDC, nPartID, nStateID, pDestRect, uEdge, uFlags, pContentRect);\r
+       }\r
+\r
+       HRESULT DrawThemeIcon(HDC hDC, int nPartID, int nStateID, LPCRECT pRect, HIMAGELIST himl, int nImageIndex)\r
+       {\r
+               ATLASSERT(m_hTheme != NULL);\r
+               return ::DrawThemeIcon(m_hTheme, hDC, nPartID, nStateID, pRect, himl, nImageIndex);\r
+       }\r
+\r
+       BOOL IsThemePartDefined(int nPartID, int nStateID) const\r
+       {\r
+               ATLASSERT(m_hTheme != NULL);\r
+               return ::IsThemePartDefined(m_hTheme, nPartID, nStateID);\r
+       }\r
+\r
+       BOOL IsThemeBackgroundPartiallyTransparent(int nPartID, int nStateID) const\r
+       {\r
+               ATLASSERT(m_hTheme != NULL);\r
+               return ::IsThemeBackgroundPartiallyTransparent(m_hTheme, nPartID, nStateID);\r
+       }\r
+\r
+       HRESULT GetThemeColor(int nPartID, int nStateID, int nPropID, COLORREF* pColor) const\r
+       {\r
+               ATLASSERT(m_hTheme != NULL);\r
+               return ::GetThemeColor(m_hTheme, nPartID, nStateID, nPropID, pColor);\r
+       }\r
+\r
+       HRESULT GetThemeMetric(HDC hDC, int nPartID, int nStateID, int nPropID, int* pnVal) const\r
+       {\r
+               ATLASSERT(m_hTheme != NULL);\r
+               return ::GetThemeMetric(m_hTheme, hDC, nPartID, nStateID, nPropID, pnVal);\r
+       }\r
+\r
+       HRESULT GetThemeString(int nPartID, int nStateID, int nPropID, LPWSTR pszBuff, int cchMaxBuffChars) const\r
+       {\r
+               ATLASSERT(m_hTheme != NULL);\r
+               return ::GetThemeString(m_hTheme, nPartID, nStateID, nPropID, pszBuff, cchMaxBuffChars);\r
+       }\r
+\r
+       HRESULT GetThemeBool(int nPartID, int nStateID, int nPropID, BOOL* pfVal) const\r
+       {\r
+               ATLASSERT(m_hTheme != NULL);\r
+               return ::GetThemeBool(m_hTheme, nPartID, nStateID, nPropID, pfVal);\r
+       }\r
+\r
+       HRESULT GetThemeInt(int nPartID, int nStateID, int nPropID, int* pnVal) const\r
+       {\r
+               ATLASSERT(m_hTheme != NULL);\r
+               return ::GetThemeInt(m_hTheme, nPartID, nStateID, nPropID, pnVal);\r
+       }\r
+\r
+       HRESULT GetThemeEnumValue(int nPartID, int nStateID, int nPropID, int* pnVal) const\r
+       {\r
+               ATLASSERT(m_hTheme != NULL);\r
+               return ::GetThemeEnumValue(m_hTheme, nPartID, nStateID, nPropID, pnVal);\r
+       }\r
+\r
+       HRESULT GetThemePosition(int nPartID, int nStateID, int nPropID, LPPOINT pPoint) const\r
+       {\r
+               ATLASSERT(m_hTheme != NULL);\r
+               return ::GetThemePosition(m_hTheme, nPartID, nStateID, nPropID, pPoint);\r
+       }\r
+\r
+       // deprecated\r
+       HRESULT GetThemeFont(int nPartID, HDC hDC, int nStateID, int nPropID, LOGFONTW* pFont) const\r
+       {\r
+               ATLASSERT(m_hTheme != NULL);\r
+#ifdef _WTL_NEW_UXTHEME\r
+               return ::GetThemeFont(m_hTheme, hDC, nPartID, nStateID, nPropID, pFont);\r
+#else // !_WTL_NEW_UXTHEME\r
+               // Note: The cast to LOGFONT* is because uxtheme.h incorrectly uses it instead of LOGFONTW*\r
+               return ::GetThemeFont(m_hTheme, hDC, nPartID, nStateID, nPropID, (LOGFONT*)pFont);\r
+#endif // !_WTL_NEW_UXTHEME\r
+       }\r
+\r
+       HRESULT GetThemeFont(HDC hDC, int nPartID, int nStateID, int nPropID, LOGFONTW* pFont) const\r
+       {\r
+               ATLASSERT(m_hTheme != NULL);\r
+#ifdef _WTL_NEW_UXTHEME\r
+               return ::GetThemeFont(m_hTheme, hDC, nPartID, nStateID, nPropID, pFont);\r
+#else // !_WTL_NEW_UXTHEME\r
+               // Note: The cast to LOGFONT* is because uxtheme.h incorrectly uses it instead of LOGFONTW*\r
+               return ::GetThemeFont(m_hTheme, hDC, nPartID, nStateID, nPropID, (LOGFONT*)pFont);\r
+#endif // !_WTL_NEW_UXTHEME\r
+       }\r
+\r
+       HRESULT GetThemeRect(int nPartID, int nStateID, int nPropID, LPRECT pRect) const\r
+       {\r
+               ATLASSERT(m_hTheme != NULL);\r
+               return ::GetThemeRect(m_hTheme, nPartID, nStateID, nPropID, pRect);\r
+       }\r
+\r
+       HRESULT GetThemeMargins(HDC hDC, int nPartID, int nStateID, int nPropID, LPRECT pRect, PMARGINS pMargins) const\r
+       {\r
+               ATLASSERT(m_hTheme != NULL);\r
+               return ::GetThemeMargins(m_hTheme, hDC, nPartID, nStateID, nPropID, pRect, pMargins);\r
+       }\r
+\r
+       HRESULT GetThemeIntList(int nPartID, int nStateID, int nPropID, INTLIST* pIntList) const\r
+       {\r
+               ATLASSERT(m_hTheme != NULL);\r
+               return ::GetThemeIntList(m_hTheme, nPartID, nStateID, nPropID, pIntList);\r
+       }\r
+\r
+       HRESULT GetThemePropertyOrigin(int nPartID, int nStateID, int nPropID, enum PROPERTYORIGIN* pOrigin) const\r
+       {\r
+               ATLASSERT(m_hTheme != NULL);\r
+               return ::GetThemePropertyOrigin(m_hTheme, nPartID, nStateID, nPropID, pOrigin);\r
+       }\r
+\r
+       HRESULT GetThemeFilename(int nPartID, int nStateID, int nPropID, LPWSTR pszThemeFileName, int cchMaxBuffChars) const\r
+       {\r
+               ATLASSERT(m_hTheme != NULL);\r
+               return ::GetThemeFilename(m_hTheme, nPartID, nStateID, nPropID, pszThemeFileName, cchMaxBuffChars);\r
+       }\r
+\r
+       COLORREF GetThemeSysColor(int nColorID) const\r
+       {\r
+               ATLASSERT(m_hTheme != NULL);\r
+               return ::GetThemeSysColor(m_hTheme, nColorID);\r
+       }\r
+\r
+       HBRUSH GetThemeSysColorBrush(int nColorID) const\r
+       {\r
+               ATLASSERT(m_hTheme != NULL);\r
+               return ::GetThemeSysColorBrush(m_hTheme, nColorID);\r
+       }\r
+\r
+       int GetThemeSysSize(int nSizeID) const\r
+       {\r
+               ATLASSERT(m_hTheme != NULL);\r
+               return ::GetThemeSysSize(m_hTheme, nSizeID);\r
+       }\r
+\r
+       BOOL GetThemeSysBool(int nBoolID) const\r
+       {\r
+               ATLASSERT(m_hTheme != NULL);\r
+               return ::GetThemeSysBool(m_hTheme, nBoolID);\r
+       }\r
+\r
+       HRESULT GetThemeSysFont(int nFontID, LOGFONTW* plf) const\r
+       {\r
+               ATLASSERT(m_hTheme != NULL);\r
+#ifdef _WTL_NEW_UXTHEME\r
+               return ::GetThemeSysFont(m_hTheme, nFontID, plf);\r
+#else // !_WTL_NEW_UXTHEME\r
+               // Note: The cast to LOGFONT* is because uxtheme.h incorrectly uses it instead of LOGFONTW*\r
+               return ::GetThemeSysFont(m_hTheme, nFontID, (LOGFONT*)plf);\r
+#endif // !_WTL_NEW_UXTHEME\r
+       }\r
+\r
+       HRESULT GetThemeSysString(int nStringID, LPWSTR pszStringBuff, int cchMaxStringChars) const\r
+       {\r
+               ATLASSERT(m_hTheme != NULL);\r
+               return ::GetThemeSysString(m_hTheme, nStringID, pszStringBuff, cchMaxStringChars);\r
+       }\r
+\r
+       HRESULT GetThemeSysInt(int nIntID, int* pnValue) const\r
+       {\r
+               ATLASSERT(m_hTheme != NULL);\r
+               return ::GetThemeSysInt(m_hTheme, nIntID, pnValue);\r
+       }\r
+\r
+#ifdef _WTL_NEW_UXTHEME\r
+       HTHEME OpenThemeDataEx(HWND hWnd, LPCWSTR pszClassList, DWORD dwFlags)\r
+       {\r
+               if(!IsThemingSupported())\r
+                       return NULL;\r
+\r
+               ATLASSERT(m_hTheme == NULL);\r
+               m_hTheme = ::OpenThemeDataEx(hWnd, pszClassList, dwFlags);\r
+               return m_hTheme;\r
+       }\r
+\r
+       HRESULT DrawThemeTextEx(HDC hDC, int nPartID, int nStateID, LPCWSTR pszText, int cchText, DWORD dwTextFlags, LPRECT lpRect, const DTTOPTS* pOptions)\r
+       {\r
+               ATLASSERT(m_hTheme != NULL);\r
+               return ::DrawThemeTextEx(m_hTheme, hDC, nPartID, nStateID, pszText, cchText, dwTextFlags, lpRect, pOptions);\r
+       }\r
+\r
+       HRESULT GetThemeTransitionDuration(int nPartID, int nFromStateID, int nToStateID, int nPropID, DWORD& dwDuration)\r
+       {\r
+               ATLASSERT(m_hTheme != NULL);\r
+               return ::GetThemeTransitionDuration(m_hTheme, nPartID, nFromStateID, nToStateID, nPropID, &dwDuration);\r
+       }\r
+#endif // _WTL_NEW_UXTHEME\r
+\r
+#if (_WIN32_WINNT >= 0x0600)\r
+       HRESULT GetThemeBitmap(int nPartID, int nStateID, int nPropID, ULONG uFlags, HBITMAP& hBitmap)\r
+       {\r
+               ATLASSERT(m_hTheme != NULL);\r
+               return ::GetThemeBitmap(m_hTheme, nPartID, nStateID, nPropID, uFlags, &hBitmap);\r
+       }\r
+\r
+       HRESULT GetThemeStream(int nPartID, int nStateID, int nPropID, VOID** ppvStream, DWORD* pcbStream, HINSTANCE hInstance)\r
+       {\r
+               ATLASSERT(m_hTheme != NULL);\r
+               return ::GetThemeStream(m_hTheme, nPartID, nStateID, nPropID, ppvStream, pcbStream, hInstance);\r
+       }\r
+#endif // (_WIN32_WINNT >= 0x0600)\r
+};\r
+\r
+__declspec(selectany) int CTheme::m_nIsThemingSupported = -1;\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CThemeImpl - theme support implementation\r
+\r
+// Derive from this class to implement window with theme support.\r
+// Example:\r
+//     class CMyThemeWindow : public CWindowImpl<CMyThemeWindow>, public CThemeImpl<CMyThemeWindow>\r
+//     {\r
+//     ...\r
+//             BEGIN_MSG_MAP(CMyThemeWindow)\r
+//                     CHAIN_MSG_MAP(CThemeImpl<CMyThemeWindow>)\r
+//                     ...\r
+//             END_MSG_MAP()\r
+//     ...\r
+//     };\r
+//\r
+// If you set theme class list, the class will automaticaly open/close/reopen theme data.\r
+\r
+\r
+// Helper for drawing theme client edge\r
+inline bool AtlDrawThemeClientEdge(HTHEME hTheme, HWND hWnd, HRGN hRgnUpdate = NULL, HBRUSH hBrush = NULL, int nPartID = 0, int nStateID = 0)\r
+{\r
+       ATLASSERT(hTheme != NULL);\r
+       ATLASSERT(::IsWindow(hWnd));\r
+\r
+       CWindowDC dc(hWnd);\r
+       if(dc.IsNull())\r
+               return false;\r
+\r
+       // Get border size\r
+       int cxBorder = GetSystemMetrics(SM_CXBORDER);\r
+       int cyBorder = GetSystemMetrics(SM_CYBORDER);\r
+       if(SUCCEEDED(::GetThemeInt(hTheme, nPartID, nStateID, TMT_SIZINGBORDERWIDTH, &cxBorder)))\r
+               cyBorder = cxBorder;\r
+\r
+       RECT rect;\r
+       ::GetWindowRect(hWnd, &rect);            \r
+\r
+       // Remove the client edge from the update region\r
+       int cxEdge = GetSystemMetrics(SM_CXEDGE);\r
+       int cyEdge = GetSystemMetrics(SM_CYEDGE);\r
+       ::InflateRect(&rect, -cxEdge, -cyEdge);\r
+       CRgn rgn;\r
+       rgn.CreateRectRgnIndirect(&rect);\r
+       if(rgn.IsNull())\r
+               return false;\r
+\r
+       if(hRgnUpdate != NULL)\r
+               rgn.CombineRgn(hRgnUpdate, rgn, RGN_AND);\r
+\r
+       ::OffsetRect(&rect, -rect.left, -rect.top);\r
+\r
+       ::OffsetRect(&rect, cxEdge, cyEdge);\r
+       dc.ExcludeClipRect(&rect);\r
+       ::InflateRect(&rect, cxEdge, cyEdge);\r
+\r
+       ::DrawThemeBackground(hTheme, dc, nPartID, nStateID, &rect, NULL);\r
+\r
+       // Use background brush too, since theme border might not cover everything\r
+       if(cxBorder < cxEdge && cyBorder < cyEdge)\r
+       {\r
+               if(hBrush == NULL)\r
+// need conditional code because types don't match in winuser.h\r
+#ifdef _WIN64\r
+                       hBrush = (HBRUSH)::GetClassLongPtr(hWnd, GCLP_HBRBACKGROUND);\r
+#else\r
+                       hBrush = (HBRUSH)UlongToPtr(::GetClassLongPtr(hWnd, GCLP_HBRBACKGROUND));\r
+#endif\r
+\r
+               ::InflateRect(&rect, cxBorder - cxEdge, cyBorder - cyEdge);\r
+               dc.FillRect(&rect, hBrush);\r
+       }\r
+\r
+       ::DefWindowProc(hWnd, WM_NCPAINT, (WPARAM)rgn.m_hRgn, 0L);\r
+\r
+       return true;\r
+}\r
+\r
+\r
+// Theme extended styles\r
+#define THEME_EX_3DCLIENTEDGE          0x00000001\r
+#define THEME_EX_THEMECLIENTEDGE       0x00000002\r
+\r
+template <class T, class TBase = CTheme>\r
+class CThemeImpl : public TBase\r
+{\r
+public:\r
+// Data members\r
+       LPWSTR m_lpstrThemeClassList;\r
+       DWORD m_dwExtendedStyle;   // theme specific extended styles\r
+\r
+// Constructor & destructor\r
+       CThemeImpl() : m_lpstrThemeClassList(NULL), m_dwExtendedStyle(0)\r
+       { }\r
+\r
+       ~CThemeImpl()\r
+       {\r
+               delete [] m_lpstrThemeClassList;\r
+       }\r
+\r
+// Attributes\r
+       bool SetThemeClassList(LPCWSTR lpstrThemeClassList)\r
+       {\r
+               if(m_lpstrThemeClassList != NULL)\r
+               {\r
+                       delete [] m_lpstrThemeClassList;\r
+                       m_lpstrThemeClassList = NULL;\r
+               }\r
+\r
+               if(lpstrThemeClassList == NULL)\r
+                       return true;\r
+\r
+               int cchLen = lstrlenW(lpstrThemeClassList) + 1;\r
+               ATLTRY(m_lpstrThemeClassList = new WCHAR[cchLen]);\r
+               if(m_lpstrThemeClassList == NULL)\r
+                       return false;\r
+\r
+               SecureHelper::strcpyW_x(m_lpstrThemeClassList, cchLen, lpstrThemeClassList);\r
+\r
+               return true;\r
+       }\r
+\r
+       bool GetThemeClassList(LPWSTR lpstrThemeClassList, int cchListBuffer) const\r
+       {\r
+               int cchLen = lstrlenW(m_lpstrThemeClassList) + 1;\r
+               if(cchListBuffer < cchLen)\r
+                       return false;\r
+\r
+               SecureHelper::strcpyW_x(lpstrThemeClassList, cchListBuffer, m_lpstrThemeClassList);\r
+\r
+               return true;\r
+       }\r
+\r
+       LPCWSTR GetThemeClassList() const\r
+       {\r
+               return m_lpstrThemeClassList;\r
+       }\r
+\r
+       DWORD SetThemeExtendedStyle(DWORD dwExtendedStyle, DWORD dwMask = 0)\r
+       {\r
+               DWORD dwPrevStyle = m_dwExtendedStyle;\r
+               if(dwMask == 0)\r
+                       m_dwExtendedStyle = dwExtendedStyle;\r
+               else\r
+                       m_dwExtendedStyle = (m_dwExtendedStyle & ~dwMask) | (dwExtendedStyle & dwMask);\r
+               return dwPrevStyle;\r
+       }\r
+\r
+       DWORD GetThemeExtendedStyle() const\r
+       {\r
+               return m_dwExtendedStyle;\r
+       }\r
+\r
+// Operations\r
+       HTHEME OpenThemeData()\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(::IsWindow(pT->m_hWnd));\r
+               ATLASSERT(m_lpstrThemeClassList != NULL);\r
+               if(m_lpstrThemeClassList == NULL)\r
+                       return NULL;\r
+               CloseThemeData();\r
+               return TBase::OpenThemeData(pT->m_hWnd, m_lpstrThemeClassList);\r
+       }\r
+\r
+       HTHEME OpenThemeData(LPCWSTR pszClassList)\r
+       {\r
+               if(!SetThemeClassList(pszClassList))\r
+                       return NULL;\r
+               return OpenThemeData();\r
+       }\r
+\r
+       HRESULT SetWindowTheme(LPCWSTR pszSubAppName, LPCWSTR pszSubIDList)\r
+       {\r
+               if(!IsThemingSupported())\r
+                       return S_FALSE;\r
+\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(::IsWindow(pT->m_hWnd));\r
+               return ::SetWindowTheme(pT->m_hWnd, pszSubAppName, pszSubIDList);\r
+       }\r
+\r
+       HTHEME GetWindowTheme() const\r
+       {\r
+               if(!IsThemingSupported())\r
+                       return NULL;\r
+\r
+               const T* pT = static_cast<const T*>(this);\r
+               ATLASSERT(::IsWindow(pT->m_hWnd));\r
+               return ::GetWindowTheme(pT->m_hWnd);\r
+       }\r
+\r
+       HRESULT EnableThemeDialogTexture(DWORD dwFlags)\r
+       {\r
+               if(!IsThemingSupported())\r
+                       return S_FALSE;\r
+\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(::IsWindow(pT->m_hWnd));\r
+               return ::EnableThemeDialogTexture(pT->m_hWnd, dwFlags);\r
+       }\r
+\r
+       BOOL IsThemeDialogTextureEnabled() const\r
+       {\r
+               if(!IsThemingSupported())\r
+                       return FALSE;\r
+\r
+               const T* pT = static_cast<const T*>(this);\r
+               ATLASSERT(::IsWindow(pT->m_hWnd));\r
+               return ::IsThemeDialogTextureEnabled(pT->m_hWnd);\r
+       }\r
+\r
+       HRESULT DrawThemeParentBackground(HDC hDC, const RECT* pRect = NULL)\r
+       {\r
+               if(!IsThemingSupported())\r
+                       return S_FALSE;\r
+\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(::IsWindow(pT->m_hWnd));\r
+#ifdef _WTL_NEW_UXTHEME\r
+               return ::DrawThemeParentBackground(pT->m_hWnd, hDC, pRect);\r
+#else\r
+               return ::DrawThemeParentBackground(pT->m_hWnd, hDC, (RECT*)pRect);\r
+#endif\r
+       }\r
+\r
+#ifdef _WTL_NEW_UXTHEME\r
+       HRESULT SetWindowThemeAttribute(WINDOWTHEMEATTRIBUTETYPE type, PVOID pvAttribute, DWORD cbAttribute)\r
+       {\r
+               if(!IsThemingSupported())\r
+                       return S_FALSE;\r
+\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(::IsWindow(pT->m_hWnd));\r
+               return ::SetWindowThemeAttribute(pT->m_hWnd, type, pvAttribute, cbAttribute);\r
+       }\r
+\r
+       HRESULT SetWindowThemeNonClientAttributes(DWORD dwAttributes, DWORD dwMask)\r
+       {\r
+               if(!IsThemingSupported())\r
+                       return S_FALSE;\r
+\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(::IsWindow(pT->m_hWnd));\r
+               WTA_OPTIONS opt = { dwAttributes, dwMask };\r
+               return ::SetWindowThemeAttribute(pT->m_hWnd, WTA_NONCLIENT, (PVOID)&opt, sizeof(opt));\r
+       }\r
+\r
+       HRESULT DrawThemeParentBackgroundEx(HDC hDC, DWORD dwFlags, const RECT* lpRect = NULL)\r
+       {\r
+               if(!IsThemingSupported())\r
+                       return S_FALSE;\r
+\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(::IsWindow(pT->m_hWnd));\r
+               return ::DrawThemeParentBackgroundEx(pT->m_hWnd, hDC, dwFlags, lpRect);\r
+       }\r
+#endif // _WTL_NEW_UXTHEME\r
+\r
+// Message map and handlers\r
+       // Note: If you handle any of these messages in your derived class,\r
+       // it is better to put CHAIN_MSG_MAP at the start of your message map.\r
+       BEGIN_MSG_MAP(CThemeImpl)\r
+               MESSAGE_HANDLER(WM_CREATE, OnCreate)\r
+               MESSAGE_HANDLER(WM_DESTROY, OnDestroy)\r
+               MESSAGE_HANDLER(WM_THEMECHANGED, OnThemeChanged)\r
+               MESSAGE_HANDLER(WM_NCPAINT, OnNcPaint)\r
+       END_MSG_MAP()\r
+\r
+       LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)\r
+       {\r
+               if(m_lpstrThemeClassList != NULL)\r
+                       OpenThemeData();\r
+               bHandled = FALSE;\r
+               return 1;\r
+       }\r
+\r
+       LRESULT OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)\r
+       {\r
+               CloseThemeData();\r
+               bHandled = FALSE;\r
+               return 1;\r
+       }\r
+\r
+       LRESULT OnThemeChanged(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)\r
+       {\r
+               CloseThemeData();\r
+               if(m_lpstrThemeClassList != NULL)\r
+                       OpenThemeData();\r
+               bHandled = FALSE;\r
+               return 1;\r
+       }\r
+\r
+       LRESULT OnNcPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(::IsWindow(pT->m_hWnd));\r
+               LRESULT lRet = 0;\r
+               bHandled = FALSE;\r
+               if(IsThemingSupported() && ((pT->GetExStyle() & WS_EX_CLIENTEDGE) != 0))\r
+               {\r
+                       if((m_dwExtendedStyle & THEME_EX_3DCLIENTEDGE) != 0)\r
+                       {\r
+                               lRet = ::DefWindowProc(pT->m_hWnd, uMsg, wParam, lParam);\r
+                               bHandled = TRUE;\r
+                       }\r
+                       else if((m_hTheme != NULL) && ((m_dwExtendedStyle & THEME_EX_THEMECLIENTEDGE) != 0))\r
+                       {\r
+                               HRGN hRgn = (wParam != 1) ? (HRGN)wParam : NULL;\r
+                               if(pT->DrawThemeClientEdge(hRgn))\r
+                                       bHandled = TRUE;\r
+                       }\r
+               }\r
+               return lRet;\r
+       }\r
+\r
+// Drawing helper\r
+       bool DrawThemeClientEdge(HRGN hRgnUpdate)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               return AtlDrawThemeClientEdge(m_hTheme, pT->m_hWnd, hRgnUpdate, NULL, 0, 0);\r
+       }\r
+};\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Buffered Paint and Animation\r
+\r
+#ifdef _WTL_NEW_UXTHEME\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CBufferedPaintBase - Buffered Paint support for othe classes\r
+\r
+class CBufferedPaintBase\r
+{\r
+public:\r
+       static int m_nIsBufferedPaintSupported;\r
+\r
+       CBufferedPaintBase()\r
+       {\r
+               if(IsBufferedPaintSupported())\r
+                       ATLVERIFY(SUCCEEDED(::BufferedPaintInit()));\r
+       }\r
+\r
+       ~CBufferedPaintBase()\r
+       {\r
+               if(IsBufferedPaintSupported())\r
+                       ATLVERIFY(SUCCEEDED(::BufferedPaintUnInit()));\r
+       }\r
+\r
+       static bool IsBufferedPaintSupported()\r
+       {\r
+               if(m_nIsBufferedPaintSupported == -1)\r
+               {\r
+                       CStaticDataInitCriticalSectionLock lock;\r
+                       if(FAILED(lock.Lock()))\r
+                       {\r
+                               ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CBufferedPaintBase::IsBufferedPaintSupported.\n"));\r
+                               ATLASSERT(FALSE);\r
+                               return false;\r
+                       }\r
+\r
+                       if(m_nIsBufferedPaintSupported == -1)\r
+                               m_nIsBufferedPaintSupported = RunTimeHelper::IsVista() ? 1 : 0;\r
+\r
+                       lock.Unlock();\r
+               }\r
+\r
+               ATLASSERT(m_nIsBufferedPaintSupported != -1);\r
+               return (m_nIsBufferedPaintSupported == 1);\r
+       }\r
+};\r
+\r
+__declspec(selectany) int CBufferedPaintBase::m_nIsBufferedPaintSupported = -1;\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CBufferedPaint - support for buffered paint functions\r
+\r
+class CBufferedPaint\r
+{\r
+public:\r
+       HPAINTBUFFER m_hPaintBuffer;\r
+\r
+       CBufferedPaint() : m_hPaintBuffer(NULL)\r
+       { }\r
+\r
+       ~CBufferedPaint()\r
+       {\r
+               ATLVERIFY(SUCCEEDED(End()));\r
+       }\r
+\r
+       bool IsNull() const\r
+       {\r
+               return (m_hPaintBuffer == NULL);\r
+       }\r
+\r
+       HPAINTBUFFER Begin(HDC hdcTarget, const RECT* prcTarget, BP_BUFFERFORMAT dwFormat, BP_PAINTPARAMS* pPaintParams, HDC* phdcPaint)\r
+       {\r
+               ATLASSERT(m_hPaintBuffer == NULL);\r
+               m_hPaintBuffer = ::BeginBufferedPaint(hdcTarget, prcTarget, dwFormat, pPaintParams, phdcPaint);\r
+               return m_hPaintBuffer;\r
+       }\r
+\r
+       HRESULT End(BOOL bUpdate = TRUE)\r
+       {\r
+               HRESULT hRet = S_FALSE;\r
+               if(m_hPaintBuffer != NULL)\r
+               {\r
+                       hRet = ::EndBufferedPaint(m_hPaintBuffer, bUpdate);\r
+                       m_hPaintBuffer = NULL;\r
+               }\r
+               return hRet;\r
+       }\r
+\r
+       HRESULT GetTargetRect(LPRECT pRect) const\r
+       {\r
+               ATLASSERT(m_hPaintBuffer != NULL);\r
+               return ::GetBufferedPaintTargetRect(m_hPaintBuffer, pRect);\r
+       }\r
+\r
+       HDC GetTargetDC() const\r
+       {\r
+               ATLASSERT(m_hPaintBuffer != NULL);\r
+               return ::GetBufferedPaintTargetDC(m_hPaintBuffer);\r
+       }\r
+\r
+       HDC GetPaintDC() const\r
+       {\r
+               ATLASSERT(m_hPaintBuffer != NULL);\r
+               return ::GetBufferedPaintDC(m_hPaintBuffer);\r
+       }\r
+\r
+       HRESULT GetBits(RGBQUAD** ppbBuffer, int* pcxRow) const\r
+       {\r
+               ATLASSERT(m_hPaintBuffer != NULL);\r
+               return ::GetBufferedPaintBits(m_hPaintBuffer, ppbBuffer, pcxRow);\r
+       }\r
+\r
+       HRESULT Clear(const RECT* pRect = NULL)\r
+       {\r
+               ATLASSERT(m_hPaintBuffer != NULL);\r
+               return ::BufferedPaintClear(m_hPaintBuffer, pRect);\r
+       }\r
+\r
+       HRESULT SetAlpha(BYTE alpha, const RECT* pRect = NULL)\r
+       {\r
+               ATLASSERT(m_hPaintBuffer != NULL);\r
+               return ::BufferedPaintSetAlpha(m_hPaintBuffer, pRect, alpha);\r
+       }\r
+\r
+       HRESULT MakeOpaque(const RECT* pRect = NULL)\r
+       {\r
+               ATLASSERT(m_hPaintBuffer != NULL);\r
+               return ::BufferedPaintSetAlpha(m_hPaintBuffer, pRect, 255);\r
+       }\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CBufferedPaintImpl - provides buffered paint for any window\r
+\r
+template <class T>\r
+class ATL_NO_VTABLE CBufferedPaintImpl : public CBufferedPaintBase\r
+{\r
+public:\r
+       CBufferedPaint m_BufferedPaint;\r
+       BP_BUFFERFORMAT m_dwFormat;\r
+       BP_PAINTPARAMS m_PaintParams;\r
+\r
+       CBufferedPaintImpl() : m_dwFormat(BPBF_TOPDOWNDIB)\r
+       {\r
+               memset(&m_PaintParams, 0, sizeof(BP_PAINTPARAMS));\r
+               m_PaintParams.cbSize = sizeof(BP_PAINTPARAMS);\r
+       }\r
+\r
+// Message map and handlers\r
+       BEGIN_MSG_MAP(CBufferedPaintImpl)\r
+               MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground)\r
+               MESSAGE_HANDLER(WM_PAINT, OnPaint)\r
+               MESSAGE_HANDLER(WM_PRINTCLIENT, OnPaint)\r
+       END_MSG_MAP()\r
+\r
+       LRESULT OnEraseBackground(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)\r
+       {\r
+               return 1;   // no background needed\r
+       }\r
+\r
+       LRESULT OnPaint(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               if(wParam != NULL)\r
+               {\r
+                       RECT rect = { 0 };\r
+                       pT->GetClientRect(&rect);\r
+                       pT->DoPaint((HDC)wParam, rect);\r
+               }\r
+               else\r
+               {\r
+                       CPaintDC dc(pT->m_hWnd);\r
+                       pT->DoBufferedPaint(dc.m_hDC, dc.m_ps.rcPaint);\r
+               }\r
+\r
+               return 0;\r
+       }\r
+\r
+// Overrideables\r
+       void DoBufferedPaint(CDCHandle dc, RECT& rect)\r
+       {\r
+               HDC hDCPaint = NULL;\r
+               if(IsBufferedPaintSupported())\r
+                       m_BufferedPaint.Begin(dc, &rect, m_dwFormat, &m_PaintParams, &hDCPaint);\r
+\r
+               T* pT = static_cast<T*>(this);\r
+               if(hDCPaint != NULL)\r
+                       pT->DoPaint(hDCPaint, rect);\r
+               else\r
+                       pT->DoPaint(dc.m_hDC, rect);\r
+\r
+               if(IsBufferedPaintSupported())\r
+                       m_BufferedPaint.End();\r
+       }\r
+\r
+       void DoPaint(CDCHandle /*dc*/, RECT& /*rect*/)\r
+       {\r
+               // must be implemented in a derived class\r
+               ATLASSERT(FALSE);\r
+       }\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CBufferedPaintWindowImpl - implements a window that uses buffered paint\r
+\r
+template <class T, class TBase = ATL::CWindow, class TWinTraits = ATL::CControlWinTraits>\r
+class ATL_NO_VTABLE CBufferedPaintWindowImpl : \r
+               public ATL::CWindowImpl<T, TBase, TWinTraits>, \r
+               public CBufferedPaintImpl< T >\r
+{\r
+public:\r
+       BEGIN_MSG_MAP(CBufferedPaintWindowImpl)\r
+               CHAIN_MSG_MAP(CBufferedPaintImpl< T >)\r
+       END_MSG_MAP()\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CBufferedAnimation - support for buffered animation\r
+\r
+class CBufferedAnimation\r
+{\r
+public:\r
+       HANIMATIONBUFFER m_hAnimationBuffer;\r
+\r
+       CBufferedAnimation() : m_hAnimationBuffer(NULL)\r
+       { }\r
+\r
+       ~CBufferedAnimation()\r
+       {\r
+               ATLVERIFY(SUCCEEDED(End()));\r
+       }\r
+\r
+       bool IsNull() const\r
+       {\r
+               return (m_hAnimationBuffer == NULL);\r
+       }\r
+\r
+       HANIMATIONBUFFER Begin(HWND hWnd, HDC hDCTarget, const RECT* pRectTarget, BP_BUFFERFORMAT dwFormat, BP_PAINTPARAMS* pPaintParams, BP_ANIMATIONPARAMS* pAnimationParams, HDC* phdcFrom, HDC* phdcTo)\r
+       {\r
+               ATLASSERT(m_hAnimationBuffer == NULL);\r
+               m_hAnimationBuffer = ::BeginBufferedAnimation(hWnd, hDCTarget, pRectTarget, dwFormat, pPaintParams, pAnimationParams, phdcFrom, phdcTo);\r
+               return m_hAnimationBuffer;\r
+       }\r
+\r
+       HRESULT End(BOOL bUpdate = TRUE)\r
+       {\r
+               HRESULT hRet = S_FALSE;\r
+               if(m_hAnimationBuffer != NULL)\r
+               {\r
+                       hRet = ::EndBufferedAnimation(m_hAnimationBuffer, bUpdate);\r
+                       m_hAnimationBuffer = NULL;\r
+               }\r
+               return hRet;\r
+       }\r
+\r
+       static bool IsRendering(HWND hWnd, HDC hDC)\r
+       {\r
+               return (::BufferedPaintRenderAnimation(hWnd, hDC) != FALSE);\r
+       }\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CBufferedAnimationImpl - provides buffered animation support for any window\r
+\r
+// Note: You can either use m_State and m_NewState to store the state information\r
+// for the animation change, or map your state to those data members. DoPaint()\r
+// should only rely on the state information that is passed to it.\r
+\r
+template <class T, class TState = DWORD_PTR>\r
+class ATL_NO_VTABLE CBufferedAnimationImpl : public CBufferedPaintBase\r
+{\r
+public:\r
+       BP_BUFFERFORMAT m_dwFormat;\r
+       BP_PAINTPARAMS m_PaintParams;\r
+       BP_ANIMATIONPARAMS m_AnimationParams;\r
+\r
+       TState m_State;\r
+       TState m_NewState;\r
+\r
+       CBufferedAnimationImpl(TState InitialState) : m_dwFormat(BPBF_TOPDOWNDIB)\r
+       {\r
+               memset(&m_PaintParams, 0, sizeof(BP_PAINTPARAMS));\r
+               m_PaintParams.cbSize = sizeof(BP_PAINTPARAMS);\r
+\r
+               memset(&m_AnimationParams, 0, sizeof(BP_ANIMATIONPARAMS));\r
+               m_AnimationParams.cbSize = sizeof(BP_ANIMATIONPARAMS);\r
+               m_AnimationParams.style = BPAS_LINEAR;\r
+               m_AnimationParams.dwDuration = 500;\r
+\r
+               T* pT = static_cast<T*>(this);\r
+               pT->SetState(InitialState);\r
+               pT->SetNewState(InitialState);\r
+       }\r
+\r
+       DWORD GetDuration() const\r
+       {\r
+               return m_AnimationParams.dwDuration;\r
+       }\r
+\r
+       void SetDuration(DWORD dwDuration)\r
+       {\r
+               m_AnimationParams.dwDuration = dwDuration;\r
+       }\r
+\r
+       void DoAnimation(TState NewState, const RECT* pRect = NULL)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               pT->SetNewState(NewState);\r
+\r
+               pT->InvalidateRect(pRect, FALSE);\r
+               pT->UpdateWindow();\r
+\r
+               pT->SetState(NewState);\r
+       }\r
+\r
+// Message map and handlers\r
+       BEGIN_MSG_MAP(CBufferedAnimationImpl)\r
+               MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground)\r
+               MESSAGE_HANDLER(WM_PAINT, OnPaint)\r
+               MESSAGE_HANDLER(WM_PRINTCLIENT, OnPaint)\r
+       END_MSG_MAP()\r
+\r
+       LRESULT OnEraseBackground(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)\r
+       {\r
+               return 1;   // no background needed\r
+       }\r
+\r
+       LRESULT OnPaint(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               if(wParam != NULL)\r
+               {\r
+                       RECT rect = { 0 };\r
+                       pT->GetClientRect(&rect);\r
+                       pT->DoPaint((HDC)wParam, rect, m_NewState);\r
+               }\r
+               else\r
+               {\r
+                       CPaintDC dc(pT->m_hWnd);\r
+                       pT->DoAnimationPaint(dc.m_hDC, dc.m_ps.rcPaint);\r
+               }\r
+\r
+               return 0;\r
+       }\r
+\r
+// Overrideables\r
+       void SetState(TState State)\r
+       {\r
+               m_State = State;\r
+       }\r
+\r
+       void SetNewState(TState State)\r
+       {\r
+               m_NewState = State;\r
+       }\r
+\r
+       bool AreStatesEqual() const\r
+       {\r
+               return (m_State == m_NewState);\r
+       }\r
+\r
+       void DoAnimationPaint(CDCHandle dc, RECT& rect)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               if(IsBufferedPaintSupported() && CBufferedAnimation::IsRendering(pT->m_hWnd, dc))\r
+                       return;\r
+\r
+               DWORD dwDurationSave = m_AnimationParams.dwDuration;\r
+               if(pT->AreStatesEqual())\r
+                       m_AnimationParams.dwDuration = 0;\r
+\r
+               HDC hdcFrom = NULL, hdcTo = NULL;\r
+               CBufferedAnimation ba;\r
+               if(IsBufferedPaintSupported())\r
+                       ba.Begin(pT->m_hWnd, dc, &rect, m_dwFormat, &m_PaintParams, &m_AnimationParams, &hdcFrom, &hdcTo);\r
+\r
+               if(!ba.IsNull())\r
+               {\r
+                       if(hdcFrom != NULL)\r
+                               pT->DoPaint(hdcFrom, rect, m_State);\r
+\r
+                       if (hdcTo != NULL)\r
+                               pT->DoPaint(hdcTo, rect, m_NewState);\r
+               }\r
+               else\r
+               {\r
+                       pT->DoPaint(dc.m_hDC, rect, m_NewState);\r
+               }\r
+\r
+               m_AnimationParams.dwDuration = dwDurationSave;\r
+       }\r
+\r
+       void DoPaint(CDCHandle /*dc*/, RECT& /*rect*/, TState /*State*/)\r
+       {\r
+               // must be implemented in a derived class\r
+               ATLASSERT(FALSE);\r
+       }\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CBufferedAnimationWindowImpl - implements a window that uses buffered animation\r
+\r
+template <class T, class TState = DWORD_PTR, class TBase = ATL::CWindow, class TWinTraits = ATL::CControlWinTraits>\r
+class ATL_NO_VTABLE CBufferedAnimationWindowImpl : \r
+               public ATL::CWindowImpl<T, TBase, TWinTraits>, \r
+               public CBufferedAnimationImpl< T, TState >\r
+{\r
+public:\r
+       CBufferedAnimationWindowImpl(TState InitialState) : CBufferedAnimationImpl< T, TState >(InitialState)\r
+       { }\r
+\r
+       typedef CBufferedAnimationImpl< T, TState >   _baseBufferedAnimation;\r
+       BEGIN_MSG_MAP(CBufferedAnimationWindowImpl)\r
+               CHAIN_MSG_MAP(_baseBufferedAnimation)\r
+       END_MSG_MAP()\r
+};\r
+\r
+#endif // _WTL_NEW_UXTHEME\r
+\r
+}; // namespace WTL\r
+\r
+#endif // __ATLTHEME_H__\r
diff --git a/WTL80/include/atluser.h b/WTL80/include/atluser.h
new file mode 100644 (file)
index 0000000..6570b8b
--- /dev/null
@@ -0,0 +1,1162 @@
+// Windows Template Library - WTL version 8.0\r
+// Copyright (C) Microsoft Corporation. All rights reserved.\r
+//\r
+// This file is a part of the Windows Template Library.\r
+// The use and distribution terms for this software are covered by the\r
+// Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php)\r
+// which can be found in the file CPL.TXT at the root of this distribution.\r
+// By using this software in any fashion, you are agreeing to be bound by\r
+// the terms of this license. You must not remove this notice, or\r
+// any other, from this software.\r
+\r
+#ifndef __ATLUSER_H__\r
+#define __ATLUSER_H__\r
+\r
+#pragma once\r
+\r
+#ifndef __cplusplus\r
+       #error ATL requires C++ compilation (use a .cpp suffix)\r
+#endif\r
+\r
+#ifndef __ATLAPP_H__\r
+       #error atluser.h requires atlapp.h to be included first\r
+#endif\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Classes in this file:\r
+//\r
+// CMenuItemInfo\r
+// CMenuT<t_bManaged>\r
+// CAcceleratorT<t_bManaged>\r
+// CIconT<t_bManaged>\r
+// CCursorT<t_bManaged>\r
+// CResource\r
+//\r
+// Global functions:\r
+//   AtlMessageBox()\r
+\r
+\r
+namespace WTL\r
+{\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// AtlMessageBox - accepts both memory and resource based strings\r
+\r
+inline int AtlMessageBox(HWND hWndOwner, ATL::_U_STRINGorID message, ATL::_U_STRINGorID title = (LPCTSTR)NULL, UINT uType = MB_OK | MB_ICONINFORMATION)\r
+{\r
+       ATLASSERT(hWndOwner == NULL || ::IsWindow(hWndOwner));\r
+\r
+       LPTSTR lpstrMessage = NULL;\r
+       if(IS_INTRESOURCE(message.m_lpstr))\r
+       {\r
+               for(int nLen = 256; ; nLen *= 2)\r
+               {\r
+                       ATLTRY(lpstrMessage = new TCHAR[nLen]);\r
+                       if(lpstrMessage == NULL)\r
+                       {\r
+                               ATLASSERT(FALSE);\r
+                               return 0;\r
+                       }\r
+                       int nRes = ::LoadString(ModuleHelper::GetResourceInstance(), LOWORD(message.m_lpstr), lpstrMessage, nLen);\r
+                       if(nRes < nLen - 1)\r
+                               break;\r
+                       delete [] lpstrMessage;\r
+                       lpstrMessage = NULL;\r
+               }\r
+\r
+               message.m_lpstr = lpstrMessage;\r
+       }\r
+\r
+       LPTSTR lpstrTitle = NULL;\r
+       if(IS_INTRESOURCE(title.m_lpstr) && LOWORD(title.m_lpstr) != 0)\r
+       {\r
+               for(int nLen = 256; ; nLen *= 2)\r
+               {\r
+                       ATLTRY(lpstrTitle = new TCHAR[nLen]);\r
+                       if(lpstrTitle == NULL)\r
+                       {\r
+                               ATLASSERT(FALSE);\r
+                               return 0;\r
+                       }\r
+                       int nRes = ::LoadString(ModuleHelper::GetResourceInstance(), LOWORD(title.m_lpstr), lpstrTitle, nLen);\r
+                       if(nRes < nLen - 1)\r
+                               break;\r
+                       delete [] lpstrTitle;\r
+                       lpstrTitle = NULL;\r
+               }\r
+\r
+               title.m_lpstr = lpstrTitle;\r
+       }\r
+\r
+       int nRet = ::MessageBox(hWndOwner, message.m_lpstr, title.m_lpstr, uType);\r
+\r
+       delete [] lpstrMessage;\r
+       delete [] lpstrTitle;\r
+\r
+       return nRet;\r
+}\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CMenu\r
+\r
+#if (WINVER >= 0x0500)\r
+  #ifndef MII_SIZEOF_STRUCT\r
+    #define MII_SIZEOF_STRUCT(structname, member)  (((int)((LPBYTE)(&((structname*)0)->member) - ((LPBYTE)((structname*)0)))) + sizeof(((structname*)0)->member))\r
+  #endif\r
+  #define MENUITEMINFO_SIZE_VERSION_400A  MII_SIZEOF_STRUCT(MENUITEMINFOA, cch)\r
+  #define MENUITEMINFO_SIZE_VERSION_400W  MII_SIZEOF_STRUCT(MENUITEMINFOW, cch)\r
+  #ifdef UNICODE\r
+    #define MENUITEMINFO_SIZE_VERSION_400  MENUITEMINFO_SIZE_VERSION_400W\r
+  #else\r
+    #define MENUITEMINFO_SIZE_VERSION_400  MENUITEMINFO_SIZE_VERSION_400A\r
+  #endif // !UNICODE\r
+#endif // (WINVER >= 0x0500)\r
+\r
+class CMenuItemInfo : public MENUITEMINFO\r
+{\r
+public:\r
+       CMenuItemInfo()\r
+       {\r
+               memset(this, 0, sizeof(MENUITEMINFO));\r
+               cbSize = sizeof(MENUITEMINFO);\r
+#if (WINVER >= 0x0500)\r
+               // adjust struct size if running on older version of Windows\r
+               if(AtlIsOldWindows())\r
+               {\r
+                       ATLASSERT(cbSize > MENUITEMINFO_SIZE_VERSION_400);   // must be\r
+                       cbSize = MENUITEMINFO_SIZE_VERSION_400;\r
+               }\r
+#endif // (WINVER >= 0x0500)\r
+       }\r
+};\r
+\r
+\r
+// forward declarations\r
+template <bool t_bManaged> class CMenuT;\r
+typedef CMenuT<false>   CMenuHandle;\r
+typedef CMenuT<true>    CMenu;\r
+\r
+\r
+template <bool t_bManaged>\r
+class CMenuT\r
+{\r
+public:\r
+// Data members\r
+       HMENU m_hMenu;\r
+\r
+// Constructor/destructor/operators\r
+       CMenuT(HMENU hMenu = NULL) : m_hMenu(hMenu)\r
+       { }\r
+\r
+       ~CMenuT()\r
+       {\r
+               if(t_bManaged && m_hMenu != NULL)\r
+                       DestroyMenu();\r
+       }\r
+\r
+       CMenuT<t_bManaged>& operator =(HMENU hMenu)\r
+       {\r
+               Attach(hMenu);\r
+               return *this;\r
+       }\r
+\r
+       void Attach(HMENU hMenuNew)\r
+       {\r
+               ATLASSERT(::IsMenu(hMenuNew));\r
+               if(t_bManaged && m_hMenu != NULL && m_hMenu != hMenuNew)\r
+                       ::DestroyMenu(m_hMenu);\r
+               m_hMenu = hMenuNew;\r
+       }\r
+\r
+       HMENU Detach()\r
+       {\r
+               HMENU hMenu = m_hMenu;\r
+               m_hMenu = NULL;\r
+               return hMenu;\r
+       }\r
+\r
+       operator HMENU() const { return m_hMenu; }\r
+\r
+       bool IsNull() const { return (m_hMenu == NULL); }\r
+\r
+       BOOL IsMenu() const\r
+       {\r
+               return ::IsMenu(m_hMenu);\r
+       }\r
+\r
+// Create/destroy methods\r
+       BOOL CreateMenu()\r
+       {\r
+               ATLASSERT(m_hMenu == NULL);\r
+               m_hMenu = ::CreateMenu();\r
+               return (m_hMenu != NULL) ? TRUE : FALSE;\r
+       }\r
+\r
+       BOOL CreatePopupMenu()\r
+       {\r
+               ATLASSERT(m_hMenu == NULL);\r
+               m_hMenu = ::CreatePopupMenu();\r
+               return (m_hMenu != NULL) ? TRUE : FALSE;\r
+       }\r
+\r
+       BOOL LoadMenu(ATL::_U_STRINGorID menu)\r
+       {\r
+               ATLASSERT(m_hMenu == NULL);\r
+               m_hMenu = ::LoadMenu(ModuleHelper::GetResourceInstance(), menu.m_lpstr);\r
+               return (m_hMenu != NULL) ? TRUE : FALSE;\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       BOOL LoadMenuIndirect(const void* lpMenuTemplate)\r
+       {\r
+               ATLASSERT(m_hMenu == NULL);\r
+               m_hMenu = ::LoadMenuIndirect(lpMenuTemplate);\r
+               return (m_hMenu != NULL) ? TRUE : FALSE;\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       BOOL DestroyMenu()\r
+       {\r
+               if (m_hMenu == NULL)\r
+                       return FALSE;\r
+               BOOL bRet = ::DestroyMenu(m_hMenu);\r
+               if(bRet)\r
+                       m_hMenu = NULL;\r
+               return bRet;\r
+       }\r
+\r
+// Menu Operations\r
+       BOOL DeleteMenu(UINT nPosition, UINT nFlags)\r
+       {\r
+               ATLASSERT(::IsMenu(m_hMenu));\r
+               return ::DeleteMenu(m_hMenu, nPosition, nFlags);\r
+       }\r
+\r
+       BOOL TrackPopupMenu(UINT nFlags, int x, int y, HWND hWnd, LPCRECT lpRect = NULL)\r
+       {\r
+               ATLASSERT(::IsMenu(m_hMenu));\r
+#ifndef _WIN32_WCE\r
+#if (WINVER >= 0x0500)\r
+               x = _FixTrackMenuPopupX(x, y);\r
+#endif // !(WINVER >= 0x0500)\r
+               return ::TrackPopupMenu(m_hMenu, nFlags, x, y, 0, hWnd, lpRect);\r
+#else // CE specific\r
+               lpRect;\r
+               return ::TrackPopupMenuEx(m_hMenu, nFlags, x, y, hWnd, NULL);\r
+#endif // _WIN32_WCE\r
+       }\r
+\r
+       BOOL TrackPopupMenuEx(UINT uFlags, int x, int y, HWND hWnd, LPTPMPARAMS lptpm = NULL)\r
+       {\r
+               ATLASSERT(::IsMenu(m_hMenu));\r
+#if (WINVER >= 0x0500) && !defined(_WIN32_WCE)\r
+               x = _FixTrackMenuPopupX(x, y);\r
+#endif // (WINVER >= 0x0500) && !defined(_WIN32_WCE)\r
+               return ::TrackPopupMenuEx(m_hMenu, uFlags, x, y, hWnd, lptpm);\r
+       }\r
+\r
+#if (WINVER >= 0x0500) && !defined(_WIN32_WCE)\r
+       // helper that fixes popup menu X position when it's off-screen\r
+       static int _FixTrackMenuPopupX(int x, int y)\r
+       {\r
+               POINT pt = { x, y };\r
+               HMONITOR hMonitor = ::MonitorFromPoint(pt, MONITOR_DEFAULTTONULL);\r
+               if(hMonitor == NULL)\r
+               {\r
+                       HMONITOR hMonitorNear = ::MonitorFromPoint(pt, MONITOR_DEFAULTTONEAREST);\r
+                       if(hMonitorNear != NULL)\r
+                       {\r
+                               MONITORINFO mi = { 0 };\r
+                               mi.cbSize = sizeof(MONITORINFO);\r
+                               if(::GetMonitorInfo(hMonitorNear, &mi) != FALSE)\r
+                               {\r
+                                       if(x < mi.rcWork.left)\r
+                                               x = mi.rcWork.left;\r
+                                       else if(x > mi.rcWork.right)\r
+                                               x = mi.rcWork.right;\r
+                               }\r
+                       }\r
+               }\r
+\r
+               return x;\r
+       }\r
+\r
+       BOOL GetMenuInfo(LPMENUINFO lpMenuInfo) const\r
+       {\r
+               ATLASSERT(::IsMenu(m_hMenu));\r
+               return ::GetMenuInfo(m_hMenu, lpMenuInfo);\r
+       }\r
+\r
+       BOOL SetMenuInfo(LPCMENUINFO lpMenuInfo)\r
+       {\r
+               ATLASSERT(::IsMenu(m_hMenu));\r
+               return ::SetMenuInfo(m_hMenu, lpMenuInfo);\r
+       }\r
+#endif // (WINVER >= 0x0500) && !defined(_WIN32_WCE)\r
+\r
+// Menu Item Operations\r
+       BOOL AppendMenu(UINT nFlags, UINT_PTR nIDNewItem = 0, LPCTSTR lpszNewItem = NULL)\r
+       {\r
+               ATLASSERT(::IsMenu(m_hMenu));\r
+               return ::AppendMenu(m_hMenu, nFlags, nIDNewItem, lpszNewItem);\r
+       }\r
+\r
+       BOOL AppendMenu(UINT nFlags, HMENU hSubMenu, LPCTSTR lpszNewItem)\r
+       {\r
+               ATLASSERT(::IsMenu(m_hMenu));\r
+               ATLASSERT(::IsMenu(hSubMenu));\r
+               return ::AppendMenu(m_hMenu, nFlags | MF_POPUP, (UINT_PTR)hSubMenu, lpszNewItem);\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       BOOL AppendMenu(UINT nFlags, UINT_PTR nIDNewItem, HBITMAP hBmp)\r
+       {\r
+               ATLASSERT(::IsMenu(m_hMenu));\r
+               return ::AppendMenu(m_hMenu, nFlags | MF_BITMAP, nIDNewItem, (LPCTSTR)hBmp);\r
+       }\r
+\r
+       BOOL AppendMenu(UINT nFlags, HMENU hSubMenu, HBITMAP hBmp)\r
+       {\r
+               ATLASSERT(::IsMenu(m_hMenu));\r
+               ATLASSERT(::IsMenu(hSubMenu));\r
+               return ::AppendMenu(m_hMenu, nFlags | (MF_BITMAP | MF_POPUP), (UINT_PTR)hSubMenu, (LPCTSTR)hBmp);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       UINT CheckMenuItem(UINT nIDCheckItem, UINT nCheck)\r
+       {\r
+               ATLASSERT(::IsMenu(m_hMenu));\r
+               return (UINT)::CheckMenuItem(m_hMenu, nIDCheckItem, nCheck);\r
+       }\r
+\r
+       UINT EnableMenuItem(UINT nIDEnableItem, UINT nEnable)\r
+       {\r
+               ATLASSERT(::IsMenu(m_hMenu));\r
+               return ::EnableMenuItem(m_hMenu, nIDEnableItem, nEnable);\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       BOOL HiliteMenuItem(HWND hWnd, UINT uIDHiliteItem, UINT uHilite)\r
+       {\r
+               ATLASSERT(::IsMenu(m_hMenu));\r
+               return ::HiliteMenuItem(hWnd, m_hMenu, uIDHiliteItem, uHilite);\r
+       }\r
+\r
+       int GetMenuItemCount() const\r
+       {\r
+               ATLASSERT(::IsMenu(m_hMenu));\r
+               return ::GetMenuItemCount(m_hMenu);\r
+       }\r
+\r
+       UINT GetMenuItemID(int nPos) const\r
+       {\r
+               ATLASSERT(::IsMenu(m_hMenu));\r
+               return ::GetMenuItemID(m_hMenu, nPos);\r
+       }\r
+\r
+       UINT GetMenuState(UINT nID, UINT nFlags) const\r
+       {\r
+               ATLASSERT(::IsMenu(m_hMenu));\r
+               return ::GetMenuState(m_hMenu, nID, nFlags);\r
+       }\r
+\r
+       int GetMenuString(UINT nIDItem, LPTSTR lpString, int nMaxCount, UINT nFlags) const\r
+       {\r
+               ATLASSERT(::IsMenu(m_hMenu));\r
+               return ::GetMenuString(m_hMenu, nIDItem, lpString, nMaxCount, nFlags);\r
+       }\r
+\r
+       int GetMenuStringLen(UINT nIDItem, UINT nFlags) const\r
+       {\r
+               ATLASSERT(::IsMenu(m_hMenu));\r
+               return ::GetMenuString(m_hMenu, nIDItem, NULL, 0, nFlags);\r
+       }\r
+\r
+#ifndef _ATL_NO_COM\r
+       BOOL GetMenuString(UINT nIDItem, BSTR& bstrText, UINT nFlags) const\r
+       {\r
+               USES_CONVERSION;\r
+               ATLASSERT(::IsMenu(m_hMenu));\r
+               ATLASSERT(bstrText == NULL);\r
+\r
+               int nLen = GetMenuStringLen(nIDItem, nFlags);\r
+               if(nLen == 0)\r
+               {\r
+                       bstrText = ::SysAllocString(OLESTR(""));\r
+                       return (bstrText != NULL) ? TRUE : FALSE;\r
+               }\r
+\r
+               nLen++;   // increment to include terminating NULL char\r
+               CTempBuffer<TCHAR, _WTL_STACK_ALLOC_THRESHOLD> buff;\r
+               LPTSTR lpszText = buff.Allocate(nLen);\r
+               if(lpszText == NULL)\r
+                       return FALSE;\r
+\r
+               if(!GetMenuString(nIDItem, lpszText, nLen, nFlags))\r
+                       return FALSE;\r
+\r
+               bstrText = ::SysAllocString(T2OLE(lpszText));\r
+               return (bstrText != NULL) ? TRUE : FALSE;\r
+       }\r
+#endif // !_ATL_NO_COM\r
+#endif // !_WIN32_WCE\r
+\r
+#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)\r
+       int GetMenuString(UINT nIDItem, _CSTRING_NS::CString& strText, UINT nFlags) const\r
+       {\r
+               ATLASSERT(::IsMenu(m_hMenu));\r
+\r
+               int nLen = GetMenuStringLen(nIDItem, nFlags);\r
+               if(nLen == 0)\r
+                       return 0;\r
+\r
+               nLen++;   // increment to include terminating NULL char\r
+               LPTSTR lpstr = strText.GetBufferSetLength(nLen);\r
+               if(lpstr == NULL)\r
+                       return 0;\r
+               int nRet = GetMenuString(nIDItem, lpstr, nLen, nFlags);\r
+               strText.ReleaseBuffer();\r
+               return nRet;\r
+       }\r
+#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)\r
+\r
+       CMenuHandle GetSubMenu(int nPos) const\r
+       {\r
+               ATLASSERT(::IsMenu(m_hMenu));\r
+               return CMenuHandle(::GetSubMenu(m_hMenu, nPos));\r
+       }\r
+\r
+       BOOL InsertMenu(UINT nPosition, UINT nFlags, UINT_PTR nIDNewItem = 0, LPCTSTR lpszNewItem = NULL)\r
+       {\r
+               ATLASSERT(::IsMenu(m_hMenu));\r
+               return ::InsertMenu(m_hMenu, nPosition, nFlags, nIDNewItem, lpszNewItem);\r
+       }\r
+\r
+       BOOL InsertMenu(UINT nPosition, UINT nFlags, HMENU hSubMenu, LPCTSTR lpszNewItem)\r
+       {\r
+               ATLASSERT(::IsMenu(m_hMenu));\r
+               ATLASSERT(::IsMenu(hSubMenu));\r
+               return ::InsertMenu(m_hMenu, nPosition, nFlags | MF_POPUP, (UINT_PTR)hSubMenu, lpszNewItem);\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       BOOL InsertMenu(UINT nPosition, UINT nFlags, UINT_PTR nIDNewItem, HBITMAP hBmp)\r
+       {\r
+               ATLASSERT(::IsMenu(m_hMenu));\r
+               return ::InsertMenu(m_hMenu, nPosition, nFlags | MF_BITMAP, nIDNewItem, (LPCTSTR)hBmp);\r
+       }\r
+\r
+       BOOL InsertMenu(UINT nPosition, UINT nFlags, HMENU hSubMenu, HBITMAP hBmp)\r
+       {\r
+               ATLASSERT(::IsMenu(m_hMenu));\r
+               ATLASSERT(::IsMenu(hSubMenu));\r
+               return ::InsertMenu(m_hMenu, nPosition, nFlags | (MF_BITMAP | MF_POPUP), (UINT_PTR)hSubMenu, (LPCTSTR)hBmp);\r
+       }\r
+\r
+       BOOL ModifyMenu(UINT nPosition, UINT nFlags, UINT_PTR nIDNewItem = 0, LPCTSTR lpszNewItem = NULL)\r
+       {\r
+               ATLASSERT(::IsMenu(m_hMenu));\r
+               return ::ModifyMenu(m_hMenu, nPosition, nFlags, nIDNewItem, lpszNewItem);\r
+       }\r
+\r
+       BOOL ModifyMenu(UINT nPosition, UINT nFlags, HMENU hSubMenu, LPCTSTR lpszNewItem)\r
+       {\r
+               ATLASSERT(::IsMenu(m_hMenu));\r
+               ATLASSERT(::IsMenu(hSubMenu));\r
+               return ::ModifyMenu(m_hMenu, nPosition, nFlags | MF_POPUP, (UINT_PTR)hSubMenu, lpszNewItem);\r
+       }\r
+\r
+       BOOL ModifyMenu(UINT nPosition, UINT nFlags, UINT_PTR nIDNewItem, HBITMAP hBmp)\r
+       {\r
+               ATLASSERT(::IsMenu(m_hMenu));\r
+               return ::ModifyMenu(m_hMenu, nPosition, nFlags | MF_BITMAP, nIDNewItem, (LPCTSTR)hBmp);\r
+       }\r
+\r
+       BOOL ModifyMenu(UINT nPosition, UINT nFlags, HMENU hSubMenu, HBITMAP hBmp)\r
+       {\r
+               ATLASSERT(::IsMenu(m_hMenu));\r
+               ATLASSERT(::IsMenu(hSubMenu));\r
+               return ::ModifyMenu(m_hMenu, nPosition, nFlags | (MF_BITMAP | MF_POPUP), (UINT_PTR)hSubMenu, (LPCTSTR)hBmp);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       BOOL RemoveMenu(UINT nPosition, UINT nFlags)\r
+       {\r
+               ATLASSERT(::IsMenu(m_hMenu));\r
+               return ::RemoveMenu(m_hMenu, nPosition, nFlags);\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       BOOL SetMenuItemBitmaps(UINT nPosition, UINT nFlags, HBITMAP hBmpUnchecked, HBITMAP hBmpChecked)\r
+       {\r
+               ATLASSERT(::IsMenu(m_hMenu));\r
+               return ::SetMenuItemBitmaps(m_hMenu, nPosition, nFlags, hBmpUnchecked, hBmpChecked);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       BOOL CheckMenuRadioItem(UINT nIDFirst, UINT nIDLast, UINT nIDItem, UINT nFlags)\r
+       {\r
+               ATLASSERT(::IsMenu(m_hMenu));\r
+               return ::CheckMenuRadioItem(m_hMenu, nIDFirst, nIDLast, nIDItem, nFlags);\r
+       }\r
+\r
+       BOOL GetMenuItemInfo(UINT uItem, BOOL bByPosition, LPMENUITEMINFO lpmii) const\r
+       {\r
+               ATLASSERT(::IsMenu(m_hMenu));\r
+               return (BOOL)::GetMenuItemInfo(m_hMenu, uItem, bByPosition, lpmii);\r
+       }\r
+\r
+       BOOL SetMenuItemInfo(UINT uItem, BOOL bByPosition, LPMENUITEMINFO lpmii)\r
+       {\r
+               ATLASSERT(::IsMenu(m_hMenu));\r
+               return (BOOL)::SetMenuItemInfo(m_hMenu, uItem, bByPosition, lpmii);\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       BOOL InsertMenuItem(UINT uItem, BOOL bByPosition, LPMENUITEMINFO lpmii)\r
+       {\r
+               ATLASSERT(::IsMenu(m_hMenu));\r
+               return (BOOL)::InsertMenuItem(m_hMenu, uItem, bByPosition, lpmii);\r
+       }\r
+\r
+       UINT GetMenuDefaultItem(BOOL bByPosition = FALSE, UINT uFlags = 0U) const\r
+       {\r
+               ATLASSERT(::IsMenu(m_hMenu));\r
+               return ::GetMenuDefaultItem(m_hMenu, (UINT)bByPosition, uFlags);\r
+       }\r
+\r
+       BOOL SetMenuDefaultItem(UINT uItem = (UINT)-1,  BOOL bByPosition = FALSE)\r
+       {\r
+               ATLASSERT(::IsMenu(m_hMenu));\r
+               return ::SetMenuDefaultItem(m_hMenu, uItem, (UINT)bByPosition);\r
+       }\r
+\r
+       BOOL GetMenuItemRect(HWND hWnd, UINT uItem, LPRECT lprcItem) const\r
+       {\r
+               ATLASSERT(::IsMenu(m_hMenu));\r
+               return ::GetMenuItemRect(hWnd, m_hMenu, uItem, lprcItem);\r
+       }\r
+\r
+       int MenuItemFromPoint(HWND hWnd, POINT point) const\r
+       {\r
+               ATLASSERT(::IsMenu(m_hMenu));\r
+               return ::MenuItemFromPoint(hWnd, m_hMenu, point);\r
+       }\r
+\r
+// Context Help Functions\r
+       BOOL SetMenuContextHelpId(DWORD dwContextHelpId)\r
+       {\r
+               ATLASSERT(::IsMenu(m_hMenu));\r
+               return ::SetMenuContextHelpId(m_hMenu, dwContextHelpId);\r
+       }\r
+\r
+       DWORD GetMenuContextHelpId() const\r
+       {\r
+               ATLASSERT(::IsMenu(m_hMenu));\r
+               return ::GetMenuContextHelpId(m_hMenu);\r
+       }\r
+#endif // !_WIN32_WCE\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CAccelerator\r
+\r
+template <bool t_bManaged>\r
+class CAcceleratorT\r
+{\r
+public:\r
+       HACCEL m_hAccel;\r
+\r
+// Constructor/destructor/operators\r
+       CAcceleratorT(HACCEL hAccel = NULL) : m_hAccel(hAccel)\r
+       { }\r
+\r
+       ~CAcceleratorT()\r
+       {\r
+               if(t_bManaged && m_hAccel != NULL)\r
+                       ::DestroyAcceleratorTable(m_hAccel);\r
+       }\r
+\r
+       CAcceleratorT<t_bManaged>& operator =(HACCEL hAccel)\r
+       {\r
+               Attach(hAccel);\r
+               return *this;\r
+       }\r
+\r
+       void Attach(HACCEL hAccel)\r
+       {\r
+               if(t_bManaged && m_hAccel != NULL)\r
+                       ::DestroyAcceleratorTable(m_hAccel);\r
+               m_hAccel = hAccel;\r
+       }\r
+\r
+       HACCEL Detach()\r
+       {\r
+               HACCEL hAccel = m_hAccel;\r
+               m_hAccel = NULL;\r
+               return hAccel;\r
+       }\r
+\r
+       operator HACCEL() const { return m_hAccel; }\r
+\r
+       bool IsNull() const { return m_hAccel == NULL; }\r
+\r
+// Create/destroy methods\r
+       HACCEL LoadAccelerators(ATL::_U_STRINGorID accel)\r
+       {\r
+               ATLASSERT(m_hAccel == NULL);\r
+               m_hAccel = ::LoadAccelerators(ModuleHelper::GetResourceInstance(), accel.m_lpstr);\r
+               return m_hAccel;\r
+       }\r
+\r
+       HACCEL CreateAcceleratorTable(LPACCEL pAccel, int cEntries)\r
+       {\r
+               ATLASSERT(m_hAccel == NULL);\r
+               ATLASSERT(pAccel != NULL);\r
+               m_hAccel = ::CreateAcceleratorTable(pAccel, cEntries);\r
+               return m_hAccel;\r
+       }\r
+\r
+       void DestroyObject()\r
+       {\r
+               if(m_hAccel != NULL)\r
+               {\r
+                       ::DestroyAcceleratorTable(m_hAccel);\r
+                       m_hAccel = NULL;\r
+               }\r
+       }\r
+\r
+// Operations\r
+#ifndef _WIN32_WCE\r
+       int CopyAcceleratorTable(LPACCEL lpAccelDst, int cEntries)\r
+       {\r
+               ATLASSERT(m_hAccel != NULL);\r
+               ATLASSERT(lpAccelDst != NULL);\r
+               return ::CopyAcceleratorTable(m_hAccel, lpAccelDst, cEntries);\r
+       }\r
+\r
+       int GetEntriesCount() const\r
+       {\r
+               ATLASSERT(m_hAccel != NULL);\r
+               return ::CopyAcceleratorTable(m_hAccel, NULL, 0);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       BOOL TranslateAccelerator(HWND hWnd, LPMSG pMsg)\r
+       {\r
+               ATLASSERT(m_hAccel != NULL);\r
+               ATLASSERT(::IsWindow(hWnd));\r
+               ATLASSERT(pMsg != NULL);\r
+               return ::TranslateAccelerator(hWnd, m_hAccel, pMsg);\r
+       }\r
+};\r
+\r
+typedef CAcceleratorT<false>   CAcceleratorHandle;\r
+typedef CAcceleratorT<true>    CAccelerator;\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CIcon\r
+\r
+template <bool t_bManaged>\r
+class CIconT\r
+{\r
+public:\r
+       HICON m_hIcon;\r
+\r
+// Constructor/destructor/operators\r
+       CIconT(HICON hIcon = NULL) : m_hIcon(hIcon)\r
+       { }\r
+\r
+       ~CIconT()\r
+       {\r
+               if(t_bManaged && m_hIcon != NULL)\r
+                       ::DestroyIcon(m_hIcon);\r
+       }\r
+\r
+       CIconT<t_bManaged>& operator =(HICON hIcon)\r
+       {\r
+               Attach(hIcon);\r
+               return *this;\r
+       }\r
+\r
+       void Attach(HICON hIcon)\r
+       {\r
+               if(t_bManaged && m_hIcon != NULL)\r
+                       ::DestroyIcon(m_hIcon);\r
+               m_hIcon = hIcon;\r
+       }\r
+\r
+       HICON Detach()\r
+       {\r
+               HICON hIcon = m_hIcon;\r
+               m_hIcon = NULL;\r
+               return hIcon;\r
+       }\r
+\r
+       operator HICON() const { return m_hIcon; }\r
+\r
+       bool IsNull() const { return m_hIcon == NULL; }\r
+\r
+// Create/destroy methods\r
+       HICON LoadIcon(ATL::_U_STRINGorID icon)\r
+       {\r
+               ATLASSERT(m_hIcon == NULL);\r
+               m_hIcon = ::LoadIcon(ModuleHelper::GetResourceInstance(), icon.m_lpstr);\r
+               return m_hIcon;\r
+       }\r
+\r
+       HICON LoadIcon(ATL::_U_STRINGorID icon, int cxDesired, int cyDesired, UINT fuLoad = 0)\r
+       {\r
+               ATLASSERT(m_hIcon == NULL);\r
+               m_hIcon = (HICON) ::LoadImage(ModuleHelper::GetResourceInstance(), icon.m_lpstr, IMAGE_ICON, cxDesired, cyDesired, fuLoad);\r
+               return m_hIcon;\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       HICON LoadOEMIcon(LPCTSTR lpstrIconName)\r
+       {\r
+               ATLASSERT(m_hIcon == NULL);\r
+               ATLASSERT(IsOEMIcon(lpstrIconName));\r
+               m_hIcon = ::LoadIcon(NULL, lpstrIconName);\r
+               return m_hIcon;\r
+       }\r
+\r
+       HICON CreateIcon(int nWidth, int nHeight, BYTE cPlanes, BYTE cBitsPixel, CONST BYTE* lpbANDbits, CONST BYTE *lpbXORbits)\r
+       {\r
+               ATLASSERT(m_hIcon == NULL);\r
+               ATLASSERT(lpbANDbits != NULL);\r
+               ATLASSERT(lpbXORbits != NULL);\r
+               m_hIcon = ::CreateIcon(ModuleHelper::GetResourceInstance(), nWidth, nHeight, cPlanes, cBitsPixel, lpbANDbits, lpbXORbits);\r
+               return m_hIcon;\r
+       }\r
+\r
+       HICON CreateIconFromResource(PBYTE pBits, DWORD dwResSize, DWORD dwVersion = 0x00030000)\r
+       {\r
+               ATLASSERT(m_hIcon == NULL);\r
+               ATLASSERT(pBits != NULL);\r
+               m_hIcon = ::CreateIconFromResource(pBits, dwResSize, TRUE, dwVersion);\r
+               return m_hIcon;\r
+       }\r
+\r
+       HICON CreateIconFromResourceEx(PBYTE pbBits, DWORD cbBits, DWORD dwVersion = 0x00030000, int cxDesired = 0, int cyDesired = 0, UINT uFlags = LR_DEFAULTCOLOR)\r
+       {\r
+               ATLASSERT(m_hIcon == NULL);\r
+               ATLASSERT(pbBits != NULL);\r
+               ATLASSERT(cbBits > 0);\r
+               m_hIcon = ::CreateIconFromResourceEx(pbBits, cbBits, TRUE, dwVersion, cxDesired, cyDesired, uFlags);\r
+               return m_hIcon;\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       HICON CreateIconIndirect(PICONINFO pIconInfo)\r
+       {\r
+               ATLASSERT(m_hIcon == NULL);\r
+               ATLASSERT(pIconInfo != NULL);\r
+               m_hIcon = ::CreateIconIndirect(pIconInfo);\r
+               return m_hIcon;\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       HICON ExtractIcon(LPCTSTR lpszExeFileName, UINT nIconIndex)\r
+       {\r
+               ATLASSERT(m_hIcon == NULL);\r
+               ATLASSERT(lpszExeFileName != NULL);\r
+               m_hIcon = ::ExtractIcon(ModuleHelper::GetModuleInstance(), lpszExeFileName, nIconIndex);\r
+               return m_hIcon;\r
+       }\r
+\r
+       HICON ExtractAssociatedIcon(HINSTANCE hInst, LPTSTR lpIconPath, LPWORD lpiIcon)\r
+       {\r
+               ATLASSERT(m_hIcon == NULL);\r
+               ATLASSERT(lpIconPath != NULL);\r
+               ATLASSERT(lpiIcon != NULL);\r
+               m_hIcon = ::ExtractAssociatedIcon(hInst, lpIconPath, lpiIcon);\r
+               return m_hIcon;\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       BOOL DestroyIcon()\r
+       {\r
+               ATLASSERT(m_hIcon != NULL);\r
+               BOOL bRet = ::DestroyIcon(m_hIcon);\r
+               if(bRet != FALSE)\r
+                       m_hIcon = NULL;\r
+               return bRet;\r
+       }\r
+\r
+// Operations\r
+#ifndef _WIN32_WCE\r
+       HICON CopyIcon()\r
+       {\r
+               ATLASSERT(m_hIcon != NULL);\r
+               return ::CopyIcon(m_hIcon);\r
+       }\r
+\r
+       HICON DuplicateIcon()\r
+       {\r
+               ATLASSERT(m_hIcon != NULL);\r
+               return ::DuplicateIcon(NULL, m_hIcon);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       BOOL DrawIcon(HDC hDC, int x, int y)\r
+       {\r
+               ATLASSERT(m_hIcon != NULL);\r
+#ifndef _WIN32_WCE\r
+               return ::DrawIcon(hDC, x, y, m_hIcon);\r
+#else // CE specific\r
+               return ::DrawIconEx(hDC, x, y, m_hIcon, 0, 0, 0, NULL, DI_NORMAL);\r
+#endif // _WIN32_WCE\r
+       }\r
+\r
+       BOOL DrawIcon(HDC hDC, POINT pt)\r
+       {\r
+               ATLASSERT(m_hIcon != NULL);\r
+#ifndef _WIN32_WCE\r
+               return ::DrawIcon(hDC, pt.x, pt.y, m_hIcon);\r
+#else // CE specific\r
+               return ::DrawIconEx(hDC, pt.x, pt.y, m_hIcon, 0, 0, 0, NULL, DI_NORMAL);\r
+#endif // _WIN32_WCE\r
+       }\r
+\r
+       BOOL DrawIconEx(HDC hDC, int x, int y, int cxWidth, int cyWidth, UINT uStepIfAniCur = 0, HBRUSH hbrFlickerFreeDraw = NULL, UINT uFlags = DI_NORMAL)\r
+       {\r
+               ATLASSERT(m_hIcon != NULL);\r
+               return ::DrawIconEx(hDC, x, y, m_hIcon, cxWidth, cyWidth, uStepIfAniCur, hbrFlickerFreeDraw, uFlags);\r
+       }\r
+\r
+       BOOL DrawIconEx(HDC hDC, POINT pt, SIZE size, UINT uStepIfAniCur = 0, HBRUSH hbrFlickerFreeDraw = NULL, UINT uFlags = DI_NORMAL)\r
+       {\r
+               ATLASSERT(m_hIcon != NULL);\r
+               return ::DrawIconEx(hDC, pt.x, pt.y, m_hIcon, size.cx, size.cy, uStepIfAniCur, hbrFlickerFreeDraw, uFlags);\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       BOOL GetIconInfo(PICONINFO pIconInfo) const\r
+       {\r
+               ATLASSERT(m_hIcon != NULL);\r
+               ATLASSERT(pIconInfo != NULL);\r
+               return ::GetIconInfo(m_hIcon, pIconInfo);\r
+       }\r
+\r
+#if (_WIN32_WINNT >= 0x0600)\r
+       BOOL GetIconInfoEx(PICONINFOEX pIconInfo) const\r
+       {\r
+               ATLASSERT(m_hIcon != NULL);\r
+               ATLASSERT(pIconInfo != NULL);\r
+               return ::GetIconInfoEx(m_hIcon, pIconInfo);\r
+       }\r
+#endif // (_WIN32_WINNT >= 0x0600)\r
+\r
+#if defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN)\r
+       HRESULT LoadIconMetric(ATL::_U_STRINGorID icon, int lims)\r
+       {\r
+               ATLASSERT(m_hIcon == NULL);\r
+               USES_CONVERSION;\r
+               return ::LoadIconMetric(ModuleHelper::GetResourceInstance(), T2CW(icon.m_lpstr), lims, &m_hIcon);\r
+       }\r
+\r
+       HRESULT LoadIconWithScaleDown(ATL::_U_STRINGorID icon, int cx, int cy)\r
+       {\r
+               ATLASSERT(m_hIcon == NULL);\r
+               USES_CONVERSION;\r
+               return ::LoadIconWithScaleDown(ModuleHelper::GetResourceInstance(), T2CW(icon.m_lpstr), cx, cy, &m_hIcon);\r
+       }\r
+\r
+       HRESULT LoadOEMIconMetric(LPCTSTR lpstrIconName, int lims)\r
+       {\r
+               ATLASSERT(m_hIcon == NULL);\r
+               ATLASSERT(IsOEMIcon(lpstrIconName));\r
+               return ::LoadIconMetric(NULL, (LPCWSTR)lpstrIconName, lims, &m_hIcon);\r
+       }\r
+\r
+       HRESULT LoadOEMIconWithScaleDown(LPCTSTR lpstrIconName, int cx, int cy)\r
+       {\r
+               ATLASSERT(m_hIcon == NULL);\r
+               ATLASSERT(IsOEMIcon(lpstrIconName));\r
+               USES_CONVERSION;\r
+               return ::LoadIconWithScaleDown(NULL, (LPCWSTR)lpstrIconName, cx, cy, &m_hIcon);\r
+       }\r
+#endif // defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN)\r
+#endif // !_WIN32_WCE\r
+\r
+       // Helper\r
+#ifndef _WIN32_WCE\r
+       static bool IsOEMIcon(LPCTSTR lpstrIconName)\r
+       {\r
+#if (WINVER >= 0x0600)\r
+               return (lpstrIconName == IDI_APPLICATION || lpstrIconName == IDI_ASTERISK || lpstrIconName == IDI_EXCLAMATION ||\r
+                         lpstrIconName == IDI_HAND || lpstrIconName == IDI_QUESTION || lpstrIconName == IDI_WINLOGO ||\r
+                         lpstrIconName == IDI_SHIELD);\r
+#else // !(WINVER >= 0x0600)\r
+               return (lpstrIconName == IDI_APPLICATION || lpstrIconName == IDI_ASTERISK || lpstrIconName == IDI_EXCLAMATION ||\r
+                         lpstrIconName == IDI_HAND || lpstrIconName == IDI_QUESTION || lpstrIconName == IDI_WINLOGO);\r
+#endif // !(WINVER >= 0x0600)\r
+       }\r
+#endif // !_WIN32_WCE\r
+};\r
+\r
+typedef CIconT<false>   CIconHandle;\r
+typedef CIconT<true>    CIcon;\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CCursor\r
+\r
+// protect template member from a winuser.h macro\r
+#ifdef CopyCursor\r
+  #undef CopyCursor\r
+#endif\r
+\r
+template <bool t_bManaged>\r
+class CCursorT\r
+{\r
+public:\r
+       HCURSOR m_hCursor;\r
+\r
+// Constructor/destructor/operators\r
+       CCursorT(HCURSOR hCursor = NULL) : m_hCursor(hCursor)\r
+       { }\r
+\r
+       ~CCursorT()\r
+       {\r
+               if(t_bManaged && m_hCursor != NULL)\r
+                       DestroyCursor();\r
+       }\r
+\r
+       CCursorT<t_bManaged>& operator =(HCURSOR hCursor)\r
+       {\r
+               Attach(hCursor);\r
+               return *this;\r
+       }\r
+\r
+       void Attach(HCURSOR hCursor)\r
+       {\r
+               if(t_bManaged && m_hCursor != NULL)\r
+                       DestroyCursor();\r
+               m_hCursor = hCursor;\r
+       }\r
+\r
+       HCURSOR Detach()\r
+       {\r
+               HCURSOR hCursor = m_hCursor;\r
+               m_hCursor = NULL;\r
+               return hCursor;\r
+       }\r
+\r
+       operator HCURSOR() const { return m_hCursor; }\r
+\r
+       bool IsNull() const { return m_hCursor == NULL; }\r
+\r
+// Create/destroy methods\r
+       HCURSOR LoadCursor(ATL::_U_STRINGorID cursor)\r
+       {\r
+               ATLASSERT(m_hCursor == NULL);\r
+               m_hCursor = ::LoadCursor(ModuleHelper::GetResourceInstance(), cursor.m_lpstr);\r
+               return m_hCursor;\r
+       }\r
+\r
+       HCURSOR LoadSysCursor(LPCTSTR lpstrCursorName)\r
+       {\r
+               ATLASSERT(m_hCursor == NULL);\r
+#if (WINVER >= 0x0500)\r
+               ATLASSERT(lpstrCursorName == IDC_ARROW || lpstrCursorName == IDC_IBEAM || lpstrCursorName == IDC_WAIT ||\r
+                       lpstrCursorName == IDC_CROSS || lpstrCursorName == IDC_UPARROW || lpstrCursorName == IDC_SIZE ||\r
+                       lpstrCursorName == IDC_ICON || lpstrCursorName == IDC_SIZENWSE || lpstrCursorName == IDC_SIZENESW ||\r
+                       lpstrCursorName == IDC_SIZEWE || lpstrCursorName == IDC_SIZENS || lpstrCursorName == IDC_SIZEALL ||\r
+                       lpstrCursorName == IDC_NO || lpstrCursorName == IDC_APPSTARTING || lpstrCursorName == IDC_HELP ||\r
+                       lpstrCursorName == IDC_HAND);\r
+#else // !(WINVER >= 0x0500)\r
+               ATLASSERT(lpstrCursorName == IDC_ARROW || lpstrCursorName == IDC_IBEAM || lpstrCursorName == IDC_WAIT ||\r
+                       lpstrCursorName == IDC_CROSS || lpstrCursorName == IDC_UPARROW || lpstrCursorName == IDC_SIZE ||\r
+                       lpstrCursorName == IDC_ICON || lpstrCursorName == IDC_SIZENWSE || lpstrCursorName == IDC_SIZENESW ||\r
+                       lpstrCursorName == IDC_SIZEWE || lpstrCursorName == IDC_SIZENS || lpstrCursorName == IDC_SIZEALL ||\r
+                       lpstrCursorName == IDC_NO || lpstrCursorName == IDC_APPSTARTING || lpstrCursorName == IDC_HELP);\r
+#endif // !(WINVER >= 0x0500)\r
+               m_hCursor = ::LoadCursor(NULL, lpstrCursorName);\r
+               return m_hCursor;\r
+       }\r
+\r
+       // deprecated\r
+       HCURSOR LoadOEMCursor(LPCTSTR lpstrCursorName)\r
+       {\r
+               return LoadSysCursor(lpstrCursorName);\r
+       }\r
+\r
+       HCURSOR LoadCursor(ATL::_U_STRINGorID cursor, int cxDesired, int cyDesired, UINT fuLoad = 0)\r
+       {\r
+               ATLASSERT(m_hCursor == NULL);\r
+               m_hCursor = (HCURSOR) ::LoadImage(ModuleHelper::GetResourceInstance(), cursor.m_lpstr, IMAGE_CURSOR, cxDesired, cyDesired, fuLoad);\r
+               return m_hCursor;\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       HCURSOR LoadCursorFromFile(LPCTSTR pstrFilename)\r
+       {\r
+               ATLASSERT(m_hCursor == NULL);\r
+               ATLASSERT(pstrFilename != NULL);\r
+               m_hCursor = ::LoadCursorFromFile(pstrFilename);\r
+               return m_hCursor;\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+#if !defined(_WIN32_WCE) || ((_WIN32_WCE >= 0x400) && !(defined(WIN32_PLATFORM_PSPC) || defined(WIN32_PLATFORM_WFSP)))\r
+       HCURSOR CreateCursor(int xHotSpot, int yHotSpot, int nWidth, int nHeight, CONST VOID *pvANDPlane, CONST VOID *pvXORPlane)\r
+       {\r
+               ATLASSERT(m_hCursor == NULL);\r
+               m_hCursor = ::CreateCursor(ModuleHelper::GetResourceInstance(), xHotSpot, yHotSpot, nWidth, nHeight, pvANDPlane, pvXORPlane);\r
+               return m_hCursor;\r
+       }\r
+#endif // !defined(_WIN32_WCE) || ((_WIN32_WCE >= 0x400) && !(defined(WIN32_PLATFORM_PSPC) || defined(WIN32_PLATFORM_WFSP)))\r
+\r
+#ifndef _WIN32_WCE\r
+       HCURSOR CreateCursorFromResource(PBYTE pBits, DWORD dwResSize, DWORD dwVersion = 0x00030000)\r
+       {\r
+               ATLASSERT(m_hCursor == NULL);\r
+               ATLASSERT(pBits != NULL);\r
+               m_hCursor = (HCURSOR)::CreateIconFromResource(pBits, dwResSize, FALSE, dwVersion);\r
+               return m_hCursor;\r
+       }\r
+\r
+       HCURSOR CreateCursorFromResourceEx(PBYTE pbBits, DWORD cbBits, DWORD dwVersion = 0x00030000, int cxDesired = 0, int cyDesired = 0, UINT uFlags = LR_DEFAULTCOLOR)\r
+       {\r
+               ATLASSERT(m_hCursor == NULL);\r
+               ATLASSERT(pbBits != NULL);\r
+               ATLASSERT(cbBits > 0);\r
+               m_hCursor = (HCURSOR)::CreateIconFromResourceEx(pbBits, cbBits, FALSE, dwVersion, cxDesired, cyDesired, uFlags);\r
+               return m_hCursor;\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+       BOOL DestroyCursor()\r
+       {\r
+               ATLASSERT(m_hCursor != NULL);\r
+#if !defined(_WIN32_WCE) || ((_WIN32_WCE >= 0x400) && !(defined(WIN32_PLATFORM_PSPC) || defined(WIN32_PLATFORM_WFSP)))\r
+               BOOL bRet = ::DestroyCursor(m_hCursor);\r
+               if(bRet != FALSE)\r
+                       m_hCursor = NULL;\r
+               return bRet;\r
+#else // !(!defined(_WIN32_WCE) || ((_WIN32_WCE >= 0x400) && !(defined(WIN32_PLATFORM_PSPC) || defined(WIN32_PLATFORM_WFSP))))\r
+               ATLTRACE2(atlTraceUI, 0, _T("Warning: This version of Windows CE does not have ::DestroyCursor()\n"));\r
+               return FALSE;\r
+#endif // !(!defined(_WIN32_WCE) || ((_WIN32_WCE >= 0x400) && !(defined(WIN32_PLATFORM_PSPC) || defined(WIN32_PLATFORM_WFSP))))\r
+       }\r
+\r
+// Operations\r
+#ifndef _WIN32_WCE\r
+       HCURSOR CopyCursor()\r
+       {\r
+               ATLASSERT(m_hCursor != NULL);\r
+               return (HCURSOR)::CopyIcon((HICON)m_hCursor);\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+#if (WINVER >= 0x0500) && !defined(_WIN32_WCE)\r
+       BOOL GetCursorInfo(LPCURSORINFO pCursorInfo)\r
+       {\r
+               ATLASSERT(m_hCursor != NULL);\r
+               ATLASSERT(pCursorInfo != NULL);\r
+               return ::GetCursorInfo(pCursorInfo);\r
+       }\r
+#endif // (WINVER >= 0x0500) && !defined(_WIN32_WCE)\r
+};\r
+\r
+typedef CCursorT<false>   CCursorHandle;\r
+typedef CCursorT<true>    CCursor;\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CResource - Wraps a generic Windows resource.\r
+//             Use it with custom resource types other than the\r
+//             standard RT_CURSOR, RT_BITMAP, etc.\r
+\r
+class CResource\r
+{\r
+public:\r
+       HGLOBAL m_hGlobal;\r
+       HRSRC m_hResource;\r
+\r
+// Constructor/destructor\r
+       CResource() : m_hGlobal(NULL), m_hResource(NULL)\r
+       { }\r
+\r
+       ~CResource()\r
+       {\r
+               Release();\r
+       }\r
+\r
+// Load methods\r
+       bool Load(ATL::_U_STRINGorID Type, ATL::_U_STRINGorID ID)\r
+       {\r
+               ATLASSERT(m_hResource == NULL);\r
+               ATLASSERT(m_hGlobal == NULL);\r
+\r
+               m_hResource = ::FindResource(ModuleHelper::GetResourceInstance(), ID.m_lpstr, Type.m_lpstr);\r
+               if(m_hResource == NULL)\r
+                       return false;\r
+\r
+               m_hGlobal = ::LoadResource(ModuleHelper::GetResourceInstance(), m_hResource);\r
+               if(m_hGlobal == NULL)\r
+               {\r
+                       m_hResource = NULL;\r
+                       return false;\r
+               }\r
+\r
+               return true;\r
+       }\r
+\r
+#ifndef _WIN32_WCE\r
+       bool LoadEx(ATL::_U_STRINGorID Type, ATL::_U_STRINGorID ID, WORD wLanguage)\r
+       {\r
+               ATLASSERT(m_hResource == NULL);\r
+               ATLASSERT(m_hGlobal == NULL);\r
+\r
+               m_hResource = ::FindResourceEx(ModuleHelper::GetResourceInstance(), ID.m_lpstr, Type.m_lpstr, wLanguage);\r
+               if(m_hResource == NULL)\r
+                       return false;\r
+\r
+               m_hGlobal = ::LoadResource(ModuleHelper::GetResourceInstance(), m_hResource);\r
+               if(m_hGlobal == NULL)\r
+               {\r
+                       m_hResource = NULL;\r
+                       return false;\r
+               }\r
+\r
+               return true;\r
+       }\r
+#endif // !_WIN32_WCE\r
+\r
+// Misc. operations\r
+       DWORD GetSize() const\r
+       {\r
+               ATLASSERT(m_hResource != NULL);\r
+               return ::SizeofResource(ModuleHelper::GetResourceInstance(), m_hResource);\r
+       }\r
+\r
+       LPVOID Lock()\r
+       {\r
+               ATLASSERT(m_hResource != NULL);\r
+               ATLASSERT(m_hGlobal != NULL);\r
+               LPVOID pVoid = ::LockResource(m_hGlobal);\r
+               ATLASSERT(pVoid != NULL);\r
+               return pVoid;\r
+       }\r
+\r
+       void Release()\r
+       {\r
+               if(m_hGlobal != NULL)\r
+               {\r
+                       FreeResource(m_hGlobal);\r
+                       m_hGlobal = NULL;\r
+                       m_hResource = NULL;\r
+               }\r
+       }\r
+};\r
+\r
+}; // namespace WTL\r
+\r
+#endif // __ATLUSER_H__\r
diff --git a/WTL80/include/atlwince.h b/WTL80/include/atlwince.h
new file mode 100644 (file)
index 0000000..5502d2e
--- /dev/null
@@ -0,0 +1,3010 @@
+// Windows Template Library - WTL version 8.0\r
+// Copyright (C) Microsoft Corporation. All rights reserved.\r
+//\r
+// This file is a part of the Windows Template Library.\r
+// The use and distribution terms for this software are covered by the\r
+// Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php)\r
+// which can be found in the file CPL.TXT at the root of this distribution.\r
+// By using this software in any fashion, you are agreeing to be bound by\r
+// the terms of this license. You must not remove this notice, or\r
+// any other, from this software.\r
+\r
+#ifndef __ATLWINCE_H__\r
+#define __ATLWINCE_H__\r
+\r
+#pragma once\r
+\r
+#ifndef __cplusplus\r
+       #error ATL requires C++ compilation (use a .cpp suffix)\r
+#endif\r
+\r
+#ifndef __ATLAPP_H__\r
+       #error atlwince.h requires atlapp.h to be included first\r
+#endif\r
+\r
+#ifndef __ATLWIN_H__\r
+       #error atlwince.h requires atlwin.h to be included first\r
+#endif\r
+\r
+#ifndef _WIN32_WCE\r
+       #error atlwince.h compiles under Windows CE only\r
+#elif (_WIN32_WCE < 300)\r
+       #error atlwince.h requires Windows CE 3.0 or higher.\r
+#endif\r
+\r
+#if defined(WIN32_PLATFORM_WFSP) &&  _MSC_VER < 1400 // EVC compiling SmartPhone code\r
+  #if (WIN32_PLATFORM_WFSP < 200)\r
+       #error atlwince.h requires Smartphone 2003 or higher\r
+  #endif\r
+#endif // WIN32_PLATFORM_WFSP\r
+\r
+#if defined(WIN32_PLATFORM_PSPC) &&  _MSC_VER < 1400 // EVC compiling Pocket PC code\r
+  #if (WIN32_PLATFORM_PSPC < 310)\r
+       #error atlwince.h requires Pocket PC 2002 or higher\r
+  #endif\r
+#endif // WIN32_PLATFORM_PSPC\r
+\r
+#if !defined(_AYGSHELL_H_) && !defined(__AYGSHELL_H__)\r
+       #error atlwince.h requires aygshell.h to be included first\r
+#else\r
+  #if defined(WIN32_PLATFORM_WFSP) && !defined(_TPCSHELL_H_)\r
+       #error SmartPhone dialog classes require tpcshell.h to be included first\r
+  #endif\r
+#endif\r
+\r
+#if (_MSC_VER >= 1400) // VS2005\r
+  #include <DeviceResolutionAware.h>\r
+  #define _WTL_CE_DRA\r
+#endif // (_MSC_VER >= 1400)\r
+\r
+#if !defined(_WTL_CE_NO_DIALOGS) &&  !defined(__ATLFRAME_H__)\r
+       #error Orientation aware dialog classes require atlframe.h to be included first\r
+#endif\r
+\r
+#if !defined(_WTL_CE_NO_APPWINDOW) &&  !defined(__ATLFRAME_H__)\r
+       #error Application window class require atlframe.h to be included first\r
+#endif\r
+\r
+#if !defined(_WTL_CE_NO_ZOOMSCROLL) &&  !defined(__ATLSCRL_H__)\r
+       #error ZoomScroll implementation requires atlscrl.h to be included first\r
+#endif\r
+\r
+#if !defined(_WTL_CE_NO_ZOOMSCROLL)\r
+  #if !(defined(__ATLTYPES_H__) || (defined(__ATLMISC_H__) && !defined(_WTL_NO_WTYPES)))\r
+       #error ZoomScroll requires _WTL_NO_WTYPES not to be defined and either atlmisc.h or atltypes.h to be included first\r
+  #endif // !(defined(__ATLTYPES_H__) || (defined(__ATLMISC_H__) && !defined(_WTL_NO_WTYPES)))\r
+#endif // !defined(_WTL_CE_NO_ZOOMSCROLL)\r
+\r
+#if !defined(WIN32_PLATFORM_WFSP) && !defined(WIN32_PLATFORM_PSPC)\r
+  #define _WTL_CE_NO_CONTROLS\r
+#endif // !defined(WIN32_PLATFORM_WFSP) && !defined(WIN32_PLATFORM_PSPC)\r
+\r
+#ifndef _WTL_CE_NO_CONTROLS\r
+  #ifndef __ATLCTRLS_H__\r
+       #error The PPC/SmartPhone controls classes require atlctrls.h to be included first\r
+  #endif\r
+\r
+  #include <htmlctrl.h>\r
+  #pragma comment(lib, "htmlview.lib")\r
+\r
+  #include <voicectl.h>\r
+  #pragma comment(lib, "voicectl.lib")\r
+\r
+  #ifdef WIN32_PLATFORM_PSPC\r
+    #include <richink.h>\r
+    #pragma comment(lib, "richink.lib")\r
+\r
+    #include <inkx.h>\r
+    #pragma comment(lib, "inkx.lib")\r
+\r
+    #include <doclist.h>\r
+    #pragma comment(lib, "doclist.lib")\r
+  #endif\r
+#endif\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Classes in this file:\r
+//\r
+// CStdDialogBase<T, t_shidiFlags, t_bModal> : Standard PPC/SmartPhone dialog base class\r
+// CStdDialogImplBase - Base implementation of standard dialog\r
+// CStdDialogImpl<T, t_shidiFlags, t_bModal> : Standard dialog implementation\r
+// CStdIndirectDialogImpl - implementation of standard indirect PPC/SmartPhone dialog\r
+// CStdAxDialogImpl<T, t_shidiFlags, t_bModal> : Standard AxDialog implementation\r
+// CStdSimpleDialog<t_wDlgTemplateID, t_shidiFlags> : Standard simple dialog\r
+// CStdDialogResizeImplBase - Base implementation of orientation resizing standard dialog\r
+// CStdDialogResizeImpl<T, t_shidiFlags, t_bModal> : Orientation resizing standard dialog implementation\r
+// CStdAxDialogResizeImpl - implementation of orientation resizing standard AxDialog\r
+// CStdSimpleDialogResizeImpl<T, t_wDlgTemplateID, t_shidiFlags> : Standard resizing simple dialog implementation\r
+// CStdOrientedDialogBase - Oriented PPC standard dialog base class\r
+// CStdOrientedDialogImplBase - Oriented PPC standard dialog base implementation\r
+// CStdOrientedDialogImpl<T, t_shidiFlags, t_bModal> : Oriented PPC standard dialog implementation\r
+// CStdAxOrientedDialogImpl - Oriented PPC standard AxDialog implementation\r
+// CStdSimpleOrientedDialog<t_wDlgTemplateID, t_wDlgLandscapeID, t_shidiFlags> : Standard simple orientable dialog\r
+//\r
+// CAppInfoBase         : Helper for application state save/restore to registry\r
+// CAppInfoT<T> : CAppInfoBase constructed from a CAppWindow<T>\r
+// CAppWindowBase<T> : Base class for PPC/SmartPhone well-behaved application window or dialog\r
+// CAppWindow<T> : PPC/SmartPhone well-behaved application window class\r
+// CAppDialog<T> : PPC/SmartPhone well-behaved application dialog class\r
+// CAppStdDialogImplBase - Base implementation of standard application dialogs\r
+// CAppStdDialogImpl<T, t_shidiFlags, t_bModal> : Implementation of standard application dialog\r
+// CAppStdDialogResizeImpl - implementation of orientation resizing standard application dialog\r
+// CAppStdAxDialogImpl - Implementation of standard application AxDialog \r
+// CAppStdAxDialogResizeImpl - implementation of orientation resizing standard application AxDialog\r
+// CAppStdOrientedDialogImpl - implementation of oriented PPC standard application dialog\r
+// CAppStdAxOrientedDialogImpl - implementation of oriented PPC standard application AxDialog\r
+//\r
+// CFullScreenFrame<T, t_bHasSip> : Full screen frame class\r
+//\r
+// CZoomScrollImpl<T> : WinCE zooming implementation\r
+//\r
+// CBottomTabViewImpl<T, TBase, TWinTraits> - CBottomTabView \r
+// CHtmlCtrlT<TBase> - CHtmlCtrl\r
+// CRichInkCtrlT<TBase> - CRichInkCtrl\r
+// CInkXCtrlT<TBase> - CInkXCtrl\r
+// CVoiceRecorderCtrlT<TBase> - CVoiceRecorderCtrl\r
+// CDocListCtrlT<TBase> - CDocListCtrl\r
+// CCapEditT<TBase> - CCapEdit\r
+// CTTStaticT<TBase> - CTTStatic\r
+// CTTButtonT<TBase> - CTTButton\r
+//\r
+// CSpinCtrlT<TBase> - CSpinCtrl : SmartPhone specific UpDown control\r
+// CSpinned<TBase, t_bExpandOnly> : SmartPhone association of control and Spin\r
+// CSpinListBox : SmartPhone spinned ListBox control\r
+// CExpandListBox : SmartPhone expandable ListBox control\r
+// CExpandEdit : SmartPhone expandable Edit control\r
+// CExpandCapEdit : SmartPhone expandable CapEdit control\r
+//\r
+// Global functions:\r
+//   AtlCreateMenuBar()\r
+//   AtlCreateEmptyMenuBar()\r
+//   AtlIsEditFocus()\r
+//   AtlActivateBackKey()\r
+\r
+namespace WTL\r
+{\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// MenuBar creation functions for property sheets and dialogs\r
+// Frame windows use CreateSimpleCEMenuBar\r
+\r
+inline HWND AtlCreateMenuBar(SHMENUBARINFO& mbi)\r
+{\r
+       ATLASSERT(::IsWindow(mbi.hwndParent));\r
+       ATLVERIFY(::SHCreateMenuBar(&mbi) != FALSE);\r
+       return mbi.hwndMB;\r
+};\r
+\r
+inline HWND AtlCreateMenuBar(HWND hWnd, UINT nToolBarId = ATL_IDW_TOOLBAR, DWORD dwFlags = 0, int nBmpId = 0, int cBmpImages = 0, COLORREF clrBk = 0)\r
+{\r
+       SHMENUBARINFO mbi = { sizeof(mbi), hWnd, dwFlags, nToolBarId, ModuleHelper::GetResourceInstance(), nBmpId, cBmpImages, 0, clrBk };\r
+       return AtlCreateMenuBar(mbi);\r
+}\r
+\r
+inline HWND AtlCreateEmptyMenuBar(HWND hWnd, bool bSip = true)\r
+{\r
+       SHMENUBARINFO embi = { sizeof(SHMENUBARINFO), hWnd, SHCMBF_EMPTYBAR };\r
+       if (!bSip)\r
+               embi.dwFlags |= SHCMBF_HIDESIPBUTTON;\r
+       \r
+       return AtlCreateMenuBar(embi);\r
+}\r
+       \r
+///////////////////////////////////////////////////////////////////////////////\r
+// Helper functions for SmartPhone back key handling\r
+\r
+inline bool AtlIsEditFocus()\r
+{\r
+       ATL::CWindow wCtrl = GetFocus();\r
+       if (wCtrl.IsWindow())\r
+       {\r
+               TCHAR szClassName[8] = {0};\r
+               ATLVERIFY(::GetClassName(wCtrl.m_hWnd, szClassName, 8));\r
+               return !_tcscmp(szClassName, _T("Edit")) || !_tcscmp(szClassName, WC_CAPEDIT);\r
+       }\r
+       return false;\r
+}\r
+\r
+#if defined WIN32_PLATFORM_WFSP\r
+inline void AtlActivateBackKey(HWND hMenuBar)\r
+{\r
+       ATLASSERT(::IsWindow(hMenuBar));\r
+       ::SendMessage(hMenuBar, SHCMBM_OVERRIDEKEY, VK_TBACK,\r
+               MAKELPARAM(SHMBOF_NODEFAULT | SHMBOF_NOTIFY, SHMBOF_NODEFAULT | SHMBOF_NOTIFY));\r
+}\r
+#endif // WIN32_PLATFORM_WFSP\r
+\r
+// --- Standard PPC/SmartPhone dialogs ---\r
+\r
+#ifndef _WTL_CE_NO_DIALOGS\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CStdDialogBase - base class for standard PPC/SmartPhone dialogs\r
+\r
+#define WTL_STD_SHIDIF   SHIDIF_DONEBUTTON | SHIDIF_SIPDOWN | SHIDIF_SIZEDLGFULLSCREEN\r
+#define WTL_SP_SHIDIF    SHIDIF_SIZEDLGFULLSCREEN\r
+\r
+// Title setting macros\r
+#define WTL_DLG_TITLEHEIGHT(iHeight) static const int GetTitleHeight(){return iHeight;}\r
+#define WTL_DLG_NOTITLE         WTL_DLG_TITLEHEIGHT(0)\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CStdDialogBase - Base class for standard PPC/SmartPhone dialog\r
+\r
+template <class T, UINT t_shidiFlags, bool t_bModal = true>\r
+class CStdDialogBase\r
+{\r
+public:\r
+#ifdef WIN32_PLATFORM_PSPC\r
+// Pocket PC only Dialog title handling\r
+       const int nTitleHeight;\r
+\r
+       CStdDialogBase() : nTitleHeight(T::GetTitleHeight())\r
+       { }\r
+\r
+// Overloads\r
+       BOOL GetClientRect(LPRECT lpRect) \r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(pT->IsWindow());\r
+               BOOL bRes = ::GetClientRect(pT->m_hWnd, lpRect);\r
+               lpRect->top += nTitleHeight;\r
+               return bRes;\r
+       }\r
+\r
+       BOOL SetWindowText(LPCTSTR lpszString)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(pT->IsWindow());\r
+               BOOL bRes = ::SetWindowText(pT->m_hWnd, lpszString);\r
+               if (nTitleHeight != 0)\r
+                       pT->DoPaintTitle();\r
+               return bRes;\r
+       }\r
+\r
+// Overrideables\r
+       static const int GetTitleHeight()\r
+       {\r
+       #ifdef _WTL_CE_DRA\r
+               return DRA::SCALEY(24);\r
+       #else // !_WTL_CE_DRA\r
+               CWindowDC dc(NULL);\r
+               return dc.GetDeviceCaps(LOGPIXELSY) >> 2; // LOGPIXELSY * 24 / 96,\r
+       #endif // !_WTL_CE_DRA\r
+       }\r
+\r
+       // Title painting\r
+       bool DoPaintTitle()\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(pT->IsWindow());\r
+               TCHAR sTitle[48];\r
+\r
+               // Preparation\r
+               CPaintDC dc(pT->m_hWnd);\r
+               CFont fontTitle = AtlCreateBoldFont();\r
+               CFontHandle fontOld = dc.SelectFont(fontTitle);\r
+               dc.SetTextColor(GetSysColor(COLOR_HIGHLIGHT));\r
+               int nLen = pT->GetWindowText(sTitle, 48);\r
+               int nWidth = dc.GetDeviceCaps(HORZRES);\r
+\r
+               // Display title text\r
+               RECT rTitle = { 0, 0, nWidth, nTitleHeight };\r
+               dc.FillRect(&rTitle, COLOR_3DHIGHLIGHT);\r
+       #ifdef _WTL_CE_DRA\r
+               rTitle.left = DRA::SCALEX(8);\r
+       #else // !_WTL_CE_DRA\r
+               rTitle.left = nTitleHeight / 3; // 8 == 24 / 3\r
+       #endif // !_WTL_CE_DRA\r
+               dc.DrawText(sTitle, nLen, &rTitle, DT_VCENTER | DT_SINGLELINE);\r
+               dc.SelectFont(fontOld);\r
+\r
+               // Draw bottom line, 2 pixels thick if HI_RES_AWARE\r
+               CPenHandle penOld = dc.SelectStockPen(BLACK_PEN);\r
+               POINT line[4] = {{0, nTitleHeight}, {nWidth, nTitleHeight}, {0, nTitleHeight - 1}, {nWidth, nTitleHeight - 1}};\r
+\r
+       #ifdef _WTL_CE_DRA\r
+               int nSeg = DRA::SCALEY(1);\r
+       #else // !_WTL_CE_DRA\r
+               int nSeg = nTitleHeight / 24; \r
+       #endif // !_WTL_CE_DRA\r
+\r
+               dc.Polyline(line, nSeg <= 2 ? nSeg * 2 : 4);\r
+               dc.SelectPen(penOld);\r
+\r
+               return false;\r
+       }\r
+\r
+       // Title preparation: move the dialog controls down to make room for title\r
+       void DialogTitleInit()\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(pT->IsWindow());\r
+\r
+               ATL::CWindow wCtl = pT->GetWindow(GW_CHILD);\r
+               while (wCtl.IsWindow())\r
+               {\r
+                       RECT rCtl = { 0 };\r
+                       wCtl.GetWindowRect(&rCtl);\r
+                       ::MapWindowPoints(NULL, pT->m_hWnd, (LPPOINT)&rCtl, 2);\r
+                       ::OffsetRect(&rCtl, 0, nTitleHeight);\r
+                       wCtl.MoveWindow(&rCtl, FALSE);\r
+                       wCtl = wCtl.GetWindow(GW_HWNDNEXT);\r
+               }\r
+       }\r
+\r
+       // SIP management\r
+       void DoSipInfo()\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(pT->IsWindow());\r
+\r
+               SIPINFO si = {sizeof(SIPINFO)};\r
+               SipGetInfo(&si);\r
+               if ((si.fdwFlags & SIPF_ON) ^ SIPF_ON) \r
+                       si.rcVisibleDesktop.bottom = si.rcSipRect.bottom;\r
+               pT->MoveWindow(&si.rcVisibleDesktop, FALSE);\r
+       }\r
+\r
+// Title painting handler\r
+       LRESULT OnPaintTitle(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               return bHandled = nTitleHeight ? pT->DoPaintTitle() : FALSE;\r
+       }\r
+\r
+// SIP handler\r
+       LRESULT OnSettingChange(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               if (wParam == SPI_SETSIPINFO)\r
+               {\r
+                       pT->DoSipInfo();\r
+                       return TRUE;\r
+               }\r
+               return bHandled = FALSE;\r
+       }\r
+\r
+#elif defined WIN32_PLATFORM_WFSP\r
+// SmartPhone VK_TBACK key standard management\r
+       LRESULT OnHotKey(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               const UINT uModif = (UINT)LOWORD(lParam);\r
+               const UINT uVirtKey = (UINT)HIWORD(lParam);\r
+\r
+               if(uVirtKey == VK_TBACK)\r
+                       if (AtlIsEditFocus())\r
+                               ::SHSendBackToFocusWindow(uMsg, wParam, lParam);\r
+                       else if (uModif & MOD_KEYUP)\r
+                                       pT->StdCloseDialog(IDCANCEL);\r
+               return 1;\r
+       }\r
+\r
+ // SmartPhone MenuBar and VK_TBACK key initialization\r
+       void StdSPInit()\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               HWND hMenuBar = ::SHFindMenuBar(pT->m_hWnd);\r
+\r
+               if (!hMenuBar && (t_shidiFlags & SHIDIF_DONEBUTTON))\r
+                       hMenuBar = CreateMenuBar(ATL_IDM_MENU_DONE);\r
+\r
+               if(hMenuBar != NULL)\r
+                       AtlActivateBackKey(hMenuBar);\r
+       }\r
+\r
+       void SetStaticBold()\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(pT->IsWindow());\r
+\r
+               CFontHandle fontBold = AtlCreateBoldFont(pT->GetFont());\r
+\r
+               ATL::CWindow wCtl = pT->GetWindow(GW_CHILD);\r
+\r
+               while (wCtl.IsWindow())\r
+               {\r
+                       if ((short int)wCtl.GetDlgCtrlID() == IDC_STATIC)\r
+                               wCtl.SetFont(fontBold);\r
+                       wCtl = wCtl.GetWindow(GW_HWNDNEXT);\r
+               }\r
+       }\r
+#endif // WIN32_PLATFORM_WFSP\r
+\r
+// Platform dependant initialization\r
+       void StdPlatformInit()\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+#ifdef WIN32_PLATFORM_PSPC // Pocket PC title initialization\r
+               if (nTitleHeight != 0)\r
+                       pT->DialogTitleInit();\r
+#elif defined(WIN32_PLATFORM_WFSP)\r
+               pT->StdSPInit();\r
+               SetStaticBold();\r
+#endif // WIN32_PLATFORM_WFSP\r
+       }\r
+\r
+       // Menu bar creation\r
+       HWND CreateMenuBar(UINT uiMB = T::IDD, int nBmpImages = 0)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               return AtlCreateMenuBar(pT->m_hWnd, uiMB, 0, nBmpImages ? uiMB : 0, nBmpImages);\r
+       }\r
+\r
+       // Dialog closing\r
+       void StdCloseDialog(WORD wID)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               if (t_bModal)\r
+                       ::EndDialog(pT->m_hWnd, wID);\r
+               else\r
+                       pT->DestroyWindow();\r
+       }\r
+\r
+       // Shell dialog layout initialization\r
+       void StdShidInit()\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               SHINITDLGINFO shidi = { SHIDIM_FLAGS, pT->m_hWnd, t_shidiFlags };\r
+               ::SHInitDialog(&shidi);\r
+       }\r
+\r
+// IDC_INFOSTATIC background setting\r
+       LRESULT OnColorStatic(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled)\r
+       {\r
+               if (::GetDlgCtrlID((HWND)lParam) == IDC_INFOSTATIC)\r
+               {\r
+                       ::SetBkMode((HDC)wParam, TRANSPARENT);\r
+                       return (LRESULT)::GetSysColorBrush(COLOR_INFOBK);\r
+               }\r
+               return bHandled = FALSE;\r
+       }\r
+\r
+// Menu dialog ending\r
+       LRESULT OnMenuClose(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               pT->StdCloseDialog((WORD)(wID - ID_MENU_OK + IDOK));\r
+               return 0;\r
+       }\r
+\r
+// Standard dialog ending: may be used with any command\r
+       LRESULT OnCloseCmd(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               pT->StdCloseDialog(wID);\r
+               return 0;\r
+       }\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CStdDialogImplBase - Base implementation of standard PPC/SmartPhone dialog\r
+\r
+template <class T, UINT t_shidiFlags = WTL_STD_SHIDIF, bool t_bModal = true, class TBase = ATL::CDialogImpl< T > >\r
+class ATL_NO_VTABLE CStdDialogImplBase :\r
+               public TBase,\r
+               public CStdDialogBase<T, t_shidiFlags, t_bModal>\r
+{\r
+public:\r
+#ifdef WIN32_PLATFORM_PSPC\r
+       BOOL GetClientRect(LPRECT lpRect) \r
+       {\r
+               return CStdDialogBase<T, t_shidiFlags, t_bModal>::GetClientRect(lpRect);\r
+       }\r
+\r
+       BOOL SetWindowText(LPCTSTR lpszString)\r
+       {\r
+               return CStdDialogBase<T, t_shidiFlags, t_bModal>::SetWindowText(lpszString);\r
+       }\r
+#endif\r
+\r
+       BEGIN_MSG_MAP(CStdDialogImplBase)\r
+#ifdef WIN32_PLATFORM_PSPC // Pocket PC title and SIP\r
+               MESSAGE_HANDLER(WM_PAINT, OnPaintTitle)\r
+               MESSAGE_HANDLER(WM_SETTINGCHANGE, OnSettingChange)\r
+#elif defined(WIN32_PLATFORM_WFSP) // SmartPhone VK_TBACK key\r
+               MESSAGE_HANDLER(WM_HOTKEY, OnHotKey)\r
+#endif\r
+               MESSAGE_HANDLER(WM_CTLCOLORSTATIC, OnColorStatic)\r
+               MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)\r
+               COMMAND_RANGE_HANDLER(IDOK, IDCANCEL, OnCloseCmd)\r
+               COMMAND_RANGE_HANDLER(ID_MENU_OK, ID_MENU_CANCEL, OnMenuClose)\r
+       END_MSG_MAP()\r
+       \r
+       LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)\r
+       {\r
+#ifdef _DEBUG\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(t_bModal == pT->m_bModal);\r
+#endif\r
+               StdPlatformInit();\r
+               StdShidInit();\r
+               return bHandled = FALSE;\r
+       }\r
+};\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CStdDialogImpl - implementation of standard PPC/SmartPhone dialog\r
+\r
+template <class T, UINT t_shidiFlags = WTL_STD_SHIDIF, bool t_bModal = true >\r
+class ATL_NO_VTABLE CStdDialogImpl : public CStdDialogImplBase< T, t_shidiFlags, t_bModal>\r
+{};\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CStdIndirectDialogImpl - implementation of standard indirect PPC/SmartPhone dialog\r
+\r
+#if defined __ATLDLGS_H__ \r
+\r
+template <class T, UINT t_shidiFlags = WTL_STD_SHIDIF, bool t_bModal = true>\r
+class ATL_NO_VTABLE CStdIndirectDialogImpl : \r
+       public CIndirectDialogImpl< T, CMemDlgTemplate, CStdDialogImpl<T, t_shidiFlags, t_bModal> >\r
+{\r
+public:\r
+       typedef CIndirectDialogImpl< T, CMemDlgTemplate, CStdDialogImpl<T, t_shidiFlags, t_bModal> >    _baseClass;\r
+       typedef CStdDialogImpl<T, t_shidiFlags, t_bModal> _baseStd;\r
+\r
+       INT_PTR DoModal(HWND hWndParent = ::GetActiveWindow(), LPARAM dwInitParam = NULL)\r
+       {\r
+               ATLASSERT(t_bModal);\r
+\r
+               if (!m_Template.IsValid())\r
+                       CreateTemplate();\r
+\r
+               if (m_Template.IsTemplateEx())\r
+               {\r
+                       if (m_Template.GetTemplateExPtr()->style & DS_CENTER)\r
+                       {\r
+                               ATLASSERT(m_Template.GetTemplateExPtr()->style ^ WS_CHILD);\r
+                               GetTemplateExPtr()->style |= WS_POPUP;\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       if (m_Template.GetTemplatePtr()->style & DS_CENTER)\r
+                       {\r
+                               ATLASSERT(m_Template.GetTemplatePtr()->style ^ WS_CHILD);\r
+                               m_Template.GetTemplatePtr()->style |= WS_POPUP;\r
+                       }\r
+               }\r
+\r
+               return _baseClass::DoModal(hWndParent, dwInitParam);\r
+       }\r
+\r
+       HWND Create(HWND hWndParent, LPARAM dwInitParam = NULL)\r
+       {\r
+               ATLASSERT(!t_bModal);\r
+\r
+               if (!m_Template.IsValid())\r
+                       CreateTemplate();\r
+\r
+               if (m_Template.IsTemplateEx())\r
+               {\r
+                       if (GetTemplateExPtr()->style & DS_CENTER)\r
+                       {\r
+                               ATLASSERT(GetTemplateExPtr()->style ^ WS_CHILD);\r
+                               GetTemplateExPtr()->style |= WS_POPUP;\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       if (GetTemplatePtr()->style & DS_CENTER)\r
+                       {\r
+                               ATLASSERT(GetTemplatePtr()->style ^ WS_CHILD);\r
+                               GetTemplatePtr()->style |= WS_POPUP;\r
+                       }\r
+               }\r
+\r
+               return _baseClass::Create(hWndParent, dwInitParam);\r
+       }\r
+\r
+       BEGIN_MSG_MAP(CStdIndirectDialogImpl)\r
+               CHAIN_MSG_MAP(_baseStd)\r
+       END_MSG_MAP()\r
+\r
+};\r
\r
+#endif // defined __ATLDLGS_H__ \r
+\r
+#ifndef _ATL_NO_HOSTING\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CStdAxDialogImpl - implementation of standard  PPC/SmartPhone AxDialog\r
+\r
+template <class T, UINT t_shidiFlags = WTL_STD_SHIDIF, bool t_bModal = true >\r
+class ATL_NO_VTABLE CStdAxDialogImpl : public CStdDialogImplBase< T, t_shidiFlags, t_bModal, ATL::CAxDialogImpl< T > >\r
+{};\r
+#endif // _ATL_NO_HOSTING\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CStdSimpleDialog - standard PPC/SmartPhone simple dialog with SHIDIF_xxx flags\r
+\r
+template <WORD t_wDlgTemplateID, UINT t_shidiFlags = WTL_STD_SHIDIF>\r
+class CStdSimpleDialog :\r
+               public ATL::CSimpleDialog<t_wDlgTemplateID, FALSE>,\r
+               public CStdDialogBase<CStdSimpleDialog<t_wDlgTemplateID, t_shidiFlags>, t_shidiFlags>\r
+{\r
+public:\r
+       typedef CStdDialogBase<CStdSimpleDialog<t_wDlgTemplateID, t_shidiFlags>, t_shidiFlags> baseClass;\r
+\r
+#ifdef WIN32_PLATFORM_PSPC\r
+       BOOL GetClientRect(LPRECT lpRect) \r
+       {\r
+               return baseClass::GetClientRect(lpRect);\r
+       }\r
+\r
+       BOOL SetWindowText(LPCTSTR lpszString)\r
+       {\r
+               return baseClass::SetWindowText(lpszString);\r
+       }\r
+#endif\r
+\r
+       BEGIN_MSG_MAP(CStdSimpleDialog)\r
+#ifdef WIN32_PLATFORM_PSPC // Pocket PC title and SIP\r
+               MESSAGE_HANDLER(WM_PAINT, OnPaintTitle)\r
+               MESSAGE_HANDLER(WM_SETTINGCHANGE, OnSettingChange)\r
+#elif defined(WIN32_PLATFORM_WFSP) // SmartPhone VK_TBACK key\r
+               MESSAGE_HANDLER(WM_HOTKEY, OnHotKey)\r
+#endif\r
+               MESSAGE_HANDLER(WM_CTLCOLORSTATIC, OnColorStatic)\r
+               MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)\r
+               COMMAND_RANGE_HANDLER(ID_MENU_OK, ID_MENU_CANCEL, OnMenuClose)\r
+               COMMAND_RANGE_HANDLER(IDOK, IDCANCEL, baseClass::OnCloseCmd)\r
+       END_MSG_MAP()\r
+\r
+       LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)\r
+       {\r
+               StdPlatformInit();\r
+               StdShidInit();\r
+               return bHandled = FALSE;\r
+       }\r
+};\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CStdDialogResizeImplBase - Base implementation of orientation resizing standard PPC/SmartPhone dialog\r
+\r
+template <class T, UINT t_shidiFlags = WTL_STD_SHIDIF, bool t_bModal = true, class TBase = ATL::CDialogImpl<T> >\r
+class ATL_NO_VTABLE CStdDialogResizeImplBase :\r
+               public CStdDialogImplBase< T, t_shidiFlags, t_bModal, TBase>,\r
+               public CDialogResize<T>\r
+{\r
+public:\r
+       // Note: BEGIN_DLGRESIZE_MAP is required in the derived class.\r
+\r
+       BEGIN_MSG_MAP(CStdResizeDialogImplBase)\r
+#ifdef WIN32_PLATFORM_PSPC // Pocket PC title\r
+               MESSAGE_HANDLER(WM_PAINT, OnPaintTitle)\r
+#elif defined(WIN32_PLATFORM_WFSP) // SmartPhone VK_TBACK key\r
+               MESSAGE_HANDLER(WM_HOTKEY, OnHotKey)\r
+#endif\r
+               MESSAGE_HANDLER(WM_CTLCOLORSTATIC, OnColorStatic)\r
+               MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)\r
+               COMMAND_RANGE_HANDLER(IDOK, IDCANCEL, OnCloseCmd)\r
+               COMMAND_RANGE_HANDLER(ID_MENU_OK, ID_MENU_CANCEL, OnMenuClose)\r
+               CHAIN_MSG_MAP(CDialogResize< T >)\r
+       END_MSG_MAP()\r
+\r
+       LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)\r
+       {\r
+#ifdef _DEBUG\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(t_bModal == pT->m_bModal);\r
+#endif\r
+               StdPlatformInit();\r
+               DlgResize_Init(FALSE);\r
+               StdShidInit();\r
+               return bHandled = FALSE;\r
+       }\r
+};\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CStdDialogResizeImpl - implementation of orientation resizing standard PPC/SmartPhone dialog\r
+\r
+template <class T, UINT t_shidiFlags = WTL_STD_SHIDIF, bool t_bModal = true >\r
+class ATL_NO_VTABLE CStdDialogResizeImpl : public CStdDialogResizeImplBase< T, t_shidiFlags, t_bModal>\r
+{};\r
+\r
+#ifndef _ATL_NO_HOSTING\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CStdAxDialogResizeImpl - implementation of orientation resizing standard PPC/SmartPhone AxDialog\r
+\r
+template <class T, UINT t_shidiFlags = WTL_STD_SHIDIF, bool t_bModal = true >\r
+class ATL_NO_VTABLE CStdAxDialogResizeImpl : public CStdDialogResizeImplBase< T, t_shidiFlags, t_bModal, ATL::CAxDialogImpl<T> >\r
+{};\r
+#endif // _ATL_NO_HOSTING\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CStdSimpleDialogResizeImpl - implementation of standard resizing simple dialog with SHIDIF_xxx flags\r
+\r
+// Usage:\r
+//     class CMyDlg : public CStdSimpleDialogResize<CMyDlg,\r
+//             IDD_MYDLG, SHIDIF_DONEBUTTON | SHIDIF_FULLSCREENNOMENUBAR>\r
+//     {\r
+//     public:\r
+//             BEGIN_DLGRESIZE_MAP(CMyDlg)\r
+//             ...\r
+//             END_DLGRESIZE_MAP()\r
+//     };\r
+\r
+template <class T, WORD t_wDlgTemplateID, UINT t_shidiFlags = WTL_STD_SHIDIF>\r
+class ATL_NO_VTABLE CStdSimpleDialogResizeImpl :\r
+               public CStdSimpleDialog<t_wDlgTemplateID, t_shidiFlags>,\r
+               public CDialogResize< T >\r
+{\r
+public:\r
+       typedef CStdSimpleDialog<t_wDlgTemplateID, t_shidiFlags>::baseClass baseClass;\r
+\r
+       BEGIN_MSG_MAP(CStdSimpleDialogResizeImpl)\r
+#ifdef WIN32_PLATFORM_PSPC // Pocket PC title\r
+               MESSAGE_HANDLER(WM_PAINT, OnPaintTitle)\r
+#elif defined(WIN32_PLATFORM_WFSP) // SmartPhone VK_TBACK key\r
+               MESSAGE_HANDLER(WM_HOTKEY, OnHotKey)\r
+#endif\r
+               MESSAGE_HANDLER(WM_CTLCOLORSTATIC, OnColorStatic)\r
+               MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)\r
+               COMMAND_RANGE_HANDLER(IDOK, IDCANCEL, baseClass::OnCloseCmd)\r
+               COMMAND_RANGE_HANDLER(ID_MENU_OK, ID_MENU_CANCEL, OnMenuClose)\r
+               CHAIN_MSG_MAP(CDialogResize< T >)\r
+       END_MSG_MAP()\r
+\r
+       LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)\r
+       {\r
+               StdPlatformInit();\r
+               DlgResize_Init(FALSE);\r
+               StdShidInit();\r
+               return bHandled = FALSE;\r
+       }\r
+};\r
+\r
+#if defined(_WTL_CE_DRA) && defined(WIN32_PLATFORM_PSPC)\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CStdOrientedDialogBase - Oriented PPC standard dialog base class\r
+\r
+template <class T>\r
+class CStdOrientedDialogBase\r
+{\r
+public:\r
+// Operation\r
+       BOOL SetOrientation(DRA::DisplayMode mode)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(pT->IsWindow());\r
+               ATLASSERT(mode == DRA::GetDisplayMode());\r
+               \r
+               // Derived dialog must enumerate TWO dialog templates with the same control ids and types ie:\r
+               // enum { IDD = IDD_MYDLG, IDD_LANDSCAPE = IDD_MYDLG_L };\r
+               UINT iResource = (mode == DRA::Landscape)? T::IDD_LANDSCAPE : T::IDD;\r
+\r
+               BOOL bRes = DRA::RelayoutDialog(ModuleHelper::GetResourceInstance(), pT->m_hWnd, MAKEINTRESOURCE(iResource));\r
+               pT->OnOrientation(mode);\r
+               return bRes;\r
+       }\r
+\r
+// Override\r
+       void OnOrientation(DRA::DisplayMode /*mode*/)\r
+       {}\r
+\r
+// Message handlers\r
+       LRESULT OnSettingChange(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(pT->IsWindow());\r
+               if (wParam == SETTINGCHANGE_RESET)\r
+               {\r
+                       SetOrientation(DRA::GetDisplayMode());\r
+                       pT->StdPlatformInit();\r
+                       pT->StdShidInit();\r
+               }\r
+               else if (wParam == SPI_SETSIPINFO)\r
+               {\r
+                       pT->DoSipInfo();\r
+                       return TRUE;\r
+               }\r
+               return bHandled = FALSE;\r
+       }\r
+};\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CStdOrientedDialogImplBase - Oriented PPC standard dialog base implementation\r
+\r
+template <class T, UINT t_shidiFlags = WTL_STD_SHIDIF, bool t_bModal = true, class TBase = ATL::CDialogImpl<T> >\r
+class ATL_NO_VTABLE CStdOrientedDialogImplBase :\r
+               public CStdDialogImplBase< T, t_shidiFlags, t_bModal, TBase>,\r
+               public CStdOrientedDialogBase<T>\r
+{\r
+public:\r
+       BEGIN_MSG_MAP(CStdOrientedDialogImpl)\r
+               MESSAGE_HANDLER(WM_PAINT, OnPaintTitle)\r
+               MESSAGE_HANDLER(WM_CTLCOLORSTATIC, OnColorStatic)\r
+               MESSAGE_HANDLER(WM_SETTINGCHANGE, CStdOrientedDialogBase<T>::OnSettingChange)\r
+               MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)\r
+               COMMAND_RANGE_HANDLER(IDOK, IDCANCEL, OnCloseCmd)\r
+               COMMAND_RANGE_HANDLER(ID_MENU_OK, ID_MENU_CANCEL, OnMenuClose)\r
+       END_MSG_MAP()\r
+\r
+       LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+#ifdef _DEBUG\r
+               ATLASSERT(t_bModal == pT->m_bModal);\r
+#endif\r
+               if (DRA::GetDisplayMode() == DRA::Landscape)\r
+                       SetOrientation(DRA::Landscape);\r
+               pT->StdPlatformInit();\r
+               pT->StdShidInit();\r
+               return bHandled = FALSE;\r
+       }\r
+};\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CStdOrientedDialogImpl - Oriented PPC standard dialog implementation\r
+\r
+template <class T, UINT t_shidiFlags = WTL_STD_SHIDIF, bool t_bModal = true >\r
+class ATL_NO_VTABLE CStdOrientedDialogImpl : public CStdOrientedDialogImplBase< T, t_shidiFlags, t_bModal>\r
+{};\r
+\r
+#ifndef _ATL_NO_HOSTING\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CStdAxOrientedDialogImpl - Oriented PPC standard AxDialog implementation\r
+\r
+template <class T, UINT t_shidiFlags = WTL_STD_SHIDIF, bool t_bModal = true >\r
+class ATL_NO_VTABLE CStdAxOrientedDialogImpl : public CStdOrientedDialogImplBase< T, t_shidiFlags, t_bModal, ATL::CAxDialogImpl<T> >\r
+{};\r
+#endif // _ATL_NO_HOSTING\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CStdSimpleOrientedDialog - Standard simple orientable dialog\r
+\r
+template <WORD t_wDlgTemplateID, WORD t_wDlgLandscapeID, UINT t_shidiFlags = WTL_STD_SHIDIF>\r
+class CStdSimpleOrientedDialog :\r
+               public CStdSimpleDialog<t_wDlgTemplateID, t_shidiFlags>,\r
+               public CStdOrientedDialogBase<CStdSimpleOrientedDialog<t_wDlgTemplateID, t_wDlgLandscapeID, t_shidiFlags> >\r
+{\r
+public:\r
+       typedef CStdSimpleDialog<t_wDlgTemplateID, t_shidiFlags>::baseClass baseClass;\r
+       typedef CStdOrientedDialogBase<CStdSimpleOrientedDialog<t_wDlgTemplateID, t_wDlgLandscapeID, t_shidiFlags> > baseOriented;\r
+\r
+       enum {IDD = t_wDlgTemplateID, IDD_LANDSCAPE = t_wDlgLandscapeID};\r
+\r
+       BEGIN_MSG_MAP(CStdSimpleDialog)\r
+               MESSAGE_HANDLER(WM_PAINT, OnPaintTitle)\r
+               MESSAGE_HANDLER(WM_CTLCOLORSTATIC, OnColorStatic)\r
+               MESSAGE_HANDLER(WM_SETTINGCHANGE, baseOriented::OnSettingChange)\r
+               MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)\r
+               COMMAND_RANGE_HANDLER(IDOK, IDCANCEL, baseClass::OnCloseCmd)\r
+               COMMAND_RANGE_HANDLER(ID_MENU_OK, ID_MENU_CANCEL, OnMenuClose)\r
+       END_MSG_MAP()\r
+\r
+               LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)\r
+       {\r
+               if (DRA::GetDisplayMode() == DRA::Landscape)\r
+                       SetOrientation(DRA::Landscape);\r
+               StdPlatformInit();\r
+               StdShidInit();\r
+               return bHandled = FALSE;\r
+       }\r
+};\r
+\r
+#endif // _WTL_CE_DRA\r
+\r
+\r
+#endif // _WTL_CE_NO_DIALOGS\r
+\r
+\r
+// --- PPC/SmartPhone application window and helpers ---\r
+\r
+#ifndef _WTL_CE_NO_APPWINDOW\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CAppInfoBase - Helper for application state save/restore to registry\r
+\r
+class CAppInfoBase\r
+{\r
+public:\r
+       ATL::CRegKey m_Key;\r
+\r
+       CAppInfoBase(ATL::_U_STRINGorID sAppKey)\r
+       {\r
+               m_Key.Create(HKEY_CURRENT_USER, sAppKey.m_lpstr);\r
+               ATLASSERT(m_Key.m_hKey);\r
+       }\r
+\r
+       template <class V>\r
+       LONG Save(V& val, ATL::_U_STRINGorID sName)\r
+       {\r
+               return ::RegSetValueEx(m_Key, sName.m_lpstr, 0, REG_BINARY, (LPBYTE)&val, sizeof(V));\r
+       }\r
+\r
+       template <class V>\r
+       LONG Save(int nb, V& val0, ATL::_U_STRINGorID sName)\r
+       {\r
+               return ::RegSetValueEx(m_Key, sName.m_lpstr, 0, REG_BINARY, (LPBYTE)&val0, nb * sizeof(V));\r
+       }\r
+\r
+       template <class V>\r
+       LONG Restore(V& val, ATL::_U_STRINGorID sName)\r
+       {\r
+               DWORD valtype;\r
+               DWORD bufSize = sizeof(V);\r
+               return ::RegQueryValueEx(m_Key, sName.m_lpstr, 0, &valtype, (LPBYTE)&val, &bufSize);\r
+       }\r
+\r
+       template <class V>\r
+       LONG Restore(int nb, V& val0, ATL::_U_STRINGorID sName)\r
+       {\r
+               DWORD valtype;\r
+               DWORD bufSize = nb * sizeof(V);\r
+               return ::RegQueryValueEx(m_Key, sName.m_lpstr, 0, &valtype, (LPBYTE)&val0, &bufSize);\r
+       }\r
+\r
+#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)\r
+#if (_ATL_VER < 0x0800)\r
+       LONG Save(_CSTRING_NS::CString& sval, ATL::_U_STRINGorID sName)\r
+       {\r
+               return m_Key.SetValue(sval, sName.m_lpstr);\r
+       }\r
+\r
+       LONG Restore(_CSTRING_NS::CString& sval, ATL::_U_STRINGorID sName)\r
+       {\r
+               DWORD size = MAX_PATH;\r
+               LONG res = m_Key.QueryValue(sval.GetBuffer(size), sName.m_lpstr, &size);\r
+               sval.ReleaseBuffer();\r
+               return res;\r
+       }\r
+#else // !(_ATL_VER < 0x0800)\r
+       LONG Save(_CSTRING_NS::CString& sval, ATL::_U_STRINGorID sName)\r
+       {\r
+               return m_Key.SetStringValue(sName.m_lpstr, sval);\r
+       }\r
+\r
+       LONG Restore(_CSTRING_NS::CString& sval, ATL::_U_STRINGorID sName)\r
+       {\r
+               DWORD size = MAX_PATH;\r
+               LONG res = m_Key.QueryStringValue(sName.m_lpstr, sval.GetBuffer(size), &size);\r
+               sval.ReleaseBuffer();\r
+               return res;\r
+       }\r
+#endif // !(_ATL_VER < 0x0800)\r
+#else\r
+  #pragma message("Warning: CAppInfoBase compiles without CString support. Do not use CString in Save or Restore.")\r
+#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)\r
+       \r
+#if (_ATL_VER < 0x0800)\r
+       LONG Save(LPCTSTR sval, ATL::_U_STRINGorID sName)\r
+       {\r
+               return m_Key.SetValue(sval, sName.m_lpstr);\r
+       }\r
+\r
+       LONG Restore(LPTSTR sval, ATL::_U_STRINGorID sName, DWORD *plength)\r
+       {\r
+               return m_Key.QueryValue(sval, sName.m_lpstr, plength);\r
+       }\r
+#else // !(_ATL_VER < 0x0800)\r
+       LONG Save(LPCTSTR sval, ATL::_U_STRINGorID sName)\r
+       {\r
+               return m_Key.SetStringValue(sName.m_lpstr, sval);\r
+       }\r
+\r
+       LONG Restore(LPTSTR sval, ATL::_U_STRINGorID sName, DWORD *plength)\r
+       {\r
+               return m_Key.QueryStringValue(sName.m_lpstr, sval, plength);\r
+       }\r
+#endif // !(_ATL_VER < 0x0800)\r
+       \r
+       LONG Delete(ATL::_U_STRINGorID sName)\r
+       {\r
+               return  m_Key.DeleteValue(sName.m_lpstr);\r
+       }\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CAppInfoT - CAppInfoBase constructed from a class with T::GetAppKey() \r
+\r
+// Macro for declaring AppKey\r
+#define DECLARE_APPKEY(uAppKey) \\r
+       static LPCTSTR GetAppKey() \\r
+       { \\r
+               static LPCTSTR sAppKey = ATL::_U_STRINGorID(uAppKey).m_lpstr; \\r
+               return sAppKey; \\r
+       }\r
+\r
+template <class T>\r
+class CAppInfoT : public CAppInfoBase\r
+{\r
+public:\r
+       CAppInfoT() : CAppInfoBase(T::GetAppKey()){}\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CAppWindowBase - Base class for PPC/SmartPhone "well-behaved" application window or dialog\r
+\r
+// Macros for declaring frame WNDCLASS and AppKey\r
+#define DECLARE_APP_FRAME_CLASS(WndClassName, uCommonResourceID, uAppKey) \\r
+       DECLARE_FRAME_WND_CLASS(WndClassName, uCommonResourceID) \\r
+       DECLARE_APPKEY(uAppKey)\r
+\r
+#define DECLARE_APP_FRAME_CLASS_EX(WndClassName, uCommonResourceID, style, bkgnd, uAppKey) \\r
+       DECLARE_FRAME_WND_CLASS_EX(WndClassName, uCommonResourceID, style, bkgnd) \\r
+       DECLARE_APPKEY(uAppKey)\r
+\r
+template <class T>\r
+class CAppWindowBase\r
+{\r
+public:\r
+       typedef class CAppInfoT< T > CAppInfo;\r
+\r
+#ifndef WIN32_PLATFORM_WFSP\r
+       SHACTIVATEINFO m_sai; // NoOp on SmartPhones\r
+#endif // WIN32_PLATFORM_WFSP\r
+\r
+       bool m_bHibernate;\r
+\r
+       CAppWindowBase< T >() : m_bHibernate(false)\r
+       {\r
+#ifndef WIN32_PLATFORM_WFSP\r
+               SHACTIVATEINFO sai = { sizeof(SHACTIVATEINFO) };\r
+               m_sai = sai;\r
+#endif // WIN32_PLATFORM_WFSP\r
+       };\r
+\r
+       // Same as WTL 7.1 AppWizard generated ActivatePreviousInstance + SendMessage WM_COPYDATA\r
+       static HRESULT ActivatePreviousInstance(HINSTANCE hInstance, LPCTSTR  lpstrCmdLine, bool bDialog)\r
+       {\r
+               // requires T does DECLARE_APP_FRAME_CLASS, DECLARE_APP_FRAME_CLASS_EX or DECLARE_APP_DLG_CLASS\r
+               CFrameWndClassInfo& classInfo = T::GetWndClassInfo();\r
+\r
+               ATLVERIFY(::LoadString(hInstance, classInfo.m_uCommonResourceID, classInfo.m_szAutoName, sizeof(classInfo.m_szAutoName)/sizeof(classInfo.m_szAutoName[0])) != 0);\r
+\r
+               classInfo.m_wc.lpszClassName = classInfo.m_szAutoName;\r
+\r
+               const TCHAR* pszClass = classInfo.m_wc.lpszClassName;\r
+\r
+               if(NULL == pszClass || '\0' == *pszClass)\r
+               {\r
+                       return E_FAIL;\r
+               }\r
+\r
+               const DWORD dRetryInterval = 100;\r
+               const int iMaxRetries = 25;\r
+\r
+               for(int i = 0; i < iMaxRetries; ++i)\r
+               {\r
+                       HANDLE hMutex = CreateMutex(NULL, FALSE, pszClass);\r
+\r
+                       DWORD dw = GetLastError();\r
+\r
+                       if(NULL == hMutex)\r
+                       {\r
+                               HRESULT hr;\r
+\r
+                               switch(dw)\r
+                               {\r
+                               case ERROR_INVALID_HANDLE:\r
+                                       // A non-mutext object with this name already exists.\r
+                                       hr = E_INVALIDARG;\r
+                                       break;\r
+                               default:\r
+                                       // This should never happen...\r
+                                       hr = E_FAIL;\r
+                               }\r
+\r
+                               return hr;\r
+                       }\r
+\r
+                       // If the mutex already exists, then there should be another instance running\r
+                       if(dw == ERROR_ALREADY_EXISTS)\r
+                       {\r
+                               CloseHandle(hMutex);\r
+                               \r
+                               HWND hwnd = NULL;\r
+                               if (bDialog)\r
+                                       hwnd = FindWindow(NULL, pszClass);\r
+                               else\r
+                                       hwnd = FindWindow(pszClass, NULL);\r
+\r
+                               if(hwnd == NULL)\r
+                               {\r
+                                       Sleep(dRetryInterval);\r
+                                       continue;\r
+                               }\r
+                               else\r
+                               {\r
+                                       // Transmit our params to previous instance\r
+                                       if (lpstrCmdLine && *lpstrCmdLine)\r
+                                       {\r
+                                               COPYDATASTRUCT cd = { NULL, sizeof(TCHAR) * (wcslen(lpstrCmdLine) + 1), (PVOID)lpstrCmdLine };\r
+                                               ::SendMessage(hwnd, WM_COPYDATA, NULL, (LPARAM)&cd);\r
+                                       }\r
+                                       // Set the previous instance as the foreground window\r
+                                       if(0 != SetForegroundWindow(reinterpret_cast<HWND>(reinterpret_cast<ULONG>(hwnd) | 0x1)))\r
+                                               return S_FALSE;\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               return S_OK;\r
+                       }\r
+               }\r
+               return S_OK;\r
+       }\r
+\r
+// Operations overriden in derived class\r
+       bool AppHibernate(bool /*bHibernate*/)\r
+       {\r
+               return false;\r
+       }\r
+\r
+       bool AppNewInstance(LPCTSTR /*lpstrCmdLine*/)\r
+       {\r
+               return false;\r
+       }\r
+\r
+       void AppSave()\r
+       {\r
+       }\r
+\r
+#ifdef WIN32_PLATFORM_WFSP \r
+       void AppBackKey() \r
+       {\r
+               ::SHNavigateBack();\r
+       }\r
+#endif\r
+\r
+// Message map and handlers\r
+       BEGIN_MSG_MAP(CAppWindowBase)\r
+               MESSAGE_HANDLER(WM_ACTIVATE, OnActivate)\r
+#ifdef WIN32_PLATFORM_WFSP\r
+               MESSAGE_HANDLER(WM_HOTKEY, OnHotKey)\r
+#else\r
+               MESSAGE_HANDLER(WM_SETTINGCHANGE, OnSettingChange)\r
+#endif // WIN32_PLATFORM_WFSP\r
+               MESSAGE_HANDLER(WM_HIBERNATE, OnHibernate)\r
+               MESSAGE_HANDLER(WM_COPYDATA, OnNewInstance)\r
+               MESSAGE_HANDLER(WM_CLOSE, OnClose)\r
+       END_MSG_MAP()\r
+\r
+       LRESULT OnActivate(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               if (m_bHibernate)\r
+                       m_bHibernate = pT->AppHibernate(false);\r
+#ifndef WIN32_PLATFORM_WFSP\r
+               ::SHHandleWMActivate(pT->m_hWnd, wParam, lParam, &m_sai, 0);\r
+#else\r
+               wParam;\r
+               lParam;\r
+#endif // WIN32_PLATFORM_WFSP\r
+                return bHandled = FALSE;\r
+       }\r
+\r
+#ifdef WIN32_PLATFORM_WFSP\r
+// SmartPhone VK_TBACK key standard management\r
+       LRESULT OnHotKey(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               const UINT uModif = (UINT)LOWORD(lParam);\r
+               const UINT uVirtKey = (UINT)HIWORD(lParam);\r
+               if(uVirtKey == VK_TBACK)\r
+                       if (AtlIsEditFocus())\r
+                               ::SHSendBackToFocusWindow(uMsg, wParam, lParam);\r
+                       else if (uModif & MOD_KEYUP)\r
+                               pT->AppBackKey();\r
+               return 1;\r
+       }\r
+\r
+#else // !WIN32_PLATFORM_WFSP\r
+// PPC SIP handling\r
+       LRESULT OnSettingChange(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               bHandled = FALSE;\r
+               return ::SHHandleWMSettingChange(pT->m_hWnd, wParam, lParam, &m_sai);\r
+       }\r
+#endif // !WIN32_PLATFORM_WFSP\r
+\r
+       LRESULT OnHibernate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               return m_bHibernate = pT->AppHibernate(true);\r
+       }\r
+\r
+       LRESULT OnNewInstance(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               PCOPYDATASTRUCT pcds = (PCOPYDATASTRUCT)lParam;\r
+               return pT->AppNewInstance((LPCTSTR)pcds->lpData);\r
+       }\r
+\r
+       LRESULT OnClose(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               pT->AppSave();\r
+               bHandled = FALSE;\r
+               return 1;\r
+       }\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CAppWindow - PPC/SmartPhone "well-behaved" application window class\r
+\r
+template <class T>\r
+class CAppWindow : public CAppWindowBase< T >\r
+{\r
+public:\r
+       // Same as WTL 7.1 AppWizard generated Run + lpstrCmdLine in CreateEx\r
+       static int AppRun(LPTSTR lpstrCmdLine = NULL, int nCmdShow = SW_SHOWNORMAL)\r
+       {\r
+               CMessageLoop theLoop;\r
+               _Module.AddMessageLoop(&theLoop);\r
+\r
+               T wndMain;\r
+\r
+               if(wndMain.CreateEx(NULL, NULL, 0, 0, lpstrCmdLine) == NULL)\r
+               {\r
+                       ATLTRACE2(atlTraceUI, 0, _T("Main window creation failed!\n"));\r
+                       return 0;\r
+               }\r
+\r
+               wndMain.ShowWindow(nCmdShow);\r
+\r
+               int nRet = theLoop.Run();\r
+\r
+               _Module.RemoveMessageLoop();\r
+               return nRet;\r
+       }\r
+\r
+       static HRESULT ActivatePreviousInstance(HINSTANCE hInstance, LPCTSTR  lpstrCmdLine)\r
+       {\r
+               return CAppWindowBase< T >::ActivatePreviousInstance(hInstance, lpstrCmdLine, false);\r
+       }\r
+};\r
+\r
+\r
+#ifndef _WTL_CE_NO_DIALOGS\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CAppDialog - PPC/SmartPhone "well-behaved" dialog application class\r
+\r
+// Macro for declaring dialog WNDCLASS and AppKey\r
+#define DECLARE_APP_DLG_CLASS(WndClassName, uCommonResourceID, uAppKey) \\r
+       static WTL::CFrameWndClassInfo& GetWndClassInfo() \\r
+       { \\r
+               static WTL::CFrameWndClassInfo wc = \\r
+               { \\r
+                       { 0, (WNDPROC)StartDialogProc, \\r
+                       0, 0, NULL, NULL, NULL, (HBRUSH)(COLOR_WINDOW + 1), NULL, WndClassName }, \\r
+                       NULL, NULL, IDC_ARROW, TRUE, 0, _T(""), uCommonResourceID \\r
+               }; \\r
+               return wc; \\r
+       }; \\r
+       DECLARE_APPKEY(uAppKey)\r
+\r
+template <class T>\r
+class CAppDialog : public CAppWindowBase< T >\r
+{\r
+public:\r
+       static int AppRun(LPTSTR lpstrCmdLine = NULL, int nCmdShow = SW_SHOWNORMAL)\r
+       {\r
+               CMessageLoop theLoop;\r
+               _Module.AddMessageLoop(&theLoop);\r
+\r
+               T dlgMain;\r
+\r
+               if(dlgMain.Create(NULL, (LPARAM)lpstrCmdLine) == NULL)\r
+               {\r
+                       ATLTRACE2(atlTraceUI, 0, _T("Main dialog creation failed!\n"));\r
+                       return 0;\r
+               }\r
+\r
+               dlgMain.ShowWindow(nCmdShow);\r
+\r
+               int nRet = theLoop.Run();\r
+\r
+               _Module.RemoveMessageLoop();\r
+               return nRet;\r
+       }\r
+\r
+       static HRESULT ActivatePreviousInstance(HINSTANCE hInstance, LPCTSTR  lpstrCmdLine)\r
+       {\r
+               return CAppWindowBase< T >::ActivatePreviousInstance(hInstance, lpstrCmdLine, true);\r
+       };\r
+};\r
+\r
+// PPC/SmartPhone standard application dialogs\r
+\r
+#ifdef WIN32_PLATFORM_WFSP\r
+#define WTL_APP_SHIDIF WTL_SP_SHIDIF\r
+#else\r
+#define WTL_APP_SHIDIF WTL_STD_SHIDIF\r
+#endif\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CAppStdDialogImplBase - Base implementation of standard application dialogs\r
+\r
+template <class T, class TImplBase, UINT t_shidiFlags = WTL_APP_SHIDIF, bool t_bModal = false>\r
+class ATL_NO_VTABLE CAppStdDialogImplBase :\r
+               public TImplBase, \r
+               public CAppDialog< T >\r
+{ \r
+public:\r
+       WTL_DLG_NOTITLE;\r
+\r
+       void StdCloseDialog(int nVal)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               if (nVal != IDCANCEL)\r
+                       pT->AppSave();\r
+               if (t_bModal == false)\r
+               {\r
+                       pT->DestroyWindow();\r
+                       ::PostQuitMessage(nVal);\r
+               }\r
+               else\r
+                       ::EndDialog(pT->m_hWnd, nVal);\r
+       }\r
+       \r
+       BEGIN_MSG_MAP(CAppStdDialogImplBase)\r
+               MESSAGE_HANDLER(WM_CLOSE, OnSystemClose)\r
+               CHAIN_MSG_MAP(TImplBase)\r
+               CHAIN_MSG_MAP(CAppDialog< T >)\r
+       END_MSG_MAP()\r
+\r
+       LRESULT OnSystemClose(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               pT->StdCloseDialog(IDCANCEL);\r
+               return 0;\r
+       }\r
+};\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CAppStdDialogImpl - Implementation of standard application dialog \r
+\r
+template <class T, UINT t_shidiFlags = WTL_APP_SHIDIF, bool t_bModal = false>\r
+class ATL_NO_VTABLE CAppStdDialogImpl :\r
+               public CAppStdDialogImplBase<T, CStdDialogImpl<T, t_shidiFlags, t_bModal>, t_shidiFlags, t_bModal>\r
+{};\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CAppStdDialogResizeImpl - implementation of orientation resizing standard application dialog\r
+\r
+template <class T, UINT t_shidiFlags = WTL_APP_SHIDIF, bool t_bModal = false>\r
+class ATL_NO_VTABLE CAppStdDialogResizeImpl :\r
+               public CAppStdDialogImplBase<T, CStdDialogResizeImpl<T, t_shidiFlags, t_bModal>, t_shidiFlags, t_bModal>\r
+{};\r
+\r
+#ifndef _ATL_NO_HOSTING\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CAppStdAxDialogImpl - Implementation of standard application AxDialog \r
+\r
+template <class T, UINT t_shidiFlags = WTL_APP_SHIDIF, bool t_bModal = false>\r
+class ATL_NO_VTABLE CAppStdAxDialogImpl :\r
+               public CAppStdDialogImplBase<T, CStdAxDialogImpl<T, t_shidiFlags, t_bModal>, t_shidiFlags, t_bModal>\r
+{};\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CAppStdAxDialogResizeImpl - implementation of orientation resizing standard application AxDialog\r
+\r
+template <class T, UINT t_shidiFlags = WTL_APP_SHIDIF, bool t_bModal = false>\r
+class ATL_NO_VTABLE CAppStdAxDialogResizeImpl :\r
+               public CAppStdDialogImplBase<T, CStdAxDialogResizeImpl<T, t_shidiFlags, t_bModal>, t_shidiFlags, t_bModal>\r
+{};\r
+#endif // _ATL_NO_HOSTING\r
+\r
+#if defined(_WTL_CE_DRA) && defined(WIN32_PLATFORM_PSPC)\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CAppStdOrientedDialogImpl - implementation of oriented PPC standard application dialog\r
+\r
+template <class T, UINT t_shidiFlags = WTL_APP_SHIDIF, bool t_bModal = false>\r
+class ATL_NO_VTABLE CAppStdOrientedDialogImpl :\r
+               public CAppStdDialogImplBase<T, CStdOrientedDialogImpl<T, t_shidiFlags, t_bModal>, t_shidiFlags, t_bModal>\r
+{};\r
+\r
+#ifndef _ATL_NO_HOSTING\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CAppStdAxOrientedDialogImpl - implementation of oriented PPC standard application AxDialog\r
+\r
+template <class T, UINT t_shidiFlags = WTL_APP_SHIDIF, bool t_bModal = false>\r
+class ATL_NO_VTABLE CAppStdAxOrientedDialogImpl :\r
+               public CAppStdDialogImplBase<T, CStdAxOrientedDialogImpl<T, t_shidiFlags, t_bModal>, t_shidiFlags, t_bModal>\r
+{};\r
+#endif // _ATL_NO_HOSTING\r
+\r
+#endif // defined(_WTL_CE_DRA) && defined(WIN32_PLATFORM_PSPC)\r
+\r
+#endif // _WTL_CE_NO_DIALOGS\r
+\r
+#endif // _WTL_CE_NO_APPWINDOW\r
+\r
+\r
+// --- Full screen support ---\r
+\r
+#ifndef _WTL_CE_NO_FULLSCREEN\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CFullScreenFrame - full screen frame implementation\r
+\r
+template <class T, bool t_bHasSip = true>\r
+class CFullScreenFrame\r
+{\r
+public:\r
+       bool m_bFullScreen;\r
+\r
+       CFullScreenFrame() : m_bFullScreen(false)\r
+       { }\r
+\r
+// Operation   \r
+       void SetFullScreen(bool bFull)\r
+       {\r
+               m_bFullScreen = bFull;\r
+               ShowTaskBar(!bFull, false);\r
+               ShowMenuBar(!bFull);\r
+       }\r
+\r
+// Manage TaskBar for modal dialogs and property sheets\r
+       template <class D>\r
+       int FSDoModal(D& dlg)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               pT;   // avoid level 4 warning\r
+               ATLASSERT(pT->IsWindow());\r
+               if (m_bFullScreen)   // Show taskbar if hidden\r
+                       ShowTaskBar(true, false);\r
+               int iRet = dlg.DoModal();\r
+               if (m_bFullScreen)   // Hide taskbar if restored\r
+                       ShowTaskBar(false);\r
+               return iRet;\r
+       }\r
+\r
+// Implementation\r
+       void ShowMenuBar(bool bShow)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(pT->IsWindow());\r
+               ATL::CWindow MenuBar = pT->m_hWndCECommandBar;\r
+               ATLASSERT(MenuBar.IsWindow());\r
+               MenuBar.ShowWindow(bShow ? SW_SHOWNORMAL : SW_HIDE);\r
+               pT->SizeToMenuBar();\r
+       }\r
+       \r
+       void ShowTaskBar(bool bShow, bool bRepaint = true)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(pT->IsWindow());\r
+               RECT rect = { 0 };\r
+               SystemParametersInfo(SPI_GETWORKAREA, NULL, &rect, FALSE);\r
+               if (!bShow)\r
+                       rect.top = 0;\r
+\r
+#ifdef WIN32_PLATFORM_PSPC // Pocket PC code\r
+               UINT uShow = t_bHasSip ? SHFS_SHOWTASKBAR | SHFS_SHOWSIPBUTTON : SHFS_SHOWTASKBAR | SHFS_HIDESIPBUTTON;         \r
+               SHFullScreen(pT->m_hWnd, bShow ? uShow : SHFS_HIDETASKBAR | SHFS_HIDESIPBUTTON);\r
+#elif _WIN32_WCE > 0x500 // Smartphone 2005 code\r
+               SHFullScreen(pT->m_hWnd, bShow ? SHFS_SHOWTASKBAR : SHFS_HIDETASKBAR);\r
+#else // Smartphone 2003\r
+               HWND hTaskBar = FindWindow(_T("tray"), NULL);\r
+               ATLASSERT(::IsWindow(hTaskBar));\r
+               ::ShowWindow(hTaskBar, bShow ? SW_SHOW : SW_HIDE);\r
+#endif // WIN32_PLATFORM_PSPC\r
+\r
+               pT->MoveWindow(&rect, bRepaint);\r
+       }\r
+\r
+// Message map and handler\r
+       BEGIN_MSG_MAP(CFullScreenFrame)\r
+               MESSAGE_HANDLER(WM_SETTINGCHANGE, OnSettingChange)\r
+               MESSAGE_HANDLER(WM_ACTIVATE, OnActivate)\r
+       END_MSG_MAP()\r
+\r
+       LRESULT OnSettingChange(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)\r
+       {\r
+#ifndef SETTINGCHANGE_RESET // not defined for PPC 2002\r
+       #define SETTINGCHANGE_RESET SPI_SETWORKAREA\r
+#endif\r
+               if (m_bFullScreen && (wParam & SETTINGCHANGE_RESET))\r
+                       SetFullScreen(m_bFullScreen);\r
+               return bHandled = FALSE;\r
+       }\r
+\r
+       LRESULT OnActivate(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)\r
+       {\r
+               if (m_bFullScreen)\r
+               {\r
+                       ShowTaskBar(!wParam);\r
+                       ShowMenuBar(!wParam);\r
+               }\r
+               return bHandled = FALSE;\r
+       }\r
+};\r
+\r
+#endif // _WTL_CE_NO_FULLSCREEN\r
+\r
+\r
+// --- WinCE zoom support ---\r
+\r
+#ifndef _WTL_CE_NO_ZOOMSCROLL\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CZoomScrollImpl - WinCE zooming implementation on top of CScrollImpl\r
+\r
+template <class T>\r
+class  CZoomScrollImpl: public CScrollImpl< T >\r
+{\r
+public:\r
+// Data members\r
+       _WTYPES_NS::CSize m_sizeTrue;\r
+       double  m_fzoom;\r
+\r
+// Creation\r
+       CZoomScrollImpl() : m_sizeTrue(0), m_fzoom(1.)\r
+       { }\r
+\r
+// Zoom operations and access\r
+       void SetZoomScrollSize(_WTYPES_NS::CSize sizeTrue, double fzoom = 1., BOOL bRedraw = TRUE)\r
+       {\r
+               ATLASSERT(fzoom > 0.);\r
+               m_sizeTrue = sizeTrue;\r
+               m_fzoom = fzoom;\r
+\r
+               CScrollImpl< T >::SetScrollSize(sizeTrue / fzoom, bRedraw);\r
+       }\r
+\r
+       void SetZoomScrollSize(int cx, int cy, double fzoom=1., BOOL bRedraw = TRUE)\r
+       {\r
+               SetZoomScrollSize(_WTYPES_NS::CSize(cx, cy), fzoom, bRedraw);\r
+       }\r
+\r
+       void SetZoom(double fzoom, BOOL bRedraw = TRUE)\r
+       {\r
+               _WTYPES_NS::CPoint ptCenter = WndtoTrue(m_sizeClient / 2);\r
+               _WTYPES_NS::CSize sizePage = GetScrollPage();\r
+               _WTYPES_NS::CSize sizeLine = GetScrollLine();\r
+\r
+               SetZoomScrollSize(GetScrollSize(), fzoom, bRedraw);\r
+\r
+               SetScrollLine(sizeLine);\r
+               SetScrollPage(sizePage);\r
+               _WTYPES_NS::CPoint ptOffset = ptCenter - (m_sizeClient / 2) * fzoom;\r
+               SetScrollOffset(ptOffset, bRedraw);\r
+       }\r
+\r
+       double GetZoom()\r
+       {\r
+               return m_fzoom;\r
+       }\r
+\r
+// CScrollImpl overrides\r
+       void SetScrollOffset(int x, int y, BOOL bRedraw = TRUE)\r
+       {\r
+               CScrollImpl< T >::SetScrollOffset((int)(x / m_fzoom), (int)(y / m_fzoom), bRedraw);\r
+       }\r
+\r
+       void SetScrollOffset(POINT ptOffset, BOOL bRedraw = TRUE)\r
+       {\r
+               SetScrollOffset(ptOffset.x, ptOffset.y, bRedraw);\r
+       }\r
+\r
+       void GetScrollOffset(POINT& ptOffset)\r
+       {\r
+               ptOffset.x = (LONG)(m_ptOffset.x * m_fzoom);\r
+               ptOffset.y = (LONG)(m_ptOffset.y * m_fzoom);\r
+       }\r
+\r
+       void SetScrollSize(int cx, int cy, BOOL bRedraw = TRUE)\r
+       {\r
+               SetZoomScrollSize(cx, cy, GetZoom(), bRedraw);\r
+       }\r
+\r
+       void SetScrollSize(SIZE sizeTrue, BOOL bRedraw = TRUE)\r
+       {\r
+               SetZoomScrollSize(sizeTrue, GetZoom(), bRedraw);\r
+       }\r
+\r
+       void GetScrollSize(SIZE& sizeTrue) const\r
+       {\r
+               sizeTrue = m_sizeTrue;\r
+       }\r
+\r
+       void SetScrollPage(int cxPage, int cyPage)\r
+       {\r
+               SetScrollPage(_WTYPES_NS::CSize(cxPage, cyPage));\r
+       }\r
+\r
+       void SetScrollPage(SIZE sizePage)\r
+       {\r
+               CScrollImpl< T >::SetScrollPage(sizePage / m_fzoom);\r
+       }\r
+\r
+       void GetScrollPage(SIZE& sizePage) const\r
+       {\r
+               sizePage = m_sizePage * m_fzoom;\r
+       }\r
+\r
+       void SetScrollLine(int cxLine, int cyLine)\r
+       {\r
+               SetScrollLine(_WTYPES_NS::CSize(cxLine, cyLine));\r
+       }\r
+\r
+       void SetScrollLine(SIZE sizeLine)\r
+       {\r
+               CScrollImpl< T >::SetScrollLine(sizeLine / m_fzoom);\r
+       }\r
+\r
+       void GetScrollLine(SIZE& sizeLine) const\r
+       {\r
+               sizeLine = m_sizeLine * m_fzoom;\r
+       }\r
+\r
+// Data access complements\r
+       _WTYPES_NS::CSize GetScrollSize()\r
+       {\r
+               return m_sizeTrue;\r
+       }\r
+\r
+       _WTYPES_NS::CSize GetScrollPage()\r
+       {\r
+               return m_sizePage * m_fzoom;\r
+       }\r
+\r
+       _WTYPES_NS::CSize GetScrollLine()\r
+       {\r
+               return m_sizeLine * m_fzoom;\r
+       }\r
+\r
+       _WTYPES_NS::CPoint GetScrollOffset()\r
+       {\r
+               return (_WTYPES_NS::CSize)m_ptOffset * m_fzoom;\r
+       }\r
+\r
+// Helper coordinate functions\r
+       _WTYPES_NS::CPoint WndtoTrue(CPoint ptW)\r
+       {\r
+               return (_WTYPES_NS::CSize)ptW * GetZoom() + GetScrollOffset();\r
+       }\r
+\r
+       void WndtoTrue(LPPOINT aptW, int nPts)   // in place coord transformation\r
+       {\r
+               for (int i = 0 ; i < nPts ; i++)\r
+                       aptW[i] = WndtoTrue(aptW[i]);\r
+       }\r
+\r
+       void WndtoTrue(LPRECT prectW)   // in place coord transformation\r
+       {\r
+               WndtoTrue((LPPOINT)prectW, 2);\r
+       }\r
+\r
+       _WTYPES_NS::CPoint TruetoWnd(CPoint ptT)\r
+       {\r
+               return (ptT - GetScrollOffset()) / GetZoom();\r
+       }\r
+\r
+       void TruetoWnd(LPPOINT aptT, int nPts)   // in place coord transformation\r
+       {\r
+               for (int i = 0 ; i < nPts ; i++)\r
+                       aptT[i] = TruetoWnd(aptT[i]);\r
+       }\r
+\r
+       void TruetoWnd(LPRECT prectT)   // in place coord transformation\r
+       {\r
+               TruetoWnd((LPPOINT)prectT, 2);\r
+       }\r
+\r
+// Drawing operations : assume adequate setting of data members\r
+       BOOL Draw(HBITMAP hbm, HDC hdestDC, DWORD dwROP = SRCCOPY)\r
+       {\r
+               CDC memDC = CreateCompatibleDC(hdestDC);\r
+               CBitmapHandle bmpOld = memDC.SelectBitmap(hbm);\r
+               BOOL bRes = Draw(memDC, hdestDC, dwROP);\r
+               memDC.SelectBitmap(bmpOld);\r
+               return bRes;\r
+       }\r
+\r
+       BOOL Draw(HDC hsourceDC, HDC hdestDC, DWORD dwROP = SRCCOPY)\r
+       {\r
+               CDCHandle destDC = hdestDC;\r
+               destDC.SetViewportOrg(0,0);\r
+               _WTYPES_NS::CPoint ptOffset = GetScrollOffset();\r
+               _WTYPES_NS::CSize sizeZClient = m_sizeClient * GetZoom();\r
+               return destDC.StretchBlt(0, 0, m_sizeClient.cx, m_sizeClient.cy, hsourceDC, ptOffset.x, ptOffset.y, sizeZClient.cx, sizeZClient.cy, dwROP);\r
+       }\r
+\r
+#ifdef _IMAGING_H\r
+       BOOL Draw(IImage* pIImage, HDC hdestDC)\r
+       {\r
+               CDCHandle destDC = hdestDC;\r
+               destDC.SetViewportOrg(0,0);\r
+               return SUCCEEDED(pIImage->Draw(destDC, _WTYPES_NS::CRect(-_WTYPES_NS::CPoint(m_ptOffset), m_sizeAll), NULL));\r
+       }\r
+#endif\r
+\r
+// Message map and handlers\r
+       BEGIN_MSG_MAP(CZoomScrollImpl< T >)\r
+               MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBkgnd)\r
+               CHAIN_MSG_MAP(CScrollImpl< T >)\r
+       END_MSG_MAP()\r
+       \r
+       LRESULT OnEraseBkgnd(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)\r
+       {\r
+               T* pT = static_cast<T*>(this);\r
+               ATLASSERT(::IsWindow(pT->m_hWnd));\r
+               if ((GetScrollExtendedStyle() & SCRL_ERASEBACKGROUND))\r
+               {\r
+                       _WTYPES_NS::CRect rect;\r
+                       pT->GetClientRect(rect);\r
+                       _WTYPES_NS::CSize sizeClient=rect.Size();\r
+\r
+                       if (m_sizeAll.cx < sizeClient.cx || m_sizeAll.cy < sizeClient.cy)\r
+                       {\r
+                               CDCHandle hdc = (HDC)wParam;\r
+                               HBRUSH hbr = GetSysColorBrush((int)T::GetWndClassInfo().m_wc.hbrBackground - 1);\r
+\r
+                               if (m_sizeAll.cx < sizeClient.cx)\r
+                               {\r
+                                       _WTYPES_NS::CRect rectBG(_WTYPES_NS::CPoint(m_sizeAll.cx, 0), sizeClient);\r
+                                       hdc.FillRect(rectBG, hbr);\r
+                               }\r
+\r
+                               if (m_sizeAll.cy < sizeClient.cy)\r
+                               {\r
+                                       _WTYPES_NS::CRect rectBG(_WTYPES_NS::CPoint(0, m_sizeAll.cy), sizeClient);\r
+                                       hdc.FillRect(rectBG, hbr);\r
+                               }\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       bHandled = FALSE;\r
+               }\r
+\r
+               return 1;\r
+       }\r
+};\r
+\r
+#endif // _WTL_CE_NO_ZOOMSCROLL\r
+\r
+#ifndef _WTL_CE_NO_CONTROLS\r
+\r
+// --- PPC bottom TabView control ---\r
+\r
+#if defined(__ATLCTRLX_H__) && defined(WIN32_PLATFORM_PSPC)\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CBottomTabViewImpl\r
+\r
+template <class T, class TBase = ATL::CWindow, class TWinTraits = ATL::CControlWinTraits>\r
+class ATL_NO_VTABLE CBottomTabViewImpl : public CTabViewImpl<T, TBase, TWinTraits>\r
+{\r
+public:\r
+       DECLARE_WND_CLASS_EX(NULL, 0, COLOR_APPWORKSPACE)\r
+\r
+// Implementation overrideables\r
+       bool CreateTabControl()\r
+       {\r
+               m_tab.Create(m_hWnd, rcDefault, NULL, WS_CHILD | TCS_BOTTOM, 0, m_nTabID);\r
+\r
+               ATLASSERT(m_tab.m_hWnd != NULL);\r
+               if(m_tab.m_hWnd == NULL)\r
+                       return false;\r
+\r
+               m_tab.SendMessage(CCM_SETVERSION, COMCTL32_VERSION);\r
+               m_tab.SetItemExtra(sizeof(TABVIEWPAGE));\r
+\r
+               T* pT = static_cast<T*>(this);\r
+               m_cyTabHeight = pT->CalcTabHeight();\r
+\r
+               return true;\r
+       }\r
+\r
+       int CalcTabHeight()\r
+       {\r
+               int nCount = m_tab.GetItemCount();\r
+               TCITEMEXTRA tcix = { 0 };\r
+               tcix.tciheader.mask = TCIF_TEXT;\r
+               tcix.tciheader.pszText = _T("NS");\r
+               int nIndex = m_tab.InsertItem(nCount, tcix);\r
+\r
+               RECT rect = { 0 };\r
+               SystemParametersInfo(SPI_GETWORKAREA, 0, &rect, 0);\r
+               RECT rcWnd = rect;\r
+\r
+               m_tab.AdjustRect(FALSE, &rect);\r
+               rcWnd.top = rect.bottom;\r
+               ::AdjustWindowRectEx(&rcWnd, m_tab.GetStyle(), FALSE, m_tab.GetExStyle());\r
+               m_tab.DeleteItem(nIndex);\r
+\r
+               return rcWnd.bottom - rcWnd.top;\r
+       }\r
+\r
+       void UpdateLayout()\r
+       {\r
+               RECT rect;\r
+               GetClientRect(&rect);\r
+\r
+               if(m_tab.IsWindow() && ((m_tab.GetStyle() & WS_VISIBLE) != 0))\r
+                       m_tab.SetWindowPos(NULL, 0, rect.bottom - m_cyTabHeight, rect.right - rect.left, m_cyTabHeight, SWP_NOZORDER /*| SWP_SHOWWINDOW*/);\r
+\r
+               if(m_nActivePage != -1)\r
+                               ::SetWindowPos(GetPageHWND(m_nActivePage), NULL, 0, 0, rect.right - rect.left, rect.bottom - m_cyTabHeight, SWP_NOZORDER);\r
+       }\r
+\r
+};\r
+\r
+class CBottomTabView : public CBottomTabViewImpl<CBottomTabView>\r
+{\r
+public:\r
+       DECLARE_WND_CLASS_EX(_T("WTL_BottomTabView"), 0, COLOR_APPWORKSPACE)\r
+};\r
+\r
+#endif // defined(__ATLCTRLX_H__) && defined(WIN32_PLATFORM_PSPC)\r
+\r
+\r
+// --- PPC/SmartPhone controls ---\r
+\r
+////////////////////////////////////////////////////////////////////////////////\r
+// These are wrapper classes for the Pocket PC 2002/2003 and SmartPhone 2003 controls\r
+// To implement a window based on a control, use following:\r
+// Example: Implementing a window based on a Html control\r
+//\r
+// class CMyHtml : CWindowImpl<CMyHtml, CHtmlCtrl>\r
+// {\r
+// public:\r
+//      BEGIN_MSG_MAP(CMyHtml)\r
+//          // put your message handler entries here\r
+//      END_MSG_MAP()\r
+// };\r
+///////////////////////////////////////////////////////////////////////////////\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CHtmlCtrl\r
+\r
+template <class TBase>\r
+class CHtmlCtrlT : public TBase\r
+{\r
+public:\r
+// Constructors\r
+       CHtmlCtrlT(HWND hWnd = NULL) : TBase(hWnd)\r
+       { }\r
+\r
+       CHtmlCtrlT< TBase >& operator =(HWND hWnd)\r
+       {\r
+               m_hWnd = hWnd;\r
+               return *this;\r
+       }\r
+\r
+       HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,\r
+                       DWORD dwStyle = 0, DWORD dwExStyle = 0,\r
+                       ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)\r
+       {\r
+               HWND hWnd = TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);\r
+               ATLASSERT(hWnd != NULL);   // Did you remember to call InitHTMLControl(hInstance) ??\r
+               return hWnd;\r
+       }\r
+\r
+// Attributes\r
+       static LPCTSTR GetWndClassName()\r
+       {\r
+               return WC_HTML;\r
+       }\r
+\r
+#if (_WIN32_WCE >= 400)\r
+       void AddStyle(LPCWSTR pszStyle)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, DTM_ADDSTYLE, 0, (LPARAM)pszStyle);\r
+       }\r
+#endif // (_WIN32_WCE >= 400)\r
+\r
+       void AddText(BOOL bPlainText, LPCSTR pszText)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, DTM_ADDTEXT, (WPARAM)bPlainText, (LPARAM)pszText);\r
+       }\r
+\r
+       void AddHTML(LPCSTR pszHTML)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, DTM_ADDTEXT, (WPARAM)FALSE, (LPARAM)pszHTML);\r
+       }\r
+\r
+       void AddText(BOOL bPlainText, LPCWSTR pszText)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, DTM_ADDTEXTW, (WPARAM)bPlainText, (LPARAM)pszText);\r
+       }\r
+\r
+       void AddHTML(LPCWSTR pszHTML)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, DTM_ADDTEXTW, (WPARAM)FALSE, (LPARAM)pszHTML);\r
+       }\r
+\r
+       void Anchor(LPCSTR pszAnchor)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, DTM_ANCHOR, 0, (LPARAM)pszAnchor);\r
+       }\r
+\r
+       void Anchor(LPCWSTR pszAnchor)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, DTM_ANCHORW, 0, (LPARAM)pszAnchor);\r
+       }\r
+\r
+#if (_WIN32_WCE >= 420)\r
+       void GetBrowserDispatch(IDispatch** ppDispatch)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(ppDispatch);\r
+               ATLASSERT(*ppDispatch==NULL);\r
+               ::SendMessage(m_hWnd, DTM_BROWSERDISPATCH, 0, (LPARAM)ppDispatch);\r
+       }\r
+       void GetDocumentDispatch(IDispatch** ppDispatch)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(ppDispatch);\r
+               ATLASSERT(*ppDispatch==NULL);\r
+               ::SendMessage(m_hWnd, DTM_DOCUMENTDISPATCH , 0, (LPARAM)ppDispatch);\r
+       }\r
+#endif // (_WIN32_WCE >= 420)\r
+\r
+       void Clear()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, DTM_CLEAR, 0, 0L);\r
+       }\r
+\r
+       void EnableClearType(BOOL bEnable = TRUE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, DTM_ENABLECLEARTYPE, 0, (LPARAM)bEnable);\r
+       }\r
+\r
+       void EnableContextMenu(BOOL bEnable = TRUE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, DTM_ENABLECONTEXTMENU, 0, (LPARAM)bEnable);\r
+       }\r
+\r
+       void EnableScripting(BOOL bEnable = TRUE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, DTM_ENABLESCRIPTING, 0, (LPARAM)bEnable);\r
+       }\r
+\r
+       void EnableShrink(BOOL bEnable = TRUE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, DTM_ENABLESHRINK, 0, (LPARAM)bEnable);\r
+       }\r
+\r
+       void EndOfSource()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, DTM_ENDOFSOURCE, 0, 0L);\r
+       }\r
+\r
+       void ImageFail(DWORD dwCookie)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, DTM_IMAGEFAIL, 0, (LPARAM)dwCookie);\r
+       }\r
+\r
+       int GetLayoutHeight() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, DTM_LAYOUTHEIGHT, 0, 0L);\r
+       }\r
+\r
+       int GetLayoutWidth() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, DTM_LAYOUTWIDTH, 0, 0L);\r
+       }\r
+\r
+       void Navigate(LPCTSTR pstrURL, UINT uFlags = 0)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(pstrURL);\r
+               ::SendMessage(m_hWnd, DTM_NAVIGATE, (WPARAM)uFlags, (LPARAM)pstrURL);\r
+       }\r
+\r
+       void SelectAll()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, DTM_SELECTALL, 0, 0L);\r
+       }\r
+\r
+       void SetImage(INLINEIMAGEINFO* pImageInfo)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(pImageInfo);\r
+               ::SendMessage(m_hWnd, DTM_SETIMAGE, 0, (LPARAM)pImageInfo);\r
+       }\r
+\r
+       void ZoomLevel(int iLevel)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, DTM_ZOOMLEVEL, 0, (LPARAM)iLevel);\r
+       }\r
+\r
+#if (_WIN32_WCE >= 400)\r
+       void Stop()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, DTM_STOP, 0, 0L);\r
+       }\r
+#endif // (_WIN32_WCE >= 400)\r
+\r
+       void GetScriptDispatch(IDispatch** ppDispatch)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(ppDispatch);\r
+               ATLASSERT(*ppDispatch==NULL);\r
+               ::SendMessage(m_hWnd, DTM_SCRIPTDISPATCH, 0, (LPARAM)ppDispatch);\r
+       }\r
+};\r
+\r
+typedef CHtmlCtrlT<ATL::CWindow> CHtmlCtrl;\r
+\r
+\r
+#ifdef WIN32_PLATFORM_PSPC\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CRichInkCtrl\r
+\r
+template <class TBase>\r
+class CRichInkCtrlT : public TBase\r
+{\r
+public:\r
+// Constructors\r
+       CRichInkCtrlT(HWND hWnd = NULL) : TBase(hWnd)\r
+       { }\r
+\r
+       CRichInkCtrlT< TBase >& operator =(HWND hWnd)\r
+       {\r
+               m_hWnd = hWnd;\r
+               return *this;\r
+       }\r
+\r
+       HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,\r
+                       DWORD dwStyle = 0, DWORD dwExStyle = 0,\r
+                       ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)\r
+       {\r
+               HWND hWnd = TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);\r
+               ATLASSERT(hWnd != NULL);   // Did you remember to call InitRichInkDLL() ??\r
+               return hWnd;\r
+       }\r
+\r
+// Attributes\r
+       static LPCTSTR GetWndClassName()\r
+       {\r
+               return WC_RICHINK;\r
+       }\r
+\r
+       BOOL CanPaste(UINT uFormat = 0) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, EM_CANPASTE, (WPARAM)uFormat, 0L);\r
+       }\r
+\r
+       BOOL CanRedo() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, EM_CANREDO, 0, 0L);\r
+       }\r
+\r
+       BOOL CanUndo() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, EM_CANUNDO, 0, 0L);\r
+       }\r
+\r
+       void ClearAll(BOOL bRepaint = TRUE) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, EM_CLEARALL, (WPARAM)bRepaint, 0L);\r
+       }\r
+\r
+       BOOL GetModify() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, EM_GETMODIFY, 0, 0L);\r
+       }\r
+\r
+       UINT GetPageStyle() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (UINT)::SendMessage(m_hWnd, EM_GETPAGESTYLE, 0, 0L);\r
+       }\r
+\r
+       UINT GetPenMode() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (UINT)::SendMessage(m_hWnd, EM_GETPENMODE, 0, 0L);\r
+       }\r
+\r
+       UINT GetViewStyle() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (UINT)::SendMessage(m_hWnd, EM_GETVIEW, 0, 0L);\r
+       }\r
+\r
+       UINT GetWrapMode() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (UINT)::SendMessage(m_hWnd, EM_GETWRAPMODE, 0, 0L);\r
+       }\r
+\r
+       UINT GetZoomPercent() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (UINT)::SendMessage(m_hWnd, EM_GETZOOMPERCENT, 0, 0L);\r
+       }\r
+\r
+       void InsertLinks(LPWSTR lpString, int cchLength = -1)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               if(cchLength == -1)\r
+                       cchLength = lstrlen(lpString);\r
+               ::SendMessage(m_hWnd, EM_INSERTLINKS, (WPARAM)cchLength, (LPARAM)lpString);\r
+       }\r
+\r
+       void RedoEvent()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, EM_REDOEVENT, 0, 0L);\r
+       }\r
+\r
+       UINT SetInkLayer(UINT uLayer)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (UINT)::SendMessage(m_hWnd, EM_SETINKLAYER, (WPARAM)uLayer, 0L);\r
+       }\r
+\r
+       void SetPageStyle(UINT uStyle)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, EM_SETPAGESTYLE, (WPARAM)uStyle, 0L);\r
+       }\r
+\r
+       void SetPenMode(UINT uMode)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, EM_SETPENMODE, (WPARAM)uMode, 0L);\r
+       }\r
+\r
+       void SetViewStyle(UINT uStyle)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, EM_SETVIEW, (WPARAM)uStyle, 0L);\r
+       }\r
+\r
+       void SetViewAttributes(VIEWATTRIBUTES* pAttribs)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(pAttribs);\r
+               ::SendMessage(m_hWnd, EM_SETVIEWATTRIBUTES, 0, (LPARAM)pAttribs);\r
+       }\r
+\r
+       void SetWrapMode(UINT uMode)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, EM_SETWRAPMODE, (WPARAM)uMode, 0L);\r
+       }\r
+\r
+       void SetZoomPercent(UINT uPercent)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, EM_SETZOOMPERCENT, (WPARAM)uPercent, 0L);\r
+       }\r
+\r
+       LONG StreamIn(UINT uFormat, EDITSTREAM& es)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (LONG)::SendMessage(m_hWnd, EM_STREAMIN, (WPARAM)uFormat, (LPARAM)&es);\r
+       }\r
+\r
+       LONG StreamOut(UINT uFormat, EDITSTREAM& es)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (LONG)::SendMessage(m_hWnd, EM_STREAMOUT, (WPARAM)uFormat, (LPARAM)&es);\r
+       }\r
+\r
+       void UndoEvent()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, EM_UNDOEVENT, 0, 0L);\r
+       }\r
+\r
+// Standard EM_xxx messages\r
+       DWORD GetSel() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (DWORD)::SendMessage(m_hWnd, EM_GETSEL, 0, 0L);\r
+       }\r
+\r
+       void GetSel(int& nStartChar, int& nEndChar) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, EM_GETSEL, (WPARAM)&nStartChar, (LPARAM)&nEndChar);\r
+       }\r
+\r
+       void ReplaceSel(LPCTSTR lpszNewText, BOOL bCanUndo = FALSE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, EM_REPLACESEL, (WPARAM)bCanUndo, (LPARAM)lpszNewText);\r
+       }\r
+\r
+       void SetModify(BOOL bModified = TRUE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, EM_SETMODIFY, (WPARAM)bModified, 0L);\r
+       }\r
+\r
+       int GetTextLength() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, WM_GETTEXTLENGTH, 0, 0L);\r
+       }\r
+\r
+// Clipboard operations\r
+       void Clear()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, WM_CLEAR, 0, 0L);\r
+       }\r
+\r
+       void Copy()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, WM_COPY, 0, 0L);\r
+       }\r
+\r
+       void Cut()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, WM_CUT, 0, 0L);\r
+       }\r
+\r
+       void Paste()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, WM_PASTE, 0, 0L);\r
+       }\r
+};\r
+\r
+typedef CRichInkCtrlT<ATL::CWindow> CRichInkCtrl;\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CInkXCtrl\r
+\r
+template <class TBase>\r
+class CInkXCtrlT : public TBase\r
+{\r
+public:\r
+// Constructors\r
+       CInkXCtrlT(HWND hWnd = NULL) : TBase(hWnd)\r
+       { }\r
+\r
+       CInkXCtrlT< TBase >& operator =(HWND hWnd)\r
+       {\r
+               m_hWnd = hWnd;\r
+               return *this;\r
+       }\r
+\r
+       HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,\r
+                       DWORD dwStyle = 0, DWORD dwExStyle = 0,\r
+                       ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)\r
+       {\r
+               HWND hWnd = TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);\r
+               ATLASSERT(hWnd != NULL);   // Did you remember to call InitInkX() ??\r
+               return hWnd;\r
+       }\r
+\r
+// Attributes\r
+       static LPCTSTR GetWndClassName()\r
+       {\r
+               return WC_INKX;\r
+       }\r
+\r
+       static UINT GetHotRecordingMessage()\r
+       {\r
+               return ::RegisterWindowMessage(szHotRecording);\r
+       }\r
+\r
+       void ClearAll()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, IM_CLEARALL, 0, 0L);\r
+       }\r
+\r
+       int GetData(BYTE* lpBuffer, INT cbBuffer) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(lpBuffer);\r
+               return (int)::SendMessage(m_hWnd, IM_GETDATA, (WPARAM)cbBuffer, (LPARAM)lpBuffer);\r
+       }\r
+\r
+       int GetDataLen() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, IM_GETDATALEN, 0, 0L);\r
+       }\r
+\r
+       CRichInkCtrl GetRichInk() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (HWND)::SendMessage(m_hWnd, IM_GETRICHINK, 0, 0L);\r
+       }\r
+\r
+       BOOL IsRecording() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, IM_RECORDING, 0, 0L);\r
+       }\r
+\r
+       void ReInit()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, IM_REINIT, 0, 0L);\r
+       }\r
+\r
+       void SetData(const BYTE* lpInkData, INT cbInkData)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(lpInkData);\r
+               ::SendMessage(m_hWnd, IM_SETDATA, (WPARAM)cbInkData, (LPARAM)lpInkData);\r
+       }\r
+\r
+       void VoicePlay()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, IM_VOICE_PLAY, 0, 0L);\r
+       }\r
+\r
+       BOOL IsVoicePlaying() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, IM_VOICE_PLAYING, 0, 0L);\r
+       }\r
+\r
+       BOOL VoiceRecord()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, IM_VOICE_RECORD, 0, 0L);\r
+       }\r
+\r
+       void VoiceStop()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, IM_VOICE_STOP, 0, 0L);\r
+       }\r
+\r
+       void ShowVoiceBar(BOOL bShow = TRUE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, IM_VOICEBAR, (WPARAM)bShow, 0L);\r
+       }\r
+};\r
+\r
+typedef CInkXCtrlT<ATL::CWindow> CInkXCtrl;\r
+\r
+#endif // WIN32_PLATFORM_PSPC\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CVoiceRecorderCtrl\r
+\r
+template <class TBase>\r
+class CVoiceRecorderCtrlT : public TBase\r
+{\r
+public:\r
+// Constructors\r
+       CVoiceRecorderCtrlT(HWND hWnd = NULL) : TBase(hWnd)\r
+       { }\r
+\r
+       CVoiceRecorderCtrlT< TBase >& operator =(HWND hWnd)\r
+       {\r
+               m_hWnd = hWnd;\r
+               return *this;\r
+       }\r
+\r
+       HWND Create(HWND hWndParent, const POINT pt, LPTSTR pstrFileName, UINT nID, DWORD dwStyle = 0)\r
+       {\r
+               ATLASSERT(pstrFileName != NULL);\r
+               CM_VOICE_RECORDER cmvr = { 0 };\r
+               cmvr.cb = sizeof(CM_VOICE_RECORDER);\r
+               cmvr.dwStyle = dwStyle;\r
+               cmvr.xPos = pt.x;\r
+               cmvr.yPos = pt.y;\r
+               cmvr.hwndParent = hWndParent;\r
+               cmvr.id = nID;\r
+               cmvr.lpszRecordFileName = pstrFileName;\r
+               m_hWnd = VoiceRecorder_Create(&cmvr);\r
+               return m_hWnd;\r
+       }\r
+\r
+       HWND Create(LPCM_VOICE_RECORDER pAttribs)\r
+       {\r
+               ATLASSERT(pAttribs);\r
+               m_hWnd = VoiceRecorder_Create(pAttribs);\r
+               return m_hWnd;\r
+       }\r
+\r
+// Attributes\r
+       void Record()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, VRM_RECORD, 0, 0L);\r
+       }\r
+\r
+       void Play()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, VRM_PLAY, 0, 0L);\r
+       }\r
+\r
+       void Stop()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, VRM_STOP, 0, 0L);\r
+       }\r
+\r
+       void Cancel()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, VRM_CANCEL, 0, 0L);\r
+       }\r
+\r
+       void Done()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, VRM_OK, 0, 0L);\r
+       }\r
+};\r
+\r
+typedef CVoiceRecorderCtrlT<ATL::CWindow> CVoiceRecorderCtrl;\r
+\r
+\r
+#ifdef WIN32_PLATFORM_PSPC\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CDocListCtrl\r
+\r
+template <class TBase>\r
+class CDocListCtrlT : public TBase\r
+{\r
+public:\r
+// Attributes\r
+       DOCLISTCREATE m_dlc;\r
+       TCHAR m_szPath[MAX_PATH];\r
+\r
+// Constructors\r
+       CDocListCtrlT(HWND hWnd = NULL) : TBase(hWnd)\r
+       { }\r
+\r
+       CDocListCtrlT< TBase >& operator =(HWND hWnd)\r
+       {\r
+               m_hWnd = hWnd;\r
+               return *this;\r
+       }\r
+\r
+       HWND Create(HWND hWndParent, WORD wId, LPCTSTR pszFolder = NULL, LPCTSTR pstrFilter = NULL,\r
+                       WORD wFilterIndex = 0, DWORD dwFlags = DLF_SHOWEXTENSION)\r
+       {\r
+               ATLASSERT(pstrFilter != NULL);   // It seems to need a filter badly!!\r
+               ::ZeroMemory(&m_dlc, sizeof(DOCLISTCREATE));\r
+               ::ZeroMemory(m_szPath, sizeof(m_szPath));\r
+               if(pszFolder != NULL)\r
+                       ::lstrcpyn(m_szPath, pszFolder, MAX_PATH - 1);\r
+               m_dlc.dwStructSize = sizeof(DOCLISTCREATE);\r
+               m_dlc.hwndParent = hWndParent;\r
+               m_dlc.pszFolder = m_szPath;\r
+               m_dlc.pstrFilter = pstrFilter;\r
+               m_dlc.wFilterIndex = wFilterIndex;\r
+               m_dlc.wId = wId;\r
+               m_dlc.dwFlags = dwFlags;\r
+               m_hWnd = DocList_Create(&m_dlc);\r
+               return m_hWnd;\r
+       }\r
+\r
+       HWND Create(DOCLISTCREATE* pDlc)\r
+       {\r
+               m_dlc = *pDlc;\r
+               m_hWnd = DocList_Create(&m_dlc);\r
+               return m_hWnd;\r
+       }\r
+\r
+// Attributes\r
+       void DeleteSel()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, DLM_DELETESEL, 0, 0L);\r
+       }\r
+\r
+       void DisableUpdates()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, DLM_DISABLEUPDATES, 0, 0L);\r
+       }\r
+\r
+       void EnableUpdates()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, DLM_ENABLEUPDATES, 0, 0L);\r
+       }\r
+\r
+       int GetFilterIndex() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, DLM_GETFILTERINDEX, 0, 0L);\r
+       }\r
+\r
+       int GetItemCount() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, DLM_GETITEMCOUNT, 0, 0L);\r
+       }\r
+\r
+       int GetNextItem(int iIndex, DWORD dwRelation = LVNI_ALL) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, DLM_GETNEXTITEM, (WPARAM)iIndex, (LPARAM)dwRelation);\r
+       }\r
+\r
+       int GetFirstItem(DWORD dwRelation = LVNI_ALL) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, DLM_GETNEXTITEM, (WPARAM)-1, (LPARAM)dwRelation);\r
+       }\r
+\r
+       BOOL GetNextWave(int* pIndex) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(pIndex);\r
+               return (BOOL)::SendMessage(m_hWnd, DLM_GETNEXTWAVE, 0, (LPARAM)pIndex);\r
+       }\r
+\r
+       BOOL GetPrevWave(int* pIndex) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(pIndex);\r
+               return (BOOL)::SendMessage(m_hWnd, DLM_GETPREVWAVE, 0, (LPARAM)pIndex);\r
+       }\r
+\r
+       int GetSelCount() const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, DLM_GETSELCOUNT, 0, 0L);\r
+       }\r
+\r
+       BOOL GetSelPathName(LPTSTR pstrPath, int cchMax) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(pstrPath);\r
+               return (BOOL)::SendMessage(m_hWnd, DLM_GETSELPATHNAME, (WPARAM)cchMax, (LPARAM)pstrPath);\r
+       }\r
+\r
+       void ReceiveIR(LPCTSTR pstrPath) const\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(pstrPath);\r
+               ::SendMessage(m_hWnd, DLM_RECEIVEIR, 0, (LPARAM)pstrPath);\r
+       }\r
+\r
+       void Refresh()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, DLM_REFRESH, 0, 0L);\r
+       }\r
+\r
+       BOOL RenameMoveSelectedItems()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, DLM_RENAMEMOVE, 0, 0L);\r
+       }\r
+\r
+       int SelectAll()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (int)::SendMessage(m_hWnd, DLM_SELECTALL, 0, 0L);\r
+       }\r
+\r
+       HRESULT SelectItem(LPCTSTR pstrPath, BOOL bVisible = TRUE)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(pstrPath);\r
+               return (HRESULT)::SendMessage(m_hWnd, DLM_SELECTITEM, (WPARAM)bVisible, (LPARAM)pstrPath);\r
+       }\r
+\r
+       void SendEMail(LPCTSTR pstrAttachment)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, DLM_SENDEMAIL, 0, (LPARAM)pstrAttachment);\r
+       }\r
+\r
+       void SendIR(LPCTSTR pstrPath)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, DLM_SENDIR, 0, (LPARAM)pstrPath);\r
+       }\r
+\r
+       HRESULT SetFilterIndex(int iIndex)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (HRESULT)::SendMessage(m_hWnd, DLM_SETFILTERINDEX, (WPARAM)iIndex, 0L);\r
+       }\r
+\r
+       void SetFolder(LPCTSTR pstrPath)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(pstrPath);\r
+               ::SendMessage(m_hWnd, DLM_SETFOLDER, 0, (LPARAM)pstrPath);\r
+       }\r
+\r
+       BOOL SetItemState(int iIndex, const LVITEM* pItem)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(pItem);\r
+               return (BOOL)::SendMessage(m_hWnd, DLM_SETITEMSTATE, (WPARAM)iIndex, (LPARAM)pItem);\r
+       }\r
+\r
+       BOOL SetItemState(int iIndex, UINT uState, UINT uMask)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               LV_ITEM lvi = { 0 };\r
+               lvi.stateMask = uMask;\r
+               lvi.state = uState;\r
+               return (BOOL)::SendMessage(m_hWnd, DLM_SETITEMSTATE, (WPARAM)iIndex, (LPARAM)&lvi);\r
+       }\r
+\r
+       void SetOneItem(int iIndex, LPCVOID pPA)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, DLM_SETONEITEM, (WPARAM)iIndex, (LPARAM)pPA);\r
+       }\r
+\r
+       void SetSelect(int iIndex)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ::SendMessage(m_hWnd, DLM_SETSELECT, (WPARAM)iIndex, 0L);\r
+       }\r
+\r
+       void SetSelPathName(LPCTSTR pstrPath)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(pstrPath);\r
+               ::SendMessage(m_hWnd, DLM_SETSELPATHNAME, 0, (LPARAM)pstrPath);\r
+       }\r
+\r
+       BOOL SetSortOrder()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, DLM_SETSORTORDER, 0, 0L);\r
+       }\r
+\r
+       HRESULT Update()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (HRESULT)::SendMessage(m_hWnd, DLM_UPDATE, 0, 0L);\r
+       }\r
+\r
+       BOOL ValidateFolder()\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return (BOOL)::SendMessage(m_hWnd, DLM_VALIDATEFOLDER, 0, 0L);\r
+       }\r
+\r
+// Functions\r
+       BOOL GetFirstSelectedWaveFile(int* pIndex, LPTSTR szPath, const size_t cchPath)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return DocList_GetFirstSelectedWaveFile(m_hWnd, pIndex, szPath, cchPath);\r
+       }\r
+\r
+       BOOL GetNextSelectedWaveFile(int* pIndex, LPTSTR szPath, const size_t cchPath)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               return DocList_GetNextSelectedWaveFile(m_hWnd, pIndex, szPath, cchPath);\r
+       }\r
+};\r
+\r
+typedef CDocListCtrlT<ATL::CWindow> CDocListCtrl;\r
+\r
+#endif // WIN32_PLATFORM_PSPC\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CCapEdit\r
+\r
+template <class TBase>\r
+class CCapEditT : public TBase\r
+{\r
+public:\r
+// Constructors\r
+       CCapEditT(HWND hWnd = NULL) : TBase(hWnd)\r
+       { }\r
+\r
+       CCapEditT< TBase >& operator =(HWND hWnd)\r
+       {\r
+               m_hWnd = hWnd;\r
+               return *this;\r
+       }\r
+\r
+       HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,\r
+                       DWORD dwStyle = 0, DWORD dwExStyle = 0,\r
+                       ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)\r
+       {\r
+               HWND hWnd = /*TBase*/CWindow::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);\r
+               ATLASSERT(hWnd != NULL);   // Did you remember to call SHInitExtraControls() ??\r
+               return hWnd;\r
+       }\r
+\r
+// Attributes\r
+       static LPCTSTR GetWndClassName()\r
+       {\r
+               return WC_CAPEDIT;\r
+       }\r
+};\r
+\r
+typedef CCapEditT<WTL::CEdit> CCapEdit;\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CTTStatic\r
+\r
+#ifndef WIN32_PLATFORM_WFSP // Tooltips not supported on SmartPhone\r
+\r
+template <class TBase>\r
+class CTTStaticT : public TBase\r
+{\r
+public:\r
+// Constructors\r
+       CTTStaticT(HWND hWnd = NULL) : TBase(hWnd)\r
+       { }\r
+\r
+       CTTStaticT< TBase >& operator =(HWND hWnd)\r
+       {\r
+               m_hWnd = hWnd;\r
+               return *this;\r
+       }\r
+\r
+       HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,\r
+                       DWORD dwStyle = 0, DWORD dwExStyle = 0,\r
+                       ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)\r
+       {\r
+               HWND hWnd = TBase::Create(hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);\r
+               ATLASSERT(hWnd != NULL);   // Did you remember to call SHInitExtraControls() ??\r
+               return hWnd;\r
+       }\r
+\r
+// Attributes\r
+       static LPCTSTR GetWndClassName()\r
+       {\r
+               return WC_TSTATIC;\r
+       }\r
+\r
+// Operations\r
+       BOOL SetToolTipText(LPCTSTR pstrTipText)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(pstrTipText);\r
+               ATLASSERT(lstrlen(pstrTipText)<= 253);\r
+               CTempBuffer<TCHAR, _WTL_STACK_ALLOC_THRESHOLD> buff;\r
+               LPTSTR pstr = buff.Allocate(lstrlen(pstrTipText) + 3);\r
+               if(pstr == NULL)\r
+                       return FALSE;\r
+               ::lstrcpy(pstr, _T("~~"));\r
+               ::lstrcat(pstr, pstrTipText);\r
+               return SetWindowText(pstr);\r
+       }\r
+};\r
+\r
+typedef CTTStaticT<WTL::CStatic> CTTStatic;\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CTTButton\r
+\r
+template <class TBase>\r
+class CTTButtonT : public TBase\r
+{\r
+public:\r
+// Constructors\r
+       CTTButtonT(HWND hWnd = NULL) : TBase(hWnd)\r
+       { }\r
+\r
+       CTTButtonT< TBase >& operator =(HWND hWnd)\r
+       {\r
+               m_hWnd = hWnd;\r
+               return *this;\r
+       }\r
+\r
+       HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,\r
+                       DWORD dwStyle = 0, DWORD dwExStyle = 0,\r
+                       ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)\r
+       {\r
+               HWND hWnd = TBase::Create(hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);\r
+               ATLASSERT(hWnd != NULL);   // Did you remember to call SHInitExtraControls() ??\r
+               return hWnd;\r
+       }\r
+\r
+// Attributes\r
+       static LPCTSTR GetWndClassName()\r
+       {\r
+               return WC_TBUTTON;\r
+       }\r
+\r
+// Operations\r
+       BOOL SetToolTipText(LPCTSTR pstrTipText)\r
+       {\r
+               ATLASSERT(::IsWindow(m_hWnd));\r
+               ATLASSERT(pstrTipText);\r
+               ATLASSERT(lstrlen(pstrTipText)<= 253);\r
+               CTempBuffer<TCHAR, _WTL_STACK_ALLOC_THRESHOLD> buff;\r
+               LPTSTR pstr = buff.Allocate(lstrlen(pstrTipText) + 3);\r
+               if(pstr == NULL)\r
+                       return FALSE;\r
+               ::lstrcpy(pstr, _T("~~"));\r
+               ::lstrcat(pstr, pstrTipText);\r
+               return SetWindowText(pstr);\r
+       }\r
+};\r
+\r
+typedef CTTButtonT<WTL::CButton> CTTButton;\r
+\r
+#endif // !WIN32_PLATFORM_WFSP\r
+\r
+\r
+// --- SmartPhone specific controls ---\r
+\r
+#ifdef WIN32_PLATFORM_WFSP\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CSpinCtrlT - CSpinCtrl : SmartPhone adapted UpDown control\r
+\r
+template <class TBase>\r
+class CSpinCtrlT : public CUpDownCtrlT< TBase >\r
+{\r
+public:\r
+// Constructors\r
+       CSpinCtrlT(HWND hWnd = NULL) : CUpDownCtrlT< TBase >(hWnd)\r
+       { }\r
+\r
+       CSpinCtrlT< TBase >& operator =(HWND hWnd)\r
+       {\r
+               m_hWnd = hWnd;\r
+               return *this;\r
+       }\r
+\r
+       HWND Create(HWND hWndParent, HWND hBuddy, DWORD dwStyle, int nID, LPCTSTR szExpandedName = NULL)\r
+       {\r
+               ATLASSERT(::IsWindow(hWndParent));\r
+               CUpDownCtrlT< TBase >::Create(hWndParent, NULL, szExpandedName, dwStyle, 0, nID, NULL);\r
+               ATLASSERT(m_hWnd != NULL);   // Did you remember to call AtlInitCommonControls(ICC_UPDOWN_CLASS)?\r
+               if (hBuddy != NULL)\r
+               {\r
+                       ATLASSERT(::IsWindow(hBuddy));\r
+                       SetBuddy(hBuddy);\r
+               }\r
+               return m_hWnd;\r
+       }\r
+};\r
+\r
+typedef CSpinCtrlT<ATL::CWindow> CSpinCtrl;\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CSpinned - SmartPhone association of control and Spin\r
+\r
+template <class TBase, bool t_bExpandOnly>\r
+class CSpinned : public TBase\r
+{\r
+public:\r
+       CSpinCtrl m_SpinCtrl;\r
+       DWORD m_dwSpinnedStyle;\r
+\r
+// Constructors\r
+       CSpinned(HWND hWnd = NULL) : TBase(hWnd)\r
+       {\r
+               m_dwSpinnedStyle = WS_VISIBLE | UDS_ALIGNRIGHT | UDS_EXPANDABLE;\r
+               \r
+               if (t_bExpandOnly == true)\r
+                       m_dwSpinnedStyle |= UDS_NOSCROLL;\r
+               else\r
+                       m_dwSpinnedStyle |= UDS_HORZ | UDS_ARROWKEYS | UDS_SETBUDDYINT | UDS_WRAP;\r
+\r
+               if (hWnd != NULL)\r
+                       AttachOrCreateSpinCtrl();\r
+       }\r
+\r
+       CSpinned<TBase, t_bExpandOnly>& operator =(HWND hWnd)\r
+       {\r
+               Attach(hWnd);\r
+               return *this;\r
+       }\r
+\r
+       void Attach(HWND hWnd)\r
+       {\r
+               ATLASSERT(!IsWindow());\r
+               TBase* pT = static_cast<TBase*>(this);\r
+               pT->m_hWnd = hWnd;\r
+               if (hWnd != NULL)\r
+                       AttachOrCreateSpinCtrl();\r
+       }\r
+\r
+       HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szExpandedName = NULL,\r
+                       DWORD dwStyle = 0, DWORD dwExStyle = 0,\r
+                       ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)\r
+       {\r
+\r
+               TBase* pT = static_cast<TBase*>(this);\r
+               TBase::Create(hWndParent, rect, NULL, dwStyle, dwExStyle, MenuOrID, lpCreateParam);\r
+               ATLASSERT(pT->m_hWnd != NULL);\r
+\r
+               m_SpinCtrl.Create(hWndParent, pT->m_hWnd, m_dwSpinnedStyle, ATL_IDW_SPIN_ID + (int)MenuOrID.m_hMenu, szExpandedName);\r
+\r
+               ATLASSERT(m_SpinCtrl.m_hWnd != NULL);   // Did you remember to call AtlInitCommonControls(ICC_UPDOWN_CLASS)?\r
+\r
+               return pT->m_hWnd;\r
+       }\r
+\r
+// Attributes\r
+       CSpinCtrl& GetSpinCtrl()\r
+       {\r
+               return m_SpinCtrl;\r
+       }\r
+\r
+// Implementation\r
+       // Attach our existing SpinCtrl or create one\r
+       bool AttachOrCreateSpinCtrl()\r
+       {\r
+               TBase* pT = static_cast<TBase*>(this);\r
+\r
+               HWND hSpin = ::GetDlgItem(pT->GetParent(), ATL_IDW_SPIN_ID + pT->GetDlgCtrlID());\r
+\r
+               if (hSpin != NULL)\r
+               {\r
+                       m_SpinCtrl.Attach(hSpin);\r
+#ifdef DEBUG\r
+                       TCHAR sClassName[16];\r
+                       ::GetClassName(hSpin, sClassName, 16);\r
+                       ATLASSERT(!_tcscmp(sClassName, UPDOWN_CLASS));\r
+                       ATLASSERT(m_SpinCtrl.GetBuddy().m_hWnd == pT->m_hWnd);\r
+#endif // DEBUG\r
+               }\r
+               else\r
+               {\r
+                       m_SpinCtrl.Create(pT->GetParent(), pT->m_hWnd, m_dwSpinnedStyle, ATL_IDW_SPIN_ID + pT->GetDlgCtrlID());\r
+               }\r
+\r
+               return m_SpinCtrl.m_hWnd != NULL;\r
+       }\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// CSpinListBox - SmartPhone spinned ListBox control\r
+// CExpandListBox - SmartPhone expandable ListBox control\r
+// CExpandEdit - SmartPhone expandable Edit control\r
+// CExpandCapEdit - SmartPhone expandable CapEdit control\r
+\r
+typedef CSpinned<CListBox, false>   CSpinListBox;\r
+typedef CSpinned<CListBox, true>    CExpandListBox;\r
+typedef CSpinned<CEdit, true>          CExpandEdit;\r
+typedef CSpinned<CCapEdit, true>    CExpandCapEdit;\r
+\r
+#endif // WIN32_PLATFORM_WFSP\r
+\r
+#endif // _WTL_CE_NO_CONTROLS\r
+\r
+}; // namespace WTL\r
+\r
+#endif // __ATLWINCE_H__\r
diff --git a/WTL80/include/atlwinx.h b/WTL80/include/atlwinx.h
new file mode 100644 (file)
index 0000000..9767fa1
--- /dev/null
@@ -0,0 +1,529 @@
+// Windows Template Library - WTL version 8.0\r
+// Copyright (C) Microsoft Corporation. All rights reserved.\r
+//\r
+// This file is a part of the Windows Template Library.\r
+// The use and distribution terms for this software are covered by the\r
+// Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php)\r
+// which can be found in the file CPL.TXT at the root of this distribution.\r
+// By using this software in any fashion, you are agreeing to be bound by\r
+// the terms of this license. You must not remove this notice, or\r
+// any other, from this software.\r
+\r
+#ifndef __ATLWINX_H__\r
+#define __ATLWINX_H__\r
+\r
+#pragma once\r
+\r
+#ifndef __cplusplus\r
+       #error ATL requires C++ compilation (use a .cpp suffix)\r
+#endif\r
+\r
+#ifndef __ATLAPP_H__\r
+       #error atlwinx.h requires atlapp.h to be included first\r
+#endif\r
+\r
+#if (_ATL_VER >= 0x0700)\r
+  #include <atlwin.h>\r
+#endif // (_ATL_VER >= 0x0700)\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Classes in this file:\r
+//\r
+// _U_RECT\r
+// _U_MENUorID\r
+// _U_STRINGorID\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Command Chaining Macros\r
+\r
+#define CHAIN_COMMANDS(theChainClass) \\r
+       if(uMsg == WM_COMMAND) \\r
+               CHAIN_MSG_MAP(theChainClass)\r
+\r
+#define CHAIN_COMMANDS_ALT(theChainClass, msgMapID) \\r
+       if(uMsg == WM_COMMAND) \\r
+               CHAIN_MSG_MAP_ALT(theChainClass, msgMapID)\r
+\r
+#define CHAIN_COMMANDS_MEMBER(theChainMember) \\r
+       if(uMsg == WM_COMMAND) \\r
+               CHAIN_MSG_MAP_MEMBER(theChainMember)\r
+\r
+#define CHAIN_COMMANDS_ALT_MEMBER(theChainMember, msgMapID) \\r
+       if(uMsg == WM_COMMAND) \\r
+               CHAIN_MSG_MAP_ALT_MEMBER(theChainMember, msgMapID)\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Macros for parent message map to selectively reflect control messages\r
+\r
+// NOTE: ReflectNotifications is a member of ATL's CWindowImplRoot\r
+//  (and overridden in 2 cases - CContainedWindowT and CAxHostWindow)\r
+//  Since we can't modify ATL, we'll provide the needed additions\r
+//  in a separate function (that is not a member of CWindowImplRoot)\r
+\r
+namespace WTL\r
+{\r
+\r
+inline LRESULT WtlReflectNotificationsFiltered(HWND hWndParent, UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled,\r
+                                               UINT uMsgFilter = WM_NULL, UINT_PTR idFromFilter = 0, HWND hWndChildFilter = NULL)\r
+{\r
+       if((uMsgFilter != WM_NULL) && (uMsgFilter != uMsg))\r
+       {\r
+               // The notification message doesn't match the filter.\r
+               bHandled = FALSE;\r
+               return 1;\r
+       }\r
+\r
+       HWND hWndChild = NULL;\r
+       UINT_PTR idFrom = 0;\r
+\r
+       switch(uMsg)\r
+       {\r
+       case WM_COMMAND:\r
+               if(lParam != NULL)      // not from a menu\r
+               {\r
+                       hWndChild = (HWND)lParam;\r
+                       idFrom = (UINT_PTR)LOWORD(wParam);\r
+               }\r
+               break;\r
+       case WM_NOTIFY:\r
+               hWndChild = ((LPNMHDR)lParam)->hwndFrom;\r
+               idFrom = ((LPNMHDR)lParam)->idFrom;\r
+               break;\r
+#ifndef _WIN32_WCE\r
+       case WM_PARENTNOTIFY:\r
+               switch(LOWORD(wParam))\r
+               {\r
+               case WM_CREATE:\r
+               case WM_DESTROY:\r
+                       hWndChild = (HWND)lParam;\r
+                       idFrom = (UINT_PTR)HIWORD(wParam);\r
+                       break;\r
+               default:\r
+                       hWndChild = ::GetDlgItem(hWndParent, HIWORD(wParam));\r
+                       idFrom = (UINT_PTR)::GetDlgCtrlID(hWndChild);\r
+                       break;\r
+               }\r
+               break;\r
+#endif // !_WIN32_WCE\r
+       case WM_DRAWITEM:\r
+               if(wParam)      // not from a menu\r
+               {\r
+                       hWndChild = ((LPDRAWITEMSTRUCT)lParam)->hwndItem;\r
+                       idFrom = (UINT_PTR)wParam;\r
+               }\r
+               break;\r
+       case WM_MEASUREITEM:\r
+               if(wParam)      // not from a menu\r
+               {\r
+                       hWndChild = ::GetDlgItem(hWndParent, ((LPMEASUREITEMSTRUCT)lParam)->CtlID);\r
+                       idFrom = (UINT_PTR)wParam;\r
+               }\r
+               break;\r
+       case WM_COMPAREITEM:\r
+               if(wParam)      // not from a menu\r
+               {\r
+                       hWndChild = ((LPCOMPAREITEMSTRUCT)lParam)->hwndItem;\r
+                       idFrom = (UINT_PTR)wParam;\r
+               }\r
+               break;\r
+       case WM_DELETEITEM:\r
+               if(wParam)      // not from a menu\r
+               {\r
+                       hWndChild = ((LPDELETEITEMSTRUCT)lParam)->hwndItem;\r
+                       idFrom = (UINT_PTR)wParam;\r
+               }\r
+               break;\r
+       case WM_VKEYTOITEM:\r
+       case WM_CHARTOITEM:\r
+       case WM_HSCROLL:\r
+       case WM_VSCROLL:\r
+               hWndChild = (HWND)lParam;\r
+               idFrom = (UINT_PTR)::GetDlgCtrlID(hWndChild);\r
+               break;\r
+       case WM_CTLCOLORBTN:\r
+       case WM_CTLCOLORDLG:\r
+       case WM_CTLCOLOREDIT:\r
+       case WM_CTLCOLORLISTBOX:\r
+       case WM_CTLCOLORMSGBOX:\r
+       case WM_CTLCOLORSCROLLBAR:\r
+       case WM_CTLCOLORSTATIC:\r
+               hWndChild = (HWND)lParam;\r
+               idFrom = (UINT_PTR)::GetDlgCtrlID(hWndChild);\r
+               break;\r
+       default:\r
+               break;\r
+       }\r
+\r
+       if((hWndChild == NULL) ||\r
+               ((hWndChildFilter != NULL) && (hWndChildFilter != hWndChild)))\r
+       {\r
+               // Either hWndChild isn't valid, or\r
+               // hWndChild doesn't match the filter.\r
+               bHandled = FALSE;\r
+               return 1;\r
+       }\r
+\r
+       if((idFromFilter != 0) && (idFromFilter != idFrom))\r
+       {\r
+               // The dialog control id doesn't match the filter.\r
+               bHandled = FALSE;\r
+               return 1;\r
+       }\r
+\r
+       ATLASSERT(::IsWindow(hWndChild));\r
+       LRESULT lResult = ::SendMessage(hWndChild, OCM__BASE + uMsg, wParam, lParam);\r
+       if((lResult == 0) && (uMsg >= WM_CTLCOLORMSGBOX) && (uMsg <= WM_CTLCOLORSTATIC))\r
+       {\r
+               // Try to prevent problems with WM_CTLCOLOR* messages when\r
+               // the message wasn't really handled\r
+               bHandled = FALSE;\r
+       }\r
+\r
+       return lResult;\r
+}\r
+\r
+}; // namespace WTL\r
+\r
+// Try to prevent problems with WM_CTLCOLOR* messages when\r
+// the message wasn't really handled\r
+#define REFLECT_NOTIFICATIONS_EX() \\r
+{ \\r
+       bHandled = TRUE; \\r
+       lResult = ReflectNotifications(uMsg, wParam, lParam, bHandled); \\r
+       if((lResult == 0) && (uMsg >= WM_CTLCOLORMSGBOX) && (uMsg <= WM_CTLCOLORSTATIC)) \\r
+               bHandled = FALSE; \\r
+       if(bHandled) \\r
+               return TRUE; \\r
+}\r
+\r
+#define REFLECT_NOTIFICATIONS_MSG_FILTERED(uMsgFilter) \\r
+       { \\r
+               bHandled = TRUE; \\r
+               lResult = WTL::WtlReflectNotificationsFiltered(m_hWnd, uMsg, wParam, lParam, bHandled, uMsgFilter, 0, NULL); \\r
+               if(bHandled) \\r
+                       return TRUE; \\r
+       }\r
+\r
+#define REFLECT_NOTIFICATIONS_ID_FILTERED(idFromFilter) \\r
+       { \\r
+               bHandled = TRUE; \\r
+               lResult = WTL::WtlReflectNotificationsFiltered(m_hWnd, uMsg, wParam, lParam, bHandled, WM_NULL, idFromFilter, NULL); \\r
+               if(bHandled) \\r
+                       return TRUE; \\r
+       }\r
+\r
+#define REFLECT_NOTIFICATIONS_HWND_FILTERED(hWndChildFilter) \\r
+       { \\r
+               bHandled = TRUE; \\r
+               lResult = WTL::WtlReflectNotificationsFiltered(m_hWnd, uMsg, wParam, lParam, bHandled, WM_NULL, 0, hWndChildFilter); \\r
+               if(bHandled) \\r
+                       return TRUE; \\r
+       }\r
+\r
+#define REFLECT_NOTIFICATIONS_MSG_ID_FILTERED(uMsgFilter, idFromFilter) \\r
+       { \\r
+               bHandled = TRUE; \\r
+               lResult = WTL::WtlReflectNotificationsFiltered(m_hWnd, uMsg, wParam, lParam, bHandled, uMsgFilter, idFromFilter, NULL); \\r
+               if(bHandled) \\r
+                       return TRUE; \\r
+       }\r
+\r
+#define REFLECT_NOTIFICATIONS_MSG_HWND_FILTERED(uMsgFilter, hWndChildFilter) \\r
+       { \\r
+               bHandled = TRUE; \\r
+               lResult = WTL::WtlReflectNotificationsFiltered(m_hWnd, uMsg, wParam, lParam, bHandled, uMsgFilter, 0, hWndChildFilter); \\r
+               if(bHandled) \\r
+                       return TRUE; \\r
+       }\r
+\r
+#define REFLECT_COMMAND(id, code) \\r
+       if(uMsg == WM_COMMAND && id == LOWORD(wParam) && code == HIWORD(wParam)) \\r
+       { \\r
+               bHandled = TRUE; \\r
+               lResult = ReflectNotifications(uMsg, wParam, lParam, bHandled); \\r
+               if(bHandled) \\r
+                       return TRUE; \\r
+       }\r
+\r
+#define REFLECT_COMMAND_ID(id) \\r
+       if(uMsg == WM_COMMAND && id == LOWORD(wParam)) \\r
+       { \\r
+               bHandled = TRUE; \\r
+               lResult = ReflectNotifications(uMsg, wParam, lParam, bHandled); \\r
+               if(bHandled) \\r
+                       return TRUE; \\r
+       }\r
+\r
+#define REFLECT_COMMAND_CODE(code) \\r
+       if(uMsg == WM_COMMAND && code == HIWORD(wParam)) \\r
+       { \\r
+               bHandled = TRUE; \\r
+               lResult = ReflectNotifications(uMsg, wParam, lParam, bHandled); \\r
+               if(bHandled) \\r
+                       return TRUE; \\r
+       }\r
+\r
+#define REFLECT_COMMAND_RANGE(idFirst, idLast) \\r
+       if(uMsg == WM_COMMAND && LOWORD(wParam) >= idFirst  && LOWORD(wParam) <= idLast) \\r
+       { \\r
+               bHandled = TRUE; \\r
+               lResult = ReflectNotifications(uMsg, wParam, lParam, bHandled); \\r
+               if(bHandled) \\r
+                       return TRUE; \\r
+       }\r
+\r
+#define REFLECT_COMMAND_RANGE_CODE(idFirst, idLast, code) \\r
+       if(uMsg == WM_COMMAND && code == HIWORD(wParam) && LOWORD(wParam) >= idFirst  && LOWORD(wParam) <= idLast) \\r
+       { \\r
+               bHandled = TRUE; \\r
+               lResult = ReflectNotifications(uMsg, wParam, lParam, bHandled); \\r
+               if(bHandled) \\r
+                       return TRUE; \\r
+       }\r
+\r
+#define REFLECT_NOTIFY(id, cd) \\r
+       if(uMsg == WM_NOTIFY && id == ((LPNMHDR)lParam)->idFrom && cd == ((LPNMHDR)lParam)->code) \\r
+       { \\r
+               bHandled = TRUE; \\r
+               lResult = ReflectNotifications(uMsg, wParam, lParam, bHandled); \\r
+               if(bHandled) \\r
+                       return TRUE; \\r
+       }\r
+\r
+#define REFLECT_NOTIFY_ID(id) \\r
+       if(uMsg == WM_NOTIFY && id == ((LPNMHDR)lParam)->idFrom) \\r
+       { \\r
+               bHandled = TRUE; \\r
+               lResult = ReflectNotifications(uMsg, wParam, lParam, bHandled); \\r
+               if(bHandled) \\r
+                       return TRUE; \\r
+       }\r
+\r
+#define REFLECT_NOTIFY_CODE(cd) \\r
+       if(uMsg == WM_NOTIFY && cd == ((LPNMHDR)lParam)->code) \\r
+       { \\r
+               bHandled = TRUE; \\r
+               lResult = ReflectNotifications(uMsg, wParam, lParam, bHandled); \\r
+               if(bHandled) \\r
+                       return TRUE; \\r
+       }\r
+\r
+#define REFLECT_NOTIFY_RANGE(idFirst, idLast) \\r
+       if(uMsg == WM_NOTIFY && ((LPNMHDR)lParam)->idFrom >= idFirst && ((LPNMHDR)lParam)->idFrom <= idLast) \\r
+       { \\r
+               bHandled = TRUE; \\r
+               lResult = ReflectNotifications(uMsg, wParam, lParam, bHandled); \\r
+               if(bHandled) \\r
+                       return TRUE; \\r
+       }\r
+\r
+#define REFLECT_NOTIFY_RANGE_CODE(idFirst, idLast, cd) \\r
+       if(uMsg == WM_NOTIFY && cd == ((LPNMHDR)lParam)->code && ((LPNMHDR)lParam)->idFrom >= idFirst && ((LPNMHDR)lParam)->idFrom <= idLast) \\r
+       { \\r
+               bHandled = TRUE; \\r
+               lResult = ReflectNotifications(uMsg, wParam, lParam, bHandled); \\r
+               if(bHandled) \\r
+                       return TRUE; \\r
+       }\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Reflected message handler macros for message maps (for ATL 3.0)\r
+\r
+#if (_ATL_VER < 0x0700)\r
+\r
+#define REFLECTED_COMMAND_HANDLER(id, code, func) \\r
+       if(uMsg == OCM_COMMAND && id == LOWORD(wParam) && code == HIWORD(wParam)) \\r
+       { \\r
+               bHandled = TRUE; \\r
+               lResult = func(HIWORD(wParam), LOWORD(wParam), (HWND)lParam, bHandled); \\r
+               if(bHandled) \\r
+                       return TRUE; \\r
+       }\r
+\r
+#define REFLECTED_COMMAND_ID_HANDLER(id, func) \\r
+       if(uMsg == OCM_COMMAND && id == LOWORD(wParam)) \\r
+       { \\r
+               bHandled = TRUE; \\r
+               lResult = func(HIWORD(wParam), LOWORD(wParam), (HWND)lParam, bHandled); \\r
+               if(bHandled) \\r
+                       return TRUE; \\r
+       }\r
+\r
+#define REFLECTED_COMMAND_CODE_HANDLER(code, func) \\r
+       if(uMsg == OCM_COMMAND && code == HIWORD(wParam)) \\r
+       { \\r
+               bHandled = TRUE; \\r
+               lResult = func(HIWORD(wParam), LOWORD(wParam), (HWND)lParam, bHandled); \\r
+               if(bHandled) \\r
+                       return TRUE; \\r
+       }\r
+\r
+#define REFLECTED_COMMAND_RANGE_HANDLER(idFirst, idLast, func) \\r
+       if(uMsg == OCM_COMMAND && LOWORD(wParam) >= idFirst  && LOWORD(wParam) <= idLast) \\r
+       { \\r
+               bHandled = TRUE; \\r
+               lResult = func(HIWORD(wParam), LOWORD(wParam), (HWND)lParam, bHandled); \\r
+               if(bHandled) \\r
+                       return TRUE; \\r
+       }\r
+\r
+#define REFLECTED_COMMAND_RANGE_CODE_HANDLER(idFirst, idLast, code, func) \\r
+       if(uMsg == OCM_COMMAND && code == HIWORD(wParam) && LOWORD(wParam) >= idFirst  && LOWORD(wParam) <= idLast) \\r
+       { \\r
+               bHandled = TRUE; \\r
+               lResult = func(HIWORD(wParam), LOWORD(wParam), (HWND)lParam, bHandled); \\r
+               if(bHandled) \\r
+                       return TRUE; \\r
+       }\r
+\r
+#define REFLECTED_NOTIFY_HANDLER(id, cd, func) \\r
+       if(uMsg == OCM_NOTIFY && id == ((LPNMHDR)lParam)->idFrom && cd == ((LPNMHDR)lParam)->code) \\r
+       { \\r
+               bHandled = TRUE; \\r
+               lResult = func((int)wParam, (LPNMHDR)lParam, bHandled); \\r
+               if(bHandled) \\r
+                       return TRUE; \\r
+       }\r
+\r
+#define REFLECTED_NOTIFY_ID_HANDLER(id, func) \\r
+       if(uMsg == OCM_NOTIFY && id == ((LPNMHDR)lParam)->idFrom) \\r
+       { \\r
+               bHandled = TRUE; \\r
+               lResult = func((int)wParam, (LPNMHDR)lParam, bHandled); \\r
+               if(bHandled) \\r
+                       return TRUE; \\r
+       }\r
+\r
+#define REFLECTED_NOTIFY_CODE_HANDLER(cd, func) \\r
+       if(uMsg == OCM_NOTIFY && cd == ((LPNMHDR)lParam)->code) \\r
+       { \\r
+               bHandled = TRUE; \\r
+               lResult = func((int)wParam, (LPNMHDR)lParam, bHandled); \\r
+               if(bHandled) \\r
+                       return TRUE; \\r
+       }\r
+\r
+#define REFLECTED_NOTIFY_RANGE_HANDLER(idFirst, idLast, func) \\r
+       if(uMsg == OCM_NOTIFY && ((LPNMHDR)lParam)->idFrom >= idFirst && ((LPNMHDR)lParam)->idFrom <= idLast) \\r
+       { \\r
+               bHandled = TRUE; \\r
+               lResult = func((int)wParam, (LPNMHDR)lParam, bHandled); \\r
+               if(bHandled) \\r
+                       return TRUE; \\r
+       }\r
+\r
+#define REFLECTED_NOTIFY_RANGE_CODE_HANDLER(idFirst, idLast, cd, func) \\r
+       if(uMsg == OCM_NOTIFY && cd == ((LPNMHDR)lParam)->code && ((LPNMHDR)lParam)->idFrom >= idFirst && ((LPNMHDR)lParam)->idFrom <= idLast) \\r
+       { \\r
+               bHandled = TRUE; \\r
+               lResult = func((int)wParam, (LPNMHDR)lParam, bHandled); \\r
+               if(bHandled) \\r
+                       return TRUE; \\r
+       }\r
+\r
+#endif // (_ATL_VER < 0x0700)\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Dual argument helper classes (for ATL 3.0)\r
+\r
+#if (_ATL_VER < 0x0700)\r
+\r
+namespace ATL\r
+{\r
+\r
+class _U_RECT\r
+{\r
+public:\r
+       _U_RECT(LPRECT lpRect) : m_lpRect(lpRect)\r
+       { }\r
+       _U_RECT(RECT& rc) : m_lpRect(&rc)\r
+       { }\r
+       LPRECT m_lpRect;\r
+};\r
+\r
+class _U_MENUorID\r
+{\r
+public:\r
+       _U_MENUorID(HMENU hMenu) : m_hMenu(hMenu)\r
+       { }\r
+       _U_MENUorID(UINT nID) : m_hMenu((HMENU)LongToHandle(nID))\r
+       { }\r
+       HMENU m_hMenu;\r
+};\r
+\r
+class _U_STRINGorID\r
+{\r
+public:\r
+       _U_STRINGorID(LPCTSTR lpString) : m_lpstr(lpString)\r
+       { }\r
+       _U_STRINGorID(UINT nID) : m_lpstr(MAKEINTRESOURCE(nID))\r
+       { }\r
+       LPCTSTR m_lpstr;\r
+};\r
+\r
+}; // namespace ATL\r
+\r
+#endif // (_ATL_VER < 0x0700)\r
+\r
+\r
+namespace WTL\r
+{\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+// Forward notifications support for message maps (for ATL 3.0)\r
+\r
+#if (_ATL_VER < 0x0700)\r
+\r
+// forward notifications support\r
+#define FORWARD_NOTIFICATIONS() \\r
+       { \\r
+               bHandled = TRUE; \\r
+               lResult = WTL::Atl3ForwardNotifications(m_hWnd, uMsg, wParam, lParam, bHandled); \\r
+               if(bHandled) \\r
+                       return TRUE; \\r
+       }\r
+\r
+static LRESULT Atl3ForwardNotifications(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)\r
+{\r
+       LRESULT lResult = 0;\r
+       switch(uMsg)\r
+       {\r
+       case WM_COMMAND:\r
+       case WM_NOTIFY:\r
+#ifndef _WIN32_WCE\r
+       case WM_PARENTNOTIFY:\r
+#endif // !_WIN32_WCE\r
+       case WM_DRAWITEM:\r
+       case WM_MEASUREITEM:\r
+       case WM_COMPAREITEM:\r
+       case WM_DELETEITEM:\r
+       case WM_VKEYTOITEM:\r
+       case WM_CHARTOITEM:\r
+       case WM_HSCROLL:\r
+       case WM_VSCROLL:\r
+       case WM_CTLCOLORBTN:\r
+       case WM_CTLCOLORDLG:\r
+       case WM_CTLCOLOREDIT:\r
+       case WM_CTLCOLORLISTBOX:\r
+       case WM_CTLCOLORMSGBOX:\r
+       case WM_CTLCOLORSCROLLBAR:\r
+       case WM_CTLCOLORSTATIC:\r
+               lResult = ::SendMessage(::GetParent(hWnd), uMsg, wParam, lParam);\r
+               break;\r
+       default:\r
+               bHandled = FALSE;\r
+               break;\r
+       }\r
+       return lResult;\r
+}\r
+\r
+#endif // (_ATL_VER < 0x0700)\r
+\r
+}; // namespace WTL\r
+\r
+#endif // __ATLWINX_H__\r
diff --git a/WTL80/readme.htm b/WTL80/readme.htm
new file mode 100644 (file)
index 0000000..f057233
--- /dev/null
@@ -0,0 +1,3339 @@
+<html>\r
+\r
+<head>\r
+<meta http-equiv="Content-Language" content="en-us">\r
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">\r
+<title>Windows Template Library</title>\r
+<style type="text/css">\r
+.style1 {\r
+       font-family: Arial;\r
+       font-weight: bold;\r
+       font-size: x-small;\r
+}\r
+.style2 {\r
+       font-family: Arial;\r
+       font-size: x-small;\r
+}\r
+.style3 {\r
+       text-align: right;\r
+}\r
+</style>\r
+</head>\r
+\r
+<body>\r
+\r
+<table border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" id="AutoNumber3">\r
+  <tr>\r
+    <td class="style3">\r
+       <p style="text-align: left"><font face="Arial"><b>Windows Template Library - WTL Version 8.0</b></font><font face="Arial" size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \r
+       (build 7161) 6/10/07</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td><hr></td>\r
+  </tr>\r
+  <tr>\r
+    <td><font face="Arial" size="2">Copyright &#169; 2007 Microsoft Corporation.\r
+All rights reserved.</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td>&nbsp;</td>\r
+  </tr>\r
+  <tr>\r
+    <td><font face="Arial" size="2">This file is a part of the Windows Template \r
+       Library.<br>\r
+       The use and distribution terms for this software are covered by the<br>\r
+       Common Public License 1.0 (<a target="_blank" href="http://opensource.org/osi3.0/licenses/cpl1.0.php">http://opensource.org/osi3.0/licenses/cpl1.0.php</a>)<br>\r
+       which can be found in the file CPL.TXT at the root of this distribution.<br>\r
+       By using this software in any fashion, you are agreeing to be bound by<br>\r
+       the terms of this license. You must not remove this notice, or<br>\r
+       any other, from this software.</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td><hr></td>\r
+  </tr>\r
+</table>\r
+\r
+<p style=margin:0in>&nbsp;</p>\r
+\r
+<p style=margin:0in>&nbsp;</p>\r
+\r
+<p style=margin:0in><font face="Arial" size="2">Welcome to the Windows Template Library, version \r
+8.0. This document contains the following topics:</font></p>\r
+<p style=margin:0in>&nbsp;</p>\r
+<ul style="margin-top:0in;margin-bottom:0in">\r
+       <li><font face="Arial" size="2"><a href="#Introduction">Introduction</a></font></li>\r
+       <li><font face="Arial" size="2"><a href="#Features And Installation">Features \r
+  And Installation</a></font></li>\r
+       <li><font face="Arial" size="2"><a href="#Packing List">Packing List</a></font></li>\r
+       <li><font face="Arial" size="2"><a href="#Class Overview">Class Overview</a></font></li>\r
+       <li><font face="Arial" size="2"><a href="#ATL/WTL AppWizard">ATL/WTL AppWizard</a></font></li>\r
+       <li><a href="#Support for Windows CE"><font face="Arial" size="2">S</font></a><font face="Arial" size="2"><a href="#Support for Windows CE">upport \r
+  for Windows CE</a></font></li>\r
+       <li><font face="Arial" size="2">\r
+       <a href="#Support for Visual C++ 2005 Express">Support for Visual C++ 2005 \r
+       Express</a></font></li>\r
+       <li><font face="Arial" size="2"><a href="#Notes">Notes</a></font></li>\r
+       <li><font face="Arial" size="2"><a href="#Changes Between WTL 8.0 And 7.5">Changes Between WTL \r
+       8.0 And 7.5</a></font></li>\r
+       <li><font face="Arial" size="2"><a href="#Changes Between WTL 7.5 And 7.1">Changes Between WTL 7.5 And 7.1</a></font></li>\r
+       <li><font face="Arial" size="2"><a href="#Changes Between WTL 7.1 And 7.0">Changes Between WTL \r
+  7.1 And 7.0</a></font></li>\r
+       <li><font face="Arial" size="2"><a href="#Changes Between WTL 7.0 And 3.1">Changes Between WTL \r
+  7.0 And 3.1</a></font></li>\r
+       <li><font face="Arial" size="2"><a href="#Changes Between WTL 3.1 And 3.0">Changes Between WTL 3.1 And 3.0</a></font></li>\r
+</ul>\r
+<p style=margin:0in>&nbsp;</p>\r
+<p style=margin:0in>&nbsp;</p>\r
+<p style=margin:0in><font face="Arial">\r
+<b><a name="Introduction"></a>Introduction</b></font></p>\r
+<p style=margin:0in>&nbsp;</p>\r
+<p style=margin:0in><font face="Arial" size="2">Windows Template Library, or WTL, is a set of \r
+classes that extend ATL to support more complex user interfaces for either \r
+applications or various UI components, while maintaining the big advantage of \r
+ATL - small and fast code. WTL classes were designed to be the best and the \r
+easiest way to implement rich Win32 based UI for ATL based applications, \r
+servers, components, and controls.</font></p>\r
+<p style=margin:0in>&nbsp;</p>\r
+<p style=margin:0in><font face="Arial" size="2">WTL provides support for implementing \r
+many \r
+user interface elements, from frame and popup windows, to MDI, standard and \r
+common controls, common dialogs, property sheets and pages, GDI objects, UI \r
+updating, scrollable windows, splitter windows, command bars, etc. The WTL \r
+classes are mostly templated and use minimal instance data and inline functions. \r
+They were not designed as a framework, so they do not force a particular \r
+application model, and can accommodate any. The classes do not use hooks or \r
+thread local storage, so they have no restrictions that those techniques impose. \r
+They also have no inter-dependencies and can be freely mixed with straight SDK \r
+code. In summary, WTL delivers very small and efficient code, very close in size \r
+and speed to SDK programs, while presenting a more logical, object oriented \r
+model to a programmer.</font></p>\r
+<p style=margin:0in>&nbsp;</p>\r
+<p style=margin:0in>&nbsp;</p>\r
+<p style=margin:0in><font face="Arial">\r
+<b><a name="Features And Installation"></a>Features And Installation</b></font></p>\r
+<p style=margin:0in>&nbsp;</p>\r
+<p style=margin:0in><font face="Arial" size="2">This is the sixth public release \r
+of WTL, after WTL 3.0, 3.1, 7.0, 7.1, and 7.5. It is also the second release of WTL \r
+under the Common Public License, enabling developers from the WTL community to \r
+contribute to the library.</font></p>\r
+<p style=margin:0in>&nbsp;</p>\r
+<p style=margin:0in><font face="Arial" size="2">WTL classes can be used with either VC++ 6.0 and ATL 3.0, VC++ .NET \r
+2002 and ATL 7.0, VC++ .NET 2003 and ATL 7.1, VC++ 2005 with ATL 8.0, or EVC++ 4.0 or 3.0 with ATL for \r
+Windows CE. AppWizard for VC++ .NET 2002 and 2003, and Visual C++ 2005 is \r
+included.</font></p>\r
+<p style=margin:0in>&nbsp;</p>\r
+<p style=margin:0in><font face="Arial" size="2">The WTL classes are provided in \r
+header files located in the include directory. The only header files that must \r
+be included is atlapp.h, while others can be used when needed. The name of the \r
+file doesn't mean that you have to create an application, just that \r
+atlapp.h contains base definitions required for WTL projects.</font></p>\r
+<p style=margin:0in>&nbsp;</p>\r
+<p style=margin:0in><font face="Arial" size="2">To install WTL, just copy the whole directory \r
+structure, or unpack the archive file, to the location of your choice. Please be sure to\r
+<b>add the WTL\include \r
+directory</b> to the list of include directories in VC++, so that the compiler \r
+can find them when you include them in your projects..</font></p>\r
+<p style=margin:0in>&nbsp;</p>\r
+<p style=margin:0in><font face="Arial" size="2">Setup programs for the AppWizard are provided. After executing the setup scripts, ATL/WTL AppWizard will appear in the list of AppWizards when you select File.New.Project \r
+in VC++ IDE. The file AppWiz\setup70.js is the setup script for VC++ .NET 2002, AppWiz\setup71.js is for VC++ \r
+.NET 2003, and AppWiz\setup80.js is for VC++ 2005. AppWizCE\setup80.js is setup \r
+script for VC++ 2005 SmartDevice projects.</font></p>\r
+<p style=margin:0in>&nbsp;</p>\r
+<p style=margin:0in><font face="Arial" size="2">To manually install AppWizard \r
+for VC++ .NET 2002/2003, copy all WTLAppWiz.* files from AppWiz\Files to VC++ .NET \r
+projects directory, %VC7DIR%\Vc7\vcprojects, where %VC7DIR% is the directory \r
+where VC++ .NET 2002/2003 is installed. After that,&nbsp;open WTLAppWiz.vsz and modify the \r
+like that contains ABSOLUTE_PATH to contain %WTLDIR%\AppWiz\Files, where \r
+%WTLDIR% is the directory where WTL files are.</font></p>\r
+<p style=margin:0in>&nbsp;</p>\r
+<p style=margin:0in><font face="Arial" size="2">Platform support and \r
+requirements:</font></p>\r
+<p style=margin:0in>&nbsp;</p>\r
+<p style=margin:0in><font face="Arial" size="2">&nbsp;&nbsp;&nbsp; Compiler/IDE/ATL:</font></p>\r
+<p style=margin:0in><font face="Arial" size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \r
+Visual C++ 6.0&nbsp;&nbsp; (ATL 3.0)</font></p>\r
+<p style=margin:0in><font face="Arial" size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \r
+Visual C++.NET 2002&nbsp;&nbsp; (ATL 7.0)</font></p>\r
+<p style=margin:0in><font face="Arial" size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \r
+Visual C++.NET 2003&nbsp;&nbsp; (ATL 7.1)</font></p>\r
+<p style=margin:0in><font face="Arial" size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \r
+Visual C++ 2005&nbsp;&nbsp; (ATL 8.0)</font></p>\r
+<p style=margin:0in>&nbsp;</p>\r
+<p style=margin:0in><font face="Arial" size="2">&nbsp;&nbsp;&nbsp; SDK \r
+(optional):</font></p>\r
+<p style=margin:0in><font face="Arial" size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \r
+Any Platform SDK from January 2000 release up to the latest Windows SDK</font></p>\r
+<p style=margin:0in>&nbsp;</p>\r
+<p style=margin:0in><font face="Arial" size="2">&nbsp;&nbsp;&nbsp; Windows CE \r
+development:</font></p>\r
+<p style=margin:0in><font face="Arial" size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \r
+eMbedded Visual C++ 3.0 - Pocket PC, Pocket PC 2002</font></p>\r
+<p style=margin:0in><font face="Arial" size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \r
+eMbedded Visual C++ 4.0 - STANDARDSDK_410, Pocket PC 2003, Smartphone 2003,\r
+</font></p>\r
+<p style=margin:0in><font face="Arial" size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \r
+STANDARDSDK_500, Pocket PC 2003 SE, Smartphone 2003 SE</font></p>\r
+<p style=margin:0in><font face="Arial" size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \r
+Visual C++ 2005 - Pocket PC 2003 SE, Smartphone 2003 SE, STANDARDSDK_500,</font></p>\r
+<p style=margin:0in><span class="style2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\r
+</span><font face="Arial" size="2">Windows Mobile 5.0 (Pocket PC and Smartphone),<br>\r
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \r
+Windows Mobile 6.0 (Standard and Professional)</font></p>\r
+<p style=margin:0in>&nbsp;</p>\r
+<p style=margin:0in>&nbsp;</p>\r
+<p style=margin:0in><font face="Arial">\r
+<b><a name="Packing List"></a>Packing List</b></font></p>\r
+<p style=margin:0in>&nbsp;</p>\r
+<table border="0" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" width="497" id="AutoNumber2">\r
+  <tr>\r
+    <td width="136"><font face="Arial" size="2">File Name</font><font face="Arial">:</font></td>\r
+    <td width="358"><font face="Arial" size="2">Description:</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="494" colspan="2"><hr></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="136"><font face="Arial" size="2">readme.htm</font></td>\r
+    <td width="358"><font face="Arial" size="2">this file</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="136"><font face="Arial" size="2">CPL.TXT</font></td>\r
+    <td width="358"><font face="Arial" size="2">Common Public License</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="494" colspan="2">&nbsp;</td>\r
+  </tr>\r
+  <tr>\r
+    <td width="494" colspan="2"><font face="Arial" size="2">include\</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="136"><font face="Arial" size="2">&nbsp;&nbsp;&nbsp; atlapp.h</font></td>\r
+    <td width="358"><font face="Arial" size="2">message loop, interfaces, \r
+    general app stuff</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="136"><font face="Arial" size="2">&nbsp;&nbsp;&nbsp; atlcrack.h</font></td>\r
+    <td width="358"><font face="Arial" size="2">message cracker macros</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="136"><font face="Arial" size="2">&nbsp;&nbsp;&nbsp; atlctrls.h</font></td>\r
+    <td width="358"><font face="Arial" size="2">standard and common control \r
+    classes</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="136"><font face="Arial" size="2">&nbsp;&nbsp;&nbsp; atlctrlw.h</font></td>\r
+    <td width="358"><font face="Arial" size="2">command bar class</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="136"><font face="Arial" size="2">&nbsp;&nbsp;&nbsp; atlctrlx.h</font></td>\r
+    <td width="358"><font face="Arial" size="2">bitmap button, check list view, \r
+    and other controls</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="136"><font face="Arial" size="2">&nbsp;&nbsp;&nbsp; atlddx.h</font></td>\r
+    <td width="358"><font face="Arial" size="2">data exchange for dialogs and \r
+    windows</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="136"><font face="Arial" size="2">&nbsp;&nbsp;&nbsp; atldlgs.h</font></td>\r
+    <td width="358"><font face="Arial" size="2">common dialog classes, property \r
+    sheet and page classes</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="136"><font face="Arial" size="2">&nbsp;&nbsp;&nbsp; atlfind.h</font></td>\r
+    <td width="358"><font face="Arial" size="2">Find/Replace support for Edit \r
+       and RichEdit</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="136"><font face="Arial" size="2">&nbsp;&nbsp;&nbsp; atlframe.h</font></td>\r
+    <td width="358"><font face="Arial" size="2">frame window classes, MDI, \r
+    update UI classes</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="136"><font face="Arial" size="2">&nbsp;&nbsp;&nbsp; atlgdi.h</font></td>\r
+    <td width="358"><font face="Arial" size="2">DC classes, GDI object classes</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="136"><font face="Arial" size="2">&nbsp;&nbsp;&nbsp; atlmisc.h</font></td>\r
+    <td width="358"><font face="Arial" size="2">WTL ports of CPoint, CRect, \r
+    CSize, CString, etc.</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="136"><font face="Arial" size="2">&nbsp;&nbsp;&nbsp; atlprint.h</font></td>\r
+    <td width="358"><font face="Arial" size="2">printing and print preview</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="136"><font face="Arial" size="2">&nbsp;&nbsp;&nbsp; atlres.h</font></td>\r
+    <td width="358"><font face="Arial" size="2">standard resource IDs</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="136"><font face="Arial" size="2">&nbsp;&nbsp;&nbsp; atlresce.h</font></td>\r
+    <td width="358"><font face="Arial" size="2">standard resource IDs for \r
+    Windows CE</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="136"><font face="Arial" size="2">&nbsp;&nbsp;&nbsp; atlscrl.h</font></td>\r
+    <td width="358"><font face="Arial" size="2">scrollable windows</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="136"><font face="Arial" size="2">&nbsp;&nbsp;&nbsp; atlsplit.h</font></td>\r
+    <td width="358"><font face="Arial" size="2">splitter windows</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="136"><font face="Arial" size="2">&nbsp;&nbsp;&nbsp; atltheme.h</font></td>\r
+    <td width="358"><font face="Arial" size="2">Windows XP theme classes</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="136"><font face="Arial" size="2">&nbsp;&nbsp;&nbsp; atluser.h</font></td>\r
+    <td width="358"><font face="Arial" size="2">menu class, USER object classes</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="136"><font face="Arial" size="2">&nbsp;&nbsp;&nbsp; atlwince.h</font></td>\r
+    <td width="358"><font face="Arial" size="2">specific support for Windows CE \r
+       Mobile platforms</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="136"><font face="Arial" size="2">&nbsp;&nbsp;&nbsp; atlwinx.h</font></td>\r
+    <td width="358"><font face="Arial" size="2">extensions of ATL windowing \r
+    support</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="494" colspan="2">&nbsp;</td>\r
+  </tr>\r
+  <tr>\r
+    <td width="494" colspan="2"><font face="Arial" size="2">Samples\</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="136"><font face="Arial" size="2">&nbsp;&nbsp;&nbsp; Aero\...</font></td>\r
+    <td width="358"><font face="Arial" size="2">Vista Aero glass showcase</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="136"><font face="Arial" size="2">&nbsp;&nbsp;&nbsp; Alpha\...</font></td>\r
+    <td width="358"><font face="Arial" size="2">Windows XP 32-bit (alpha) \r
+    toolbar images</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="136"><font face="Arial" size="2">&nbsp;&nbsp;&nbsp; BmpView\...</font></td>\r
+    <td width="358"><font face="Arial" size="2">bitmap file view sample</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="136"><font face="Arial" size="2">&nbsp;&nbsp;&nbsp; GuidGen\...</font></td>\r
+    <td width="358"><font face="Arial" size="2">WTL version of the GuidGen \r
+    sample</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="136"><font face="Arial" size="2">&nbsp;&nbsp;&nbsp; ImageView\...</font></td>\r
+    <td width="358"><font face="Arial" size="2">Full-featured PPC frame-view \r
+       application</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="136"><font face="Arial" size="2">&nbsp;&nbsp;&nbsp; MDIDocVw\...</font></td>\r
+    <td width="358"><font face="Arial" size="2">WTL version of the MDI sample</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="136"><font face="Arial" size="2">&nbsp;&nbsp;&nbsp; MiniPie\...</font></td>\r
+    <td width="358" class="style2">p<font size="2">ort of the SDK sample for \r
+       Mobile devices</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="136"><font face="Arial" size="2">&nbsp;&nbsp;&nbsp; MTPad\...</font></td>\r
+    <td width="358"><font face="Arial" size="2">multithreaded notepad sample</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="136"><font face="Arial" size="2">&nbsp;&nbsp;&nbsp; SPControls\...</font></td>\r
+    <td width="358"><font face="Arial" size="2">Barebone SmartPhone dialog \r
+       application</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="136"><font face="Arial" size="2">&nbsp;&nbsp;&nbsp; TabBrowser\...</font></td>\r
+    <td width="358"><font face="Arial" size="2">Web browser using TabView</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="136"><font face="Arial" size="2">&nbsp;&nbsp;&nbsp; Wizard97Test\...</font></td>\r
+    <td width="358"><font face="Arial" size="2">Wizard97 showcase \r
+    sample</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="136"><font face="Arial" size="2">&nbsp;&nbsp;&nbsp; WTLExplorer\...</font></td>\r
+    <td width="358"><font face="Arial" size="2">Explorer-like application \r
+    sample</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="494" colspan="2">&nbsp;</td>\r
+  </tr>\r
+       <tr>\r
+    <td width="494" colspan="2"><font face="Arial" size="2">AppWiz\</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="136"><font face="Arial" size="2">&nbsp;&nbsp;&nbsp; setup70.js</font></td>\r
+    <td width="358"><font face="Arial" size="2">AppWizard setup program for VC++ \r
+    .NET 2002</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="136"><font face="Arial" size="2">&nbsp;&nbsp;&nbsp; setup71.js</font></td>\r
+    <td width="358"><font face="Arial" size="2">AppWizard setup program for VC++ \r
+    .NET 2003</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="136"><font face="Arial" size="2">&nbsp;&nbsp;&nbsp; setup80.js</font></td>\r
+    <td width="358"><font face="Arial" size="2">AppWizard setup program for VC++ \r
+    2005</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="136"><font face="Arial" size="2">&nbsp;&nbsp;&nbsp; setup80x.js</font></td>\r
+    <td width="358"><font face="Arial" size="2">AppWizard setup program for VC++ \r
+    2005 Express</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="136"><font face="Arial" size="2">&nbsp;&nbsp;&nbsp; Files\...</font></td>\r
+    <td width="358"><font face="Arial" size="2">WTL AppWizard for VC++ .NET 2002 and \r
+    2003 files</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="494" colspan="2">&nbsp;</td>\r
+  </tr>\r
+       <tr>\r
+    <td width="494" colspan="2"><font face="Arial" size="2">AppWizCE\</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="136"><font face="Arial" size="2">&nbsp;&nbsp;&nbsp; setup80.js</font></td>\r
+    <td width="358"><font face="Arial" size="2">AppWizard setup program for VC++ \r
+    2005</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="136"><font face="Arial" size="2">&nbsp;&nbsp;&nbsp; Files\...</font></td>\r
+    <td width="358"><font face="Arial" size="2">WTL AppWizard for VC++ 2005 files</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="494" colspan="2">&nbsp;</td>\r
+  </tr>\r
+  <tr>\r
+    <td width="494" colspan="2"><font face="Arial" size="2">AppWizMobile\</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="136"><font face="Arial" size="2">&nbsp;&nbsp;&nbsp; setup80.js</font></td>\r
+    <td width="358"><font face="Arial" size="2">AppWizard Mobile setup program for VC++ \r
+    2005</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="136"><font face="Arial" size="2">&nbsp;&nbsp;&nbsp; Files\...</font></td>\r
+    <td width="358"><font face="Arial" size="2">WTL AppWizard Mobile for VC++ 2005 files</font></td>\r
+  </tr>\r
+  </table>\r
+<p style=margin:0in>&nbsp;</p>\r
+<p style=margin:0in>&nbsp;</p>\r
+<p style=margin:0in><font face="Arial">\r
+<b><a name="Class Overview"></a>Class Overview</b></font></p>\r
+<p style=margin:0in>&nbsp;</p>\r
+<table border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" id="AutoNumber4">\r
+  <tr>\r
+    <td><font face="Arial" size="2">usage:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\r
+    </font></td>\r
+    <td><font face="Arial" size="2"><b>mi base</b></font></td>\r
+    <td>&nbsp;&nbsp; -</td>\r
+    <td><font face="Arial" size="2">&nbsp;&nbsp; a base class (multiple \r
+    inheritance)</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td>&nbsp;</td>\r
+    <td><font face="Arial" size="2"><b>client</b></font></td>\r
+    <td>&nbsp;&nbsp; -</td>\r
+    <td><font face="Arial" size="2">&nbsp;&nbsp; wrapper class for a handle</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td>&nbsp;</td>\r
+    <td><font face="Arial" size="2"><b>as-is</b></font></td>\r
+    <td>&nbsp;&nbsp; -</td>\r
+    <td><font face="Arial" size="2">&nbsp;&nbsp; to be used directly</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td>&nbsp;</td>\r
+    <td><font face="Arial" size="2"><b>impl</b></font></td>\r
+    <td>&nbsp;&nbsp; -</td>\r
+    <td><font face="Arial" size="2">&nbsp;&nbsp; implements a window (has \r
+    WindowProc) or other support</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td>&nbsp;</td>\r
+    <td><font face="Arial" size="2"><b>helper</b></font></td>\r
+    <td>&nbsp;&nbsp; -</td>\r
+    <td><font face="Arial" size="2">&nbsp;&nbsp; a helper class</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td>&nbsp;</td>\r
+    <td><font face="Arial" size="2"><b>base</b></font></td>\r
+    <td>&nbsp;&nbsp; -</td>\r
+    <td><font face="Arial" size="2">&nbsp;&nbsp; implementation base class</font></td>\r
+  </tr>\r
+</table>\r
+<p style=margin:0in>&nbsp;</p>\r
+<table border="1" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" id="AutoNumber1" width="600">\r
+  <tr>\r
+    <td width="220"><b><font face="Arial" size="2">class name:</font></b></td>\r
+    <td width="114"><b><font face="Arial" size="2">usage:</font></b></td>\r
+    <td width="253"><b><font face="Arial" size="2">description:</font></b></td>\r
+  </tr>\r
+  <tr>\r
+    <td colspan="3" width="593"><font size="2" face="Arial"><br>App/module support</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CAppModule</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">as-is</font></td>\r
+    <td width="255"><font face="Arial" size="2">app support, CComModule derived</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CServerAppModule</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">as-is</font></td>\r
+    <td width="255"><font face="Arial" size="2">module for COM servers</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CMessageLoop</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">as-is</font></td>\r
+    <td width="255"><font face="Arial" size="2">message loop</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CMessageFilter</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">mi base</font></td>\r
+    <td width="255"><font face="Arial" size="2">message filter interface</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CIdleHandler</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">mi base</font></td>\r
+    <td width="255"><font face="Arial" size="2">idle time handler interface</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td colspan="3" width="593"><font face="Arial" size="2"><br>Frame windows</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CFrameWindowImplBase</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">base</font></td>\r
+    <td width="255"><font face="Arial" size="2">&nbsp;</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CFrameWindowImpl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">impl</font></td>\r
+    <td width="255"><font face="Arial" size="2">frame window support</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">COwnerDraw</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">impl mi base</font></td>\r
+    <td width="255"><font face="Arial" size="2">owner-draw msg map and handlers</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CDialogResize</font>\r
+    </b></td>\r
+    <td width="115"><font face="Arial" size="2">impl mi base</font></td>\r
+    <td width="255"><font face="Arial" size="2">support for resizing dialogs</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CDoubleBufferImpl</font>\r
+    </b></td>\r
+    <td width="115"><font face="Arial" size="2">impl mi</font></td>\r
+    <td width="255"><font face="Arial" size="2">double-buffer painting support</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CDoubleBufferWindowImpl</font>\r
+    </b></td>\r
+    <td width="115"><font face="Arial" size="2">impl</font></td>\r
+    <td width="255"><font face="Arial" size="2">double-buffer painting window</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td colspan="3" width="593"><font face="Arial" size="2"><br>MDI windows</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CMDIWindow</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">MDI methods</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CMDIFrameWindowImpl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">impl</font></td>\r
+    <td width="255"><font face="Arial" size="2">MDI frame window</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CMDIChildWindowImpl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">impl</font></td>\r
+    <td width="255"><font face="Arial" size="2">MDI child window</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td colspan="3" width="593"><font face="Arial" size="2"><br>Update UI</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CUpdateUIBase</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">base</font></td>\r
+    <td width="255"><font face="Arial" size="2">&nbsp;</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CUpdateUI</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">mi base class</font></td>\r
+    <td width="255"><font face="Arial" size="2">provides support for UI update</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CDynamicUpdateUI</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">mi base class</font></td>\r
+    <td width="255"><font face="Arial" size="2">provides dynamic support for UI update</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td colspan="3" width="593"><font face="Arial" size="2"><br>Standard controls</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CStatic</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">static ctrl</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CButton</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">button ctrl</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CListBox</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">list box ctrl</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CComboBox</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">combo box ctrl</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CEdit</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">edit ctrl</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CEditCommands</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">mi</font></td>\r
+    <td width="255"><font face="Arial" size="2">standard edit command support</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CScrollBar</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">scroll bar ctrl</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td colspan="3" width="593"><font face="Arial" size="2"><br>Common controls</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CImageList</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">image list</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CListViewCtrl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">list view ctrl</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CTreeViewCtrl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">tree view ctrl</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CTreeItem</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">helper</font></td>\r
+    <td width="255"><font face="Arial" size="2">&nbsp;</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CTreeViewCtrlEx</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">uses CTreeItem</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CHeaderCtrl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">header bar ctrl</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CToolBarCtrl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">toolbar ctrl</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CStatusBarCtrl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">status bar ctrl</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CTabCtrl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">tab ctrl</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CToolTipCtrl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">tool tip ctrl</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CToolInfo</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">helper</font></td>\r
+    <td width="255"><font face="Arial" size="2">&nbsp;</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CTrackBarCtrl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">trackbar ctrl</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CUpDownCtrl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">up-down ctrl</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CProgressBarCtrl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">progress bar ctrl</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CHotKeyCtrl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">hot key ctrl</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CAnimateCtrl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">animation ctrl</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CRichEditCtrl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">rich edit ctrl</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CRichEditCommands</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">mi</font></td>\r
+    <td width="255"><font face="Arial" size="2">std rich edit commands support</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CDragListBox</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">drag list box</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CDragListNotifyImpl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">impl mi class</font></td>\r
+    <td width="255"><font face="Arial" size="2">support for notifications</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CReBarCtrl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">rebar ctrl</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CComboBoxEx</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">extended combo box</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CDateTimePickerCtrl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">date-time ctrl</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CFlatScrollBarImpl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">mi impl</font></td>\r
+    <td width="255"><font face="Arial" size="2">flat scroll bars support</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CFlatScrollBar</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">as-is</font></td>\r
+    <td width="255"><font face="Arial" size="2">flat scroll bars support</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CIPAddressCtrl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">IP address ctrl</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CMonthCalendarCtrl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">month calendar ctrl</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CCustomDraw</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">impl mi class</font></td>\r
+    <td width="255"><font face="Arial" size="2">custom draw handling support</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td colspan="3" width="593"><font face="Arial" size="2"><br>Windows CE controls</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CCECommandBarCtrl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">command bar ctrl</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CCECommandBandsCtrl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">command bands ctrl</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td colspan="3" width="593"><font face="Arial" size="2"><br>Property sheet &amp; page</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CPropertySheetWindow</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">&nbsp;</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CPropertySheetImpl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">impl</font></td>\r
+    <td width="255"><font face="Arial" size="2">property sheet </font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CPropertySheet</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">as-is</font></td>\r
+    <td width="255"><font face="Arial" size="2">&nbsp;</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CPropertyPageWindow</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">&nbsp;</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CPropertyPageImpl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">impl</font></td>\r
+    <td width="255"><font face="Arial" size="2">property page</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CPropertyPage</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">as-is</font></td>\r
+    <td width="255"><font face="Arial" size="2">&nbsp;</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CAxPropertyPageImpl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">impl</font></td>\r
+    <td width="255"><font face="Arial" size="2">property page with ActiveX</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CAxPropertyPage</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">as-is</font></td>\r
+    <td width="255"><font face="Arial" size="2">&nbsp;</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CWizard97SheetWindow</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">&nbsp;</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CWizard97SheetImpl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">impl</font></td>\r
+    <td width="255"><font face="Arial" size="2">Wizard97 property sheet</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CWizard97Sheet</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">as-is</font></td>\r
+    <td width="255"><font face="Arial" size="2">&nbsp;</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CWizard97PageWindow</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">&nbsp;</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CWizard97PageImpl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">impl</font></td>\r
+    <td width="255"><font face="Arial" size="2">Wizard97 property page</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CWizard97ExteriorPageImpl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">impl</font></td>\r
+    <td width="255"><font face="Arial" size="2">Wizard97 exterior page</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CWizard97InteriorPageImpl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">impl</font></td>\r
+    <td width="255"><font face="Arial" size="2">Wizard97 interior page</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CAeroWizardFrameWindow</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">&nbsp;</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CAeroWizardFrameImpl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">impl</font></td>\r
+    <td width="255"><font face="Arial" size="2">Aero Wizard frame</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CAeroWizardFrame</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">as-is</font></td>\r
+    <td width="255"><font face="Arial" size="2">&nbsp;</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CAeroWizardPageWindow</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">&nbsp;</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CAeroWizardPageImpl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">impl</font></td>\r
+    <td width="255"><font face="Arial" size="2">Aero Wizard page</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CAeroWizardPage</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">as-is</font></td>\r
+    <td width="255"><font face="Arial" size="2">&nbsp;</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CAeroWizardAxPageImpl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">impl</font></td>\r
+    <td width="255"><font face="Arial" size="2">Aero Wizard page with ActiveX</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CAeroWizardAxPage</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">as-is</font></td>\r
+    <td width="255"><font face="Arial" size="2">&nbsp;</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td colspan="3" width="593"><font face="Arial" size="2"><br>Common dialogs</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CFileDialogImpl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">impl</font></td>\r
+    <td width="255"><font face="Arial" size="2">GetOpenFileName/GetSaveFileName</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CFileDialog</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">as-is</font></td>\r
+    <td width="255"><font face="Arial" size="2">&nbsp;</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CMultiFileDialogImpl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">impl</font></td>\r
+    <td width="255"><font face="Arial" size="2">Multi-select GetOpenFileName</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CMultiFileDialog</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">as-is</font></td>\r
+    <td width="255"><font face="Arial" size="2">&nbsp;</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CShellFileDialogImpl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">base</font></td>\r
+    <td width="255"><font face="Arial" size="2">&nbsp;</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CShellFileOpenDialogImpl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">impl</font></td>\r
+    <td width="255"><font face="Arial" size="2">Shell File Open dialog</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CShellFileOpenDialog</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">as-is</font></td>\r
+    <td width="255"><font face="Arial" size="2">&nbsp;</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CShellFileSaveDialogImpl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">impl</font></td>\r
+    <td width="255"><font face="Arial" size="2">Shell File Save dialog</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CShellFileSaveDialog</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">as-is</font></td>\r
+    <td width="255"><font face="Arial" size="2">&nbsp;</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CFolderDialogImpl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">impl</font></td>\r
+    <td width="255"><font face="Arial" size="2">directory picker</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CFolderDialog</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">as-is</font></td>\r
+    <td width="255"><font face="Arial" size="2">&nbsp;</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CFontDialogImpl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">impl</font></td>\r
+    <td width="255"><font face="Arial" size="2">ChooseFont common dialog</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CFontDialog</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">as-is</font></td>\r
+    <td width="255"><font face="Arial" size="2">&nbsp;</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CRichEditFontDialogImpl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">impl</font></td>\r
+    <td width="255"><font face="Arial" size="2">ChooseFont for rich edit</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CRichEditFontDialog</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">as-is</font></td>\r
+    <td width="255"><font face="Arial" size="2">&nbsp;</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CColorDialogImpl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">impl</font></td>\r
+    <td width="255"><font face="Arial" size="2">ChooseColor common dialog</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CColorDialog</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">as-is</font></td>\r
+    <td width="255"><font face="Arial" size="2">&nbsp;</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CPrintDialogImpl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">impl</font></td>\r
+    <td width="255"><font face="Arial" size="2">PrintDlg common dialog</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CPrintDialog</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">as-is</font></td>\r
+    <td width="255"><font face="Arial" size="2">&nbsp;</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CPrintDialogExImpl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">impl</font></td>\r
+    <td width="255"><font face="Arial" size="2">new Win2000 print dialog</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CPrintDialogEx</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">as-is</font></td>\r
+    <td width="255"><font face="Arial" size="2">&nbsp;</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CPageSetupDialogImpl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">impl</font></td>\r
+    <td width="255"><font face="Arial" size="2">PageSetupDlg common dialog</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CPageSetupDialog</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">as-is</font></td>\r
+    <td width="255"><font face="Arial" size="2">&nbsp;</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CFindReplaceDialogImpl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">impl</font></td>\r
+    <td width="255"><font face="Arial" size="2">FindText/ReplaceText</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CFindReplaceDialog</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">as-is</font></td>\r
+    <td width="255"><font face="Arial" size="2">&nbsp;</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td colspan="3" width="593"><font face="Arial" size="2"><br>User support</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CMenu</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">menu support</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CMenuItemInfo</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">as-is</font></td>\r
+    <td width="255"><font face="Arial" size="2">MENUITEMINFO wrapper</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CAccelerator</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">accelerator table</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CIcon</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">icon object</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CCursor</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">cursor object</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CResource</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">generic resource object</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td colspan="3" width="593"><font face="Arial" size="2"><br>GDI support</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CDC</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">DC support</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CPaintDC</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">for handling WM_PAINT</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CClientDC</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">for GetDC</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CWindowDC</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">for GetWindowDC</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CMemoryDC</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">in-memory DC</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CPen</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">GDI pen object</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CBrush</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">GDI brush object</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CLogFont</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">as-is</font></td>\r
+    <td width="255"><font face="Arial" size="2">LOGFONT wrapper</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CFont</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">GDI font object</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CBitmap</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">GDI bitmap object</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CPalette</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">GDI palette object</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CRgn</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">GDI region object</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td colspan="3" width="593"><font face="Arial" size="2"><br>Enhanced controls</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CCommandBarCtrlImpl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">impl</font></td>\r
+    <td width="255"><font face="Arial" size="2">command bar</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CCommandBarCtrl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">as-is</font></td>\r
+    <td width="255"><font face="Arial" size="2">&nbsp;</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CBitmapButtonImpl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">impl</font></td>\r
+    <td width="255"><font face="Arial" size="2">bitmap button</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CBitmapButton</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">as-is</font></td>\r
+    <td width="255"><font face="Arial" size="2">&nbsp;</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CCheckListViewCtrlImpl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">impl</font></td>\r
+    <td width="255"><font face="Arial" size="2">check list box</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CCheckListViewCtrl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">as-is</font></td>\r
+    <td width="255"><font face="Arial" size="2">&nbsp;</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CHyperLinkImpl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">impl</font></td>\r
+    <td width="255"><font face="Arial" size="2">hyper link control</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CHyperLink</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">as-is</font></td>\r
+    <td width="255"><font face="Arial" size="2">&nbsp;</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CWaitCursor</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">as-is</font></td>\r
+    <td width="255"><font face="Arial" size="2">wait cursor</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CCustomWaitCursor</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">as-is</font></td>\r
+    <td width="255"><font face="Arial" size="2">custom and animated wait cursor</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CMultiPaneStatusBarCtrlImpl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">impl</font></td>\r
+    <td width="255"><font face="Arial" size="2">status bar with multiple panes</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CMultiPaneStatusBarCtrl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">as-is</font></td>\r
+    <td width="255"><font face="Arial" size="2">&nbsp;</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CPaneContainerImpl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">impl</font></td>\r
+    <td width="255"><font face="Arial" size="2">pane window container</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CPaneContainer</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">as-is</font></td>\r
+    <td width="255"><font face="Arial" size="2">&nbsp;</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CSortListViewImpl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">impl</font></td>\r
+    <td width="255"><font face="Arial" size="2">sorting list view control</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CSortListViewCtrlImpl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">impl</font></td>\r
+    <td width="255"><font face="Arial" size="2">&nbsp;</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CSortListViewCtrl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">as-is</font></td>\r
+    <td width="255"><font face="Arial" size="2">&nbsp;</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CTabViewImpl;</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">impl</font></td>\r
+    <td width="255"><font face="Arial" size="2">tab view window</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CTabView</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">as-is</font></td>\r
+    <td width="255"><font face="Arial" size="2">&nbsp;</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td colspan="3" width="593"><font face="Arial" size="2"><br>Scrolling window support</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CScrollImpl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">impl mi</font></td>\r
+    <td width="255"><font face="Arial" size="2">scrolling support</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CScrollWindowImpl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">impl</font></td>\r
+    <td width="255"><font face="Arial" size="2">scrollable window</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CMapScrollImpl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">impl mi</font></td>\r
+    <td width="255"><font face="Arial" size="2">scrolling support with map modes</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CMapScrollWindowImpl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">impl</font></td>\r
+    <td width="255"><font face="Arial" size="2">scrollable window with map modes</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CZoomScrollImpl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">impl mi</font></td>\r
+    <td width="255"><font face="Arial" size="2">zooming support</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CZoomScrollWindowImpl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">impl</font></td>\r
+    <td width="255"><font face="Arial" size="2">zooming window</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CScrollContainerImpl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">impl</font></td>\r
+    <td width="255"><font face="Arial" size="2">scroll container window</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CScrollContainer</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">as-is</font></td>\r
+    <td width="255"><font face="Arial" size="2">&nbsp;</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td colspan="3" width="593"><font face="Arial" size="2"><br>Splitter window support</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CSplitterImpl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">impl mi</font></td>\r
+    <td width="255"><font face="Arial" size="2">splitter support</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CSplitterWindowImpl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">impl</font></td>\r
+    <td width="255"><font face="Arial" size="2">splitter window</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CSplitterWindow</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">as-is</font></td>\r
+    <td width="255"><font face="Arial" size="2">&nbsp;</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td colspan="3" width="593"><font face="Arial" size="2"><br>Theming support</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CTheme</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">Windows XP theme</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CThemeImpl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">impl</font></td>\r
+    <td width="255"><font face="Arial" size="2">theming support for a window</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td colspan="3" width="593"><font face="Arial" size="2"><br>Buffered paint and animation support</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CBufferedPaint</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">as-is</font></td>\r
+    <td width="255"><font face="Arial" size="2">buffered paint</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CBufferedPaintImpl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">impl mi</font></td>\r
+    <td width="255"><font face="Arial" size="2">buffered paint support</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CBufferedPaintWindowImpl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">impl</font></td>\r
+    <td width="255"><font face="Arial" size="2">window with buffered paint</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CBufferedAnimation</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">as-is</font></td>\r
+    <td width="255" class="style2">b<font size="2">uffered animation</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CBufferedAnimationImpl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">impl mi</font></td>\r
+    <td width="255"><font face="Arial" size="2">buffered animation support</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CBufferedAnimationWindowImpl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">impl</font></td>\r
+    <td width="255"><font face="Arial" size="2">window with buffered animation</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td colspan="3" width="593"><font face="Arial" size="2"><br>Edit and RichEdit Find/Replace support</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CEditFindReplaceImplBase</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">base</font></td>\r
+    <td width="255" class="style2">&nbsp;</td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CEditFindReplaceImpl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">mi</font></td>\r
+    <td width="255"><font face="Arial" size="2">Edit Find/Replace support</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CRichEditFindReplaceImpl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">mi</font></td>\r
+    <td width="255" class="style2"><font face="Arial" size="2">RichEdit Find/Replace support</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td colspan="3" width="593"><font face="Arial" size="2"><br>Printing support</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CPrinterInfo</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">as-is</font></td>\r
+    <td width="255"><font face="Arial" size="2">print info support</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CPrinter</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">printer handle wrapper</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CDevMode</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">DEVMODE wrapper</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CPrinterDC</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">printing DC support</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CPrintJobInfo</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">print job info</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CPrintJob</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">print job support</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CPrintPreview</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">mi</font></td>\r
+    <td width="255"><font face="Arial" size="2">print preview support</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CPrintPreviewWindowImpl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">impl</font></td>\r
+    <td width="255"><font face="Arial" size="2">print preview window</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CPrintPreviewWindow</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">as-is</font></td>\r
+    <td width="255"><font face="Arial" size="2">&nbsp;</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CZoomPrintPreviewWindowImpl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">impl</font></td>\r
+    <td width="255"><font face="Arial" size="2">zooming print preview window</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CZoomPrintPreviewWindow</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">as-is</font></td>\r
+    <td width="255"><font face="Arial" size="2">&nbsp;</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td colspan="3" width="593"><font face="Arial" size="2"><br>Miscellaneous</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CSize</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">as-is</font></td>\r
+    <td width="255"><font face="Arial" size="2">WTL port of MFC's CSize</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CPoint</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">as-is</font></td>\r
+    <td width="255"><font face="Arial" size="2">WTL port of MFC's CPoint</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CRect</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">as-is</font></td>\r
+    <td width="255"><font face="Arial" size="2">WTL port of MFC's CRect</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CString</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">as-is</font></td>\r
+    <td width="255"><font face="Arial" size="2">WTL port of MFC's CString</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CWinDataExchange</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">mi</font></td>\r
+    <td width="255"><font face="Arial" size="2">data exchange for controls</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CRecentDocumentList</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">mi or as-is</font></td>\r
+    <td width="255"><font face="Arial" size="2">support for MRU list</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CFindFile</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">as-is</font></td>\r
+    <td width="255"><font face="Arial" size="2">file search support</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td colspan="3" width="593"><font face="Arial" size="2"><br>In-memory dialog</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CMemDlgTemplate</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">as-is</font></td>\r
+    <td width="255"><font face="Arial" size="2">In-memory dialog template</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CIndirectDialogImpl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">impl</font></td>\r
+    <td width="255"><font face="Arial" size="2">In-memory dialog class</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td colspan="3" width="593"><font face="Arial" size="2"><br>Task dialog</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CTaskDialogImpl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">impl</font></td>\r
+    <td width="255"><font face="Arial" size="2">Task Dialog in Vista</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CTaskDialog</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">as-is</font></td>\r
+    <td width="255"><font face="Arial" size="2">&nbsp;</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td colspan="3" width="593"><font face="Arial" size="2"><br>Windows CE support</font></td>\r
+  </tr>\r
+  <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CStdDialogBase</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">base</font></td>\r
+    <td width="255"><font face="Arial" size="2">standard dialog base class</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CStdDialogImpl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">impl</font></td>\r
+    <td width="255"><font face="Arial" size="2">standard dialog implementation</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CStdSimpleDialog</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">as-is</font></td>\r
+    <td width="255"><font face="Arial" size="2">standard simple dialog</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CStdDialogResizeBase</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">base</font></td>\r
+    <td width="255"><font face="Arial" size="2">orientation aware standard dialog base class</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CStdDialogResizeImpl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">impl</font></td>\r
+    <td width="255"><font face="Arial" size="2">orientation aware standard dialog implementation</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CStdSimpleDialogResizeImpl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">impl</font></td>\r
+    <td width="255"><font face="Arial" size="2">standard resizing simple dialog implementation</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CStdOrientedDialogBase</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">base</font></td>\r
+    <td width="255"><font face="Arial" size="2">oriented dialog base class</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CStdOrientedDialogImpl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">impl</font></td>\r
+    <td width="255"><font face="Arial" size="2">oriented dialog implementation</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CStdSimpleOrientedDialog</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">as-is</font></td>\r
+    <td width="255"><font face="Arial" size="2">standard simple oriented dialog</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CAppInfoBase</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">base</font></td>\r
+    <td width="255"><font face="Arial" size="2">application state save/restore to registry</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CAppInfoT</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">impl</font></td>\r
+    <td width="255"><font face="Arial" size="2">CAppInfoBase constructed from a CAppWindow&lt;T&gt;</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CAppWindow&lt;&gt;</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">mi</font></td>\r
+    <td width="255"><font face="Arial" size="2">PPC/SmartPhone well-behaved application window class</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CAppDialog</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">mi</font></td>\r
+    <td width="255"><font face="Arial" size="2">PPC/SmartPhone well-behaved application non-modal dialog class</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CAppStdDialogImpl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">impl</font></td>\r
+    <td width="255"><font face="Arial" size="2">PPC/SmartPhone implementation of non-modal standard dialog application</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CFullScreenFrame</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">impl</font></td>\r
+    <td width="255"><font face="Arial" size="2">Full screen frame class</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CZoomScrollImpl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">mi</font></td>\r
+    <td width="255"><font face="Arial" size="2">WinCE zooming implementation</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CHtmlCtrl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">HTML control</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CRichInkCtrl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">RichInk control</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CInkXCtrl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">InkX control</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CVoiceRecorderCtrl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">VoiceRecorder control</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CDocListCtrl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">DocList control</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CCapEdit</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">CapEdit control</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CTTStatic</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">TT Static control</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CTTButton</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">TT Button control</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CSpinCtrl</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">Spin control</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CSpinListBox</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">Spin List Box control</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CExpandListBox</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">Expand List Box control</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CExpandEdit</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">Expand Edit control</font></td>\r
+  </tr>\r
+       <tr>\r
+    <td width="221"><b><font face="Arial" size="2">CExpandCapEdit</font></b></td>\r
+    <td width="115"><font face="Arial" size="2">client</font></td>\r
+    <td width="255"><font face="Arial" size="2">Expand CapEdit control</font></td>\r
+  </tr>\r
+</table>\r
+<p style=margin:0in>&nbsp;</p>\r
+<p style=margin:0in>&nbsp;</p>\r
+<p style=margin:0in><font face="Arial">\r
+<b><a name="ATL/WTL AppWizard"></a>ATL/WTL AppWizard</b></font></p>\r
+<p style=margin:0in>&nbsp;</p>\r
+<p style=margin:0in><font face="Arial" size="2">ATL/WTL AppWizard generates starting code for a \r
+WTL application. It has options to create code for different application types and features.</font></p>\r
+<p style=margin:0in>&nbsp;</p>\r
+<p style=margin:0in><font face="Arial" size="2">You can choose the following options:</font></p>\r
+<ul style='margin-top:0in;margin-bottom:0in'>\r
+  <li><font face="Arial" size="2">Application type (SDI, multi thread SDI, MDI, \r
+  TabView, Explorer, dialog based)</font></li>\r
+  <li><font face="Arial" size="2">Support for hosting ActiveX controls</font></li>\r
+  <li><font face="Arial" size="2">COM server support</font></li>\r
+  <li><font face="Arial" size="2">Class implementation in .CPP files</font></li>\r
+  <li><font face="Arial" size="2">Common Control manifest</font></li>\r
+       <li class="style2">U<font size="2">nicode character set</font></li>\r
+  <li><font face="Arial" size="2">Toolbar, rebar, command bar, status bar</font></li>\r
+  <li><font face="Arial" size="2">View window, and it's type (generic, dialog \r
+  based form, or a list box, edit, list view, tree view, rich edit based, HTML \r
+  page, scroll window)</font></li>\r
+  <li><font face="Arial" size="2">For dialog based apps or a form based view \r
+  window - support for hosting ActiveX controls in the dialog</font></li>\r
+</ul>\r
+<p style=margin:0in>&nbsp;</p>\r
+<p style=margin:0in><font face="Arial" size="2">ATL/WTL AppWizard supports VC++ \r
+.NET 2002 and 2003,and VC++ 2005.</font></p>\r
+<p style=margin:0in>&nbsp;</p>\r
+<p style=margin:0in>&nbsp;</p>\r
+<p style=margin:0in><b><font face="Arial">\r
+<a name="Support for Windows CE"></a>Support for \r
+Windows CE</font></b></p>\r
+<p style=margin:0in>&nbsp;</p>\r
+<p style=margin:0in><font face="Arial" size="2">WTL now fully supports building \r
+projects for the Windows CE platforms. This initial support for Windows CE was implemented primarily for \r
+eMbedded Visual C++ 4.0 with Pocket PC 2003 and \r
+SmartPhone 2003 SDKs. However, it can be used with other versions and \r
+configurations. For instance, Standard SDK 4.1 or 5.0 is supported as well. Considerable effort was made to provide the best Windows CE support, \r
+however, there might be some limitations because different platforms provide different \r
+programming support. SmartDevice projects with Visual Studio 2005 are also \r
+supported, and it also includes an AppWizard for VS2005.</font></p>\r
+<p style=margin:0in>&nbsp;</p>\r
+<p style=margin:0in><font face="Arial" size="2">The support for Windows CE was \r
+not designed to port projects for the desktop version of Windows as-is to the \r
+Windows CE platforms, but to allow use of the same library, WTL, for both \r
+desktop Windows and Windows CE. Applications for Windows CE are often designed \r
+in a different way, and they use different platform services. WTL depends on the \r
+version of ATL provided with each Windows CE platform, and supports controls and \r
+services that are appropriate and supported for each Windows CE platform.</font></p>\r
+<p style=margin:0in>&nbsp;</p>\r
+<p style=margin:0in>&nbsp;</p>\r
+<p style=margin:0in><b><font face="Arial">\r
+<a name="Support for Visual C++ 2005 Express"></a>Support for \r
+Visual C++ 2005 Express</font></b></p>\r
+<p style=margin:0in>&nbsp;</p>\r
+<p style=margin:0in><font face="Arial" size="2">WTL 8.0 supports using Visual \r
+C++ Express Edition to build projects. Since Visual C++ 2005 Express ships without ATL, you have \r
+to use a version of ATL that ships with the Platform SDK.</font></p>\r
+<p style=margin:0in>&nbsp;</p>\r
+<p style=margin:0in><font face="Arial" size="2">The WTL App Wizard can be \r
+installed by running AppWiz\setup80x.js program. The App Wizard generates code \r
+in the stdafx.h file that allows use of ATL3 from the Platform SDK. That code is \r
+used if WTL_USE_SDK_ATL3 is defined, so you can comment the line in stdafx.h \r
+that defines WTL_USE_SDK_ATL3 to use the project with different versions of \r
+Visual C++ or ATL.</font></p>\r
+<p style=margin:0in>&nbsp;</p>\r
+<p style=margin:0in><font face="Arial" size="2">Note that Release builds will \r
+generate some warnings, since ATL3 from Platform SDK is an old version of ATL \r
+which doesn't quite match the newer compiler and CRT files. You can ignore those \r
+warnings, as they do not indicate any real problems with the code.</font></p>\r
+<p style=margin:0in>&nbsp;</p>\r
+<p style=margin:0in>&nbsp;</p>\r
+<p style=margin:0in><b><font face="Arial">\r
+<a name="Notes"></a>Notes</font></b></p>\r
+<p style=margin:0in>&nbsp;</p>\r
+<p style=margin:0in><font face="Arial" size="2"><b>~</b>&nbsp;&nbsp;&nbsp; WTL provides \r
+several classes that are also present in ATL 7.0 and 7.1. The classes are: <b>\r
+CSize</b>, <b>CPoint</b>, <b>CRect</b>, and <b>CString</b> in atlmisc.h. \r
+While their existence will not cause any problems, their usage might. You should \r
+qualify the class you want to use with a namespace to resolve ambiguity, either \r
+ATL or WTL namespace, depending on which implementation you want to use. \r
+Alternatively, you can conditionally exclude WTL implementations, by defining \r
+preprocessor symbol <b>_WTL_NO_WTYPES</b> for CSize, CPoint, and CRect; and <b>_WTL_NO_CSTRING</b> \r
+for CString.</font></p>\r
+<p style=margin:0in>&nbsp;</p>\r
+<p style=margin:0in><font face="Arial" size="2"><b>~</b>&nbsp;&nbsp;&nbsp; If \r
+you use WTL 8.0 with VC++ 6.0/ATL 3.0 and define _ATL_STATIC_REGISTRY, you'll \r
+get errors referring to the ambiguous symbol ATL. This is caused by a bug in ATL \r
+3.0 - in atlbase.h, the file statreg.h is included inside of the ATL namespace, \r
+and it contains another namespace ATL declaration. Because of that, the compiler \r
+cannot decide between ATL:: and ATL::ATL:: namespaces. The solution is either to \r
+fix the atlbase.h, or to surround atlbase.h include declaration with following \r
+statements:</font></p>\r
+<p style=margin:0in>&nbsp;</p>\r
+<p style=margin:0in><font face="Arial" size="2"><b>&nbsp;&nbsp;&nbsp; #define \r
+ATL&nbsp;&nbsp; ATLFIX</b></font></p>\r
+<p style=margin:0in><font face="Arial" size="2">&nbsp;&nbsp;&nbsp; #include &lt;atlapp.h&gt;</font></p>\r
+<p style=margin:0in><font face="Arial" size="2">\r
+<b>&nbsp;&nbsp;&nbsp; #undef ATL</b></font></p>\r
+<p style=margin:0in><font face="Arial" size="2">\r
+<b>&nbsp;&nbsp;&nbsp; namespace ATL = ::ATLFIX;</b></font></p>\r
+<p style=margin:0in>&nbsp;</p>\r
+<p style=margin:0in><font face="Arial" size="2"><b>~</b>&nbsp;&nbsp;&nbsp; \r
+Windows XP allows applications to use Common Controls version 6, which supports \r
+only Unicode applications. While WTL allows creation of Ansi applications that \r
+use Common Controls 6, that should be used only for test programs and is not \r
+recommended or supported for released projects. If you want to use Common \r
+Controls 6, build your application as Unicode.</font></p>\r
+<p style=margin:0in>&nbsp;</p>\r
+<p style=margin:0in><font face="Arial" size="2"><b>~</b>&nbsp;&nbsp;&nbsp; \r
+If you build your app that hosts ActiveX controls \r
+with VC++ 7.x, you can see this assert failing:<br>\r
+<span class="style2"><strong><br>\r
+&nbsp;&nbsp;&nbsp; !InlineIsEqualGUID(*m_plibid, GUID_NULL) &amp;&amp; &quot;Did you forget \r
+to pass the LIBID to CComModule::Init?&quot;<br>\r
+<br>\r
+</strong></span>There are two ways to fix this:</font></p>\r
+<ul>\r
+       <li>\r
+       <p style=margin:0in><span class="style2">In the main .CPP file of your \r
+       project, replace the line<br>\r
+       <strong>&nbsp;&nbsp;&nbsp; hRes = _Module.Init(NULL, hInstance);<br>\r
+       </strong>with this one<br>\r
+       <strong>&nbsp;&nbsp;&nbsp; hRes = _Module.Init(NULL, hInstance, &amp;LIBID_ATLLib);<br>\r
+&nbsp;</strong></span></p>\r
+       </li>\r
+       <li>\r
+       <p style=margin:0in><span class="style2">Compile you project with _ATL_DLL \r
+       defined (dynamic link to ATL)</span></p>\r
+       </li>\r
+</ul>\r
+<p style=margin:0in><font face="Arial" size="2"><b>~</b>&nbsp;&nbsp;&nbsp; \r
+Several of the sample programs included with WTL were extended to support \r
+building for Windows CE. These samples are not specially redesigned for Windows \r
+CE, but just modified to allow you to compile and run them on the Windows CE \r
+platforms. The samples are: BmpView, GuidGen, and MTPad.</font></p>\r
+<p style=margin:0in>&nbsp;</p>\r
+<p style=margin:0in><font face="Arial" size="2"><b>~</b>&nbsp;&nbsp;&nbsp; WTL \r
+supports building projects with EVC++ 3.0 only for Pocket PC and Pocket PC 2002 \r
+platforms, as other platforms don't provide minimum support for ATL or other \r
+required libraries.</font></p>\r
+<p style=margin:0in>&nbsp;</p>\r
+<p style=margin:0in><font face="Arial" size="2"><b>~</b>&nbsp;&nbsp;&nbsp; The \r
+old AppWizards for VC++ 6.0 and eVC++ 4.0/3.0 are not included in this version \r
+of WTL because they cannot be a part of an Open Source project. They are still \r
+available in the previous release, WTL 7.1.</font></p>\r
+<p style=margin:0in>&nbsp;</p>\r
+<p style=margin:0in>&nbsp;</p>\r
+<p style=margin:0in><b><font face="Arial">\r
+<a name="Changes Between WTL 8.0 And 7.5"></a>Changes Between WTL 8.0 And 7.5</font></b></p>\r
+<p style=margin:0in>&nbsp;</p>\r
+  <p style=margin:0in><font face="Arial" size="2">New and improved:</font></p>\r
+<blockquote style='margin-top:0in;margin-bottom:0in'>\r
+  <p style=margin:0in><font face="Arial" size="2">RunTimeHelper functions for \r
+       correct struct sizes on different versions of Windows<br>ModuleHelper functions for uniform support of ATL3 and ATL7 module classes<br>SecureHelper functions for support of secure and non-secure run-time \r
+       functions<br>Support for new Vista features:</font></p>\r
+       <ul style='margin-top:0in;margin-bottom:0in'>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">Support for new messages for common controls, dialogs, etc.</font></p>\r
+               </li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">Support for TaskDialog</font></p>\r
+               </li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">New Shell file dialogs (IFileOpenDialog and IFileSaveDialog)</font></p>\r
+               </li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">New Aero Wizard support classes</font></p>\r
+               </li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">New classes for Buffered Paint and Buffered Animation</font></p>\r
+               </li>\r
+       </ul>\r
+       <p style=margin:0in><font face="Arial" size="2">New TabView classes<br>New dialog class that uses in-memory dialog templates<br>New CMultiFileDialogImpl and CMultiFileDialog classes that support \r
+       multi-select file dialogs<br>Added message cracker handler prototypes for all handlers<br>Replaced use of _alloca with CTempBuffer everywhere (and added CTempBuffer \r
+       version for ATL3)<br>New classes for find/replace support for Edit or RichEdit<br>New class CFileDialogEx that supports GetOpenFileNameEx for Windows Mobile 5<br>\r
+       New features for the App Wizard:</font></p>\r
+       <ul style='margin-top:0in;margin-bottom:0in'>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">New default version values</font></p>\r
+               </li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">Unicode build option</font></p>\r
+               </li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">Support for TabView applications</font></p>\r
+               </li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">Support for Explorer applications</font></p>\r
+               </li>\r
+       </ul>\r
+       <p style=margin:0in><font face="Arial" size="2">Updates for the desktop App Wizard:</font></p>\r
+       <ul style='margin-top:0in;margin-bottom:0in'>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">Added calls to set font for views based on controls that use font</font></p>\r
+               </li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">Added scroll window as another view type</font></p>\r
+               </li>\r
+       </ul>\r
+       <p style=margin:0in><font face="Arial" size="2">Support for VC2005 Express:</font></p>\r
+       <ul style='margin-top:0in;margin-bottom:0in'>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">Setup for VS2005x</font></p>\r
+               </li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">Changes in default.js to take into account that VC2005x does not have a \r
+       resource editor</font></p></li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">Generated code allows use of ATL3 from the Platform SDK</font></p>\r
+               </li>\r
+       </ul>\r
+       <p style=margin:0in><font face="Arial" size="2">New AppWizard for Mobile 2003 and 2005 platforms<br>\r
+       New samples:</font></p>\r
+       <ul style='margin-top:0in;margin-bottom:0in'>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">Aero - demonstrates the \r
+               Vista Glass UI</font></p></li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">MiniPie - Windows Mobile 2005 PPC and Smartphone sample</font></p>\r
+               </li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">TabBrowser - a web browser using TabView class</font></p>\r
+               </li>\r
+       </ul>\r
+       <p style=margin:0in><font face="Arial" size="2">MTPad sample updated to show usage of CRichEditFindReplaceImpl and \r
+       CEditCommands/CRichEditComma</font></p>\r
+</blockquote>\r
+  <p style=margin:0in>&nbsp;</p>\r
+<p style=margin:0in><font face="Arial" size="2">Fixes and enhancements:</font></p>\r
+  <blockquote style='margin-top:0in;margin-bottom:0in'>\r
+  <p style=margin:0in><font face="Arial" size="2">Command Bar:</font></p>\r
+       <ul style='margin-top:0in;margin-bottom:0in'>\r
+       <li>\r
+       <p style=margin:0in><font face="Arial" size="2">Added support for menu items \r
+       with bitmaps on Vista</font></p></li>\r
+       <li>\r
+       <p style=margin:0in><font face="Arial" size="2">Fix: Keyboard cues shown \r
+       even if the window is disabled</font></p></li>\r
+       </ul>\r
+       <p style=margin:0in>&nbsp;</p>\r
+       <p style=margin:0in><font face="Arial" size="2">CFolderDialog:</font></p>\r
+       <ul style='margin-top:0in;margin-bottom:0in'>\r
+       <li>\r
+       <p style=margin:0in><font face="Arial" size="2">Added support for PIDLs in \r
+       addition to the file path</font></p></li>\r
+       <li>\r
+       <p style=margin:0in><font face="Arial" size="2">Replaced use of SHGetMalloc \r
+       with CoTaskMemFree</font></p></li>\r
+       </ul>\r
+       <p style=margin:0in>&nbsp;</p>\r
+       <p style=margin:0in><font face="Arial" size="2">Scroll Windows:</font></p>\r
+       <ul style='margin-top:0in;margin-bottom:0in'>\r
+       <li>\r
+       <p style=margin:0in><font face="Arial" size="2">Fix: CZoomScrollImpl - some \r
+       methods should be overridable</font></p></li>\r
+       <li>\r
+       <p style=margin:0in><font face="Arial" size="2">Added support for \r
+       WM_MOUSEHWHEEL in CScrollImpl</font></p></li>\r
+       </ul>\r
+       <p style=margin:0in>&nbsp;</p>\r
+       <p style=margin:0in><font face="Arial" size="2">App Wizard:</font></p>\r
+       <ul style='margin-top:0in;margin-bottom:0in'>\r
+       <li>\r
+       <p style=margin:0in><font face="Arial" size="2">Fix: AppWizard fails to add \r
+       files if C:\Temp does not exist</font></p></li>\r
+       <li>\r
+       <p style=margin:0in><font face="Arial" size="2">Fix: App Wizard generates \r
+       security warning when loaded</font></p></li>\r
+       <li>\r
+       <p style=margin:0in><font face="Arial" size="2">Fix: App Wizard generates \r
+       level 4 warning for modal dlg project</font></p></li>\r
+       <li>\r
+       <p style=margin:0in><font face="Arial" size="2">Fix: App Wizard setupXX.js \r
+       scripts silently fail on Vista</font></p></li>\r
+       <li>\r
+       <p style=margin:0in><font face="Arial" size="2">Fix: Added code to \r
+       unregister message filer and idle processing</font></p></li>\r
+       <li>\r
+       <p style=margin:0in><font face="Arial" size="2">Fix: Added WS_CLIPSIBLINGS \r
+       to dialog forms to avoid rebar drawing problems</font></p></li>\r
+       </ul>\r
+       <p style=margin:0in>&nbsp;</p>\r
+       <p style=margin:0in><font face="Arial" size="2">App Wizard CE:</font></p>\r
+       <ul style='margin-top:0in;margin-bottom:0in'>\r
+       <li>\r
+       <p style=margin:0in><font face="Arial" size="2">Fix: App Wizard CE should \r
+       not have rich edit as a view option</font></p></li>\r
+       <li>\r
+       <p style=margin:0in><font face="Arial" size="2">Fix: App Wizard CE generates \r
+       level 4 warnings for single instance apps</font></p></li>\r
+       <li>\r
+       <p style=margin:0in><font face="Arial" size="2">Added support for Windows \r
+       Mobile 6 SDKs</font></p></li>\r
+       </ul>\r
+       <p style=margin:0in>&nbsp;</p>\r
+       <p style=margin:0in><font face="Arial" size="2">Cracked Handlers:</font></p>\r
+       <ul style='margin-top:0in;margin-bottom:0in'>\r
+       <li>\r
+       <p style=margin:0in><font face="Arial" size="2">Fix: Corrected MSG_WM_TIMER \r
+       and handler prototype, removed unused argument (breaking change)</font></p>\r
+       </li>\r
+       <li>\r
+       <p style=margin:0in><font face="Arial" size="2">Fix: atlcrack.h does not \r
+       support WTL namespace</font></p></li>\r
+       </ul>\r
+       <p style=margin:0in>&nbsp;</p>\r
+       <p style=margin:0in><font face="Arial" size="2">CDialogResize:</font></p>\r
+       <ul style='margin-top:0in;margin-bottom:0in'>\r
+       <li>\r
+       <p style=margin:0in><font face="Arial" size="2">Added SetIcon(NULL, FALSE) \r
+       for CDialogResize to remove the generic icon for resizable dialogs</font></p>\r
+       </li>\r
+       <li>\r
+       <p style=margin:0in><font face="Arial" size="2">Fix: Enabled size/move for \r
+       both X and Y</font></p></li>\r
+       <li>\r
+       <p style=margin:0in><font face="Arial" size="2">Added center flags for \r
+       controls</font></p></li>\r
+       </ul>\r
+       <p style=margin:0in>&nbsp;</p>\r
+       <p style=margin:0in><font face="Arial" size="2">CFrameWindowImpl:</font></p>\r
+       <ul style='margin-top:0in;margin-bottom:0in'>\r
+       <li>\r
+       <p style=margin:0in><font face="Arial" size="2">Fix: Const issue with title \r
+       argument of AddSimpleReBarBand</font></p></li>\r
+       <li>\r
+       <p style=margin:0in><font face="Arial" size="2">Fix: DECLARE_FRAME_WND_CLASS \r
+       definition missing WTL namespace</font></p></li>\r
+       </ul>\r
+       <p style=margin:0in>&nbsp;</p>\r
+       <p style=margin:0in><font face="Arial" size="2">Windows CE:</font></p>\r
+       <ul style='margin-top:0in;margin-bottom:0in'>\r
+       <li>\r
+       <p style=margin:0in><font face="Arial" size="2">Fix: Some symbols not \r
+       defined for CE 4.0</font></p></li>\r
+       <li>\r
+       <p style=margin:0in><font face="Arial" size="2">Fix: Incorrect WinCE \r
+       exclusions</font></p></li>\r
+       <li>\r
+       <p style=margin:0in><font face="Arial" size="2">Fix: Pocket PC - assert \r
+       after navigating a CHyperLink</font></p></li>\r
+       <li>\r
+       <p style=margin:0in><font face="Arial" size="2">Fix: Property sheet with \r
+       listview on WM5.0 causes stack overflow</font></p></li>\r
+       <li>\r
+       <p style=margin:0in><font face="Arial" size="2">Fix: CFindFile::GetFilePath() \r
+       fails on diskless root requests</font></p></li>\r
+       <li>\r
+       <p style=margin:0in><font face="Arial" size="2">Fix: VS 2005 dialog editor \r
+       bug - DS_FIXEDSYS used but not defined</font></p></li>\r
+       <li>\r
+       <p style=margin:0in><font face="Arial" size="2">Fix: Windows Mobile 2005 \r
+       compatibility issues</font></p></li>\r
+       <li>\r
+       <p style=margin:0in><font face="Arial" size="2">Fix: CFullScreenFrame on \r
+       Smartphone 20003</font></p></li>\r
+       <li>\r
+       <p style=margin:0in><font face="Arial" size="2">Fix: SmartPhone back key \r
+       handling in CAppWindow</font></p></li>\r
+       <li>\r
+       <p style=margin:0in><font face="Arial" size="2">Added orientation aware \r
+       support to CAppStdDialogImpl</font></p></li>\r
+       <li>\r
+       <p style=margin:0in><font face="Arial" size="2">Added CAxDialogImpl base for \r
+       CStdDialogImpl, CStdDialogResizeImpl and CStdOrientedDialogImpl</font></p>\r
+       </li>\r
+       <li>\r
+       <p style=margin:0in><font face="Arial" size="2">Added various CStdDialogxxx \r
+       enhancements</font></p></li>\r
+       <li>\r
+       <p style=margin:0in><font face="Arial" size="2">Fix: CStdDialogBase does not \r
+       scale dialog title on VGA</font></p></li>\r
+       <li>\r
+       <p style=margin:0in><font face="Arial" size="2">Fix: DIBINFO16 triggers code \r
+       analysis warning</font></p></li>\r
+       <li>\r
+       <p style=margin:0in><font face="Arial" size="2">Added LPCTSTR \r
+       AtlLoadString(UINT uID) - CE only overload</font></p></li>\r
+       <li>\r
+       <p style=margin:0in><font face="Arial" size="2">Added imaging draw support \r
+       to CZoomScrollImpl</font></p></li>\r
+       <li>\r
+       <p style=margin:0in><font face="Arial" size="2">Added CBottomTabViewImpl and \r
+       CBottomTabView classes for PPC</font></p></li>\r
+       </ul>\r
+       <p style=margin:0in>&nbsp;</p>\r
+       <p style=margin:0in><font face="Arial" size="2">CFindFile:</font></p>\r
+       <ul style='margin-top:0in;margin-bottom:0in'>\r
+       <li>\r
+       <p style=margin:0in><font face="Arial" size="2">Fix: CFindFile class uses \r
+       CRT functions</font></p></li>\r
+       <li>\r
+       <p style=margin:0in><font face="Arial" size="2">Fix: FindFile() uses lstrcpy \r
+       without checking length</font></p></li>\r
+       </ul>\r
+       <p style=margin:0in>&nbsp;</p>\r
+       <p style=margin:0in><font face="Arial" size="2">General:</font></p>\r
+       <ul style='margin-top:0in;margin-bottom:0in'>\r
+       <li>\r
+       <p style=margin:0in><font face="Arial" size="2">Fix: Adding ReBar bands \r
+       fails with new Windows SDK</font></p></li>\r
+       <li>\r
+       <p style=margin:0in><font face="Arial" size="2">Added support for relative \r
+       include paths</font></p></li>\r
+       <li>\r
+       <p style=margin:0in><font face="Arial" size="2">Fix: Using std::min and \r
+       std::max</font></p></li>\r
+       <li>\r
+       <p style=margin:0in><font face="Arial" size="2">Fix: Problems using WTL with \r
+       MFC</font></p></li>\r
+       <li>\r
+       <p style=margin:0in><font face="Arial" size="2">Improved support for Secure \r
+       CRT</font></p></li>\r
+       <li>\r
+       <p style=margin:0in><font face="Arial" size="2">Changed implementation of \r
+       CSize, CPoint, CRect, and CString to be inside class definitions</font></p>\r
+       </li>\r
+       <li>\r
+       <p style=margin:0in><font face="Arial" size="2">atltheme.h: Corrected method \r
+       signatures for differences in uxtheme.h versions</font></p></li>\r
+       <li>\r
+       <p style=margin:0in><font face="Arial" size="2">Replaced malloc/free with \r
+       new/delete where appropriate</font></p></li>\r
+       </ul>\r
+       <p style=margin:0in>&nbsp;</p>\r
+       <p style=margin:0in><font face="Arial" size="2">Misc:</font></p>\r
+       <ul style='margin-top:0in;margin-bottom:0in'>\r
+       <li>\r
+       <p style=margin:0in><font face="Arial" size="2">Fix: CString::FormatV can \r
+       cause GPF with Unicode strings</font></p></li>\r
+       <li>\r
+       <p style=margin:0in><font face="Arial" size="2">CHyperLink: Added handler \r
+       for WM_SIZE</font></p></li>\r
+       <li>\r
+       <p style=margin:0in><font face="Arial" size="2">Fix: CTheme needs \r
+       constructor from HTHEME handle</font></p></li>\r
+       <li>\r
+       <p style=margin:0in><font face="Arial" size="2">Added Add* methods to \r
+       several control classes in atlctrls.h to augment Insert* methods</font></p>\r
+       </li>\r
+       <li>\r
+       <p style=margin:0in><font face="Arial" size="2">Fix: Incorrect casting in \r
+       CRichEditCtrl::GetLine()</font></p></li>\r
+       <li>\r
+       <p style=margin:0in><font face="Arial" size="2">Fix: \r
+       CTreeViewCtrl::GetItemState changed to return only state-bits as specified \r
+       by mask</font></p></li>\r
+       <li>\r
+       <p style=margin:0in><font face="Arial" size="2">Fix: CBitmapButton::DoPaint \r
+       - wrong button image</font></p></li>\r
+       <li>\r
+       <p style=margin:0in><font face="Arial" size="2">Added another variant of \r
+       CDCT::Drawtext with LPTSTR argument that allows text change</font></p></li>\r
+       <li>\r
+       <p style=margin:0in><font face="Arial" size="2">Fix: \r
+       CRecentDocumentListBase::AddToList() uses lstrcpy</font></p></li>\r
+       <li>\r
+       <p style=margin:0in><font face="Arial" size="2">Fix: AtlLoadString(uID, \r
+       lpBuffer, nBufferMax) has unnecessary code</font></p></li>\r
+       <li>\r
+       <p style=margin:0in><font face="Arial" size="2">Fix: CCursor::LoadOEMCursor \r
+       asserts on IDC_HAND</font></p></li>\r
+       <li>\r
+       <p style=margin:0in><font face="Arial" size="2">Fix: Memory leak when using \r
+       CRT functions while printing</font></p></li>\r
+       <li>\r
+       <p style=margin:0in><font face="Arial" size="2">Fix: Undefined CString \r
+       namespace</font></p></li>\r
+       <li>\r
+       <p style=margin:0in><font face="Arial" size="2">CPaneContainer: Added border \r
+       styles</font></p></li>\r
+       <li>\r
+       <p style=margin:0in><font face="Arial" size="2">CSplitterImpl: Added \r
+       SetSplitterPosPct, and changed App Wizard code to use it</font></p></li>\r
+       </ul>\r
+  </blockquote>\r
+       <p style=margin:0in>&nbsp;</p>\r
+       <p style=margin:0in>&nbsp;</p>\r
+<p style=margin:0in><b><font face="Arial">\r
+<a name="Changes Between WTL 7.5 And 7.1"></a>Changes Between WTL 7.5 And 7.1</font></b></p>\r
+<p style=margin:0in>&nbsp;</p>\r
+  <p style=margin:0in><font face="Arial" size="2">New and improved:</font></p>\r
+<blockquote style='margin-top:0in;margin-bottom:0in'>\r
+  <p style=margin:0in><font face="Arial" size="2">VS2005 Compatibility: \r
+       Added support for Visual Studio 2005 - both desktop and Windows CE<br>\r
+       Classes for icons, cursors, accelerator tables<br>\r
+       CSortListViewImpl, CSortListViewCtrlImpl, and CSortListViewCtrl classes<br>\r
+       Impl classes for Wizard 97 style wizards: CWizard97Sheet, \r
+       CWizard97Page, CWizard97ExteriorPage, CWizard97InteriorPage<br>\r
+       CMemoryDC and CDoubleBufferWindowImpl classes<br>\r
+       Windows CE specific classes in new header, atlwince.h<br>\r
+       CScrollContainer class<br>\r
+       CZoomScrollImpl and CZoomScrollWindowImpl classes<br>\r
+       CZoomPrintPreviewWindowImpl and CZoomPrintPreviewWindow classes<br>\r
+       Global functions: AtlGetBitmapResourceInfo, \r
+       AtlGetBitmapResourceBitsPerPixel<br>\r
+       New REFLECT_* macros to enable selective reflection of messages<br>\r
+       App Wizard: Added App Wizard for VS2005<br>\r
+       App Wizard: Added App Wizard for Windows CE for VS2005<br>\r
+       New samples: WTLExplorer, ImageView, SPControls<br>\r
+&nbsp;</font></p>\r
+</blockquote>\r
+  <p style=margin:0in><font face="Arial" size="2">Fixes and enhancements:</font></p>\r
+  <blockquote style='margin-top:0in;margin-bottom:0in'>\r
+  <p style=margin:0in><font face="Arial" size="2">Command Bar:</font></p>\r
+       <ul style='margin-top:0in;margin-bottom:0in'>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">DrawBitmapDisabled() \r
+               doesn't work correctly on Longhorn</font></p></li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">Submenu size not correct if \r
+       command bar is off-screen</font></p></li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">Added handler for \r
+       WM_SETTINGCHANGE to improve theme color changes</font></p></li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">Better support for \r
+       8/16/24-bit images</font></p></li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">Command Bar with 2 Levels of \r
+       submenus remains active</font></p></li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">Hook procedure fails to call \r
+       next hook</font></p></li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">OnDestroy() should not \r
+       decrement hook use if AttachToWindow() is used</font></p></li>\r
+       </ul>\r
+       <p style=margin:0in>&nbsp;</p>\r
+       <p style=margin:0in><font face="Arial" size="2">MDI Command Bar:</font></p>\r
+       <ul style='margin-top:0in;margin-bottom:0in'>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">Grows bigger if you \r
+               switch between two maximized MDI child window types</font></p></li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">Move all hook messages \r
+               processing to a separate function and use pT</font></p></li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">MDI icon &amp; buttons should \r
+       have themed background</font></p></li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">Should make MDI buttons gray \r
+       when inactive<br>&nbsp;</font></p></li>\r
+       </ul>\r
+       <p style=margin:0in><font face="Arial" size="2">CString:</font></p>\r
+       <ul style='margin-top:0in;margin-bottom:0in'>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">Helper functions not \r
+               overloaded properly</font></p></li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">Some return types are \r
+               'const CString&amp;' and could be just 'CString&amp;'</font></p></li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">FormatV() passes size in \r
+       characters to _alloca, should be in bytes</font></p></li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">Fixed stack corruption in \r
+       FormatV()</font></p></li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">Improved boundaries checking \r
+       for integer overflows/underflows<br>&nbsp;</font></p></li>\r
+       </ul>\r
+       <p style=margin:0in><font face="Arial" size="2">CScrollImpl:</font></p>\r
+       <ul style='margin-top:0in;margin-bottom:0in'>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">Scroll bars problem when \r
+               changing range</font></p></li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">SetScrollOffset() doesn't \r
+       move child windows</font></p></li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">Range and thumb drawing \r
+       problems</font></p></li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">Possible overflow in \r
+       OnMouseWheel()</font></p></li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">Support for \r
+       SIF_DISABLENOSCROLL</font></p></li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">Added ScrollToView methods</font></p>\r
+               </li>\r
+       </ul>\r
+       <p style=margin:0in>&nbsp;</p>\r
+       <p style=margin:0in><font face="Arial" size="2">CMapScrollImpl:</font></p>\r
+       <ul style='margin-top:0in;margin-bottom:0in'>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">SetScrollSize() incorrectly \r
+       inverts xMin and xMax</font></p></li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">SetScrollSize() uses bRedraw \r
+       = NULL</font></p></li>\r
+       </ul>\r
+       <p style=margin:0in>&nbsp;</p>\r
+       <p style=margin:0in><font face="Arial" size="2">CTheme:</font></p>\r
+       <ul style='margin-top:0in;margin-bottom:0in'>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">GetThemeFont() bad parameter \r
+       ordering</font></p></li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">Uses LOGFONT and TEXTMETRIC \r
+       incorrectly (SDK header problem)</font></p></li>\r
+       </ul>\r
+       <p style=margin:0in>&nbsp;</p>\r
+       <p style=margin:0in><font face="Arial" size="2">CFrameWindowImpl:</font></p>\r
+       <ul style='margin-top:0in;margin-bottom:0in'>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">Improved sizing for Windows \r
+       CE</font></p></li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">CreateSimpleToolBarCtrl() \r
+       should handle 24-bit bitmaps</font></p></li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">Changed WinCE \r
+       CCECommandBarCtrl typedef and added a PPC CMenuBarCtrl</font></p></li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">UpdatesBarPosition() doesn't \r
+       take Windows CE command bar into account</font></p></li>\r
+       </ul>\r
+       <p style=margin:0in>&nbsp;</p>\r
+       <p style=margin:0in><font face="Arial" size="2">CDialogResize:</font></p>\r
+       <ul style='margin-top:0in;margin-bottom:0in'>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">Enabled use for Windows CE</font></p>\r
+               </li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">Add WS_EX_DLGMODALFRAME to \r
+       prevent empty icon</font></p></li>\r
+       </ul>\r
+       <p style=margin:0in>&nbsp;</p>\r
+       <p style=margin:0in><font face="Arial" size="2">CReBarCtrl:</font></p>\r
+       <ul style='margin-top:0in;margin-bottom:0in'>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">Background not painted when \r
+       resized</font></p></li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">Fixed typo in LockBands()</font></p>\r
+               </li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">MaximizeBand needs BOOL \r
+       fIdeal argument</font></p></li>\r
+       </ul>\r
+       <p style=margin:0in>&nbsp;</p>\r
+       <p style=margin:0in><font face="Arial" size="2">CRichEdit:</font></p>\r
+       <ul style='margin-top:0in;margin-bottom:0in'>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">GetSelText() should \r
+               support UNICODE strings</font></p>\r
+               </li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">GetSelText() uses lpstr instead of lpstrText</font></p></li>\r
+       </ul>\r
+  <p style=margin:0in>&nbsp;</p>\r
+       <p style=margin:0in><font face="Arial" size="2">CHyperLink:</font></p>\r
+       <ul style='margin-top:0in;margin-bottom:0in'>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">Added _xttoi() helper to \r
+       avoid CRT in _ATL_MIN_CRT</font></p></li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">Fixed resource leak by \r
+       destroying tooltip window<br>&nbsp;</font></p></li>\r
+       </ul>\r
+       <p style=margin:0in><font face="Arial" size="2">CPropertySheetImpl:</font></p>\r
+       <ul style='margin-top:0in;margin-bottom:0in'>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">Improved support for Windows \r
+       CE</font></p></li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">Sheet without title \r
+       generates a memory fault on Windows CE</font></p></li>\r
+       </ul>\r
+       <p style=margin:0in>&nbsp;</p>\r
+       <p style=margin:0in><font face="Arial" size="2">CFolderDialog:</font></p>\r
+       <ul style='margin-top:0in;margin-bottom:0in'>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">Add a way to set an initial \r
+       folder</font></p></li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">Uses BFFM_IUNKNOWN which is \r
+       not always defined</font></p></li>\r
+       </ul>\r
+       <p style=margin:0in>&nbsp;</p>\r
+       <p style=margin:0in><font face="Arial" size="2">Update UI:</font></p>\r
+       <ul style='margin-top:0in;margin-bottom:0in'>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">Add support to \r
+               dynamically add UpdateUI elements</font></p></li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">UIUpdateMenuBarElement() \r
+               should use EnableMenu() instead of SetMenuItemInfo() for Windows CE</font></p>\r
+               </li>\r
+       </ul>\r
+       <p style=margin:0in>&nbsp;</p>\r
+       <p style=margin:0in><font face="Arial" size="2">CDC:</font></p>\r
+       <ul style='margin-top:0in;margin-bottom:0in'>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">FillSolidRect() should \r
+               restore background color</font></p></li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">GetClipRgn() method \r
+               missing</font></p></li>\r
+       </ul>\r
+       <p style=margin:0in>&nbsp;</p>\r
+       <p style=margin:0in><font face="Arial" size="2">Printing:</font></p>\r
+       <ul style='margin-top:0in;margin-bottom:0in'>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">\r
+               CPrinter::CreatePrinterDC() and CreatePrinterIC() members should be \r
+               const</font></p></li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">CDevMode::CopyToHDEVMODE() is missing a call to GlobalUnlock()</font></p>\r
+               </li>\r
+       </ul>\r
+  <p style=margin:0in>&nbsp;</p>\r
+       <p style=margin:0in><font face="Arial" size="2">AppWizard:</font></p>\r
+       <ul style='margin-top:0in;margin-bottom:0in'>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">Use WTL subfolder to \r
+               create WTL category for VC7.x and VC8</font></p></li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">Rename files from \r
+               WTLApp7x to WTLAppWiz, and add VS2005 setup file</font></p></li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">Fixed setup \r
+               for x64</font></p></li>\r
+       </ul>\r
+  <p style=margin:0in>&nbsp;</p>\r
+       <p style=margin:0in><font face="Arial" size="2">General:</font></p>\r
+       <ul style='margin-top:0in;margin-bottom:0in'>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">Redefinition of _MAX_FNAME \r
+               with Dinkumware Standard C++ Library on Windows CE</font></p></li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">Added ATLVERIFY macro \r
+               for ATL3</font></p></li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">Support warning level 4</font></p>\r
+               </li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">Missing methods \r
+               CToolBarCtrl::SetButtonInfo, InsertButton, CTabCtrl::SetItem, \r
+               CComboBoxEx::InsertItem, SetItem</font></p></li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">Missing support for \r
+               WM_PRINTCLIENT</font></p></li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">Removed usage of IsBad* \r
+               functions</font></p></li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">Fixed various compiler \r
+               warnings</font></p></li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">TCHAR bugs in various \r
+               files</font></p></li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">Improved Windows CE support and changes for Visual Studio 2005</font></p></li>\r
+       </ul>\r
+       <p style=margin:0in>&nbsp;</p>\r
+       <p style=margin:0in><font face="Arial" size="2">Misc:</font></p>\r
+       <ul style='margin-top:0in;margin-bottom:0in'>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">CMDIChildWindowImpl: \r
+               HMENU should be destroyed in OnDestroy()</font></p>\r
+               </li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">CStatic: Should use \r
+               STM_SETIMAGE instead of STM_SETICON for SetIcon() on Windows CE</font></p>\r
+               </li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">CButton: GetButtonStyle() \r
+               uses wrong mask</font></p></li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">CImageList: Made \r
+               Duplicate() method const</font></p></li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">CListViewCtrl: Made \r
+               SubItemHitTest() method const</font></p></li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">CTreeViewCtrl: GetItem() \r
+               and SetItem() incorrectly restricted to _WIN32_IE &gt;= 0x0500</font></p>\r
+               </li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">CMonthCalendarCtrl: \r
+               GetMonthRange() should be GetMaxTodayWidth()</font></p></li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">CDateTimePickerCtrl: \r
+               SetFormat() should have const argument</font></p></li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">CBitmapButtonImpl: Fixed \r
+               resource leak by destroying tooltip window</font></p></li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">\r
+               CMultiPaneStatusBarCtrlImpl: Cannot handle wide panes without resource \r
+               strings</font></p></li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">CCheckListViewCtrlImpl: \r
+               Call CheckSelectedItems() through pT</font></p></li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">CPaneContainerImpl: \r
+               SetPaneContainerExtendedStyle() should use pT to call CalcSize()</font></p></li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">CFindFile: Enabled for \r
+               Windows CE</font></p></li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">CPropertyPageImpl: Added \r
+               handlers for callback messages</font></p></li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">atlcrack.h: Added return \r
+               value for MSG_WM_APPCOMMAND</font></p></li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">CMenu: New method variants: AppendMenu, InsterMenu, ModifyMenu</font></p></li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">CFont: Added arguments \r
+               for bold and italic to CreatePointFont()</font></p></li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">CSize: Added scalar \r
+               operators for WTL::CSize and ATL::CSize</font></p></li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">CRecentDocumentList: \r
+               Allow changing the &quot;DocumentCount&quot; and &quot;Document%i&quot; registry values \r
+               strings</font></p></li>\r
+               <li>\r
+               <p style=margin:0in><font face="Arial" size="2">CSplitterWindowImpl: \r
+               Enabled use for Windows CE</font></p></li>\r
+       </ul>\r
+  </blockquote>\r
+<p style=margin:0in><br>\r
+&nbsp;</p>\r
+<p style=margin:0in><b><font face="Arial">\r
+<a name="Changes Between WTL 7.1 And 7.0"></a>Changes Between WTL 7.1 And 7.0</font></b></p>\r
+<p style=margin:0in>&nbsp;</p>\r
+  <p style=margin:0in><font face="Arial" size="2">New and improved:</font></p>\r
+<blockquote style='margin-top:0in;margin-bottom:0in'>\r
+  <p style=margin:0in><font face="Arial" size="2">VC7 Compatibility: Support for \r
+  ATL7 Module classes and critical sections and AppWizard setup for VC++ 7.1</font></p>\r
+  <p style=margin:0in><font face="Arial" size="2">Windows CE Support: Full \r
+  compatibility with Windows CE platforms and AppWizard for eMbedded Visual C++</font></p>\r
+  <p style=margin:0in><font face="Arial" size="2">Namespace Support: Automatic \r
+  &quot;using ATL&quot; (ATL7 only) or &quot;using WTL&quot; can now be turned off</font></p>\r
+  <p style=margin:0in><font face="Arial" size="2">CHyperLink New Features: not \r
+  underlined, underlined when hover, command button, link tags</font></p>\r
+  <p style=margin:0in><font face="Arial" size="2">CCustomWaitCursor class \r
+  supports custom and animated wait cursors</font></p>\r
+  <p style=margin:0in><font face="Arial" size="2">AtlCreateBoldFont() for \r
+  creating bold version of an existing font</font></p>\r
+</blockquote>\r
+  <p style=margin:0in>&nbsp;</p>\r
+  <p style=margin:0in><font face="Arial" size="2">Fixes and enhancements:</font></p>\r
+  <blockquote style='margin-top:0in;margin-bottom:0in'>\r
+  <p style=margin:0in><font face="Arial" size="2">CFrameWindowImpl:</font></p>\r
+  <ul style='margin-top:0in;margin-bottom:0in'>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">CreateSimpleToolBarCtrl() - \r
+  remove dead code, improve error checking, add a global function that uses it</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Fix - PrepareChevronMenu() fails to \r
+  get toolbar strings for Unicode</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">CFrameWindowImplBase::Create() \r
+  - improve ASSERT not to use m_hWnd if creation fails</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Fix - CFrameWndClassInfo::Register - \r
+  should use %p formatting only for _WIN32_WINNT &gt;= 0x0500 or for _WIN64</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Fix - Chevron menus not positioned \r
+  correctly with RTL</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Fix - CMDIChildWindowImpl: Problems \r
+  creating maximized child windows and handling focus</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Fix - CMDIChildWindowImpl: Should \r
+  activate on WM_MOUSEACTIVATE</font></p>\r
+    </li>\r
+  </ul>\r
+  <p style=margin:0in>&nbsp;</p>\r
+  <p style=margin:0in><font face="Arial" size="2">UpdateUI:</font></p>\r
+  <ul style='margin-top:0in;margin-bottom:0in'>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Fix - Incorrectly clears default \r
+  item from the system menu in MDI apps</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Added UISetCheck with bool \r
+  instead of int for the check state</font></p>\r
+    </li>\r
+  </ul>\r
+  <p style=margin:0in>&nbsp;</p>\r
+  <p style=margin:0in><font face="Arial" size="2">DDX:</font></p>\r
+  <ul style='margin-top:0in;margin-bottom:0in'>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Fix - Doesn't provide a way to \r
+  change floating point precision</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Added DDX_CONTROL_HANDLE for \r
+  non-CWindowImpl objects</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Added DDX_Check variant with \r
+  bool instead of int for the check state</font></p>\r
+    </li>\r
+  </ul>\r
+  <p style=margin:0in>&nbsp;</p>\r
+  <p style=margin:0in><font face="Arial" size="2">Command Bar:</font></p>\r
+  <ul style='margin-top:0in;margin-bottom:0in'>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Fix - OnDrawItem() and OnMeasureItem() \r
+  don't do a good check for owner-draw menu items</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Fix - Disabled 32-bit images not \r
+  painted correctly in 3D menu mode</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Fix - Popup menus not positioned \r
+  correctly with RTL</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Fix - Uses GCL_HICONSM instead of \r
+  GCLP_HICONSM with GetClassLongPtr()</font></p>\r
+    </li>\r
+  </ul>\r
+  <p style=margin:0in>&nbsp;</p>\r
+  <p style=margin:0in><font face="Arial" size="2">MDI Command Bar:</font></p>\r
+  <ul style='margin-top:0in;margin-bottom:0in'>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Fix - Doesn't refresh icon if MDI \r
+  children are different</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">OnAllHookMessages() - improve \r
+  code to handle MDI child window class icon</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Fix - OnNcLButtonDown() uses \r
+  TPM_VERPOSANIMATION without checking Windows version</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Fix - Maximized MDI buttons in wrong \r
+  place for RTL</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Should adjust cxIdeal for \r
+  rebar bands for IE4</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Add support for different \r
+  top-level menu widths by handling ideal size for rebar bands</font></p>\r
+    </li>\r
+  </ul>\r
+  <p style=margin:0in>&nbsp;</p>\r
+  <p style=margin:0in><font face="Arial" size="2">AppWizard:</font></p>\r
+  <ul style='margin-top:0in;margin-bottom:0in'>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Fix - Doesn't support MSDI \r
+  application as a COM Server</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Fix - MDI with Form View - stack \r
+  overflow closing maximized MDI child windows</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Fix - Generates VERSION resource \r
+  name 'test1' regardless of the project name</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Fix - Dialog project with control \r
+  hosting doesn't derive a dialog from CAxDialogImpl</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Fix - COM Server doesn't register \r
+  type library</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Fix - COM Server doesn't register \r
+  AppID properly</font></p>\r
+    </li>\r
+  </ul>\r
+  <p style=margin:0in>&nbsp;</p>\r
+  <p style=margin:0in><font face="Arial" size="2">CTreeViewCtrl:</font></p>\r
+  <ul style='margin-top:0in;margin-bottom:0in'>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Fix - GetItemData() needs better \r
+  return value</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Fix - GetItemState() should use \r
+  TVM_GETITEMSTATE instead of TVM_GETITEM for IE5</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">GetItem() and SetItem() - \r
+  added \r
+  new variants that use TVITEMEX</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Fix - SortChildren() should add \r
+  recurse flag argument</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Fix - CTreeItem doesn't support \r
+  CTreeViewCtrlExT that has different TBase than CWindow</font></p>\r
+    </li>\r
+  </ul>\r
+  <p style=margin:0in>&nbsp;</p>\r
+  <p style=margin:0in><font face="Arial" size="2">CThemeImpl:</font></p>\r
+  <ul style='margin-top:0in;margin-bottom:0in'>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Fix - Uses scalar delete instead of \r
+  the vector one</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Fix - EnableThemeDialogTexture() \r
+  argument is BOOL instead of DWORD</font></p>\r
+    </li>\r
+  </ul>\r
+  <p style=margin:0in>&nbsp;</p>\r
+  <p style=margin:0in><font face="Arial" size="2">CFolderDialog:</font></p>\r
+  <ul style='margin-top:0in;margin-bottom:0in'>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Fix - EnableOK() passes wrong \r
+  arguments to BFFM_ENABLEOK</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Fix - Always clears m_hWnd, which \r
+  causes problem for nested messages</font></p>\r
+    </li>\r
+  </ul>\r
+  <p style=margin:0in>&nbsp;</p>\r
+  <p style=margin:0in><font face="Arial" size="2">CDialogResize:</font></p>\r
+  <ul style='margin-top:0in;margin-bottom:0in'>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Fix - DlgResize_Init() forces dialog \r
+  to be visible by using SetRedraw()</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Forcing WS_THICKFRAME is not \r
+  enough to make dialog resizable</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Min track size should be used \r
+  for child dialogs as well</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Fix - DlgResize_PositionControl() \r
+  incorrectly checks return value from MapWindowPoints()</font></p>\r
+    </li>\r
+  </ul>\r
+  <p style=margin:0in>&nbsp;</p>\r
+  <p style=margin:0in><font face="Arial" size="2">CAppModule:</font></p>\r
+  <ul style='margin-top:0in;margin-bottom:0in'>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Fix - CAppModule methods not \r
+  thread-safe</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Fix - AddSettingChangeNotify() \r
+  unusable in multithreaded apps because of delayed initialization</font></p>\r
+    </li>\r
+  </ul>\r
+  <p style=margin:0in>&nbsp;</p>\r
+  <p style=margin:0in><font face="Arial" size="2">CString:</font></p>\r
+  <ul style='margin-top:0in;margin-bottom:0in'>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Fix - Delete() doesn't allow \r
+  deleting more than the length of the string</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Fix - Append() can cause buffer \r
+  overrun</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Fix - MakeReverse() can cause an \r
+  infinite loop</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Fix - _cstrstr() unnecessarily \r
+  inefficient</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Fix - FindOneOf() is not DBCS-aware</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Fix - Format() does not recognize %E</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Fix - TrimLeft() and TrimRight() are \r
+  only half-way DBCS-aware</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Fix - May cause assertions or \r
+  undefined behavior with SBCS</font></p>\r
+    </li>\r
+  </ul>\r
+  <p style=margin:0in>&nbsp;</p>\r
+  <p style=margin:0in><font face="Arial" size="2">CRecentDocumentList:</font></p>\r
+  <ul style='margin-top:0in;margin-bottom:0in'>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Fix - SetMaxEntries() has an \r
+  incorrect ASSERT</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Add CString variant of the \r
+  GetFromList() method</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Add a way to replace command \r
+  IDs used for the MRU list</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Add a way to replace registry \r
+  key name</font></p>\r
+    </li>\r
+  </ul>\r
+  <p style=margin:0in>&nbsp;</p>\r
+  <p style=margin:0in><font face="Arial" size="2">Misc:</font></p>\r
+  <ul style='margin-top:0in;margin-bottom:0in'>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">CMessageLoop::Run() - improve \r
+  the loop by checking bDoIdle before calling PeekMessage()</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">CServerAppModule: Clean-up \r
+  unused code</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Fix - CServerAppModule::MonitorProc() \r
+  - no need to call _endthreadex()</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Fix - CListBox::GetText() and \r
+  CComboBox::GetLBText() (CString variants) don't check for LBERR/CB_ERR</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Fix - CAxPropertyPageImpl doesn't \r
+  create ActiveX controls with ATL7</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Fix - CDC::GetTextExtentExPoint() \r
+  missing</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">CDC::SetWindowExt() should \r
+  have default value NULL for the lpSizeRet argument</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Fix - CPropertySheetWindow missing \r
+  methods for PSM_INSERTPAGE, PSM_SETHEADERTITLE, and PSM_SETHEADERSUBTITLE; \r
+  AddPage should return BOOL</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Fix - CMapScrollImpl::SetScrollSize() \r
+  uses wrong variable</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Fix - CHyperLink: WM_UPDATEUISTATE \r
+  causes repaint without WM_PAINT</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Fix - CUpDownCtrl::GetPos() returns \r
+  incorrect value</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Fix - CUpDownCtrl::GetPos32() \r
+  doesn't have default arg value</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Fix - CMultiPaneStatusBarCtrl: \r
+  Always uses size grip for positioning panes</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Fix - CTabCtrl::InsertItem() should \r
+  return int, not BOOL</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">CReBarCtrl: Added LockBands() \r
+  method</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Fix - CFont: uninitialized variable \r
+  passed to DPtoLP</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Fix - CPrintDialogImpl: Crash when \r
+  displaying Print Setup dialog</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Fix -\r
+  CPageSetupDialogImpl::PaintHookProc() - should use T* and return UINT_PTR \r
+  instead of UINT</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Fix - CPrintJob doesn't support \r
+  printing to a file</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Fix - CSplitterImpl: Doesn't handle \r
+  WM_CAPTURECHANGED - can get in an invalid state</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">CRichEditCtrl: Add method for \r
+  EM_SETTABSTOPS</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Fix - CFindFile::GetFilePath() \r
+  checks for a trailing slash, but doesn't use that info</font></p>\r
+    </li>\r
+  </ul>\r
+  <p style=margin:0in>&nbsp;</p>\r
+  <p style=margin:0in><font face="Arial" size="2">General:</font></p>\r
+  <ul style='margin-top:0in;margin-bottom:0in'>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Fix - Problems compiling with /Zc:forScope \r
+  ('for' loop scope conformance)</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Use named constants instead of \r
+  values for pixel sizes, buffer lengths, etc.</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Support building with Managed \r
+  C++ (/CLR)</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">CMenuItemInfo - add run-time \r
+  support for different versions of Windows</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">CommCtrl.h change - additional \r
+  fields in IMAGELISTDRAWPARAMS now depend on _WIN32_IE instead of _WIN32_WINNT</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Fix - Incorrect usage of CRegKey::QueryStringValue()</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Fix - Operator = for GDI and USER \r
+  wrappers leaks handle if it's managed variant</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Fix - GDI and USER wrappers break \r
+  under self-assignments</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Fix - Chaining messages with cracked \r
+  handlers broken with ATL7</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Initialize all variables and \r
+  structures prior to use</font></p>\r
+    </li>\r
+    <li>\r
+  <p style=margin:0in><font face="Arial" size="2">Use new common control struct \r
+  names</font></p>\r
+    </li>\r
+  </ul>\r
+  </blockquote>\r
+  <p style=margin:0in>&nbsp;</p>\r
+  <p style=margin:0in>&nbsp;</p>\r
+<p style=margin:0in><b><font face="Arial">\r
+<a name="Changes Between WTL 7.0 And 3.1"></a>Changes Between WTL 7.0 And 3.1</font></b></p>\r
+<p style=margin:0in>&nbsp;</p>\r
+<p style=margin:0in><font face="Arial" size="2">New classes and features:</font></p>\r
+<blockquote style='margin-top:0in;margin-bottom:0in'>\r
+  <p style=margin:0in><font face="Arial" size="2">Support for new Common Controls v6 messages</font></p>\r
+  <p style=margin:0in><font face="Arial" size="2">Support for Visual Studio .NET and ATL 7.0</font></p>\r
+  <p style=margin:0in><font face="Arial" size="2">WTLApp70 - new AppWizard for Visual Studio \r
+  .NET</font></p>\r
+  <p style=margin:0in><font face="Arial" size="2">CThemeImpl - implements support for Windows XP \r
+  themes</font></p>\r
+  <p style=margin:0in><font face="Arial" size="2">CMDICommandBarCtrl - implements Command Bar for \r
+  MDI applications</font></p>\r
+</blockquote>\r
+<p style=margin:0in>&nbsp;</p>\r
+<p style=margin:0in><font face="Arial" size="2">Fixes and enhancements:</font></p>\r
+<blockquote style='margin-top:0in;margin-bottom:0in'>\r
+  <p style=margin:0in><font face="Arial" size="2">Command Bar:</font></p>\r
+  <ul style='margin-top:0in;margin-bottom:0in'>\r
+    <li><font face="Arial" size="2">Bogus assert in OnDestroy</font></li>\r
+    <li><font face="Arial" size="2">Check marks can be truncated in large font \r
+    settings</font></li>\r
+    <li><font face="Arial" size="2">Use pT to access GetSystemSettings, \r
+    DrawMenuText, DrawBitmapDisabled, Draw3DCheckmark, DoPopupMenu, \r
+    DoTrackPopupMenu, TakeFocus, GiveFocusBack, so they can be overridden</font></li>\r
+    <li><font face="Arial" size="2">No hot-tracking if main window is not active</font></li>\r
+    <li><font face="Arial" size="2">Top level items not painted inactive if app \r
+    looses activation while drop down menu is displayed</font></li>\r
+    <li><font face="Arial" size="2">Added Windows XP flat menus support</font></li>\r
+    <li><font face="Arial" size="2">Drop-down menu doesn't close if clicked \r
+    again (Windows XP only)</font></li>\r
+    <li><font face="Arial" size="2">Menu item text and accelerator text too \r
+    close with some settings</font></li>\r
+    <li><font face="Arial" size="2">Keyboard can still access clipped menu items</font></li>\r
+    <li><font face="Arial" size="2">Added support for hiding keyboard navigation \r
+    indicators until Alt key is pressed (system setting)</font></li>\r
+    <li><font face="Arial" size="2">Added AddIcon and ReplaceIcon variants for \r
+    icon resources</font></li>\r
+    <li><font face="Arial" size="2">Image size calculated differently in \r
+    different places</font></li>\r
+    <li><font face="Arial" size="2">Add support for 32-bit (alpha channel) \r
+    bitmaps for Windows XP</font></li>\r
+    <li><font face="Arial" size="2">Fixed width calculation for default menu \r
+    items</font></li>\r
+  </ul>\r
+  <p style=margin:0in>&nbsp;</p>\r
+  <p style=margin:0in><font face="Arial" size="2">CFrameWindowImpl:</font></p>\r
+  <ul style='margin-top:0in;margin-bottom:0in'>\r
+    <li><font face="Arial" size="2">AddSimpleReBarBandCtrl sets toolbar extended \r
+    styles without preserving old ones</font></li>\r
+    <li><font face="Arial" size="2">PrepareChevronMenu should not create menu \r
+    items for buttons with TBSTATE_HIDDEN</font></li>\r
+    <li><font face="Arial" size="2">TPM_VERPOSANIMATION will not be defined in \r
+    atlframe.h if atlctrlw.h is included first</font></li>\r
+    <li><font face="Arial" size="2">CreateSimpleToolBarCtrl - height might be \r
+    too small if large font is used</font></li>\r
+    <li><font face="Arial" size="2">PrepareChevronMenu uses TB_GETBUTTONTEXT, \r
+    better use TB_GETBUTTONINFO</font></li>\r
+    <li><font face="Arial" size="2">Chevron menu doesn't close if clicked again \r
+    (Windows XP only)</font></li>\r
+    <li><font face="Arial" size="2">Should check local classes for superclassing</font></li>\r
+    <li><font face="Arial" size="2">Add support for 32-bit (alpha channel) \r
+    bitmaps for Windows XP</font></li>\r
+  </ul>\r
+  <p style=margin:0in>&nbsp;</p>\r
+  <p style=margin:0in><font face="Arial" size="2">Update UI:</font></p>\r
+  <ul style='margin-top:0in;margin-bottom:0in'>\r
+    <li><font face="Arial" size="2">UISetText can clear other menu item flags</font></li>\r
+    <li><font face="Arial" size="2">CUpdateUI::UIUpdateState assigns value with \r
+    |= instead of =</font></li>\r
+    <li><font face="Arial" size="2">Added UISetDefault() and fix default state \r
+    to work with menus</font></li>\r
+  </ul>\r
+  <p style=margin:0in>&nbsp;</p>\r
+  <p style=margin:0in><font face="Arial" size="2">CString:</font></p>\r
+  <ul style='margin-top:0in;margin-bottom:0in'>\r
+    <li><font face="Arial" size="2">GetBuffer() and GetBufferSetLength() should \r
+    return NULL in out-of-memory condition</font></li>\r
+    <li><font face="Arial" size="2">Added missing methods: separate c-tors for \r
+    LPCSTR and LPCWSTR, CollateNoCase, TrimRight and TrimLeft variants, Find \r
+    variants, moved FormatV to public</font></li>\r
+    <li><font face="Arial" size="2">Fix _IsValidString usage</font></li>\r
+    <li><font face="Arial" size="2">FormatV incorrectly calculates buffer size \r
+    (too big)</font></li>\r
+    <li><font face="Arial" size="2">Usage of _ttoi causes problems with _ATL_MIN_CRT \r
+    in VC7</font></li>\r
+  </ul>\r
+  <p style=margin:0in>&nbsp;</p>\r
+  <p style=margin:0in><font face="Arial" size="2">CDC:</font></p>\r
+  <ul style='margin-top:0in;margin-bottom:0in'>\r
+    <li><font face="Arial" size="2">GetTabbedTextExtent() should return DWORD \r
+    instead of BOOL</font></li>\r
+    <li><font face="Arial" size="2">Add FillRect() that accept color index \r
+    instead of a brush handle</font></li>\r
+    <li><font face="Arial" size="2">DrawDragRect() leaks regions and a brush</font></li>\r
+    <li><font face="Arial" size="2">Improved DitherBlt() - added brushes as \r
+    arguments for used colors</font></li>\r
+    <li><font face="Arial" size="2">Added DrawShadowText() (uses LoadLibrary/GetProcAddress \r
+    to run on older Windows)</font></li>\r
+  </ul>\r
+  <p style=margin:0in>&nbsp;</p>\r
+  <p style=margin:0in><font face="Arial" size="2">CListViewCtrl:</font></p>\r
+  <ul style='margin-top:0in;margin-bottom:0in'>\r
+    <li><font face="Arial" size="2">SetItemState should use LVM_SETITEMSTATE</font></li>\r
+    <li><font face="Arial" size="2">SetItemCount should return a BOOL</font></li>\r
+  </ul>\r
+  <p style=margin:0in>&nbsp;</p>\r
+  <p style=margin:0in><font face="Arial" size="2">CRichEditCtrl:</font></p>\r
+  <ul style='margin-top:0in;margin-bottom:0in'>\r
+    <li><font face="Arial" size="2">Added SetCharFormat() variant that accepts \r
+    flags (for SCF_ALL)</font></li>\r
+    <li><font face="Arial" size="2">CharFromPos() should pass a pointer to \r
+    POINTL in lParam</font></li>\r
+    <li><font face="Arial" size="2">GetTextRange() - should add Unicode variant \r
+    for rich edit version &gt;= 2</font></li>\r
+    <li><font face="Arial" size="2">Added another FormatRange() that can accept \r
+    a pointer to FORMATRANGE (needed for passing NULL to clear cache)</font></li>\r
+  </ul>\r
+  <p style=margin:0in>&nbsp;</p>\r
+  <p style=margin:0in><font face="Arial" size="2">CHyperLink:</font></p>\r
+  <ul style='margin-top:0in;margin-bottom:0in'>\r
+    <li><font face="Arial" size="2">Allow overriding of Navigate and \r
+    CalcLabelRect</font></li>\r
+    <li><font face="Arial" size="2">Doesn't handle right or center alignment</font></li>\r
+  </ul>\r
+  <p style=margin:0in>&nbsp;</p>\r
+  <p style=margin:0in><font face="Arial" size="2">CColorDialog:</font></p>\r
+  <ul style='margin-top:0in;margin-bottom:0in'>\r
+    <li><font face="Arial" size="2">Has static variables that were not \r
+    initialized with _ATL_MIN_CRT</font></li>\r
+    <li><font face="Arial" size="2">Fixed HookProc for ColorOK message - the \r
+    message is not sent, but the hook proc is called directly</font></li>\r
+  </ul>\r
+  <p style=margin:0in>&nbsp;</p>\r
+  <p style=margin:0in><font face="Arial" size="2">atlcrack.h:</font></p>\r
+  <ul style='margin-top:0in;margin-bottom:0in'>\r
+    <li><font face="Arial" size="2">MSG_WM_TIMER crack macro should cast to \r
+    TIMERPROC instead of TIMERPROC*</font></li>\r
+    <li><font face="Arial" size="2">Add cracked handlers for all new messages in \r
+    Common Controls 6</font></li>\r
+  </ul>\r
+  <p style=margin:0in>&nbsp;</p>\r
+  <p style=margin:0in><font face="Arial" size="2">atlapp.h:</font></p>\r
+  <ul style='margin-top:0in;margin-bottom:0in'>\r
+    <li><font face="Arial" size="2">Fixed problems with atlTraceUI with ATL7</font></li>\r
+    <li><font face="Arial" size="2">#ifdefs for ATL7 were in the wrong place</font></li>\r
+  </ul>\r
+  <p style=margin:0in>&nbsp;</p>\r
+  <p style=margin:0in><font face="Arial" size="2">atlctrls.h:</font></p>\r
+  <ul style='margin-top:0in;margin-bottom:0in'>\r
+    <li><font face="Arial" size="2">Add support in control classes for all new \r
+    messages in Common Controls 6</font></li>\r
+  </ul>\r
+  <p style=margin:0in>&nbsp;</p>\r
+  <p style=margin:0in><font face="Arial" size="2">CRecentDocumentList:</font></p>\r
+  <ul style='margin-top:0in;margin-bottom:0in'>\r
+    <li><font face="Arial" size="2">AtlCompactPath corrupts memory if filename \r
+    is longer than requested compact size</font></li>\r
+    <li><font face="Arial" size="2">ReadFromRegistry incorrectly checks for \r
+    error when reading from registry</font></li>\r
+  </ul>\r
+  <p style=margin:0in>&nbsp;</p>\r
+  <p style=margin:0in><font face="Arial" size="2">CSplitterWindow:</font></p>\r
+  <ul style='margin-top:0in;margin-bottom:0in'>\r
+    <li><font face="Arial" size="2">Incorrect calculation of middle position</font></li>\r
+    <li><font face="Arial" size="2">3D border now drawn only if WS_EX_CLIENTEDGE \r
+    is set</font></li>\r
+  </ul>\r
+  <p style=margin:0in>&nbsp;</p>\r
+  <p style=margin:0in><font face="Arial" size="2">Printing:</font></p>\r
+  <ul style='margin-top:0in;margin-bottom:0in'>\r
+    <li><font face="Arial" size="2">Uses DWORD instead of an int for a job ID</font></li>\r
+    <li><font face="Arial" size="2">CPrintJob::CancelPrintJob shouldn't have a \r
+    return value</font></li>\r
+  </ul>\r
+  <p style=margin:0in>&nbsp;</p>\r
+  <p style=margin:0in><font face="Arial" size="2">Misc:</font></p>\r
+  <ul style='margin-top:0in;margin-bottom:0in'>\r
+    <li><font face="Arial" size="2">CRegKey::QueryValue and SetValue are \r
+    deprecated in ATL7</font></li>\r
+    <li><font face="Arial" size="2">Added direct support for ATL7</font></li>\r
+    <li><font face="Arial" size="2">Replace ScreenToClient and ClientToScreen \r
+    with MapWindowPoints to support RTL layout</font></li>\r
+    <li><font face="Arial" size="2">CFindFile::GetFilePath(LPTSTR...) returns \r
+    path without the file name</font></li>\r
+    <li><font face="Arial" size="2">MDI: Updating client edge in \r
+    WM_WINDOWPOSCHANGING causes minimize/maximize/restore animation problems, \r
+    use WM_WINDOWPOSCHANGED</font></li>\r
+    <li><font face="Arial" size="2">Custom Draw: Added \r
+    CCustomDraw::OnSubItemPrePaint() overrideable method</font></li>\r
+    <li><font face="Arial" size="2">CFolderDialogImpl uses 'this' for \r
+    BROWSEINFO.lParam instead of T*</font></li>\r
+    <li><font face="Arial" size="2">CImageList::Destroy shouldn't use Detach()</font></li>\r
+    <li><font face="Arial" size="2">ATL7 has its own AtlLoadString</font></li>\r
+    <li><font face="Arial" size="2">CPropertySheet doesn't close when you press \r
+    X button</font></li>\r
+    <li><font face="Arial" size="2">Fixed problems for _U_STRINGorID and others \r
+    that moved from atlbase.h to atlwin.h in ATL7</font></li>\r
+    <li><font face="Arial" size="2">Add AtlMessageBox() that accepts either \r
+    in-memory or resource strings</font></li>\r
+    <li><font face="Arial" size="2">CScrollImpl: fixed bug with scrolling child \r
+    windows</font></li>\r
+    <li><font face="Arial" size="2">CPropertyPageImpl: Add new notification \r
+    handlers to enable direct return values (use #ifdef _WTL_NEW_PAGE_NOTIFY_HANDLERS \r
+    to use them)</font></li>\r
+    <li><font face="Arial" size="2">Add AtlInitCommonControls() to simplify use</font></li>\r
+    <li><font face="Arial" size="2">DDX: Fixed usage of the size of char arrays \r
+    for DDX</font></li>\r
+    <li><font face="Arial" size="2">CPageSetupDialog: changed usage of \r
+    CWndProcThunk because of changes in ATL7</font></li>\r
+    <li><font face="Arial" size="2">Fix confusing precedence in expressions</font></li>\r
+    <li><font face="Arial" size="2">Removed forward declarations because default \r
+    values for template arguments shouldn't be specified in two places (we don't \r
+    need them anyway)</font></li>\r
+    <li><font face="Arial" size="2">Win64: Fix /Wp64 warnings from 32-bit VC7 \r
+    compiler caused by SDK headers</font></li>\r
+    <li><font face="Arial" size="2">Fix direct usage of English strings (they \r
+    can be #defined to something else now)</font></li>\r
+    <li><font face="Arial" size="2">AtlGetCommCtrlVersion not defined if _ATL_DLL \r
+    is in ATL 3.0 (and CmdBar is using it)</font></li>\r
+  </ul>\r
+  <p style=margin:0in>&nbsp;</p>\r
+  <p style=margin:0in><font face="Arial" size="2">AppWizard:</font></p>\r
+  <ul style='margin-top:0in;margin-bottom:0in'>\r
+    <li><font face="Arial" size="2">Added manifest for Common Controls 6</font></li>\r
+    <li><font face="Arial" size="2">Loading Rich Edit DLL should use HMODULE</font></li>\r
+    <li><font face="Arial" size="2">Should not use atlimpl.cpp for ATL7</font></li>\r
+    <li><font face="Arial" size="2">Added message handler prototypes to \r
+    generated files</font></li>\r
+    <li><font face="Arial" size="2">VERSION resource always has VALUE &quot;OLESelfRegister&quot; \r
+    (now only for COM servers)</font></li>\r
+    <li><font face="Arial" size="2">Added option for putting implementation in \r
+    CPP files</font></li>\r
+    <li><font face="Arial" size="2">d-tor for the thread manager class in MSDI \r
+    project executed after the heap is destroyed</font></li>\r
+    <li><font face="Arial" size="2">Wrong settings when changing to a dialog \r
+    project and back (AppWizard 6.0 only)</font></li>\r
+    <li><font face="Arial" size="2">Remove cut/copy/paste accelerators for form \r
+    view and dialogs projects</font></li>\r
+    <li><font face="Arial" size="2">Fix toolbar bitmaps so they are not \r
+    transparent (problem with Windows XP flat menus only)</font></li>\r
+    <li><font face="Arial" size="2">Used CMDICommandBarCtrl for MDI apps</font></li>\r
+    <li><font face="Arial" size="2">Add symbols required for VC7 Class Wizard to \r
+    recognize an ATL project</font></li>\r
+    <li><font face="Arial" size="2">Changed default styles for the rebar, so it \r
+    does look OK without CmdBar and with manifest</font></li>\r
+    <li><font face="Arial" size="2">Added setup programs for both AppWizards</font></li>\r
+    <li><font face="Arial" size="2">Remove ignored resource attributes: \r
+    MOVEABLE, PURE, etc. (AppWizard 7.0 only)</font></li>\r
+    <li><font face="Arial" size="2">Add call to DefWindowProc to WinMain to \r
+    resolve possible problems if MSLU is used</font></li>\r
+  </ul>\r
+  <p style=margin:0in>&nbsp;</p>\r
+  <p style=margin:0in><font face="Arial" size="2">Samples:</font></p>\r
+  <ul style='margin-top:0in;margin-bottom:0in'>\r
+    <li><font face="Arial" size="2">Updated toolbar bitmaps, added #ifdefs for \r
+    ATL7, added manifest file for CommCtrl6, qualified _U_RECT with WTL \r
+    namespace, updated use of deprecated CRegKey functions, added VC7 projects</font></li>\r
+    <li><font face="Arial" size="2">Added Alpha sample</font></li>\r
+  </ul>\r
+</blockquote>\r
+<p style=margin:0in>&nbsp;</p>\r
+<p style=margin:0in>&nbsp;</p>\r
+<p style=margin:0in><b><font face="Arial">\r
+<a name="Changes Between WTL 3.1 And 3.0"></a>Changes Between WTL 3.1 And \r
+3.0</font></b></p>\r
+<p style=margin:0in>&nbsp;</p>\r
+<p style=margin:0in><font face="Arial" size="2">New classes:</font></p>\r
+<blockquote style='margin-top:0in;margin-bottom:0in'>\r
+  <p style=margin:0in><font face="Arial" size="2">CPaneContainer - implements a window that \r
+  provides a title bar and a close button (like Explorer)</font></p>\r
+  <p style=margin:0in><font face="Arial" size="2">CDialogResize - an MI class that allows \r
+  resizing of dialogs (or any windows with child windows/controls)</font></p>\r
+  <p style=margin:0in><font face="Arial" size="2">CAxPropertyPageImpl - implements a property \r
+  page that can host ActiveX controls</font></p>\r
+</blockquote>\r
+<p style=margin:0in>&nbsp;</p>\r
+<p style=margin:0in><font face="Arial" size="2">Fixes and enhancements:</font></p>\r
+<blockquote style='margin-top:0in;margin-bottom:0in'>\r
+  <p style=margin:0in><font face="Arial" size="2">CServerAppModule now clears m_hEventShutdown to \r
+  avoid calling CloseHandle twice</font></p>\r
+  <p style=margin:0in>&nbsp;</p>\r
+  <p style=margin:0in><font face="Arial" size="2">CString:</font></p>\r
+  <ul style='margin-top:0in;margin-bottom:0in'>\r
+    <li><font face="Arial" size="2">operator += now leaves original string \r
+    intact if it's out of memory</font></li>\r
+    <li><font face="Arial" size="2">Fixed bad DWORD_PTR usage in TrimRight, \r
+    TrimLeft, Replace, Remove</font></li>\r
+    <li><font face="Arial" size="2">Removed dependencies on CRT for projects \r
+    that don't use it</font></li>\r
+    <li><font face="Arial" size="2">Insert - fixed string corruption in release \r
+    builds</font></li>\r
+    <li><font face="Arial" size="2">Added optional floating point formatting \r
+    (for projects that use CRT)</font></li>\r
+  </ul>\r
+  <p style=margin:0in>&nbsp;</p>\r
+  <p style=margin:0in><font face="Arial" size="2">CEdit and CRichEditCtrl: SetSelAll and \r
+  SetSelNone had reversed implementation</font></p>\r
+  <p style=margin:0in>&nbsp;</p>\r
+  <p style=margin:0in><font face="Arial" size="2">atlres.h: Changed IDs so that they are \r
+  compatible with MFC's afxres.h</font></p>\r
+  <p style=margin:0in>&nbsp;</p>\r
+  <p style=margin:0in><font face="Arial" size="2">Command Bar:</font></p>\r
+  <ul style='margin-top:0in;margin-bottom:0in'>\r
+    <li><font face="Arial" size="2">Added LoadMappedImages()</font></li>\r
+    <li><font face="Arial" size="2">Changed handling of left and right arrow \r
+    keys so that they don't close context menus</font></li>\r
+    <li><font face="Arial" size="2">Add code to handle left/right arrow keys \r
+    correctly on mirrored (RTL) systems</font></li>\r
+    <li><font face="Arial" size="2">Removed handler that eats parent window's \r
+    WM_SETTINGCHANGE</font></li>\r
+    <li><font face="Arial" size="2">Fixed bitmap resource leak in \r
+    Draw3DCheckmark</font></li>\r
+    <li><font face="Arial" size="2">Fixed incorrect usage of CharLower in \r
+    OnMenuChar</font></li>\r
+    <li><font face="Arial" size="2">Fixed wrong color for the disabled items in \r
+    hi-contrast mode</font></li>\r
+    <li><font face="Arial" size="2">Added code to gray menu items if main window \r
+    is inactive</font></li>\r
+    <li><font face="Arial" size="2">Fixed keyboard mnemonic handling for IE 4</font></li>\r
+    <li><font face="Arial" size="2">Fixed hook problems with multiple cmdbars in \r
+    the same thread</font></li>\r
+    <li><font face="Arial" size="2">Added support for radio menu items</font></li>\r
+    <li><font face="Arial" size="2">Added support for disabled top-level menu \r
+    items (also added in CFrameWindowImpl::PrepareChevronMenu)</font></li>\r
+    <li><font face="Arial" size="2">Added keyboard shortcut (Alt+/) to invoke \r
+    chevron menu</font></li>\r
+    <li><font face="Arial" size="2">Added support to override menu item length \r
+    in a derived class</font></li>\r
+  </ul>\r
+  <p style=margin:0in>&nbsp;</p>\r
+  <p style=margin:0in><font face="Arial" size="2">CBitmapButton:</font></p>\r
+  <ul style='margin-top:0in;margin-bottom:0in'>\r
+    <li><font face="Arial" size="2">Bypassed BUTTON DefWindowProc for hover \r
+    style so that the button doesn't take focus</font></li>\r
+    <li><font face="Arial" size="2">Added BMPBTN_AUTOFIRE extended style</font></li>\r
+  </ul>\r
+  <p style=margin:0in>&nbsp;</p>\r
+  <p style=margin:0in><font face="Arial" size="2">CDC:</font></p>\r
+  <ul style='margin-top:0in;margin-bottom:0in'>\r
+    <li><font face="Arial" size="2">Added _WTL_FORWARD_DECLARE_CSTRING define to \r
+    allow usage of methods that accept CString</font></li>\r
+    <li><font face="Arial" size="2">Fixed errors in GetTextFace and \r
+    GetMenuItemString</font></li>\r
+    <li><font face="Arial" size="2">Added GetCharWidth32</font></li>\r
+    <li><font face="Arial" size="2">Added DrawIconEx method</font></li>\r
+  </ul>\r
+  <p style=margin:0in>&nbsp;</p>\r
+  <p style=margin:0in><font face="Arial" size="2">CMenu:</font></p>\r
+  <ul style='margin-top:0in;margin-bottom:0in'>\r
+    <li><font face="Arial" size="2">Implement following missing methods:<br>\r
+&nbsp;&nbsp;&nbsp; GetMenuDefaultItem<br>\r
+&nbsp;&nbsp;&nbsp; GetMenuInfo<br>\r
+&nbsp;&nbsp;&nbsp; GetMenuItemRect<br>\r
+&nbsp;&nbsp;&nbsp; HiliteMenuItem<br>\r
+&nbsp;&nbsp;&nbsp; IsMenu<br>\r
+&nbsp;&nbsp;&nbsp; MenuItemFromPoint<br>\r
+&nbsp;&nbsp;&nbsp; SetMenuDefaultItem<br>\r
+&nbsp;&nbsp;&nbsp; SetMenuInfo</font></li>\r
+    <li><font face="Arial" size="2">GetMenuString - fixed to include space for \r
+    terminating NULL character in returning string</font></li>\r
+  </ul>\r
+  <p style=margin:0in>&nbsp;</p>\r
+  <p style=margin:0in><font face="Arial" size="2">GDI and USER classes should destroy the \r
+  GDI/USER objects in Attach if GDI/USER resource is managed</font></p>\r
+  <p style=margin:0in>&nbsp;</p>\r
+  <p style=margin:0in><font face="Arial" size="2">CFrameWindowImpl:</font></p>\r
+  <ul style='margin-top:0in;margin-bottom:0in'>\r
+    <li><font face="Arial" size="2">OnToolTipText shouldn't save tool tip text \r
+    if it's not for a menu</font></li>\r
+    <li><font face="Arial" size="2">AddSimpleReBarBandCtrl now adds chevron \r
+    style only for toolbars with buttons</font></li>\r
+    <li><font face="Arial" size="2">AddSimpleReBarBand(Ctrl) - calc band ID if \r
+    not specified</font></li>\r
+  </ul>\r
+  <p style=margin:0in>&nbsp;</p>\r
+  <p style=margin:0in><font face="Arial" size="2">CRecentDocumentList:</font></p>\r
+  <ul style='margin-top:0in;margin-bottom:0in'>\r
+    <li><font face="Arial" size="2">Fix - UpdateMenu deletes wrong menu item \r
+    when the list is empty</font></li>\r
+    <li><font face="Arial" size="2">Added code to allow restricting the number \r
+    of characters displayed by MRU menu items</font></li>\r
+  </ul>\r
+  <p style=margin:0in>&nbsp;</p>\r
+  <p style=margin:0in><font face="Arial" size="2">Update UI:</font></p>\r
+  <ul style='margin-top:0in;margin-bottom:0in'>\r
+    <li><font face="Arial" size="2">Added support for blocking accelerators for \r
+    disabled items</font></li>\r
+    <li><font face="Arial" size="2">Improved search code assuming there are no \r
+    duplicate entries (and added checks for duplicates)</font></li>\r
+  </ul>\r
+  <p style=margin:0in>&nbsp;</p>\r
+  <p style=margin:0in><font face="Arial" size="2">CSplitterWindow:</font></p>\r
+  <ul style='margin-top:0in;margin-bottom:0in'>\r
+    <li><font face="Arial" size="2">CSplitterWindowImpl should derive from \r
+    CSplitterImpl&lt;T , t_bVertical&gt; to allow overriding of methods</font></li>\r
+    <li><font face="Arial" size="2">Added single pane mode and SetSinglePaneMode/GetSinglePaneMode</font></li>\r
+    <li><font face="Arial" size="2">Added right/bottom aligned resize mode using \r
+    extended styles SPLIT_RIGHTALIGNED/SPLIT_BOTTOMALIGNED</font></li>\r
+  </ul>\r
+  <p style=margin:0in>&nbsp;</p>\r
+  <p style=margin:0in><font face="Arial" size="2">atlcrack.h: Added handlers for following new \r
+  messages:<br>\r
+&nbsp;&nbsp;&nbsp; WM_APPCOMMAND<br>\r
+&nbsp;&nbsp;&nbsp; WM_NCXBUTTONDOWN<br>\r
+&nbsp;&nbsp;&nbsp; WM_NCXBUTTONUP<br>\r
+&nbsp;&nbsp;&nbsp; WM_NCXBUTTONDBLCLK<br>\r
+&nbsp;&nbsp;&nbsp; WM_XBUTTONDOWN<br>\r
+&nbsp;&nbsp;&nbsp; WM_XBUTTONUP<br>\r
+&nbsp;&nbsp;&nbsp; WM_XBUTTONDBLCLK</font></p>\r
+  <p style=margin:0in>&nbsp;</p>\r
+  <p style=margin:0in><font face="Arial" size="2">Win64:</font></p>\r
+  <ul style='margin-top:0in;margin-bottom:0in'>\r
+    <li><font face="Arial" size="2">Dialog return value should use \r
+    DWLP_MSGRESULT and SetWindowLongPtr</font></li>\r
+    <li><font face="Arial" size="2">CMenu::InsertMenu, AppendMenu, ModifyMenu \r
+    should have UINT_PTR for the menu ID</font></li>\r
+    <li><font face="Arial" size="2">Added appropriate type casts</font></li>\r
+    <li><font face="Arial" size="2">CFrameWindowImpl::m_szAutoName - changed the \r
+    size to fit the pointer value size</font></li>\r
+    <li><font face="Arial" size="2">CListViewCtrl::SortItems should use LPARAM \r
+    for user data instead of DWORD</font></li>\r
+  </ul>\r
+  <p style=margin:0in>&nbsp;</p>\r
+  <p style=margin:0in><font face="Arial" size="2">Misc:</font></p>\r
+  <ul style='margin-top:0in;margin-bottom:0in'>\r
+    <li><font face="Arial" size="2">Added optional mask argument to all methods \r
+    for setting extended styles</font></li>\r
+    <li><font face="Arial" size="2">CMDIWindow::MDIRestore - fixed to send \r
+    WM_MDIRESTORE instead of WM_MDIICONARRANGE</font></li>\r
+    <li><font face="Arial" size="2">CListViewCtrl: Added SortItemsEx method</font></li>\r
+    <li><font face="Arial" size="2">CToolBarCtrl::GetButtonInfo - fixed to \r
+    return int instead of BOOL</font></li>\r
+    <li><font face="Arial" size="2">Added CToolBarCtrl::SetButtonSize and \r
+    SetBitmapSize that accept cx and cy instead of SIZE</font></li>\r
+    <li><font face="Arial" size="2">Printing: Changed how GetNewDevModeForPage \r
+    works (comments in code)</font></li>\r
+    <li><font face="Arial" size="2">CFileDialogImpl::_OnTypeChange incorrectly \r
+    calls pT-&gt;OnSelChange instead of pT-&gt;OnTypeChange</font></li>\r
+    <li><font face="Arial" size="2">CMultiPaneStatusBarCtrl::GetPaneTipText - \r
+    fixed to use index instead of and ID internally</font></li>\r
+    <li><font face="Arial" size="2">CWinDataExchange: Added references to \r
+    arguments of DoDataExchange, so there are no level 4 warning even if the map \r
+    is empty</font></li>\r
+    <li><font face="Arial" size="2">CPropertySheetWindow: Added new, IE 5.0 \r
+    specific methods</font></li>\r
+    <li><font face="Arial" size="2">CPropertyPageImpl: Added new, IE 5.0 \r
+    specific methods</font></li>\r
+  </ul>\r
+  <p style=margin:0in>&nbsp;</p>\r
+  <p style=margin:0in><font face="Arial" size="2">AppWizard:</font></p>\r
+  <ul style='margin-top:0in;margin-bottom:0in'>\r
+    <li><font face="Arial" size="2">added calls to RemoveMessageFilter and \r
+    RemoveIdleHandler in CMainFrame::OnDestroy for COM server projects</font></li>\r
+    <li><font face="Arial" size="2">added scroll bars for HTML view</font></li>\r
+    <li><font face="Arial" size="2">CAppServerModule now handles -embedding as \r
+    well as -automation</font></li>\r
+    <li><font face="Arial" size="2">corrected code in CMainFrame::OnShowToolBar \r
+    to correctly identify the toolbar in a rebar</font></li>\r
+    <li><font face="Arial" size="2">dialog based app code now derives from \r
+    CUpdateUI as public</font></li>\r
+  </ul>\r
+</blockquote>\r
+<p style=margin:0in>&nbsp;</p>\r
+\r
+<p style=margin:0in><font face="Arial" size="2">- end of readme.htm -</font></p>\r
+\r
+</body>\r
+\r
+</html>
\ No newline at end of file
diff --git a/tbb30_20100406oss/bin/ia32/vc10/irml/irml.dll b/tbb30_20100406oss/bin/ia32/vc10/irml/irml.dll
new file mode 100644 (file)
index 0000000..3c348ef
Binary files /dev/null and b/tbb30_20100406oss/bin/ia32/vc10/irml/irml.dll differ
diff --git a/tbb30_20100406oss/bin/ia32/vc10/irml/irml.pdb b/tbb30_20100406oss/bin/ia32/vc10/irml/irml.pdb
new file mode 100644 (file)
index 0000000..f9a2163
Binary files /dev/null and b/tbb30_20100406oss/bin/ia32/vc10/irml/irml.pdb differ
diff --git a/tbb30_20100406oss/bin/ia32/vc10/irml/irml_debug.dll b/tbb30_20100406oss/bin/ia32/vc10/irml/irml_debug.dll
new file mode 100644 (file)
index 0000000..d3c4d8d
Binary files /dev/null and b/tbb30_20100406oss/bin/ia32/vc10/irml/irml_debug.dll differ
diff --git a/tbb30_20100406oss/bin/ia32/vc10/irml/irml_debug.pdb b/tbb30_20100406oss/bin/ia32/vc10/irml/irml_debug.pdb
new file mode 100644 (file)
index 0000000..4c0f170
Binary files /dev/null and b/tbb30_20100406oss/bin/ia32/vc10/irml/irml_debug.pdb differ
diff --git a/tbb30_20100406oss/bin/ia32/vc10/irml_c/irml.dll b/tbb30_20100406oss/bin/ia32/vc10/irml_c/irml.dll
new file mode 100644 (file)
index 0000000..a63f205
Binary files /dev/null and b/tbb30_20100406oss/bin/ia32/vc10/irml_c/irml.dll differ
diff --git a/tbb30_20100406oss/bin/ia32/vc10/irml_c/irml.pdb b/tbb30_20100406oss/bin/ia32/vc10/irml_c/irml.pdb
new file mode 100644 (file)
index 0000000..e46981a
Binary files /dev/null and b/tbb30_20100406oss/bin/ia32/vc10/irml_c/irml.pdb differ
diff --git a/tbb30_20100406oss/bin/ia32/vc10/irml_c/irml_debug.dll b/tbb30_20100406oss/bin/ia32/vc10/irml_c/irml_debug.dll
new file mode 100644 (file)
index 0000000..64329e8
Binary files /dev/null and b/tbb30_20100406oss/bin/ia32/vc10/irml_c/irml_debug.dll differ
diff --git a/tbb30_20100406oss/bin/ia32/vc10/irml_c/irml_debug.pdb b/tbb30_20100406oss/bin/ia32/vc10/irml_c/irml_debug.pdb
new file mode 100644 (file)
index 0000000..174a670
Binary files /dev/null and b/tbb30_20100406oss/bin/ia32/vc10/irml_c/irml_debug.pdb differ
diff --git a/tbb30_20100406oss/bin/ia32/vc10/tbb.dll b/tbb30_20100406oss/bin/ia32/vc10/tbb.dll
new file mode 100644 (file)
index 0000000..f99cb7c
Binary files /dev/null and b/tbb30_20100406oss/bin/ia32/vc10/tbb.dll differ
diff --git a/tbb30_20100406oss/bin/ia32/vc10/tbb.pdb b/tbb30_20100406oss/bin/ia32/vc10/tbb.pdb
new file mode 100644 (file)
index 0000000..0ff4a8b
Binary files /dev/null and b/tbb30_20100406oss/bin/ia32/vc10/tbb.pdb differ
diff --git a/tbb30_20100406oss/bin/ia32/vc10/tbb_debug.dll b/tbb30_20100406oss/bin/ia32/vc10/tbb_debug.dll
new file mode 100644 (file)
index 0000000..9831add
Binary files /dev/null and b/tbb30_20100406oss/bin/ia32/vc10/tbb_debug.dll differ
diff --git a/tbb30_20100406oss/bin/ia32/vc10/tbb_debug.pdb b/tbb30_20100406oss/bin/ia32/vc10/tbb_debug.pdb
new file mode 100644 (file)
index 0000000..dec1511
Binary files /dev/null and b/tbb30_20100406oss/bin/ia32/vc10/tbb_debug.pdb differ
diff --git a/tbb30_20100406oss/bin/ia32/vc10/tbbmalloc.dll b/tbb30_20100406oss/bin/ia32/vc10/tbbmalloc.dll
new file mode 100644 (file)
index 0000000..703736b
Binary files /dev/null and b/tbb30_20100406oss/bin/ia32/vc10/tbbmalloc.dll differ
diff --git a/tbb30_20100406oss/bin/ia32/vc10/tbbmalloc.pdb b/tbb30_20100406oss/bin/ia32/vc10/tbbmalloc.pdb
new file mode 100644 (file)
index 0000000..f7b5b98
Binary files /dev/null and b/tbb30_20100406oss/bin/ia32/vc10/tbbmalloc.pdb differ
diff --git a/tbb30_20100406oss/bin/ia32/vc10/tbbmalloc_debug.dll b/tbb30_20100406oss/bin/ia32/vc10/tbbmalloc_debug.dll
new file mode 100644 (file)
index 0000000..5dfe958
Binary files /dev/null and b/tbb30_20100406oss/bin/ia32/vc10/tbbmalloc_debug.dll differ
diff --git a/tbb30_20100406oss/bin/ia32/vc10/tbbmalloc_debug.pdb b/tbb30_20100406oss/bin/ia32/vc10/tbbmalloc_debug.pdb
new file mode 100644 (file)
index 0000000..8820bde
Binary files /dev/null and b/tbb30_20100406oss/bin/ia32/vc10/tbbmalloc_debug.pdb differ
diff --git a/tbb30_20100406oss/bin/ia32/vc10/tbbmalloc_proxy.dll b/tbb30_20100406oss/bin/ia32/vc10/tbbmalloc_proxy.dll
new file mode 100644 (file)
index 0000000..6cd458e
Binary files /dev/null and b/tbb30_20100406oss/bin/ia32/vc10/tbbmalloc_proxy.dll differ
diff --git a/tbb30_20100406oss/bin/ia32/vc10/tbbmalloc_proxy.pdb b/tbb30_20100406oss/bin/ia32/vc10/tbbmalloc_proxy.pdb
new file mode 100644 (file)
index 0000000..1acef9b
Binary files /dev/null and b/tbb30_20100406oss/bin/ia32/vc10/tbbmalloc_proxy.pdb differ
diff --git a/tbb30_20100406oss/bin/ia32/vc10/tbbmalloc_proxy_debug.dll b/tbb30_20100406oss/bin/ia32/vc10/tbbmalloc_proxy_debug.dll
new file mode 100644 (file)
index 0000000..b88eecf
Binary files /dev/null and b/tbb30_20100406oss/bin/ia32/vc10/tbbmalloc_proxy_debug.dll differ
diff --git a/tbb30_20100406oss/bin/ia32/vc10/tbbmalloc_proxy_debug.pdb b/tbb30_20100406oss/bin/ia32/vc10/tbbmalloc_proxy_debug.pdb
new file mode 100644 (file)
index 0000000..ad13b14
Binary files /dev/null and b/tbb30_20100406oss/bin/ia32/vc10/tbbmalloc_proxy_debug.pdb differ
diff --git a/tbb30_20100406oss/bin/ia32/vc10/tbbvars.bat b/tbb30_20100406oss/bin/ia32/vc10/tbbvars.bat
new file mode 100644 (file)
index 0000000..e19b407
--- /dev/null
@@ -0,0 +1,32 @@
+@echo off
+REM
+REM Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+REM
+REM This file is part of Threading Building Blocks.
+REM
+REM Threading Building Blocks is free software; you can redistribute it
+REM and/or modify it under the terms of the GNU General Public License
+REM version 2 as published by the Free Software Foundation.
+REM
+REM Threading Building Blocks is distributed in the hope that it will be
+REM useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+REM of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+REM GNU General Public License for more details.
+REM
+REM You should have received a copy of the GNU General Public License
+REM along with Threading Building Blocks; if not, write to the Free Software
+REM Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+REM
+REM As a special exception, you may use this file as part of a free software
+REM library without restriction.  Specifically, if other files instantiate
+REM templates or use macros or inline functions from this file, or you compile
+REM this file and link it with other files to produce an executable, this
+REM file does not by itself cause the resulting executable to be covered by
+REM the GNU General Public License.  This exception does not however
+REM invalidate any other reasons why the executable file might be covered by
+REM the GNU General Public License.
+REM
+set TBB_TARGET_ARCH=ia32
+set TBB_TARGET_VS=vc10
+if exist "%~d0%~p0..\..\tbbvars.bat" call "%~d0%~p0..\..\tbbvars.bat" arch_placeholder vs_placeholder
+if exist "%~d0%~p0..\..\..\..\tbb\bin\tbbvars.bat" call "%~d0%~p0..\..\..\..\tbb\bin\tbbvars.bat" arch_placeholder vs_placeholder
diff --git a/tbb30_20100406oss/bin/ia32/vc10/tbbvars.csh b/tbb30_20100406oss/bin/ia32/vc10/tbbvars.csh
new file mode 100644 (file)
index 0000000..398fd83
--- /dev/null
@@ -0,0 +1,45 @@
+#!/bin/csh
+#
+# Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+#
+# This file is part of Threading Building Blocks.
+#
+# Threading Building Blocks is free software; you can redistribute it
+# and/or modify it under the terms of the GNU General Public License
+# version 2 as published by the Free Software Foundation.
+#
+# Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# As a special exception, you may use this file as part of a free software
+# library without restriction.  Specifically, if other files instantiate
+# templates or use macros or inline functions from this file, or you compile
+# this file and link it with other files to produce an executable, this
+# file does not by itself cause the resulting executable to be covered by
+# the GNU General Public License.  This exception does not however
+# invalidate any other reasons why the executable file might be covered by
+# the GNU General Public License.
+
+setenv TBB30_INSTALL_DIR "SUBSTITUTE_INSTALL_DIR_HERE"
+setenv TBB_ARCH_PLATFORM "ia32\vc10"
+if (! $?PATH) then
+    setenv PATH "${TBB30_INSTALL_DIR}\bin\${TBB_ARCH_PLATFORM}"
+else
+    setenv PATH "${TBB30_INSTALL_DIR}\bin\${TBB_ARCH_PLATFORM};$PATH"
+endif
+if (! $?LIB) then
+    setenv LIB "${TBB30_INSTALL_DIR}\lib\${TBB_ARCH_PLATFORM}"
+else
+    setenv LIB "${TBB30_INSTALL_DIR}\lib\${TBB_ARCH_PLATFORM};$LIB"
+endif
+if (! $?INCLUDE) then
+    setenv INCLUDE "${TBB30_INSTALL_DIR}\include"
+else
+    setenv INCLUDE "${TBB30_INSTALL_DIR}\include;$INCLUDE"
+endif
diff --git a/tbb30_20100406oss/bin/ia32/vc10/tbbvars.sh b/tbb30_20100406oss/bin/ia32/vc10/tbbvars.sh
new file mode 100644 (file)
index 0000000..0bae236
--- /dev/null
@@ -0,0 +1,45 @@
+#!/bin/sh
+#
+# Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+#
+# This file is part of Threading Building Blocks.
+#
+# Threading Building Blocks is free software; you can redistribute it
+# and/or modify it under the terms of the GNU General Public License
+# version 2 as published by the Free Software Foundation.
+#
+# Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# As a special exception, you may use this file as part of a free software
+# library without restriction.  Specifically, if other files instantiate
+# templates or use macros or inline functions from this file, or you compile
+# this file and link it with other files to produce an executable, this
+# file does not by itself cause the resulting executable to be covered by
+# the GNU General Public License.  This exception does not however
+# invalidate any other reasons why the executable file might be covered by
+# the GNU General Public License.
+
+TBB30_INSTALL_DIR="SUBSTITUTE_SH_INSTALL_DIR_HERE"; export TBB30_INSTALL_DIR
+TBB_ARCH_PLATFORM="ia32/vc10"
+if [ -z "${PATH}" ]; then
+    PATH="${TBB30_INSTALL_DIR}/bin/${TBB_ARCH_PLATFORM}"; export PATH
+else
+    PATH="${TBB30_INSTALL_DIR}/bin/${TBB_ARCH_PLATFORM};$PATH"; export PATH
+fi
+if [ -z "${LIB}" ]; then
+    LIB="${TBB30_INSTALL_DIR}/lib/${TBB_ARCH_PLATFORM}"; export LIB
+else
+    LIB="${TBB30_INSTALL_DIR}/lib/${TBB_ARCH_PLATFORM};$LIB"; export LIB
+fi
+if [ -z "${INCLUDE}" ]; then
+    INCLUDE="${TBB30_INSTALL_DIR}/include"; export INCLUDE
+else
+    INCLUDE="${TBB30_INSTALL_DIR}/include;$INCLUDE"; export INCLUDE
+fi
diff --git a/tbb30_20100406oss/bin/tbbvars.bat b/tbb30_20100406oss/bin/tbbvars.bat
new file mode 100644 (file)
index 0000000..4f15a1d
--- /dev/null
@@ -0,0 +1,75 @@
+@echo off
+REM
+REM Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+REM
+REM This file is part of Threading Building Blocks.
+REM
+REM Threading Building Blocks is free software; you can redistribute it
+REM and/or modify it under the terms of the GNU General Public License
+REM version 2 as published by the Free Software Foundation.
+REM
+REM Threading Building Blocks is distributed in the hope that it will be
+REM useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+REM of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+REM GNU General Public License for more details.
+REM
+REM You should have received a copy of the GNU General Public License
+REM along with Threading Building Blocks; if not, write to the Free Software
+REM Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+REM
+REM As a special exception, you may use this file as part of a free software
+REM library without restriction.  Specifically, if other files instantiate
+REM templates or use macros or inline functions from this file, or you compile
+REM this file and link it with other files to produce an executable, this
+REM file does not by itself cause the resulting executable to be covered by
+REM the GNU General Public License.  This exception does not however
+REM invalidate any other reasons why the executable file might be covered by
+REM the GNU General Public License.
+REM
+
+set SCRIPT_NAME=%~nx0
+if (%1) == () goto Syntax
+
+SET TBB30_BIN_DIR=%~d0%~p0
+
+SET TBB30_INSTALL_DIR=%TBB30_BIN_DIR%..
+
+:ParseArgs
+:: Parse the incoming arguments
+if /i "%1"==""        goto SetEnv
+if /i "%1"=="ia32"         (set TBB_TARGET_ARCH=ia32)    & shift & goto ParseArgs
+if /i "%1"=="intel64"      (set TBB_TARGET_ARCH=intel64) & shift & goto ParseArgs
+if /i "%1"=="vs2005"       (set TBB_TARGET_VS=vc8)       & shift & goto ParseArgs
+if /i "%1"=="vs2008"       (set TBB_TARGET_VS=vc9)       & shift & goto ParseArgs
+if /i "%1"=="vs2010"       (set TBB_TARGET_VS=vc10)      & shift & goto ParseArgs
+if /i "%1"=="all"          (set TBB_TARGET_VS=vc_mt)     & shift & goto ParseArgs
+
+:SetEnv
+
+if  ("%TBB_TARGET_VS%") == ("") set TBB_TARGET_VS=vc_mt
+
+SET TBB_ARCH_PLATFORM=%TBB_TARGET_ARCH%\%TBB_TARGET_VS%
+if exist "%TBB30_BIN_DIR%\%TBB_ARCH_PLATFORM%\tbb.dll" SET PATH=%TBB30_BIN_DIR%\%TBB_ARCH_PLATFORM%;%PATH%
+if exist "%TBB30_INSTALL_DIR%\..\redist\%TBB_TARGET_ARCH%\tbb\%TBB_TARGET_VS%\tbb.dll" SET PATH=%TBB30_INSTALL_DIR%\..\redist\%TBB_TARGET_ARCH%\tbb\%TBB_TARGET_VS%;%PATH%
+SET LIB=%TBB30_INSTALL_DIR%\lib\%TBB_ARCH_PLATFORM%;%LIB%
+SET INCLUDE=%TBB30_INSTALL_DIR%\include;%INCLUDE%
+IF ("%ICPP_COMPILER11%") NEQ ("") SET TBB_CXX=icl.exe
+IF ("%ICPP_COMPILER12%") NEQ ("") SET TBB_CXX=icl.exe
+goto End
+
+:Syntax
+echo Syntax:
+echo  %SCRIPT_NAME% ^<arch^> ^<vs^>
+echo    ^<arch^> must be is one of the following
+echo        ia32         : Set up for IA-32  architecture
+echo        intel64      : Set up for Intel(R) 64  architecture
+echo    ^<vs^> should be one of the following
+echo        vs2005      : Set to use with Microsoft Visual Studio 2005 runtime DLLs
+echo        vs2008      : Set to use with Microsoft Visual Studio 2008 runtime DLLs
+echo        vs2010      : Set to use with Microsoft Visual Studio 2010 runtime DLLs
+echo        all         : Set to use TBB statically linked with Microsoft Visual C++ runtime
+echo    if ^<vs^> is not set TBB statically linked with Microsoft Visual C++ runtime will be used.
+exit /B 1
+
+:End
+exit /B 0
\ No newline at end of file
diff --git a/tbb30_20100406oss/include/index.html b/tbb30_20100406oss/include/index.html
new file mode 100644 (file)
index 0000000..dddfb9d
--- /dev/null
@@ -0,0 +1,24 @@
+<HTML>
+<BODY>
+
+<H2>Overview</H2>
+Include files for Threading Building Blocks.
+
+<H2>Directories</H2>
+<DL>
+<DT><A HREF="tbb/index.html">tbb</A>
+<DD>Include files for Threading Building Blocks classes and functions.
+</DL>
+
+<HR>
+<A HREF="../index.html">Up to parent directory</A>
+<p></p>
+Copyright &copy; 2005-2010 Intel Corporation.  All Rights Reserved.
+<p></p>
+Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are 
+registered trademarks or trademarks of Intel Corporation or its 
+subsidiaries in the United States and other countries. 
+<p></p>
+* Other names and brands may be claimed as the property of others.
+</BODY>
+</HTML>
diff --git a/tbb30_20100406oss/include/tbb/_concurrent_queue_internal.h b/tbb30_20100406oss/include/tbb/_concurrent_queue_internal.h
new file mode 100644 (file)
index 0000000..a7bbbb8
--- /dev/null
@@ -0,0 +1,1016 @@
+/*
+    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB_concurrent_queue_internal_H
+#define __TBB_concurrent_queue_internal_H
+
+#include "tbb_stddef.h"
+#include "tbb_machine.h"
+#include "atomic.h"
+#include "spin_mutex.h"
+#include "cache_aligned_allocator.h"
+#include "tbb_exception.h"
+#include <new>
+
+#if !TBB_USE_EXCEPTIONS && _MSC_VER
+    // Suppress "C++ exception handler used, but unwind semantics are not enabled" warning in STL headers
+    #pragma warning (push)
+    #pragma warning (disable: 4530)
+#endif
+
+#include <iterator>
+
+#if !TBB_USE_EXCEPTIONS && _MSC_VER
+    #pragma warning (pop)
+#endif
+
+
+namespace tbb {
+
+#if !__TBB_TEMPLATE_FRIENDS_BROKEN
+
+// forward declaration
+namespace strict_ppl {
+template<typename T, typename A> class concurrent_queue;
+}
+
+template<typename T, typename A> class concurrent_bounded_queue;
+
+namespace deprecated {
+template<typename T, typename A> class concurrent_queue;
+}
+#endif
+
+//! For internal use only.
+namespace strict_ppl {
+
+//! @cond INTERNAL
+namespace internal {
+
+using namespace tbb::internal;
+
+typedef size_t ticket;
+
+template<typename T> class micro_queue ;
+template<typename T> class micro_queue_pop_finalizer ;
+template<typename T> class concurrent_queue_base_v3;
+
+//! parts of concurrent_queue_rep that do not have references to micro_queue
+/**
+ * For internal use only.
+ */
+struct concurrent_queue_rep_base : no_copy {
+    template<typename T> friend class micro_queue;
+    template<typename T> friend class concurrent_queue_base_v3;
+
+protected:
+    //! Approximately n_queue/golden ratio
+    static const size_t phi = 3;
+
+public:
+    // must be power of 2
+    static const size_t n_queue = 8;
+
+    //! Prefix on a page
+    struct page {
+        page* next;
+        uintptr_t mask; 
+    };
+
+    atomic<ticket> head_counter;
+    char pad1[NFS_MaxLineSize-sizeof(atomic<ticket>)];
+    atomic<ticket> tail_counter;
+    char pad2[NFS_MaxLineSize-sizeof(atomic<ticket>)];
+
+    //! Always a power of 2
+    size_t items_per_page;
+
+    //! Size of an item
+    size_t item_size;
+
+    //! number of invalid entries in the queue
+    atomic<size_t> n_invalid_entries;
+
+    char pad3[NFS_MaxLineSize-sizeof(size_t)-sizeof(size_t)-sizeof(atomic<size_t>)];
+} ;
+
+inline bool is_valid_page(const concurrent_queue_rep_base::page* p) {
+    return uintptr_t(p)>1;
+}
+
+//! Abstract class to define interface for page allocation/deallocation
+/**
+ * For internal use only.
+ */
+class concurrent_queue_page_allocator
+{
+    template<typename T> friend class micro_queue ;
+    template<typename T> friend class micro_queue_pop_finalizer ;
+protected:
+    virtual ~concurrent_queue_page_allocator() {}
+private:
+    virtual concurrent_queue_rep_base::page* allocate_page() = 0;
+    virtual void deallocate_page( concurrent_queue_rep_base::page* p ) = 0;
+} ;
+
+#if _MSC_VER && !defined(__INTEL_COMPILER)
+// unary minus operator applied to unsigned type, result still unsigned
+#pragma warning( push )
+#pragma warning( disable: 4146 )
+#endif
+
+//! A queue using simple locking.
+/** For efficient, this class has no constructor.  
+    The caller is expected to zero-initialize it. */
+template<typename T>
+class micro_queue : no_copy {
+    typedef concurrent_queue_rep_base::page page;
+
+    //! Class used to ensure exception-safety of method "pop" 
+    class destroyer: no_copy {
+        T& my_value;
+    public:
+        destroyer( T& value ) : my_value(value) {}
+        ~destroyer() {my_value.~T();}          
+    };
+
+    void copy_item( page& dst, size_t index, const void* src ) {
+        new( &get_ref(dst,index) ) T(*static_cast<const T*>(src)); 
+    }
+
+    void copy_item( page& dst, size_t dindex, const page& src, size_t sindex ) {
+        new( &get_ref(dst,dindex) ) T( get_ref(const_cast<page&>(src),sindex) );
+    }
+
+    void assign_and_destroy_item( void* dst, page& src, size_t index ) {
+        T& from = get_ref(src,index);
+        destroyer d(from);
+        *static_cast<T*>(dst) = from;
+    }
+
+    void spin_wait_until_my_turn( atomic<ticket>& counter, ticket k, concurrent_queue_rep_base& rb ) const ;
+
+public:
+    friend class micro_queue_pop_finalizer<T>;
+
+    struct padded_page: page {
+        //! Not defined anywhere - exists to quiet warnings.
+        padded_page(); 
+        //! Not defined anywhere - exists to quiet warnings.
+        void operator=( const padded_page& );
+        //! Must be last field.
+        T last;
+    };
+
+    static T& get_ref( page& p, size_t index ) {
+        return (&static_cast<padded_page*>(static_cast<void*>(&p))->last)[index];
+    }
+
+    atomic<page*> head_page;
+    atomic<ticket> head_counter;
+
+    atomic<page*> tail_page;
+    atomic<ticket> tail_counter;
+
+    spin_mutex page_mutex;
+    
+    void push( const void* item, ticket k, concurrent_queue_base_v3<T>& base ) ;
+
+    bool pop( void* dst, ticket k, concurrent_queue_base_v3<T>& base ) ;
+
+    micro_queue& assign( const micro_queue& src, concurrent_queue_base_v3<T>& base ) ;
+
+    page* make_copy( concurrent_queue_base_v3<T>& base, const page* src_page, size_t begin_in_page, size_t end_in_page, ticket& g_index ) ;
+
+    void invalidate_page_and_rethrow( ticket k ) ;
+};
+
+template<typename T>
+void micro_queue<T>::spin_wait_until_my_turn( atomic<ticket>& counter, ticket k, concurrent_queue_rep_base& rb ) const {
+    atomic_backoff backoff;
+    do {
+        backoff.pause();
+        if( counter&1 ) {
+            ++rb.n_invalid_entries;
+            throw_exception( eid_bad_last_alloc );
+        }
+    } while( counter!=k ) ;
+}
+
+template<typename T>
+void micro_queue<T>::push( const void* item, ticket k, concurrent_queue_base_v3<T>& base ) {
+    k &= -concurrent_queue_rep_base::n_queue;
+    page* p = NULL;
+    size_t index = k/concurrent_queue_rep_base::n_queue & (base.my_rep->items_per_page-1);
+    if( !index ) {
+        __TBB_TRY {
+            concurrent_queue_page_allocator& pa = base;
+            p = pa.allocate_page();
+        } __TBB_CATCH (...) {
+            ++base.my_rep->n_invalid_entries;
+            invalidate_page_and_rethrow( k );
+        }
+        p->mask = 0;
+        p->next = NULL;
+    }
+    
+    if( tail_counter!=k ) spin_wait_until_my_turn( tail_counter, k, *base.my_rep );
+        
+    if( p ) {
+        spin_mutex::scoped_lock lock( page_mutex );
+        page* q = tail_page;
+        if( is_valid_page(q) )
+            q->next = p;
+        else
+            head_page = p; 
+        tail_page = p;
+    } else {
+        p = tail_page;
+    }
+   
+    __TBB_TRY {
+        copy_item( *p, index, item );
+        // If no exception was thrown, mark item as present.
+        p->mask |= uintptr_t(1)<<index;
+        tail_counter += concurrent_queue_rep_base::n_queue; 
+    } __TBB_CATCH (...) {
+        ++base.my_rep->n_invalid_entries;
+        tail_counter += concurrent_queue_rep_base::n_queue; 
+        __TBB_RETHROW();
+    }
+}
+
+template<typename T>
+bool micro_queue<T>::pop( void* dst, ticket k, concurrent_queue_base_v3<T>& base ) {
+    k &= -concurrent_queue_rep_base::n_queue;
+    if( head_counter!=k ) spin_wait_until_eq( head_counter, k );
+    if( tail_counter==k ) spin_wait_while_eq( tail_counter, k );
+    page& p = *head_page;
+    __TBB_ASSERT( &p, NULL );
+    size_t index = k/concurrent_queue_rep_base::n_queue & (base.my_rep->items_per_page-1);
+    bool success = false; 
+    {
+        micro_queue_pop_finalizer<T> finalizer( *this, base, k+concurrent_queue_rep_base::n_queue, index==base.my_rep->items_per_page-1 ? &p : NULL ); 
+        if( p.mask & uintptr_t(1)<<index ) {
+            success = true;
+            assign_and_destroy_item( dst, p, index );
+        } else {
+            --base.my_rep->n_invalid_entries;
+        }
+    }
+    return success;
+}
+
+template<typename T>
+micro_queue<T>& micro_queue<T>::assign( const micro_queue<T>& src, concurrent_queue_base_v3<T>& base ) {
+    head_counter = src.head_counter;
+    tail_counter = src.tail_counter;
+    page_mutex   = src.page_mutex;
+
+    const page* srcp = src.head_page;
+    if( is_valid_page(srcp) ) {
+        ticket g_index = head_counter;
+        __TBB_TRY {
+            size_t n_items  = (tail_counter-head_counter)/concurrent_queue_rep_base::n_queue;
+            size_t index = head_counter/concurrent_queue_rep_base::n_queue & (base.my_rep->items_per_page-1);
+            size_t end_in_first_page = (index+n_items<base.my_rep->items_per_page)?(index+n_items):base.my_rep->items_per_page;
+
+            head_page = make_copy( base, srcp, index, end_in_first_page, g_index );
+            page* cur_page = head_page;
+
+            if( srcp != src.tail_page ) {
+                for( srcp = srcp->next; srcp!=src.tail_page; srcp=srcp->next ) {
+                    cur_page->next = make_copy( base, srcp, 0, base.my_rep->items_per_page, g_index );
+                    cur_page = cur_page->next;
+                }
+
+                __TBB_ASSERT( srcp==src.tail_page, NULL );
+                size_t last_index = tail_counter/concurrent_queue_rep_base::n_queue & (base.my_rep->items_per_page-1);
+                if( last_index==0 ) last_index = base.my_rep->items_per_page;
+
+                cur_page->next = make_copy( base, srcp, 0, last_index, g_index );
+                cur_page = cur_page->next;
+            }
+            tail_page = cur_page;
+        } __TBB_CATCH (...) {
+            invalidate_page_and_rethrow( g_index );
+        }
+    } else {
+        head_page = tail_page = NULL;
+    }
+    return *this;
+}
+
+template<typename T>
+void micro_queue<T>::invalidate_page_and_rethrow( ticket k ) {
+    // Append an invalid page at address 1 so that no more pushes are allowed.
+    page* invalid_page = (page*)uintptr_t(1);
+    {
+        spin_mutex::scoped_lock lock( page_mutex );
+        tail_counter = k+concurrent_queue_rep_base::n_queue+1;
+        page* q = tail_page;
+        if( is_valid_page(q) )
+            q->next = invalid_page;
+        else
+            head_page = invalid_page;
+        tail_page = invalid_page;
+    }
+    __TBB_RETHROW();
+}
+
+template<typename T>
+concurrent_queue_rep_base::page* micro_queue<T>::make_copy( concurrent_queue_base_v3<T>& base, const concurrent_queue_rep_base::page* src_page, size_t begin_in_page, size_t end_in_page, ticket& g_index ) {
+    concurrent_queue_page_allocator& pa = base;
+    page* new_page = pa.allocate_page();
+    new_page->next = NULL;
+    new_page->mask = src_page->mask;
+    for( ; begin_in_page!=end_in_page; ++begin_in_page, ++g_index )
+        if( new_page->mask & uintptr_t(1)<<begin_in_page )
+            copy_item( *new_page, begin_in_page, *src_page, begin_in_page );
+    return new_page;
+}
+
+template<typename T>
+class micro_queue_pop_finalizer: no_copy {
+    typedef concurrent_queue_rep_base::page page;
+    ticket my_ticket;
+    micro_queue<T>& my_queue;
+    page* my_page; 
+    concurrent_queue_page_allocator& allocator;
+public:
+    micro_queue_pop_finalizer( micro_queue<T>& queue, concurrent_queue_base_v3<T>& b, ticket k, page* p ) :
+        my_ticket(k), my_queue(queue), my_page(p), allocator(b)
+    {}
+    ~micro_queue_pop_finalizer() ;
+};
+
+template<typename T>
+micro_queue_pop_finalizer<T>::~micro_queue_pop_finalizer() {
+    page* p = my_page;
+    if( is_valid_page(p) ) {
+        spin_mutex::scoped_lock lock( my_queue.page_mutex );
+        page* q = p->next;
+        my_queue.head_page = q;
+        if( !is_valid_page(q) ) {
+            my_queue.tail_page = NULL;
+        }
+    }
+    my_queue.head_counter = my_ticket;
+    if( is_valid_page(p) ) {
+        allocator.deallocate_page( p );
+    }
+}
+
+#if _MSC_VER && !defined(__INTEL_COMPILER)
+#pragma warning( pop )
+#endif // warning 4146 is back
+
+template<typename T> class concurrent_queue_iterator_rep ;
+template<typename T> class concurrent_queue_iterator_base_v3;
+
+//! representation of concurrent_queue_base
+/**
+ * the class inherits from concurrent_queue_rep_base and defines an array of micro_queue<T>'s
+ */
+template<typename T>
+struct concurrent_queue_rep : public concurrent_queue_rep_base {
+    micro_queue<T> array[n_queue];
+
+    //! Map ticket to an array index
+    static size_t index( ticket k ) {
+        return k*phi%n_queue;
+    }
+
+    micro_queue<T>& choose( ticket k ) {
+        // The formula here approximates LRU in a cache-oblivious way.
+        return array[index(k)];
+    }
+};
+
+//! base class of concurrent_queue
+/**
+ * The class implements the interface defined by concurrent_queue_page_allocator
+ * and has a pointer to an instance of concurrent_queue_rep.
+ */
+template<typename T>
+class concurrent_queue_base_v3: public concurrent_queue_page_allocator {
+    //! Internal representation
+    concurrent_queue_rep<T>* my_rep;
+
+    friend struct concurrent_queue_rep<T>;
+    friend class micro_queue<T>;
+    friend class concurrent_queue_iterator_rep<T>;
+    friend class concurrent_queue_iterator_base_v3<T>;
+
+protected:
+    typedef typename concurrent_queue_rep<T>::page page;
+
+private:
+    typedef typename micro_queue<T>::padded_page padded_page;
+
+    /* override */ virtual page *allocate_page() {
+        concurrent_queue_rep<T>& r = *my_rep;
+        size_t n = sizeof(padded_page) + (r.items_per_page-1)*sizeof(T);
+        return reinterpret_cast<page*>(allocate_block ( n ));
+    }
+
+    /* override */ virtual void deallocate_page( concurrent_queue_rep_base::page *p ) {
+        concurrent_queue_rep<T>& r = *my_rep;
+        size_t n = sizeof(padded_page) + (r.items_per_page-1)*sizeof(T);
+        deallocate_block( reinterpret_cast<void*>(p), n );
+    }
+
+    //! custom allocator
+    virtual void *allocate_block( size_t n ) = 0;
+
+    //! custom de-allocator
+    virtual void deallocate_block( void *p, size_t n ) = 0;
+
+protected:
+    concurrent_queue_base_v3();
+
+    /* override */ virtual ~concurrent_queue_base_v3() {
+#if __TBB_USE_ASSERT
+        size_t nq = my_rep->n_queue;
+        for( size_t i=0; i<nq; i++ )
+            __TBB_ASSERT( my_rep->array[i].tail_page==NULL, "pages were not freed properly" );
+#endif /* __TBB_USE_ASSERT */
+        cache_aligned_allocator<concurrent_queue_rep<T> >().deallocate(my_rep,1);
+    }
+
+    //! Enqueue item at tail of queue
+    void internal_push( const void* src ) {
+        concurrent_queue_rep<T>& r = *my_rep;
+        ticket k = r.tail_counter++;
+        r.choose(k).push( src, k, *this );
+    }
+
+    //! Attempt to dequeue item from queue.
+    /** NULL if there was no item to dequeue. */
+    bool internal_try_pop( void* dst ) ;
+
+    //! Get size of queue; result may be invalid if queue is modified concurrently
+    size_t internal_size() const ;
+
+    //! check if the queue is empty; thread safe
+    bool internal_empty() const ;
+
+    //! free any remaining pages
+    /* note that the name may be misleading, but it remains so due to a historical accident. */
+    void internal_finish_clear() ;
+
+    //! Obsolete
+    void internal_throw_exception() const {
+        throw_exception( eid_bad_alloc );
+    }
+
+    //! copy internal representation
+    void assign( const concurrent_queue_base_v3& src ) ;
+};
+
+template<typename T>
+concurrent_queue_base_v3<T>::concurrent_queue_base_v3() {
+    const size_t item_size = sizeof(T);
+    my_rep = cache_aligned_allocator<concurrent_queue_rep<T> >().allocate(1);
+    __TBB_ASSERT( (size_t)my_rep % NFS_GetLineSize()==0, "alignment error" );
+    __TBB_ASSERT( (size_t)&my_rep->head_counter % NFS_GetLineSize()==0, "alignment error" );
+    __TBB_ASSERT( (size_t)&my_rep->tail_counter % NFS_GetLineSize()==0, "alignment error" );
+    __TBB_ASSERT( (size_t)&my_rep->array % NFS_GetLineSize()==0, "alignment error" );
+    memset(my_rep,0,sizeof(concurrent_queue_rep<T>));
+    my_rep->item_size = item_size;
+    my_rep->items_per_page = item_size<=8 ? 32 :
+                             item_size<=16 ? 16 : 
+                             item_size<=32 ? 8 :
+                             item_size<=64 ? 4 :
+                             item_size<=128 ? 2 :
+                             1;
+}
+
+template<typename T>
+bool concurrent_queue_base_v3<T>::internal_try_pop( void* dst ) {
+    concurrent_queue_rep<T>& r = *my_rep;
+    ticket k;
+    do {
+        k = r.head_counter;
+        for(;;) {
+            if( r.tail_counter<=k ) {
+                // Queue is empty 
+                return false;
+            }
+            // Queue had item with ticket k when we looked.  Attempt to get that item.
+            ticket tk=k;
+#if defined(_MSC_VER) && defined(_Wp64)
+    #pragma warning (push)
+    #pragma warning (disable: 4267)
+#endif
+            k = r.head_counter.compare_and_swap( tk+1, tk );
+#if defined(_MSC_VER) && defined(_Wp64)
+    #pragma warning (pop)
+#endif
+            if( k==tk )
+                break;
+            // Another thread snatched the item, retry.
+        }
+    } while( !r.choose( k ).pop( dst, k, *this ) );
+    return true;
+}
+
+template<typename T>
+size_t concurrent_queue_base_v3<T>::internal_size() const {
+    concurrent_queue_rep<T>& r = *my_rep;
+    __TBB_ASSERT( sizeof(ptrdiff_t)<=sizeof(size_t), NULL );
+    ticket hc = r.head_counter;
+    size_t nie = r.n_invalid_entries;
+    ticket tc = r.tail_counter;
+    __TBB_ASSERT( hc!=tc || !nie, NULL );
+    ptrdiff_t sz = tc-hc-nie;
+    return sz<0 ? 0 :  size_t(sz);
+}
+
+template<typename T>
+bool concurrent_queue_base_v3<T>::internal_empty() const {
+    concurrent_queue_rep<T>& r = *my_rep;
+    ticket tc = r.tail_counter;
+    ticket hc = r.head_counter;
+    // if tc!=r.tail_counter, the queue was not empty at some point between the two reads.
+    return tc==r.tail_counter && tc==hc+r.n_invalid_entries ;
+}
+
+template<typename T>
+void concurrent_queue_base_v3<T>::internal_finish_clear() {
+    concurrent_queue_rep<T>& r = *my_rep;
+    size_t nq = r.n_queue;
+    for( size_t i=0; i<nq; ++i ) {
+        page* tp = r.array[i].tail_page;
+        if( is_valid_page(tp) ) {
+            __TBB_ASSERT( r.array[i].head_page==tp, "at most one page should remain" );
+            deallocate_page( tp );
+            r.array[i].tail_page = NULL;
+        } else 
+            __TBB_ASSERT( !is_valid_page(r.array[i].head_page), "head page pointer corrupt?" );
+    }
+}
+
+template<typename T>
+void concurrent_queue_base_v3<T>::assign( const concurrent_queue_base_v3& src ) {
+    concurrent_queue_rep<T>& r = *my_rep;
+    r.items_per_page = src.my_rep->items_per_page;
+
+    // copy concurrent_queue_rep.
+    r.head_counter = src.my_rep->head_counter;
+    r.tail_counter = src.my_rep->tail_counter;
+    r.n_invalid_entries = src.my_rep->n_invalid_entries;
+
+    // copy micro_queues
+    for( size_t i = 0; i<r.n_queue; ++i )
+        r.array[i].assign( src.my_rep->array[i], *this);
+
+    __TBB_ASSERT( r.head_counter==src.my_rep->head_counter && r.tail_counter==src.my_rep->tail_counter, 
+            "the source concurrent queue should not be concurrently modified." );
+}
+
+template<typename Container, typename Value> class concurrent_queue_iterator;
+
+template<typename T>
+class concurrent_queue_iterator_rep: no_assign {
+    typedef typename micro_queue<T>::padded_page padded_page;
+public:
+    ticket head_counter;
+    const concurrent_queue_base_v3<T>& my_queue;
+    typename concurrent_queue_base_v3<T>::page* array[concurrent_queue_rep<T>::n_queue];
+    concurrent_queue_iterator_rep( const concurrent_queue_base_v3<T>& queue ) :
+        head_counter(queue.my_rep->head_counter),
+        my_queue(queue)
+    {
+        for( size_t k=0; k<concurrent_queue_rep<T>::n_queue; ++k )
+            array[k] = queue.my_rep->array[k].head_page;
+    }
+
+    //! Set item to point to kth element.  Return true if at end of queue or item is marked valid; false otherwise.
+    bool get_item( T*& item, size_t k ) ;
+};
+
+template<typename T>
+bool concurrent_queue_iterator_rep<T>::get_item( T*& item, size_t k ) {
+    if( k==my_queue.my_rep->tail_counter ) {
+        item = NULL;
+        return true;
+    } else {
+        typename concurrent_queue_base_v3<T>::page* p = array[concurrent_queue_rep<T>::index(k)];
+        __TBB_ASSERT(p,NULL);
+        size_t i = k/concurrent_queue_rep<T>::n_queue & (my_queue.my_rep->items_per_page-1);
+        item = &micro_queue<T>::get_ref(*p,i);
+        return (p->mask & uintptr_t(1)<<i)!=0;
+    }
+}
+
+//! Constness-independent portion of concurrent_queue_iterator.
+/** @ingroup containers */
+template<typename Value>
+class concurrent_queue_iterator_base_v3 : no_assign {
+    //! Represents concurrent_queue over which we are iterating.
+    /** NULL if one past last element in queue. */
+    concurrent_queue_iterator_rep<Value>* my_rep;
+
+    template<typename C, typename T, typename U>
+    friend bool operator==( const concurrent_queue_iterator<C,T>& i, const concurrent_queue_iterator<C,U>& j );
+
+    template<typename C, typename T, typename U>
+    friend bool operator!=( const concurrent_queue_iterator<C,T>& i, const concurrent_queue_iterator<C,U>& j );
+protected:
+    //! Pointer to current item
+    Value* my_item;
+
+    //! Default constructor
+    concurrent_queue_iterator_base_v3() : my_rep(NULL), my_item(NULL) {
+#if __GNUC__==4&&__GNUC_MINOR__==3
+        // to get around a possible gcc 4.3 bug
+        __asm__ __volatile__("": : :"memory");
+#endif
+    }
+
+    //! Copy constructor
+    concurrent_queue_iterator_base_v3( const concurrent_queue_iterator_base_v3& i )
+    : no_assign(), my_rep(NULL), my_item(NULL) {
+        assign(i);
+    }
+
+    //! Construct iterator pointing to head of queue.
+    concurrent_queue_iterator_base_v3( const concurrent_queue_base_v3<Value>& queue ) ;
+
+    //! Assignment
+    void assign( const concurrent_queue_iterator_base_v3<Value>& other ) ;
+
+    //! Advance iterator one step towards tail of queue.
+    void advance() ;
+
+    //! Destructor
+    ~concurrent_queue_iterator_base_v3() {
+        cache_aligned_allocator<concurrent_queue_iterator_rep<Value> >().deallocate(my_rep, 1);
+        my_rep = NULL;
+    }
+};
+
+template<typename Value>
+concurrent_queue_iterator_base_v3<Value>::concurrent_queue_iterator_base_v3( const concurrent_queue_base_v3<Value>& queue ) {
+    my_rep = cache_aligned_allocator<concurrent_queue_iterator_rep<Value> >().allocate(1);
+    new( my_rep ) concurrent_queue_iterator_rep<Value>(queue);
+    size_t k = my_rep->head_counter;
+    if( !my_rep->get_item(my_item, k) ) advance();
+}
+
+template<typename Value>
+void concurrent_queue_iterator_base_v3<Value>::assign( const concurrent_queue_iterator_base_v3<Value>& other ) {
+    if( my_rep!=other.my_rep ) {
+        if( my_rep ) {
+            cache_aligned_allocator<concurrent_queue_iterator_rep<Value> >().deallocate(my_rep, 1);
+            my_rep = NULL;
+        }
+        if( other.my_rep ) {
+            my_rep = cache_aligned_allocator<concurrent_queue_iterator_rep<Value> >().allocate(1);
+            new( my_rep ) concurrent_queue_iterator_rep<Value>( *other.my_rep );
+        }
+    }
+    my_item = other.my_item;
+}
+
+template<typename Value>
+void concurrent_queue_iterator_base_v3<Value>::advance() {
+    __TBB_ASSERT( my_item, "attempt to increment iterator past end of queue" );  
+    size_t k = my_rep->head_counter;
+    const concurrent_queue_base_v3<Value>& queue = my_rep->my_queue;
+#if TBB_USE_ASSERT
+    Value* tmp;
+    my_rep->get_item(tmp,k);
+    __TBB_ASSERT( my_item==tmp, NULL );
+#endif /* TBB_USE_ASSERT */
+    size_t i = k/concurrent_queue_rep<Value>::n_queue & (queue.my_rep->items_per_page-1);
+    if( i==queue.my_rep->items_per_page-1 ) {
+        typename concurrent_queue_base_v3<Value>::page*& root = my_rep->array[concurrent_queue_rep<Value>::index(k)];
+        root = root->next;
+    }
+    // advance k
+    my_rep->head_counter = ++k;
+    if( !my_rep->get_item(my_item, k) ) advance();
+}
+
+//! Similar to C++0x std::remove_cv
+/** "tbb_" prefix added to avoid overload confusion with C++0x implementations. */
+template<typename T> struct tbb_remove_cv {typedef T type;};
+template<typename T> struct tbb_remove_cv<const T> {typedef T type;};
+template<typename T> struct tbb_remove_cv<volatile T> {typedef T type;};
+template<typename T> struct tbb_remove_cv<const volatile T> {typedef T type;};
+
+//! Meets requirements of a forward iterator for STL.
+/** Value is either the T or const T type of the container.
+    @ingroup containers */
+template<typename Container, typename Value>
+class concurrent_queue_iterator: public concurrent_queue_iterator_base_v3<typename tbb_remove_cv<Value>::type>,
+        public std::iterator<std::forward_iterator_tag,Value> {
+#if !__TBB_TEMPLATE_FRIENDS_BROKEN
+    template<typename T, class A>
+    friend class ::tbb::strict_ppl::concurrent_queue;
+#else
+public: // workaround for MSVC
+#endif 
+    //! Construct iterator pointing to head of queue.
+    concurrent_queue_iterator( const concurrent_queue_base_v3<Value>& queue ) :
+        concurrent_queue_iterator_base_v3<typename tbb_remove_cv<Value>::type>(queue)
+    {
+    }
+
+public:
+    concurrent_queue_iterator() {}
+
+    concurrent_queue_iterator( const concurrent_queue_iterator<Container,typename Container::value_type>& other ) :
+        concurrent_queue_iterator_base_v3<typename tbb_remove_cv<Value>::type>(other)
+    {}
+
+    //! Iterator assignment
+    concurrent_queue_iterator& operator=( const concurrent_queue_iterator& other ) {
+        assign(other);
+        return *this;
+    }
+
+    //! Reference to current item 
+    Value& operator*() const {
+        return *static_cast<Value*>(this->my_item);
+    }
+
+    Value* operator->() const {return &operator*();}
+
+    //! Advance to next item in queue
+    concurrent_queue_iterator& operator++() {
+        this->advance();
+        return *this;
+    }
+
+    //! Post increment
+    Value* operator++(int) {
+        Value* result = &operator*();
+        operator++();
+        return result;
+    }
+}; // concurrent_queue_iterator
+
+
+template<typename C, typename T, typename U>
+bool operator==( const concurrent_queue_iterator<C,T>& i, const concurrent_queue_iterator<C,U>& j ) {
+    return i.my_item==j.my_item;
+}
+
+template<typename C, typename T, typename U>
+bool operator!=( const concurrent_queue_iterator<C,T>& i, const concurrent_queue_iterator<C,U>& j ) {
+    return i.my_item!=j.my_item;
+}
+
+} // namespace internal
+
+//! @endcond
+
+} // namespace strict_ppl
+
+//! @cond INTERNAL
+namespace internal {
+
+class concurrent_queue_rep;
+class concurrent_queue_iterator_rep;
+class concurrent_queue_iterator_base_v3;
+template<typename Container, typename Value> class concurrent_queue_iterator;
+
+//! For internal use only.
+/** Type-independent portion of concurrent_queue.
+    @ingroup containers */
+class concurrent_queue_base_v3: no_copy {
+    //! Internal representation
+    concurrent_queue_rep* my_rep;
+
+    friend class concurrent_queue_rep;
+    friend struct micro_queue;
+    friend class micro_queue_pop_finalizer;
+    friend class concurrent_queue_iterator_rep;
+    friend class concurrent_queue_iterator_base_v3;
+protected:
+    //! Prefix on a page
+    struct page {
+        page* next;
+        uintptr_t mask; 
+    };
+
+    //! Capacity of the queue
+    ptrdiff_t my_capacity;
+   
+    //! Always a power of 2
+    size_t items_per_page;
+
+    //! Size of an item
+    size_t item_size;
+
+#if __TBB_GCC_3_3_PROTECTED_BROKEN
+public:
+#endif
+    template<typename T>
+    struct padded_page: page {
+        //! Not defined anywhere - exists to quiet warnings.
+        padded_page(); 
+        //! Not defined anywhere - exists to quiet warnings.
+        void operator=( const padded_page& );
+        //! Must be last field.
+        T last;
+    };
+
+private:
+    virtual void copy_item( page& dst, size_t index, const void* src ) = 0;
+    virtual void assign_and_destroy_item( void* dst, page& src, size_t index ) = 0;
+protected:
+    __TBB_EXPORTED_METHOD concurrent_queue_base_v3( size_t item_size );
+    virtual __TBB_EXPORTED_METHOD ~concurrent_queue_base_v3();
+
+    //! Enqueue item at tail of queue
+    void __TBB_EXPORTED_METHOD internal_push( const void* src );
+
+    //! Dequeue item from head of queue
+    void __TBB_EXPORTED_METHOD internal_pop( void* dst );
+
+    //! Attempt to enqueue item onto queue.
+    bool __TBB_EXPORTED_METHOD internal_push_if_not_full( const void* src );
+
+    //! Attempt to dequeue item from queue.
+    /** NULL if there was no item to dequeue. */
+    bool __TBB_EXPORTED_METHOD internal_pop_if_present( void* dst );
+
+    //! Get size of queue
+    ptrdiff_t __TBB_EXPORTED_METHOD internal_size() const;
+
+    //! Check if the queue is emtpy
+    bool __TBB_EXPORTED_METHOD internal_empty() const;
+
+    //! Set the queue capacity
+    void __TBB_EXPORTED_METHOD internal_set_capacity( ptrdiff_t capacity, size_t element_size );
+
+    //! custom allocator
+    virtual page *allocate_page() = 0;
+
+    //! custom de-allocator
+    virtual void deallocate_page( page *p ) = 0;
+
+    //! free any remaining pages
+    /* note that the name may be misleading, but it remains so due to a historical accident. */
+    void __TBB_EXPORTED_METHOD internal_finish_clear() ;
+
+    //! throw an exception
+    void __TBB_EXPORTED_METHOD internal_throw_exception() const;
+
+    //! copy internal representation
+    void __TBB_EXPORTED_METHOD assign( const concurrent_queue_base_v3& src ) ;
+
+private:
+    virtual void copy_page_item( page& dst, size_t dindex, const page& src, size_t sindex ) = 0;
+};
+
+//! Type-independent portion of concurrent_queue_iterator.
+/** @ingroup containers */
+class concurrent_queue_iterator_base_v3 {
+    //! concurrent_queue over which we are iterating.
+    /** NULL if one past last element in queue. */
+    concurrent_queue_iterator_rep* my_rep;
+
+    template<typename C, typename T, typename U>
+    friend bool operator==( const concurrent_queue_iterator<C,T>& i, const concurrent_queue_iterator<C,U>& j );
+
+    template<typename C, typename T, typename U>
+    friend bool operator!=( const concurrent_queue_iterator<C,T>& i, const concurrent_queue_iterator<C,U>& j );
+
+    void initialize( const concurrent_queue_base_v3& queue, size_t offset_of_data );
+protected:
+    //! Pointer to current item
+    void* my_item;
+
+    //! Default constructor
+    concurrent_queue_iterator_base_v3() : my_rep(NULL), my_item(NULL) {}
+
+    //! Copy constructor
+    concurrent_queue_iterator_base_v3( const concurrent_queue_iterator_base_v3& i ) : my_rep(NULL), my_item(NULL) {
+        assign(i);
+    }
+
+    //! Obsolete entry point for constructing iterator pointing to head of queue.
+    /** Does not work correctly for SSE types. */
+    __TBB_EXPORTED_METHOD concurrent_queue_iterator_base_v3( const concurrent_queue_base_v3& queue );
+
+    //! Construct iterator pointing to head of queue.
+    __TBB_EXPORTED_METHOD concurrent_queue_iterator_base_v3( const concurrent_queue_base_v3& queue, size_t offset_of_data );
+
+    //! Assignment
+    void __TBB_EXPORTED_METHOD assign( const concurrent_queue_iterator_base_v3& i );
+
+    //! Advance iterator one step towards tail of queue.
+    void __TBB_EXPORTED_METHOD advance();
+
+    //! Destructor
+    __TBB_EXPORTED_METHOD ~concurrent_queue_iterator_base_v3();
+};
+
+typedef concurrent_queue_iterator_base_v3 concurrent_queue_iterator_base;
+
+//! Meets requirements of a forward iterator for STL.
+/** Value is either the T or const T type of the container.
+    @ingroup containers */
+template<typename Container, typename Value>
+class concurrent_queue_iterator: public concurrent_queue_iterator_base,
+        public std::iterator<std::forward_iterator_tag,Value> {
+
+#if !defined(_MSC_VER) || defined(__INTEL_COMPILER)
+    template<typename T, class A>
+    friend class ::tbb::concurrent_bounded_queue;
+
+    template<typename T, class A>
+    friend class ::tbb::deprecated::concurrent_queue;
+#else
+public: // workaround for MSVC
+#endif 
+    //! Construct iterator pointing to head of queue.
+    concurrent_queue_iterator( const concurrent_queue_base_v3& queue ) :
+        concurrent_queue_iterator_base_v3(queue,__TBB_offsetof(concurrent_queue_base_v3::padded_page<Value>,last))
+    {
+    }
+
+public:
+    concurrent_queue_iterator() {}
+
+    /** If Value==Container::value_type, then this routine is the copy constructor. 
+        If Value==const Container::value_type, then this routine is a conversion constructor. */
+    concurrent_queue_iterator( const concurrent_queue_iterator<Container,typename Container::value_type>& other ) :
+        concurrent_queue_iterator_base_v3(other)
+    {}
+
+    //! Iterator assignment
+    concurrent_queue_iterator& operator=( const concurrent_queue_iterator& other ) {
+        assign(other);
+        return *this;
+    }
+
+    //! Reference to current item 
+    Value& operator*() const {
+        return *static_cast<Value*>(my_item);
+    }
+
+    Value* operator->() const {return &operator*();}
+
+    //! Advance to next item in queue
+    concurrent_queue_iterator& operator++() {
+        advance();
+        return *this;
+    }
+
+    //! Post increment
+    Value* operator++(int) {
+        Value* result = &operator*();
+        operator++();
+        return result;
+    }
+}; // concurrent_queue_iterator
+
+
+template<typename C, typename T, typename U>
+bool operator==( const concurrent_queue_iterator<C,T>& i, const concurrent_queue_iterator<C,U>& j ) {
+    return i.my_item==j.my_item;
+}
+
+template<typename C, typename T, typename U>
+bool operator!=( const concurrent_queue_iterator<C,T>& i, const concurrent_queue_iterator<C,U>& j ) {
+    return i.my_item!=j.my_item;
+}
+
+} // namespace internal;
+
+//! @endcond
+
+} // namespace tbb
+
+#endif /* __TBB_concurrent_queue_internal_H */
diff --git a/tbb30_20100406oss/include/tbb/_concurrent_unordered_internal.h b/tbb30_20100406oss/include/tbb/_concurrent_unordered_internal.h
new file mode 100644 (file)
index 0000000..66b0b97
--- /dev/null
@@ -0,0 +1,1440 @@
+/*
+    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+/* Container implementations in this header are based on PPL implementations 
+   provided by Microsoft. */
+
+#ifndef __TBB_concurrent_unordered_internal_H
+#define __TBB_concurrent_unordered_internal_H
+
+#include "tbb_stddef.h"
+
+#if !TBB_USE_EXCEPTIONS && _MSC_VER
+    // Suppress "C++ exception handler used, but unwind semantics are not enabled" warning in STL headers
+    #pragma warning (push)
+    #pragma warning (disable: 4530)
+#endif
+
+#include <iterator>
+#include <utility>      // Need std::pair
+#include <functional>
+#include <string>       // For tbb_hasher
+#include <cstring>      // Need std::memset
+
+#if !TBB_USE_EXCEPTIONS && _MSC_VER
+    #pragma warning (pop)
+#endif
+
+#include "tbb_machine.h"
+#include "tbb_exception.h"
+#include "tbb_allocator.h"
+
+namespace tbb {
+namespace interface5 {
+//! @cond INTERNAL
+namespace internal {
+
+template <typename T, typename Allocator>
+class split_ordered_list;
+template <typename Traits>
+class concurrent_unordered_base;
+
+// Forward list iterators (without skipping dummy elements)
+template<class Solist, typename Value>
+class flist_iterator : public std::iterator<std::forward_iterator_tag, Value>
+{
+    template <typename T, typename Allocator>
+    friend class split_ordered_list;
+    template <typename Traits>
+    friend class concurrent_unordered_base;
+    template<class M, typename V>
+    friend class flist_iterator;
+
+    typedef typename Solist::nodeptr_t nodeptr_t;
+public:
+    typedef typename Solist::value_type value_type;
+    typedef typename Solist::difference_type difference_type;
+    typedef typename Solist::pointer pointer;
+    typedef typename Solist::reference reference;
+
+    flist_iterator() : my_node_ptr(0) {}
+    flist_iterator( const flist_iterator<Solist, typename Solist::value_type> &other )
+        : my_node_ptr(other.my_node_ptr) {}
+
+    reference operator*() const { return my_node_ptr->my_element; }
+    pointer operator->() const { return &**this; }
+
+    flist_iterator& operator++() {
+        my_node_ptr = my_node_ptr->my_next;
+        return *this;
+    }
+
+    flist_iterator operator++(int) {
+        flist_iterator tmp = *this;
+        ++*this;
+        return tmp;
+    }
+
+protected:
+    flist_iterator(nodeptr_t pnode) : my_node_ptr(pnode) {}
+    nodeptr_t get_node_ptr() const { return my_node_ptr; }
+
+    nodeptr_t my_node_ptr;
+
+    template<typename M, typename T, typename U>
+    friend bool operator==( const flist_iterator<M,T> &i, const flist_iterator<M,U> &j );
+    template<typename M, typename T, typename U>
+    friend bool operator!=( const flist_iterator<M,T>& i, const flist_iterator<M,U>& j );
+};
+
+template<typename Solist, typename T, typename U>
+bool operator==( const flist_iterator<Solist,T> &i, const flist_iterator<Solist,U> &j ) {
+    return i.my_node_ptr == j.my_node_ptr;
+}
+template<typename Solist, typename T, typename U>
+bool operator!=( const flist_iterator<Solist,T>& i, const flist_iterator<Solist,U>& j ) {
+    return i.my_node_ptr != j.my_node_ptr;
+}
+
+// Split-order list iterators, needed to skip dummy elements
+template<class Solist, typename Value>
+class solist_iterator : public flist_iterator<Solist, Value>
+{
+    typedef flist_iterator<Solist, Value> base_type;
+    typedef typename Solist::nodeptr_t nodeptr_t;
+    using base_type::get_node_ptr;
+    template <typename T, typename Allocator>
+    friend class split_ordered_list;
+    template<class M, typename V>
+    friend class solist_iterator;
+    template<typename M, typename T, typename U>
+    friend bool operator==( const solist_iterator<M,T> &i, const solist_iterator<M,U> &j );
+    template<typename M, typename T, typename U>
+    friend bool operator!=( const solist_iterator<M,T>& i, const solist_iterator<M,U>& j );
+
+    const Solist *my_list_ptr;
+    solist_iterator(nodeptr_t pnode, const Solist *plist) : base_type(pnode), my_list_ptr(plist) {}
+
+public:
+    typedef typename Solist::value_type value_type;
+    typedef typename Solist::difference_type difference_type;
+    typedef typename Solist::pointer pointer;
+    typedef typename Solist::reference reference;
+
+    solist_iterator() {}
+    solist_iterator(const solist_iterator<Solist, typename Solist::value_type> &other )
+        : base_type(other), my_list_ptr(other.my_list_ptr) {}
+
+    reference operator*() const {
+        return this->base_type::operator*();
+    }
+
+    pointer operator->() const {
+        return (&**this);
+    }
+
+    solist_iterator& operator++() {
+        do ++(*(base_type *)this);
+        while (get_node_ptr() != NULL && get_node_ptr()->is_dummy());
+
+        return (*this);
+    }
+
+    solist_iterator operator++(int) {
+        solist_iterator tmp = *this;
+        do ++*this;
+        while (get_node_ptr() != NULL && get_node_ptr()->is_dummy());
+
+        return (tmp);
+    }
+};
+
+template<typename Solist, typename T, typename U>
+bool operator==( const solist_iterator<Solist,T> &i, const solist_iterator<Solist,U> &j ) {
+    return i.my_node_ptr == j.my_node_ptr && i.my_list_ptr == j.my_list_ptr;
+}
+template<typename Solist, typename T, typename U>
+bool operator!=( const solist_iterator<Solist,T>& i, const solist_iterator<Solist,U>& j ) {
+    return i.my_node_ptr != j.my_node_ptr || i.my_list_ptr != j.my_list_ptr;
+}
+
+// Forward type and class definitions
+typedef size_t sokey_t;
+
+// Forward list in which elements are sorted in a split-order
+template <typename T, typename Allocator>
+class split_ordered_list
+{
+public:
+    typedef split_ordered_list<T, Allocator> self_type;
+    typedef typename Allocator::template rebind<T>::other allocator_type;
+    struct node;
+    typedef node *nodeptr_t;
+
+    typedef typename allocator_type::size_type size_type;
+    typedef typename allocator_type::difference_type difference_type;
+    typedef typename allocator_type::pointer pointer;
+    typedef typename allocator_type::const_pointer const_pointer;
+    typedef typename allocator_type::reference reference;
+    typedef typename allocator_type::const_reference const_reference;
+    typedef typename allocator_type::value_type value_type;
+
+    typedef solist_iterator<self_type, const value_type> const_iterator;
+    typedef solist_iterator<self_type, value_type> iterator;
+    typedef flist_iterator<self_type, const value_type> raw_const_iterator;
+    typedef flist_iterator<self_type, value_type> raw_iterator;
+
+    // Node that holds the element in a split-ordered list
+    struct node : tbb::internal::no_assign
+    {
+        // Initialize the node with the given order key
+        void init(sokey_t order_key) {
+            my_order_key = order_key;
+            my_next = NULL;
+        }
+
+        // Return the order key (needed for hashing)
+        sokey_t get_order_key() const { // TODO: remove
+            return my_order_key;
+        }
+
+        // Inserts the new element in the list in an atomic fashion
+        nodeptr_t atomic_set_next(nodeptr_t new_node, nodeptr_t current_node)
+        {
+            // Try to change the next pointer on the current element to a new element, only if it still points to the cached next
+            nodeptr_t exchange_node = (nodeptr_t) __TBB_CompareAndSwapW((void *) &my_next, (uintptr_t)new_node, (uintptr_t)current_node);
+
+            if (exchange_node == current_node) // TODO: why this branch?
+            {
+                // Operation succeeded, return the new node
+                return new_node;
+            }
+            else
+            {
+                // Operation failed, return the "interfering" node
+                return exchange_node;
+            }
+        }
+
+        // Checks if this element in the list is a dummy, order enforcing node. Dummy nodes are used by buckets
+        // in the hash table to quickly index into the right subsection of the split-ordered list.
+        bool is_dummy() const {
+            return (my_order_key & 0x1) == 0;
+        }
+
+
+        nodeptr_t  my_next;      // Next element in the list
+        value_type my_element;   // Element storage
+        sokey_t    my_order_key; // Order key for this element
+    };
+
+    // Allocate a new node with the given order key and value
+    nodeptr_t create_node(sokey_t order_key, const T &value) {
+        nodeptr_t pnode = my_node_allocator.allocate(1);
+
+        __TBB_TRY {
+            new(static_cast<void*>(&pnode->my_element)) T(value);
+            pnode->init(order_key);
+        } __TBB_CATCH(...) {
+            my_node_allocator.deallocate(pnode, 1);
+            __TBB_RETHROW();
+        }
+
+        return (pnode);
+    }
+
+    // Allocate a new node with the given order key; used to allocate dummy nodes
+    nodeptr_t create_node(sokey_t order_key) {
+        nodeptr_t pnode = my_node_allocator.allocate(1);
+
+        __TBB_TRY {
+            new(static_cast<void*>(&pnode->my_element)) T();
+            pnode->init(order_key);
+        } __TBB_CATCH(...) {
+            my_node_allocator.deallocate(pnode, 1);
+            __TBB_RETHROW();
+        }
+
+        return (pnode);
+    }
+
+   split_ordered_list(allocator_type a = allocator_type())
+       : my_node_allocator(a), my_element_count(0)
+    {
+        // Immediately allocate a dummy node with order key of 0. This node
+        // will always be the head of the list.
+        my_head = create_node(0);
+    }
+
+    ~split_ordered_list()
+    {
+        // Clear the list
+        clear();
+
+        // Remove the head element which is not cleared by clear()
+        nodeptr_t pnode = my_head;
+        my_head = NULL;
+
+        __TBB_ASSERT(pnode != NULL && pnode->my_next == NULL, "Invalid head list node");
+
+        destroy_node(pnode);
+    }
+
+    // Common forward list functions
+
+    allocator_type get_allocator() const {
+        return (my_node_allocator);
+    }
+
+    void clear() {
+        nodeptr_t pnext;
+        nodeptr_t pnode = my_head;
+
+        __TBB_ASSERT(my_head != NULL, "Invalid head list node");
+        pnext = pnode->my_next;
+        pnode->my_next = NULL;
+        pnode = pnext;
+
+        while (pnode != NULL)
+        {
+            pnext = pnode->my_next;
+            destroy_node(pnode);
+            pnode = pnext;
+        }
+
+        my_element_count = 0;
+    }
+
+    // Returns a first non-dummy element in the SOL
+    iterator begin() {
+        return first_real_iterator(raw_begin());
+    }
+
+    // Returns a first non-dummy element in the SOL
+    const_iterator begin() const {
+        return first_real_iterator(raw_begin());
+    }
+
+    iterator end() {
+        return (iterator(0, this));
+    }
+
+    const_iterator end() const {
+        return (const_iterator(0, this));
+    }
+
+    const_iterator cbegin() const {
+        return (((const self_type *)this)->begin());
+    }
+
+    const_iterator cend() const {
+        return (((const self_type *)this)->end());
+    }
+
+    // Checks if the number of elements (non-dummy) is 0
+    bool empty() const {
+        return (my_element_count == 0);
+    }
+
+    // Returns the number of non-dummy elements in the list
+    size_type size() const {
+        return my_element_count;
+    }
+
+    // Returns the maximum size of the list, determined by the allocator
+    size_type max_size() const {
+        return my_node_allocator.max_size();
+    }
+
+    // Swaps 'this' list with the passed in one
+    void swap(self_type& other)
+    {
+        if (this == &other)
+        {
+            // Nothing to do
+            return;
+        }
+
+        std::swap(my_element_count, other.my_element_count);
+        std::swap(my_head, other.my_head);
+    }
+
+    // Split-order list functions
+
+    // Returns a first element in the SOL, which is always a dummy
+    raw_iterator raw_begin() {
+        return raw_iterator(my_head);
+    }
+
+    // Returns a first element in the SOL, which is always a dummy
+    raw_const_iterator raw_begin() const {
+        return raw_const_iterator(my_head);
+    }
+
+    raw_iterator raw_end() {
+        return raw_iterator(0);
+    }
+
+    raw_const_iterator raw_end() const {
+        return raw_const_iterator(0);
+    }
+
+    static sokey_t get_order_key(const raw_const_iterator& it) {
+        return it.get_node_ptr()->get_order_key();
+    }
+
+    static sokey_t get_safe_order_key(const raw_const_iterator& it) {
+        if( !it.get_node_ptr() ) return sokey_t(~0U);
+        return it.get_node_ptr()->get_order_key();
+    }
+
+    // Returns a public iterator version of the internal iterator. Public iterator must not
+    // be a dummy private iterator.
+    iterator get_iterator(raw_iterator it) {
+        __TBB_ASSERT(it.get_node_ptr() == NULL || !it.get_node_ptr()->is_dummy(), "Invalid user node (dummy)");
+        return iterator(it.get_node_ptr(), this);
+    }
+
+    // Returns a public iterator version of the internal iterator. Public iterator must not
+    // be a dummy private iterator.
+    const_iterator get_iterator(raw_const_iterator it) const {
+        __TBB_ASSERT(it.get_node_ptr() == NULL || !it.get_node_ptr()->is_dummy(), "Invalid user node (dummy)");
+        return const_iterator(it.get_node_ptr(), this);
+    }
+
+    // Returns a non-const version of the raw_iterator
+    raw_iterator get_iterator(raw_const_iterator it) {
+        return raw_iterator(it.get_node_ptr());
+    }
+
+    // Returns a non-const version of the iterator
+    static iterator get_iterator(const_iterator it) {
+        return iterator(it.my_node_ptr, it.my_list_ptr);
+    }
+
+    // Returns a public iterator version of a first non-dummy internal iterator at or after
+    // the passed in internal iterator.
+    iterator first_real_iterator(raw_iterator it)
+    {
+        // Skip all dummy, internal only iterators
+        while (it != raw_end() && it.get_node_ptr()->is_dummy())
+            ++it;
+
+        return iterator(it.get_node_ptr(), this);
+    }
+
+    // Returns a public iterator version of a first non-dummy internal iterator at or after
+    // the passed in internal iterator.
+    const_iterator first_real_iterator(raw_const_iterator it) const
+    {
+        // Skip all dummy, internal only iterators
+        while (it != raw_end() && it.get_node_ptr()->is_dummy())
+            ++it;
+
+        return const_iterator(it.get_node_ptr(), this);
+    }
+
+    // Erase an element using the allocator
+    void destroy_node(nodeptr_t pnode) {
+        my_node_allocator.destroy(pnode);
+        my_node_allocator.deallocate(pnode, 1);
+    }
+
+    // Try to insert a new element in the list. If insert fails, return the node that
+    // was inserted instead.
+    nodeptr_t try_insert(nodeptr_t previous, nodeptr_t new_node, nodeptr_t current_node) {
+        new_node->my_next = current_node;
+        return previous->atomic_set_next(new_node, current_node);
+    }
+
+    // Insert a new element between passed in iterators
+    std::pair<iterator, bool> try_insert(raw_iterator it, raw_iterator next, const value_type &value, sokey_t order_key, size_type *new_count)
+    {
+        nodeptr_t pnode = create_node(order_key, value);
+        nodeptr_t inserted_node = try_insert(it.get_node_ptr(), pnode, next.get_node_ptr());
+
+        if (inserted_node == pnode)
+        {
+            // If the insert succeeded, check that the order is correct and increment the element count
+            check_range();
+            *new_count = __TBB_FetchAndAddW((uintptr_t*)&my_element_count, uintptr_t(1));
+            return std::pair<iterator, bool>(iterator(pnode, this), true);
+        }
+        else
+        {
+            // If the insert failed (element already there), then delete the new one
+            destroy_node(pnode);
+            return std::pair<iterator, bool>(end(), false);
+        }
+    }
+
+    // Insert a new dummy element, starting search at a parent dummy element
+    raw_iterator insert_dummy(raw_iterator it, sokey_t order_key)
+    {
+        raw_iterator last = raw_end();
+        raw_iterator where = it;
+
+        __TBB_ASSERT(where != last, "Invalid head node");
+
+        ++where;
+
+        // Create a dummy element up front, even though it may be discarded (due to concurrent insertion)
+        nodeptr_t dummy_node = create_node(order_key);
+
+        for (;;)
+        {
+            __TBB_ASSERT(it != last, "Invalid head list node");
+
+            // If the head iterator is at the end of the list, or past the point where this dummy
+            // node needs to be inserted, then try to insert it.
+            if (where == last || get_order_key(where) > order_key)
+            {
+                __TBB_ASSERT(get_order_key(it) < order_key, "Invalid node order in the list");
+
+                // Try to insert it in the right place
+                nodeptr_t inserted_node = try_insert(it.get_node_ptr(), dummy_node, where.get_node_ptr());
+
+                if (inserted_node == dummy_node)
+                {
+                    // Insertion succeeded, check the list for order violations
+                    check_range();
+                    return raw_iterator(dummy_node);
+                }
+                else
+                {
+                    // Insertion failed: either dummy node was inserted by another thread, or
+                    // a real element was inserted at exactly the same place as dummy node.
+                    // Proceed with the search from the previous location where order key was
+                    // known to be larger (note: this is legal only because there is no safe
+                    // concurrent erase operation supported).
+                    where = it;
+                    ++where;
+                    continue;
+                }
+            }
+            else if (get_order_key(where) == order_key)
+            {
+                // Another dummy node with the same value found, discard the new one.
+                destroy_node(dummy_node);
+                return where;
+            }
+
+            // Move the iterator forward
+            it = where;
+            ++where;
+        }
+
+    }
+
+    // This erase function can handle both real and dummy nodes
+    void erase_node(raw_iterator previous, raw_const_iterator& where)
+    {
+        nodeptr_t pnode = (where++).get_node_ptr();
+        nodeptr_t prevnode = previous.get_node_ptr();
+        __TBB_ASSERT(prevnode->my_next == pnode, "Erase must take consecutive iterators");
+        prevnode->my_next = pnode->my_next;
+
+        destroy_node(pnode);
+    }
+
+    // Erase the element (previous node needs to be passed because this is a forward only list)
+    iterator erase_node(raw_iterator previous, const_iterator where)
+    {
+        raw_const_iterator it = where;
+        erase_node(previous, it);
+        my_element_count--;
+
+        return get_iterator(first_real_iterator(it));
+    }
+
+    // Move all elements from the passed in split-ordered list to this one
+    void move_all(self_type& source)
+    {
+        raw_const_iterator first = source.raw_begin();
+        raw_const_iterator last = source.raw_end();
+
+        if (first == last)
+            return;
+
+        nodeptr_t previous_node = my_head;
+        raw_const_iterator begin_iterator = first++;
+
+        // Move all elements one by one, including dummy ones
+        for (raw_const_iterator it = first; it != last;)
+        {
+            nodeptr_t pnode = it.get_node_ptr();
+
+            nodeptr_t dummy_node = pnode->is_dummy() ? create_node(pnode->get_order_key()) : create_node(pnode->get_order_key(), pnode->my_element);
+            previous_node = try_insert(previous_node, dummy_node, NULL);
+            __TBB_ASSERT(previous_node != NULL, "Insertion must succeed");
+            raw_const_iterator where = it++;
+            source.erase_node(get_iterator(begin_iterator), where);
+        }
+        check_range();
+    }
+
+
+private:
+
+    // Check the list for order violations
+    void check_range()
+    {
+#if TBB_USE_ASSERT
+        for (raw_iterator it = raw_begin(); it != raw_end(); ++it)
+        {
+            raw_iterator next_iterator = it;
+            ++next_iterator;
+
+            __TBB_ASSERT(next_iterator == end() || next_iterator.get_node_ptr()->get_order_key() >= it.get_node_ptr()->get_order_key(), "!!! List order inconsistency !!!");
+        }
+#endif
+    }
+
+    typename allocator_type::template rebind<node>::other my_node_allocator;  // allocator object for nodes
+    size_type                                             my_element_count;   // Total item count, not counting dummy nodes
+    nodeptr_t                                             my_head;            // pointer to head node
+};
+
+// Template class for hash compare
+template<typename Key, typename Hasher, typename Key_equality>
+class hash_compare
+{
+public:
+    hash_compare() {}
+
+    hash_compare(Hasher a_hasher) : my_hash_object(a_hasher) {}
+
+    hash_compare(Hasher a_hasher, Key_equality a_keyeq) : my_hash_object(a_hasher), my_key_compare_object(a_keyeq) {}
+
+    size_t operator()(const Key& key) const {
+        return ((size_t)my_hash_object(key));
+    }
+
+    bool operator()(const Key& key1, const Key& key2) const {
+        return (!my_key_compare_object(key1, key2));
+    }
+
+    Hasher       my_hash_object;        // The hash object
+    Key_equality my_key_compare_object; // The equality comparator object
+};
+
+#if _MSC_VER
+#pragma warning(push)
+#pragma warning(disable: 4127) // warning 4127 -- while (true) has a constant expression in it (for allow_multimapping)
+#endif
+
+template <typename Traits>
+class concurrent_unordered_base : public Traits
+{
+protected:
+    // Type definitions
+    typedef concurrent_unordered_base<Traits> self_type;
+    typedef typename Traits::value_type value_type;
+    typedef typename Traits::key_type key_type;
+    typedef typename Traits::hash_compare hash_compare;
+    typedef typename Traits::value_compare value_compare;
+    typedef typename Traits::allocator_type allocator_type;
+    typedef typename allocator_type::pointer pointer;
+    typedef typename allocator_type::const_pointer const_pointer;
+    typedef typename allocator_type::reference reference;
+    typedef typename allocator_type::const_reference const_reference;
+    typedef typename allocator_type::size_type size_type;
+    typedef typename allocator_type::difference_type difference_type;
+    typedef split_ordered_list<value_type, typename Traits::allocator_type> solist_t;
+    typedef typename solist_t::nodeptr_t nodeptr_t;
+    // Iterators that walk the entire split-order list, including dummy nodes
+    typedef typename solist_t::raw_iterator raw_iterator;
+    typedef typename solist_t::raw_const_iterator raw_const_iterator;
+    typedef typename solist_t::iterator iterator; // TODO: restore const iterator for unordered_sets
+    typedef typename solist_t::const_iterator const_iterator;
+    typedef iterator local_iterator;
+    typedef const_iterator const_local_iterator;
+    using Traits::my_hash_compare;
+    using Traits::get_key;
+    using Traits::allow_multimapping;
+
+private:
+    typedef std::pair<iterator, iterator> pairii_t;
+    typedef std::pair<const_iterator, const_iterator> paircc_t;
+
+    static size_type const pointers_per_table = sizeof(size_type) * 8;              // One bucket segment per bit
+    static const size_type initial_bucket_number = 8;                               // Initial number of buckets
+    static const size_type initial_bucket_load = 4;                                // Initial maximum number of elements per bucket
+
+protected:
+    // Constructors/Destructors
+    concurrent_unordered_base(size_type n_of_buckets = initial_bucket_number,
+        const hash_compare& hc = hash_compare(), const allocator_type& a = allocator_type())
+        : Traits(hc), my_number_of_buckets(n_of_buckets), my_solist(a),
+          my_allocator(a), my_maximum_bucket_size((float) initial_bucket_load)
+    {
+        internal_init();
+    }
+
+    concurrent_unordered_base(const concurrent_unordered_base& right, const allocator_type& a)
+        : Traits(right.my_hash_compare), my_solist(a), my_allocator(a)
+    {
+        internal_copy(right);
+    }
+
+    concurrent_unordered_base(const concurrent_unordered_base& right)
+        : Traits(right.my_hash_compare), my_solist(right.get_allocator()), my_allocator(right.get_allocator())
+    {
+        internal_init();
+        internal_copy(right);
+    }
+
+    concurrent_unordered_base& operator=(const concurrent_unordered_base& right) {
+        if (this != &right)
+            internal_copy(right);
+        return (*this);
+    }
+
+    ~concurrent_unordered_base() {
+        // Delete all node segments
+        internal_clear();
+    }
+
+public:
+    allocator_type get_allocator() const {
+        return my_solist.get_allocator();
+    }
+
+    // Size and capacity function
+    bool empty() const {
+        return my_solist.empty();
+    }
+
+    size_type size() const {
+        return my_solist.size();
+    }
+
+    size_type max_size() const {
+        return my_solist.max_size();
+    }
+
+    // Iterators 
+    iterator begin() {
+        return my_solist.begin();
+    }
+
+    const_iterator begin() const {
+        return my_solist.begin();
+    }
+
+    iterator end() {
+        return my_solist.end();
+    }
+
+    const_iterator end() const {
+        return my_solist.end();
+    }
+
+    const_iterator cbegin() const {
+        return my_solist.cbegin();
+    }
+
+    const_iterator cend() const {
+        return my_solist.cend();
+    }
+
+    // Parallel traversal support
+    class const_range_type : tbb::internal::no_assign {
+        const concurrent_unordered_base &my_table;
+        raw_const_iterator my_begin_node;
+        raw_const_iterator my_end_node;
+        mutable raw_const_iterator my_midpoint_node;
+    public:
+        //! Type for size of a range
+        typedef typename concurrent_unordered_base::size_type size_type;
+        typedef typename concurrent_unordered_base::value_type value_type;
+        typedef typename concurrent_unordered_base::reference reference;
+        typedef typename concurrent_unordered_base::difference_type difference_type;
+        typedef typename concurrent_unordered_base::const_iterator iterator;
+
+        //! True if range is empty.
+        bool empty() const {return my_begin_node == my_end_node;}
+
+        //! True if range can be partitioned into two subranges.
+        bool is_divisible() const {
+            return my_midpoint_node != my_end_node;
+        }
+        //! Split range.
+        const_range_type( const_range_type &r, split ) : 
+            my_table(r.my_table), my_end_node(r.my_end_node)
+        {
+            r.my_end_node = my_begin_node = r.my_midpoint_node;
+            __TBB_ASSERT( !empty(), "Splitting despite the range is not divisible" );
+            __TBB_ASSERT( !r.empty(), "Splitting despite the range is not divisible" );
+            set_midpoint();
+            r.set_midpoint();
+        }
+        //! Init range with container and grainsize specified
+        const_range_type( const concurrent_unordered_base &a_table ) : 
+            my_table(a_table), my_begin_node(a_table.my_solist.begin()),
+            my_end_node(a_table.my_solist.end())
+        {
+            set_midpoint();
+        }
+        iterator begin() const { return my_table.my_solist.get_iterator(my_begin_node); }
+        iterator end() const { return my_table.my_solist.get_iterator(my_end_node); }
+        //! The grain size for this range.
+        size_type grainsize() const { return 1; }
+
+        //! Set my_midpoint_node to point approximately half way between my_begin_node and my_end_node.
+        void set_midpoint() const {
+            if( my_begin_node == my_end_node ) // not divisible
+                my_midpoint_node = my_end_node;
+            else {
+                sokey_t begin_key = solist_t::get_safe_order_key(my_begin_node);
+                sokey_t end_key = solist_t::get_safe_order_key(my_end_node);
+                size_t mid_bucket = __TBB_ReverseBits( begin_key + (end_key-begin_key)/2 ) % my_table.my_number_of_buckets;
+                while ( !my_table.is_initialized(mid_bucket) ) mid_bucket = my_table.get_parent(mid_bucket);
+                my_midpoint_node = my_table.my_solist.first_real_iterator(my_table.get_bucket( mid_bucket ));
+                if( my_midpoint_node == my_begin_node )
+                    my_midpoint_node = my_end_node;
+#if TBB_USE_ASSERT
+                else {
+                    sokey_t mid_key = solist_t::get_safe_order_key(my_midpoint_node);
+                    __TBB_ASSERT( begin_key < mid_key, "my_begin_node is after my_midpoint_node" );
+                    __TBB_ASSERT( mid_key <= end_key, "my_midpoint_node is after my_end_node" );
+                }
+#endif // TBB_USE_ASSERT
+            }
+        }
+    };
+
+    class range_type : public const_range_type {
+    public:
+        typedef typename concurrent_unordered_base::iterator iterator;
+        //! Split range.
+        range_type( range_type &r, split ) : const_range_type( r, split() ) {}
+        //! Init range with container and grainsize specified
+        range_type( const concurrent_unordered_base &a_table ) : const_range_type(a_table) {}
+
+        iterator begin() const { return solist_t::get_iterator( const_range_type::begin() ); }
+        iterator end() const { return solist_t::get_iterator( const_range_type::end() ); }
+    };
+
+    range_type range() {
+        return range_type( *this );
+    }
+
+    const_range_type range() const {
+        return const_range_type( *this );
+    }
+
+    // Modifiers
+    std::pair<iterator, bool> insert(const value_type& value) {
+        return internal_insert(value);
+    }
+
+    iterator insert(const_iterator, const value_type& value) {
+        // Ignore hint
+        return insert(value).first;
+    }
+
+    template<class Iterator>
+    void insert(Iterator first, Iterator last) {
+        for (Iterator it = first; it != last; ++it)
+            insert(*it);
+    }
+
+    iterator unsafe_erase(const_iterator where) {
+        return internal_erase(where);
+    }
+
+    iterator unsafe_erase(const_iterator first, const_iterator last) {
+        while (first != last)
+            unsafe_erase(first++);
+        return my_solist.get_iterator(first);
+    }
+
+    size_type unsafe_erase(const key_type& key) {
+        pairii_t where = equal_range(key);
+        size_type item_count = internal_distance(where.first, where.second);
+        unsafe_erase(where.first, where.second);
+        return item_count;
+    }
+
+    void swap(concurrent_unordered_base& right) {
+        if (this != &right) {
+            std::swap(my_hash_compare, right.my_hash_compare); // TODO: check what ADL meant here
+            my_solist.swap(right.my_solist);
+            internal_swap_buckets(right);
+            std::swap(my_number_of_buckets, right.my_number_of_buckets);
+            std::swap(my_maximum_bucket_size, right.my_maximum_bucket_size);
+        }
+    }
+
+    // Observers
+    void clear() {
+        // Clear list
+        my_solist.clear();
+
+        // Clear buckets
+        internal_clear();
+    }
+
+    // Lookup
+    iterator find(const key_type& key) {
+        return internal_find(key);
+    }
+
+    const_iterator find(const key_type& key) const {
+        return const_cast<self_type*>(this)->internal_find(key);
+    }
+
+    size_type count(const key_type& key) const {
+        paircc_t answer = equal_range(key);
+        size_type item_count = internal_distance(answer.first, answer.second);
+        return item_count;
+    }
+
+    std::pair<iterator, iterator> equal_range(const key_type& key) {
+        return internal_equal_range(key);
+    }
+
+    std::pair<const_iterator, const_iterator> equal_range(const key_type& key) const {
+        return internal_equal_range(key);
+    }
+
+    // Bucket interface - for debugging 
+    size_type unsafe_bucket_count() const {
+        return my_number_of_buckets;
+    }
+
+    size_type unsafe_max_bucket_count() const {
+        return segment_size(pointers_per_table-1);
+    }
+
+    size_type unsafe_bucket_size(size_type bucket) {
+        size_type item_count = 0;
+        if (is_initialized(bucket)) {
+            raw_iterator it = get_bucket(bucket);
+            ++it;
+            for (; it != my_solist.raw_end() && !it.get_node_ptr()->is_dummy(); ++it)
+                ++item_count;
+        }
+        return item_count;
+    }
+
+    size_type unsafe_bucket(const key_type& key) const {
+        sokey_t order_key = (sokey_t) my_hash_compare(key);
+        size_type bucket = order_key % my_number_of_buckets;
+        return bucket;
+    }
+
+    // If the bucket is initialized, return a first non-dummy element in it
+    local_iterator unsafe_begin(size_type bucket) {
+        if (!is_initialized(bucket))
+            return end();
+
+        raw_iterator it = get_bucket(bucket);
+        return my_solist.first_real_iterator(it);
+    }
+
+    // If the bucket is initialized, return a first non-dummy element in it
+    const_local_iterator unsafe_begin(size_type bucket) const
+    {
+        if (!is_initialized(bucket))
+            return end();
+
+        raw_const_iterator it = get_bucket(bucket);
+        return my_solist.first_real_iterator(it);
+    }
+
+    // @REVIEW: Takes O(n)
+    // Returns the iterator after the last non-dummy element in the bucket
+    local_iterator unsafe_end(size_type bucket)
+    {
+        if (!is_initialized(bucket))
+            return end();
+
+        raw_iterator it = get_bucket(bucket);
+    
+        // Find the end of the bucket, denoted by the dummy element
+        do ++it;
+        while(it != my_solist.raw_end() && !it.get_node_ptr()->is_dummy());
+
+        // Return the first real element past the end of the bucket
+        return my_solist.first_real_iterator(it);
+    }
+
+    // @REVIEW: Takes O(n)
+    // Returns the iterator after the last non-dummy element in the bucket
+    const_local_iterator unsafe_end(size_type bucket) const
+    {
+        if (!is_initialized(bucket))
+            return end();
+
+        raw_const_iterator it = get_bucket(bucket);
+    
+        // Find the end of the bucket, denoted by the dummy element
+        do ++it;
+        while(it != my_solist.raw_end() && !it.get_node_ptr()->is_dummy());
+
+        // Return the first real element past the end of the bucket
+        return my_solist.first_real_iterator(it);
+    }
+
+    const_local_iterator unsafe_cbegin(size_type bucket) const {
+        return ((const self_type *) this)->begin();
+    }
+
+    const_local_iterator unsafe_cend(size_type bucket) const {
+        return ((const self_type *) this)->end();
+    }
+
+    // Hash policy
+    float load_factor() const {
+        return (float) size() / (float) unsafe_bucket_count();
+    }
+
+    float max_load_factor() const {
+        return my_maximum_bucket_size;
+    }
+
+    void max_load_factor(float newmax) {
+        if (newmax != newmax || newmax < 0)
+            tbb::internal::throw_exception(tbb::internal::eid_invalid_load_factor);
+        my_maximum_bucket_size = newmax;
+    }
+
+    // This function is a noop, because the underlying split-ordered list
+    // is already sorted, so an increase in the bucket number will be
+    // reflected next time this bucket is touched.
+    void rehash(size_type buckets) {
+        size_type current_buckets = my_number_of_buckets;
+
+        if (current_buckets > buckets)
+            return;
+        else if ( (buckets & (buckets-1)) != 0 )
+            tbb::internal::throw_exception(tbb::internal::eid_invalid_buckets_number);
+        my_number_of_buckets = buckets;
+    }
+
+private:
+
+    // Initialize the hash and keep the first bucket open
+    void internal_init() {
+        // Allocate an array of segment pointers
+        memset(my_buckets, 0, pointers_per_table * sizeof(void *));
+
+        // Insert the first element in the split-ordered list
+        raw_iterator dummy_node = my_solist.raw_begin();
+        set_bucket(0, dummy_node);
+    }
+
+    void internal_clear() {
+        for (size_type index = 0; index < pointers_per_table; ++index) {
+            if (my_buckets[index] != NULL) {
+                size_type sz = segment_size(index);
+                for (size_type index2 = 0; index2 < sz; ++index2)
+                    my_allocator.destroy(&my_buckets[index][index2]);
+                my_allocator.deallocate(my_buckets[index], sz);
+                my_buckets[index] = 0;
+            }
+        }
+    }
+
+    void internal_copy(const self_type& right) {
+        clear();
+
+        my_maximum_bucket_size = right.my_maximum_bucket_size;
+        my_number_of_buckets = right.my_number_of_buckets;
+
+        __TBB_TRY {
+            insert(right.begin(), right.end());
+            my_hash_compare = right.my_hash_compare;
+        } __TBB_CATCH(...) {
+            my_solist.clear();
+            __TBB_RETHROW();
+        }
+    }
+
+    void internal_swap_buckets(concurrent_unordered_base& right)
+    {
+        // Swap all node segments
+        for (size_type index = 0; index < pointers_per_table; ++index)
+        {
+            raw_iterator * iterator_pointer = my_buckets[index];
+            my_buckets[index] = right.my_buckets[index];
+            right.my_buckets[index] = iterator_pointer;
+        }
+    }
+
+    // Hash APIs
+    size_type internal_distance(const_iterator first, const_iterator last) const
+    {
+        size_type num = 0;
+
+        for (const_iterator it = first; it != last; ++it)
+            ++num;
+
+        return num;
+    }
+
+    // Insert an element in the hash given its value
+    std::pair<iterator, bool> internal_insert(const value_type& value)
+    {
+        sokey_t order_key = (sokey_t) my_hash_compare(get_key(value));
+        size_type bucket = order_key % my_number_of_buckets;
+
+        // If bucket is empty, initialize it first
+        if (!is_initialized(bucket))
+            init_bucket(bucket);
+
+        size_type new_count;
+        order_key = split_order_key_regular(order_key);
+        raw_iterator it = get_bucket(bucket);
+        raw_iterator last = my_solist.raw_end();
+        raw_iterator where = it;
+
+        __TBB_ASSERT(where != last, "Invalid head node");
+
+        // First node is a dummy node
+        ++where;
+
+        for (;;)
+        {
+            if (where == last || solist_t::get_order_key(where) > order_key)
+            {
+                // Try to insert it in the right place
+                std::pair<iterator, bool> result = my_solist.try_insert(it, where, value, order_key, &new_count);
+                
+                if (result.second)
+                {
+                    // Insertion succeeded, adjust the table size, if needed
+                    adjust_table_size(new_count, my_number_of_buckets);
+                    return result;
+                }
+                else
+                {
+                    // Insertion failed: either the same node was inserted by another thread, or
+                    // another element was inserted at exactly the same place as this node.
+                    // Proceed with the search from the previous location where order key was
+                    // known to be larger (note: this is legal only because there is no safe
+                    // concurrent erase operation supported).
+                    where = it;
+                    ++where;
+                    continue;
+                }
+            }
+            else if (!allow_multimapping && solist_t::get_order_key(where) == order_key && my_hash_compare(get_key(*where), get_key(value)) == 0)
+            {
+                // Element already in the list, return it
+                return std::pair<iterator, bool>(my_solist.get_iterator(where), false);
+            }
+
+            // Move the iterator forward
+            it = where;
+            ++where;
+        }
+    }
+
+    // Find the element in the split-ordered list
+    iterator internal_find(const key_type& key)
+    {
+        sokey_t order_key = (sokey_t) my_hash_compare(key);
+        size_type bucket = order_key % my_number_of_buckets;
+
+        // If bucket is empty, initialize it first
+        if (!is_initialized(bucket))
+            init_bucket(bucket);
+
+        order_key = split_order_key_regular(order_key);
+        raw_iterator last = my_solist.raw_end();
+
+        for (raw_iterator it = get_bucket(bucket); it != last; ++it)
+        {
+            if (solist_t::get_order_key(it) > order_key)
+            {
+                // If the order key is smaller than the current order key, the element
+                // is not in the hash.
+                return end();
+            }
+            else if (solist_t::get_order_key(it) == order_key)
+            {
+                // The fact that order keys match does not mean that the element is found.
+                // Key function comparison has to be performed to check whether this is the
+                // right element. If not, keep searching while order key is the same.
+                if (!my_hash_compare(get_key(*it), key))
+                    return my_solist.get_iterator(it);
+            }
+        }
+
+        return end();
+    }
+
+    // Erase an element from the list. This is not a concurrency safe function.
+    iterator internal_erase(const_iterator it)
+    {
+        key_type key = get_key(*it);
+        sokey_t order_key = (sokey_t) my_hash_compare(key);
+        size_type bucket = order_key % my_number_of_buckets;
+
+        // If bucket is empty, initialize it first
+        if (!is_initialized(bucket))
+            init_bucket(bucket);
+
+        order_key = split_order_key_regular(order_key);
+
+        raw_iterator previous = get_bucket(bucket);
+        raw_iterator last = my_solist.raw_end();
+        raw_iterator where = previous;
+
+        __TBB_ASSERT(where != last, "Invalid head node");
+
+        // First node is a dummy node
+        ++where;
+
+        for (;;) {
+            if (where == last)
+                return end();
+            else if (my_solist.get_iterator(where) == it)
+                return my_solist.erase_node(previous, it);
+
+            // Move the iterator forward
+            previous = where;
+            ++where;
+        }
+    }
+
+    // Return the [begin, end) pair of iterators with the same key values.
+    // This operation makes sense only if mapping is many-to-one.
+    pairii_t internal_equal_range(const key_type& key)
+    {
+        sokey_t order_key = (sokey_t) my_hash_compare(key);
+        size_type bucket = order_key % my_number_of_buckets;
+
+        // If bucket is empty, initialize it first
+        if (!is_initialized(bucket))
+            init_bucket(bucket);
+
+        order_key = split_order_key_regular(order_key);
+        raw_iterator end_it = my_solist.raw_end();
+
+        for (raw_iterator it = get_bucket(bucket); it != end_it; ++it)
+        {
+            if (solist_t::get_order_key(it) > order_key)
+            {
+                // There is no element with the given key
+                return pairii_t(end(), end());
+            }
+            else if (solist_t::get_order_key(it) == order_key && !my_hash_compare(get_key(*it), key))
+            {
+                iterator first = my_solist.get_iterator(it);
+                iterator last = first;
+
+                while( last != end() && !my_hash_compare(get_key(*last), key) )
+                    ++last;
+                return pairii_t(first, last);
+            }
+        }
+
+        return pairii_t(end(), end());
+    }
+
+    // Return the [begin, end) pair of const iterators with the same key values.
+    // This operation makes sense only if mapping is many-to-one.
+    paircc_t internal_equal_range(const key_type& key) const
+    {
+        sokey_t order_key = (sokey_t) my_hash_compare(key);
+        size_type bucket = order_key % my_number_of_buckets;
+
+        // If bucket is empty, initialize it first
+        if (!is_initialized(bucket))
+            return paircc_t(end(), end());
+
+        order_key = split_order_key_regular(order_key);
+        raw_const_iterator end_it = my_solist.raw_end();
+
+        for (raw_const_iterator it = get_bucket(bucket); it != end_it; ++it)
+        {
+            if (solist_t::get_order_key(it) > order_key)
+            {
+                // There is no element with the given key
+                return paircc_t(end(), end());
+            }
+            else if (solist_t::get_order_key(it) == order_key && !my_hash_compare(get_key(*it), key))
+            {
+                const_iterator first = my_solist.get_iterator(it);
+                const_iterator last = first;
+
+                while( last != end() && !my_hash_compare(get_key(*last), key ) )
+                    ++last;
+                return paircc_t(first, last);
+            }
+        }
+
+        return paircc_t(end(), end());
+    }
+
+    // Bucket APIs
+    void init_bucket(size_type bucket)
+    {
+        // Bucket 0 has no parent. Initialize it and return.
+        if (bucket == 0) {
+            internal_init();
+            return;
+        }
+
+        size_type parent_bucket = get_parent(bucket);
+
+        // All parent_bucket buckets have to be initialized before this bucket is
+        if (!is_initialized(parent_bucket))
+            init_bucket(parent_bucket);
+
+        raw_iterator parent = get_bucket(parent_bucket);
+
+        // Create a dummy first node in this bucket
+        raw_iterator dummy_node = my_solist.insert_dummy(parent, split_order_key_dummy(bucket));
+        set_bucket(bucket, dummy_node);
+    }
+
+    void adjust_table_size(size_type total_elements, size_type current_size)
+    {
+        // Grow the table by a factor of 2 if possible and needed
+        if ( ((float) total_elements / (float) current_size) > my_maximum_bucket_size )
+        {
+             // Double the size of the hash only if size has not changed inbetween loads
+            __TBB_CompareAndSwapW((uintptr_t*)&my_number_of_buckets, 2 * current_size, current_size );
+        }
+    }
+
+    size_type get_parent(size_type bucket) const
+    {
+        // Unsets bucket's most significant turned-on bit
+        size_type msb = __TBB_Log2((uintptr_t)bucket);
+        return bucket & ~(size_type(1) << msb);
+    }
+
+
+    // Dynamic sized array (segments)
+    //! @return segment index of given index in the array
+    static size_type segment_index_of( size_type index ) {
+        return size_type( __TBB_Log2( index|1 ) );
+    }
+
+    //! @return the first array index of given segment
+    static size_type segment_base( size_type k ) {
+        return (size_type(1)<<k & ~size_type(1));
+    }
+
+    //! @return segment size
+    static size_type segment_size( size_type k ) {
+        return k? size_type(1)<<k : 2;
+    }
+
+    raw_iterator get_bucket(size_type bucket) const {
+        size_type segment = segment_index_of(bucket);
+        bucket -= segment_base(segment);
+        __TBB_ASSERT( my_buckets[segment], "bucket must be in an allocated segment" );
+        return my_buckets[segment][bucket];
+    }
+
+    void set_bucket(size_type bucket, raw_iterator dummy_head) {
+        size_type segment = segment_index_of(bucket);
+        bucket -= segment_base(segment);
+
+        if (my_buckets[segment] == NULL) {
+            size_type sz = segment_size(segment);
+            raw_iterator * new_segment = my_allocator.allocate(sz);
+            std::memset(new_segment, 0, sz*sizeof(raw_iterator));
+
+            if (__TBB_CompareAndSwapW((void *) &my_buckets[segment], (uintptr_t)new_segment, 0) != 0)
+                my_allocator.deallocate(new_segment, sz);
+        }
+
+        my_buckets[segment][bucket] = dummy_head;
+    }
+
+    bool is_initialized(size_type bucket) const {
+        size_type segment = segment_index_of(bucket);
+        bucket -= segment_base(segment);
+
+        if (my_buckets[segment] == NULL)
+            return false;
+
+        raw_iterator it = my_buckets[segment][bucket];
+        return (it.get_node_ptr() != NULL);
+    }
+
+    // Utilities for keys
+
+    // A regular order key has its original hash value reversed and the last bit set
+    sokey_t split_order_key_regular(sokey_t order_key) const {
+        return __TBB_ReverseBits(order_key) | 0x1;
+    }
+
+    // A dummy order key has its original hash value reversed and the last bit unset
+    sokey_t split_order_key_dummy(sokey_t order_key) const {
+        return __TBB_ReverseBits(order_key) & ~(0x1);
+    }
+
+    // Shared variables
+    size_type                                                     my_number_of_buckets;       // Current table size
+    solist_t                                                      my_solist;                  // List where all the elements are kept
+    typename allocator_type::template rebind<raw_iterator>::other my_allocator;               // Allocator object for segments
+    float                                                         my_maximum_bucket_size;     // Maximum size of the bucket
+    raw_iterator                                                 *my_buckets[pointers_per_table]; // The segment table
+};
+#if _MSC_VER
+#pragma warning(pop) // warning 4127 -- while (true) has a constant expression in it
+#endif
+
+//! Hash multiplier
+static const size_t hash_multiplier = sizeof(size_t)==4? 2654435769U : 11400714819323198485ULL;
+} // namespace internal
+//! @endcond
+//! Hasher functions
+template<typename T>
+inline size_t tbb_hasher( const T& t ) {
+    return static_cast<size_t>( t ) * internal::hash_multiplier;
+}
+template<typename P>
+inline size_t tbb_hasher( P* ptr ) {
+    size_t const h = reinterpret_cast<size_t>( ptr );
+    return (h >> 3) ^ h;
+}
+template<typename E, typename S, typename A>
+inline size_t tbb_hasher( const std::basic_string<E,S,A>& s ) {
+    size_t h = 0;
+    for( const E* c = s.c_str(); *c; ++c )
+        h = static_cast<size_t>(*c) ^ (h * internal::hash_multiplier);
+    return h;
+}
+template<typename F, typename S>
+inline size_t tbb_hasher( const std::pair<F,S>& p ) {
+    return tbb_hasher(p.first) ^ tbb_hasher(p.second);
+}
+} // namespace interface5
+using interface5::tbb_hasher;
+} // namespace tbb
+#endif// __TBB_concurrent_unordered_internal_H
diff --git a/tbb30_20100406oss/include/tbb/_tbb_windef.h b/tbb30_20100406oss/include/tbb/_tbb_windef.h
new file mode 100644 (file)
index 0000000..7ca1069
--- /dev/null
@@ -0,0 +1,81 @@
+/*
+    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB_tbb_windef_H
+#error Do not #include this file directly.  Use "#include tbb/tbb_stddef.h" instead.
+#endif /* __TBB_tbb_windef_H */
+
+// Check that the target Windows version has all API calls requried for TBB.
+// Do not increase the version in condition beyond 0x0500 without prior discussion!
+#if defined(_WIN32_WINNT) && _WIN32_WINNT<0x0400
+#error TBB is unable to run on old Windows versions; _WIN32_WINNT must be 0x0400 or greater.
+#endif
+
+#if !defined(_MT)
+#error TBB requires linkage with multithreaded C/C++ runtime library. \
+       Choose multithreaded DLL runtime in project settings, or use /MD[d] compiler switch.
+#endif
+
+// Workaround for the problem with MVSC headers failing to define namespace std
+namespace std {
+  using ::size_t; using ::ptrdiff_t;
+}
+
+#define __TBB_STRING_AUX(x) #x
+#define __TBB_STRING(x) __TBB_STRING_AUX(x)
+
+// Default setting of TBB_USE_DEBUG
+#ifdef TBB_USE_DEBUG
+#    if TBB_USE_DEBUG 
+#        if !defined(_DEBUG)
+#            pragma message(__FILE__ "(" __TBB_STRING(__LINE__) ") : Warning: Recommend using /MDd if compiling with TBB_USE_DEBUG!=0")
+#        endif
+#    else
+#        if defined(_DEBUG)
+#            pragma message(__FILE__ "(" __TBB_STRING(__LINE__) ") : Warning: Recommend using /MD if compiling with TBB_USE_DEBUG==0")
+#        endif
+#    endif
+#else
+#    ifdef _DEBUG
+#        define TBB_USE_DEBUG 1
+#    endif
+#endif 
+
+#if __TBB_BUILD && !defined(__TBB_NO_IMPLICIT_LINKAGE)
+#define __TBB_NO_IMPLICIT_LINKAGE 1
+#endif
+
+#if _MSC_VER
+    #if !__TBB_NO_IMPLICIT_LINKAGE
+        #ifdef _DEBUG
+            #pragma comment(lib, "tbb_debug.lib")
+        #else
+            #pragma comment(lib, "tbb.lib")
+        #endif
+    #endif
+#endif
diff --git a/tbb30_20100406oss/include/tbb/aligned_space.h b/tbb30_20100406oss/include/tbb/aligned_space.h
new file mode 100644 (file)
index 0000000..c4b58e5
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB_aligned_space_H
+#define __TBB_aligned_space_H
+
+#include "tbb_stddef.h"
+#include "tbb_machine.h"
+
+namespace tbb {
+
+//! Block of space aligned sufficiently to construct an array T with N elements.
+/** The elements are not constructed or destroyed by this class.
+    @ingroup memory_allocation */
+template<typename T,size_t N>
+class aligned_space {
+private:
+    typedef __TBB_TypeWithAlignmentAtLeastAsStrict(T) element_type;
+    element_type array[(sizeof(T)*N+sizeof(element_type)-1)/sizeof(element_type)];
+public:
+    //! Pointer to beginning of array
+    T* begin() {return reinterpret_cast<T*>(this);}
+
+    //! Pointer to one past last element in array.
+    T* end() {return begin()+N;}
+};
+
+} // namespace tbb 
+
+#endif /* __TBB_aligned_space_H */
diff --git a/tbb30_20100406oss/include/tbb/atomic.h b/tbb30_20100406oss/include/tbb/atomic.h
new file mode 100644 (file)
index 0000000..dd2cdcc
--- /dev/null
@@ -0,0 +1,397 @@
+/*
+    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB_atomic_H
+#define __TBB_atomic_H
+
+#include <cstddef>
+#include "tbb_stddef.h"
+
+#if _MSC_VER 
+#define __TBB_LONG_LONG __int64
+#else
+#define __TBB_LONG_LONG long long
+#endif /* _MSC_VER */
+
+#include "tbb_machine.h"
+
+#if defined(_MSC_VER) && !defined(__INTEL_COMPILER)
+    // Workaround for overzealous compiler warnings 
+    #pragma warning (push)
+    #pragma warning (disable: 4244 4267)
+#endif
+
+namespace tbb {
+
+//! Specifies memory fencing.
+enum memory_semantics {
+    //! For internal use only.
+    __TBB_full_fence,
+    //! Acquire fence
+    acquire,
+    //! Release fence
+    release
+};
+
+//! @cond INTERNAL
+namespace internal {
+
+#if __GNUC__ || __SUNPRO_CC
+#define __TBB_DECL_ATOMIC_FIELD(t,f,a) t f  __attribute__ ((aligned(a)));
+#elif defined(__INTEL_COMPILER)||_MSC_VER >= 1300
+#define __TBB_DECL_ATOMIC_FIELD(t,f,a) __declspec(align(a)) t f;
+#else 
+#error Do not know syntax for forcing alignment.
+#endif /* __GNUC__ */
+
+template<size_t S>
+struct atomic_rep;           // Primary template declared, but never defined.
+
+template<>
+struct atomic_rep<1> {       // Specialization
+    typedef int8_t word;
+    int8_t value;
+};
+template<>
+struct atomic_rep<2> {       // Specialization
+    typedef int16_t word;
+    __TBB_DECL_ATOMIC_FIELD(int16_t,value,2)
+};
+template<>
+struct atomic_rep<4> {       // Specialization
+#if _MSC_VER && __TBB_WORDSIZE==4
+    // Work-around that avoids spurious /Wp64 warnings
+    typedef intptr_t word;
+#else
+    typedef int32_t word;
+#endif
+    __TBB_DECL_ATOMIC_FIELD(int32_t,value,4)
+};
+template<>
+struct atomic_rep<8> {       // Specialization
+    typedef int64_t word;
+    __TBB_DECL_ATOMIC_FIELD(int64_t,value,8)
+};
+
+template<size_t Size, memory_semantics M>
+struct atomic_traits;        // Primary template declared, but not defined.
+
+#define __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(S,M)                         \
+    template<> struct atomic_traits<S,M> {                               \
+        typedef atomic_rep<S>::word word;                               \
+        inline static word compare_and_swap( volatile void* location, word new_value, word comparand ) {\
+            return __TBB_CompareAndSwap##S##M(location,new_value,comparand);    \
+        }                                                                       \
+        inline static word fetch_and_add( volatile void* location, word addend ) { \
+            return __TBB_FetchAndAdd##S##M(location,addend);                    \
+        }                                                                       \
+        inline static word fetch_and_store( volatile void* location, word value ) {\
+            return __TBB_FetchAndStore##S##M(location,value);                   \
+        }                                                                       \
+    };
+
+#define __TBB_DECL_ATOMIC_PRIMITIVES(S)                                  \
+    template<memory_semantics M>                                         \
+    struct atomic_traits<S,M> {                                          \
+        typedef atomic_rep<S>::word word;                               \
+        inline static word compare_and_swap( volatile void* location, word new_value, word comparand ) {\
+            return __TBB_CompareAndSwap##S(location,new_value,comparand);       \
+        }                                                                       \
+        inline static word fetch_and_add( volatile void* location, word addend ) { \
+            return __TBB_FetchAndAdd##S(location,addend);                       \
+        }                                                                       \
+        inline static word fetch_and_store( volatile void* location, word value ) {\
+            return __TBB_FetchAndStore##S(location,value);                      \
+        }                                                                       \
+    };
+
+#if __TBB_DECL_FENCED_ATOMICS
+__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(1,__TBB_full_fence)
+__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(2,__TBB_full_fence)
+__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(4,__TBB_full_fence)
+__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(8,__TBB_full_fence)
+__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(1,acquire)
+__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(2,acquire)
+__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(4,acquire)
+__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(8,acquire)
+__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(1,release)
+__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(2,release)
+__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(4,release)
+__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(8,release)
+#else
+__TBB_DECL_ATOMIC_PRIMITIVES(1)
+__TBB_DECL_ATOMIC_PRIMITIVES(2)
+__TBB_DECL_ATOMIC_PRIMITIVES(4)
+__TBB_DECL_ATOMIC_PRIMITIVES(8)
+#endif
+
+//! Additive inverse of 1 for type T.
+/** Various compilers issue various warnings if -1 is used with various integer types.
+    The baroque expression below avoids all the warnings (we hope). */
+#define __TBB_MINUS_ONE(T) (T(T(0)-T(1)))
+
+//! Base class that provides basic functionality for atomic<T> without fetch_and_add.
+/** Works for any type T that has the same size as an integral type, has a trivial constructor/destructor, 
+    and can be copied/compared by memcpy/memcmp. */
+template<typename T>
+struct atomic_impl {
+protected:
+    atomic_rep<sizeof(T)> rep;
+private:
+    //! Union type used to convert type T to underlying integral type.
+    union converter {
+        T value;
+        typename atomic_rep<sizeof(T)>::word bits;
+    };
+public:
+    typedef T value_type;
+
+    template<memory_semantics M>
+    value_type fetch_and_store( value_type value ) {
+        converter u, w;
+        u.value = value;
+        w.bits = internal::atomic_traits<sizeof(value_type),M>::fetch_and_store(&rep.value,u.bits);
+        return w.value;
+    }
+
+    value_type fetch_and_store( value_type value ) {
+        return fetch_and_store<__TBB_full_fence>(value);
+    }
+
+    template<memory_semantics M>
+    value_type compare_and_swap( value_type value, value_type comparand ) {
+        converter u, v, w;
+        u.value = value;
+        v.value = comparand;
+        w.bits = internal::atomic_traits<sizeof(value_type),M>::compare_and_swap(&rep.value,u.bits,v.bits);
+        return w.value;
+    }
+
+    value_type compare_and_swap( value_type value, value_type comparand ) {
+        return compare_and_swap<__TBB_full_fence>(value,comparand);
+    }
+
+    operator value_type() const volatile {                // volatile qualifier here for backwards compatibility 
+        converter w;
+        w.bits = __TBB_load_with_acquire( rep.value );
+        return w.value;
+    }
+
+protected:
+    value_type store_with_release( value_type rhs ) {
+        converter u;
+        u.value = rhs;
+        __TBB_store_with_release(rep.value,u.bits);
+        return rhs;
+    }
+};
+
+//! Base class that provides basic functionality for atomic<T> with fetch_and_add.
+/** I is the underlying type.
+    D is the difference type.
+    StepType should be char if I is an integral type, and T if I is a T*. */
+template<typename I, typename D, typename StepType>
+struct atomic_impl_with_arithmetic: atomic_impl<I> {
+public:
+    typedef I value_type;
+
+    template<memory_semantics M>
+    value_type fetch_and_add( D addend ) {
+        return value_type(internal::atomic_traits<sizeof(value_type),M>::fetch_and_add( &this->rep.value, addend*sizeof(StepType) ));
+    }
+
+    value_type fetch_and_add( D addend ) {
+        return fetch_and_add<__TBB_full_fence>(addend);
+    }
+
+    template<memory_semantics M>
+    value_type fetch_and_increment() {
+        return fetch_and_add<M>(1);
+    }
+
+    value_type fetch_and_increment() {
+        return fetch_and_add(1);
+    }
+
+    template<memory_semantics M>
+    value_type fetch_and_decrement() {
+        return fetch_and_add<M>(__TBB_MINUS_ONE(D));
+    }
+
+    value_type fetch_and_decrement() {
+        return fetch_and_add(__TBB_MINUS_ONE(D));
+    }
+
+public:
+    value_type operator+=( D addend ) {
+        return fetch_and_add(addend)+addend;
+    }
+
+    value_type operator-=( D addend ) {
+        // Additive inverse of addend computed using binary minus,
+        // instead of unary minus, for sake of avoiding compiler warnings.
+        return operator+=(D(0)-addend);    
+    }
+
+    value_type operator++() {
+        return fetch_and_add(1)+1;
+    }
+
+    value_type operator--() {
+        return fetch_and_add(__TBB_MINUS_ONE(D))-1;
+    }
+
+    value_type operator++(int) {
+        return fetch_and_add(1);
+    }
+
+    value_type operator--(int) {
+        return fetch_and_add(__TBB_MINUS_ONE(D));
+    }
+};
+
+#if __TBB_WORDSIZE == 4
+// Plaforms with 32-bit hardware require special effort for 64-bit loads and stores.
+#if defined(__INTEL_COMPILER)||!defined(_MSC_VER)||_MSC_VER>=1400
+
+template<>
+inline atomic_impl<__TBB_LONG_LONG>::operator atomic_impl<__TBB_LONG_LONG>::value_type() const volatile {
+    return __TBB_Load8(&rep.value);
+}
+
+template<>
+inline atomic_impl<unsigned __TBB_LONG_LONG>::operator atomic_impl<unsigned __TBB_LONG_LONG>::value_type() const volatile {
+    return __TBB_Load8(&rep.value);
+}
+
+template<>
+inline atomic_impl<__TBB_LONG_LONG>::value_type atomic_impl<__TBB_LONG_LONG>::store_with_release( value_type rhs ) {
+    __TBB_Store8(&rep.value,rhs);
+    return rhs;
+}
+
+template<>
+inline atomic_impl<unsigned __TBB_LONG_LONG>::value_type atomic_impl<unsigned __TBB_LONG_LONG>::store_with_release( value_type rhs ) {
+    __TBB_Store8(&rep.value,rhs);
+    return rhs;
+}
+
+#endif /* defined(__INTEL_COMPILER)||!defined(_MSC_VER)||_MSC_VER>=1400 */
+#endif /* __TBB_WORDSIZE==4 */
+
+} /* Internal */
+//! @endcond
+
+//! Primary template for atomic.
+/** See the Reference for details.
+    @ingroup synchronization */
+template<typename T>
+struct atomic: internal::atomic_impl<T> {
+    T operator=( T rhs ) {
+        // "this" required here in strict ISO C++ because store_with_release is a dependent name
+        return this->store_with_release(rhs);
+    }
+    atomic<T>& operator=( const atomic<T>& rhs ) {this->store_with_release(rhs); return *this;}
+};
+
+#define __TBB_DECL_ATOMIC(T) \
+    template<> struct atomic<T>: internal::atomic_impl_with_arithmetic<T,T,char> {  \
+        T operator=( T rhs ) {return store_with_release(rhs);}  \
+        atomic<T>& operator=( const atomic<T>& rhs ) {store_with_release(rhs); return *this;}  \
+    };
+
+#if defined(__INTEL_COMPILER)||!defined(_MSC_VER)||_MSC_VER>=1400
+__TBB_DECL_ATOMIC(__TBB_LONG_LONG)
+__TBB_DECL_ATOMIC(unsigned __TBB_LONG_LONG)
+#else
+// Some old versions of MVSC cannot correctly compile templates with "long long".
+#endif /* defined(__INTEL_COMPILER)||!defined(_MSC_VER)||_MSC_VER>=1400 */
+
+__TBB_DECL_ATOMIC(long)
+__TBB_DECL_ATOMIC(unsigned long)
+
+#if defined(_MSC_VER) && __TBB_WORDSIZE==4
+/* Special version of __TBB_DECL_ATOMIC that avoids gratuitous warnings from cl /Wp64 option. 
+   It is identical to __TBB_DECL_ATOMIC(unsigned) except that it replaces operator=(T) 
+   with an operator=(U) that explicitly converts the U to a T.  Types T and U should be
+   type synonyms on the platform.  Type U should be the wider variant of T from the
+   perspective of /Wp64. */
+#define __TBB_DECL_ATOMIC_ALT(T,U) \
+    template<> struct atomic<T>: internal::atomic_impl_with_arithmetic<T,T,char> {  \
+        T operator=( U rhs ) {return store_with_release(T(rhs));}  \
+        atomic<T>& operator=( const atomic<T>& rhs ) {store_with_release(rhs); return *this;}  \
+    };
+__TBB_DECL_ATOMIC_ALT(unsigned,size_t)
+__TBB_DECL_ATOMIC_ALT(int,ptrdiff_t)
+#else
+__TBB_DECL_ATOMIC(unsigned)
+__TBB_DECL_ATOMIC(int)
+#endif /* defined(_MSC_VER) && __TBB_WORDSIZE==4 */
+
+__TBB_DECL_ATOMIC(unsigned short)
+__TBB_DECL_ATOMIC(short)
+__TBB_DECL_ATOMIC(char)
+__TBB_DECL_ATOMIC(signed char)
+__TBB_DECL_ATOMIC(unsigned char)
+
+#if !defined(_MSC_VER)||defined(_NATIVE_WCHAR_T_DEFINED) 
+__TBB_DECL_ATOMIC(wchar_t)
+#endif /* _MSC_VER||!defined(_NATIVE_WCHAR_T_DEFINED) */
+
+//! Specialization for atomic<T*> with arithmetic and operator->.
+template<typename T> struct atomic<T*>: internal::atomic_impl_with_arithmetic<T*,ptrdiff_t,T> {
+    T* operator=( T* rhs ) {
+        // "this" required here in strict ISO C++ because store_with_release is a dependent name
+        return this->store_with_release(rhs);
+    }
+    atomic<T*>& operator=( const atomic<T*>& rhs ) {
+        this->store_with_release(rhs); return *this;
+    }
+    T* operator->() const {
+        return (*this);
+    }
+};
+
+//! Specialization for atomic<void*>, for sake of not allowing arithmetic or operator->.
+template<> struct atomic<void*>: internal::atomic_impl<void*> {
+    void* operator=( void* rhs ) {
+        // "this" required here in strict ISO C++ because store_with_release is a dependent name
+        return this->store_with_release(rhs);
+    }
+    atomic<void*>& operator=( const atomic<void*>& rhs ) {
+        this->store_with_release(rhs); return *this;
+    }
+};
+
+} // namespace tbb
+
+#if defined(_MSC_VER) && !defined(__INTEL_COMPILER)
+    #pragma warning (pop)
+#endif // warnings 4244, 4267 are back
+
+#endif /* __TBB_atomic_H */
diff --git a/tbb30_20100406oss/include/tbb/blocked_range.h b/tbb30_20100406oss/include/tbb/blocked_range.h
new file mode 100644 (file)
index 0000000..52c12cc
--- /dev/null
@@ -0,0 +1,129 @@
+/*
+    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB_blocked_range_H
+#define __TBB_blocked_range_H
+
+#include "tbb_stddef.h"
+
+namespace tbb {
+
+/** \page range_req Requirements on range concept
+    Class \c R implementing the concept of range must define:
+    - \code R::R( const R& ); \endcode               Copy constructor
+    - \code R::~R(); \endcode                        Destructor
+    - \code bool R::is_divisible() const; \endcode   True if range can be partitioned into two subranges
+    - \code bool R::empty() const; \endcode          True if range is empty
+    - \code R::R( R& r, split ); \endcode            Split range \c r into two subranges.
+**/
+
+//! A range over which to iterate.
+/** @ingroup algorithms */
+template<typename Value>
+class blocked_range {
+public:
+    //! Type of a value
+    /** Called a const_iterator for sake of algorithms that need to treat a blocked_range
+        as an STL container. */
+    typedef Value const_iterator;
+
+    //! Type for size of a range
+    typedef std::size_t size_type;
+
+    //! Construct range with default-constructed values for begin and end.
+    /** Requires that Value have a default constructor. */
+    blocked_range() : my_end(), my_begin() {}
+
+    //! Construct range over half-open interval [begin,end), with the given grainsize.
+    blocked_range( Value begin_, Value end_, size_type grainsize_=1 ) : 
+        my_end(end_), my_begin(begin_), my_grainsize(grainsize_) 
+    {
+        __TBB_ASSERT( my_grainsize>0, "grainsize must be positive" );
+    }
+
+    //! Beginning of range.
+    const_iterator begin() const {return my_begin;}
+
+    //! One past last value in range.
+    const_iterator end() const {return my_end;}
+
+    //! Size of the range
+    /** Unspecified if end()<begin(). */
+    size_type size() const {
+        __TBB_ASSERT( !(end()<begin()), "size() unspecified if end()<begin()" );
+        return size_type(my_end-my_begin);
+    }
+
+    //! The grain size for this range.
+    size_type grainsize() const {return my_grainsize;}
+
+    //------------------------------------------------------------------------
+    // Methods that implement Range concept
+    //------------------------------------------------------------------------
+
+    //! True if range is empty.
+    bool empty() const {return !(my_begin<my_end);}
+
+    //! True if range is divisible.
+    /** Unspecified if end()<begin(). */
+    bool is_divisible() const {return my_grainsize<size();}
+
+    //! Split range.  
+    /** The new Range *this has the second half, the old range r has the first half. 
+        Unspecified if end()<begin() or !is_divisible(). */
+    blocked_range( blocked_range& r, split ) : 
+        my_end(r.my_end),
+        my_begin(do_split(r)),
+        my_grainsize(r.my_grainsize)
+    {}
+
+private:
+    /** NOTE: my_end MUST be declared before my_begin, otherwise the forking constructor will break. */
+    Value my_end;
+    Value my_begin;
+    size_type my_grainsize;
+
+    //! Auxiliary function used by forking constructor.
+    /** Using this function lets us not require that Value support assignment or default construction. */
+    static Value do_split( blocked_range& r ) {
+        __TBB_ASSERT( r.is_divisible(), "cannot split blocked_range that is not divisible" );
+        Value middle = r.my_begin + (r.my_end-r.my_begin)/2u;
+        r.my_end = middle;
+        return middle;
+    }
+
+    template<typename RowValue, typename ColValue>
+    friend class blocked_range2d;
+
+    template<typename RowValue, typename ColValue, typename PageValue>
+    friend class blocked_range3d;
+};
+
+} // namespace tbb 
+
+#endif /* __TBB_blocked_range_H */
diff --git a/tbb30_20100406oss/include/tbb/blocked_range2d.h b/tbb30_20100406oss/include/tbb/blocked_range2d.h
new file mode 100644 (file)
index 0000000..d541f42
--- /dev/null
@@ -0,0 +1,97 @@
+/*
+    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB_blocked_range2d_H
+#define __TBB_blocked_range2d_H
+
+#include "tbb_stddef.h"
+#include "blocked_range.h"
+
+namespace tbb {
+
+//! A 2-dimensional range that models the Range concept.
+/** @ingroup algorithms */
+template<typename RowValue, typename ColValue=RowValue>
+class blocked_range2d {
+public:
+    //! Type for size of an iteation range
+    typedef blocked_range<RowValue> row_range_type;
+    typedef blocked_range<ColValue> col_range_type;
+private:
+    row_range_type my_rows;
+    col_range_type my_cols;
+
+public:
+
+    blocked_range2d( RowValue row_begin, RowValue row_end, typename row_range_type::size_type row_grainsize,
+                     ColValue col_begin, ColValue col_end, typename col_range_type::size_type col_grainsize ) : 
+        my_rows(row_begin,row_end,row_grainsize),
+        my_cols(col_begin,col_end,col_grainsize)
+    {
+    }
+
+    blocked_range2d( RowValue row_begin, RowValue row_end,
+                     ColValue col_begin, ColValue col_end ) : 
+        my_rows(row_begin,row_end),
+        my_cols(col_begin,col_end)
+    {
+    }
+
+    //! True if range is empty
+    bool empty() const {
+        // Yes, it is a logical OR here, not AND.
+        return my_rows.empty() || my_cols.empty();
+    }
+
+    //! True if range is divisible into two pieces.
+    bool is_divisible() const {
+        return my_rows.is_divisible() || my_cols.is_divisible();
+    }
+
+    blocked_range2d( blocked_range2d& r, split ) : 
+        my_rows(r.my_rows),
+        my_cols(r.my_cols)
+    {
+        if( my_rows.size()*double(my_cols.grainsize()) < my_cols.size()*double(my_rows.grainsize()) ) {
+            my_cols.my_begin = col_range_type::do_split(r.my_cols);
+        } else {
+            my_rows.my_begin = row_range_type::do_split(r.my_rows);
+        }
+    }
+
+    //! The rows of the iteration space 
+    const row_range_type& rows() const {return my_rows;}
+
+    //! The columns of the iteration space 
+    const col_range_type& cols() const {return my_cols;}
+};
+
+} // namespace tbb 
+
+#endif /* __TBB_blocked_range2d_H */
diff --git a/tbb30_20100406oss/include/tbb/blocked_range3d.h b/tbb30_20100406oss/include/tbb/blocked_range3d.h
new file mode 100644 (file)
index 0000000..b0bfbe0
--- /dev/null
@@ -0,0 +1,116 @@
+/*
+    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB_blocked_range3d_H
+#define __TBB_blocked_range3d_H
+
+#include "tbb_stddef.h"
+#include "blocked_range.h"
+
+namespace tbb {
+
+//! A 3-dimensional range that models the Range concept.
+/** @ingroup algorithms */
+template<typename PageValue, typename RowValue=PageValue, typename ColValue=RowValue>
+class blocked_range3d {
+public:
+    //! Type for size of an iteation range
+    typedef blocked_range<PageValue> page_range_type;
+    typedef blocked_range<RowValue>  row_range_type;
+    typedef blocked_range<ColValue>  col_range_type;
+private:
+    page_range_type my_pages;
+    row_range_type  my_rows;
+    col_range_type  my_cols;
+
+public:
+
+    blocked_range3d( PageValue page_begin, PageValue page_end,
+                     RowValue  row_begin,  RowValue row_end,
+                     ColValue  col_begin,  ColValue col_end ) : 
+        my_pages(page_begin,page_end),
+        my_rows(row_begin,row_end),
+        my_cols(col_begin,col_end)
+    {
+    }
+
+    blocked_range3d( PageValue page_begin, PageValue page_end, typename page_range_type::size_type page_grainsize, 
+                     RowValue  row_begin,  RowValue row_end,   typename row_range_type::size_type row_grainsize,
+                     ColValue  col_begin,  ColValue col_end,   typename col_range_type::size_type col_grainsize ) :  
+        my_pages(page_begin,page_end,page_grainsize),
+        my_rows(row_begin,row_end,row_grainsize),
+        my_cols(col_begin,col_end,col_grainsize)
+    {
+    }
+
+    //! True if range is empty
+    bool empty() const {
+        // Yes, it is a logical OR here, not AND.
+        return my_pages.empty() || my_rows.empty() || my_cols.empty();
+    }
+
+    //! True if range is divisible into two pieces.
+    bool is_divisible() const {
+        return  my_pages.is_divisible() || my_rows.is_divisible() || my_cols.is_divisible();
+    }
+
+    blocked_range3d( blocked_range3d& r, split ) : 
+        my_pages(r.my_pages),
+        my_rows(r.my_rows),
+        my_cols(r.my_cols)
+    {
+        if( my_pages.size()*double(my_rows.grainsize()) < my_rows.size()*double(my_pages.grainsize()) ) {
+            if ( my_rows.size()*double(my_cols.grainsize()) < my_cols.size()*double(my_rows.grainsize()) ) {
+                my_cols.my_begin = col_range_type::do_split(r.my_cols);
+            } else {
+                my_rows.my_begin = row_range_type::do_split(r.my_rows);
+            }
+       } else {
+            if ( my_pages.size()*double(my_cols.grainsize()) < my_cols.size()*double(my_pages.grainsize()) ) {
+                my_cols.my_begin = col_range_type::do_split(r.my_cols);
+            } else {
+                    my_pages.my_begin = page_range_type::do_split(r.my_pages);
+            }
+        }
+    }
+
+    //! The pages of the iteration space 
+    const page_range_type& pages() const {return my_pages;}
+
+    //! The rows of the iteration space 
+    const row_range_type& rows() const {return my_rows;}
+
+    //! The columns of the iteration space 
+    const col_range_type& cols() const {return my_cols;}
+
+};
+
+} // namespace tbb 
+
+#endif /* __TBB_blocked_range3d_H */
diff --git a/tbb30_20100406oss/include/tbb/cache_aligned_allocator.h b/tbb30_20100406oss/include/tbb/cache_aligned_allocator.h
new file mode 100644 (file)
index 0000000..5889682
--- /dev/null
@@ -0,0 +1,133 @@
+/*
+    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB_cache_aligned_allocator_H
+#define __TBB_cache_aligned_allocator_H
+
+#include <new>
+#include "tbb_stddef.h"
+
+namespace tbb {
+
+//! @cond INTERNAL
+namespace internal {
+    //! Cache/sector line size.
+    /** @ingroup memory_allocation */
+    size_t __TBB_EXPORTED_FUNC NFS_GetLineSize();
+
+    //! Allocate memory on cache/sector line boundary.
+    /** @ingroup memory_allocation */
+    void* __TBB_EXPORTED_FUNC NFS_Allocate( size_t n_element, size_t element_size, void* hint );
+
+    //! Free memory allocated by NFS_Allocate.
+    /** Freeing a NULL pointer is allowed, but has no effect.
+        @ingroup memory_allocation */
+    void __TBB_EXPORTED_FUNC NFS_Free( void* );
+}
+//! @endcond
+
+#if _MSC_VER && !defined(__INTEL_COMPILER)
+    // Workaround for erroneous "unreferenced parameter" warning in method destroy.
+    #pragma warning (push)
+    #pragma warning (disable: 4100)
+#endif
+
+//! Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5
+/** The members are ordered the same way they are in section 20.4.1
+    of the ISO C++ standard.
+    @ingroup memory_allocation */
+template<typename T>
+class cache_aligned_allocator {
+public:
+    typedef typename internal::allocator_type<T>::value_type value_type;
+    typedef value_type* pointer;
+    typedef const value_type* const_pointer;
+    typedef value_type& reference;
+    typedef const value_type& const_reference;
+    typedef size_t size_type;
+    typedef ptrdiff_t difference_type;
+    template<typename U> struct rebind {
+        typedef cache_aligned_allocator<U> other;
+    };
+
+    cache_aligned_allocator() throw() {}
+    cache_aligned_allocator( const cache_aligned_allocator& ) throw() {}
+    template<typename U> cache_aligned_allocator(const cache_aligned_allocator<U>&) throw() {}
+
+    pointer address(reference x) const {return &x;}
+    const_pointer address(const_reference x) const {return &x;}
+    
+    //! Allocate space for n objects, starting on a cache/sector line.
+    pointer allocate( size_type n, const void* hint=0 ) {
+        // The "hint" argument is always ignored in NFS_Allocate thus const_cast shouldn't hurt
+        return pointer(internal::NFS_Allocate( n, sizeof(value_type), const_cast<void*>(hint) ));
+    }
+
+    //! Free block of memory that starts on a cache line
+    void deallocate( pointer p, size_type ) {
+        internal::NFS_Free(p);
+    }
+
+    //! Largest value for which method allocate might succeed.
+    size_type max_size() const throw() {
+        return (~size_t(0)-internal::NFS_MaxLineSize)/sizeof(value_type);
+    }
+
+    //! Copy-construct value at location pointed to by p.
+    void construct( pointer p, const value_type& value ) {::new((void*)(p)) value_type(value);}
+
+    //! Destroy value at location pointed to by p.
+    void destroy( pointer p ) {p->~value_type();}
+};
+
+#if _MSC_VER && !defined(__INTEL_COMPILER)
+    #pragma warning (pop)
+#endif // warning 4100 is back
+
+//! Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1
+/** @ingroup memory_allocation */
+template<> 
+class cache_aligned_allocator<void> {
+public:
+    typedef void* pointer;
+    typedef const void* const_pointer;
+    typedef void value_type;
+    template<typename U> struct rebind {
+        typedef cache_aligned_allocator<U> other;
+    };
+};
+
+template<typename T, typename U>
+inline bool operator==( const cache_aligned_allocator<T>&, const cache_aligned_allocator<U>& ) {return true;}
+
+template<typename T, typename U>
+inline bool operator!=( const cache_aligned_allocator<T>&, const cache_aligned_allocator<U>& ) {return false;}
+
+} // namespace tbb
+
+#endif /* __TBB_cache_aligned_allocator_H */
diff --git a/tbb30_20100406oss/include/tbb/combinable.h b/tbb30_20100406oss/include/tbb/combinable.h
new file mode 100644 (file)
index 0000000..5510595
--- /dev/null
@@ -0,0 +1,80 @@
+/*
+    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB_combinable_H
+#define __TBB_combinable_H
+
+#include "enumerable_thread_specific.h"
+#include "cache_aligned_allocator.h"
+
+namespace tbb {
+/** \name combinable
+    **/
+//@{
+//! Thread-local storage with optional reduction
+/** @ingroup containers */
+    template <typename T>
+        class combinable {
+    private:
+        typedef typename tbb::cache_aligned_allocator<T> my_alloc;
+
+        typedef typename tbb::enumerable_thread_specific<T, my_alloc, ets_no_key> my_ets_type;
+        my_ets_type my_ets; 
+    public:
+
+        combinable() { }
+
+        template <typename finit>
+        combinable( finit _finit) : my_ets(_finit) { }
+
+        //! destructor
+        ~combinable() { 
+        }
+
+        combinable(const combinable& other) : my_ets(other.my_ets) { }
+
+        combinable & operator=( const combinable & other) { my_ets = other.my_ets; return *this; }
+
+        void clear() { my_ets.clear(); }
+
+        T& local() { return my_ets.local(); }
+
+        T& local(bool & exists) { return my_ets.local(exists); }
+
+        // combine_func_t has signature T(T,T) or T(const T&, const T&)
+        template <typename combine_func_t>
+        T combine(combine_func_t f_combine) { return my_ets.combine(f_combine); }
+
+        // combine_func_t has signature void(T) or void(const T&)
+        template <typename combine_func_t>
+        void combine_each(combine_func_t f_combine) { my_ets.combine_each(f_combine); }
+
+    };
+} // namespace tbb
+#endif /* __TBB_combinable_H */
diff --git a/tbb30_20100406oss/include/tbb/compat/condition_variable b/tbb30_20100406oss/include/tbb/compat/condition_variable
new file mode 100644 (file)
index 0000000..4f132d2
--- /dev/null
@@ -0,0 +1,459 @@
+/*
+    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB_condition_variable_H
+#define __TBB_condition_variable_H
+
+#if _WIN32||_WIN64
+#include <windows.h>
+
+namespace tbb { 
+namespace interface5 {
+namespace internal { 
+struct condition_variable_using_event
+{
+    //! Event for blocking waiting threads.
+    HANDLE event;
+    //! Protects invariants involving n_waiters, release_count, and epoch.
+    CRITICAL_SECTION mutex;
+    //! Number of threads waiting on this condition variable
+    int n_waiters;
+    //! Number of threads remaining that should no longer wait on this condition variable.
+    int release_count;
+    //! To keep threads from waking up prematurely with earlier signals.
+    unsigned epoch;
+};
+}}} // namespace tbb::interface5::internal
+
+#ifndef CONDITION_VARIABLE_INIT
+typedef void* CONDITION_VARIABLE;
+typedef CONDITION_VARIABLE* PCONDITION_VARIABLE;
+#endif
+
+#else /* if not _WIN32||_WIN64 */
+#include <pthread.h>
+#endif /* _WIN32||_WIN64 */
+
+#include "../tbb_stddef.h"
+#include "../mutex.h"
+#include "../tbb_thread.h"
+#include "../tbb_exception.h"
+#include "../tbb_profiling.h"
+
+namespace tbb {
+
+namespace interface5 {
+
+// C++0x standard working draft 30.4.3
+// Lock tag types
+struct defer_lock_t { }; //! do not acquire ownership of the mutex
+struct try_to_lock_t { }; //! try to acquire ownership of the mutex without blocking
+struct adopt_lock_t { }; //! assume the calling thread has already
+const defer_lock_t defer_lock = {};
+const try_to_lock_t try_to_lock = {};
+const adopt_lock_t adopt_lock = {};
+
+// C++0x standard working draft 30.4.3.1
+//! lock_guard 
+template<typename M>
+class lock_guard : tbb::internal::no_copy {
+public:
+    //! mutex type
+    typedef M mutex_type;
+
+    //! Constructor
+    /** precondition: If mutex_type is not a recursive mutex, the calling thread
+        does not own the mutex m. */
+    explicit lock_guard(mutex_type& m) : pm(m) {m.lock();}
+    
+    //! Adopt_lock constructor
+    /** precondition: the calling thread owns the mutex m. */
+    lock_guard(mutex_type& m, adopt_lock_t) : pm(m) {}
+
+    //! Destructor
+    ~lock_guard() { pm.unlock(); }
+private:
+    mutex_type& pm;
+};
+
+// C++0x standard working draft 30.4.3.2
+//! unique_lock 
+template<typename M>
+class unique_lock : tbb::internal::no_copy {
+    friend class condition_variable;
+public:
+    typedef M mutex_type;
+
+    // 30.4.3.2.1 construct/copy/destroy
+    // NB: Without constructors that take an r-value reference to a unique_lock, the following constructor is of little use.
+    //! Constructor
+    /** postcondition: pm==0 && owns==false */
+    unique_lock() : pm(NULL), owns(false) {}
+
+    //! Constructor
+    /** precondition: if mutex_type is not a recursive mutex, the  calling thread
+        does not own the mutex m.  If the precondition is not met, a deadlock occurs.
+        postcondition: pm==&m and owns==true */
+    explicit unique_lock(mutex_type& m) : pm(&m) {m.lock(); owns=true;}
+
+    //! Defer_lock constructor
+    /** postcondition: pm==&m and owns==false */
+    unique_lock(mutex_type& m, defer_lock_t) : pm(&m), owns(false) {}
+
+    //! Try_to_lock constructor
+    /** precondition: if mutex_type is not a recursive mutex, the  calling thread
+       does not own the mutex m.  If the precondition is not met, a deadlock occurs.
+       postcondition: pm==&m and owns==res where res is the value returned by
+       the call to m.try_lock(). */
+    unique_lock(mutex_type& m, try_to_lock_t) : pm(&m) {owns = m.try_lock();}
+
+    //! Adopt_lock constructor
+    /** precondition: the calling thread owns the mutex. If it does not, mutex->unlock() would fail.
+        postcondition: pm==&m and owns==true */
+    unique_lock(mutex_type& m, adopt_lock_t) : pm(&m), owns(true) {}
+
+    //! Timed unique_lock acquisition.
+    /** To avoid requiring support for namespace chrono, this method deviates from the working draft in that 
+        it uses tbb::tick_count::interval_t to specify the time duration. */
+    unique_lock(mutex_type& m, const tick_count::interval_t &i) : pm(&m) {owns = try_lock_for( i );}
+
+    //! Destructor
+    ~unique_lock() { if( owns ) pm->unlock(); }
+
+    // 30.4.3.2.2 locking
+    //! Lock the mutex and own it.
+    void lock() {
+        if( pm ) {
+            if( !owns ) {
+                pm->lock();
+                owns = true;
+            } else 
+                throw_exception_v4( tbb::internal::eid_possible_deadlock );
+        } else 
+            throw_exception_v4( tbb::internal::eid_operation_not_permitted );
+        __TBB_ASSERT( owns, NULL );
+    }
+
+    //! Try to lock the mutex. 
+    /** If successful, note that this lock owns it. Otherwise, set it false. */
+    bool try_lock() {
+        if( pm ) {
+            if( !owns )
+                owns = pm->try_lock();
+            else
+                throw_exception_v4( tbb::internal::eid_possible_deadlock );
+        } else 
+            throw_exception_v4( tbb::internal::eid_operation_not_permitted );
+        return owns;
+    }
+    //! Try to lock the mutex. 
+    bool try_lock_for( const tick_count::interval_t &i );
+
+    //! Unlock the mutex
+    /** And note that this lock no longer owns it. */
+    void unlock() { 
+        if( owns ) {
+            pm->unlock();
+            owns = false;
+        } else
+            throw_exception_v4( tbb::internal::eid_operation_not_permitted );
+        __TBB_ASSERT( !owns, NULL );
+    }
+
+    // 30.4.3.2.3 modifiers
+    //! Swap the two unique locks
+    void swap(unique_lock& u) {
+        mutex_type* t_pm = u.pm;    u.pm   = pm;    pm   = t_pm;
+        bool t_owns      = u.owns;  u.owns = owns;  owns = t_owns;
+    }
+
+    //! Release control over the mutex.
+    mutex_type* release() {
+        mutex_type* o_pm = pm; 
+        pm = NULL; 
+        owns = false; 
+        return o_pm; 
+    }
+
+    // 30.4.3.2.4 observers
+    //! Does this lock own the mutex?
+    bool owns_lock() const { return owns; }
+
+    //! Does this lock own the mutex?
+    /*explicit*/ operator bool() const { return owns; }
+
+    //! Return the mutex that this lock currently has.
+    mutex_type* mutex() const { return pm; }
+
+private:
+    mutex_type* pm;
+    bool owns;
+};
+
+template<typename M>
+bool unique_lock<M>::try_lock_for( const tick_count::interval_t &i)
+{ 
+    const int unique_lock_tick = 100; /* microseconds; 0.1 milliseconds */
+    // the smallest wait-time is 0.1 milliseconds.
+    bool res = pm->try_lock();
+    int duration_in_micro; 
+    if( !res && (duration_in_micro=int(i.seconds()*1e6))>unique_lock_tick ) {
+        tick_count::interval_t i_100( double(unique_lock_tick)/1e6 /* seconds */); // 100 microseconds = 0.1*10E-3
+        do {
+            this_tbb_thread::sleep(i_100); // sleep for 100 micro seconds
+            duration_in_micro -= unique_lock_tick;
+            res = pm->try_lock();
+        } while( !res && duration_in_micro>unique_lock_tick );
+    }
+    return (owns=res);
+}
+
+//! Swap the two unique locks that have the mutexes of same type 
+template<typename M>
+void swap(unique_lock<M>& x, unique_lock<M>& y) { x.swap( y ); }
+
+namespace internal {
+
+#if _WIN32||_WIN64
+union condvar_impl_t {
+    condition_variable_using_event cv_event;
+    CONDITION_VARIABLE             cv_native;
+};
+
+void __TBB_EXPORTED_FUNC internal_initialize_condition_variable( condvar_impl_t& cv );
+void __TBB_EXPORTED_FUNC internal_destroy_condition_variable(    condvar_impl_t& cv );
+void __TBB_EXPORTED_FUNC internal_condition_variable_notify_one( condvar_impl_t& cv );
+void __TBB_EXPORTED_FUNC internal_condition_variable_notify_all( condvar_impl_t& cv );
+bool __TBB_EXPORTED_FUNC internal_condition_variable_wait( condvar_impl_t& cv, mutex* mtx, const tick_count::interval_t* i = NULL );
+#else /* if !(_WIN32||_WIN64), i.e., POSIX threads */
+typedef pthread_cond_t condvar_impl_t;
+#endif
+
+} // namespace internal
+
+//! cv_status
+/** C++0x standard working draft 30.5 */
+enum cv_status { no_timeout, timeout }; 
+
+//! condition variable
+/** C++0x standard working draft 30.5.1 
+    @ingroup synchronization */
+class condition_variable : tbb::internal::no_copy {
+public:
+    //! Constructor
+    condition_variable() { 
+#if _WIN32||_WIN64
+        internal_initialize_condition_variable( my_cv ); 
+#else
+        pthread_cond_init( &my_cv, NULL );
+#endif
+    }
+
+    //! Destructor
+    ~condition_variable() { 
+        //precondition: There shall be no thread blocked on *this.
+#if _WIN32||_WIN64
+        internal_destroy_condition_variable( my_cv );
+#else
+        pthread_cond_destroy( &my_cv );
+#endif
+    }
+
+    //! Notify one thread and wake it up
+    void notify_one() { 
+#if _WIN32||_WIN64
+        internal_condition_variable_notify_one( my_cv ); 
+#else
+        pthread_cond_signal( &my_cv );
+#endif
+    }
+
+    //! Notify all threads 
+    void notify_all() { 
+#if _WIN32||_WIN64
+        internal_condition_variable_notify_all( my_cv ); 
+#else
+        pthread_cond_broadcast( &my_cv );
+#endif
+    }
+
+    //! Release the mutex associated with the lock and wait on this condition variable
+    void wait(unique_lock<mutex>& lock);
+
+    //! Wait on this condition variable while pred is false
+    template <class Predicate>
+    void wait(unique_lock<mutex>& lock, Predicate pred) {
+        while( !pred() )
+            wait( lock );
+    }
+
+    //! Timed version of wait()
+    cv_status wait_for(unique_lock<mutex>& lock, const tick_count::interval_t &i );
+
+    //! Timed version of the predicated wait
+    /** The loop terminates when pred() returns true or when the time duration specified by rel_time (i) has elapsed. */
+    template<typename Predicate>
+    bool wait_for(unique_lock<mutex>& lock, const tick_count::interval_t &i, Predicate pred)
+    {
+        while( !pred() ) {
+            cv_status st = wait_for( lock, i );
+            if( st==timeout )
+                return pred();
+        }
+        return true;
+    }
+
+    // C++0x standard working draft. 30.2.3
+    typedef internal::condvar_impl_t* native_handle_type;
+
+    native_handle_type native_handle() { return (native_handle_type) &my_cv; }
+
+private:
+    internal::condvar_impl_t my_cv;
+};
+
+
+#if _WIN32||_WIN64
+inline void condition_variable::wait( unique_lock<mutex>& lock )
+{
+    __TBB_ASSERT( lock.owns, NULL );
+    lock.owns = false;
+    if( !internal_condition_variable_wait( my_cv, lock.mutex() ) ) {
+        int ec = GetLastError();
+        // on Windows 7, SleepConditionVariableCS() may return ERROR_TIMEOUT while the doc says it returns WAIT_TIMEOUT
+        __TBB_ASSERT_EX( ec!=WAIT_TIMEOUT&&ec!=ERROR_TIMEOUT, NULL );
+        lock.owns = true;
+        throw_exception_v4( tbb::internal::eid_condvar_wait_failed );
+    }
+    lock.owns = true;
+}
+
+inline cv_status condition_variable::wait_for( unique_lock<mutex>& lock, const tick_count::interval_t& i )
+{
+    cv_status rc = no_timeout;
+    __TBB_ASSERT( lock.owns, NULL );
+    lock.owns = false;
+    // condvar_wait could be SleepConditionVariableCS (or SleepConditionVariableSRW) or our own pre-vista cond_var_wait()
+    if( !internal_condition_variable_wait( my_cv, lock.mutex(), &i ) ) {
+        int ec = GetLastError();
+        if( ec==WAIT_TIMEOUT || ec==ERROR_TIMEOUT )
+            rc = timeout;
+        else {
+            lock.owns = true;
+            throw_exception_v4( tbb::internal::eid_condvar_wait_failed );
+        }
+    }
+    lock.owns = true;
+    return rc;
+}
+#else
+#if __linux__
+#include <ctime>
+#else /* generic Unix */
+#include <sys/time.h>
+#include <errno.h>
+#endif
+
+inline void condition_variable::wait( unique_lock<mutex>& lock )
+{
+    __TBB_ASSERT( lock.owns, NULL );
+    lock.owns = false;
+    if( pthread_cond_wait( &my_cv, lock.mutex()->native_handle() ) ) {
+        lock.owns = true;
+        throw_exception_v4( tbb::internal::eid_condvar_wait_failed );
+    }
+    // upon successful return, the mutex has been locked and is owned by the calling thread.
+    lock.owns = true;
+}
+
+inline cv_status condition_variable::wait_for( unique_lock<mutex>& lock, const tick_count::interval_t& i )
+{
+#if __linux__
+    struct timespec req;
+    double sec = i.seconds();
+    clock_gettime( CLOCK_REALTIME, &req );
+    req.tv_sec  += static_cast<long>(sec);
+    req.tv_nsec += static_cast<long>( (sec - static_cast<long>(sec))*1e9 );
+#else /* generic Unix */
+    struct timeval tv;
+    struct timespec req;
+    double sec = i.seconds();
+    int status = gettimeofday(&tv, NULL);
+    __TBB_ASSERT_EX( status==0, "gettimeofday failed" );
+    req.tv_sec  = tv.tv_sec + static_cast<long>(sec);
+    req.tv_nsec = tv.tv_usec*1000 + static_cast<long>( (sec - static_cast<long>(sec))*1e9 );
+#endif /*(choice of OS) */
+
+    int ec;
+    cv_status rc = no_timeout;
+    __TBB_ASSERT( lock.owns, NULL );
+    lock.owns = false;
+    if( ( ec=pthread_cond_timedwait( &my_cv, lock.mutex()->native_handle(), &req ) ) ) {
+        if( ec==ETIMEDOUT )
+            rc = timeout;
+        else {
+            __TBB_ASSERT( lock.try_lock()==false, NULL );
+            lock.owns = true;
+            throw_exception_v4( tbb::internal::eid_condvar_wait_failed );
+        }
+    }
+    lock.owns = true;
+    return rc;
+}
+#endif /* !(_WIN32||_WIN64) */
+
+} // namespace interface5
+
+__TBB_DEFINE_PROFILING_SET_NAME(interface5::condition_variable)
+
+} // namespace tbb 
+
+#if TBB_IMPLEMENT_CPP0X
+
+namespace std {
+
+using tbb::interface5::defer_lock_t;
+using tbb::interface5::try_to_lock_t;
+using tbb::interface5::adopt_lock_t;
+using tbb::interface5::defer_lock;
+using tbb::interface5::try_to_lock;
+using tbb::interface5::adopt_lock;
+using tbb::interface5::lock_guard;
+using tbb::interface5::unique_lock;
+using tbb::interface5::swap;   /* this is for void std::swap(unique_lock<M>&,unique_lock<M>&) */
+using tbb::interface5::condition_variable;
+using tbb::interface5::cv_status;
+using tbb::interface5::timeout;
+using tbb::interface5::no_timeout;
+
+} // namespace std 
+
+#endif /* TBB_IMPLEMENT_CPP0X */
+
+#endif /* __TBB_condition_variable_H */
diff --git a/tbb30_20100406oss/include/tbb/compat/ppl.h b/tbb30_20100406oss/include/tbb/compat/ppl.h
new file mode 100644 (file)
index 0000000..f524abf
--- /dev/null
@@ -0,0 +1,68 @@
+/*
+    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB_compat_ppl_H
+#define __TBB_compat_ppl_H
+
+#include "../task_group.h"
+#include "../parallel_invoke.h"
+#include "../parallel_for_each.h"
+#include "../parallel_for.h"
+#include "../tbb_exception.h"
+#include "../critical_section.h"
+#include "../reader_writer_lock.h"
+#include "../combinable.h"
+
+namespace Concurrency {
+
+    using tbb::task_handle;
+    using tbb::task_group_status;
+    using tbb::task_group;
+    using tbb::structured_task_group;
+    using tbb::invalid_multiple_scheduling;
+    using tbb::missing_wait;
+    using tbb::make_task;
+
+    using tbb::not_complete;
+    using tbb::complete;
+    using tbb::canceled;
+
+    using tbb::is_current_task_group_canceling;
+
+    using tbb::parallel_invoke;
+    using tbb::strict_ppl::parallel_for;
+    using tbb::parallel_for_each;
+    using tbb::critical_section;
+    using tbb::reader_writer_lock;
+    using tbb::combinable;
+
+    using tbb::improper_lock;
+
+} // namespace Concurrency
+
+#endif /* __TBB_compat_ppl_H */
diff --git a/tbb30_20100406oss/include/tbb/compat/thread b/tbb30_20100406oss/include/tbb/compat/thread
new file mode 100644 (file)
index 0000000..e4d3b32
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB_thread_H
+#define __TBB_thread_H
+
+#include "../tbb_thread.h"
+
+#if TBB_IMPLEMENT_CPP0X
+
+namespace std {
+
+typedef tbb::tbb_thread thread;
+
+namespace this_thread {
+    using tbb::this_tbb_thread::get_id;
+    using tbb::this_tbb_thread::yield;
+
+    inline void sleep_for(const tbb::tick_count::interval_t& rel_time) {
+        tbb::internal::thread_sleep_v3( rel_time );
+    }
+
+}
+
+}
+
+#endif /* TBB_IMPLEMENT_CPP0X */
+
+#endif /* __TBB_thread_H */
diff --git a/tbb30_20100406oss/include/tbb/concurrent_hash_map.h b/tbb30_20100406oss/include/tbb/concurrent_hash_map.h
new file mode 100644 (file)
index 0000000..117d0c7
--- /dev/null
@@ -0,0 +1,1375 @@
+/*
+    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB_concurrent_hash_map_H
+#define __TBB_concurrent_hash_map_H
+
+#include "tbb_stddef.h"
+
+#if !TBB_USE_EXCEPTIONS && _MSC_VER
+    // Suppress "C++ exception handler used, but unwind semantics are not enabled" warning in STL headers
+    #pragma warning (push)
+    #pragma warning (disable: 4530)
+#endif
+
+#include <iterator>
+#include <utility>      // Need std::pair
+#include <cstring>      // Need std::memset
+
+#if !TBB_USE_EXCEPTIONS && _MSC_VER
+    #pragma warning (pop)
+#endif
+
+#include "cache_aligned_allocator.h"
+#include "tbb_allocator.h"
+#include "spin_rw_mutex.h"
+#include "atomic.h"
+#include "aligned_space.h"
+#include "tbb_exception.h"
+#include "_concurrent_unordered_internal.h" // Need tbb_hasher
+#if TBB_USE_PERFORMANCE_WARNINGS
+#include <typeinfo>
+#endif
+
+namespace tbb {
+
+//! @cond INTERNAL
+namespace internal {
+    //! ITT instrumented routine that loads pointer from location pointed to by src.
+    void* __TBB_EXPORTED_FUNC itt_load_pointer_with_acquire_v3( const void* src );
+    //! ITT instrumented routine that stores src into location pointed to by dst.
+    void __TBB_EXPORTED_FUNC itt_store_pointer_with_release_v3( void* dst, void* src );
+    //! Routine that loads pointer from location pointed to by src without causing ITT to report a race.
+    void* __TBB_EXPORTED_FUNC itt_load_pointer_v3( const void* src );
+}
+//! @endcond
+
+//! hash_compare that is default argument for concurrent_hash_map
+template<typename Key>
+struct tbb_hash_compare {
+    static size_t hash( const Key& a ) { return tbb_hasher(a); }
+    static bool equal( const Key& a, const Key& b ) { return a == b; }
+};
+
+namespace interface4 {
+
+    template<typename Key, typename T, typename HashCompare = tbb_hash_compare<Key>, typename A = tbb_allocator<std::pair<Key, T> > >
+    class concurrent_hash_map;
+
+    //! @cond INTERNAL
+    namespace internal {
+
+
+    //! Type of a hash code.
+    typedef size_t hashcode_t;
+    //! Node base type
+    struct hash_map_node_base : tbb::internal::no_copy {
+        //! Mutex type
+        typedef spin_rw_mutex mutex_t;
+        //! Scoped lock type for mutex
+        typedef mutex_t::scoped_lock scoped_t;
+        //! Next node in chain
+        hash_map_node_base *next;
+        mutex_t mutex;
+    };
+    //! Incompleteness flag value
+    static hash_map_node_base *const rehash_req = reinterpret_cast<hash_map_node_base*>(size_t(3));
+    //! Rehashed empty bucket flag
+    static hash_map_node_base *const empty_rehashed = reinterpret_cast<hash_map_node_base*>(size_t(0));
+    //! base class of concurrent_hash_map
+    class hash_map_base {
+    public:
+        //! Size type
+        typedef size_t size_type;
+        //! Type of a hash code.
+        typedef size_t hashcode_t;
+        //! Segment index type
+        typedef size_t segment_index_t;
+        //! Node base type
+        typedef hash_map_node_base node_base;
+        //! Bucket type
+        struct bucket : tbb::internal::no_copy {
+            //! Mutex type for buckets
+            typedef spin_rw_mutex mutex_t;
+            //! Scoped lock type for mutex
+            typedef mutex_t::scoped_lock scoped_t;
+            mutex_t mutex;
+            node_base *node_list;
+        };
+        //! Count of segments in the first block
+        static size_type const embedded_block = 1;
+        //! Count of segments in the first block
+        static size_type const embedded_buckets = 1<<embedded_block;
+        //! Count of segments in the first block
+        static size_type const first_block = 8; //including embedded_block. perfect with bucket size 16, so the allocations are power of 4096
+        //! Size of a pointer / table size
+        static size_type const pointers_per_table = sizeof(segment_index_t) * 8; // one segment per bit
+        //! Segment pointer
+        typedef bucket *segment_ptr_t;
+        //! Segment pointers table type
+        typedef segment_ptr_t segments_table_t[pointers_per_table];
+        //! Hash mask = sum of allocated segments sizes - 1
+        atomic<hashcode_t> my_mask;
+        //! Segment pointers table. Also prevents false sharing between my_mask and my_size
+        segments_table_t my_table;
+        //! Size of container in stored items
+        atomic<size_type> my_size; // It must be in separate cache line from my_mask due to performance effects
+        //! Zero segment
+        bucket my_embedded_segment[embedded_buckets];
+
+        //! Constructor
+        hash_map_base() {
+            std::memset( this, 0, pointers_per_table*sizeof(segment_ptr_t) // 32*4=128   or 64*8=512
+                + sizeof(my_size) + sizeof(my_mask)  // 4+4 or 8+8
+                + embedded_buckets*sizeof(bucket) ); // n*8 or n*16
+            for( size_type i = 0; i < embedded_block; i++ ) // fill the table
+                my_table[i] = my_embedded_segment + segment_base(i);
+            my_mask = embedded_buckets - 1;
+            __TBB_ASSERT( embedded_block <= first_block, "The first block number must include embedded blocks");
+        }
+
+        //! @return segment index of given index in the array
+        static segment_index_t segment_index_of( size_type index ) {
+            return segment_index_t( __TBB_Log2( index|1 ) );
+        }
+
+        //! @return the first array index of given segment
+        static segment_index_t segment_base( segment_index_t k ) {
+            return (segment_index_t(1)<<k & ~segment_index_t(1));
+        }
+
+        //! @return segment size except for @arg k == 0
+        static size_type segment_size( segment_index_t k ) {
+            return size_type(1)<<k; // fake value for k==0
+        }
+        
+        //! @return true if @arg ptr is valid pointer
+        static bool is_valid( void *ptr ) {
+            return reinterpret_cast<size_t>(ptr) > size_t(63);
+        }
+
+        //! Initialize buckets
+        static void init_buckets( segment_ptr_t ptr, size_type sz, bool is_initial ) {
+            if( is_initial ) std::memset(ptr, 0, sz*sizeof(bucket) );
+            else for(size_type i = 0; i < sz; i++, ptr++) {
+                    *reinterpret_cast<intptr_t*>(&ptr->mutex) = 0;
+                    ptr->node_list = rehash_req;
+                }
+        }
+        
+        //! Add node @arg n to bucket @arg b
+        static void add_to_bucket( bucket *b, node_base *n ) {
+            __TBB_ASSERT(b->node_list != rehash_req, NULL);
+            n->next = b->node_list;
+            b->node_list = n; // its under lock and flag is set
+        }
+
+        //! Exception safety helper
+        struct enable_segment_failsafe {
+            segment_ptr_t *my_segment_ptr;
+            enable_segment_failsafe(segments_table_t &table, segment_index_t k) : my_segment_ptr(&table[k]) {}
+            ~enable_segment_failsafe() {
+                if( my_segment_ptr ) *my_segment_ptr = 0; // indicate no allocation in progress
+            }
+        };
+
+        //! Enable segment
+        void enable_segment( segment_index_t k, bool is_initial = false ) {
+            __TBB_ASSERT( k, "Zero segment must be embedded" );
+            enable_segment_failsafe watchdog( my_table, k );
+            cache_aligned_allocator<bucket> alloc;
+            size_type sz;
+            __TBB_ASSERT( !is_valid(my_table[k]), "Wrong concurrent assignment");
+            if( k >= first_block ) {
+                sz = segment_size( k );
+                segment_ptr_t ptr = alloc.allocate( sz );
+                init_buckets( ptr, sz, is_initial );
+#if TBB_USE_THREADING_TOOLS
+                // TODO: actually, fence and notification are unnecessary here and below
+                itt_store_pointer_with_release_v3( my_table + k, ptr );
+#else
+                my_table[k] = ptr;// my_mask has release fence
+#endif
+                sz <<= 1;// double it to get entire capacity of the container
+            } else { // the first block
+                __TBB_ASSERT( k == embedded_block, "Wrong segment index" );
+                sz = segment_size( first_block );
+                segment_ptr_t ptr = alloc.allocate( sz - embedded_buckets );
+                init_buckets( ptr, sz - embedded_buckets, is_initial );
+                ptr -= segment_base(embedded_block);
+                for(segment_index_t i = embedded_block; i < first_block; i++) // calc the offsets
+#if TBB_USE_THREADING_TOOLS
+                    itt_store_pointer_with_release_v3( my_table + i, ptr + segment_base(i) );
+#else
+                    my_table[i] = ptr + segment_base(i);
+#endif
+            }
+#if TBB_USE_THREADING_TOOLS
+            itt_store_pointer_with_release_v3( &my_mask, (void*)(sz-1) );
+#else
+            my_mask = sz - 1;
+#endif
+            watchdog.my_segment_ptr = 0;
+        }
+
+        //! Get bucket by (masked) hashcode
+        bucket *get_bucket( hashcode_t h ) const throw() { // TODO: add throw() everywhere?
+            segment_index_t s = segment_index_of( h );
+            h -= segment_base(s);
+            segment_ptr_t seg = my_table[s];
+            __TBB_ASSERT( is_valid(seg), "hashcode must be cut by valid mask for allocated segments" );
+            return &seg[h];
+        }
+
+        // internal serial rehashing helper
+        void mark_rehashed_levels( hashcode_t h ) throw () {
+            segment_index_t s = segment_index_of( h );
+            while( segment_ptr_t seg = my_table[++s] )
+                if( seg[h].node_list == rehash_req ) {
+                    seg[h].node_list = empty_rehashed;
+                    mark_rehashed_levels( h + segment_base(s) );
+                }
+        }
+
+        //! Check for mask race
+        // Splitting into two functions should help inlining
+        inline bool check_mask_race( const hashcode_t h, hashcode_t &m ) const {
+            hashcode_t m_now, m_old = m;
+#if TBB_USE_THREADING_TOOLS
+            m_now = (hashcode_t) itt_load_pointer_with_acquire_v3( &my_mask );
+#else
+            m_now = my_mask;
+#endif
+            if( m_old != m_now )
+                return check_rehashing_collision( h, m_old, m = m_now );
+            return false;
+        }
+
+        //! Process mask race, check for rehashing collision
+        bool check_rehashing_collision( const hashcode_t h, hashcode_t m_old, hashcode_t m ) const {
+            __TBB_ASSERT(m_old != m, NULL); // TODO?: m arg could be optimized out by passing h = h&m
+            if( (h & m_old) != (h & m) ) { // mask changed for this hashcode, rare event
+                // condition above proves that 'h' has some other bits set beside 'm_old'
+                // find next applicable mask after m_old    //TODO: look at bsl instruction
+                for( ++m_old; !(h & m_old); m_old <<= 1 ) // at maximum few rounds depending on the first block size
+                    ;
+                m_old = (m_old<<1) - 1; // get full mask from a bit
+                __TBB_ASSERT((m_old&(m_old+1))==0 && m_old <= m, NULL);
+                // check whether it is rehashing/ed
+#if TBB_USE_THREADING_TOOLS
+                if( itt_load_pointer_with_acquire_v3(&( get_bucket(h & m_old)->node_list )) != rehash_req )
+#else
+                if( __TBB_load_with_acquire(get_bucket( h & m_old )->node_list) != rehash_req )
+#endif
+                    return true;
+            }
+            return false;
+        }
+
+        //! Insert a node and check for load factor. @return segment index to enable.
+        segment_index_t insert_new_node( bucket *b, node_base *n, hashcode_t mask ) {
+            size_type sz = ++my_size; // prefix form is to enforce allocation after the first item inserted
+            add_to_bucket( b, n );
+            // check load factor
+            if( sz >= mask ) { // TODO: add custom load_factor 
+                segment_index_t new_seg = segment_index_of( mask+1 );
+                __TBB_ASSERT( is_valid(my_table[new_seg-1]), "new allocations must not publish new mask until segment has allocated");
+#if TBB_USE_THREADING_TOOLS
+                if( !itt_load_pointer_v3(my_table+new_seg)
+#else
+                if( !my_table[new_seg]
+#endif
+                  && __TBB_CompareAndSwapW(&my_table[new_seg], 2, 0) == 0 )
+                    return new_seg; // The value must be processed
+            }
+            return 0;
+        }
+
+        //! Prepare enough segments for number of buckets
+        void reserve(size_type buckets) {
+            if( !buckets-- ) return;
+            bool is_initial = !my_size;
+            for( size_type m = my_mask; buckets > m; m = my_mask )
+                enable_segment( segment_index_of( m+1 ), is_initial );
+        }
+        //! Swap hash_map_bases
+        void internal_swap(hash_map_base &table) {
+            std::swap(this->my_mask, table.my_mask);
+            std::swap(this->my_size, table.my_size);
+            for(size_type i = 0; i < embedded_buckets; i++)
+                std::swap(this->my_embedded_segment[i].node_list, table.my_embedded_segment[i].node_list);
+            for(size_type i = embedded_block; i < pointers_per_table; i++)
+                std::swap(this->my_table[i], table.my_table[i]);
+        }
+    };
+
+    template<typename Iterator>
+    class hash_map_range;
+
+    //! Meets requirements of a forward iterator for STL */
+    /** Value is either the T or const T type of the container.
+        @ingroup containers */ 
+    template<typename Container, typename Value>
+    class hash_map_iterator
+        : public std::iterator<std::forward_iterator_tag,Value>
+    {
+        typedef Container map_type;
+        typedef typename Container::node node;
+        typedef hash_map_base::node_base node_base;
+        typedef hash_map_base::bucket bucket;
+
+        template<typename C, typename T, typename U>
+        friend bool operator==( const hash_map_iterator<C,T>& i, const hash_map_iterator<C,U>& j );
+
+        template<typename C, typename T, typename U>
+        friend bool operator!=( const hash_map_iterator<C,T>& i, const hash_map_iterator<C,U>& j );
+
+        template<typename C, typename T, typename U>
+        friend ptrdiff_t operator-( const hash_map_iterator<C,T>& i, const hash_map_iterator<C,U>& j );
+    
+        template<typename C, typename U>
+        friend class hash_map_iterator;
+
+        template<typename I>
+        friend class hash_map_range;
+
+        void advance_to_next_bucket() { // TODO?: refactor to iterator_base class
+            size_t k = my_index+1;
+            while( my_bucket && k <= my_map->my_mask ) {
+                // Following test uses 2's-complement wizardry
+                if( k& (k-2) ) // not the beginning of a segment
+                    ++my_bucket;
+                else my_bucket = my_map->get_bucket( k );
+                my_node = static_cast<node*>( my_bucket->node_list );
+                if( hash_map_base::is_valid(my_node) ) {
+                    my_index = k; return;
+                }
+                ++k;
+            }
+            my_bucket = 0; my_node = 0; my_index = k; // the end
+        }
+#if !defined(_MSC_VER) || defined(__INTEL_COMPILER)
+        template<typename Key, typename T, typename HashCompare, typename A>
+        friend class interface4::concurrent_hash_map;
+#else
+    public: // workaround
+#endif
+        //! concurrent_hash_map over which we are iterating.
+        const Container *my_map;
+
+        //! Index in hash table for current item
+        size_t my_index;
+
+        //! Pointer to bucket
+        const bucket *my_bucket;
+
+        //! Pointer to node that has current item
+        node *my_node;
+
+        hash_map_iterator( const Container &map, size_t index, const bucket *b, node_base *n );
+
+    public:
+        //! Construct undefined iterator
+        hash_map_iterator() {}
+        hash_map_iterator( const hash_map_iterator<Container,typename Container::value_type> &other ) :
+            my_map(other.my_map),
+            my_index(other.my_index),
+            my_bucket(other.my_bucket),
+            my_node(other.my_node)
+        {}
+        Value& operator*() const {
+            __TBB_ASSERT( hash_map_base::is_valid(my_node), "iterator uninitialized or at end of container?" );
+            return my_node->item;
+        }
+        Value* operator->() const {return &operator*();}
+        hash_map_iterator& operator++();
+        
+        //! Post increment
+        Value* operator++(int) {
+            Value* result = &operator*();
+            operator++();
+            return result;
+        }
+    };
+
+    template<typename Container, typename Value>
+    hash_map_iterator<Container,Value>::hash_map_iterator( const Container &map, size_t index, const bucket *b, node_base *n ) :
+        my_map(&map),
+        my_index(index),
+        my_bucket(b),
+        my_node( static_cast<node*>(n) )
+    {
+        if( b && !hash_map_base::is_valid(n) )
+            advance_to_next_bucket();
+    }
+
+    template<typename Container, typename Value>
+    hash_map_iterator<Container,Value>& hash_map_iterator<Container,Value>::operator++() {
+        my_node = static_cast<node*>( my_node->next );
+        if( !my_node ) advance_to_next_bucket();
+        return *this;
+    }
+
+    template<typename Container, typename T, typename U>
+    bool operator==( const hash_map_iterator<Container,T>& i, const hash_map_iterator<Container,U>& j ) {
+        return i.my_node == j.my_node && i.my_map == j.my_map;
+    }
+
+    template<typename Container, typename T, typename U>
+    bool operator!=( const hash_map_iterator<Container,T>& i, const hash_map_iterator<Container,U>& j ) {
+        return i.my_node != j.my_node || i.my_map != j.my_map;
+    }
+
+    //! Range class used with concurrent_hash_map
+    /** @ingroup containers */ 
+    template<typename Iterator>
+    class hash_map_range {
+        typedef typename Iterator::map_type map_type;
+        Iterator my_begin;
+        Iterator my_end;
+        mutable Iterator my_midpoint;
+        size_t my_grainsize;
+        //! Set my_midpoint to point approximately half way between my_begin and my_end.
+        void set_midpoint() const;
+        template<typename U> friend class hash_map_range;
+    public:
+        //! Type for size of a range
+        typedef std::size_t size_type;
+        typedef typename Iterator::value_type value_type;
+        typedef typename Iterator::reference reference;
+        typedef typename Iterator::difference_type difference_type;
+        typedef Iterator iterator;
+
+        //! True if range is empty.
+        bool empty() const {return my_begin==my_end;}
+
+        //! True if range can be partitioned into two subranges.
+        bool is_divisible() const {
+            return my_midpoint!=my_end;
+        }
+        //! Split range.
+        hash_map_range( hash_map_range& r, split ) : 
+            my_end(r.my_end),
+            my_grainsize(r.my_grainsize)
+        {
+            r.my_end = my_begin = r.my_midpoint;
+            __TBB_ASSERT( !empty(), "Splitting despite the range is not divisible" );
+            __TBB_ASSERT( !r.empty(), "Splitting despite the range is not divisible" );
+            set_midpoint();
+            r.set_midpoint();
+        }
+        //! type conversion
+        template<typename U>
+        hash_map_range( hash_map_range<U>& r) : 
+            my_begin(r.my_begin),
+            my_end(r.my_end),
+            my_midpoint(r.my_midpoint),
+            my_grainsize(r.my_grainsize)
+        {}
+#if TBB_DEPRECATED
+        //! Init range with iterators and grainsize specified
+        hash_map_range( const Iterator& begin_, const Iterator& end_, size_type grainsize_ = 1 ) : 
+            my_begin(begin_), 
+            my_end(end_),
+            my_grainsize(grainsize_)
+        {
+            if(!my_end.my_index && !my_end.my_bucket) // end
+                my_end.my_index = my_end.my_map->my_mask + 1;
+            set_midpoint();
+            __TBB_ASSERT( grainsize_>0, "grainsize must be positive" );
+        }
+#endif
+        //! Init range with container and grainsize specified
+        hash_map_range( const map_type &map, size_type grainsize_ = 1 ) : 
+            my_begin( Iterator( map, 0, map.my_embedded_segment, map.my_embedded_segment->node_list ) ),
+            my_end( Iterator( map, map.my_mask + 1, 0, 0 ) ),
+            my_grainsize( grainsize_ )
+        {
+            __TBB_ASSERT( grainsize_>0, "grainsize must be positive" );
+            set_midpoint();
+        }
+        const Iterator& begin() const {return my_begin;}
+        const Iterator& end() const {return my_end;}
+        //! The grain size for this range.
+        size_type grainsize() const {return my_grainsize;}
+    };
+
+    template<typename Iterator>
+    void hash_map_range<Iterator>::set_midpoint() const {
+        // Split by groups of nodes
+        size_t m = my_end.my_index-my_begin.my_index;
+        if( m > my_grainsize ) {
+            m = my_begin.my_index + m/2u;
+            hash_map_base::bucket *b = my_begin.my_map->get_bucket(m);
+            my_midpoint = Iterator(*my_begin.my_map,m,b,b->node_list);
+        } else {
+            my_midpoint = my_end;
+        }
+        __TBB_ASSERT( my_begin.my_index <= my_midpoint.my_index,
+            "my_begin is after my_midpoint" );
+        __TBB_ASSERT( my_midpoint.my_index <= my_end.my_index,
+            "my_midpoint is after my_end" );
+        __TBB_ASSERT( my_begin != my_midpoint || my_begin == my_end,
+            "[my_begin, my_midpoint) range should not be empty" );
+    }
+
+    } // internal
+//! @endcond
+
+//! Unordered map from Key to T.
+/** concurrent_hash_map is associative container with concurrent access.
+
+@par Compatibility
+    The class meets all Container Requirements from C++ Standard (See ISO/IEC 14882:2003(E), clause 23.1).
+
+@par Exception Safety
+    - Hash function is not permitted to throw an exception. User-defined types Key and T are forbidden from throwing an exception in destructors.
+    - If exception happens during insert() operations, it has no effect (unless exception raised by HashCompare::hash() function during grow_segment).
+    - If exception happens during operator=() operation, the container can have a part of source items, and methods size() and empty() can return wrong results.
+
+@par Changes since TBB 2.1
+    - Replaced internal algorithm and data structure. Patent is pending.
+    - Added buckets number argument for constructor
+
+@par Changes since TBB 2.0
+    - Fixed exception-safety
+    - Added template argument for allocator
+    - Added allocator argument in constructors
+    - Added constructor from a range of iterators
+    - Added several new overloaded insert() methods
+    - Added get_allocator()
+    - Added swap()
+    - Added count()
+    - Added overloaded erase(accessor &) and erase(const_accessor&)
+    - Added equal_range() [const]
+    - Added [const_]pointer, [const_]reference, and allocator_type types
+    - Added global functions: operator==(), operator!=(), and swap() 
+
+    @ingroup containers */
+template<typename Key, typename T, typename HashCompare, typename Allocator>
+class concurrent_hash_map : protected internal::hash_map_base {
+    template<typename Container, typename Value>
+    friend class internal::hash_map_iterator;
+
+    template<typename I>
+    friend class internal::hash_map_range;
+
+public:
+    typedef Key key_type;
+    typedef T mapped_type;
+    typedef std::pair<const Key,T> value_type;
+    typedef hash_map_base::size_type size_type;
+    typedef ptrdiff_t difference_type;
+    typedef value_type *pointer;
+    typedef const value_type *const_pointer;
+    typedef value_type &reference;
+    typedef const value_type &const_reference;
+    typedef internal::hash_map_iterator<concurrent_hash_map,value_type> iterator;
+    typedef internal::hash_map_iterator<concurrent_hash_map,const value_type> const_iterator;
+    typedef internal::hash_map_range<iterator> range_type;
+    typedef internal::hash_map_range<const_iterator> const_range_type;
+    typedef Allocator allocator_type;
+
+protected:
+    friend class const_accessor;
+    struct node;
+    typedef typename Allocator::template rebind<node>::other node_allocator_type;
+    node_allocator_type my_allocator;
+    HashCompare my_hash_compare;
+
+    struct node : public node_base {
+        value_type item;
+        node( const Key &key ) : item(key, T()) {}
+        node( const Key &key, const T &t ) : item(key, t) {}
+        // exception-safe allocation, see C++ Standard 2003, clause 5.3.4p17
+        void *operator new( size_t /*size*/, node_allocator_type &a ) {
+            void *ptr = a.allocate(1);
+            if(!ptr) 
+                tbb::internal::throw_exception(tbb::internal::eid_bad_alloc);
+            return ptr;
+        }
+        // match placement-new form above to be called if exception thrown in constructor
+        void operator delete( void *ptr, node_allocator_type &a ) {return a.deallocate(static_cast<node*>(ptr),1); }
+    };
+
+    void delete_node( node_base *n ) {
+        my_allocator.destroy( static_cast<node*>(n) );
+        my_allocator.deallocate( static_cast<node*>(n), 1);
+    }
+
+    node *search_bucket( const key_type &key, bucket *b ) const {
+        node *n = static_cast<node*>( b->node_list );
+        while( is_valid(n) && !my_hash_compare.equal(key, n->item.first) )
+            n = static_cast<node*>( n->next );
+        __TBB_ASSERT(n != internal::rehash_req, "Search can be executed only for rehashed bucket");
+        return n;
+    }
+
+    //! bucket accessor is to find, rehash, acquire a lock, and access a bucket
+    class bucket_accessor : public bucket::scoped_t {
+        bool my_is_writer; // TODO: use it from base type
+        bucket *my_b;
+    public:
+        bucket_accessor( concurrent_hash_map *base, const hashcode_t h, bool writer = false ) { acquire( base, h, writer ); }
+        //! find a bucket by masked hashcode, optionally rehash, and acquire the lock
+        inline void acquire( concurrent_hash_map *base, const hashcode_t h, bool writer = false ) {
+            my_b = base->get_bucket( h );
+#if TBB_USE_THREADING_TOOLS
+            // TODO: actually, notification is unnecessary here, just hiding double-check
+            if( itt_load_pointer_with_acquire_v3(&my_b->node_list) == internal::rehash_req
+#else
+            if( __TBB_load_with_acquire(my_b->node_list) == internal::rehash_req
+#endif
+                && try_acquire( my_b->mutex, /*write=*/true ) )
+            {
+                if( my_b->node_list == internal::rehash_req ) base->rehash_bucket( my_b, h ); //recursive rehashing
+                my_is_writer = true;
+            }
+            else bucket::scoped_t::acquire( my_b->mutex, /*write=*/my_is_writer = writer );
+            __TBB_ASSERT( my_b->node_list != internal::rehash_req, NULL);
+        }
+        //! check whether bucket is locked for write
+        bool is_writer() { return my_is_writer; }
+        //! get bucket pointer
+        bucket *operator() () { return my_b; }
+        // TODO: optimize out
+        bool upgrade_to_writer() { my_is_writer = true; return bucket::scoped_t::upgrade_to_writer(); }
+    };
+
+    // TODO refactor to hash_base
+    void rehash_bucket( bucket *b_new, const hashcode_t h ) {
+        __TBB_ASSERT( *(intptr_t*)(&b_new->mutex), "b_new must be locked (for write)");
+        __TBB_ASSERT( h > 1, "The lowermost buckets can't be rehashed" );
+        __TBB_store_with_release(b_new->node_list, internal::empty_rehashed); // mark rehashed
+        hashcode_t mask = ( 1u<<__TBB_Log2( h ) ) - 1; // get parent mask from the topmost bit
+
+        bucket_accessor b_old( this, h & mask );
+
+        mask = (mask<<1) | 1; // get full mask for new bucket
+        __TBB_ASSERT( (mask&(mask+1))==0 && (h & mask) == h, NULL );
+    restart:
+        for( node_base **p = &b_old()->node_list, *n = __TBB_load_with_acquire(*p); is_valid(n); n = *p ) {
+            hashcode_t c = my_hash_compare.hash( static_cast<node*>(n)->item.first );
+#if TBB_USE_ASSERT
+            hashcode_t bmask = h & (mask>>1);
+            bmask = bmask==0? 1 : ( 1u<<(__TBB_Log2( bmask )+1 ) ) - 1; // minimal mask of parent bucket
+            __TBB_ASSERT( (c & bmask) == (h & bmask), "hash() function changed for key in table" );
+#endif
+            if( (c & mask) == h ) {
+                if( !b_old.is_writer() )
+                    if( !b_old.upgrade_to_writer() ) {
+                        goto restart; // node ptr can be invalid due to concurrent erase
+                    }
+                *p = n->next; // exclude from b_old
+                add_to_bucket( b_new, n );
+            } else p = &n->next; // iterate to next item
+        }
+    }
+
+public:
+    
+    class accessor;
+    //! Combines data access, locking, and garbage collection.
+    class const_accessor {
+        friend class concurrent_hash_map<Key,T,HashCompare,Allocator>;
+        friend class accessor;
+        void operator=( const accessor & ) const; // Deny access
+        const_accessor( const accessor & );       // Deny access
+    public:
+        //! Type of value
+        typedef const typename concurrent_hash_map::value_type value_type;
+
+        //! True if result is empty.
+        bool empty() const {return !my_node;}
+
+        //! Set to null
+        void release() {
+            if( my_node ) {
+                my_lock.release();
+                my_node = 0;
+            }
+        }
+
+        //! Return reference to associated value in hash table.
+        const_reference operator*() const {
+            __TBB_ASSERT( my_node, "attempt to dereference empty accessor" );
+            return my_node->item;
+        }
+
+        //! Return pointer to associated value in hash table.
+        const_pointer operator->() const {
+            return &operator*();
+        }
+
+        //! Create empty result
+        const_accessor() : my_node(NULL) {}
+
+        //! Destroy result after releasing the underlying reference.
+        ~const_accessor() {
+            my_node = NULL; // my_lock.release() is called in scoped_lock destructor
+        }
+    private:
+        node *my_node;
+        typename node::scoped_t my_lock;
+        hashcode_t my_hash;
+    };
+
+    //! Allows write access to elements and combines data access, locking, and garbage collection.
+    class accessor: public const_accessor {
+    public:
+        //! Type of value
+        typedef typename concurrent_hash_map::value_type value_type;
+
+        //! Return reference to associated value in hash table.
+        reference operator*() const {
+            __TBB_ASSERT( this->my_node, "attempt to dereference empty accessor" );
+            return this->my_node->item;
+        }
+
+        //! Return pointer to associated value in hash table.
+        pointer operator->() const {
+            return &operator*();
+        }
+    };
+
+    //! Construct empty table.
+    concurrent_hash_map(const allocator_type &a = allocator_type())
+        : internal::hash_map_base(), my_allocator(a)
+    {}
+
+    //! Construct empty table with n preallocated buckets. This number serves also as initial concurrency level.
+    concurrent_hash_map(size_type n, const allocator_type &a = allocator_type())
+        : my_allocator(a)
+    {
+        reserve( n );
+    }
+
+    //! Copy constructor
+    concurrent_hash_map( const concurrent_hash_map& table, const allocator_type &a = allocator_type())
+        : internal::hash_map_base(), my_allocator(a)
+    {
+        internal_copy(table);
+    }
+
+    //! Construction with copying iteration range and given allocator instance
+    template<typename I>
+    concurrent_hash_map(I first, I last, const allocator_type &a = allocator_type())
+        : my_allocator(a)
+    {
+        reserve( std::distance(first, last) ); // TODO: load_factor?
+        internal_copy(first, last);
+    }
+
+    //! Assignment
+    concurrent_hash_map& operator=( const concurrent_hash_map& table ) {
+        if( this!=&table ) {
+            clear();
+            internal_copy(table);
+        } 
+        return *this;
+    }
+
+
+    //! Rehashes and optionally resizes the whole table.
+    /** Useful to optimize performance before or after concurrent operations.
+        Also enables using of find() and count() concurrent methods in serial context. */
+    void rehash(size_type n = 0);
+    
+    //! Clear table
+    void clear();
+
+    //! Clear table and destroy it.  
+    ~concurrent_hash_map() { clear(); }
+
+    //------------------------------------------------------------------------
+    // Parallel algorithm support
+    //------------------------------------------------------------------------
+    range_type range( size_type grainsize=1 ) {
+        return range_type( *this, grainsize );
+    }
+    const_range_type range( size_type grainsize=1 ) const {
+        return const_range_type( *this, grainsize );
+    }
+
+    //------------------------------------------------------------------------
+    // STL support - not thread-safe methods
+    //------------------------------------------------------------------------
+    iterator begin() {return iterator(*this,0,my_embedded_segment,my_embedded_segment->node_list);}
+    iterator end() {return iterator(*this,0,0,0);}
+    const_iterator begin() const {return const_iterator(*this,0,my_embedded_segment,my_embedded_segment->node_list);}
+    const_iterator end() const {return const_iterator(*this,0,0,0);}
+    std::pair<iterator, iterator> equal_range( const Key& key ) { return internal_equal_range(key, end()); }
+    std::pair<const_iterator, const_iterator> equal_range( const Key& key ) const { return internal_equal_range(key, end()); }
+    
+    //! Number of items in table.
+    size_type size() const { return my_size; }
+
+    //! True if size()==0.
+    bool empty() const { return my_size == 0; }
+
+    //! Upper bound on size.
+    size_type max_size() const {return (~size_type(0))/sizeof(node);}
+
+    //! Returns the current number of buckets
+    size_type bucket_count() const { return my_mask+1; }
+
+    //! return allocator object
+    allocator_type get_allocator() const { return this->my_allocator; }
+
+    //! swap two instances. Iterators are invalidated
+    void swap(concurrent_hash_map &table);
+
+    //------------------------------------------------------------------------
+    // concurrent map operations
+    //------------------------------------------------------------------------
+
+    //! Return count of items (0 or 1)
+    size_type count( const Key &key ) const {
+        return const_cast<concurrent_hash_map*>(this)->lookup(/*insert*/false, key, NULL, NULL, /*write=*/false );
+    }
+
+    //! Find item and acquire a read lock on the item.
+    /** Return true if item is found, false otherwise. */
+    bool find( const_accessor &result, const Key &key ) const {
+        result.release();
+        return const_cast<concurrent_hash_map*>(this)->lookup(/*insert*/false, key, NULL, &result, /*write=*/false );
+    }
+
+    //! Find item and acquire a write lock on the item.
+    /** Return true if item is found, false otherwise. */
+    bool find( accessor &result, const Key &key ) {
+        result.release();
+        return lookup(/*insert*/false, key, NULL, &result, /*write=*/true );
+    }
+        
+    //! Insert item (if not already present) and acquire a read lock on the item.
+    /** Returns true if item is new. */
+    bool insert( const_accessor &result, const Key &key ) {
+        result.release();
+        return lookup(/*insert*/true, key, NULL, &result, /*write=*/false );
+    }
+
+    //! Insert item (if not already present) and acquire a write lock on the item.
+    /** Returns true if item is new. */
+    bool insert( accessor &result, const Key &key ) {
+        result.release();
+        return lookup(/*insert*/true, key, NULL, &result, /*write=*/true );
+    }
+
+    //! Insert item by copying if there is no such key present already and acquire a read lock on the item.
+    /** Returns true if item is new. */
+    bool insert( const_accessor &result, const value_type &value ) {
+        result.release();
+        return lookup(/*insert*/true, value.first, &value.second, &result, /*write=*/false );
+    }
+
+    //! Insert item by copying if there is no such key present already and acquire a write lock on the item.
+    /** Returns true if item is new. */
+    bool insert( accessor &result, const value_type &value ) {
+        result.release();
+        return lookup(/*insert*/true, value.first, &value.second, &result, /*write=*/true );
+    }
+
+    //! Insert item by copying if there is no such key present already
+    /** Returns true if item is inserted. */
+    bool insert( const value_type &value ) {
+        return lookup(/*insert*/true, value.first, &value.second, NULL, /*write=*/false );
+    }
+
+    //! Insert range [first, last)
+    template<typename I>
+    void insert(I first, I last) {
+        for(; first != last; ++first)
+            insert( *first );
+    }
+
+    //! Erase item.
+    /** Return true if item was erased by particularly this call. */
+    bool erase( const Key& key );
+
+    //! Erase item by const_accessor.
+    /** Return true if item was erased by particularly this call. */
+    bool erase( const_accessor& item_accessor ) {
+        return exclude( item_accessor, /*readonly=*/ true );
+    }
+
+    //! Erase item by accessor.
+    /** Return true if item was erased by particularly this call. */
+    bool erase( accessor& item_accessor ) {
+        return exclude( item_accessor, /*readonly=*/ false );
+    }
+
+protected:
+    //! Insert or find item and optionally acquire a lock on the item.
+    bool lookup( bool op_insert, const Key &key, const T *t, const_accessor *result, bool write );
+
+    //! delete item by accessor
+    bool exclude( const_accessor &item_accessor, bool readonly );
+
+    //! Returns an iterator for an item defined by the key, or for the next item after it (if upper==true)
+    template<typename I>
+    std::pair<I, I> internal_equal_range( const Key& key, I end ) const;
+
+    //! Copy "source" to *this, where *this must start out empty.
+    void internal_copy( const concurrent_hash_map& source );
+
+    template<typename I>
+    void internal_copy(I first, I last);
+
+    //! Fast find when no concurrent erasure is used. For internal use inside TBB only!
+    /** Return pointer to item with given key, or NULL if no such item exists.
+        Must not be called concurrently with erasure operations. */
+    const_pointer internal_fast_find( const Key& key ) const {
+        hashcode_t h = my_hash_compare.hash( key );
+#if TBB_USE_THREADING_TOOLS
+        hashcode_t m = (hashcode_t) itt_load_pointer_with_acquire_v3( &my_mask );
+#else
+        hashcode_t m = my_mask;
+#endif
+        node *n;
+    restart:
+        __TBB_ASSERT((m&(m+1))==0, NULL);
+        bucket *b = get_bucket( h & m );
+#if TBB_USE_THREADING_TOOLS
+        // TODO: actually, notification is unnecessary here, just hiding double-check
+        if( itt_load_pointer_with_acquire_v3(&b->node_list) == internal::rehash_req )
+#else
+        if( __TBB_load_with_acquire(b->node_list) == internal::rehash_req )
+#endif
+        {
+            bucket::scoped_t lock;
+            if( lock.try_acquire( b->mutex, /*write=*/true ) ) {
+                if( b->node_list == internal::rehash_req)
+                    const_cast<concurrent_hash_map*>(this)->rehash_bucket( b, h & m ); //recursive rehashing
+            }
+            else lock.acquire( b->mutex, /*write=*/false );
+            __TBB_ASSERT(b->node_list!=internal::rehash_req,NULL);
+        }
+        n = search_bucket( key, b );
+        if( n )
+            return &n->item;
+        else if( check_mask_race( h, m ) )
+            goto restart;
+        return 0;
+    }
+};
+
+#if _MSC_VER && !defined(__INTEL_COMPILER)
+    // Suppress "conditional expression is constant" warning.
+    #pragma warning( push )
+    #pragma warning( disable: 4127 )
+#endif
+
+template<typename Key, typename T, typename HashCompare, typename A>
+bool concurrent_hash_map<Key,T,HashCompare,A>::lookup( bool op_insert, const Key &key, const T *t, const_accessor *result, bool write ) {
+    __TBB_ASSERT( !result || !result->my_node, NULL );
+    segment_index_t grow_segment;
+    bool return_value;
+    node *n, *tmp_n = 0;
+    hashcode_t const h = my_hash_compare.hash( key );
+#if TBB_USE_THREADING_TOOLS
+    hashcode_t m = (hashcode_t) itt_load_pointer_with_acquire_v3( &my_mask );
+#else
+    hashcode_t m = my_mask;
+#endif
+    restart:
+    {//lock scope
+        __TBB_ASSERT((m&(m+1))==0, NULL);
+        return_value = false;
+        // get bucket
+        bucket_accessor b( this, h & m );
+
+        // find a node
+        n = search_bucket( key, b() );
+        if( op_insert ) {
+            // [opt] insert a key
+            if( !n ) {
+                if( !tmp_n ) {
+                    if(t) tmp_n = new( my_allocator ) node(key, *t);
+                    else  tmp_n = new( my_allocator ) node(key);
+                }
+                if( !b.is_writer() && !b.upgrade_to_writer() ) { // TODO: improved insertion
+                    // Rerun search_list, in case another thread inserted the item during the upgrade.
+                    n = search_bucket( key, b() );
+                    if( is_valid(n) ) { // unfortunately, it did
+                        b.downgrade_to_reader();
+                        goto exists;
+                    }
+                }
+                if( check_mask_race(h, m) )
+                    goto restart; // b.release() is done in ~b().
+                // insert and set flag to grow the container
+                grow_segment = insert_new_node( b(), n = tmp_n, m );
+                tmp_n = 0;
+                return_value = true;
+            } else {
+    exists:     grow_segment = 0;
+            }
+        } else { // find or count
+            if( !n ) {
+                if( check_mask_race( h, m ) )
+                    goto restart; // b.release() is done in ~b(). TODO: replace by continue
+                return false;
+            }
+            return_value = true;
+            grow_segment = 0;
+        }
+        if( !result ) goto check_growth;
+        // TODO: the following seems as generic/regular operation
+        // acquire the item
+        if( !result->my_lock.try_acquire( n->mutex, write ) ) {
+            // we are unlucky, prepare for longer wait
+            tbb::internal::atomic_backoff trials;
+            do {
+                if( !trials.bounded_pause() ) {
+                    // the wait takes really long, restart the operation
+                    b.release();
+                    __TBB_ASSERT( !op_insert || !return_value, "Can't acquire new item in locked bucket?" );
+                    __TBB_Yield();
+#if TBB_USE_THREADING_TOOLS
+                    m = (hashcode_t) itt_load_pointer_with_acquire_v3( &my_mask );
+#else
+                    m = my_mask;
+#endif
+                    goto restart;
+                }
+            } while( !result->my_lock.try_acquire( n->mutex, write ) );
+        }
+    }//lock scope
+    result->my_node = n;
+    result->my_hash = h;
+check_growth:
+    // [opt] grow the container
+    if( grow_segment )
+        enable_segment( grow_segment );
+    if( tmp_n ) // if op_insert only
+        delete_node( tmp_n );
+    return return_value;
+}
+
+template<typename Key, typename T, typename HashCompare, typename A>
+template<typename I>
+std::pair<I, I> concurrent_hash_map<Key,T,HashCompare,A>::internal_equal_range( const Key& key, I end_ ) const {
+    hashcode_t h = my_hash_compare.hash( key );
+    hashcode_t m = my_mask;
+    __TBB_ASSERT((m&(m+1))==0, NULL);
+    h &= m;
+    bucket *b = get_bucket( h );
+    while( b->node_list == internal::rehash_req ) {
+        m = ( 1u<<__TBB_Log2( h ) ) - 1; // get parent mask from the topmost bit
+        b = get_bucket( h &= m );
+    }
+    node *n = search_bucket( key, b );
+    if( !n )
+        return std::make_pair(end_, end_);
+    iterator lower(*this, h, b, n), upper(lower);
+    return std::make_pair(lower, ++upper);
+}
+
+template<typename Key, typename T, typename HashCompare, typename A>
+bool concurrent_hash_map<Key,T,HashCompare,A>::exclude( const_accessor &item_accessor, bool readonly ) {
+    __TBB_ASSERT( item_accessor.my_node, NULL );
+    node_base *const n = item_accessor.my_node;
+    item_accessor.my_node = NULL; // we ought release accessor anyway
+    hashcode_t const h = item_accessor.my_hash;
+#if TBB_USE_THREADING_TOOLS
+    hashcode_t m = (hashcode_t) itt_load_pointer_with_acquire_v3( &my_mask );
+#else
+    hashcode_t m = my_mask;
+#endif
+    do {
+        // get bucket
+        bucket_accessor b( this, h & m, /*writer=*/true );
+        node_base **p = &b()->node_list;
+        while( *p && *p != n )
+            p = &(*p)->next;
+        if( !*p ) { // someone else was the first
+            if( check_mask_race( h, m ) )
+                continue;
+            item_accessor.my_lock.release();
+            return false;
+        }
+        __TBB_ASSERT( *p == n, NULL );
+        *p = n->next; // remove from container
+        my_size--;
+        break;
+    } while(true);
+    if( readonly ) // need to get exclusive lock
+        item_accessor.my_lock.upgrade_to_writer(); // return value means nothing here
+    item_accessor.my_lock.release();
+    delete_node( n ); // Only one thread can delete it due to write lock on the chain_mutex
+    return true;
+}
+
+template<typename Key, typename T, typename HashCompare, typename A>
+bool concurrent_hash_map<Key,T,HashCompare,A>::erase( const Key &key ) {
+    node_base *n;
+    hashcode_t const h = my_hash_compare.hash( key );
+#if TBB_USE_THREADING_TOOLS
+    hashcode_t m = (hashcode_t) itt_load_pointer_with_acquire_v3( &my_mask );
+#else
+    hashcode_t m = my_mask;
+#endif
+restart:
+    {//lock scope
+        // get bucket
+        bucket_accessor b( this, h & m );
+    search:
+        node_base **p = &b()->node_list;
+        n = *p;
+        while( is_valid(n) && !my_hash_compare.equal(key, static_cast<node*>(n)->item.first ) ) {
+            p = &n->next;
+            n = *p;
+        }
+        if( !n ) { // not found, but mask could be changed
+            if( check_mask_race( h, m ) )
+                goto restart;
+            return false;
+        }
+        else if( !b.is_writer() && !b.upgrade_to_writer() ) {
+            if( check_mask_race( h, m ) ) // contended upgrade, check mask
+                goto restart;
+            goto search;
+        }
+        *p = n->next;
+        my_size--;
+    }
+    {
+        typename node::scoped_t item_locker( n->mutex, /*write=*/true );
+    }
+    // note: there should be no threads pretending to acquire this mutex again, do not try to upgrade const_accessor!
+    delete_node( n ); // Only one thread can delete it due to write lock on the bucket
+    return true;
+}
+
+template<typename Key, typename T, typename HashCompare, typename A>
+void concurrent_hash_map<Key,T,HashCompare,A>::swap(concurrent_hash_map<Key,T,HashCompare,A> &table) {
+    std::swap(this->my_allocator, table.my_allocator);
+    std::swap(this->my_hash_compare, table.my_hash_compare);
+    internal_swap(table);
+}
+
+template<typename Key, typename T, typename HashCompare, typename A>
+void concurrent_hash_map<Key,T,HashCompare,A>::rehash(size_type sz) {
+    reserve( sz ); // TODO: add reduction of number of buckets as well
+    hashcode_t mask = my_mask;
+    hashcode_t b = (mask+1)>>1; // size or first index of the last segment
+    __TBB_ASSERT((b&(b-1))==0, NULL);
+    bucket *bp = get_bucket( b ); // only the last segment should be scanned for rehashing
+    for(; b <= mask; b++, bp++ ) {
+        node_base *n = bp->node_list;
+        __TBB_ASSERT( is_valid(n) || n == internal::empty_rehashed || n == internal::rehash_req, "Broken internal structure" );
+        __TBB_ASSERT( *reinterpret_cast<intptr_t*>(&bp->mutex) == 0, "concurrent or unexpectedly terminated operation during rehash() execution" );
+        if( n == internal::rehash_req ) { // rehash bucket, conditional because rehashing of a previous bucket may affect this one
+            hashcode_t h = b; bucket *b_old = bp;
+            do {
+                __TBB_ASSERT( h > 1, "The lowermost buckets can't be rehashed" );
+                hashcode_t m = ( 1u<<__TBB_Log2( h ) ) - 1; // get parent mask from the topmost bit
+                b_old = get_bucket( h &= m );
+            } while( b_old->node_list == internal::rehash_req );
+            // now h - is index of the root rehashed bucket b_old
+            mark_rehashed_levels( h ); // mark all non-rehashed children recursively across all segments
+            for( node_base **p = &b_old->node_list, *q = *p; is_valid(q); q = *p ) {
+                hashcode_t c = my_hash_compare.hash( static_cast<node*>(q)->item.first );
+                if( (c & mask) != h ) { // should be rehashed
+                    *p = q->next; // exclude from b_old
+                    bucket *b_new = get_bucket( c & mask );
+                    __TBB_ASSERT( b_new->node_list != internal::rehash_req, "hash() function changed for key in table or internal error" );
+                    add_to_bucket( b_new, q );
+                } else p = &q->next; // iterate to next item
+            }
+        }
+    }
+#if TBB_USE_PERFORMANCE_WARNINGS
+    int current_size = int(my_size), buckets = int(mask)+1, empty_buckets = 0, overpopulated_buckets = 0; // usage statistics
+    static bool reported = false;
+#endif
+#if TBB_USE_ASSERT || TBB_USE_PERFORMANCE_WARNINGS
+    for( b = 0; b <= mask; b++ ) {// only last segment should be scanned for rehashing
+        if( b & (b-2) ) ++bp; // not the beginning of a segment
+        else bp = get_bucket( b );
+        node_base *n = bp->node_list;
+        __TBB_ASSERT( *reinterpret_cast<intptr_t*>(&bp->mutex) == 0, "concurrent or unexpectedly terminated operation during rehash() execution" );
+        __TBB_ASSERT( is_valid(n) || n == internal::empty_rehashed, "Broken internal structure" );
+#if TBB_USE_PERFORMANCE_WARNINGS
+        if( n == internal::empty_rehashed ) empty_buckets++;
+        else if( n->next ) overpopulated_buckets++;
+#endif
+#if TBB_USE_ASSERT
+        for( ; is_valid(n); n = n->next ) {
+            hashcode_t h = my_hash_compare.hash( static_cast<node*>(n)->item.first ) & mask;
+            __TBB_ASSERT( h == b, "hash() function changed for key in table or internal error" );
+        }
+#endif
+    }
+#endif // TBB_USE_ASSERT || TBB_USE_PERFORMANCE_WARNINGS
+#if TBB_USE_PERFORMANCE_WARNINGS
+    if( buckets > current_size) empty_buckets -= buckets - current_size;
+    else overpopulated_buckets -= current_size - buckets; // TODO: load_factor?
+    if( !reported && buckets >= 512 && ( 2*empty_buckets > current_size || 2*overpopulated_buckets > current_size ) ) {
+        tbb::internal::runtime_warning(
+            "Performance is not optimal because the hash function produces bad randomness in lower bits in %s.\nSize: %d  Empties: %d  Overlaps: %d",
+            typeid(*this).name(), current_size, empty_buckets, overpopulated_buckets );
+        reported = true;
+    }
+#endif
+}
+
+template<typename Key, typename T, typename HashCompare, typename A>
+void concurrent_hash_map<Key,T,HashCompare,A>::clear() {
+    hashcode_t m = my_mask;
+    __TBB_ASSERT((m&(m+1))==0, NULL);
+#if TBB_USE_ASSERT || TBB_USE_PERFORMANCE_WARNINGS
+#if TBB_USE_PERFORMANCE_WARNINGS
+    int current_size = int(my_size), buckets = int(m)+1, empty_buckets = 0, overpopulated_buckets = 0; // usage statistics
+    static bool reported = false;
+#endif
+    bucket *bp = 0;
+    // check consistency
+    for( segment_index_t b = 0; b <= m; b++ ) {
+        if( b & (b-2) ) ++bp; // not the beginning of a segment
+        else bp = get_bucket( b );
+        node_base *n = bp->node_list;
+        __TBB_ASSERT( is_valid(n) || n == internal::empty_rehashed || n == internal::rehash_req, "Broken internal structure" );
+        __TBB_ASSERT( *reinterpret_cast<intptr_t*>(&bp->mutex) == 0, "concurrent or unexpectedly terminated operation during clear() execution" );
+#if TBB_USE_PERFORMANCE_WARNINGS
+        if( n == internal::empty_rehashed ) empty_buckets++;
+        else if( n == internal::rehash_req ) buckets--;
+        else if( n->next ) overpopulated_buckets++;
+#endif
+#if __TBB_EXTRA_DEBUG
+        for(; is_valid(n); n = n->next ) {
+            hashcode_t h = my_hash_compare.hash( static_cast<node*>(n)->item.first );
+            h &= m;
+            __TBB_ASSERT( h == b || get_bucket(h)->node_list == internal::rehash_req, "hash() function changed for key in table or internal error" );
+        }
+#endif
+    }
+#if TBB_USE_PERFORMANCE_WARNINGS
+    if( buckets > current_size) empty_buckets -= buckets - current_size;
+    else overpopulated_buckets -= current_size - buckets; // TODO: load_factor?
+    if( !reported && buckets >= 512 && ( 2*empty_buckets > current_size || 2*overpopulated_buckets > current_size ) ) {
+        tbb::internal::runtime_warning(
+            "Performance is not optimal because the hash function produces bad randomness in lower bits in %s.\nSize: %d  Empties: %d  Overlaps: %d",
+            typeid(*this).name(), current_size, empty_buckets, overpopulated_buckets );
+        reported = true;
+    }
+#endif
+#endif//TBB_USE_ASSERT || TBB_USE_PERFORMANCE_WARNINGS
+    my_size = 0;
+    segment_index_t s = segment_index_of( m );
+    __TBB_ASSERT( s+1 == pointers_per_table || !my_table[s+1], "wrong mask or concurrent grow" );
+    cache_aligned_allocator<bucket> alloc;
+    do {
+        __TBB_ASSERT( is_valid( my_table[s] ), "wrong mask or concurrent grow" );
+        segment_ptr_t buckets_ptr = my_table[s];
+        size_type sz = segment_size( s ? s : 1 );
+        for( segment_index_t i = 0; i < sz; i++ )
+            for( node_base *n = buckets_ptr[i].node_list; is_valid(n); n = buckets_ptr[i].node_list ) {
+                buckets_ptr[i].node_list = n->next;
+                delete_node( n );
+            }
+        if( s >= first_block) // the first segment or the next
+            alloc.deallocate( buckets_ptr, sz );
+        else if( s == embedded_block && embedded_block != first_block )
+            alloc.deallocate( buckets_ptr, segment_size(first_block)-embedded_buckets );
+        if( s >= embedded_block ) my_table[s] = 0;
+    } while(s-- > 0);
+    my_mask = embedded_buckets - 1;
+}
+
+template<typename Key, typename T, typename HashCompare, typename A>
+void concurrent_hash_map<Key,T,HashCompare,A>::internal_copy( const concurrent_hash_map& source ) {
+    reserve( source.my_size ); // TODO: load_factor?
+    hashcode_t mask = source.my_mask;
+    if( my_mask == mask ) { // optimized version
+        bucket *dst = 0, *src = 0;
+        bool rehash_required = false;
+        for( hashcode_t k = 0; k <= mask; k++ ) {
+            if( k & (k-2) ) ++dst,src++; // not the beginning of a segment
+            else { dst = get_bucket( k ); src = source.get_bucket( k ); }
+            __TBB_ASSERT( dst->node_list != internal::rehash_req, "Invalid bucket in destination table");
+            node *n = static_cast<node*>( src->node_list );
+            if( n == internal::rehash_req ) { // source is not rehashed, items are in previous buckets
+                rehash_required = true;
+                dst->node_list = internal::rehash_req;
+            } else for(; n; n = static_cast<node*>( n->next ) ) {
+                add_to_bucket( dst, new( my_allocator ) node(n->item.first, n->item.second) );
+                ++my_size; // TODO: replace by non-atomic op
+            }
+        }
+        if( rehash_required ) rehash();
+    } else internal_copy( source.begin(), source.end() );
+}
+
+template<typename Key, typename T, typename HashCompare, typename A>
+template<typename I>
+void concurrent_hash_map<Key,T,HashCompare,A>::internal_copy(I first, I last) {
+    hashcode_t m = my_mask;
+    for(; first != last; ++first) {
+        hashcode_t h = my_hash_compare.hash( first->first );
+        bucket *b = get_bucket( h & m );
+        __TBB_ASSERT( b->node_list != internal::rehash_req, "Invalid bucket in destination table");
+        node *n = new( my_allocator ) node(first->first, first->second);
+        add_to_bucket( b, n );
+        ++my_size; // TODO: replace by non-atomic op
+    }
+}
+
+} // namespace interface4
+
+using interface4::concurrent_hash_map;
+
+
+template<typename Key, typename T, typename HashCompare, typename A1, typename A2>
+inline bool operator==(const concurrent_hash_map<Key, T, HashCompare, A1> &a, const concurrent_hash_map<Key, T, HashCompare, A2> &b) {
+    if(a.size() != b.size()) return false;
+    typename concurrent_hash_map<Key, T, HashCompare, A1>::const_iterator i(a.begin()), i_end(a.end());
+    typename concurrent_hash_map<Key, T, HashCompare, A2>::const_iterator j, j_end(b.end());
+    for(; i != i_end; ++i) {
+        j = b.equal_range(i->first).first;
+        if( j == j_end || !(i->second == j->second) ) return false;
+    }
+    return true;
+}
+
+template<typename Key, typename T, typename HashCompare, typename A1, typename A2>
+inline bool operator!=(const concurrent_hash_map<Key, T, HashCompare, A1> &a, const concurrent_hash_map<Key, T, HashCompare, A2> &b)
+{    return !(a == b); }
+
+template<typename Key, typename T, typename HashCompare, typename A>
+inline void swap(concurrent_hash_map<Key, T, HashCompare, A> &a, concurrent_hash_map<Key, T, HashCompare, A> &b)
+{    a.swap( b ); }
+
+#if _MSC_VER && !defined(__INTEL_COMPILER)
+    #pragma warning( pop )
+#endif // warning 4127 is back
+
+} // namespace tbb
+
+#endif /* __TBB_concurrent_hash_map_H */
diff --git a/tbb30_20100406oss/include/tbb/concurrent_queue.h b/tbb30_20100406oss/include/tbb/concurrent_queue.h
new file mode 100644 (file)
index 0000000..c137fb3
--- /dev/null
@@ -0,0 +1,413 @@
+/*
+    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB_concurrent_queue_H
+#define __TBB_concurrent_queue_H
+
+#include "_concurrent_queue_internal.h"
+
+namespace tbb {
+
+namespace strict_ppl {
+
+//! A high-performance thread-safe non-blocking concurrent queue.
+/** Multiple threads may each push and pop concurrently.
+    Assignment construction is not allowed.
+    @ingroup containers */
+template<typename T, typename A = cache_aligned_allocator<T> > 
+class concurrent_queue: public internal::concurrent_queue_base_v3<T> {
+    template<typename Container, typename Value> friend class internal::concurrent_queue_iterator;
+
+    //! Allocator type
+    typedef typename A::template rebind<char>::other page_allocator_type;
+    page_allocator_type my_allocator;
+
+    //! Allocates a block of size n (bytes)
+    /*overide*/ virtual void *allocate_block( size_t n ) {
+        void *b = reinterpret_cast<void*>(my_allocator.allocate( n ));
+        if( !b )
+            internal::throw_exception(internal::eid_bad_alloc); 
+        return b;
+    }
+
+    //! Deallocates block created by allocate_block.
+    /*override*/ virtual void deallocate_block( void *b, size_t n ) {
+        my_allocator.deallocate( reinterpret_cast<char*>(b), n );
+    }
+
+public:
+    //! Element type in the queue.
+    typedef T value_type;
+
+    //! Reference type
+    typedef T& reference;
+
+    //! Const reference type
+    typedef const T& const_reference;
+
+    //! Integral type for representing size of the queue.
+    typedef size_t size_type;
+
+    //! Difference type for iterator
+    typedef ptrdiff_t difference_type;
+
+    //! Allocator type
+    typedef A allocator_type;
+
+    //! Construct empty queue
+    explicit concurrent_queue(const allocator_type& a = allocator_type()) : 
+        my_allocator( a )
+    {
+    }
+
+    //! [begin,end) constructor
+    template<typename InputIterator>
+    concurrent_queue( InputIterator begin, InputIterator end, const allocator_type& a = allocator_type()) :
+        my_allocator( a )
+    {
+        for( ; begin != end; ++begin )
+            internal_push(&*begin);
+    }
+    
+    //! Copy constructor
+    concurrent_queue( const concurrent_queue& src, const allocator_type& a = allocator_type()) : 
+        internal::concurrent_queue_base_v3<T>(), my_allocator( a )
+    {
+        assign( src );
+    }
+    
+    //! Destroy queue
+    ~concurrent_queue();
+
+    //! Enqueue an item at tail of queue.
+    void push( const T& source ) {
+        internal_push( &source );
+    }
+
+    //! Attempt to dequeue an item from head of queue.
+    /** Does not wait for item to become available.
+        Returns true if successful; false otherwise. */
+    bool try_pop( T& result ) {
+        return internal_try_pop( &result );
+    }
+
+    //! Return the number of items in the queue; thread unsafe
+    size_type unsafe_size() const {return this->internal_size();}
+
+    //! Equivalent to size()==0.
+    bool empty() const {return this->internal_empty();}
+
+    //! Clear the queue. not thread-safe.
+    void clear() ;
+
+    //! Return allocator object
+    allocator_type get_allocator() const { return this->my_allocator; }
+
+    typedef internal::concurrent_queue_iterator<concurrent_queue,T> iterator;
+    typedef internal::concurrent_queue_iterator<concurrent_queue,const T> const_iterator;
+
+    //------------------------------------------------------------------------
+    // The iterators are intended only for debugging.  They are slow and not thread safe.
+    //------------------------------------------------------------------------
+    iterator unsafe_begin() {return iterator(*this);}
+    iterator unsafe_end() {return iterator();}
+    const_iterator unsafe_begin() const {return const_iterator(*this);}
+    const_iterator unsafe_end() const {return const_iterator();}
+} ;
+
+template<typename T, class A>
+concurrent_queue<T,A>::~concurrent_queue() {
+    clear();
+    this->internal_finish_clear();
+}
+
+template<typename T, class A>
+void concurrent_queue<T,A>::clear() {
+    while( !empty() ) {
+        T value;
+        this->internal_try_pop(&value);
+    }
+}
+
+} // namespace strict_ppl
+    
+//! A high-performance thread-safe blocking concurrent bounded queue.
+/** This is the pre-PPL TBB concurrent queue which supports boundedness and blocking semantics.
+    Note that method names agree with the PPL-style concurrent queue.
+    Multiple threads may each push and pop concurrently.
+    Assignment construction is not allowed.
+    @ingroup containers */
+template<typename T, class A = cache_aligned_allocator<T> >
+class concurrent_bounded_queue: public internal::concurrent_queue_base_v3 {
+    template<typename Container, typename Value> friend class internal::concurrent_queue_iterator;
+
+    //! Allocator type
+    typedef typename A::template rebind<char>::other page_allocator_type;
+    page_allocator_type my_allocator;
+
+    typedef typename concurrent_queue_base_v3::padded_page<T> padded_page;
+    //! Class used to ensure exception-safety of method "pop" 
+    class destroyer: internal::no_copy {
+        T& my_value;
+    public:
+        destroyer( T& value ) : my_value(value) {}
+        ~destroyer() {my_value.~T();}          
+    };
+
+    T& get_ref( page& p, size_t index ) {
+        __TBB_ASSERT( index<items_per_page, NULL );
+        return (&static_cast<padded_page*>(static_cast<void*>(&p))->last)[index];
+    }
+
+    /*override*/ virtual void copy_item( page& dst, size_t index, const void* src ) {
+        new( &get_ref(dst,index) ) T(*static_cast<const T*>(src)); 
+    }
+
+    /*override*/ virtual void copy_page_item( page& dst, size_t dindex, const page& src, size_t sindex ) {
+        new( &get_ref(dst,dindex) ) T( get_ref( const_cast<page&>(src), sindex ) );
+    }
+
+    /*override*/ virtual void assign_and_destroy_item( void* dst, page& src, size_t index ) {
+        T& from = get_ref(src,index);
+        destroyer d(from);
+        *static_cast<T*>(dst) = from;
+    }
+
+    /*overide*/ virtual page *allocate_page() {
+        size_t n = sizeof(padded_page) + (items_per_page-1)*sizeof(T);
+        page *p = reinterpret_cast<page*>(my_allocator.allocate( n ));
+        if( !p )
+            internal::throw_exception(internal::eid_bad_alloc); 
+        return p;
+    }
+
+    /*override*/ virtual void deallocate_page( page *p ) {
+        size_t n = sizeof(padded_page) + items_per_page*sizeof(T);
+        my_allocator.deallocate( reinterpret_cast<char*>(p), n );
+    }
+
+public:
+    //! Element type in the queue.
+    typedef T value_type;
+
+    //! Allocator type
+    typedef A allocator_type;
+
+    //! Reference type
+    typedef T& reference;
+
+    //! Const reference type
+    typedef const T& const_reference;
+
+    //! Integral type for representing size of the queue.
+    /** Notice that the size_type is a signed integral type.
+        This is because the size can be negative if there are pending pops without corresponding pushes. */
+    typedef std::ptrdiff_t size_type;
+
+    //! Difference type for iterator
+    typedef std::ptrdiff_t difference_type;
+
+    //! Construct empty queue
+    explicit concurrent_bounded_queue(const allocator_type& a = allocator_type()) : 
+        concurrent_queue_base_v3( sizeof(T) ), my_allocator( a )
+    {
+    }
+
+    //! Copy constructor
+    concurrent_bounded_queue( const concurrent_bounded_queue& src, const allocator_type& a = allocator_type()) : 
+        concurrent_queue_base_v3( sizeof(T) ), my_allocator( a )
+    {
+        assign( src );
+    }
+
+    //! [begin,end) constructor
+    template<typename InputIterator>
+    concurrent_bounded_queue( InputIterator begin, InputIterator end, const allocator_type& a = allocator_type()) :
+        concurrent_queue_base_v3( sizeof(T) ), my_allocator( a )
+    {
+        for( ; begin != end; ++begin )
+            internal_push_if_not_full(&*begin);
+    }
+
+    //! Destroy queue
+    ~concurrent_bounded_queue();
+
+    //! Enqueue an item at tail of queue.
+    void push( const T& source ) {
+        internal_push( &source );
+    }
+
+    //! Dequeue item from head of queue.
+    /** Block until an item becomes available, and then dequeue it. */
+    void pop( T& destination ) {
+        internal_pop( &destination );
+    }
+
+    //! Enqueue an item at tail of queue if queue is not already full.
+    /** Does not wait for queue to become not full.
+        Returns true if item is pushed; false if queue was already full. */
+    bool try_push( const T& source ) {
+        return internal_push_if_not_full( &source );
+    }
+
+    //! Attempt to dequeue an item from head of queue.
+    /** Does not wait for item to become available.
+        Returns true if successful; false otherwise. */
+    bool try_pop( T& destination ) {
+        return internal_pop_if_present( &destination );
+    }
+
+    //! Return number of pushes minus number of pops.
+    /** Note that the result can be negative if there are pops waiting for the 
+        corresponding pushes.  The result can also exceed capacity() if there 
+        are push operations in flight. */
+    size_type size() const {return internal_size();}
+
+    //! Equivalent to size()<=0.
+    bool empty() const {return internal_empty();}
+
+    //! Maximum number of allowed elements
+    size_type capacity() const {
+        return my_capacity;
+    }
+
+    //! Set the capacity
+    /** Setting the capacity to 0 causes subsequent try_push operations to always fail,
+        and subsequent push operations to block forever. */
+    void set_capacity( size_type new_capacity ) {
+        internal_set_capacity( new_capacity, sizeof(T) );
+    }
+
+    //! return allocator object
+    allocator_type get_allocator() const { return this->my_allocator; }
+
+    //! clear the queue. not thread-safe.
+    void clear() ;
+
+    typedef internal::concurrent_queue_iterator<concurrent_bounded_queue,T> iterator;
+    typedef internal::concurrent_queue_iterator<concurrent_bounded_queue,const T> const_iterator;
+
+    //------------------------------------------------------------------------
+    // The iterators are intended only for debugging.  They are slow and not thread safe.
+    //------------------------------------------------------------------------
+    iterator unsafe_begin() {return iterator(*this);}
+    iterator unsafe_end() {return iterator();}
+    const_iterator unsafe_begin() const {return const_iterator(*this);}
+    const_iterator unsafe_end() const {return const_iterator();}
+
+}; 
+
+template<typename T, class A>
+concurrent_bounded_queue<T,A>::~concurrent_bounded_queue() {
+    clear();
+    internal_finish_clear();
+}
+
+template<typename T, class A>
+void concurrent_bounded_queue<T,A>::clear() {
+    while( !empty() ) {
+        T value;
+        internal_pop_if_present(&value);
+    }
+}
+
+namespace deprecated {
+
+//! A high-performance thread-safe blocking concurrent bounded queue.
+/** This is the pre-PPL TBB concurrent queue which support boundedness and blocking semantics.
+    Note that method names agree with the PPL-style concurrent queue.
+    Multiple threads may each push and pop concurrently.
+    Assignment construction is not allowed.
+    @ingroup containers */
+template<typename T, class A = cache_aligned_allocator<T> > 
+class concurrent_queue: public concurrent_bounded_queue<T,A> {
+#if !__TBB_TEMPLATE_FRIENDS_BROKEN
+    template<typename Container, typename Value> friend class internal::concurrent_queue_iterator;
+#endif 
+
+public:
+    //! Construct empty queue
+    explicit concurrent_queue(const A& a = A()) : 
+        concurrent_bounded_queue<T,A>( a )
+    {
+    }
+
+    //! Copy constructor
+    concurrent_queue( const concurrent_queue& src, const A& a = A()) : 
+        concurrent_bounded_queue<T,A>( src, a )
+    {
+    }
+
+    //! [begin,end) constructor
+    template<typename InputIterator>
+    concurrent_queue( InputIterator b /*begin*/, InputIterator e /*end*/, const A& a = A()) :
+        concurrent_bounded_queue<T,A>( b, e, a )
+    {
+    }
+
+    //! Enqueue an item at tail of queue if queue is not already full.
+    /** Does not wait for queue to become not full.
+        Returns true if item is pushed; false if queue was already full. */
+    bool push_if_not_full( const T& source ) {
+        return try_push( source );
+    }
+
+    //! Attempt to dequeue an item from head of queue.
+    /** Does not wait for item to become available.
+        Returns true if successful; false otherwise. 
+        @deprecated Use try_pop()
+        */
+    bool pop_if_present( T& destination ) {
+        return try_pop( destination );
+    }
+
+    typedef typename concurrent_bounded_queue<T,A>::iterator iterator;
+    typedef typename concurrent_bounded_queue<T,A>::const_iterator const_iterator;
+    //
+    //------------------------------------------------------------------------
+    // The iterators are intended only for debugging.  They are slow and not thread safe.
+    //------------------------------------------------------------------------
+    iterator begin() {return this->unsafe_begin();}
+    iterator end() {return this->unsafe_end();}
+    const_iterator begin() const {return this->unsafe_begin();}
+    const_iterator end() const {return this->unsafe_end();}
+}; 
+
+}
+    
+
+#if TBB_DEPRECATED
+using deprecated::concurrent_queue;
+#else
+using strict_ppl::concurrent_queue;    
+#endif
+
+} // namespace tbb
+
+#endif /* __TBB_concurrent_queue_H */
diff --git a/tbb30_20100406oss/include/tbb/concurrent_unordered_map.h b/tbb30_20100406oss/include/tbb/concurrent_unordered_map.h
new file mode 100644 (file)
index 0000000..2521961
--- /dev/null
@@ -0,0 +1,241 @@
+/*
+    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+/* Container implementations in this header are based on PPL implementations
+   provided by Microsoft. */
+
+#ifndef __TBB_concurrent_unordered_map_H
+#define __TBB_concurrent_unordered_map_H
+
+#include "_concurrent_unordered_internal.h"
+
+namespace tbb
+{
+
+// Template class for hash compare
+template<typename Key>
+class tbb_hash
+{
+public:
+    tbb_hash() {}
+
+    size_t operator()(const Key& key) const
+    {
+        return tbb_hasher(key);
+    }
+};
+
+namespace interface5 {
+
+// Template class for hash map traits
+template<typename Key, typename T, typename Hash_compare, typename Allocator, bool Allow_multimapping>
+class concurrent_unordered_map_traits
+{
+protected:
+    typedef std::pair<const Key, T> value_type;
+    typedef Key key_type;
+    typedef Hash_compare hash_compare;
+    typedef typename Allocator::template rebind<value_type>::other allocator_type;
+    enum { allow_multimapping = Allow_multimapping };
+
+    concurrent_unordered_map_traits() : my_hash_compare() {}
+    concurrent_unordered_map_traits(const hash_compare& hc) : my_hash_compare(hc) {}
+
+    class value_compare : public std::binary_function<value_type, value_type, bool>
+    {
+        friend class concurrent_unordered_map_traits<Key, T, Hash_compare, Allocator, Allow_multimapping>;
+
+    public:
+        bool operator()(const value_type& left, const value_type& right) const
+        {
+            return (my_hash_compare(left.first, right.first));
+        }
+
+        value_compare(const hash_compare& comparator) : my_hash_compare(comparator) {}
+
+    protected:
+        hash_compare my_hash_compare;    // the comparator predicate for keys
+    };
+
+    template<class Type1, class Type2>
+    static const Key& get_key(const std::pair<Type1, Type2>& value) {
+        return (value.first);
+    }
+
+    hash_compare my_hash_compare; // the comparator predicate for keys
+};
+
+template <typename Key, typename T, typename Hasher = tbb_hash<Key>, typename Key_equality = std::equal_to<Key>, typename Allocator = tbb::tbb_allocator<std::pair<const Key, T> > >
+class concurrent_unordered_map : public internal::concurrent_unordered_base< concurrent_unordered_map_traits<Key, T, internal::hash_compare<Key, Hasher, Key_equality>, Allocator, false> >
+{
+    // Base type definitions
+    typedef internal::hash_compare<Key, Hasher, Key_equality> hash_compare;
+    typedef internal::concurrent_unordered_base< concurrent_unordered_map_traits<Key, T, hash_compare, Allocator, false> > base_type;
+    typedef concurrent_unordered_map_traits<Key, T, internal::hash_compare<Key, Hasher, Key_equality>, Allocator, false> traits_type;
+    using traits_type::my_hash_compare;
+#if __TBB_EXTRA_DEBUG
+public:
+#endif
+    using traits_type::allow_multimapping;
+public:
+    using base_type::end;
+    using base_type::find;
+    using base_type::insert;
+
+    // Type definitions
+    typedef Key key_type;
+    typedef typename base_type::value_type value_type;
+    typedef T mapped_type;
+    typedef Hasher hasher;
+    typedef Key_equality key_equal;
+    typedef hash_compare key_compare;
+
+    typedef typename base_type::allocator_type allocator_type;
+    typedef typename base_type::pointer pointer;
+    typedef typename base_type::const_pointer const_pointer;
+    typedef typename base_type::reference reference;
+    typedef typename base_type::const_reference const_reference;
+
+    typedef typename base_type::size_type size_type;
+    typedef typename base_type::difference_type difference_type;
+
+    typedef typename base_type::iterator iterator;
+    typedef typename base_type::const_iterator const_iterator;
+    typedef typename base_type::iterator local_iterator;
+    typedef typename base_type::const_iterator const_local_iterator;
+
+    // Construction/destruction/copying
+    explicit concurrent_unordered_map(size_type n_of_buckets = 8, const hasher& a_hasher = hasher(),
+        const key_equal& a_keyeq = key_equal(), const allocator_type& a = allocator_type())
+        : base_type(n_of_buckets, key_compare(a_hasher, a_keyeq), a)
+    {
+    }
+
+    concurrent_unordered_map(const Allocator& a) : base_type(8, key_compare(), a)
+    {
+    }
+
+    template <typename Iterator>
+    concurrent_unordered_map(Iterator first, Iterator last, size_type n_of_buckets = 8, const hasher& a_hasher = hasher(),
+        const key_equal& a_keyeq = key_equal(), const allocator_type& a = allocator_type())
+        : base_type(n_of_buckets, key_compare(a_hasher, a_keyeq), a)
+    {
+        for (; first != last; ++first)
+            base_type::insert(*first);
+    }
+
+    concurrent_unordered_map(const concurrent_unordered_map& table) : base_type(table)
+    {
+    }
+
+    concurrent_unordered_map(const concurrent_unordered_map& table, const Allocator& a)
+        : base_type(table, a)
+    {
+    }
+
+    concurrent_unordered_map& operator=(const concurrent_unordered_map& table)
+    {
+        base_type::operator=(table);
+        return (*this);
+    }
+
+    iterator unsafe_erase(const_iterator where)
+    {
+        return base_type::unsafe_erase(where);
+    }
+
+    size_type unsafe_erase(const key_type& key)
+    {
+        return base_type::unsafe_erase(key);
+    }
+
+    iterator unsafe_erase(const_iterator first, const_iterator last)
+    {
+        return base_type::unsafe_erase(first, last);
+    }
+
+    void swap(concurrent_unordered_map& table)
+    {
+        base_type::swap(table);
+    }
+
+    // Observers
+    hasher hash_function() const
+    {
+        return my_hash_compare.my_hash_object;
+    }
+
+    key_equal key_eq() const
+    {
+        return my_hash_compare.my_key_compare_object;
+    }
+
+    mapped_type& operator[](const key_type& key)
+    {
+        iterator where = find(key);
+
+        if (where == end())
+        {
+            where = insert(std::pair<key_type, mapped_type>(key, mapped_type())).first;
+        }
+
+        return ((*where).second);
+    }
+
+    mapped_type& at(const key_type& key)
+    {
+        iterator where = find(key);
+
+        if (where == end())
+        {
+            tbb::internal::throw_exception(tbb::internal::eid_invalid_key);
+        }
+
+        return ((*where).second);
+    }
+
+    const mapped_type& at(const key_type& key) const
+    {
+        const_iterator where = find(key);
+
+        if (where == end())
+        {
+            tbb::internal::throw_exception(tbb::internal::eid_invalid_key);
+        }
+
+        return ((*where).second);
+    }
+};
+
+} // namespace interface5
+
+using interface5::concurrent_unordered_map;
+
+} // namespace tbb
+
+#endif// __TBB_concurrent_unordered_map_H
diff --git a/tbb30_20100406oss/include/tbb/concurrent_vector.h b/tbb30_20100406oss/include/tbb/concurrent_vector.h
new file mode 100644 (file)
index 0000000..8106eb4
--- /dev/null
@@ -0,0 +1,1060 @@
+/*
+    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB_concurrent_vector_H
+#define __TBB_concurrent_vector_H
+
+#include "tbb_stddef.h"
+#include "tbb_exception.h"
+#include "atomic.h"
+#include "cache_aligned_allocator.h"
+#include "blocked_range.h"
+#include "tbb_machine.h"
+#include <new>
+
+#if !TBB_USE_EXCEPTIONS && _MSC_VER
+    // Suppress "C++ exception handler used, but unwind semantics are not enabled" warning in STL headers
+    #pragma warning (push)
+    #pragma warning (disable: 4530)
+#endif
+
+#include <algorithm>
+#include <iterator>
+
+#if !TBB_USE_EXCEPTIONS && _MSC_VER
+    #pragma warning (pop)
+#endif
+
+#if _MSC_VER==1500 && !__INTEL_COMPILER
+    // VS2008/VC9 seems to have an issue; limits pull in math.h
+    #pragma warning( push )
+    #pragma warning( disable: 4985 )
+#endif
+#include <limits> /* std::numeric_limits */
+#if _MSC_VER==1500 && !__INTEL_COMPILER
+    #pragma warning( pop )
+#endif
+
+#if defined(_MSC_VER) && !defined(__INTEL_COMPILER) && defined(_Wp64)
+    // Workaround for overzealous compiler warnings in /Wp64 mode
+    #pragma warning (push)
+    #pragma warning (disable: 4267)
+#endif
+
+namespace tbb {
+
+template<typename T, class A = cache_aligned_allocator<T> >
+class concurrent_vector;
+
+//! @cond INTERNAL
+namespace internal {
+
+    //! Bad allocation marker
+    static void *const vector_allocation_error_flag = reinterpret_cast<void*>(size_t(63));
+
+    //! Routine that loads pointer from location pointed to by src without any fence, without causing ITT to report a race.
+    void* __TBB_EXPORTED_FUNC itt_load_pointer_v3( const void* src );
+
+    //! Base class of concurrent vector implementation.
+    /** @ingroup containers */
+    class concurrent_vector_base_v3 {
+    protected:
+
+        // Basic types declarations
+        typedef size_t segment_index_t;
+        typedef size_t size_type;
+
+        // Using enumerations due to Mac linking problems of static const variables
+        enum {
+            // Size constants
+            default_initial_segments = 1, // 2 initial items
+            //! Number of slots for segment's pointers inside the class
+            pointers_per_short_table = 3, // to fit into 8 words of entire structure
+            pointers_per_long_table = sizeof(segment_index_t) * 8 // one segment per bit
+        };
+
+        // Segment pointer. Can be zero-initialized
+        struct segment_t {
+            void* array;
+#if TBB_USE_ASSERT
+            ~segment_t() {
+                __TBB_ASSERT( array <= internal::vector_allocation_error_flag, "should have been freed by clear" );
+            }
+#endif /* TBB_USE_ASSERT */
+        };
+        // Data fields
+
+        //! allocator function pointer
+        void* (*vector_allocator_ptr)(concurrent_vector_base_v3 &, size_t);
+
+        //! count of segments in the first block
+        atomic<size_type> my_first_block;
+
+        //! Requested size of vector
+        atomic<size_type> my_early_size;
+
+        //! Pointer to the segments table
+        atomic<segment_t*> my_segment;
+
+        //! embedded storage of segment pointers
+        segment_t my_storage[pointers_per_short_table];
+
+        // Methods
+
+        concurrent_vector_base_v3() {
+            my_early_size = 0;
+            my_first_block = 0; // here is not default_initial_segments
+            for( segment_index_t i = 0; i < pointers_per_short_table; i++)
+                my_storage[i].array = NULL;
+            my_segment = my_storage;
+        }
+        __TBB_EXPORTED_METHOD ~concurrent_vector_base_v3();
+
+        static segment_index_t segment_index_of( size_type index ) {
+            return segment_index_t( __TBB_Log2( index|1 ) );
+        }
+
+        static segment_index_t segment_base( segment_index_t k ) {
+            return (segment_index_t(1)<<k & ~segment_index_t(1));
+        }
+
+        static inline segment_index_t segment_base_index_of( segment_index_t &index ) {
+            segment_index_t k = segment_index_of( index );
+            index -= segment_base(k);
+            return k;
+        }
+
+        static size_type segment_size( segment_index_t k ) {
+            return segment_index_t(1)<<k; // fake value for k==0
+        }
+
+        //! An operation on an n-element array starting at begin.
+        typedef void (__TBB_EXPORTED_FUNC *internal_array_op1)(void* begin, size_type n );
+
+        //! An operation on n-element destination array and n-element source array.
+        typedef void (__TBB_EXPORTED_FUNC *internal_array_op2)(void* dst, const void* src, size_type n );
+
+        //! Internal structure for compact()
+        struct internal_segments_table {
+            segment_index_t first_block;
+            void* table[pointers_per_long_table];
+        };
+
+        void __TBB_EXPORTED_METHOD internal_reserve( size_type n, size_type element_size, size_type max_size );
+        size_type __TBB_EXPORTED_METHOD internal_capacity() const;
+        void internal_grow( size_type start, size_type finish, size_type element_size, internal_array_op2 init, const void *src );
+        size_type __TBB_EXPORTED_METHOD internal_grow_by( size_type delta, size_type element_size, internal_array_op2 init, const void *src );
+        void* __TBB_EXPORTED_METHOD internal_push_back( size_type element_size, size_type& index );
+        segment_index_t __TBB_EXPORTED_METHOD internal_clear( internal_array_op1 destroy );
+        void* __TBB_EXPORTED_METHOD internal_compact( size_type element_size, void *table, internal_array_op1 destroy, internal_array_op2 copy );
+        void __TBB_EXPORTED_METHOD internal_copy( const concurrent_vector_base_v3& src, size_type element_size, internal_array_op2 copy );
+        void __TBB_EXPORTED_METHOD internal_assign( const concurrent_vector_base_v3& src, size_type element_size,
+                              internal_array_op1 destroy, internal_array_op2 assign, internal_array_op2 copy );
+        //! Obsolete
+        void __TBB_EXPORTED_METHOD internal_throw_exception(size_type) const;
+        void __TBB_EXPORTED_METHOD internal_swap(concurrent_vector_base_v3& v);
+
+        void __TBB_EXPORTED_METHOD internal_resize( size_type n, size_type element_size, size_type max_size, const void *src,
+                                                    internal_array_op1 destroy, internal_array_op2 init );
+        size_type __TBB_EXPORTED_METHOD internal_grow_to_at_least_with_result( size_type new_size, size_type element_size, internal_array_op2 init, const void *src );
+
+        //! Deprecated entry point for backwards compatibility to TBB 2.1.
+        void __TBB_EXPORTED_METHOD internal_grow_to_at_least( size_type new_size, size_type element_size, internal_array_op2 init, const void *src );
+private:
+        //! Private functionality
+        class helper;
+        friend class helper;
+    };
+    
+    typedef concurrent_vector_base_v3 concurrent_vector_base;
+
+    //! Meets requirements of a forward iterator for STL and a Value for a blocked_range.*/
+    /** Value is either the T or const T type of the container.
+        @ingroup containers */
+    template<typename Container, typename Value>
+    class vector_iterator 
+    {
+        //! concurrent_vector over which we are iterating.
+        Container* my_vector;
+
+        //! Index into the vector 
+        size_t my_index;
+
+        //! Caches my_vector-&gt;internal_subscript(my_index)
+        /** NULL if cached value is not available */
+        mutable Value* my_item;
+
+        template<typename C, typename T>
+        friend vector_iterator<C,T> operator+( ptrdiff_t offset, const vector_iterator<C,T>& v );
+
+        template<typename C, typename T, typename U>
+        friend bool operator==( const vector_iterator<C,T>& i, const vector_iterator<C,U>& j );
+
+        template<typename C, typename T, typename U>
+        friend bool operator<( const vector_iterator<C,T>& i, const vector_iterator<C,U>& j );
+
+        template<typename C, typename T, typename U>
+        friend ptrdiff_t operator-( const vector_iterator<C,T>& i, const vector_iterator<C,U>& j );
+    
+        template<typename C, typename U>
+        friend class internal::vector_iterator;
+
+#if !defined(_MSC_VER) || defined(__INTEL_COMPILER)
+        template<typename T, class A>
+        friend class tbb::concurrent_vector;
+#else
+public: // workaround for MSVC
+#endif 
+
+        vector_iterator( const Container& vector, size_t index, void *ptr = 0 ) : 
+            my_vector(const_cast<Container*>(&vector)), 
+            my_index(index), 
+            my_item(static_cast<Value*>(ptr))
+        {}
+
+    public:
+        //! Default constructor
+        vector_iterator() : my_vector(NULL), my_index(~size_t(0)), my_item(NULL) {}
+
+        vector_iterator( const vector_iterator<Container,typename Container::value_type>& other ) :
+            my_vector(other.my_vector),
+            my_index(other.my_index),
+            my_item(other.my_item)
+        {}
+
+        vector_iterator operator+( ptrdiff_t offset ) const {
+            return vector_iterator( *my_vector, my_index+offset );
+        }
+        vector_iterator &operator+=( ptrdiff_t offset ) {
+            my_index+=offset;
+            my_item = NULL;
+            return *this;
+        }
+        vector_iterator operator-( ptrdiff_t offset ) const {
+            return vector_iterator( *my_vector, my_index-offset );
+        }
+        vector_iterator &operator-=( ptrdiff_t offset ) {
+            my_index-=offset;
+            my_item = NULL;
+            return *this;
+        }
+        Value& operator*() const {
+            Value* item = my_item;
+            if( !item ) {
+                item = my_item = &my_vector->internal_subscript(my_index);
+            }
+            __TBB_ASSERT( item==&my_vector->internal_subscript(my_index), "corrupt cache" );
+            return *item;
+        }
+        Value& operator[]( ptrdiff_t k ) const {
+            return my_vector->internal_subscript(my_index+k);
+        }
+        Value* operator->() const {return &operator*();}
+
+        //! Pre increment
+        vector_iterator& operator++() {
+            size_t k = ++my_index;
+            if( my_item ) {
+                // Following test uses 2's-complement wizardry
+                if( (k& (k-2))==0 ) {
+                    // k is a power of two that is at least k-2
+                    my_item= NULL;
+                } else {
+                    ++my_item;
+                }
+            }
+            return *this;
+        }
+
+        //! Pre decrement
+        vector_iterator& operator--() {
+            __TBB_ASSERT( my_index>0, "operator--() applied to iterator already at beginning of concurrent_vector" ); 
+            size_t k = my_index--;
+            if( my_item ) {
+                // Following test uses 2's-complement wizardry
+                if( (k& (k-2))==0 ) {
+                    // k is a power of two that is at least k-2  
+                    my_item= NULL;
+                } else {
+                    --my_item;
+                }
+            }
+            return *this;
+        }
+
+        //! Post increment
+        vector_iterator operator++(int) {
+            vector_iterator result = *this;
+            operator++();
+            return result;
+        }
+
+        //! Post decrement
+        vector_iterator operator--(int) {
+            vector_iterator result = *this;
+            operator--();
+            return result;
+        }
+
+        // STL support
+
+        typedef ptrdiff_t difference_type;
+        typedef Value value_type;
+        typedef Value* pointer;
+        typedef Value& reference;
+        typedef std::random_access_iterator_tag iterator_category;
+    };
+
+    template<typename Container, typename T>
+    vector_iterator<Container,T> operator+( ptrdiff_t offset, const vector_iterator<Container,T>& v ) {
+        return vector_iterator<Container,T>( *v.my_vector, v.my_index+offset );
+    }
+
+    template<typename Container, typename T, typename U>
+    bool operator==( const vector_iterator<Container,T>& i, const vector_iterator<Container,U>& j ) {
+        return i.my_index==j.my_index && i.my_vector == j.my_vector;
+    }
+
+    template<typename Container, typename T, typename U>
+    bool operator!=( const vector_iterator<Container,T>& i, const vector_iterator<Container,U>& j ) {
+        return !(i==j);
+    }
+
+    template<typename Container, typename T, typename U>
+    bool operator<( const vector_iterator<Container,T>& i, const vector_iterator<Container,U>& j ) {
+        return i.my_index<j.my_index;
+    }
+
+    template<typename Container, typename T, typename U>
+    bool operator>( const vector_iterator<Container,T>& i, const vector_iterator<Container,U>& j ) {
+        return j<i;
+    }
+
+    template<typename Container, typename T, typename U>
+    bool operator>=( const vector_iterator<Container,T>& i, const vector_iterator<Container,U>& j ) {
+        return !(i<j);
+    }
+
+    template<typename Container, typename T, typename U>
+    bool operator<=( const vector_iterator<Container,T>& i, const vector_iterator<Container,U>& j ) {
+        return !(j<i);
+    }
+
+    template<typename Container, typename T, typename U>
+    ptrdiff_t operator-( const vector_iterator<Container,T>& i, const vector_iterator<Container,U>& j ) {
+        return ptrdiff_t(i.my_index)-ptrdiff_t(j.my_index);
+    }
+
+    template<typename T, class A>
+    class allocator_base {
+    public:
+        typedef typename A::template
+            rebind<T>::other allocator_type;
+        allocator_type my_allocator;
+
+        allocator_base(const allocator_type &a = allocator_type() ) : my_allocator(a) {}
+    };
+
+} // namespace internal
+//! @endcond
+
+//! Concurrent vector container
+/** concurrent_vector is a container having the following main properties:
+    - It provides random indexed access to its elements. The index of the first element is 0.
+    - It ensures safe concurrent growing its size (different threads can safely append new elements).
+    - Adding new elements does not invalidate existing iterators and does not change indices of existing items.
+
+@par Compatibility
+    The class meets all Container Requirements and Reversible Container Requirements from
+    C++ Standard (See ISO/IEC 14882:2003(E), clause 23.1). But it doesn't meet
+    Sequence Requirements due to absence of insert() and erase() methods.
+
+@par Exception Safety
+    Methods working with memory allocation and/or new elements construction can throw an
+    exception if allocator fails to allocate memory or element's default constructor throws one.
+    Concurrent vector's element of type T must conform to the following requirements:
+    - Throwing an exception is forbidden for destructor of T.
+    - Default constructor of T must not throw an exception OR its non-virtual destructor must safely work when its object memory is zero-initialized.
+    .
+    Otherwise, the program's behavior is undefined.
+@par
+    If an exception happens inside growth or assignment operation, an instance of the vector becomes invalid unless it is stated otherwise in the method documentation.
+    Invalid state means:
+    - There are no guaranties that all items were initialized by a constructor. The rest of items is zero-filled, including item where exception happens.
+    - An invalid vector instance cannot be repaired; it is unable to grow anymore.
+    - Size and capacity reported by the vector are incorrect, and calculated as if the failed operation were successful.
+    - Attempt to access not allocated elements using operator[] or iterators results in access violation or segmentation fault exception, and in case of using at() method a C++ exception is thrown.
+    .
+    If a concurrent grow operation successfully completes, all the elements it has added to the vector will remain valid and accessible even if one of subsequent grow operations fails.
+
+@par Fragmentation
+    Unlike an STL vector, a concurrent_vector does not move existing elements if it needs
+    to allocate more memory. The container is divided into a series of contiguous arrays of
+    elements. The first reservation, growth, or assignment operation determines the size of
+    the first array. Using small number of elements as initial size incurs fragmentation that
+    may increase element access time. Internal layout can be optimized by method compact() that
+    merges several smaller arrays into one solid.
+
+@par Changes since TBB 2.1
+    - Fixed guarantees of concurrent_vector::size() and grow_to_at_least() methods to assure elements are allocated.
+    - Methods end()/rbegin()/back() are partly thread-safe since they use size() to get the end of vector
+    - Added resize() methods (not thread-safe)
+    - Added cbegin/cend/crbegin/crend methods
+    - Changed return type of methods grow* and push_back to iterator
+
+@par Changes since TBB 2.0
+    - Implemented exception-safety guaranties
+    - Added template argument for allocator
+    - Added allocator argument in constructors
+    - Faster index calculation
+    - First growth call specifies a number of segments to be merged in the first allocation.
+    - Fixed memory blow up for swarm of vector's instances of small size
+    - Added grow_by(size_type n, const_reference t) growth using copying constructor to init new items. 
+    - Added STL-like constructors.
+    - Added operators ==, < and derivatives
+    - Added at() method, approved for using after an exception was thrown inside the vector
+    - Added get_allocator() method.
+    - Added assign() methods
+    - Added compact() method to defragment first segments
+    - Added swap() method
+    - range() defaults on grainsize = 1 supporting auto grainsize algorithms. 
+
+    @ingroup containers */
+template<typename T, class A>
+class concurrent_vector: protected internal::allocator_base<T, A>,
+                         private internal::concurrent_vector_base {
+private:
+    template<typename I>
+    class generic_range_type: public blocked_range<I> {
+    public:
+        typedef T value_type;
+        typedef T& reference;
+        typedef const T& const_reference;
+        typedef I iterator;
+        typedef ptrdiff_t difference_type;
+        generic_range_type( I begin_, I end_, size_t grainsize_ = 1) : blocked_range<I>(begin_,end_,grainsize_) {} 
+        template<typename U>
+        generic_range_type( const generic_range_type<U>& r) : blocked_range<I>(r.begin(),r.end(),r.grainsize()) {} 
+        generic_range_type( generic_range_type& r, split ) : blocked_range<I>(r,split()) {}
+    };
+
+    template<typename C, typename U>
+    friend class internal::vector_iterator;
+public:
+    //------------------------------------------------------------------------
+    // STL compatible types
+    //------------------------------------------------------------------------
+    typedef internal::concurrent_vector_base_v3::size_type size_type;
+    typedef typename internal::allocator_base<T, A>::allocator_type allocator_type;
+
+    typedef T value_type;
+    typedef ptrdiff_t difference_type;
+    typedef T& reference;
+    typedef const T& const_reference;
+    typedef T *pointer;
+    typedef const T *const_pointer;
+
+    typedef internal::vector_iterator<concurrent_vector,T> iterator;
+    typedef internal::vector_iterator<concurrent_vector,const T> const_iterator;
+
+#if !defined(_MSC_VER) || _CPPLIB_VER>=300 
+    // Assume ISO standard definition of std::reverse_iterator
+    typedef std::reverse_iterator<iterator> reverse_iterator;
+    typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
+#else
+    // Use non-standard std::reverse_iterator
+    typedef std::reverse_iterator<iterator,T,T&,T*> reverse_iterator;
+    typedef std::reverse_iterator<const_iterator,T,const T&,const T*> const_reverse_iterator;
+#endif /* defined(_MSC_VER) && (_MSC_VER<1300) */
+
+    //------------------------------------------------------------------------
+    // Parallel algorithm support
+    //------------------------------------------------------------------------
+    typedef generic_range_type<iterator> range_type;
+    typedef generic_range_type<const_iterator> const_range_type;
+
+    //------------------------------------------------------------------------
+    // STL compatible constructors & destructors
+    //------------------------------------------------------------------------
+
+    //! Construct empty vector.
+    explicit concurrent_vector(const allocator_type &a = allocator_type())
+        : internal::allocator_base<T, A>(a), internal::concurrent_vector_base()
+    {
+        vector_allocator_ptr = &internal_allocator;
+    }
+
+    //! Copying constructor
+    concurrent_vector( const concurrent_vector& vector, const allocator_type& a = allocator_type() )
+        : internal::allocator_base<T, A>(a), internal::concurrent_vector_base()
+    {
+        vector_allocator_ptr = &internal_allocator;
+        __TBB_TRY {
+            internal_copy(vector, sizeof(T), &copy_array);
+        } __TBB_CATCH(...) {
+            segment_t *table = my_segment;
+            internal_free_segments( reinterpret_cast<void**>(table), internal_clear(&destroy_array), my_first_block );
+            __TBB_RETHROW();
+        }
+    }
+
+    //! Copying constructor for vector with different allocator type
+    template<class M>
+    concurrent_vector( const concurrent_vector<T, M>& vector, const allocator_type& a = allocator_type() )
+        : internal::allocator_base<T, A>(a), internal::concurrent_vector_base()
+    {
+        vector_allocator_ptr = &internal_allocator;
+        __TBB_TRY {
+            internal_copy(vector.internal_vector_base(), sizeof(T), &copy_array);
+        } __TBB_CATCH(...) {
+            segment_t *table = my_segment;
+            internal_free_segments( reinterpret_cast<void**>(table), internal_clear(&destroy_array), my_first_block );
+            __TBB_RETHROW();
+        }
+    }
+
+    //! Construction with initial size specified by argument n
+    explicit concurrent_vector(size_type n)
+    {
+        vector_allocator_ptr = &internal_allocator;
+        __TBB_TRY {
+            internal_resize( n, sizeof(T), max_size(), NULL, &destroy_array, &initialize_array );
+        } __TBB_CATCH(...) {
+            segment_t *table = my_segment;
+            internal_free_segments( reinterpret_cast<void**>(table), internal_clear(&destroy_array), my_first_block );
+            __TBB_RETHROW();
+        }
+    }
+
+    //! Construction with initial size specified by argument n, initialization by copying of t, and given allocator instance
+    concurrent_vector(size_type n, const_reference t, const allocator_type& a = allocator_type())
+        : internal::allocator_base<T, A>(a)
+    {
+        vector_allocator_ptr = &internal_allocator;
+        __TBB_TRY {
+            internal_resize( n, sizeof(T), max_size(), static_cast<const void*>(&t), &destroy_array, &initialize_array_by );
+        } __TBB_CATCH(...) {
+            segment_t *table = my_segment;
+            internal_free_segments( reinterpret_cast<void**>(table), internal_clear(&destroy_array), my_first_block );
+            __TBB_RETHROW();
+        }
+    }
+
+    //! Construction with copying iteration range and given allocator instance
+    template<class I>
+    concurrent_vector(I first, I last, const allocator_type &a = allocator_type())
+        : internal::allocator_base<T, A>(a)
+    {
+        vector_allocator_ptr = &internal_allocator;
+        __TBB_TRY {
+            internal_assign_range(first, last, static_cast<is_integer_tag<std::numeric_limits<I>::is_integer> *>(0) );
+        } __TBB_CATCH(...) {
+            segment_t *table = my_segment;
+            internal_free_segments( reinterpret_cast<void**>(table), internal_clear(&destroy_array), my_first_block );
+            __TBB_RETHROW();
+        }
+    }
+
+    //! Assignment
+    concurrent_vector& operator=( const concurrent_vector& vector ) {
+        if( this != &vector )
+            internal_assign(vector, sizeof(T), &destroy_array, &assign_array, &copy_array);
+        return *this;
+    }
+
+    //! Assignment for vector with different allocator type
+    template<class M>
+    concurrent_vector& operator=( const concurrent_vector<T, M>& vector ) {
+        if( static_cast<void*>( this ) != static_cast<const void*>( &vector ) )
+            internal_assign(vector.internal_vector_base(),
+                sizeof(T), &destroy_array, &assign_array, &copy_array);
+        return *this;
+    }
+
+    //------------------------------------------------------------------------
+    // Concurrent operations
+    //------------------------------------------------------------------------
+    //! Grow by "delta" elements.
+#if TBB_DEPRECATED
+    /** Returns old size. */
+    size_type grow_by( size_type delta ) {
+        return delta ? internal_grow_by( delta, sizeof(T), &initialize_array, NULL ) : my_early_size;
+    }
+#else
+    /** Returns iterator pointing to the first new element. */
+    iterator grow_by( size_type delta ) {
+        return iterator(*this, delta ? internal_grow_by( delta, sizeof(T), &initialize_array, NULL ) : my_early_size);
+    }
+#endif
+
+    //! Grow by "delta" elements using copying constuctor.
+#if TBB_DEPRECATED
+    /** Returns old size. */
+    size_type grow_by( size_type delta, const_reference t ) {
+        return delta ? internal_grow_by( delta, sizeof(T), &initialize_array_by, static_cast<const void*>(&t) ) : my_early_size;
+    }
+#else
+    /** Returns iterator pointing to the first new element. */
+    iterator grow_by( size_type delta, const_reference t ) {
+        return iterator(*this, delta ? internal_grow_by( delta, sizeof(T), &initialize_array_by, static_cast<const void*>(&t) ) : my_early_size);
+    }
+#endif
+
+    //! Append minimal sequence of elements such that size()>=n.  
+#if TBB_DEPRECATED
+    /** The new elements are default constructed.  Blocks until all elements in range [0..n) are allocated.
+        May return while other elements are being constructed by other threads. */
+    void grow_to_at_least( size_type n ) {
+        if( n ) internal_grow_to_at_least_with_result( n, sizeof(T), &initialize_array, NULL );
+    };
+#else
+    /** The new elements are default constructed.  Blocks until all elements in range [0..n) are allocated.
+        May return while other elements are being constructed by other threads.
+        Returns iterator that points to beginning of appended sequence.
+        If no elements were appended, returns iterator pointing to nth element. */
+    iterator grow_to_at_least( size_type n ) {
+        size_type m=0;
+        if( n ) {
+            m = internal_grow_to_at_least_with_result( n, sizeof(T), &initialize_array, NULL );
+            if( m>n ) m=n;
+        }
+        return iterator(*this, m);
+    };
+#endif
+
+    //! Push item 
+#if TBB_DEPRECATED
+    size_type push_back( const_reference item )
+#else
+    /** Returns iterator pointing to the new element. */
+    iterator push_back( const_reference item )
+#endif
+    {
+        size_type k;
+        void *ptr = internal_push_back(sizeof(T),k);
+        internal_loop_guide loop(1, ptr);
+        loop.init(&item);
+#if TBB_DEPRECATED
+        return k;
+#else
+        return iterator(*this, k, ptr);
+#endif
+    }
+
+    //! Get reference to element at given index.
+    /** This method is thread-safe for concurrent reads, and also while growing the vector,
+        as long as the calling thread has checked that index&lt;size(). */
+    reference operator[]( size_type index ) {
+        return internal_subscript(index);
+    }
+
+    //! Get const reference to element at given index.
+    const_reference operator[]( size_type index ) const {
+        return internal_subscript(index);
+    }
+
+    //! Get reference to element at given index. Throws exceptions on errors.
+    reference at( size_type index ) {
+        return internal_subscript_with_exceptions(index);
+    }
+
+    //! Get const reference to element at given index. Throws exceptions on errors.
+    const_reference at( size_type index ) const {
+        return internal_subscript_with_exceptions(index);
+    }
+
+    //! Get range for iterating with parallel algorithms
+    range_type range( size_t grainsize = 1) {
+        return range_type( begin(), end(), grainsize );
+    }
+
+    //! Get const range for iterating with parallel algorithms
+    const_range_type range( size_t grainsize = 1 ) const {
+        return const_range_type( begin(), end(), grainsize );
+    }
+    //------------------------------------------------------------------------
+    // Capacity
+    //------------------------------------------------------------------------
+    //! Return size of vector. It may include elements under construction
+    size_type size() const {
+        size_type sz = my_early_size, cp = internal_capacity();
+        return cp < sz ? cp : sz;
+    }
+
+    //! Return true if vector is not empty or has elements under construction at least.
+    bool empty() const {return !my_early_size;}
+
+    //! Maximum size to which array can grow without allocating more memory. Concurrent allocations are not included in the value.
+    size_type capacity() const {return internal_capacity();}
+
+    //! Allocate enough space to grow to size n without having to allocate more memory later.
+    /** Like most of the methods provided for STL compatibility, this method is *not* thread safe. 
+        The capacity afterwards may be bigger than the requested reservation. */
+    void reserve( size_type n ) {
+        if( n )
+            internal_reserve(n, sizeof(T), max_size());
+    }
+
+    //! Resize the vector. Not thread-safe.
+    void resize( size_type n ) {
+        internal_resize( n, sizeof(T), max_size(), NULL, &destroy_array, &initialize_array );
+    }
+    
+    //! Resize the vector, copy t for new elements. Not thread-safe.
+    void resize( size_type n, const_reference t ) {
+        internal_resize( n, sizeof(T), max_size(), static_cast<const void*>(&t), &destroy_array, &initialize_array_by );
+    }
+   
+#if TBB_DEPRECATED 
+    //! An alias for shrink_to_fit()
+    void compact() {shrink_to_fit();}
+#endif /* TBB_DEPRECATED */
+
+    //! Optimize memory usage and fragmentation.
+    void shrink_to_fit();
+
+    //! Upper bound on argument to reserve.
+    size_type max_size() const {return (~size_type(0))/sizeof(T);}
+
+    //------------------------------------------------------------------------
+    // STL support
+    //------------------------------------------------------------------------
+
+    //! start iterator
+    iterator begin() {return iterator(*this,0);}
+    //! end iterator
+    iterator end() {return iterator(*this,size());}
+    //! start const iterator
+    const_iterator begin() const {return const_iterator(*this,0);}
+    //! end const iterator
+    const_iterator end() const {return const_iterator(*this,size());}
+    //! start const iterator
+    const_iterator cbegin() const {return const_iterator(*this,0);}
+    //! end const iterator
+    const_iterator cend() const {return const_iterator(*this,size());}
+    //! reverse start iterator
+    reverse_iterator rbegin() {return reverse_iterator(end());}
+    //! reverse end iterator
+    reverse_iterator rend() {return reverse_iterator(begin());}
+    //! reverse start const iterator
+    const_reverse_iterator rbegin() const {return const_reverse_iterator(end());}
+    //! reverse end const iterator
+    const_reverse_iterator rend() const {return const_reverse_iterator(begin());}
+    //! reverse start const iterator
+    const_reverse_iterator crbegin() const {return const_reverse_iterator(end());}
+    //! reverse end const iterator
+    const_reverse_iterator crend() const {return const_reverse_iterator(begin());}
+    //! the first item
+    reference front() {
+        __TBB_ASSERT( size()>0, NULL);
+        return static_cast<T*>(my_segment[0].array)[0];
+    }
+    //! the first item const
+    const_reference front() const {
+        __TBB_ASSERT( size()>0, NULL);
+        return static_cast<const T*>(my_segment[0].array)[0];
+    }
+    //! the last item
+    reference back() {
+        __TBB_ASSERT( size()>0, NULL);
+        return internal_subscript( size()-1 );
+    }
+    //! the last item const
+    const_reference back() const {
+        __TBB_ASSERT( size()>0, NULL);
+        return internal_subscript( size()-1 );
+    }
+    //! return allocator object
+    allocator_type get_allocator() const { return this->my_allocator; }
+
+    //! assign n items by copying t item
+    void assign(size_type n, const_reference t) {
+        clear();
+        internal_resize( n, sizeof(T), max_size(), static_cast<const void*>(&t), &destroy_array, &initialize_array_by );
+    }
+
+    //! assign range [first, last)
+    template<class I>
+    void assign(I first, I last) {
+        clear(); internal_assign_range( first, last, static_cast<is_integer_tag<std::numeric_limits<I>::is_integer> *>(0) );
+    }
+
+    //! swap two instances
+    void swap(concurrent_vector &vector) {
+        if( this != &vector ) {
+            concurrent_vector_base_v3::internal_swap(static_cast<concurrent_vector_base_v3&>(vector));
+            std::swap(this->my_allocator, vector.my_allocator);
+        }
+    }
+
+    //! Clear container while keeping memory allocated.
+    /** To free up the memory, use in conjunction with method compact(). Not thread safe **/
+    void clear() {
+        internal_clear(&destroy_array);
+    }
+
+    //! Clear and destroy vector.
+    ~concurrent_vector() {
+        segment_t *table = my_segment;
+        internal_free_segments( reinterpret_cast<void**>(table), internal_clear(&destroy_array), my_first_block );
+        // base class destructor call should be then
+    }
+
+    const internal::concurrent_vector_base_v3 &internal_vector_base() const { return *this; }
+private:
+    //! Allocate k items
+    static void *internal_allocator(internal::concurrent_vector_base_v3 &vb, size_t k) {
+        return static_cast<concurrent_vector<T, A>&>(vb).my_allocator.allocate(k);
+    }
+    //! Free k segments from table
+    void internal_free_segments(void *table[], segment_index_t k, segment_index_t first_block);
+
+    //! Get reference to element at given index.
+    T& internal_subscript( size_type index ) const;
+
+    //! Get reference to element at given index with errors checks
+    T& internal_subscript_with_exceptions( size_type index ) const;
+
+    //! assign n items by copying t
+    void internal_assign_n(size_type n, const_pointer p) {
+        internal_resize( n, sizeof(T), max_size(), static_cast<const void*>(p), &destroy_array, p? &initialize_array_by : &initialize_array );
+    }
+
+    //! helper class
+    template<bool B> class is_integer_tag;
+
+    //! assign integer items by copying when arguments are treated as iterators. See C++ Standard 2003 23.1.1p9
+    template<class I>
+    void internal_assign_range(I first, I last, is_integer_tag<true> *) {
+        internal_assign_n(static_cast<size_type>(first), &static_cast<T&>(last));
+    }
+    //! inline proxy assign by iterators
+    template<class I>
+    void internal_assign_range(I first, I last, is_integer_tag<false> *) {
+        internal_assign_iterators(first, last);
+    }
+    //! assign by iterators
+    template<class I>
+    void internal_assign_iterators(I first, I last);
+
+    //! Construct n instances of T, starting at "begin".
+    static void __TBB_EXPORTED_FUNC initialize_array( void* begin, const void*, size_type n );
+
+    //! Construct n instances of T, starting at "begin".
+    static void __TBB_EXPORTED_FUNC initialize_array_by( void* begin, const void* src, size_type n );
+
+    //! Construct n instances of T, starting at "begin".
+    static void __TBB_EXPORTED_FUNC copy_array( void* dst, const void* src, size_type n );
+
+    //! Assign n instances of T, starting at "begin".
+    static void __TBB_EXPORTED_FUNC assign_array( void* dst, const void* src, size_type n );
+
+    //! Destroy n instances of T, starting at "begin".
+    static void __TBB_EXPORTED_FUNC destroy_array( void* begin, size_type n );
+
+    //! Exception-aware helper class for filling a segment by exception-danger operators of user class
+    class internal_loop_guide : internal::no_copy {
+    public:
+        const pointer array;
+        const size_type n;
+        size_type i;
+        internal_loop_guide(size_type ntrials, void *ptr)
+            : array(static_cast<pointer>(ptr)), n(ntrials), i(0) {}
+        void init() {   for(; i < n; ++i) new( &array[i] ) T(); }
+        void init(const void *src) { for(; i < n; ++i) new( &array[i] ) T(*static_cast<const T*>(src)); }
+        void copy(const void *src) { for(; i < n; ++i) new( &array[i] ) T(static_cast<const T*>(src)[i]); }
+        void assign(const void *src) { for(; i < n; ++i) array[i] = static_cast<const T*>(src)[i]; }
+        template<class I> void iterate(I &src) { for(; i < n; ++i, ++src) new( &array[i] ) T( *src ); }
+        ~internal_loop_guide() {
+            if(i < n) // if exception raised, do zerroing on the rest of items
+                std::memset(array+i, 0, (n-i)*sizeof(value_type));
+        }
+    };
+};
+
+template<typename T, class A>
+void concurrent_vector<T, A>::shrink_to_fit() {
+    internal_segments_table old;
+    __TBB_TRY {
+        if( internal_compact( sizeof(T), &old, &destroy_array, &copy_array ) )
+            internal_free_segments( old.table, pointers_per_long_table, old.first_block ); // free joined and unnecessary segments
+    } __TBB_CATCH(...) {
+        if( old.first_block ) // free segment allocated for compacting. Only for support of exceptions in ctor of user T[ype]
+            internal_free_segments( old.table, 1, old.first_block );
+        __TBB_RETHROW();
+    }
+}
+
+template<typename T, class A>
+void concurrent_vector<T, A>::internal_free_segments(void *table[], segment_index_t k, segment_index_t first_block) {
+    // Free the arrays
+    while( k > first_block ) {
+        --k;
+        T* array = static_cast<T*>(table[k]);
+        table[k] = NULL;
+        if( array > internal::vector_allocation_error_flag ) // check for correct segment pointer
+            this->my_allocator.deallocate( array, segment_size(k) );
+    }
+    T* array = static_cast<T*>(table[0]);
+    if( array > internal::vector_allocation_error_flag ) {
+        __TBB_ASSERT( first_block > 0, NULL );
+        while(k > 0) table[--k] = NULL;
+        this->my_allocator.deallocate( array, segment_size(first_block) );
+    }
+}
+
+template<typename T, class A>
+T& concurrent_vector<T, A>::internal_subscript( size_type index ) const {
+    __TBB_ASSERT( index < my_early_size, "index out of bounds" );
+    size_type j = index;
+    segment_index_t k = segment_base_index_of( j );
+    __TBB_ASSERT( (segment_t*)my_segment != my_storage || k < pointers_per_short_table, "index is being allocated" );
+    // no need in __TBB_load_with_acquire since thread works in own space or gets 
+#if TBB_USE_THREADING_TOOLS
+    T* array = static_cast<T*>( tbb::internal::itt_load_pointer_v3(&my_segment[k].array));
+#else
+    T* array = static_cast<T*>(my_segment[k].array);
+#endif /* TBB_USE_THREADING_TOOLS */
+    __TBB_ASSERT( array != internal::vector_allocation_error_flag, "the instance is broken by bad allocation. Use at() instead" );
+    __TBB_ASSERT( array, "index is being allocated" );
+    return array[j];
+}
+
+template<typename T, class A>
+T& concurrent_vector<T, A>::internal_subscript_with_exceptions( size_type index ) const {
+    if( index >= my_early_size )
+        internal::throw_exception(internal::eid_out_of_range); // throw std::out_of_range
+    size_type j = index;
+    segment_index_t k = segment_base_index_of( j );
+    if( (segment_t*)my_segment == my_storage && k >= pointers_per_short_table )
+        internal::throw_exception(internal::eid_segment_range_error); // throw std::range_error
+    void *array = my_segment[k].array; // no need in __TBB_load_with_acquire
+    if( array <= internal::vector_allocation_error_flag ) // check for correct segment pointer
+        internal::throw_exception(internal::eid_index_range_error); // throw std::range_error
+    return static_cast<T*>(array)[j];
+}
+
+template<typename T, class A> template<class I>
+void concurrent_vector<T, A>::internal_assign_iterators(I first, I last) {
+    __TBB_ASSERT(my_early_size == 0, NULL);
+    size_type n = std::distance(first, last);
+    if( !n ) return;
+    internal_reserve(n, sizeof(T), max_size());
+    my_early_size = n;
+    segment_index_t k = 0;
+    size_type sz = segment_size( my_first_block );
+    while( sz < n ) {
+        internal_loop_guide loop(sz, my_segment[k].array);
+        loop.iterate(first);
+        n -= sz;
+        if( !k ) k = my_first_block;
+        else { ++k; sz <<= 1; }
+    }
+    internal_loop_guide loop(n, my_segment[k].array);
+    loop.iterate(first);
+}
+
+template<typename T, class A>
+void concurrent_vector<T, A>::initialize_array( void* begin, const void *, size_type n ) {
+    internal_loop_guide loop(n, begin); loop.init();
+}
+
+template<typename T, class A>
+void concurrent_vector<T, A>::initialize_array_by( void* begin, const void *src, size_type n ) {
+    internal_loop_guide loop(n, begin); loop.init(src);
+}
+
+template<typename T, class A>
+void concurrent_vector<T, A>::copy_array( void* dst, const void* src, size_type n ) {
+    internal_loop_guide loop(n, dst); loop.copy(src);
+}
+
+template<typename T, class A>
+void concurrent_vector<T, A>::assign_array( void* dst, const void* src, size_type n ) {
+    internal_loop_guide loop(n, dst); loop.assign(src);
+}
+
+#if defined(_MSC_VER) && !defined(__INTEL_COMPILER) 
+    // Workaround for overzealous compiler warning
+    #pragma warning (push)
+    #pragma warning (disable: 4189)
+#endif
+template<typename T, class A>
+void concurrent_vector<T, A>::destroy_array( void* begin, size_type n ) {
+    T* array = static_cast<T*>(begin);
+    for( size_type j=n; j>0; --j )
+        array[j-1].~T(); // destructors are supposed to not throw any exceptions
+}
+#if defined(_MSC_VER) && !defined(__INTEL_COMPILER) 
+    #pragma warning (pop)
+#endif // warning 4189 is back 
+
+// concurrent_vector's template functions
+template<typename T, class A1, class A2>
+inline bool operator==(const concurrent_vector<T, A1> &a, const concurrent_vector<T, A2> &b) {
+    // Simply:    return a.size() == b.size() && std::equal(a.begin(), a.end(), b.begin());
+    if(a.size() != b.size()) return false;
+    typename concurrent_vector<T, A1>::const_iterator i(a.begin());
+    typename concurrent_vector<T, A2>::const_iterator j(b.begin());
+    for(; i != a.end(); ++i, ++j)
+        if( !(*i == *j) ) return false;
+    return true;
+}
+
+template<typename T, class A1, class A2>
+inline bool operator!=(const concurrent_vector<T, A1> &a, const concurrent_vector<T, A2> &b)
+{    return !(a == b); }
+
+template<typename T, class A1, class A2>
+inline bool operator<(const concurrent_vector<T, A1> &a, const concurrent_vector<T, A2> &b)
+{    return (std::lexicographical_compare(a.begin(), a.end(), b.begin(), b.end())); }
+
+template<typename T, class A1, class A2>
+inline bool operator>(const concurrent_vector<T, A1> &a, const concurrent_vector<T, A2> &b)
+{    return b < a; }
+
+template<typename T, class A1, class A2>
+inline bool operator<=(const concurrent_vector<T, A1> &a, const concurrent_vector<T, A2> &b)
+{    return !(b < a); }
+
+template<typename T, class A1, class A2>
+inline bool operator>=(const concurrent_vector<T, A1> &a, const concurrent_vector<T, A2> &b)
+{    return !(a < b); }
+
+template<typename T, class A>
+inline void swap(concurrent_vector<T, A> &a, concurrent_vector<T, A> &b)
+{    a.swap( b ); }
+
+} // namespace tbb
+
+#if defined(_MSC_VER) && !defined(__INTEL_COMPILER) && defined(_Wp64)
+    #pragma warning (pop)
+#endif // warning 4267 is back
+
+#endif /* __TBB_concurrent_vector_H */
diff --git a/tbb30_20100406oss/include/tbb/critical_section.h b/tbb30_20100406oss/include/tbb/critical_section.h
new file mode 100644 (file)
index 0000000..6926770
--- /dev/null
@@ -0,0 +1,141 @@
+/*
+    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef _TBB_CRITICAL_SECTION_H_
+#define _TBB_CRITICAL_SECTION_H_
+
+#if _WIN32||_WIN64
+#include <windows.h>
+#else
+#include <pthread.h>
+#include <errno.h>
+#endif  // _WIN32||WIN64
+
+#include "tbb_stddef.h"
+#include "tbb_thread.h"
+#include "tbb_exception.h"
+
+#include "tbb_profiling.h"
+
+namespace tbb {
+
+    namespace internal {
+class critical_section_v4 : internal::no_copy {
+#if _WIN32||_WIN64
+    CRITICAL_SECTION my_impl;
+#else
+    pthread_mutex_t my_impl;
+#endif
+    tbb_thread::id my_tid;
+public:
+
+    void __TBB_EXPORTED_METHOD internal_construct();
+
+    critical_section_v4() { 
+#if _WIN32||_WIN64
+        InitializeCriticalSection(&my_impl);
+#else
+        pthread_mutex_init(&my_impl, NULL);
+#endif
+        internal_construct();
+    }
+
+    ~critical_section_v4() {
+        __TBB_ASSERT(my_tid == tbb_thread::id(), "Destroying a still-held critical section");
+#if _WIN32||_WIN64
+        DeleteCriticalSection(&my_impl); 
+#else
+        pthread_mutex_destroy(&my_impl);
+#endif
+    }
+
+    class scoped_lock : internal::no_copy {
+    private:
+        critical_section_v4 &my_crit;
+    public:
+        scoped_lock( critical_section_v4& lock_me) :my_crit(lock_me) {
+            my_crit.lock();
+        }
+
+        ~scoped_lock() {
+            my_crit.unlock();
+        }
+    };
+
+    void lock() { 
+        tbb_thread::id local_tid = this_tbb_thread::get_id();
+        if(local_tid == my_tid) throw_exception( eid_improper_lock );
+#if _WIN32||_WIN64
+        EnterCriticalSection( &my_impl );
+#else
+        int rval = pthread_mutex_lock(&my_impl);
+        __TBB_ASSERT_EX(!rval, "critical_section::lock: pthread_mutex_lock failed");
+#endif
+        __TBB_ASSERT(my_tid == tbb_thread::id(), NULL);
+        my_tid = local_tid;
+    }
+
+    bool try_lock() {
+        bool gotlock;
+        tbb_thread::id local_tid = this_tbb_thread::get_id();
+        if(local_tid == my_tid) return false;
+#if _WIN32||_WIN64
+        gotlock = TryEnterCriticalSection( &my_impl ) != 0;
+#else
+        int rval = pthread_mutex_trylock(&my_impl);
+        // valid returns are 0 (locked) and [EBUSY]
+        __TBB_ASSERT(rval == 0 || rval == EBUSY, "critical_section::trylock: pthread_mutex_trylock failed");
+        gotlock = rval == 0;
+#endif
+        if(gotlock)  {
+            my_tid = local_tid;
+        }
+        return gotlock;
+    }
+
+    void unlock() {
+        __TBB_ASSERT(this_tbb_thread::get_id() == my_tid, "thread unlocking critical_section is not thread that locked it");
+        my_tid = tbb_thread::id();
+#if _WIN32||_WIN64
+        LeaveCriticalSection( &my_impl );
+#else
+        int rval = pthread_mutex_unlock(&my_impl);
+        __TBB_ASSERT_EX(!rval, "critical_section::unlock: pthread_mutex_unlock failed");
+#endif
+    }
+
+    static const bool is_rw_mutex = false;
+    static const bool is_recursive_mutex = false;
+    static const bool is_fair_mutex = true;
+}; // critical_section_v4
+} // namespace internal
+typedef internal::critical_section_v4 critical_section;
+
+__TBB_DEFINE_PROFILING_SET_NAME(critical_section)
+} // namespace tbb
+#endif  // _TBB_CRITICAL_SECTION_H_
diff --git a/tbb30_20100406oss/include/tbb/enumerable_thread_specific.h b/tbb30_20100406oss/include/tbb/enumerable_thread_specific.h
new file mode 100644 (file)
index 0000000..668c353
--- /dev/null
@@ -0,0 +1,1051 @@
+/*
+    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB_enumerable_thread_specific_H
+#define __TBB_enumerable_thread_specific_H
+
+#include "concurrent_vector.h"
+#include "tbb_thread.h"
+#include "cache_aligned_allocator.h"
+#if __SUNPRO_CC
+#include <string.h>  // for memcpy
+#endif
+
+#if _WIN32||_WIN64
+#include <windows.h>
+#else
+#include <pthread.h>
+#endif
+
+namespace tbb {
+
+//! enum for selecting between single key and key-per-instance versions
+enum ets_key_usage_type { ets_key_per_instance, ets_no_key };
+
+namespace interface5 {
+    //! @cond
+    namespace internal { 
+
+        template<ets_key_usage_type ETS_key_type>
+        class ets_base: tbb::internal::no_copy {
+        protected:
+#if _WIN32||_WIN64
+            typedef DWORD key_type;
+#else
+            typedef pthread_t key_type;
+#endif
+#if __TBB_GCC_3_3_PROTECTED_BROKEN
+        public:
+#endif
+            struct slot;
+
+            struct array {
+                array* next;
+                size_t lg_size;
+                slot& at( size_t k ) {
+                    return ((slot*)(void*)(this+1))[k];
+                }
+                size_t size() const {return (size_t)1<<lg_size;}
+                size_t mask() const {return size()-1;}
+                size_t start( size_t h ) const {
+                    return h>>(8*sizeof(size_t)-lg_size);
+                }
+            };
+            struct slot {
+                key_type key;
+                void* ptr;
+                bool empty() const {return !key;}
+                bool match( key_type k ) const {return key==k;}
+                bool claim( key_type k ) {
+                    __TBB_ASSERT(sizeof(tbb::atomic<key_type>)==sizeof(key_type), NULL);
+                    __TBB_ASSERT(sizeof(void*)==sizeof(tbb::atomic<key_type>*), NULL);
+                    union { void* space; tbb::atomic<key_type>* key_atomic; } helper;
+                    helper.space = &key;
+                    return helper.key_atomic->compare_and_swap(k,0)==0;
+                }
+            };
+#if __TBB_GCC_3_3_PROTECTED_BROKEN
+        protected:
+#endif
+        
+            static key_type key_of_current_thread() {
+               tbb::tbb_thread::id id = tbb::this_tbb_thread::get_id();
+               key_type k;
+               memcpy( &k, &id, sizeof(k) );
+               return k;
+            }
+
+            //! Root of linked list of arrays of decreasing size.
+            /** NULL if and only if my_count==0.  
+                Each array in the list is half the size of its predecessor. */
+            atomic<array*> my_root;
+            atomic<size_t> my_count;
+            virtual void* create_local() = 0;
+            virtual void* create_array(size_t _size) = 0;  // _size in bytes
+            virtual void free_array(void* ptr, size_t _size) = 0; // _size in bytes
+            array* allocate( size_t lg_size ) {
+                size_t n = 1<<lg_size;  
+                array* a = static_cast<array*>(create_array( sizeof(array)+n*sizeof(slot) ));
+                a->lg_size = lg_size;
+                std::memset( a+1, 0, n*sizeof(slot) );
+                return a;
+            }
+            void free(array* a) {
+                size_t n = 1<<(a->lg_size);  
+                free_array( (void *)a, size_t(sizeof(array)+n*sizeof(slot)) );
+            }
+            static size_t hash( key_type k ) {
+                // Multiplicative hashing.  Client should use *upper* bits.
+                // casts required for Mac gcc4.* compiler
+#if __TBB_WORDSIZE == 4
+                return uintptr_t(k)*0x9E3779B9;
+#else
+                return uintptr_t(k)*0x9E3779B97F4A7C15;
+#endif 
+            } 
+        
+            ets_base() {my_root=NULL; my_count=0;}
+            virtual ~ets_base();  // g++ complains if this is not virtual...
+            void* table_lookup( bool& exists );
+            void table_clear();
+            slot& table_find( key_type k ) {
+                size_t h = hash(k);
+                array* r = my_root;
+                size_t mask = r->mask();
+                for(size_t i = r->start(h);;i=(i+1)&mask) {
+                    slot& s = r->at(i);
+                    if( s.empty() || s.match(k) )
+                        return s;
+                }
+            }
+            void table_reserve_for_copy( const ets_base& other ) {
+                __TBB_ASSERT(!my_root,NULL);
+                __TBB_ASSERT(!my_count,NULL);
+                if( other.my_root ) {
+                    array* a = allocate(other.my_root->lg_size);
+                    a->next = NULL;
+                    my_root = a;
+                    my_count = other.my_count;
+                }
+            }
+        };
+
+        template<ets_key_usage_type ETS_key_type>
+        ets_base<ETS_key_type>::~ets_base() {
+            __TBB_ASSERT(!my_root, NULL);
+        }
+
+        template<ets_key_usage_type ETS_key_type>
+        void ets_base<ETS_key_type>::table_clear() {
+            while( array* r = my_root ) {
+                my_root = r->next;
+                free(r);
+            }
+            my_count = 0;
+        }
+                
+        template<ets_key_usage_type ETS_key_type>
+        void* ets_base<ETS_key_type>::table_lookup( bool& exists ) {
+            const key_type k = key_of_current_thread(); 
+
+            __TBB_ASSERT(k!=0,NULL);
+            void* found;
+            size_t h = hash(k);
+            for( array* r=my_root; r; r=r->next ) {
+                size_t mask=r->mask();
+                for(size_t i = r->start(h); ;i=(i+1)&mask) {
+                    slot& s = r->at(i);
+                    if( s.empty() ) break;
+                    if( s.match(k) ) {
+                        if( r==my_root ) {
+                            // Success at top level
+                            exists = true;
+                            return s.ptr;
+                        } else {
+                            // Success at some other level.  Need to insert at top level.
+                            exists = true;
+                            found = s.ptr;
+                            goto insert;
+                        }
+                    }
+                }
+            }
+            // Key does not yet exist
+            exists = false;
+            found = create_local();
+            {
+                size_t c = ++my_count;
+                array* r = my_root;
+                if( !r || c>r->size()/2 ) {
+                    size_t s = r ? r->lg_size : 2;
+                    while( c>size_t(1)<<(s-1) ) ++s;
+                    array* a = allocate(s);
+                    for(;;) {
+                        a->next = my_root;
+                        array* new_r = my_root.compare_and_swap(a,r);
+                        if( new_r==r ) break;
+                        if( new_r->lg_size>=s ) {
+                            // Another thread inserted an equal or  bigger array, so our array is superfluous.
+                            free(a);
+                            break;
+                        }
+                        r = new_r;
+                    }
+                }
+            }
+        insert:
+            // Guaranteed to be room for it, and it is not present, so search for empty slot and grab it.
+            array* ir = my_root;
+            size_t mask = ir->mask();
+            for(size_t i = ir->start(h);;i=(i+1)&mask) {
+                slot& s = ir->at(i);
+                if( s.empty() ) {
+                    if( s.claim(k) ) {
+                        s.ptr = found;
+                        return found;
+                    }
+                }
+            }
+        };
+
+        //! Specialization that exploits native TLS 
+        template <>
+        class ets_base<ets_key_per_instance>: protected ets_base<ets_no_key> {
+            typedef ets_base<ets_no_key> super;
+#if _WIN32||_WIN64
+            typedef DWORD tls_key_t;
+            void create_key() { my_key = TlsAlloc(); }
+            void destroy_key() { TlsFree(my_key); }
+            void set_tls(void * value) { TlsSetValue(my_key, (LPVOID)value); }
+            void* get_tls() { return (void *)TlsGetValue(my_key); }
+#else
+            typedef pthread_key_t tls_key_t;
+            void create_key() { pthread_key_create(&my_key, NULL); }
+            void destroy_key() { pthread_key_delete(my_key); }
+            void set_tls( void * value ) const { pthread_setspecific(my_key, value); }
+            void* get_tls() const { return pthread_getspecific(my_key); }
+#endif
+            tls_key_t my_key;
+            virtual void* create_local() = 0;
+            virtual void* create_array(size_t _size) = 0;  // _size in bytes
+            virtual void free_array(void* ptr, size_t _size) = 0; // size in bytes
+        public:
+            ets_base() {create_key();}
+            ~ets_base() {destroy_key();}
+            void* table_lookup( bool& exists ) {
+                void* found = get_tls();
+                if( found ) {
+                    exists=true;
+                } else {
+                    found = super::table_lookup(exists);
+                    set_tls(found);
+                }
+                return found; 
+            }
+            void table_clear() {
+                destroy_key();
+                create_key(); 
+                super::table_clear();
+            }
+        };
+
+        //! Random access iterator for traversing the thread local copies.
+        template< typename Container, typename Value >
+        class enumerable_thread_specific_iterator 
+#if defined(_WIN64) && defined(_MSC_VER) 
+            // Ensure that Microsoft's internal template function _Val_type works correctly.
+            : public std::iterator<std::random_access_iterator_tag,Value>
+#endif /* defined(_WIN64) && defined(_MSC_VER) */
+        {
+            //! current position in the concurrent_vector 
+        
+            Container *my_container;
+            typename Container::size_type my_index;
+            mutable Value *my_value;
+        
+            template<typename C, typename T>
+            friend enumerable_thread_specific_iterator<C,T> operator+( ptrdiff_t offset, 
+                                                                       const enumerable_thread_specific_iterator<C,T>& v );
+        
+            template<typename C, typename T, typename U>
+            friend bool operator==( const enumerable_thread_specific_iterator<C,T>& i, 
+                                    const enumerable_thread_specific_iterator<C,U>& j );
+        
+            template<typename C, typename T, typename U>
+            friend bool operator<( const enumerable_thread_specific_iterator<C,T>& i, 
+                                   const enumerable_thread_specific_iterator<C,U>& j );
+        
+            template<typename C, typename T, typename U>
+            friend ptrdiff_t operator-( const enumerable_thread_specific_iterator<C,T>& i, const enumerable_thread_specific_iterator<C,U>& j );
+            
+            template<typename C, typename U> 
+            friend class enumerable_thread_specific_iterator;
+        
+            public:
+        
+            enumerable_thread_specific_iterator( const Container &container, typename Container::size_type index ) : 
+                my_container(&const_cast<Container &>(container)), my_index(index), my_value(NULL) {}
+        
+            //! Default constructor
+            enumerable_thread_specific_iterator() : my_container(NULL), my_index(0), my_value(NULL) {}
+        
+            template<typename U>
+            enumerable_thread_specific_iterator( const enumerable_thread_specific_iterator<Container, U>& other ) :
+                    my_container( other.my_container ), my_index( other.my_index), my_value( const_cast<Value *>(other.my_value) ) {}
+        
+            enumerable_thread_specific_iterator operator+( ptrdiff_t offset ) const {
+                return enumerable_thread_specific_iterator(*my_container, my_index + offset);
+            }
+        
+            enumerable_thread_specific_iterator &operator+=( ptrdiff_t offset ) {
+                my_index += offset;
+                my_value = NULL;
+                return *this;
+            }
+        
+            enumerable_thread_specific_iterator operator-( ptrdiff_t offset ) const {
+                return enumerable_thread_specific_iterator( *my_container, my_index-offset );
+            }
+        
+            enumerable_thread_specific_iterator &operator-=( ptrdiff_t offset ) {
+                my_index -= offset;
+                my_value = NULL;
+                return *this;
+            }
+        
+            Value& operator*() const {
+                Value* value = my_value;
+                if( !value ) {
+                    value = my_value = reinterpret_cast<Value *>(&(*my_container)[my_index].value);
+                }
+                __TBB_ASSERT( value==reinterpret_cast<Value *>(&(*my_container)[my_index].value), "corrupt cache" );
+                return *value;
+            }
+        
+            Value& operator[]( ptrdiff_t k ) const {
+               return (*my_container)[my_index + k].value;
+            }
+        
+            Value* operator->() const {return &operator*();}
+        
+            enumerable_thread_specific_iterator& operator++() {
+                ++my_index;
+                my_value = NULL;
+                return *this;
+            }
+        
+            enumerable_thread_specific_iterator& operator--() {
+                --my_index;
+                my_value = NULL;
+                return *this;
+            }
+        
+            //! Post increment
+            enumerable_thread_specific_iterator operator++(int) {
+                enumerable_thread_specific_iterator result = *this;
+                ++my_index;
+                my_value = NULL;
+                return result;
+            }
+        
+            //! Post decrement
+            enumerable_thread_specific_iterator operator--(int) {
+                enumerable_thread_specific_iterator result = *this;
+                --my_index;
+                my_value = NULL;
+                return result;
+            }
+        
+            // STL support
+            typedef ptrdiff_t difference_type;
+            typedef Value value_type;
+            typedef Value* pointer;
+            typedef Value& reference;
+            typedef std::random_access_iterator_tag iterator_category;
+        };
+        
+        template<typename Container, typename T>
+        enumerable_thread_specific_iterator<Container,T> operator+( ptrdiff_t offset, 
+                                                                    const enumerable_thread_specific_iterator<Container,T>& v ) {
+            return enumerable_thread_specific_iterator<Container,T>( v.my_container, v.my_index + offset );
+        }
+        
+        template<typename Container, typename T, typename U>
+        bool operator==( const enumerable_thread_specific_iterator<Container,T>& i, 
+                         const enumerable_thread_specific_iterator<Container,U>& j ) {
+            return i.my_index==j.my_index && i.my_container == j.my_container;
+        }
+        
+        template<typename Container, typename T, typename U>
+        bool operator!=( const enumerable_thread_specific_iterator<Container,T>& i, 
+                         const enumerable_thread_specific_iterator<Container,U>& j ) {
+            return !(i==j);
+        }
+        
+        template<typename Container, typename T, typename U>
+        bool operator<( const enumerable_thread_specific_iterator<Container,T>& i, 
+                        const enumerable_thread_specific_iterator<Container,U>& j ) {
+            return i.my_index<j.my_index;
+        }
+        
+        template<typename Container, typename T, typename U>
+        bool operator>( const enumerable_thread_specific_iterator<Container,T>& i, 
+                        const enumerable_thread_specific_iterator<Container,U>& j ) {
+            return j<i;
+        }
+        
+        template<typename Container, typename T, typename U>
+        bool operator>=( const enumerable_thread_specific_iterator<Container,T>& i, 
+                         const enumerable_thread_specific_iterator<Container,U>& j ) {
+            return !(i<j);
+        }
+        
+        template<typename Container, typename T, typename U>
+        bool operator<=( const enumerable_thread_specific_iterator<Container,T>& i, 
+                         const enumerable_thread_specific_iterator<Container,U>& j ) {
+            return !(j<i);
+        }
+        
+        template<typename Container, typename T, typename U>
+        ptrdiff_t operator-( const enumerable_thread_specific_iterator<Container,T>& i, 
+                             const enumerable_thread_specific_iterator<Container,U>& j ) {
+            return i.my_index-j.my_index;
+        }
+
+    template<typename SegmentedContainer, typename Value >
+        class segmented_iterator
+#if defined(_WIN64) && defined(_MSC_VER)
+        : public std::iterator<std::input_iterator_tag, Value>
+#endif
+        {
+            template<typename C, typename T, typename U>
+            friend bool operator==(const segmented_iterator<C,T>& i, const segmented_iterator<C,U>& j);
+
+            template<typename C, typename T, typename U>
+            friend bool operator!=(const segmented_iterator<C,T>& i, const segmented_iterator<C,U>& j);
+            
+            template<typename C, typename U> 
+            friend class segmented_iterator;
+
+            public:
+
+                segmented_iterator() {my_segcont = NULL;}
+
+                segmented_iterator( const SegmentedContainer& _segmented_container ) : 
+                    my_segcont(const_cast<SegmentedContainer*>(&_segmented_container)),
+                    outer_iter(my_segcont->end()) { }
+
+                ~segmented_iterator() {}
+
+                typedef typename SegmentedContainer::iterator outer_iterator;
+                typedef typename SegmentedContainer::value_type InnerContainer;
+                typedef typename InnerContainer::iterator inner_iterator;
+
+                // STL support
+                typedef ptrdiff_t difference_type;
+                typedef Value value_type;
+                typedef typename SegmentedContainer::size_type size_type;
+                typedef Value* pointer;
+                typedef Value& reference;
+                typedef std::input_iterator_tag iterator_category;
+
+                // Copy Constructor
+                template<typename U>
+                segmented_iterator(const segmented_iterator<SegmentedContainer, U>& other) :
+                    my_segcont(other.my_segcont),
+                    outer_iter(other.outer_iter),
+                    // can we assign a default-constructed iterator to inner if we're at the end?
+                    inner_iter(other.inner_iter)
+                {}
+
+                // assignment
+                template<typename U>
+                segmented_iterator& operator=( const segmented_iterator<SegmentedContainer, U>& other) {
+                    if(this != &other) {
+                        my_segcont = other.my_segcont;
+                        outer_iter = other.outer_iter;
+                        if(outer_iter != my_segcont->end()) inner_iter = other.inner_iter;
+                    }
+                    return *this;
+                }
+
+                // allow assignment of outer iterator to segmented iterator.  Once it is
+                // assigned, move forward until a non-empty inner container is found or
+                // the end of the outer container is reached.
+                segmented_iterator& operator=(const outer_iterator& new_outer_iter) {
+                    __TBB_ASSERT(my_segcont != NULL, NULL);
+                    // check that this iterator points to something inside the segmented container
+                    for(outer_iter = new_outer_iter ;outer_iter!=my_segcont->end(); ++outer_iter) {
+                        if( !outer_iter->empty() ) {
+                            inner_iter = outer_iter->begin();
+                            break;
+                        }
+                    }
+                    return *this;
+                }
+
+                // pre-increment
+                segmented_iterator& operator++() {
+                    advance_me();
+                    return *this;
+                }
+
+                // post-increment
+                segmented_iterator operator++(int) {
+                    segmented_iterator tmp = *this;
+                    operator++();
+                    return tmp;
+                }
+
+                bool operator==(const outer_iterator& other_outer) const {
+                    __TBB_ASSERT(my_segcont != NULL, NULL);
+                    return (outer_iter == other_outer &&
+                            (outer_iter == my_segcont->end() || inner_iter == outer_iter->begin()));
+                }
+
+                bool operator!=(const outer_iterator& other_outer) const {
+                    return !operator==(other_outer);
+
+                }
+
+                // (i)* RHS
+                reference operator*() const {
+                    __TBB_ASSERT(my_segcont != NULL, NULL);
+                    __TBB_ASSERT(outer_iter != my_segcont->end(), "Dereferencing a pointer at end of container");
+                    __TBB_ASSERT(inner_iter != outer_iter->end(), NULL); // should never happen
+                    return *inner_iter;
+                }
+
+                // i->
+                pointer operator->() const { return &operator*();}
+
+            private:
+                SegmentedContainer*             my_segcont;
+                outer_iterator outer_iter;
+                inner_iterator inner_iter;
+
+                void advance_me() {
+                    __TBB_ASSERT(my_segcont != NULL, NULL);
+                    __TBB_ASSERT(outer_iter != my_segcont->end(), NULL); // not true if there are no inner containers
+                    __TBB_ASSERT(inner_iter != outer_iter->end(), NULL); // not true if the inner containers are all empty.
+                    ++inner_iter;
+                    while(inner_iter == outer_iter->end() && ++outer_iter != my_segcont->end()) {
+                        inner_iter = outer_iter->begin();
+                    }
+                }
+        };    // segmented_iterator
+
+        template<typename SegmentedContainer, typename T, typename U>
+        bool operator==( const segmented_iterator<SegmentedContainer,T>& i, 
+                         const segmented_iterator<SegmentedContainer,U>& j ) {
+            if(i.my_segcont != j.my_segcont) return false;
+            if(i.my_segcont == NULL) return true;
+            if(i.outer_iter != j.outer_iter) return false;
+            if(i.outer_iter == i.my_segcont->end()) return true;
+            return i.inner_iter == j.inner_iter;
+        }
+
+        // !=
+        template<typename SegmentedContainer, typename T, typename U>
+        bool operator!=( const segmented_iterator<SegmentedContainer,T>& i, 
+                         const segmented_iterator<SegmentedContainer,U>& j ) {
+            return !(i==j);
+        }
+
+        // storage for initialization function pointer
+        template<typename T>
+        struct callback_base {
+            virtual T apply( ) = 0;
+            virtual void destroy( ) = 0;
+            // need to be able to create copies of callback_base for copy constructor
+            virtual callback_base* make_copy() = 0;
+            // need virtual destructor to satisfy GCC compiler warning
+            virtual ~callback_base() { }
+        };
+
+        template <typename T, typename Functor>
+        struct callback_leaf : public callback_base<T>, public tbb::internal::no_copy {
+            typedef Functor my_callback_type;
+            typedef callback_leaf<T,Functor> my_type;
+            typedef my_type* callback_pointer;
+            typedef typename tbb::tbb_allocator<my_type> my_allocator_type;
+            Functor f;
+            callback_leaf( const Functor& f_) : f(f_) {
+            }
+
+            static callback_pointer new_callback(const Functor& f_ ) {
+                void* new_void = my_allocator_type().allocate(1);
+                callback_pointer new_cb = new (new_void) callback_leaf<T,Functor>(f_); // placement new
+                return new_cb;
+            }
+
+            /* override */ callback_pointer make_copy() {
+                return new_callback( f );
+            }
+
+             /* override */ void destroy( ) {
+                 callback_pointer my_ptr = this;
+                 my_allocator_type().destroy(my_ptr);
+                 my_allocator_type().deallocate(my_ptr,1);
+             }
+            /* override */ T apply() { return f(); }  // does copy construction of returned value.
+        };
+
+
+        //! Template for adding padding in order to avoid false sharing
+        /** ModularSize should be sizeof(U) modulo the cache line size.
+            All maintenance of the space will be done explicitly on push_back,
+            and all thread local copies must be destroyed before the concurrent
+            vector is deleted.
+        */
+        template<typename U, size_t ModularSize>
+        struct ets_element {
+            char value[sizeof(U) + tbb::internal::NFS_MaxLineSize-ModularSize];
+            void unconstruct() {
+                // "reinterpret_cast<U*>(&value)->~U();" causes type-punning warning with gcc 4.4,
+                // "U* u = reinterpret_cast<U*>(&value); u->~U();" causes unused variable warning with VS2010.
+                // Thus another "casting via union" hack.
+                __TBB_ASSERT(sizeof(void*)==sizeof(U*),NULL);
+                union { void* space; U* val; } helper;
+                helper.space = &value;
+                helper.val->~U();
+            }
+        };
+
+        //! Partial specialization for case where no padding is needed.
+        template<typename U>
+        struct ets_element<U,0> {
+            char value[sizeof(U)];
+            void unconstruct() { // Same implementation as in general case
+                __TBB_ASSERT(sizeof(void*)==sizeof(U*),NULL);
+                union { void* space; U* val; } helper;
+                helper.space = &value;
+                helper.val->~U();
+            }
+        };
+
+    } // namespace internal
+    //! @endcond
+
+    //! The enumerable_thread_specific container
+    /** enumerable_thread_specific has the following properties:
+        - thread-local copies are lazily created, with default, exemplar or function initialization.
+        - thread-local copies do not move (during lifetime, and excepting clear()) so the address of a copy is invariant.
+        - the contained objects need not have operator=() defined if combine is not used.
+        - enumerable_thread_specific containers may be copy-constructed or assigned.
+        - thread-local copies can be managed by hash-table, or can be accessed via TLS storage for speed.
+        - outside of parallel contexts, the contents of all thread-local copies are accessible by iterator or using combine or combine_each methods
+        
+    @par Segmented iterator
+        When the thread-local objects are containers with input_iterators defined, a segmented iterator may
+        be used to iterate over all the elements of all thread-local copies.
+
+    @par combine and combine_each
+        - Both methods are defined for enumerable_thread_specific. 
+        - combine() requires the the type T have operator=() defined.  
+        - neither method modifies the contents of the object (though there is no guarantee that the applied methods do not modify the object.)  
+        - Both are evaluated in serial context (the methods are assumed to be non-benign.)
+        
+    @ingroup containers */
+    template <typename T, 
+              typename Allocator=cache_aligned_allocator<T>, 
+              ets_key_usage_type ETS_key_type=ets_no_key > 
+    class enumerable_thread_specific: internal::ets_base<ETS_key_type> { 
+
+        template<typename U, typename A, ets_key_usage_type C> friend class enumerable_thread_specific;
+    
+        typedef internal::ets_element<T,sizeof(T)%tbb::internal::NFS_MaxLineSize> padded_element;
+
+        //! A generic range, used to create range objects from the iterators
+        template<typename I>
+        class generic_range_type: public blocked_range<I> {
+        public:
+            typedef T value_type;
+            typedef T& reference;
+            typedef const T& const_reference;
+            typedef I iterator;
+            typedef ptrdiff_t difference_type;
+            generic_range_type( I begin_, I end_, size_t grainsize_ = 1) : blocked_range<I>(begin_,end_,grainsize_) {} 
+            template<typename U>
+            generic_range_type( const generic_range_type<U>& r) : blocked_range<I>(r.begin(),r.end(),r.grainsize()) {} 
+            generic_range_type( generic_range_type& r, split ) : blocked_range<I>(r,split()) {}
+        };
+    
+        typedef typename Allocator::template rebind< padded_element >::other padded_allocator_type;
+        typedef tbb::concurrent_vector< padded_element, padded_allocator_type > internal_collection_type;
+        
+        internal::callback_base<T> *my_finit_callback;
+
+        // need to use a pointed-to exemplar because T may not be assignable.
+        // using tbb_allocator instead of padded_element_allocator because we may be
+        // copying an exemplar from one instantiation of ETS to another with a different
+        // allocator.
+        typedef typename tbb::tbb_allocator<padded_element > exemplar_allocator_type;
+        static padded_element * create_exemplar(const T& my_value) {
+            padded_element *new_exemplar = reinterpret_cast<padded_element *>(exemplar_allocator_type().allocate(1));
+            new(new_exemplar->value) T(my_value);
+            return new_exemplar;
+        }
+
+        static padded_element *create_exemplar( ) {
+            padded_element *new_exemplar = reinterpret_cast<padded_element *>(exemplar_allocator_type().allocate(1));
+            new(new_exemplar->value) T( );
+            return new_exemplar;
+        }
+
+        static void free_exemplar(padded_element *my_ptr) {
+            my_ptr->unconstruct();
+            exemplar_allocator_type().destroy(my_ptr);
+            exemplar_allocator_type().deallocate(my_ptr,1);
+        }
+
+        padded_element* my_exemplar_ptr;
+
+        internal_collection_type my_locals;
+   
+        /*override*/ void* create_local() {
+#if TBB_DEPRECATED
+            void* lref = &my_locals[my_locals.push_back(padded_element())];
+#else
+            void* lref = &*my_locals.push_back(padded_element());
+#endif
+            if(my_finit_callback) {
+                new(lref) T(my_finit_callback->apply());
+            } else if(my_exemplar_ptr) {
+                pointer t_exemp = reinterpret_cast<T *>(&(my_exemplar_ptr->value));
+                new(lref) T(*t_exemp);
+            } else {
+                new(lref) T();
+            }
+            return lref;
+        } 
+
+        void unconstruct_locals() {
+            for(typename internal_collection_type::iterator cvi = my_locals.begin(); cvi != my_locals.end(); ++cvi) {
+                cvi->unconstruct();
+            }
+        }
+
+        typedef typename Allocator::template rebind< uintptr_t >::other array_allocator_type;
+
+        // _size is in bytes
+        /*override*/ void* create_array(size_t _size) {
+            size_t nelements = (_size + sizeof(uintptr_t) -1) / sizeof(uintptr_t);
+            return array_allocator_type().allocate(nelements);
+        }
+
+        /*override*/ void free_array( void* _ptr, size_t _size) {
+            size_t nelements = (_size + sizeof(uintptr_t) -1) / sizeof(uintptr_t);
+            array_allocator_type().deallocate( reinterpret_cast<uintptr_t *>(_ptr),nelements);
+        }
+   
+    public:
+    
+        //! Basic types
+        typedef Allocator allocator_type;
+        typedef T value_type;
+        typedef T& reference;
+        typedef const T& const_reference;
+        typedef T* pointer;
+        typedef const T* const_pointer;
+        typedef typename internal_collection_type::size_type size_type;
+        typedef typename internal_collection_type::difference_type difference_type;
+    
+        // Iterator types
+        typedef typename internal::enumerable_thread_specific_iterator< internal_collection_type, value_type > iterator;
+        typedef typename internal::enumerable_thread_specific_iterator< internal_collection_type, const value_type > const_iterator;
+
+        // Parallel range types
+        typedef generic_range_type< iterator > range_type;
+        typedef generic_range_type< const_iterator > const_range_type;
+    
+        //! Default constructor, which leads to default construction of local copies
+        enumerable_thread_specific() : my_finit_callback(0) { 
+            my_exemplar_ptr = 0;
+        }
+
+        //! construction with initializer method
+        // Finit should be a function taking 0 parameters and returning a T
+        template <typename Finit>
+        enumerable_thread_specific( Finit _finit )
+        {
+            my_finit_callback = internal::callback_leaf<T,Finit>::new_callback( _finit );
+            my_exemplar_ptr = 0; // don't need exemplar if function is provided
+        }
+    
+        //! Constuction with exemplar, which leads to copy construction of local copies
+        enumerable_thread_specific(const T &_exemplar) : my_finit_callback(0) {
+            my_exemplar_ptr = create_exemplar(_exemplar);
+        }
+    
+        //! Destructor
+        ~enumerable_thread_specific() { 
+            if(my_finit_callback) {
+                my_finit_callback->destroy();
+            }
+            if(my_exemplar_ptr) {
+                free_exemplar(my_exemplar_ptr);
+            }
+            this->clear();  // deallocation before the derived class is finished destructing
+            // So free(array *) is still accessible
+        }
+      
+        //! returns reference to local, discarding exists
+        reference local() {
+            bool exists;
+            return local(exists);
+        }
+
+        //! Returns reference to calling thread's local copy, creating one if necessary
+        reference local(bool& exists)  {
+            __TBB_ASSERT(ETS_key_type==ets_no_key,"ets_key_per_instance not yet implemented"); 
+            void* ptr = this->table_lookup(exists);
+            return *(T*)ptr;
+        }
+
+        //! Get the number of local copies
+        size_type size() const { return my_locals.size(); }
+    
+        //! true if there have been no local copies created
+        bool empty() const { return my_locals.empty(); }
+    
+        //! begin iterator
+        iterator begin() { return iterator( my_locals, 0 ); }
+        //! end iterator
+        iterator end() { return iterator(my_locals, my_locals.size() ); }
+    
+        //! begin const iterator
+        const_iterator begin() const { return const_iterator(my_locals, 0); }
+    
+        //! end const iterator
+        const_iterator end() const { return const_iterator(my_locals, my_locals.size()); }
+
+        //! Get range for parallel algorithms
+        range_type range( size_t grainsize=1 ) { return range_type( begin(), end(), grainsize ); } 
+        
+        //! Get const range for parallel algorithms
+        const_range_type range( size_t grainsize=1 ) const { return const_range_type( begin(), end(), grainsize ); }
+
+        //! Destroys local copies
+        void clear() {
+            unconstruct_locals();
+            my_locals.clear();
+            this->table_clear();
+            // callback is not destroyed
+            // exemplar is not destroyed
+        }
+
+    private:
+
+        template<typename U, typename A2, ets_key_usage_type C2>
+        void internal_copy( const enumerable_thread_specific<U, A2, C2>& other);
+
+    public:
+
+        template<typename U, typename Alloc, ets_key_usage_type Cachetype>
+        enumerable_thread_specific( const enumerable_thread_specific<U, Alloc, Cachetype>& other ) : internal::ets_base<ETS_key_type> ()
+        {
+            internal_copy(other);
+        }
+
+        enumerable_thread_specific( const enumerable_thread_specific& other ) : internal::ets_base<ETS_key_type> ()
+        {
+            internal_copy(other);
+        }
+
+    private:
+
+        template<typename U, typename A2, ets_key_usage_type C2>
+        enumerable_thread_specific &
+        internal_assign(const enumerable_thread_specific<U, A2, C2>& other) {
+            if(static_cast<void *>( this ) != static_cast<const void *>( &other )) {
+                this->clear(); 
+                if(my_finit_callback) {
+                    my_finit_callback->destroy();
+                    my_finit_callback = 0;
+                }
+                if(my_exemplar_ptr) {
+                    free_exemplar(my_exemplar_ptr);
+                    my_exemplar_ptr = 0;
+                }
+                internal_copy( other );
+            }
+            return *this;
+        }
+
+    public:
+
+        // assignment
+        enumerable_thread_specific& operator=(const enumerable_thread_specific& other) {
+            return internal_assign(other);
+        }
+
+        template<typename U, typename Alloc, ets_key_usage_type Cachetype>
+        enumerable_thread_specific& operator=(const enumerable_thread_specific<U, Alloc, Cachetype>& other)
+        {
+            return internal_assign(other);
+        }
+
+        // combine_func_t has signature T(T,T) or T(const T&, const T&)
+        template <typename combine_func_t>
+        T combine(combine_func_t f_combine) {
+            if(begin() == end()) {
+                if(my_finit_callback) {
+                    return my_finit_callback->apply();
+                }
+                pointer local_ref = reinterpret_cast<T*>((my_exemplar_ptr->value));
+                return T(*local_ref);
+            }
+            const_iterator ci = begin();
+            T my_result = *ci;
+            while(++ci != end()) 
+                my_result = f_combine( my_result, *ci );
+            return my_result;
+        }
+
+        // combine_func_t has signature void(T) or void(const T&)
+        template <typename combine_func_t>
+        void combine_each(combine_func_t f_combine) {
+            for(const_iterator ci = begin(); ci != end(); ++ci) {
+                f_combine( *ci );
+            }
+        }
+
+    }; // enumerable_thread_specific
+
+    
+    template <typename T, typename Allocator, ets_key_usage_type ETS_key_type> 
+    template<typename U, typename A2, ets_key_usage_type C2>
+    void enumerable_thread_specific<T,Allocator,ETS_key_type>::internal_copy( const enumerable_thread_specific<U, A2, C2>& other) {
+        typedef internal::ets_base<ets_no_key> base;
+        __TBB_ASSERT(my_locals.size()==0,NULL);
+        this->table_reserve_for_copy( other );
+        for( base::array* r=other.my_root; r; r=r->next ) {
+            for( size_t i=0; i<r->size(); ++i ) {
+                base::slot& s1 = r->at(i);
+                if( !s1.empty() ) {
+                    base::slot& s2 = this->table_find(s1.key);
+                    if( s2.empty() ) { 
+#if TBB_DEPRECATED
+                        void* lref = &my_locals[my_locals.push_back(padded_element())];
+#else
+                        void* lref = &*my_locals.push_back(padded_element());
+#endif
+                        s2.ptr = new(lref) T(*(U*)s1.ptr);
+                        s2.key = s1.key;
+                    } else {
+                        // Skip the duplicate
+                    } 
+                }
+            }
+        }
+        if(other.my_finit_callback) {
+            my_finit_callback = other.my_finit_callback->make_copy();
+        } else {
+            my_finit_callback = 0;
+        }
+        if(other.my_exemplar_ptr) {
+            pointer local_ref = reinterpret_cast<U*>(other.my_exemplar_ptr->value);
+            my_exemplar_ptr = create_exemplar(*local_ref);
+        } else {
+            my_exemplar_ptr = 0;
+        }
+    }
+
+    template< typename Container >
+    class flattened2d {
+
+        // This intermediate typedef is to address issues with VC7.1 compilers
+        typedef typename Container::value_type conval_type;
+
+    public:
+
+        //! Basic types
+        typedef typename conval_type::size_type size_type;
+        typedef typename conval_type::difference_type difference_type;
+        typedef typename conval_type::allocator_type allocator_type;
+        typedef typename conval_type::value_type value_type;
+        typedef typename conval_type::reference reference;
+        typedef typename conval_type::const_reference const_reference;
+        typedef typename conval_type::pointer pointer;
+        typedef typename conval_type::const_pointer const_pointer;
+
+        typedef typename internal::segmented_iterator<Container, value_type> iterator;
+        typedef typename internal::segmented_iterator<Container, const value_type> const_iterator;
+
+        flattened2d( const Container &c, typename Container::const_iterator b, typename Container::const_iterator e ) : 
+            my_container(const_cast<Container*>(&c)), my_begin(b), my_end(e) { }
+
+        flattened2d( const Container &c ) : 
+            my_container(const_cast<Container*>(&c)), my_begin(c.begin()), my_end(c.end()) { }
+
+        iterator begin() { return iterator(*my_container) = my_begin; }
+        iterator end() { return iterator(*my_container) = my_end; }
+        const_iterator begin() const { return const_iterator(*my_container) = my_begin; }
+        const_iterator end() const { return const_iterator(*my_container) = my_end; }
+
+        size_type size() const {
+            size_type tot_size = 0;
+            for(typename Container::const_iterator i = my_begin; i != my_end; ++i) {
+                tot_size += i->size();
+            }
+            return tot_size;
+        }
+
+    private:
+
+        Container *my_container;
+        typename Container::const_iterator my_begin;
+        typename Container::const_iterator my_end;
+
+    };
+
+    template <typename Container>
+    flattened2d<Container> flatten2d(const Container &c, const typename Container::const_iterator b, const typename Container::const_iterator e) {
+        return flattened2d<Container>(c, b, e);
+    }
+
+    template <typename Container>
+    flattened2d<Container> flatten2d(const Container &c) {
+        return flattened2d<Container>(c);
+    }
+
+} // interface5
+
+namespace internal {
+using interface5::internal::segmented_iterator;
+}
+
+using interface5::enumerable_thread_specific;
+using interface5::flattened2d;
+using interface5::flatten2d;
+
+} // namespace tbb
+
+#endif
diff --git a/tbb30_20100406oss/include/tbb/index.html b/tbb30_20100406oss/include/tbb/index.html
new file mode 100644 (file)
index 0000000..7e4552e
--- /dev/null
@@ -0,0 +1,28 @@
+<HTML>
+<BODY>
+
+<H2>Overview</H2>
+Include files for Threading Building Blocks classes and functions.
+
+<BR><A HREF=".">Click here</A> to see all files in the directory.
+
+<H2>Directories</H2>
+<DL>
+<DT><A HREF="machine">machine</A>
+<DD>Include files for low-level architecture specific functionality.
+<DT><A HREF="compat">compat</A>
+<DD>Include files for source level compatibility with other frameworks.
+</DL>
+
+<HR>
+<A HREF="../index.html">Up to parent directory</A>
+<p></p>
+Copyright &copy; 2005-2010 Intel Corporation.  All Rights Reserved.
+<p></p>
+Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are 
+registered trademarks or trademarks of Intel Corporation or its 
+subsidiaries in the United States and other countries. 
+<p></p>
+* Other names and brands may be claimed as the property of others.
+</BODY>
+</HTML>
diff --git a/tbb30_20100406oss/include/tbb/machine/ibm_aix51.h b/tbb30_20100406oss/include/tbb/machine/ibm_aix51.h
new file mode 100644 (file)
index 0000000..ff3103b
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB_machine_H
+#error Do not include this file directly; include tbb_machine.h instead
+#endif
+
+#define __TBB_WORDSIZE 8
+#define __TBB_BIG_ENDIAN 1
+
+#include <stdint.h>
+#include <unistd.h>
+#include <sched.h>
+
+extern "C" {
+
+int32_t __TBB_machine_cas_32 (volatile void* ptr, int32_t value, int32_t comparand);
+int64_t __TBB_machine_cas_64 (volatile void* ptr, int64_t value, int64_t comparand);
+#define __TBB_fence_for_acquire() __TBB_machine_flush ()
+#define __TBB_fence_for_release() __TBB_machine_flush ()
+
+}
+
+#define __TBB_CompareAndSwap4(P,V,C) __TBB_machine_cas_32(P,V,C)
+#define __TBB_CompareAndSwap8(P,V,C) __TBB_machine_cas_64(P,V,C)
+#define __TBB_CompareAndSwapW(P,V,C) __TBB_machine_cas_64(P,V,C)
+#define __TBB_Yield() sched_yield()
diff --git a/tbb30_20100406oss/include/tbb/machine/linux_common.h b/tbb30_20100406oss/include/tbb/machine/linux_common.h
new file mode 100644 (file)
index 0000000..35c5ce7
--- /dev/null
@@ -0,0 +1,97 @@
+/*
+    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB_machine_H
+#error Do not include this file directly; include tbb_machine.h instead
+#endif
+
+#include <stdint.h>
+#include <unistd.h>
+#include <sched.h>
+
+// Definition of __TBB_Yield()
+#ifndef __TBB_Yield
+#define __TBB_Yield()  sched_yield()
+#endif
+
+/* Futex definitions */
+#include <sys/syscall.h>
+
+#if defined(SYS_futex)
+
+#define __TBB_USE_FUTEX 1
+#include <limits.h>
+#include <errno.h>
+// Unfortunately, some versions of Linux do not have a header that defines FUTEX_WAIT and FUTEX_WAKE.
+
+#ifdef FUTEX_WAIT
+#define __TBB_FUTEX_WAIT FUTEX_WAIT
+#else
+#define __TBB_FUTEX_WAIT 0
+#endif
+
+#ifdef FUTEX_WAKE
+#define __TBB_FUTEX_WAKE FUTEX_WAKE
+#else
+#define __TBB_FUTEX_WAKE 1
+#endif
+
+#ifndef __TBB_ASSERT
+#error machine specific headers must be included after tbb_stddef.h
+#endif
+
+namespace tbb {
+
+namespace internal {
+
+inline int futex_wait( void *futex, int comparand ) {
+    int r = ::syscall( SYS_futex,futex,__TBB_FUTEX_WAIT,comparand,NULL,NULL,0 );
+#if TBB_USE_ASSERT
+    int e = errno;
+    __TBB_ASSERT( r==0||r==EWOULDBLOCK||(r==-1&&(e==EAGAIN||e==EINTR)), "futex_wait failed." );
+#endif /* TBB_USE_ASSERT */
+    return r;
+}
+
+inline int futex_wakeup_one( void *futex ) {
+    int r = ::syscall( SYS_futex,futex,__TBB_FUTEX_WAKE,1,NULL,NULL,0 );
+    __TBB_ASSERT( r==0||r==1, "futex_wakeup_one: more than one thread woken up?" );
+    return r;
+}
+
+inline int futex_wakeup_all( void *futex ) {
+    int r = ::syscall( SYS_futex,futex,__TBB_FUTEX_WAKE,INT_MAX,NULL,NULL,0 );
+    __TBB_ASSERT( r>=0, "futex_wakeup_all: error in waking up threads" );
+    return r;
+}
+
+} /* namespace internal */
+
+} /* namespace tbb */
+
+#endif /* SYS_futex */
diff --git a/tbb30_20100406oss/include/tbb/machine/linux_ia32.h b/tbb30_20100406oss/include/tbb/machine/linux_ia32.h
new file mode 100644 (file)
index 0000000..e0041a1
--- /dev/null
@@ -0,0 +1,261 @@
+/*
+    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB_machine_H
+#error Do not include this file directly; include tbb_machine.h instead
+#endif
+
+#if !__MINGW32__
+#include "linux_common.h"
+#endif
+
+#define __TBB_WORDSIZE 4
+#define __TBB_BIG_ENDIAN 0
+
+#define __TBB_release_consistency_helper() __asm__ __volatile__("": : :"memory")
+
+inline void __TBB_rel_acq_fence() { __asm__ __volatile__("mfence": : :"memory"); }
+
+#if __TBB_ICC_ASM_VOLATILE_BROKEN
+#define __TBB_VOLATILE
+#else
+#define __TBB_VOLATILE volatile
+#endif
+
+#define __MACHINE_DECL_ATOMICS(S,T,X) \
+static inline T __TBB_machine_cmpswp##S (volatile void *ptr, T value, T comparand )  \
+{                                                                                    \
+    T result;                                                                        \
+                                                                                     \
+    __asm__ __volatile__("lock\ncmpxchg" X " %2,%1"                                  \
+                          : "=a"(result), "=m"(*(__TBB_VOLATILE T*)ptr)              \
+                          : "q"(value), "0"(comparand), "m"(*(__TBB_VOLATILE T*)ptr) \
+                          : "memory");                                               \
+    return result;                                                                   \
+}                                                                                    \
+                                                                                     \
+static inline T __TBB_machine_fetchadd##S(volatile void *ptr, T addend)              \
+{                                                                                    \
+    T result;                                                                        \
+    __asm__ __volatile__("lock\nxadd" X " %0,%1"                                     \
+                          : "=r"(result), "=m"(*(__TBB_VOLATILE T*)ptr)              \
+                          : "0"(addend), "m"(*(__TBB_VOLATILE T*)ptr)                \
+                          : "memory");                                               \
+    return result;                                                                   \
+}                                                                                    \
+                                                                                     \
+static inline  T __TBB_machine_fetchstore##S(volatile void *ptr, T value)            \
+{                                                                                    \
+    T result;                                                                        \
+    __asm__ __volatile__("lock\nxchg" X " %0,%1"                                     \
+                          : "=r"(result), "=m"(*(__TBB_VOLATILE T*)ptr)              \
+                          : "0"(value), "m"(*(__TBB_VOLATILE T*)ptr)                 \
+                          : "memory");                                               \
+    return result;                                                                   \
+}                                                                                    \
+                                                                                     
+__MACHINE_DECL_ATOMICS(1,int8_t,"")
+__MACHINE_DECL_ATOMICS(2,int16_t,"")
+__MACHINE_DECL_ATOMICS(4,int32_t,"l")
+
+static inline int64_t __TBB_machine_cmpswp8 (volatile void *ptr, int64_t value, int64_t comparand )
+{
+    int64_t result;
+#if __PIC__ 
+    /* compiling position-independent code */
+    // EBX register preserved for compliance with position-independent code rules on IA32
+    __asm__ __volatile__ (
+            "pushl %%ebx\n\t"
+            "movl  (%%ecx),%%ebx\n\t"
+            "movl  4(%%ecx),%%ecx\n\t"
+            "lock\n\t cmpxchg8b %1\n\t"
+            "popl  %%ebx"
+             : "=A"(result), "=m"(*(int64_t *)ptr)
+             : "m"(*(int64_t *)ptr)
+             , "0"(comparand)
+             , "c"(&value)
+             : "memory", "esp"
+#if __INTEL_COMPILER
+             ,"ebx"
+#endif
+    );
+#else /* !__PIC__ */
+    union {
+        int64_t i64;
+        int32_t i32[2];
+    };
+    i64 = value;
+    __asm__ __volatile__ (
+            "lock\n\t cmpxchg8b %1\n\t"
+             : "=A"(result), "=m"(*(__TBB_VOLATILE int64_t *)ptr)
+             : "m"(*(__TBB_VOLATILE int64_t *)ptr)
+             , "0"(comparand)
+             , "b"(i32[0]), "c"(i32[1])
+             : "memory"
+    );
+#endif /* __PIC__ */
+    return result;
+}
+
+static inline int32_t __TBB_machine_lg( uint32_t x ) {
+    int32_t j;
+    __asm__ ("bsr %1,%0" : "=r"(j) : "r"(x));
+    return j;
+}
+
+static inline void __TBB_machine_or( volatile void *ptr, uint32_t addend ) {
+    __asm__ __volatile__("lock\norl %1,%0" : "=m"(*(__TBB_VOLATILE uint32_t *)ptr) : "r"(addend), "m"(*(__TBB_VOLATILE uint32_t *)ptr) : "memory");
+}
+
+static inline void __TBB_machine_and( volatile void *ptr, uint32_t addend ) {
+    __asm__ __volatile__("lock\nandl %1,%0" : "=m"(*(__TBB_VOLATILE uint32_t *)ptr) : "r"(addend), "m"(*(__TBB_VOLATILE uint32_t *)ptr) : "memory");
+}
+
+static inline void __TBB_machine_pause( int32_t delay ) {
+    for (int32_t i = 0; i < delay; i++) {
+       __asm__ __volatile__("pause;");
+    }
+    return;
+}   
+
+static inline int64_t __TBB_machine_load8 (const volatile void *ptr) {
+    int64_t result;
+    if( ((uint32_t)ptr&7u)==0 ) {
+        // Aligned load
+        __asm__ __volatile__ ( "fildq %1\n\t"
+                               "fistpq %0" :  "=m"(result) : "m"(*(const __TBB_VOLATILE uint64_t*)ptr) : "memory" );
+    } else {
+        // Unaligned load
+        result = __TBB_machine_cmpswp8(const_cast<void*>(ptr),0,0);
+    }
+    return result;
+}
+
+//! Handles misaligned 8-byte store
+/** Defined in tbb_misc.cpp */
+extern "C" void __TBB_machine_store8_slow( volatile void *ptr, int64_t value );
+extern "C" void __TBB_machine_store8_slow_perf_warning( volatile void *ptr );
+
+static inline void __TBB_machine_store8(volatile void *ptr, int64_t value) {
+    if( ((uint32_t)ptr&7u)==0 ) {
+        // Aligned store
+        __asm__ __volatile__ ( "fildq %1\n\t"
+                               "fistpq %0" :  "=m"(*(__TBB_VOLATILE int64_t*)ptr) : "m"(value) : "memory" );
+    } else {
+        // Unaligned store
+#if TBB_USE_PERFORMANCE_WARNINGS
+        __TBB_machine_store8_slow_perf_warning(ptr);
+#endif /* TBB_USE_PERFORMANCE_WARNINGS */
+        __TBB_machine_store8_slow(ptr,value);
+    }
+}
+template <typename T, size_t S>
+struct __TBB_machine_load_store {
+    static inline T load_with_acquire(const volatile T& location) {
+        T to_return = location;
+        __asm__ __volatile__("" : : : "memory" );   // Compiler fence to keep operations from migrating upwards
+        return to_return;
+    }
+
+    static inline void store_with_release(volatile T &location, T value) {
+        __asm__ __volatile__("" : : : "memory" );   // Compiler fence to keep operations from migrating upwards
+        location = value;
+    }
+};
+
+template <typename T>
+struct __TBB_machine_load_store<T,8> {
+    static inline T load_with_acquire(const volatile T& location) {
+        T to_return = __TBB_machine_load8((const volatile void *)&location);
+        __asm__ __volatile__("" : : : "memory" );   // Compiler fence to keep operations from migrating upwards
+        return to_return;
+    }
+
+    static inline void store_with_release(volatile T &location, T value) {
+        __asm__ __volatile__("" : : : "memory" );   // Compiler fence to keep operations from migrating downwards
+        __TBB_machine_store8((volatile void *)&location,(int64_t)value);
+    }
+};
+
+#undef __TBB_VOLATILE
+
+template<typename T>
+inline T __TBB_machine_load_with_acquire(const volatile T &location) {
+    return __TBB_machine_load_store<T,sizeof(T)>::load_with_acquire(location);
+}
+
+template<typename T, typename V>
+inline void __TBB_machine_store_with_release(volatile T &location, V value) {
+    __TBB_machine_load_store<T,sizeof(T)>::store_with_release(location,value);
+}
+
+#define __TBB_load_with_acquire(L) __TBB_machine_load_with_acquire((L))
+#define __TBB_store_with_release(L,V) __TBB_machine_store_with_release((L),(V))
+
+// Machine specific atomic operations
+
+#define __TBB_CompareAndSwap1(P,V,C) __TBB_machine_cmpswp1(P,V,C)
+#define __TBB_CompareAndSwap2(P,V,C) __TBB_machine_cmpswp2(P,V,C)
+#define __TBB_CompareAndSwap4(P,V,C) __TBB_machine_cmpswp4(P,V,C)
+#define __TBB_CompareAndSwap8(P,V,C) __TBB_machine_cmpswp8(P,V,C)
+#define __TBB_CompareAndSwapW(P,V,C) __TBB_machine_cmpswp4(P,V,C)
+
+#define __TBB_FetchAndAdd1(P,V) __TBB_machine_fetchadd1(P,V)
+#define __TBB_FetchAndAdd2(P,V) __TBB_machine_fetchadd2(P,V)
+#define __TBB_FetchAndAdd4(P,V) __TBB_machine_fetchadd4(P,V)
+#define __TBB_FetchAndAddW(P,V) __TBB_machine_fetchadd4(P,V)
+
+#define __TBB_FetchAndStore1(P,V) __TBB_machine_fetchstore1(P,V)
+#define __TBB_FetchAndStore2(P,V) __TBB_machine_fetchstore2(P,V)
+#define __TBB_FetchAndStore4(P,V) __TBB_machine_fetchstore4(P,V)
+#define __TBB_FetchAndStoreW(P,V) __TBB_machine_fetchstore4(P,V)
+
+#define __TBB_Store8(P,V) __TBB_machine_store8(P,V)
+#define __TBB_Load8(P)    __TBB_machine_load8(P)
+
+#define __TBB_AtomicOR(P,V) __TBB_machine_or(P,V)
+#define __TBB_AtomicAND(P,V) __TBB_machine_and(P,V)
+
+
+// Those we chose not to implement (they will be implemented generically using CMPSWP8)
+#undef __TBB_FetchAndAdd8
+#undef __TBB_FetchAndStore8
+
+// Definition of other functions
+#define __TBB_Pause(V) __TBB_machine_pause(V)
+#define __TBB_Log2(V)  __TBB_machine_lg(V)
+
+// Special atomic functions
+#define __TBB_FetchAndAddWrelease(P,V) __TBB_FetchAndAddW(P,V)
+#define __TBB_FetchAndIncrementWacquire(P) __TBB_FetchAndAddW(P,1)
+#define __TBB_FetchAndDecrementWrelease(P) __TBB_FetchAndAddW(P,-1)
+
+// Use generic definitions from tbb_machine.h
+#undef __TBB_TryLockByte
+#undef __TBB_LockByte
diff --git a/tbb30_20100406oss/include/tbb/machine/linux_ia64.h b/tbb30_20100406oss/include/tbb/machine/linux_ia64.h
new file mode 100644 (file)
index 0000000..cd788fe
--- /dev/null
@@ -0,0 +1,169 @@
+/*
+    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB_machine_H
+#error Do not include this file directly; include tbb_machine.h instead
+#endif
+
+#include "linux_common.h"
+#include <ia64intrin.h>
+
+#define __TBB_WORDSIZE 8
+#define __TBB_BIG_ENDIAN 0
+#define __TBB_DECL_FENCED_ATOMICS 1
+
+// Most of the functions will be in a .s file
+
+extern "C" {
+    int8_t __TBB_machine_cmpswp1__TBB_full_fence (volatile void *ptr, int8_t value, int8_t comparand); 
+    int8_t __TBB_machine_fetchadd1__TBB_full_fence (volatile void *ptr, int8_t addend);
+    int8_t __TBB_machine_fetchadd1acquire(volatile void *ptr, int8_t addend);
+    int8_t __TBB_machine_fetchadd1release(volatile void *ptr, int8_t addend);
+    int8_t __TBB_machine_fetchstore1acquire(volatile void *ptr, int8_t value);
+    int8_t __TBB_machine_fetchstore1release(volatile void *ptr, int8_t value);
+
+    int16_t __TBB_machine_cmpswp2__TBB_full_fence (volatile void *ptr, int16_t value, int16_t comparand);
+    int16_t __TBB_machine_fetchadd2__TBB_full_fence (volatile void *ptr, int16_t addend);
+    int16_t __TBB_machine_fetchadd2acquire(volatile void *ptr, int16_t addend);
+    int16_t __TBB_machine_fetchadd2release(volatile void *ptr, int16_t addend);
+    int16_t __TBB_machine_fetchstore2acquire(volatile void *ptr, int16_t value);
+    int16_t __TBB_machine_fetchstore2release(volatile void *ptr, int16_t value);
+
+    int32_t __TBB_machine_fetchstore4__TBB_full_fence (volatile void *ptr, int32_t value);
+    int32_t __TBB_machine_fetchstore4acquire(volatile void *ptr, int32_t value);
+    int32_t __TBB_machine_fetchstore4release(volatile void *ptr, int32_t value);
+    int32_t __TBB_machine_fetchadd4acquire(volatile void *ptr, int32_t addend);
+    int32_t __TBB_machine_fetchadd4release(volatile void *ptr, int32_t addend);
+
+    int64_t __TBB_machine_cmpswp8__TBB_full_fence (volatile void *ptr, int64_t value, int64_t comparand);
+    int64_t __TBB_machine_fetchstore8__TBB_full_fence (volatile void *ptr, int64_t value);
+    int64_t __TBB_machine_fetchstore8acquire(volatile void *ptr, int64_t value);
+    int64_t __TBB_machine_fetchstore8release(volatile void *ptr, int64_t value);
+    int64_t __TBB_machine_fetchadd8acquire(volatile void *ptr, int64_t addend);
+    int64_t __TBB_machine_fetchadd8release(volatile void *ptr, int64_t addend);
+
+    int8_t __TBB_machine_cmpswp1acquire(volatile void *ptr, int8_t value, int8_t comparand); 
+    int8_t __TBB_machine_cmpswp1release(volatile void *ptr, int8_t value, int8_t comparand); 
+    int8_t __TBB_machine_fetchstore1__TBB_full_fence (volatile void *ptr, int8_t value);
+
+    int16_t __TBB_machine_cmpswp2acquire(volatile void *ptr, int16_t value, int16_t comparand); 
+    int16_t __TBB_machine_cmpswp2release(volatile void *ptr, int16_t value, int16_t comparand); 
+    int16_t __TBB_machine_fetchstore2__TBB_full_fence (volatile void *ptr, int16_t value);
+
+    int32_t __TBB_machine_cmpswp4__TBB_full_fence (volatile void *ptr, int32_t value, int32_t comparand);
+    int32_t __TBB_machine_cmpswp4acquire(volatile void *ptr, int32_t value, int32_t comparand); 
+    int32_t __TBB_machine_cmpswp4release(volatile void *ptr, int32_t value, int32_t comparand); 
+    int32_t __TBB_machine_fetchadd4__TBB_full_fence (volatile void *ptr, int32_t value);
+
+    int64_t __TBB_machine_cmpswp8acquire(volatile void *ptr, int64_t value, int64_t comparand); 
+    int64_t __TBB_machine_cmpswp8release(volatile void *ptr, int64_t value, int64_t comparand); 
+    int64_t __TBB_machine_fetchadd8__TBB_full_fence (volatile void *ptr, int64_t value);
+
+    int64_t __TBB_machine_lg(uint64_t value);
+    void __TBB_machine_pause(int32_t delay);
+    bool __TBB_machine_trylockbyte( volatile unsigned char &ptr );
+    int64_t __TBB_machine_lockbyte( volatile unsigned char &ptr );
+
+    //! Retrieves the current RSE backing store pointer. IA64 specific.
+    void* __TBB_get_bsp();
+}
+
+#define __TBB_CompareAndSwap1(P,V,C) __TBB_machine_cmpswp1__TBB_full_fence(P,V,C)
+#define __TBB_CompareAndSwap2(P,V,C) __TBB_machine_cmpswp2__TBB_full_fence(P,V,C) 
+
+#define __TBB_FetchAndAdd1(P,V)        __TBB_machine_fetchadd1__TBB_full_fence(P,V)
+#define __TBB_FetchAndAdd1acquire(P,V) __TBB_machine_fetchadd1acquire(P,V)
+#define __TBB_FetchAndAdd1release(P,V) __TBB_machine_fetchadd1release(P,V)
+#define __TBB_FetchAndAdd2(P,V)        __TBB_machine_fetchadd2__TBB_full_fence(P,V)
+#define __TBB_FetchAndAdd2acquire(P,V) __TBB_machine_fetchadd2acquire(P,V)
+#define __TBB_FetchAndAdd2release(P,V) __TBB_machine_fetchadd2release(P,V)
+#define __TBB_FetchAndAdd4acquire(P,V) __TBB_machine_fetchadd4acquire(P,V)
+#define __TBB_FetchAndAdd4release(P,V) __TBB_machine_fetchadd4release(P,V)
+#define __TBB_FetchAndAdd8acquire(P,V) __TBB_machine_fetchadd8acquire(P,V)
+#define __TBB_FetchAndAdd8release(P,V) __TBB_machine_fetchadd8release(P,V)
+
+#define __TBB_FetchAndStore1acquire(P,V) __TBB_machine_fetchstore1acquire(P,V)
+#define __TBB_FetchAndStore1release(P,V) __TBB_machine_fetchstore1release(P,V)
+#define __TBB_FetchAndStore2acquire(P,V) __TBB_machine_fetchstore2acquire(P,V)
+#define __TBB_FetchAndStore2release(P,V) __TBB_machine_fetchstore2release(P,V)
+#define __TBB_FetchAndStore4acquire(P,V) __TBB_machine_fetchstore4acquire(P,V)
+#define __TBB_FetchAndStore4release(P,V) __TBB_machine_fetchstore4release(P,V)
+#define __TBB_FetchAndStore8acquire(P,V) __TBB_machine_fetchstore8acquire(P,V)
+#define __TBB_FetchAndStore8release(P,V) __TBB_machine_fetchstore8release(P,V)
+
+#define __TBB_CompareAndSwap1acquire(P,V,C) __TBB_machine_cmpswp1acquire(P,V,C)
+#define __TBB_CompareAndSwap1release(P,V,C) __TBB_machine_cmpswp1release(P,V,C)
+#define __TBB_CompareAndSwap2acquire(P,V,C) __TBB_machine_cmpswp2acquire(P,V,C)
+#define __TBB_CompareAndSwap2release(P,V,C) __TBB_machine_cmpswp2release(P,V,C)
+#define __TBB_CompareAndSwap4(P,V,C)        __TBB_machine_cmpswp4__TBB_full_fence(P,V,C)
+#define __TBB_CompareAndSwap4acquire(P,V,C) __TBB_machine_cmpswp4acquire(P,V,C)
+#define __TBB_CompareAndSwap4release(P,V,C) __TBB_machine_cmpswp4release(P,V,C)
+#define __TBB_CompareAndSwap8(P,V,C)        __TBB_machine_cmpswp8__TBB_full_fence(P,V,C)
+#define __TBB_CompareAndSwap8acquire(P,V,C) __TBB_machine_cmpswp8acquire(P,V,C)
+#define __TBB_CompareAndSwap8release(P,V,C) __TBB_machine_cmpswp8release(P,V,C)
+
+#define __TBB_FetchAndAdd4(P,V) __TBB_machine_fetchadd4__TBB_full_fence(P,V)
+#define __TBB_FetchAndAdd8(P,V) __TBB_machine_fetchadd8__TBB_full_fence(P,V)
+
+#define __TBB_FetchAndStore1(P,V) __TBB_machine_fetchstore1__TBB_full_fence(P,V)
+#define __TBB_FetchAndStore2(P,V) __TBB_machine_fetchstore2__TBB_full_fence(P,V)
+#define __TBB_FetchAndStore4(P,V) __TBB_machine_fetchstore4__TBB_full_fence(P,V)
+#define __TBB_FetchAndStore8(P,V) __TBB_machine_fetchstore8__TBB_full_fence(P,V)
+
+#define __TBB_FetchAndIncrementWacquire(P) __TBB_FetchAndAdd8acquire(P,1)
+#define __TBB_FetchAndDecrementWrelease(P) __TBB_FetchAndAdd8release(P,-1)
+
+#ifndef __INTEL_COMPILER
+/* Even though GCC imbues volatile loads with acquire semantics, 
+   it sometimes moves loads over the acquire fence.  The
+   fences defined here stop such incorrect code motion. */
+#define __TBB_release_consistency_helper() __asm__ __volatile__("": : :"memory")
+#define __TBB_rel_acq_fence() __asm__ __volatile__("mf": : :"memory")
+#else
+#define __TBB_release_consistency_helper()
+#define __TBB_rel_acq_fence() __mf()
+#endif /* __INTEL_COMPILER */
+
+// Special atomic functions
+#define __TBB_CompareAndSwapW(P,V,C)   __TBB_CompareAndSwap8(P,V,C)
+#define __TBB_FetchAndStoreW(P,V)      __TBB_FetchAndStore8(P,V)
+#define __TBB_FetchAndAddW(P,V)        __TBB_FetchAndAdd8(P,V)
+#define __TBB_FetchAndAddWrelease(P,V) __TBB_FetchAndAdd8release(P,V)
+
+// Not needed
+#undef __TBB_Store8
+#undef __TBB_Load8
+
+// Definition of Lock functions
+#define __TBB_TryLockByte(P) __TBB_machine_trylockbyte(P)
+#define __TBB_LockByte(P)    __TBB_machine_lockbyte(P)
+
+// Definition of other utility functions
+#define __TBB_Pause(V) __TBB_machine_pause(V)
+#define __TBB_Log2(V)  __TBB_machine_lg(V)
+
diff --git a/tbb30_20100406oss/include/tbb/machine/linux_intel64.h b/tbb30_20100406oss/include/tbb/machine/linux_intel64.h
new file mode 100644 (file)
index 0000000..aa8472c
--- /dev/null
@@ -0,0 +1,141 @@
+/*
+    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB_machine_H
+#error Do not include this file directly; include tbb_machine.h instead
+#endif
+
+#include "linux_common.h"
+
+#define __TBB_WORDSIZE 8
+#define __TBB_BIG_ENDIAN 0
+
+#define __TBB_release_consistency_helper() __asm__ __volatile__("": : :"memory")
+
+#ifndef __TBB_rel_acq_fence
+inline void __TBB_rel_acq_fence() { __asm__ __volatile__("mfence": : :"memory"); }
+#endif
+
+#define __MACHINE_DECL_ATOMICS(S,T,X) \
+static inline T __TBB_machine_cmpswp##S (volatile void *ptr, T value, T comparand )  \
+{                                                                                    \
+    T result;                                                                        \
+                                                                                     \
+    __asm__ __volatile__("lock\ncmpxchg" X " %2,%1"                                  \
+                          : "=a"(result), "=m"(*(volatile T*)ptr)                    \
+                          : "q"(value), "0"(comparand), "m"(*(volatile T*)ptr)       \
+                          : "memory");                                               \
+    return result;                                                                   \
+}                                                                                    \
+                                                                                     \
+static inline T __TBB_machine_fetchadd##S(volatile void *ptr, T addend)              \
+{                                                                                    \
+    T result;                                                                        \
+    __asm__ __volatile__("lock\nxadd" X " %0,%1"                                     \
+                          : "=r"(result),"=m"(*(volatile T*)ptr)                     \
+                          : "0"(addend), "m"(*(volatile T*)ptr)                      \
+                          : "memory");                                               \
+    return result;                                                                   \
+}                                                                                    \
+                                                                                     \
+static inline  T __TBB_machine_fetchstore##S(volatile void *ptr, T value)            \
+{                                                                                    \
+    T result;                                                                        \
+    __asm__ __volatile__("lock\nxchg" X " %0,%1"                                     \
+                          : "=r"(result),"=m"(*(volatile T*)ptr)                     \
+                          : "0"(value), "m"(*(volatile T*)ptr)                       \
+                          : "memory");                                               \
+    return result;                                                                   \
+}                                                                                    \
+                                                                                     
+__MACHINE_DECL_ATOMICS(1,int8_t,"")
+__MACHINE_DECL_ATOMICS(2,int16_t,"")
+__MACHINE_DECL_ATOMICS(4,int32_t,"")
+__MACHINE_DECL_ATOMICS(8,int64_t,"q")
+
+static inline int64_t __TBB_machine_lg( uint64_t x ) {
+    int64_t j;
+    __asm__ ("bsr %1,%0" : "=r"(j) : "r"(x));
+    return j;
+}
+
+static inline void __TBB_machine_or( volatile void *ptr, uint64_t addend ) {
+    __asm__ __volatile__("lock\norq %1,%0" : "=m"(*(volatile uint64_t*)ptr) : "r"(addend), "m"(*(volatile uint64_t*)ptr) : "memory");
+}
+
+static inline void __TBB_machine_and( volatile void *ptr, uint64_t addend ) {
+    __asm__ __volatile__("lock\nandq %1,%0" : "=m"(*(volatile uint64_t*)ptr) : "r"(addend), "m"(*(volatile uint64_t*)ptr) : "memory");
+}
+
+static inline void __TBB_machine_pause( int32_t delay ) {
+    for (int32_t i = 0; i < delay; i++) {
+       __asm__ __volatile__("pause;");
+    }
+    return;
+}
+
+// Machine specific atomic operations
+
+#define __TBB_CompareAndSwap1(P,V,C) __TBB_machine_cmpswp1(P,V,C)
+#define __TBB_CompareAndSwap2(P,V,C) __TBB_machine_cmpswp2(P,V,C)
+#define __TBB_CompareAndSwap4(P,V,C) __TBB_machine_cmpswp4(P,V,C)
+#define __TBB_CompareAndSwap8(P,V,C) __TBB_machine_cmpswp8(P,V,C)
+#define __TBB_CompareAndSwapW(P,V,C) __TBB_machine_cmpswp8(P,V,C)
+
+#define __TBB_FetchAndAdd1(P,V) __TBB_machine_fetchadd1(P,V)
+#define __TBB_FetchAndAdd2(P,V) __TBB_machine_fetchadd2(P,V)
+#define __TBB_FetchAndAdd4(P,V) __TBB_machine_fetchadd4(P,V)
+#define __TBB_FetchAndAdd8(P,V)  __TBB_machine_fetchadd8(P,V)
+#define __TBB_FetchAndAddW(P,V)  __TBB_machine_fetchadd8(P,V)
+
+#define __TBB_FetchAndStore1(P,V) __TBB_machine_fetchstore1(P,V)
+#define __TBB_FetchAndStore2(P,V) __TBB_machine_fetchstore2(P,V)
+#define __TBB_FetchAndStore4(P,V) __TBB_machine_fetchstore4(P,V)
+#define __TBB_FetchAndStore8(P,V)  __TBB_machine_fetchstore8(P,V)
+#define __TBB_FetchAndStoreW(P,V)  __TBB_machine_fetchstore8(P,V)
+
+#define __TBB_Store8(P,V) (*P = V)
+#define __TBB_Load8(P)    (*P)
+
+#define __TBB_AtomicOR(P,V) __TBB_machine_or(P,V)
+#define __TBB_AtomicAND(P,V) __TBB_machine_and(P,V)
+
+// Definition of other functions
+#ifndef __TBB_Pause
+#define __TBB_Pause(V) __TBB_machine_pause(V)
+#endif
+#define __TBB_Log2(V)    __TBB_machine_lg(V)
+
+// Special atomic functions
+#define __TBB_FetchAndAddWrelease(P,V) __TBB_FetchAndAddW(P,V)
+#define __TBB_FetchAndIncrementWacquire(P) __TBB_FetchAndAddW(P,1)
+#define __TBB_FetchAndDecrementWrelease(P) __TBB_FetchAndAddW(P,-1)
+
+// Use generic definitions from tbb_machine.h
+#undef __TBB_TryLockByte
+#undef __TBB_LockByte
diff --git a/tbb30_20100406oss/include/tbb/machine/mac_ppc.h b/tbb30_20100406oss/include/tbb/machine/mac_ppc.h
new file mode 100644 (file)
index 0000000..2487d21
--- /dev/null
@@ -0,0 +1,85 @@
+/*
+    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB_machine_H
+#error Do not include this file directly; include tbb_machine.h instead
+#endif
+
+#include <stdint.h>
+#include <unistd.h>
+
+#include <sched.h> // sched_yield
+
+inline int32_t __TBB_machine_cmpswp4 (volatile void *ptr, int32_t value, int32_t comparand )
+{
+    int32_t result;
+
+    __asm__ __volatile__("sync\n"
+                         "0: lwarx %0,0,%2\n\t"  /* load w/ reservation */
+                         "cmpw %0,%4\n\t"        /* compare against comparand */
+                         "bne- 1f\n\t"           /* exit if not same */
+                         "stwcx. %3,0,%2\n\t"    /* store new_value */
+                         "bne- 0b\n"             /* retry if reservation lost */
+                         "1: sync"               /* the exit */
+                          : "=&r"(result), "=m"(* (int32_t*) ptr)
+                          : "r"(ptr), "r"(value), "r"(comparand), "m"(* (int32_t*) ptr)
+                          : "cr0");
+    return result;
+}
+
+inline int64_t __TBB_machine_cmpswp8 (volatile void *ptr, int64_t value, int64_t comparand )
+{
+    int64_t result;
+    __asm__ __volatile__("sync\n"
+                         "0: ldarx %0,0,%2\n\t"  /* load w/ reservation */
+                         "cmpd %0,%4\n\t"        /* compare against comparand */
+                         "bne- 1f\n\t"           /* exit if not same */
+                         "stdcx. %3,0,%2\n\t"    /* store new_value */
+                         "bne- 0b\n"             /* retry if reservation lost */
+                         "1: sync"               /* the exit */
+                          : "=&b"(result), "=m"(* (int64_t*) ptr)
+                          : "r"(ptr), "r"(value), "r"(comparand), "m"(* (int64_t*) ptr)
+                          : "cr0");
+    return result;
+}
+
+#define __TBB_BIG_ENDIAN 1
+
+#if defined(powerpc64) || defined(__powerpc64__) || defined(__ppc64__)
+#define __TBB_WORDSIZE 8
+#define __TBB_CompareAndSwapW(P,V,C) __TBB_machine_cmpswp8(P,V,C)
+#else
+#define __TBB_WORDSIZE 4
+#define __TBB_CompareAndSwapW(P,V,C) __TBB_machine_cmpswp4(P,V,C)
+#endif
+
+#define __TBB_CompareAndSwap4(P,V,C) __TBB_machine_cmpswp4(P,V,C)
+#define __TBB_CompareAndSwap8(P,V,C) __TBB_machine_cmpswp8(P,V,C)
+#define __TBB_Yield() sched_yield()
+#define __TBB_rel_acq_fence() __asm__ __volatile__("lwsync": : :"memory")
+#define __TBB_release_consistency_helper() __TBB_rel_acq_fence()
diff --git a/tbb30_20100406oss/include/tbb/machine/sunos_sparc.h b/tbb30_20100406oss/include/tbb/machine/sunos_sparc.h
new file mode 100644 (file)
index 0000000..cf90a92
--- /dev/null
@@ -0,0 +1,233 @@
+/*
+    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+
+#ifndef __TBB_machine_H
+#error Do not include this file directly; include tbb_machine.h instead
+#endif
+
+#include <stdint.h>
+#include <unistd.h>
+
+#include <sched.h> // sched_yield
+
+#define __TBB_WORDSIZE 8
+#define __TBB_BIG_ENDIAN 1
+
+#define __TBB_release_consistency_helper() __asm__ __volatile__ ("": : :"memory")
+
+inline void __TBB_rel_acq_fence() { __asm__ __volatile__("membar #LoadLoad|#LoadStore|#StoreStore|#StoreLoad": : : "memory"); }
+
+//--------------------------------------------------
+// Compare and swap
+//--------------------------------------------------
+
+/**
+ * Atomic CAS for 32 bit values, if *ptr==comparand, then *ptr=value, returns *ptr
+ * @param ptr pointer to value in memory to be swapped with value if *ptr==comparand
+ * @param value value to assign *ptr to if *ptr==comparand
+ * @param comparand value to compare with *ptr
+ ( @return value originally in memory at ptr, regardless of success
+*/
+static inline int32_t __TBB_machine_cmpswp4(volatile void *ptr, int32_t value, int32_t comparand ){
+  int32_t result;
+  __asm__ __volatile__(
+                       "cas\t[%5],%4,%1"
+                       : "=m"(*(int32_t *)ptr), "=r"(result)
+                       : "m"(*(int32_t *)ptr), "1"(value), "r"(comparand), "r"(ptr)
+                       : "memory");
+  return result;
+}
+
+/**
+ * Atomic CAS for 64 bit values, if *ptr==comparand, then *ptr=value, returns *ptr
+ * @param ptr pointer to value in memory to be swapped with value if *ptr==comparand
+ * @param value value to assign *ptr to if *ptr==comparand
+ * @param comparand value to compare with *ptr
+ ( @return value originally in memory at ptr, regardless of success
+ */
+static inline int64_t __TBB_machine_cmpswp8(volatile void *ptr, int64_t value, int64_t comparand ){
+  int64_t result;
+  __asm__ __volatile__(
+                       "casx\t[%5],%4,%1"
+               : "=m"(*(int64_t *)ptr), "=r"(result)
+               : "m"(*(int64_t *)ptr), "1"(value), "r"(comparand), "r"(ptr)
+               : "memory");
+  return result;
+}
+
+//---------------------------------------------------
+// Fetch and add
+//---------------------------------------------------
+
+/**
+ * Atomic fetch and add for 32 bit values, in this case implemented by continuously checking success of atomicity
+ * @param ptr pointer to value to add addend to
+ * @param addened value to add to *ptr
+ * @return value at ptr before addened was added
+ */
+static inline int32_t __TBB_machine_fetchadd4(volatile void *ptr, int32_t addend){
+  int32_t result;
+  __asm__ __volatile__ (                                 
+                        "0:\t add\t %3, %4, %0\n"    // do addition
+                        "\t cas\t [%2], %3, %0\n"        // cas to store result in memory
+                        "\t cmp\t %3, %0\n"            // check if value from memory is original
+                        "\t bne,a,pn\t %%icc, 0b\n"        // if not try again
+                        "\t mov %0, %3\n"            // use branch delay slot to move new value in memory to be added
+               : "=&r"(result), "=m"(*(int32_t *)ptr)
+               : "r"(ptr), "r"(*(int32_t *)ptr), "r"(addend), "m"(*(int32_t *)ptr)
+               : "ccr", "memory");
+  return result;
+}
+
+/**
+ * Atomic fetch and add for 64 bit values, in this case implemented by continuously checking success of atomicity
+ * @param ptr pointer to value to add addend to
+ * @param addened value to add to *ptr
+ * @return value at ptr before addened was added
+ */
+static inline int64_t __TBB_machine_fetchadd8(volatile void *ptr, int64_t addend){
+  int64_t result;
+  __asm__ __volatile__ (
+                        "0:\t add\t %3, %4, %0\n"    // do addition
+                        "\t casx\t [%2], %3, %0\n"        // cas to store result in memory
+                        "\t cmp\t %3, %0\n"            // check if value from memory is original
+                        "\t bne,a,pn\t %%xcc, 0b\n"        // if not try again
+                        "\t mov %0, %3\n"            // use branch delay slot to move new value in memory to be added
+                : "=&r"(result), "=m"(*(int64_t *)ptr)
+                : "r"(ptr), "r"(*(int64_t *)ptr), "r"(addend), "m"(*(int64_t *)ptr)
+                : "ccr", "memory");
+  return result;
+}
+
+//--------------------------------------------------------
+// Logarithm (base two, integer)
+//--------------------------------------------------------
+
+static inline int64_t __TBB_machine_lg( uint64_t x ) {
+    uint64_t count;
+    // one hot encode
+    x |= (x >> 1);
+    x |= (x >> 2);
+    x |= (x >> 4);
+    x |= (x >> 8);
+    x |= (x >> 16);
+    x |= (x >> 32);
+    // count 1's
+    __asm__ ("popc %1, %0" : "=r"(count) : "r"(x) );
+    return count-1;
+}
+
+//--------------------------------------------------------
+
+static inline void __TBB_machine_or( volatile void *ptr, uint64_t addend ) {
+  __asm__ __volatile__ (
+                        "0:\t or\t %2, %3, %%g1\n" // do addition
+                        "\t casx\t [%1], %2, %%g1\n"            // cas to store result in memory
+                        "\t cmp\t %2, %%g1\n"                   // check if value from memory is original
+                        "\t bne,a,pn\t %%xcc, 0b\n" // if not try again
+                        "\t mov %%g1, %2\n"                     // use branch delay slot to move new value in memory to be added
+                : "=m"(*(int64_t *)ptr)
+                : "r"(ptr), "r"(*(int64_t *)ptr), "r"(addend), "m"(*(int64_t *)ptr)
+                : "ccr", "g1", "memory");
+}
+
+static inline void __TBB_machine_and( volatile void *ptr, uint64_t addend ) {
+  __asm__ __volatile__ (
+                        "0:\t and\t %2, %3, %%g1\n"        // do addition
+                        "\t casx\t [%1], %2, %%g1\n"            // cas to store result in memory
+                        "\t cmp\t %2, %%g1\n"                   // check if value from memory is original
+                        "\t bne,a,pn\t %%xcc, 0b\n"         // if not try again
+                        "\t mov %%g1, %2\n"                     // use branch delay slot to move new value in memory to be added
+                : "=m"(*(int64_t *)ptr)
+                : "r"(ptr), "r"(*(int64_t *)ptr), "r"(addend), "m"(*(int64_t *)ptr)
+                : "ccr", "g1", "memory");
+}
+
+
+static inline void __TBB_machine_pause( int32_t delay ) {
+    // do nothing, inlined, doesnt matter
+}
+
+// put 0xff in memory location, return memory value,
+//  generic trylockbyte puts 0x01, however this is fine
+//  because all that matters is that 0 is unlocked
+static inline bool __TBB_machine_trylockbyte(unsigned char &flag){
+    unsigned char result;
+    __asm__ __volatile__ (
+            "ldstub\t [%2], %0\n"
+        : "=r"(result), "=m"(flag)
+        : "r"(&flag), "m"(flag)
+        : "memory");
+    return result == 0;
+}
+
+
+// Machine specific atomic operations
+
+//#define __TBB_CompareAndSwap1(P,V,C) __TBB_machine_cmpswp1(P,V,C)  // use generic version in tbb_machine.h
+//#define __TBB_CompareAndSwap2(P,V,C) __TBB_machine_cmpswp2(P,V,C)  // use generic version in tbb_machine.h
+#define __TBB_CompareAndSwap4(P,V,C) __TBB_machine_cmpswp4(P,V,C)
+#define __TBB_CompareAndSwap8(P,V,C) __TBB_machine_cmpswp8(P,V,C)
+#define __TBB_CompareAndSwapW(P,V,C) __TBB_machine_cmpswp8(P,V,C)
+
+//#define __TBB_FetchAndAdd1(P,V) __TBB_machine_fetchadd1(P,V)       // use generic version in tbb_machine.h
+//#define __TBB_FetchAndAdd2(P,V) __TBB_machine_fetchadd2(P,V)       // use generic version in tbb_machine.h
+#define __TBB_FetchAndAdd4(P,V) __TBB_machine_fetchadd4(P,V)
+#define __TBB_FetchAndAdd8(P,V)  __TBB_machine_fetchadd8(P,V)
+#define __TBB_FetchAndAddW(P,V)  __TBB_machine_fetchadd8(P,V)
+
+// use generic version in tbb_machine.h
+//#define __TBB_FetchAndStore1(P,V) __TBB_machine_fetchstore1(P,V)  
+//#define __TBB_FetchAndStore2(P,V) __TBB_machine_fetchstore2(P,V)
+//#define __TBB_FetchAndStore4(P,V) __TBB_machine_fetchstore4(P,V)
+//#define __TBB_FetchAndStore8(P,V)  __TBB_machine_fetchstore8(P,V)
+//#define __TBB_FetchAndStoreW(P,V)  __TBB_machine_fetchstore8(P,V)
+
+#define __TBB_Store8(P,V) (*P = V)
+#define __TBB_Load8(P)    (*P)
+
+#define __TBB_AtomicOR(P,V) __TBB_machine_or(P,V)
+#define __TBB_AtomicAND(P,V) __TBB_machine_and(P,V)
+
+// Definition of other functions
+#define __TBB_Pause(V) __TBB_machine_pause(V)
+#define __TBB_Log2(V)    __TBB_machine_lg(V)
+
+// Special atomic functions
+#define __TBB_FetchAndAddWrelease(P,V) __TBB_FetchAndAddW(P,V)
+#define __TBB_FetchAndIncrementWacquire(P) __TBB_FetchAndAddW(P,1)
+#define __TBB_FetchAndDecrementWrelease(P) __TBB_FetchAndAddW(P,-1)
+
+// Definition of Lock functions
+// Repeatedly runs TryLockByte, no need to implement
+#undef __TBB_LockByte
+
+#define __TBB_TryLockByte(P) __TBB_machine_trylockbyte(P)
+
+#define __TBB_Yield() sched_yield()
diff --git a/tbb30_20100406oss/include/tbb/machine/windows_ia32.h b/tbb30_20100406oss/include/tbb/machine/windows_ia32.h
new file mode 100644 (file)
index 0000000..e6e3fc1
--- /dev/null
@@ -0,0 +1,243 @@
+/*
+    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB_machine_H
+#error Do not include this file directly; include tbb_machine.h instead
+#endif
+
+#if defined(__INTEL_COMPILER)
+#define __TBB_release_consistency_helper() __asm { __asm nop }
+#elif _MSC_VER >= 1300
+extern "C" void _ReadWriteBarrier();
+#pragma intrinsic(_ReadWriteBarrier)
+#define __TBB_release_consistency_helper() _ReadWriteBarrier()
+#else
+#error Unsupported compiler - need to define __TBB_release_consistency_helper to support it
+#endif
+
+inline void __TBB_rel_acq_fence() { __asm { __asm mfence } }
+
+#define __TBB_WORDSIZE 4
+#define __TBB_BIG_ENDIAN 0
+
+#if defined(_MSC_VER) && !defined(__INTEL_COMPILER)
+    // Workaround for overzealous compiler warnings in /Wp64 mode
+    #pragma warning (push)
+    #pragma warning (disable: 4244 4267)
+#endif
+
+extern "C" {
+    __int64 __TBB_EXPORTED_FUNC __TBB_machine_cmpswp8 (volatile void *ptr, __int64 value, __int64 comparand );
+    __int64 __TBB_EXPORTED_FUNC __TBB_machine_fetchadd8 (volatile void *ptr, __int64 addend );
+    __int64 __TBB_EXPORTED_FUNC __TBB_machine_fetchstore8 (volatile void *ptr, __int64 value );
+    void __TBB_EXPORTED_FUNC __TBB_machine_store8 (volatile void *ptr, __int64 value );
+    __int64 __TBB_EXPORTED_FUNC __TBB_machine_load8 (const volatile void *ptr);
+}
+
+template <typename T, size_t S>
+struct __TBB_machine_load_store {
+    static inline T load_with_acquire(const volatile T& location) {
+        T to_return = location;
+        __TBB_release_consistency_helper();
+        return to_return;
+    }
+
+    static inline void store_with_release(volatile T &location, T value) {
+        __TBB_release_consistency_helper();
+        location = value;
+    }
+};
+
+template <typename T>
+struct __TBB_machine_load_store<T,8> {
+    static inline T load_with_acquire(const volatile T& location) {
+        return __TBB_machine_load8((volatile void *)&location);
+    }
+
+    static inline void store_with_release(T &location, T value) {
+        __TBB_machine_store8((volatile void *)&location,(__int64)value);
+    }
+};
+
+template<typename T>
+inline T __TBB_machine_load_with_acquire(const volatile T &location) {
+    return __TBB_machine_load_store<T,sizeof(T)>::load_with_acquire(location);
+}
+
+template<typename T, typename V>
+inline void __TBB_machine_store_with_release(T& location, V value) {
+    __TBB_machine_load_store<T,sizeof(T)>::store_with_release(location,value);
+}
+
+//! Overload that exists solely to avoid /Wp64 warnings.
+inline void __TBB_machine_store_with_release(size_t& location, size_t value) {
+    __TBB_machine_load_store<size_t,sizeof(size_t)>::store_with_release(location,value);
+} 
+
+#define __TBB_load_with_acquire(L) __TBB_machine_load_with_acquire((L))
+#define __TBB_store_with_release(L,V) __TBB_machine_store_with_release((L),(V))
+
+#define __TBB_DEFINE_ATOMICS(S,T,U,A,C) \
+static inline T __TBB_machine_cmpswp##S ( volatile void * ptr, U value, U comparand ) { \
+    T result; \
+    volatile T *p = (T *)ptr; \
+    __TBB_release_consistency_helper(); \
+    __asm \
+    { \
+       __asm mov edx, p \
+       __asm mov C , value \
+       __asm mov A , comparand \
+       __asm lock cmpxchg [edx], C \
+       __asm mov result, A \
+    } \
+    __TBB_release_consistency_helper(); \
+    return result; \
+} \
+\
+static inline T __TBB_machine_fetchadd##S ( volatile void * ptr, U addend ) { \
+    T result; \
+    volatile T *p = (T *)ptr; \
+    __TBB_release_consistency_helper(); \
+    __asm \
+    { \
+        __asm mov edx, p \
+        __asm mov A, addend \
+        __asm lock xadd [edx], A \
+        __asm mov result, A \
+    } \
+    __TBB_release_consistency_helper(); \
+    return result; \
+}\
+\
+static inline T __TBB_machine_fetchstore##S ( volatile void * ptr, U value ) { \
+    T result; \
+    volatile T *p = (T *)ptr; \
+    __TBB_release_consistency_helper(); \
+    __asm \
+    { \
+        __asm mov edx, p \
+        __asm mov A, value \
+        __asm lock xchg [edx], A \
+        __asm mov result, A \
+    } \
+    __TBB_release_consistency_helper(); \
+    return result; \
+}
+
+__TBB_DEFINE_ATOMICS(1, __int8, __int8, al, cl)
+__TBB_DEFINE_ATOMICS(2, __int16, __int16, ax, cx)
+__TBB_DEFINE_ATOMICS(4, __int32, __int32, eax, ecx)
+__TBB_DEFINE_ATOMICS(W, ptrdiff_t, ptrdiff_t, eax, ecx)
+
+static inline __int32 __TBB_machine_lg( unsigned __int64 i ) {
+    unsigned __int32 j;
+    __asm
+    {
+        bsr eax, i
+        mov j, eax
+    }
+    return j;
+}
+
+static inline void __TBB_machine_OR( volatile void *operand, __int32 addend ) {
+   __asm 
+   {
+       mov eax, addend
+       mov edx, [operand]
+       lock or [edx], eax
+   }
+}
+
+static inline void __TBB_machine_AND( volatile void *operand, __int32 addend ) {
+   __asm 
+   {
+       mov eax, addend
+       mov edx, [operand]
+       lock and [edx], eax
+   }
+}
+
+static inline void __TBB_machine_pause (__int32 delay ) {
+    _asm 
+    {
+        mov eax, delay
+      L1: 
+        pause
+        add eax, -1
+        jne L1  
+    }
+    return;
+}
+
+#define __TBB_CompareAndSwap1(P,V,C) __TBB_machine_cmpswp1(P,V,C)
+#define __TBB_CompareAndSwap2(P,V,C) __TBB_machine_cmpswp2(P,V,C)
+#define __TBB_CompareAndSwap4(P,V,C) __TBB_machine_cmpswp4(P,V,C)
+#define __TBB_CompareAndSwap8(P,V,C) __TBB_machine_cmpswp8(P,V,C)
+#define __TBB_CompareAndSwapW(P,V,C) __TBB_machine_cmpswpW(P,V,C)
+
+#define __TBB_FetchAndAdd1(P,V) __TBB_machine_fetchadd1(P,V)
+#define __TBB_FetchAndAdd2(P,V) __TBB_machine_fetchadd2(P,V)
+#define __TBB_FetchAndAdd4(P,V) __TBB_machine_fetchadd4(P,V)
+#define __TBB_FetchAndAdd8(P,V) __TBB_machine_fetchadd8(P,V)
+#define __TBB_FetchAndAddW(P,V) __TBB_machine_fetchaddW(P,V)
+
+#define __TBB_FetchAndStore1(P,V) __TBB_machine_fetchstore1(P,V)
+#define __TBB_FetchAndStore2(P,V) __TBB_machine_fetchstore2(P,V)
+#define __TBB_FetchAndStore4(P,V) __TBB_machine_fetchstore4(P,V)
+#define __TBB_FetchAndStore8(P,V) __TBB_machine_fetchstore8(P,V)
+#define __TBB_FetchAndStoreW(P,V) __TBB_machine_fetchstoreW(P,V)
+
+// Should define this: 
+#define __TBB_Store8(P,V) __TBB_machine_store8(P,V)
+#define __TBB_Load8(P) __TBB_machine_load8(P)
+#define __TBB_AtomicOR(P,V) __TBB_machine_OR(P,V)
+#define __TBB_AtomicAND(P,V) __TBB_machine_AND(P,V)
+
+// Definition of other functions
+extern "C" __declspec(dllimport) int __stdcall SwitchToThread( void );
+#define __TBB_Yield()  SwitchToThread()
+#define __TBB_Pause(V) __TBB_machine_pause(V)
+#define __TBB_Log2(V)    __TBB_machine_lg(V)
+
+// Use generic definitions from tbb_machine.h
+#undef __TBB_TryLockByte
+#undef __TBB_LockByte
+
+#if defined(_MSC_VER)&&_MSC_VER<1400
+    static inline void* __TBB_machine_get_current_teb () {
+        void* pteb;
+        __asm mov eax, fs:[0x18]
+        __asm mov pteb, eax
+        return pteb;
+    }
+#endif
+
+#if defined(_MSC_VER) && !defined(__INTEL_COMPILER)
+    #pragma warning (pop)
+#endif // warnings 4244, 4267 are back
+
diff --git a/tbb30_20100406oss/include/tbb/machine/windows_intel64.h b/tbb30_20100406oss/include/tbb/machine/windows_intel64.h
new file mode 100644 (file)
index 0000000..8f9b746
--- /dev/null
@@ -0,0 +1,132 @@
+/*
+    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB_machine_H
+#error Do not include this file directly; include tbb_machine.h instead
+#endif
+
+#include <intrin.h>
+#if !defined(__INTEL_COMPILER)
+#pragma intrinsic(_InterlockedOr64)
+#pragma intrinsic(_InterlockedAnd64)
+#pragma intrinsic(_InterlockedCompareExchange)
+#pragma intrinsic(_InterlockedCompareExchange64)
+#pragma intrinsic(_InterlockedExchangeAdd)
+#pragma intrinsic(_InterlockedExchangeAdd64)
+#pragma intrinsic(_InterlockedExchange)
+#pragma intrinsic(_InterlockedExchange64)
+#endif /* !defined(__INTEL_COMPILER) */
+
+#if defined(__INTEL_COMPILER)
+#define __TBB_release_consistency_helper() __asm { __asm nop }
+inline void __TBB_rel_acq_fence() { __asm { __asm mfence } }
+#elif _MSC_VER >= 1300
+extern "C" void _ReadWriteBarrier();
+#pragma intrinsic(_ReadWriteBarrier)
+#define __TBB_release_consistency_helper() _ReadWriteBarrier()
+#pragma intrinsic(_mm_mfence)
+inline void __TBB_rel_acq_fence() { _mm_mfence(); }
+#endif
+
+#define __TBB_WORDSIZE 8
+#define __TBB_BIG_ENDIAN 0
+
+// ATTENTION: if you ever change argument types in machine-specific primitives,
+// please take care of atomic_word<> specializations in tbb/atomic.h
+extern "C" {
+    __int8 __TBB_EXPORTED_FUNC __TBB_machine_cmpswp1 (volatile void *ptr, __int8 value, __int8 comparand );
+    __int8 __TBB_EXPORTED_FUNC __TBB_machine_fetchadd1 (volatile void *ptr, __int8 addend );
+    __int8 __TBB_EXPORTED_FUNC __TBB_machine_fetchstore1 (volatile void *ptr, __int8 value );
+    __int16 __TBB_EXPORTED_FUNC __TBB_machine_cmpswp2 (volatile void *ptr, __int16 value, __int16 comparand );
+    __int16 __TBB_EXPORTED_FUNC __TBB_machine_fetchadd2 (volatile void *ptr, __int16 addend );
+    __int16 __TBB_EXPORTED_FUNC __TBB_machine_fetchstore2 (volatile void *ptr, __int16 value );
+    void __TBB_EXPORTED_FUNC __TBB_machine_pause (__int32 delay );
+}
+
+
+#if !__INTEL_COMPILER
+extern "C" unsigned char _BitScanReverse64( unsigned long* i, unsigned __int64 w );
+#pragma intrinsic(_BitScanReverse64)
+#endif
+
+inline __int64 __TBB_machine_lg( unsigned __int64 i ) {
+#if __INTEL_COMPILER
+    unsigned __int64 j;
+    __asm
+    {
+        bsr rax, i
+        mov j, rax
+    }
+#else
+    unsigned long j;
+    _BitScanReverse64( &j, i );
+#endif
+    return j;
+}
+
+inline void __TBB_machine_OR( volatile void *operand, intptr_t addend ) {
+    _InterlockedOr64((__int64*)operand, addend); 
+}
+
+inline void __TBB_machine_AND( volatile void *operand, intptr_t addend ) {
+    _InterlockedAnd64((__int64*)operand, addend); 
+}
+
+#define __TBB_CompareAndSwap1(P,V,C) __TBB_machine_cmpswp1(P,V,C)
+#define __TBB_CompareAndSwap2(P,V,C) __TBB_machine_cmpswp2(P,V,C)
+#define __TBB_CompareAndSwap4(P,V,C) _InterlockedCompareExchange( (long*) P , V , C ) 
+#define __TBB_CompareAndSwap8(P,V,C) _InterlockedCompareExchange64( (__int64*) P , V , C )
+#define __TBB_CompareAndSwapW(P,V,C) _InterlockedCompareExchange64( (__int64*) P , V , C )
+
+#define __TBB_FetchAndAdd1(P,V) __TBB_machine_fetchadd1(P,V)
+#define __TBB_FetchAndAdd2(P,V) __TBB_machine_fetchadd2(P,V)
+#define __TBB_FetchAndAdd4(P,V) _InterlockedExchangeAdd((long*) P , V )
+#define __TBB_FetchAndAdd8(P,V) _InterlockedExchangeAdd64((__int64*) P , V )
+#define __TBB_FetchAndAddW(P,V) _InterlockedExchangeAdd64((__int64*) P , V )
+
+#define __TBB_FetchAndStore1(P,V) __TBB_machine_fetchstore1(P,V)
+#define __TBB_FetchAndStore2(P,V) __TBB_machine_fetchstore2(P,V)
+#define __TBB_FetchAndStore4(P,V) _InterlockedExchange((long*) P , V )
+#define __TBB_FetchAndStore8(P,V) _InterlockedExchange64((__int64*) P , V )
+#define __TBB_FetchAndStoreW(P,V) _InterlockedExchange64((__int64*) P , V ) 
+
+// Not used if wordsize == 8
+#undef __TBB_Store8
+#undef __TBB_Load8
+
+#define __TBB_AtomicOR(P,V) __TBB_machine_OR(P,V)
+#define __TBB_AtomicAND(P,V) __TBB_machine_AND(P,V)
+
+extern "C" __declspec(dllimport) int __stdcall SwitchToThread( void );
+#define __TBB_Yield()  SwitchToThread()
+#define __TBB_Pause(V) __TBB_machine_pause(V)
+#define __TBB_Log2(V)    __TBB_machine_lg(V)
+
+// Use generic definitions from tbb_machine.h
+#undef __TBB_TryLockByte
+#undef __TBB_LockByte
diff --git a/tbb30_20100406oss/include/tbb/machine/xbox360_ppc.h b/tbb30_20100406oss/include/tbb/machine/xbox360_ppc.h
new file mode 100644 (file)
index 0000000..0a3b2ef
--- /dev/null
@@ -0,0 +1,85 @@
+/*
+    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB_machine_H
+#error Do not include this file directly; include tbb_machine.h instead
+#endif
+
+#define NONET
+#define NOD3D
+#include "xtl.h"    
+#include "ppcintrinsics.h"
+
+#if _MSC_VER >= 1300
+extern "C" void _ReadWriteBarrier();
+#pragma intrinsic(_ReadWriteBarrier)
+#define __TBB_release_consistency_helper() _ReadWriteBarrier()
+#endif
+
+inline void __TBB_rel_acq_fence() { __lwsync(); }
+
+#define __TBB_WORDSIZE 4
+#define __TBB_BIG_ENDIAN 1
+
+//todo: define __TBB_DECL_FENCED_ATOMICS and define acquire/release primitives to maximize performance
+
+typedef __int64 int64_t;  //required for definition of Store8/Load8 in atomic.h
+typedef unsigned char uint8_t;  //same reason
+
+inline __int32 __TBB_machine_cmpswp4(volatile void *ptr, __int32 value, __int32 comparand )
+{                               
+ __lwsync();
+ __int32 result = InterlockedCompareExchange((volatile LONG*)ptr, value, comparand);
+ __lwsync();
+ return result;
+}
+
+inline __int64 __TBB_machine_cmpswp8(volatile void *ptr, __int64 value, __int64 comparand )
+{
+ __lwsync();
+ __int64 result = InterlockedCompareExchange64((volatile LONG64*)ptr, value, comparand);
+ __lwsync();
+ return result;
+}
+
+#pragma optimize( "", off )
+inline void __TBB_machine_pause (__int32 delay ) 
+{
+ for (__int32 i=0; i<delay; i++) {;};
+}
+#pragma optimize( "", on ) 
+
+
+#define __TBB_CompareAndSwap4(P,V,C) __TBB_machine_cmpswp4(P,V,C)
+#define __TBB_CompareAndSwap8(P,V,C) __TBB_machine_cmpswp8(P,V,C)
+#define __TBB_CompareAndSwapW(P,V,C) __TBB_machine_cmpswp4(P,V,C)
+#define __TBB_Yield()  Sleep(0)
+#define __TBB_Pause(V) __TBB_machine_pause(V)
+#define __TBB_fence_for_acquire() __lwsync()
+#define __TBB_fence_for_release() __lwsync()
+
diff --git a/tbb30_20100406oss/include/tbb/mutex.h b/tbb30_20100406oss/include/tbb/mutex.h
new file mode 100644 (file)
index 0000000..f42bf2d
--- /dev/null
@@ -0,0 +1,245 @@
+/*
+    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB_mutex_H
+#define __TBB_mutex_H
+
+#if _WIN32||_WIN64
+    #include <windows.h>
+    #if !defined(_WIN32_WINNT)
+    // The following Windows API function is declared explicitly;
+    // otherwise any user would have to specify /D_WIN32_WINNT=0x0400
+    extern "C" BOOL WINAPI TryEnterCriticalSection( LPCRITICAL_SECTION );
+    #endif
+#else /* if not _WIN32||_WIN64 */
+    #include <pthread.h>
+#endif /* _WIN32||_WIN64 */
+
+#include <new>
+#include "aligned_space.h"
+#include "tbb_stddef.h"
+#include "tbb_profiling.h"
+
+namespace tbb {
+
+//! Wrapper around the platform's native reader-writer lock.
+/** For testing purposes only.
+    @ingroup synchronization */
+class mutex {
+public:
+    //! Construct unacquired mutex.
+    mutex() {
+#if TBB_USE_ASSERT || TBB_USE_THREADING_TOOLS
+    internal_construct();
+#else
+  #if _WIN32||_WIN64
+        InitializeCriticalSection(&impl);
+  #else
+        int error_code = pthread_mutex_init(&impl,NULL);
+        if( error_code )
+            tbb::internal::handle_perror(error_code,"mutex: pthread_mutex_init failed");
+  #endif /* _WIN32||_WIN64*/
+#endif /* TBB_USE_ASSERT */
+    };
+
+    ~mutex() {
+#if TBB_USE_ASSERT
+        internal_destroy();
+#else
+  #if _WIN32||_WIN64
+        DeleteCriticalSection(&impl);
+  #else
+        pthread_mutex_destroy(&impl); 
+
+  #endif /* _WIN32||_WIN64 */
+#endif /* TBB_USE_ASSERT */
+    };
+
+    class scoped_lock;
+    friend class scoped_lock;
+
+    //! The scoped locking pattern
+    /** It helps to avoid the common problem of forgetting to release lock.
+        It also nicely provides the "node" for queuing locks. */
+    class scoped_lock : internal::no_copy {
+    public:
+        //! Construct lock that has not acquired a mutex. 
+        scoped_lock() : my_mutex(NULL) {};
+
+        //! Acquire lock on given mutex.
+        scoped_lock( mutex& mutex ) {
+            acquire( mutex );
+        }
+
+        //! Release lock (if lock is held).
+        ~scoped_lock() {
+            if( my_mutex ) 
+                release();
+        }
+
+        //! Acquire lock on given mutex.
+        void acquire( mutex& mutex ) {
+#if TBB_USE_ASSERT
+            internal_acquire(mutex);
+#else
+            mutex.lock();
+            my_mutex = &mutex;
+#endif /* TBB_USE_ASSERT */
+        }
+
+        //! Try acquire lock on given mutex.
+        bool try_acquire( mutex& mutex ) {
+#if TBB_USE_ASSERT
+            return internal_try_acquire (mutex);
+#else
+            bool result = mutex.try_lock();
+            if( result )
+                my_mutex = &mutex;
+            return result;
+#endif /* TBB_USE_ASSERT */
+        }
+
+        //! Release lock
+        void release() {
+#if TBB_USE_ASSERT
+            internal_release ();
+#else
+            my_mutex->unlock();
+            my_mutex = NULL;
+#endif /* TBB_USE_ASSERT */
+        }
+
+    private:
+        //! The pointer to the current mutex to work
+        mutex* my_mutex;
+
+        //! All checks from acquire using mutex.state were moved here
+        void __TBB_EXPORTED_METHOD internal_acquire( mutex& m );
+
+        //! All checks from try_acquire using mutex.state were moved here
+        bool __TBB_EXPORTED_METHOD internal_try_acquire( mutex& m );
+
+        //! All checks from release using mutex.state were moved here
+        void __TBB_EXPORTED_METHOD internal_release();
+
+        friend class mutex;
+    };
+
+    // Mutex traits
+    static const bool is_rw_mutex = false;
+    static const bool is_recursive_mutex = false;
+    static const bool is_fair_mutex = false;
+
+    // ISO C++0x compatibility methods
+
+    //! Acquire lock
+    void lock() {
+#if TBB_USE_ASSERT
+        aligned_space<scoped_lock,1> tmp;
+        new(tmp.begin()) scoped_lock(*this);
+#else
+  #if _WIN32||_WIN64
+        EnterCriticalSection(&impl);
+  #else
+        pthread_mutex_lock(&impl);
+  #endif /* _WIN32||_WIN64 */
+#endif /* TBB_USE_ASSERT */
+    }
+
+    //! Try acquiring lock (non-blocking)
+    /** Return true if lock acquired; false otherwise. */
+    bool try_lock() {
+#if TBB_USE_ASSERT
+        aligned_space<scoped_lock,1> tmp;
+        scoped_lock& s = *tmp.begin();
+        s.my_mutex = NULL;
+        return s.internal_try_acquire(*this);
+#else
+  #if _WIN32||_WIN64
+        return TryEnterCriticalSection(&impl)!=0;
+  #else
+        return pthread_mutex_trylock(&impl)==0;
+  #endif /* _WIN32||_WIN64 */
+#endif /* TBB_USE_ASSERT */
+    }
+
+    //! Release lock
+    void unlock() {
+#if TBB_USE_ASSERT
+        aligned_space<scoped_lock,1> tmp;
+        scoped_lock& s = *tmp.begin();
+        s.my_mutex = this;
+        s.internal_release();
+#else
+  #if _WIN32||_WIN64
+        LeaveCriticalSection(&impl);
+  #else
+        pthread_mutex_unlock(&impl);
+  #endif /* _WIN32||_WIN64 */
+#endif /* TBB_USE_ASSERT */
+    }
+
+    //! Return native_handle
+  #if _WIN32||_WIN64
+    typedef LPCRITICAL_SECTION native_handle_type;
+  #else
+    typedef pthread_mutex_t* native_handle_type;
+  #endif
+    native_handle_type native_handle() { return (native_handle_type) &impl; }
+
+    enum state_t {
+        INITIALIZED=0x1234,
+        DESTROYED=0x789A,
+        HELD=0x56CD
+    };
+private:
+#if _WIN32||_WIN64
+    CRITICAL_SECTION impl;    
+    enum state_t state;
+#else
+    pthread_mutex_t impl;
+#endif /* _WIN32||_WIN64 */
+
+    //! All checks from mutex constructor using mutex.state were moved here
+    void __TBB_EXPORTED_METHOD internal_construct();
+
+    //! All checks from mutex destructor using mutex.state were moved here
+    void __TBB_EXPORTED_METHOD internal_destroy();
+
+#if _WIN32||_WIN64
+public:
+    //!  Set the internal state
+    void set_state( state_t to ) { state = to; }
+#endif
+};
+
+__TBB_DEFINE_PROFILING_SET_NAME(mutex)
+
+} // namespace tbb 
+
+#endif /* __TBB_mutex_H */
diff --git a/tbb30_20100406oss/include/tbb/null_mutex.h b/tbb30_20100406oss/include/tbb/null_mutex.h
new file mode 100644 (file)
index 0000000..67aabd5
--- /dev/null
@@ -0,0 +1,63 @@
+/*
+    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB_null_mutex_H
+#define __TBB_null_mutex_H
+
+namespace tbb {
+    
+//! A mutex which does nothing
+/** A null_mutex does no operation and simulates success.
+    @ingroup synchronization */
+class null_mutex {   
+    //! Deny assignment and copy construction 
+    null_mutex( const null_mutex& );   
+    void operator=( const null_mutex& );   
+public:   
+    //! Represents acquisition of a mutex.
+    class scoped_lock {   
+    public:   
+        scoped_lock() {}
+        scoped_lock( null_mutex& ) {}   
+        ~scoped_lock() {}
+        void acquire( null_mutex& ) {}
+        bool try_acquire( null_mutex& ) { return true; }
+        void release() {}
+    };
+  
+    null_mutex() {}
+    
+    // Mutex traits   
+    static const bool is_rw_mutex = false;   
+    static const bool is_recursive_mutex = true;
+    static const bool is_fair_mutex = true;
+};  
+
+}
+
+#endif /* __TBB_null_mutex_H */
diff --git a/tbb30_20100406oss/include/tbb/null_rw_mutex.h b/tbb30_20100406oss/include/tbb/null_rw_mutex.h
new file mode 100644 (file)
index 0000000..2462389
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB_null_rw_mutex_H
+#define __TBB_null_rw_mutex_H
+
+namespace tbb {
+    
+//! A rw mutex which does nothing
+/** A null_rw_mutex is a rw mutex that does nothing and simulates successful operation.
+    @ingroup synchronization */
+class null_rw_mutex {
+    //! Deny assignment and copy construction 
+    null_rw_mutex( const null_rw_mutex& );   
+    void operator=( const null_rw_mutex& );   
+public:   
+    //! Represents acquisition of a mutex.
+    class scoped_lock {   
+    public:   
+        scoped_lock() {}
+        scoped_lock( null_rw_mutex& , bool = true ) {}
+        ~scoped_lock() {}
+        void acquire( null_rw_mutex& , bool = true ) {}
+        bool upgrade_to_writer() { return true; }
+        bool downgrade_to_reader() { return true; }
+        bool try_acquire( null_rw_mutex& , bool = true ) { return true; }
+        void release() {}
+    };
+  
+    null_rw_mutex() {}
+    
+    // Mutex traits   
+    static const bool is_rw_mutex = true;   
+    static const bool is_recursive_mutex = true;
+    static const bool is_fair_mutex = true;
+};  
+
+}
+
+#endif /* __TBB_null_rw_mutex_H */
diff --git a/tbb30_20100406oss/include/tbb/parallel_do.h b/tbb30_20100406oss/include/tbb/parallel_do.h
new file mode 100644 (file)
index 0000000..6f91f72
--- /dev/null
@@ -0,0 +1,508 @@
+/*
+    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB_parallel_do_H
+#define __TBB_parallel_do_H
+
+#include "task.h"
+#include "aligned_space.h"
+#include <iterator>
+
+namespace tbb {
+
+//! @cond INTERNAL
+namespace internal {
+    template<typename Body, typename Item> class parallel_do_feeder_impl;
+    template<typename Body> class do_group_task;
+
+    //! Strips its template type argument from 'cv' and '&' qualifiers
+    template<typename T>
+    struct strip { typedef T type; };
+    template<typename T>
+    struct strip<T&> { typedef T type; };
+    template<typename T>
+    struct strip<const T&> { typedef T type; };
+    template<typename T>
+    struct strip<volatile T&> { typedef T type; };
+    template<typename T>
+    struct strip<const volatile T&> { typedef T type; };
+    // Most of the compilers remove cv-qualifiers from non-reference function argument types. 
+    // But unfortunately there are those that don't.
+    template<typename T>
+    struct strip<const T> { typedef T type; };
+    template<typename T>
+    struct strip<volatile T> { typedef T type; };
+    template<typename T>
+    struct strip<const volatile T> { typedef T type; };
+} // namespace internal
+//! @endcond
+
+//! Class the user supplied algorithm body uses to add new tasks
+/** \param Item Work item type **/
+template<typename Item>
+class parallel_do_feeder: internal::no_copy
+{
+    parallel_do_feeder() {}
+    virtual ~parallel_do_feeder () {}
+    virtual void internal_add( const Item& item ) = 0;
+    template<typename Body_, typename Item_> friend class internal::parallel_do_feeder_impl;
+public:
+    //! Add a work item to a running parallel_do.
+    void add( const Item& item ) {internal_add(item);}
+};
+
+//! @cond INTERNAL
+namespace internal {
+    //! For internal use only.
+    /** Selects one of the two possible forms of function call member operator.
+        @ingroup algorithms **/
+    template<class Body, typename Item>
+    class parallel_do_operator_selector
+    {
+        typedef parallel_do_feeder<Item> Feeder;
+        template<typename A1, typename A2, typename CvItem >
+        static void internal_call( const Body& obj, A1& arg1, A2&, void (Body::*)(CvItem) const ) {
+            obj(arg1);
+        }
+        template<typename A1, typename A2, typename CvItem >
+        static void internal_call( const Body& obj, A1& arg1, A2& arg2, void (Body::*)(CvItem, parallel_do_feeder<Item>&) const ) {
+            obj(arg1, arg2);
+        }
+
+    public:
+        template<typename A1, typename A2 >
+        static void call( const Body& obj, A1& arg1, A2& arg2 )
+        {
+            internal_call( obj, arg1, arg2, &Body::operator() );
+        }
+    };
+
+    //! For internal use only.
+    /** Executes one iteration of a do.
+        @ingroup algorithms */
+    template<typename Body, typename Item>
+    class do_iteration_task: public task
+    {
+        typedef parallel_do_feeder_impl<Body, Item> feeder_type;
+
+        Item my_value;
+        feeder_type& my_feeder;
+
+        do_iteration_task( const Item& value, feeder_type& feeder ) : 
+            my_value(value), my_feeder(feeder)
+        {}
+
+        /*override*/ 
+        task* execute()
+        {
+            parallel_do_operator_selector<Body, Item>::call(*my_feeder.my_body, my_value, my_feeder);
+            return NULL;
+        }
+
+        template<typename Body_, typename Item_> friend class parallel_do_feeder_impl;
+    }; // class do_iteration_task
+
+    template<typename Iterator, typename Body, typename Item>
+    class do_iteration_task_iter: public task
+    {
+        typedef parallel_do_feeder_impl<Body, Item> feeder_type;
+
+        Iterator my_iter;
+        feeder_type& my_feeder;
+
+        do_iteration_task_iter( const Iterator& iter, feeder_type& feeder ) : 
+            my_iter(iter), my_feeder(feeder)
+        {}
+
+        /*override*/ 
+        task* execute()
+        {
+            parallel_do_operator_selector<Body, Item>::call(*my_feeder.my_body, *my_iter, my_feeder);
+            return NULL;
+        }
+
+        template<typename Iterator_, typename Body_, typename Item_> friend class do_group_task_forward;    
+        template<typename Body_, typename Item_> friend class do_group_task_input;    
+        template<typename Iterator_, typename Body_, typename Item_> friend class do_task_iter;    
+    }; // class do_iteration_task_iter
+
+    //! For internal use only.
+    /** Implements new task adding procedure.
+        @ingroup algorithms **/
+    template<class Body, typename Item>
+    class parallel_do_feeder_impl : public parallel_do_feeder<Item>
+    {
+        /*override*/ 
+        void internal_add( const Item& item )
+        {
+            typedef do_iteration_task<Body, Item> iteration_type;
+
+            iteration_type& t = *new (task::allocate_additional_child_of(*my_barrier)) iteration_type(item, *this);
+
+            t.spawn( t );
+        }
+    public:
+        const Body* my_body;
+        empty_task* my_barrier;
+
+        parallel_do_feeder_impl()
+        {
+            my_barrier = new( task::allocate_root() ) empty_task();
+            __TBB_ASSERT(my_barrier, "root task allocation failed");
+        }
+
+#if __TBB_TASK_GROUP_CONTEXT
+        parallel_do_feeder_impl(tbb::task_group_context &context)
+        {
+            my_barrier = new( task::allocate_root(context) ) empty_task();
+            __TBB_ASSERT(my_barrier, "root task allocation failed");
+        }
+#endif
+
+        ~parallel_do_feeder_impl()
+        {
+            my_barrier->destroy(*my_barrier);
+        }
+    }; // class parallel_do_feeder_impl
+
+
+    //! For internal use only
+    /** Unpacks a block of iterations.
+        @ingroup algorithms */
+    
+    template<typename Iterator, typename Body, typename Item>
+    class do_group_task_forward: public task
+    {
+        static const size_t max_arg_size = 4;         
+
+        typedef parallel_do_feeder_impl<Body, Item> feeder_type;
+
+        feeder_type& my_feeder;
+        Iterator my_first;
+        size_t my_size;
+        
+        do_group_task_forward( Iterator first, size_t size, feeder_type& feeder ) 
+            : my_feeder(feeder), my_first(first), my_size(size)
+        {}
+
+        /*override*/ task* execute()
+        {
+            typedef do_iteration_task_iter<Iterator, Body, Item> iteration_type;
+            __TBB_ASSERT( my_size>0, NULL );
+            task_list list;
+            task* t; 
+            size_t k=0; 
+            for(;;) {
+                t = new( allocate_child() ) iteration_type( my_first, my_feeder );
+                ++my_first;
+                if( ++k==my_size ) break;
+                list.push_back(*t);
+            }
+            set_ref_count(int(k+1));
+            spawn(list);
+            spawn_and_wait_for_all(*t);
+            return NULL;
+        }
+
+        template<typename Iterator_, typename Body_, typename _Item> friend class do_task_iter;
+    }; // class do_group_task_forward
+
+    template<typename Body, typename Item>
+    class do_group_task_input: public task
+    {
+        static const size_t max_arg_size = 4;         
+        
+        typedef parallel_do_feeder_impl<Body, Item> feeder_type;
+
+        feeder_type& my_feeder;
+        size_t my_size;
+        aligned_space<Item, max_arg_size> my_arg;
+
+        do_group_task_input( feeder_type& feeder ) 
+            : my_feeder(feeder), my_size(0)
+        {}
+
+        /*override*/ task* execute()
+        {
+            typedef do_iteration_task_iter<Item*, Body, Item> iteration_type;
+            __TBB_ASSERT( my_size>0, NULL );
+            task_list list;
+            task* t; 
+            size_t k=0; 
+            for(;;) {
+                t = new( allocate_child() ) iteration_type( my_arg.begin() + k, my_feeder );
+                if( ++k==my_size ) break;
+                list.push_back(*t);
+            }
+            set_ref_count(int(k+1));
+            spawn(list);
+            spawn_and_wait_for_all(*t);
+            return NULL;
+        }
+
+        ~do_group_task_input(){
+            for( size_t k=0; k<my_size; ++k)
+                (my_arg.begin() + k)->~Item();
+        }
+
+        template<typename Iterator_, typename Body_, typename Item_> friend class do_task_iter;
+    }; // class do_group_task_input
+    
+    //! For internal use only.
+    /** Gets block of iterations and packages them into a do_group_task.
+        @ingroup algorithms */
+    template<typename Iterator, typename Body, typename Item>
+    class do_task_iter: public task
+    {
+        typedef parallel_do_feeder_impl<Body, Item> feeder_type;
+
+    public:
+        do_task_iter( Iterator first, Iterator last , feeder_type& feeder ) : 
+            my_first(first), my_last(last), my_feeder(feeder)
+        {}
+
+    private:
+        Iterator my_first;
+        Iterator my_last;
+        feeder_type& my_feeder;
+
+        /* Do not merge run(xxx) and run_xxx() methods. They are separated in order
+            to make sure that compilers will eliminate unused argument of type xxx
+            (that is will not put it on stack). The sole purpose of this argument 
+            is overload resolution.
+            
+            An alternative could be using template functions, but explicit specialization 
+            of member function templates is not supported for non specialized class 
+            templates. Besides template functions would always fall back to the least 
+            efficient variant (the one for input iterators) in case of iterators having 
+            custom tags derived from basic ones. */
+        /*override*/ task* execute()
+        {
+            typedef typename std::iterator_traits<Iterator>::iterator_category iterator_tag;
+            return run( (iterator_tag*)NULL );
+        }
+
+        /** This is the most restricted variant that operates on input iterators or
+            iterators with unknown tags (tags not derived from the standard ones). **/
+        inline task* run( void* ) { return run_for_input_iterator(); }
+        
+        task* run_for_input_iterator() {
+            typedef do_group_task_input<Body, Item> block_type;
+
+            block_type& t = *new( allocate_additional_child_of(*my_feeder.my_barrier) ) block_type(my_feeder);
+            size_t k=0; 
+            while( !(my_first == my_last) ) {
+                new (t.my_arg.begin() + k) Item(*my_first);
+                ++my_first;
+                if( ++k==block_type::max_arg_size ) {
+                    if ( !(my_first == my_last) )
+                        recycle_to_reexecute();
+                    break;
+                }
+            }
+            if( k==0 ) {
+                destroy(t);
+                return NULL;
+            } else {
+                t.my_size = k;
+                return &t;
+            }
+        }
+
+        inline task* run( std::forward_iterator_tag* ) { return run_for_forward_iterator(); }
+
+        task* run_for_forward_iterator() {
+            typedef do_group_task_forward<Iterator, Body, Item> block_type;
+
+            Iterator first = my_first;
+            size_t k=0; 
+            while( !(my_first==my_last) ) {
+                ++my_first;
+                if( ++k==block_type::max_arg_size ) {
+                    if ( !(my_first==my_last) )
+                        recycle_to_reexecute();
+                    break;
+                }
+            }
+            return k==0 ? NULL : new( allocate_additional_child_of(*my_feeder.my_barrier) ) block_type(first, k, my_feeder);
+        }
+        
+        inline task* run( std::random_access_iterator_tag* ) { return run_for_random_access_iterator(); }
+
+        task* run_for_random_access_iterator() {
+            typedef do_group_task_forward<Iterator, Body, Item> block_type;
+            typedef do_iteration_task_iter<Iterator, Body, Item> iteration_type;
+            
+            size_t k = static_cast<size_t>(my_last-my_first); 
+            if( k > block_type::max_arg_size ) {
+                Iterator middle = my_first + k/2;
+
+                empty_task& c = *new( allocate_continuation() ) empty_task;
+                do_task_iter& b = *new( c.allocate_child() ) do_task_iter(middle, my_last, my_feeder);
+                recycle_as_child_of(c);
+
+                my_last = middle;
+                c.set_ref_count(2);
+                c.spawn(b);
+                return this;
+            }else if( k != 0 ) {
+                task_list list;
+                task* t; 
+                size_t k1=0; 
+                for(;;) {
+                    t = new( allocate_child() ) iteration_type(my_first, my_feeder);
+                    ++my_first;
+                    if( ++k1==k ) break;
+                    list.push_back(*t);
+                }
+                set_ref_count(int(k+1));
+                spawn(list);
+                spawn_and_wait_for_all(*t);
+            }
+            return NULL;
+        }
+    }; // class do_task_iter
+
+    //! For internal use only.
+    /** Implements parallel iteration over a range.
+        @ingroup algorithms */
+    template<typename Iterator, typename Body, typename Item> 
+    void run_parallel_do( Iterator first, Iterator last, const Body& body
+#if __TBB_TASK_GROUP_CONTEXT
+        , task_group_context& context
+#endif
+        )
+    {
+        typedef do_task_iter<Iterator, Body, Item> root_iteration_task;
+#if __TBB_TASK_GROUP_CONTEXT
+        parallel_do_feeder_impl<Body, Item> feeder(context);
+#else
+        parallel_do_feeder_impl<Body, Item> feeder;
+#endif
+        feeder.my_body = &body;
+
+        root_iteration_task &t = *new( feeder.my_barrier->allocate_child() ) root_iteration_task(first, last, feeder);
+
+        feeder.my_barrier->set_ref_count(2);
+        feeder.my_barrier->spawn_and_wait_for_all(t);
+    }
+
+    //! For internal use only.
+    /** Detects types of Body's operator function arguments.
+        @ingroup algorithms **/
+    template<typename Iterator, typename Body, typename Item> 
+    void select_parallel_do( Iterator first, Iterator last, const Body& body, void (Body::*)(Item) const
+#if __TBB_TASK_GROUP_CONTEXT
+        , task_group_context& context 
+#endif // __TBB_TASK_GROUP_CONTEXT 
+        )
+    {
+        run_parallel_do<Iterator, Body, typename strip<Item>::type>( first, last, body
+#if __TBB_TASK_GROUP_CONTEXT
+            , context
+#endif // __TBB_TASK_GROUP_CONTEXT 
+            );
+    }
+
+    //! For internal use only.
+    /** Detects types of Body's operator function arguments.
+        @ingroup algorithms **/
+    template<typename Iterator, typename Body, typename Item, typename _Item> 
+    void select_parallel_do( Iterator first, Iterator last, const Body& body, void (Body::*)(Item, parallel_do_feeder<_Item>&) const
+#if __TBB_TASK_GROUP_CONTEXT
+        , task_group_context& context 
+#endif // __TBB_TASK_GROUP_CONTEXT
+        )
+    {
+        run_parallel_do<Iterator, Body, typename strip<Item>::type>( first, last, body
+#if __TBB_TASK_GROUP_CONTEXT
+            , context
+#endif // __TBB_TASK_GROUP_CONTEXT
+            );
+    }
+
+} // namespace internal
+//! @endcond
+
+
+/** \page parallel_do_body_req Requirements on parallel_do body
+    Class \c Body implementing the concept of parallel_do body must define:
+    - \code 
+        B::operator()( 
+                cv_item_type item,
+                parallel_do_feeder<item_type>& feeder
+        ) const
+        
+        OR
+
+        B::operator()( cv_item_type& item ) const
+      \endcode                                                      Process item. 
+                                                                    May be invoked concurrently  for the same \c this but different \c item.
+                                                        
+    - \code item_type( const item_type& ) \endcode 
+                                                                    Copy a work item.
+    - \code ~item_type() \endcode                            Destroy a work item
+**/
+
+/** \name parallel_do
+    See also requirements on \ref parallel_do_body_req "parallel_do Body". **/
+//@{
+//! Parallel iteration over a range, with optional addition of more work.
+/** @ingroup algorithms */
+template<typename Iterator, typename Body> 
+void parallel_do( Iterator first, Iterator last, const Body& body )
+{
+    if ( first == last )
+        return;
+#if __TBB_TASK_GROUP_CONTEXT
+    task_group_context context;
+#endif // __TBB_TASK_GROUP_CONTEXT
+    internal::select_parallel_do( first, last, body, &Body::operator()
+#if __TBB_TASK_GROUP_CONTEXT
+        , context
+#endif // __TBB_TASK_GROUP_CONTEXT
+        );
+}
+
+#if __TBB_TASK_GROUP_CONTEXT
+//! Parallel iteration over a range, with optional addition of more work and user-supplied context
+/** @ingroup algorithms */
+template<typename Iterator, typename Body> 
+void parallel_do( Iterator first, Iterator last, const Body& body, task_group_context& context  )
+{
+    if ( first == last )
+        return;
+    internal::select_parallel_do( first, last, body, &Body::operator(), context );
+}
+#endif // __TBB_TASK_GROUP_CONTEXT
+
+//@}
+
+} // namespace 
+
+#endif /* __TBB_parallel_do_H */
diff --git a/tbb30_20100406oss/include/tbb/parallel_for.h b/tbb30_20100406oss/include/tbb/parallel_for.h
new file mode 100644 (file)
index 0000000..0b3c2be
--- /dev/null
@@ -0,0 +1,242 @@
+/*
+    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB_parallel_for_H
+#define __TBB_parallel_for_H
+
+#include "task.h"
+#include "partitioner.h"
+#include "blocked_range.h"
+#include <new>
+#include "tbb_exception.h"
+
+namespace tbb {
+
+//! @cond INTERNAL
+namespace internal {
+
+    //! Task type used in parallel_for
+    /** @ingroup algorithms */
+    template<typename Range, typename Body, typename Partitioner>
+    class start_for: public task {
+        Range my_range;
+        const Body my_body;
+        typename Partitioner::partition_type my_partition;
+        /*override*/ task* execute();
+
+        //! Constructor for root task.
+        start_for( const Range& range, const Body& body, Partitioner& partitioner ) :
+            my_range(range),    
+            my_body(body),
+            my_partition(partitioner)
+        {
+        }
+        //! Splitting constructor used to generate children.
+        /** this becomes left child.  Newly constructed object is right child. */
+        start_for( start_for& parent_, split ) :
+            my_range(parent_.my_range,split()),    
+            my_body(parent_.my_body),
+            my_partition(parent_.my_partition,split())
+        {
+            my_partition.set_affinity(*this);
+        }
+        //! Update affinity info, if any.
+        /*override*/ void note_affinity( affinity_id id ) {
+            my_partition.note_affinity( id );
+        }
+    public:
+        static void run(  const Range& range, const Body& body, const Partitioner& partitioner ) {
+            if( !range.empty() ) {
+#if !__TBB_TASK_GROUP_CONTEXT || TBB_JOIN_OUTER_TASK_GROUP
+                start_for& a = *new(task::allocate_root()) start_for(range,body,const_cast<Partitioner&>(partitioner));
+#else
+                // Bound context prevents exceptions from body to affect nesting or sibling algorithms,
+                // and allows users to handle exceptions safely by wrapping parallel_for in the try-block.
+                task_group_context context;
+                start_for& a = *new(task::allocate_root(context)) start_for(range,body,const_cast<Partitioner&>(partitioner));
+#endif /* __TBB_TASK_GROUP_CONTEXT && !TBB_JOIN_OUTER_TASK_GROUP */
+                task::spawn_root_and_wait(a);
+            }
+        }
+#if __TBB_TASK_GROUP_CONTEXT
+        static void run(  const Range& range, const Body& body, const Partitioner& partitioner, task_group_context& context ) {
+            if( !range.empty() ) {
+                start_for& a = *new(task::allocate_root(context)) start_for(range,body,const_cast<Partitioner&>(partitioner));
+                task::spawn_root_and_wait(a);
+            }
+        }
+#endif /* __TBB_TASK_GROUP_CONTEXT */
+    };
+
+    template<typename Range, typename Body, typename Partitioner>
+    task* start_for<Range,Body,Partitioner>::execute() {
+        if( !my_range.is_divisible() || my_partition.should_execute_range(*this) ) {
+            my_body( my_range );
+            return my_partition.continue_after_execute_range(); 
+        } else {
+            empty_task& c = *new( this->allocate_continuation() ) empty_task;
+            recycle_as_child_of(c);
+            c.set_ref_count(2);
+            bool delay = my_partition.decide_whether_to_delay();
+            start_for& b = *new( c.allocate_child() ) start_for(*this,split());
+            my_partition.spawn_or_delay(delay,b);
+            return this;
+        }
+    } 
+} // namespace internal
+//! @endcond
+
+
+// Requirements on Range concept are documented in blocked_range.h
+
+/** \page parallel_for_body_req Requirements on parallel_for body
+    Class \c Body implementing the concept of parallel_for body must define:
+    - \code Body::Body( const Body& ); \endcode                 Copy constructor
+    - \code Body::~Body(); \endcode                             Destructor
+    - \code void Body::operator()( Range& r ) const; \endcode   Function call operator applying the body to range \c r.
+**/
+
+/** \name parallel_for
+    See also requirements on \ref range_req "Range" and \ref parallel_for_body_req "parallel_for Body". **/
+//@{
+
+//! Parallel iteration over range with default partitioner. 
+/** @ingroup algorithms **/
+template<typename Range, typename Body>
+void parallel_for( const Range& range, const Body& body ) {
+    internal::start_for<Range,Body,__TBB_DEFAULT_PARTITIONER>::run(range,body,__TBB_DEFAULT_PARTITIONER());
+}
+
+//! Parallel iteration over range with simple partitioner.
+/** @ingroup algorithms **/
+template<typename Range, typename Body>
+void parallel_for( const Range& range, const Body& body, const simple_partitioner& partitioner ) {
+    internal::start_for<Range,Body,simple_partitioner>::run(range,body,partitioner);
+}
+
+//! Parallel iteration over range with auto_partitioner.
+/** @ingroup algorithms **/
+template<typename Range, typename Body>
+void parallel_for( const Range& range, const Body& body, const auto_partitioner& partitioner ) {
+    internal::start_for<Range,Body,auto_partitioner>::run(range,body,partitioner);
+}
+
+//! Parallel iteration over range with affinity_partitioner.
+/** @ingroup algorithms **/
+template<typename Range, typename Body>
+void parallel_for( const Range& range, const Body& body, affinity_partitioner& partitioner ) {
+    internal::start_for<Range,Body,affinity_partitioner>::run(range,body,partitioner);
+}
+
+#if __TBB_TASK_GROUP_CONTEXT
+//! Parallel iteration over range with simple partitioner and user-supplied context.
+/** @ingroup algorithms **/
+template<typename Range, typename Body>
+void parallel_for( const Range& range, const Body& body, const simple_partitioner& partitioner, task_group_context& context ) {
+    internal::start_for<Range,Body,simple_partitioner>::run(range, body, partitioner, context);
+}
+
+//! Parallel iteration over range with auto_partitioner and user-supplied context.
+/** @ingroup algorithms **/
+template<typename Range, typename Body>
+void parallel_for( const Range& range, const Body& body, const auto_partitioner& partitioner, task_group_context& context ) {
+    internal::start_for<Range,Body,auto_partitioner>::run(range, body, partitioner, context);
+}
+
+//! Parallel iteration over range with affinity_partitioner and user-supplied context.
+/** @ingroup algorithms **/
+template<typename Range, typename Body>
+void parallel_for( const Range& range, const Body& body, affinity_partitioner& partitioner, task_group_context& context ) {
+    internal::start_for<Range,Body,affinity_partitioner>::run(range,body,partitioner, context);
+}
+#endif /* __TBB_TASK_GROUP_CONTEXT */
+//@}
+
+//! @cond INTERNAL
+namespace internal {
+    //! Calls the function with values from range [begin, end) with a step provided
+template<typename Function, typename Index>
+class parallel_for_body : internal::no_assign {
+    const Function &my_func;
+    const Index my_begin;
+    const Index my_step; 
+public:
+    parallel_for_body( const Function& _func, Index& _begin, Index& _step) 
+        : my_func(_func), my_begin(_begin), my_step(_step) {}
+    
+    void operator()( tbb::blocked_range<Index>& r ) const {
+        for( Index i = r.begin(),  k = my_begin + i * my_step; i < r.end(); i++, k = k + my_step)
+            my_func( k );
+    }
+};
+} // namespace internal
+//! @endcond
+
+namespace strict_ppl {
+
+//@{
+//! Parallel iteration over a range of integers with a step provided
+template <typename Index, typename Function>
+void parallel_for(Index first, Index last, Index step, const Function& f) {
+    tbb::task_group_context context;
+    parallel_for(first, last, step, f, context);
+}
+template <typename Index, typename Function>
+void parallel_for(Index first, Index last, Index step, const Function& f, tbb::task_group_context &context) {
+    if (step <= 0 )
+        internal::throw_exception(internal::eid_nonpositive_step); // throws std::invalid_argument
+    else if (last > first) {
+        // Above "else" is necessary to prevent "potential divide by zero" warning
+        Index end = (last - first) / step;
+        if (first + end * step < last) end++;
+        tbb::blocked_range<Index> range(static_cast<Index>(0), end);
+        internal::parallel_for_body<Function, Index> body(f, first, step);
+        tbb::parallel_for(range, body, tbb::auto_partitioner(), context);
+    }
+}
+//! Parallel iteration over a range of integers with a default step value
+template <typename Index, typename Function>
+void parallel_for(Index first, Index last, const Function& f) {
+    tbb::task_group_context context;
+    parallel_for(first, last, static_cast<Index>(1), f, context);
+}
+template <typename Index, typename Function>
+void parallel_for(Index first, Index last, const Function& f, tbb::task_group_context &context) {
+    parallel_for(first, last, static_cast<Index>(1), f, context);
+}
+
+//@}
+
+} // namespace strict_ppl
+
+using strict_ppl::parallel_for;
+
+} // namespace tbb
+
+#endif /* __TBB_parallel_for_H */
+
diff --git a/tbb30_20100406oss/include/tbb/parallel_for_each.h b/tbb30_20100406oss/include/tbb/parallel_for_each.h
new file mode 100644 (file)
index 0000000..6b8d862
--- /dev/null
@@ -0,0 +1,77 @@
+/*
+    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB_parallel_for_each_H
+#define __TBB_parallel_for_each_H
+
+#include "parallel_do.h"
+
+namespace tbb {
+
+//! @cond INTERNAL
+namespace internal {
+    // The class calls user function in operator()
+    template <typename Function, typename Iterator>
+    class parallel_for_each_body : internal::no_assign {
+        const Function &my_func;
+    public:
+        parallel_for_each_body(const Function &_func) : my_func(_func) {}
+        parallel_for_each_body(const parallel_for_each_body<Function, Iterator> &_caller) : my_func(_caller.my_func) {}
+
+        void operator() ( typename std::iterator_traits<Iterator>::value_type& value ) const {
+            my_func(value);
+        }
+    };
+} // namespace internal
+//! @endcond
+
+/** \name parallel_for_each
+    **/
+//@{
+//! Calls function f for all items from [first, last) interval using user-supplied context
+/** @ingroup algorithms */
+template<typename InputIterator, typename Function>
+void parallel_for_each(InputIterator first, InputIterator last, const Function& f, task_group_context &context) {
+    internal::parallel_for_each_body<Function, InputIterator> body(f);
+
+    tbb::parallel_do (first, last, body, context);
+}
+
+//! Uses default context
+template<typename InputIterator, typename Function>
+void parallel_for_each(InputIterator first, InputIterator last, const Function& f) {
+    internal::parallel_for_each_body<Function, InputIterator> body(f);
+
+    tbb::parallel_do (first, last, body);
+}
+
+//@}
+
+} // namespace
+
+#endif /* __TBB_parallel_for_each_H */
diff --git a/tbb30_20100406oss/include/tbb/parallel_invoke.h b/tbb30_20100406oss/include/tbb/parallel_invoke.h
new file mode 100644 (file)
index 0000000..02c3e80
--- /dev/null
@@ -0,0 +1,359 @@
+/*
+    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB_parallel_invoke_H
+#define __TBB_parallel_invoke_H
+
+#include "task.h"
+
+namespace tbb {
+
+//! @cond INTERNAL
+namespace internal {
+    // Simple task object, executing user method
+    template<typename function>
+    class function_invoker : public task{
+    public:
+        function_invoker(const function& _function) : my_function(_function) {}
+    private:
+        const function &my_function;
+        /*override*/
+        task* execute()
+        {
+            my_function();
+            return NULL;
+        }
+    };
+
+    // The class spawns two or three child tasks
+    template <size_t N, typename function1, typename function2, typename function3>
+    class spawner : public task {
+    private:
+        const function1& my_func1;
+        const function2& my_func2;
+        const function3& my_func3;
+        bool is_recycled;
+
+        task* execute (){
+            if(is_recycled){
+                return NULL;
+            }else{
+                __TBB_ASSERT(N==2 || N==3, "Number of arguments passed to spawner is wrong");
+                set_ref_count(N);
+                recycle_as_safe_continuation();
+                internal::function_invoker<function2>* invoker2 = new (allocate_child()) internal::function_invoker<function2>(my_func2);
+                __TBB_ASSERT(invoker2, "Child task allocation failed");
+                spawn(*invoker2);
+                size_t n = N; // To prevent compiler warnings
+                if (n>2) {
+                    internal::function_invoker<function3>* invoker3 = new (allocate_child()) internal::function_invoker<function3>(my_func3);
+                    __TBB_ASSERT(invoker3, "Child task allocation failed");
+                    spawn(*invoker3);
+                }
+                my_func1();
+                is_recycled = true;
+                return NULL;
+            }
+        } // execute
+
+    public:
+        spawner(const function1& _func1, const function2& _func2, const function3& _func3) : my_func1(_func1), my_func2(_func2), my_func3(_func3), is_recycled(false) {}
+    };
+
+    // Creates and spawns child tasks
+    class parallel_invoke_helper : public empty_task {
+    public:
+        // Dummy functor class
+        class parallel_invoke_noop {
+        public:
+            void operator() () const {}
+        };
+        // Creates a helper object with user-defined number of children expected
+        parallel_invoke_helper(int number_of_children)
+        {
+            set_ref_count(number_of_children + 1);
+        }
+        // Adds child task and spawns it
+        template <typename function>
+        void add_child (const function &_func)
+        {
+            internal::function_invoker<function>* invoker = new (allocate_child()) internal::function_invoker<function>(_func);
+            __TBB_ASSERT(invoker, "Child task allocation failed");
+            spawn(*invoker);
+        }
+
+        // Adds a task with multiple child tasks and spawns it
+        // two arguments
+        template <typename function1, typename function2>
+        void add_children (const function1& _func1, const function2& _func2)
+        {
+            // The third argument is dummy, it is ignored actually.
+            parallel_invoke_noop noop;
+            internal::spawner<2, function1, function2, parallel_invoke_noop>& sub_root = *new(allocate_child())internal::spawner<2, function1, function2, parallel_invoke_noop>(_func1, _func2, noop);
+            spawn(sub_root);
+        }
+        // three arguments
+        template <typename function1, typename function2, typename function3>
+        void add_children (const function1& _func1, const function2& _func2, const function3& _func3)
+        {
+            internal::spawner<3, function1, function2, function3>& sub_root = *new(allocate_child())internal::spawner<3, function1, function2, function3>(_func1, _func2, _func3);
+            spawn(sub_root);
+        }
+
+        // Waits for all child tasks
+        template <typename F0>
+        void run_and_finish(const F0& f0)
+        {
+            internal::function_invoker<F0>* invoker = new (allocate_child()) internal::function_invoker<F0>(f0);
+            __TBB_ASSERT(invoker, "Child task allocation failed");
+            spawn_and_wait_for_all(*invoker);
+        }
+    };
+    // The class destroys root if exception occured as well as in normal case
+    class parallel_invoke_cleaner: internal::no_copy { 
+    public:
+        parallel_invoke_cleaner(int number_of_children, tbb::task_group_context& context) : root(*new(task::allocate_root(context)) internal::parallel_invoke_helper(number_of_children))
+        {}
+        ~parallel_invoke_cleaner(){
+            root.destroy(root);
+        }
+        internal::parallel_invoke_helper& root;
+    };
+} // namespace internal
+//! @endcond
+
+/** \name parallel_invoke
+    **/
+//@{
+//! Executes a list of tasks in parallel and waits for all tasks to complete.
+/** @ingroup algorithms */
+
+// parallel_invoke with user-defined context
+// two arguments
+template<typename F0, typename F1 >
+void parallel_invoke(const F0& f0, const F1& f1, tbb::task_group_context& context) {
+    internal::parallel_invoke_cleaner cleaner(2, context);
+    internal::parallel_invoke_helper& root = cleaner.root;
+
+    root.add_child(f1);
+
+    root.run_and_finish(f0);
+}
+
+// three arguments
+template<typename F0, typename F1, typename F2 >
+void parallel_invoke(const F0& f0, const F1& f1, const F2& f2, tbb::task_group_context& context) {
+    internal::parallel_invoke_cleaner cleaner(3, context);
+    internal::parallel_invoke_helper& root = cleaner.root;
+
+    root.add_child(f2);
+    root.add_child(f1);
+
+    root.run_and_finish(f0);
+}
+
+// four arguments
+template<typename F0, typename F1, typename F2, typename F3>
+void parallel_invoke(const F0& f0, const F1& f1, const F2& f2, const F3& f3,
+                     tbb::task_group_context& context)
+{
+    internal::parallel_invoke_cleaner cleaner(4, context);
+    internal::parallel_invoke_helper& root = cleaner.root;
+
+    root.add_child(f3);
+    root.add_child(f2);
+    root.add_child(f1);
+
+    root.run_and_finish(f0);
+}
+
+// five arguments
+template<typename F0, typename F1, typename F2, typename F3, typename F4 >
+void parallel_invoke(const F0& f0, const F1& f1, const F2& f2, const F3& f3, const F4& f4,
+                     tbb::task_group_context& context)
+{
+    internal::parallel_invoke_cleaner cleaner(3, context);
+    internal::parallel_invoke_helper& root = cleaner.root;
+
+    root.add_children(f4, f3);
+    root.add_children(f2, f1);
+
+    root.run_and_finish(f0);
+}
+
+// six arguments
+template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5>
+void parallel_invoke(const F0& f0, const F1& f1, const F2& f2, const F3& f3, const F4& f4, const F5& f5,
+                     tbb::task_group_context& context)
+{
+    internal::parallel_invoke_cleaner cleaner(3, context);
+    internal::parallel_invoke_helper& root = cleaner.root;
+
+    root.add_children(f5, f4, f3);
+    root.add_children(f2, f1);
+
+    root.run_and_finish(f0);
+}
+
+// seven arguments
+template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6>
+void parallel_invoke(const F0& f0, const F1& f1, const F2& f2, const F3& f3, const F4& f4,
+                     const F5& f5, const F6& f6,
+                     tbb::task_group_context& context)
+{
+    internal::parallel_invoke_cleaner cleaner(3, context);
+    internal::parallel_invoke_helper& root = cleaner.root;
+
+    root.add_children(f6, f5, f4);
+    root.add_children(f3, f2, f1);
+
+    root.run_and_finish(f0);
+}
+
+// eight arguments
+template<typename F0, typename F1, typename F2, typename F3, typename F4,
+         typename F5, typename F6, typename F7>
+void parallel_invoke(const F0& f0, const F1& f1, const F2& f2, const F3& f3, const F4& f4,
+                     const F5& f5, const F6& f6, const F7& f7,
+                     tbb::task_group_context& context)
+{
+    internal::parallel_invoke_cleaner cleaner(4, context);
+    internal::parallel_invoke_helper& root = cleaner.root;
+
+    root.add_children(f7, f6, f5);
+    root.add_children(f4, f3);
+    root.add_children(f2, f1);
+
+    root.run_and_finish(f0);
+}
+
+// nine arguments
+template<typename F0, typename F1, typename F2, typename F3, typename F4,
+         typename F5, typename F6, typename F7, typename F8>
+void parallel_invoke(const F0& f0, const F1& f1, const F2& f2, const F3& f3, const F4& f4,
+                     const F5& f5, const F6& f6, const F7& f7, const F8& f8,
+                     tbb::task_group_context& context)
+{
+    internal::parallel_invoke_cleaner cleaner(4, context);
+    internal::parallel_invoke_helper& root = cleaner.root;
+
+    root.add_children(f8, f7, f6);
+    root.add_children(f5, f4, f3);
+    root.add_children(f2, f1);
+
+    root.run_and_finish(f0);
+}
+
+// ten arguments
+template<typename F0, typename F1, typename F2, typename F3, typename F4,
+         typename F5, typename F6, typename F7, typename F8, typename F9>
+void parallel_invoke(const F0& f0, const F1& f1, const F2& f2, const F3& f3, const F4& f4,
+                     const F5& f5, const F6& f6, const F7& f7, const F8& f8, const F9& f9,
+                     tbb::task_group_context& context)
+{
+    internal::parallel_invoke_cleaner cleaner(4, context);
+    internal::parallel_invoke_helper& root = cleaner.root;
+
+    root.add_children(f9, f8, f7);
+    root.add_children(f6, f5, f4);
+    root.add_children(f3, f2, f1);
+
+    root.run_and_finish(f0);
+}
+
+// two arguments
+template<typename F0, typename F1>
+void parallel_invoke(const F0& f0, const F1& f1) {
+    task_group_context context;
+    parallel_invoke<F0, F1>(f0, f1, context);
+}
+// three arguments
+template<typename F0, typename F1, typename F2>
+void parallel_invoke(const F0& f0, const F1& f1, const F2& f2) {
+    task_group_context context;
+    parallel_invoke<F0, F1, F2>(f0, f1, f2, context);
+}
+// four arguments
+template<typename F0, typename F1, typename F2, typename F3 >
+void parallel_invoke(const F0& f0, const F1& f1, const F2& f2, const F3& f3) {
+    task_group_context context;
+    parallel_invoke<F0, F1, F2, F3>(f0, f1, f2, f3, context);
+}
+// five arguments
+template<typename F0, typename F1, typename F2, typename F3, typename F4>
+void parallel_invoke(const F0& f0, const F1& f1, const F2& f2, const F3& f3, const F4& f4) {
+    task_group_context context;
+    parallel_invoke<F0, F1, F2, F3, F4>(f0, f1, f2, f3, f4, context);
+}
+// six arguments
+template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5>
+void parallel_invoke(const F0& f0, const F1& f1, const F2& f2, const F3& f3, const F4& f4, const F5& f5) {
+    task_group_context context;
+    parallel_invoke<F0, F1, F2, F3, F4, F5>(f0, f1, f2, f3, f4, f5, context);
+}
+// seven arguments
+template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6>
+void parallel_invoke(const F0& f0, const F1& f1, const F2& f2, const F3& f3, const F4& f4,
+                     const F5& f5, const F6& f6)
+{
+    task_group_context context;
+    parallel_invoke<F0, F1, F2, F3, F4, F5, F6>(f0, f1, f2, f3, f4, f5, f6, context);
+}
+// eigth arguments
+template<typename F0, typename F1, typename F2, typename F3, typename F4, 
+         typename F5, typename F6, typename F7>
+void parallel_invoke(const F0& f0, const F1& f1, const F2& f2, const F3& f3, const F4& f4,
+                     const F5& f5, const F6& f6, const F7& f7)
+{
+    task_group_context context;
+    parallel_invoke<F0, F1, F2, F3, F4, F5, F6, F7>(f0, f1, f2, f3, f4, f5, f6, f7, context);
+}
+// nine arguments
+template<typename F0, typename F1, typename F2, typename F3, typename F4,
+         typename F5, typename F6, typename F7, typename F8>
+void parallel_invoke(const F0& f0, const F1& f1, const F2& f2, const F3& f3, const F4& f4,
+                     const F5& f5, const F6& f6, const F7& f7, const F8& f8)
+{
+    task_group_context context;
+    parallel_invoke<F0, F1, F2, F3, F4, F5, F6, F7, F8>(f0, f1, f2, f3, f4, f5, f6, f7, f8, context);
+}
+// ten arguments
+template<typename F0, typename F1, typename F2, typename F3, typename F4,
+         typename F5, typename F6, typename F7, typename F8, typename F9>
+void parallel_invoke(const F0& f0, const F1& f1, const F2& f2, const F3& f3, const F4& f4,
+                     const F5& f5, const F6& f6, const F7& f7, const F8& f8, const F9& f9)
+{
+    task_group_context context;
+    parallel_invoke<F0, F1, F2, F3, F4, F5, F6, F7, F8, F9>(f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, context);
+}
+
+//@}
+
+} // namespace
+
+#endif /* __TBB_parallel_invoke_H */
diff --git a/tbb30_20100406oss/include/tbb/parallel_reduce.h b/tbb30_20100406oss/include/tbb/parallel_reduce.h
new file mode 100644 (file)
index 0000000..670b626
--- /dev/null
@@ -0,0 +1,387 @@
+/*
+    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB_parallel_reduce_H
+#define __TBB_parallel_reduce_H
+
+#include "task.h"
+#include "aligned_space.h"
+#include "partitioner.h"
+#include <new>
+
+namespace tbb {
+
+//! @cond INTERNAL
+namespace internal {
+
+    //! ITT instrumented routine that stores src into location pointed to by dst.
+    void __TBB_EXPORTED_FUNC itt_store_pointer_with_release_v3( void* dst, void* src );
+
+    //! ITT instrumented routine that loads pointer from location pointed to by src.
+    void* __TBB_EXPORTED_FUNC itt_load_pointer_with_acquire_v3( const void* src );
+
+    template<typename T> inline void parallel_reduce_store_body( T*& dst, T* src ) {
+#if TBB_USE_THREADING_TOOLS
+        itt_store_pointer_with_release_v3(&dst,src);
+#else
+        __TBB_store_with_release(dst,src);
+#endif /* TBB_USE_THREADING_TOOLS */
+    }
+
+    template<typename T> inline T* parallel_reduce_load_body( T*& src ) {
+#if TBB_USE_THREADING_TOOLS
+        return static_cast<T*>(itt_load_pointer_with_acquire_v3(&src));
+#else
+        return __TBB_load_with_acquire(src);
+#endif /* TBB_USE_THREADING_TOOLS */
+    }
+
+    //! 0 if root, 1 if a left child, 2 if a right child.
+    /** Represented as a char, not enum, for compactness. */
+    typedef char reduction_context;
+
+    //! Task type use to combine the partial results of parallel_reduce.
+    /** @ingroup algorithms */
+    template<typename Body>
+    class finish_reduce: public task {
+        //! Pointer to body, or NULL if the left child has not yet finished. 
+        Body* my_body;
+        bool has_right_zombie;
+        const reduction_context my_context;
+        aligned_space<Body,1> zombie_space;
+        finish_reduce( char context_ ) : 
+            my_body(NULL),
+            has_right_zombie(false),
+            my_context(context_)
+        {
+        }
+        task* execute() {
+            if( has_right_zombie ) {
+                // Right child was stolen.
+                Body* s = zombie_space.begin();
+                my_body->join( *s );
+                s->~Body();
+            }
+            if( my_context==1 ) 
+                parallel_reduce_store_body( static_cast<finish_reduce*>(parent())->my_body, my_body );
+            return NULL;
+        }       
+        template<typename Range,typename Body_, typename Partitioner>
+        friend class start_reduce;
+    };
+
+    //! Task type used to split the work of parallel_reduce.
+    /** @ingroup algorithms */
+    template<typename Range, typename Body, typename Partitioner>
+    class start_reduce: public task {
+        typedef finish_reduce<Body> finish_type;
+        Body* my_body;
+        Range my_range;
+        typename Partitioner::partition_type my_partition;
+        reduction_context my_context;
+        /*override*/ task* execute();
+        template<typename Body_>
+        friend class finish_reduce;
+    
+        //! Constructor used for root task
+        start_reduce( const Range& range, Body* body, Partitioner& partitioner ) :
+            my_body(body),
+            my_range(range),
+            my_partition(partitioner),
+            my_context(0)
+        {
+        }
+        //! Splitting constructor used to generate children.
+        /** this becomes left child.  Newly constructed object is right child. */
+        start_reduce( start_reduce& parent_, split ) :
+            my_body(parent_.my_body),
+            my_range(parent_.my_range,split()),
+            my_partition(parent_.my_partition,split()),
+            my_context(2)
+        {
+            my_partition.set_affinity(*this);
+            parent_.my_context = 1;
+        }
+        //! Update affinity info, if any
+        /*override*/ void note_affinity( affinity_id id ) {
+            my_partition.note_affinity( id );
+        }
+
+public:
+        static void run( const Range& range, Body& body, Partitioner& partitioner ) {
+            if( !range.empty() ) {
+#if !__TBB_TASK_GROUP_CONTEXT || TBB_JOIN_OUTER_TASK_GROUP
+                task::spawn_root_and_wait( *new(task::allocate_root()) start_reduce(range,&body,partitioner) );
+#else
+                // Bound context prevents exceptions from body to affect nesting or sibling algorithms,
+                // and allows users to handle exceptions safely by wrapping parallel_for in the try-block.
+                task_group_context context;
+                task::spawn_root_and_wait( *new(task::allocate_root(context)) start_reduce(range,&body,partitioner) );
+#endif /* __TBB_TASK_GROUP_CONTEXT && !TBB_JOIN_OUTER_TASK_GROUP */
+            }
+        }
+#if __TBB_TASK_GROUP_CONTEXT
+        static void run( const Range& range, Body& body, Partitioner& partitioner, task_group_context& context ) {
+            if( !range.empty() ) 
+                task::spawn_root_and_wait( *new(task::allocate_root(context)) start_reduce(range,&body,partitioner) );
+        }
+#endif /* __TBB_TASK_GROUP_CONTEXT */
+    };
+
+    template<typename Range, typename Body, typename Partitioner>
+    task* start_reduce<Range,Body,Partitioner>::execute() {
+        if( my_context==2 ) {
+            finish_type* p = static_cast<finish_type*>(parent() );
+            if( !parallel_reduce_load_body(p->my_body) ) {
+                my_body = new( p->zombie_space.begin() ) Body(*my_body,split());
+                p->has_right_zombie = true;
+            } 
+        }
+        if( !my_range.is_divisible() || my_partition.should_execute_range(*this) ) {
+            (*my_body)( my_range );
+            if( my_context==1 ) 
+                parallel_reduce_store_body(static_cast<finish_type*>(parent())->my_body, my_body );
+            return my_partition.continue_after_execute_range();
+        } else {
+            finish_type& c = *new( allocate_continuation()) finish_type(my_context);
+            recycle_as_child_of(c);
+            c.set_ref_count(2);    
+            bool delay = my_partition.decide_whether_to_delay();
+            start_reduce& b = *new( c.allocate_child() ) start_reduce(*this,split());
+            my_partition.spawn_or_delay(delay,b);
+            return this;
+        }
+    } 
+
+    //! Auxiliary class for parallel_reduce; for internal use only.
+    /** The adaptor class that implements \ref parallel_reduce_body_req "parallel_reduce Body"
+        using given \ref parallel_reduce_lambda_req "anonymous function objects".
+     **/
+    /** @ingroup algorithms */
+    template<typename Range, typename Value, typename RealBody, typename Reduction>
+    class lambda_reduce_body {
+
+//FIXME: decide if my_real_body, my_reduction, and identity_element should be copied or referenced
+//       (might require some performance measurements)
+
+        const Value&     identity_element;
+        const RealBody&  my_real_body;
+        const Reduction& my_reduction;
+        Value            my_value;
+        lambda_reduce_body& operator= ( const lambda_reduce_body& other );
+    public:
+        lambda_reduce_body( const Value& identity, const RealBody& body, const Reduction& reduction )
+            : identity_element(identity)
+            , my_real_body(body)
+            , my_reduction(reduction)
+            , my_value(identity)
+        { }
+        lambda_reduce_body( const lambda_reduce_body& other )
+            : identity_element(other.identity_element)
+            , my_real_body(other.my_real_body)
+            , my_reduction(other.my_reduction)
+            , my_value(other.my_value)
+        { }
+        lambda_reduce_body( lambda_reduce_body& other, tbb::split )
+            : identity_element(other.identity_element)
+            , my_real_body(other.my_real_body)
+            , my_reduction(other.my_reduction)
+            , my_value(other.identity_element)
+        { }
+        void operator()(Range& range) {
+            my_value = my_real_body(range, const_cast<const Value&>(my_value));
+        }
+        void join( lambda_reduce_body& rhs ) {
+            my_value = my_reduction(const_cast<const Value&>(my_value), const_cast<const Value&>(rhs.my_value));
+        }
+        Value result() const {
+            return my_value;
+        }
+    };
+
+} // namespace internal
+//! @endcond
+
+// Requirements on Range concept are documented in blocked_range.h
+
+/** \page parallel_reduce_body_req Requirements on parallel_reduce body
+    Class \c Body implementing the concept of parallel_reduce body must define:
+    - \code Body::Body( Body&, split ); \endcode        Splitting constructor.
+                                                        Must be able to run concurrently with operator() and method \c join
+    - \code Body::~Body(); \endcode                     Destructor
+    - \code void Body::operator()( Range& r ); \endcode Function call operator applying body to range \c r
+                                                        and accumulating the result
+    - \code void Body::join( Body& b ); \endcode        Join results. 
+                                                        The result in \c b should be merged into the result of \c this
+**/
+
+/** \page parallel_reduce_lambda_req Requirements on parallel_reduce anonymous function objects (lambda functions)
+    TO BE DOCUMENTED
+**/
+
+/** \name parallel_reduce
+    See also requirements on \ref range_req "Range" and \ref parallel_reduce_body_req "parallel_reduce Body". **/
+//@{
+
+//! Parallel iteration with reduction and default partitioner.
+/** @ingroup algorithms **/
+template<typename Range, typename Body>
+void parallel_reduce( const Range& range, Body& body ) {
+    internal::start_reduce<Range,Body, const __TBB_DEFAULT_PARTITIONER>::run( range, body, __TBB_DEFAULT_PARTITIONER() );
+}
+
+//! Parallel iteration with reduction and simple_partitioner
+/** @ingroup algorithms **/
+template<typename Range, typename Body>
+void parallel_reduce( const Range& range, Body& body, const simple_partitioner& partitioner ) {
+    internal::start_reduce<Range,Body,const simple_partitioner>::run( range, body, partitioner );
+}
+
+//! Parallel iteration with reduction and auto_partitioner
+/** @ingroup algorithms **/
+template<typename Range, typename Body>
+void parallel_reduce( const Range& range, Body& body, const auto_partitioner& partitioner ) {
+    internal::start_reduce<Range,Body,const auto_partitioner>::run( range, body, partitioner );
+}
+
+//! Parallel iteration with reduction and affinity_partitioner
+/** @ingroup algorithms **/
+template<typename Range, typename Body>
+void parallel_reduce( const Range& range, Body& body, affinity_partitioner& partitioner ) {
+    internal::start_reduce<Range,Body,affinity_partitioner>::run( range, body, partitioner );
+}
+
+#if __TBB_TASK_GROUP_CONTEXT
+//! Parallel iteration with reduction, simple partitioner and user-supplied context.
+/** @ingroup algorithms **/
+template<typename Range, typename Body>
+void parallel_reduce( const Range& range, Body& body, const simple_partitioner& partitioner, task_group_context& context ) {
+    internal::start_reduce<Range,Body,const simple_partitioner>::run( range, body, partitioner, context );
+}
+
+//! Parallel iteration with reduction, auto_partitioner and user-supplied context
+/** @ingroup algorithms **/
+template<typename Range, typename Body>
+void parallel_reduce( const Range& range, Body& body, const auto_partitioner& partitioner, task_group_context& context ) {
+    internal::start_reduce<Range,Body,const auto_partitioner>::run( range, body, partitioner, context );
+}
+
+//! Parallel iteration with reduction, affinity_partitioner and user-supplied context
+/** @ingroup algorithms **/
+template<typename Range, typename Body>
+void parallel_reduce( const Range& range, Body& body, affinity_partitioner& partitioner, task_group_context& context ) {
+    internal::start_reduce<Range,Body,affinity_partitioner>::run( range, body, partitioner, context );
+}
+#endif /* __TBB_TASK_GROUP_CONTEXT */
+
+/** parallel_reduce overloads that work with anonymous function objects
+    (see also \ref parallel_reduce_lambda_req "requirements on parallel_reduce anonymous function objects"). **/
+
+//! Parallel iteration with reduction and default partitioner.
+/** @ingroup algorithms **/
+template<typename Range, typename Value, typename RealBody, typename Reduction>
+Value parallel_reduce( const Range& range, const Value& identity, const RealBody& real_body, const Reduction& reduction ) {
+    internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
+    internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,const __TBB_DEFAULT_PARTITIONER>
+                          ::run(range, body, __TBB_DEFAULT_PARTITIONER() );
+    return body.result();
+}
+
+//! Parallel iteration with reduction and simple_partitioner.
+/** @ingroup algorithms **/
+template<typename Range, typename Value, typename RealBody, typename Reduction>
+Value parallel_reduce( const Range& range, const Value& identity, const RealBody& real_body, const Reduction& reduction,
+                       const simple_partitioner& partitioner ) {
+    internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
+    internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,const simple_partitioner>
+                          ::run(range, body, partitioner );
+    return body.result();
+}
+
+//! Parallel iteration with reduction and auto_partitioner
+/** @ingroup algorithms **/
+template<typename Range, typename Value, typename RealBody, typename Reduction>
+Value parallel_reduce( const Range& range, const Value& identity, const RealBody& real_body, const Reduction& reduction,
+                       const auto_partitioner& partitioner ) {
+    internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
+    internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,const auto_partitioner>
+                          ::run( range, body, partitioner );
+    return body.result();
+}
+
+//! Parallel iteration with reduction and affinity_partitioner
+/** @ingroup algorithms **/
+template<typename Range, typename Value, typename RealBody, typename Reduction>
+Value parallel_reduce( const Range& range, const Value& identity, const RealBody& real_body, const Reduction& reduction,
+                       affinity_partitioner& partitioner ) {
+    internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
+    internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,affinity_partitioner>
+                                        ::run( range, body, partitioner );
+    return body.result();
+}
+
+#if __TBB_TASK_GROUP_CONTEXT
+//! Parallel iteration with reduction, simple partitioner and user-supplied context.
+/** @ingroup algorithms **/
+template<typename Range, typename Value, typename RealBody, typename Reduction>
+Value parallel_reduce( const Range& range, const Value& identity, const RealBody& real_body, const Reduction& reduction,
+                       const simple_partitioner& partitioner, task_group_context& context ) {
+    internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
+    internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,const simple_partitioner>
+                          ::run( range, body, partitioner, context );
+    return body.result();
+}
+
+//! Parallel iteration with reduction, auto_partitioner and user-supplied context
+/** @ingroup algorithms **/
+template<typename Range, typename Value, typename RealBody, typename Reduction>
+Value parallel_reduce( const Range& range, const Value& identity, const RealBody& real_body, const Reduction& reduction,
+                       const auto_partitioner& partitioner, task_group_context& context ) {
+    internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
+    internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,const auto_partitioner>
+                          ::run( range, body, partitioner, context );
+    return body.result();
+}
+
+//! Parallel iteration with reduction, affinity_partitioner and user-supplied context
+/** @ingroup algorithms **/
+template<typename Range, typename Value, typename RealBody, typename Reduction>
+Value parallel_reduce( const Range& range, const Value& identity, const RealBody& real_body, const Reduction& reduction,
+                       affinity_partitioner& partitioner, task_group_context& context ) {
+    internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
+    internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,affinity_partitioner>
+                                        ::run( range, body, partitioner, context );
+    return body.result();
+}
+#endif /* __TBB_TASK_GROUP_CONTEXT */
+//@}
+
+} // namespace tbb
+
+#endif /* __TBB_parallel_reduce_H */
+
diff --git a/tbb30_20100406oss/include/tbb/parallel_scan.h b/tbb30_20100406oss/include/tbb/parallel_scan.h
new file mode 100644 (file)
index 0000000..3a1963f
--- /dev/null
@@ -0,0 +1,351 @@
+/*
+    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB_parallel_scan_H
+#define __TBB_parallel_scan_H
+
+#include "task.h"
+#include "aligned_space.h"
+#include <new>
+#include "partitioner.h"
+
+namespace tbb {
+
+//! Used to indicate that the initial scan is being performed.
+/** @ingroup algorithms */
+struct pre_scan_tag {
+    static bool is_final_scan() {return false;}
+};
+
+//! Used to indicate that the final scan is being performed.
+/** @ingroup algorithms */
+struct final_scan_tag {
+    static bool is_final_scan() {return true;}
+};
+
+//! @cond INTERNAL
+namespace internal {
+
+    //! Performs final scan for a leaf 
+    /** @ingroup algorithms */
+    template<typename Range, typename Body>
+    class final_sum: public task {
+    public:
+        Body body;
+    private:
+        aligned_space<Range,1> range;
+        //! Where to put result of last subrange, or NULL if not last subrange.
+        Body* stuff_last;
+    public:
+        final_sum( Body& body_ ) :
+            body(body_,split())
+        {
+            poison_pointer(stuff_last);
+        }
+        ~final_sum() {
+            range.begin()->~Range();
+        }     
+        void finish_construction( const Range& range_, Body* stuff_last_ ) {
+            new( range.begin() ) Range(range_);
+            stuff_last = stuff_last_;
+        }
+    private:
+        /*override*/ task* execute() {
+            body( *range.begin(), final_scan_tag() );
+            if( stuff_last )
+                stuff_last->assign(body);
+            return NULL;
+        }
+    };       
+
+    //! Split work to be done in the scan.
+    /** @ingroup algorithms */
+    template<typename Range, typename Body>
+    class sum_node: public task {
+        typedef final_sum<Range,Body> final_sum_type;
+    public:
+        final_sum_type *incoming; 
+        final_sum_type *body;
+        Body *stuff_last;
+    private:
+        final_sum_type *left_sum;
+        sum_node *left;
+        sum_node *right;     
+        bool left_is_final;
+        Range range;
+        sum_node( const Range range_, bool left_is_final_ ) : 
+            left_sum(NULL), 
+            left(NULL), 
+            right(NULL), 
+            left_is_final(left_is_final_), 
+            range(range_)
+        {
+            // Poison fields that will be set by second pass.
+            poison_pointer(body);
+            poison_pointer(incoming);
+        }
+        task* create_child( const Range& range_, final_sum_type& f, sum_node* n, final_sum_type* incoming_, Body* stuff_last_ ) {
+            if( !n ) {
+                f.recycle_as_child_of( *this );
+                f.finish_construction( range_, stuff_last_ );
+                return &f;
+            } else {
+                n->body = &f;
+                n->incoming = incoming_;
+                n->stuff_last = stuff_last_;
+                return n;
+            }
+        }
+        /*override*/ task* execute() {
+            if( body ) {
+                if( incoming )
+                    left_sum->body.reverse_join( incoming->body );
+                recycle_as_continuation();
+                sum_node& c = *this;
+                task* b = c.create_child(Range(range,split()),*left_sum,right,left_sum,stuff_last);
+                task* a = left_is_final ? NULL : c.create_child(range,*body,left,incoming,NULL);
+                set_ref_count( (a!=NULL)+(b!=NULL) );
+                body = NULL; 
+                if( a ) spawn(*b);
+                else a = b;
+                return a;
+            } else {
+                return NULL;
+            }
+        }
+        template<typename Range_,typename Body_,typename Partitioner_>
+        friend class start_scan;
+
+        template<typename Range_,typename Body_>
+        friend class finish_scan;
+    };
+
+    //! Combine partial results
+    /** @ingroup algorithms */
+    template<typename Range, typename Body>
+    class finish_scan: public task {
+        typedef sum_node<Range,Body> sum_node_type;
+        typedef final_sum<Range,Body> final_sum_type;
+        final_sum_type** const sum;
+        sum_node_type*& return_slot;
+    public:
+        final_sum_type* right_zombie;
+        sum_node_type& result;
+
+        /*override*/ task* execute() {
+            __TBB_ASSERT( result.ref_count()==(result.left!=NULL)+(result.right!=NULL), NULL );
+            if( result.left )
+                result.left_is_final = false;
+            if( right_zombie && sum ) 
+                ((*sum)->body).reverse_join(result.left_sum->body);
+            __TBB_ASSERT( !return_slot, NULL );
+            if( right_zombie || result.right ) {
+                return_slot = &result;
+            } else {
+                destroy( result );
+            }
+            if( right_zombie && !sum && !result.right ) destroy(*right_zombie);
+            return NULL;
+        }
+
+        finish_scan( sum_node_type*& return_slot_, final_sum_type** sum_, sum_node_type& result_ ) : 
+            sum(sum_),
+            return_slot(return_slot_), 
+            right_zombie(NULL),
+            result(result_)
+        {
+            __TBB_ASSERT( !return_slot, NULL );
+        }
+    };
+
+    //! Initial task to split the work
+    /** @ingroup algorithms */
+    template<typename Range, typename Body, typename Partitioner=simple_partitioner>
+    class start_scan: public task {
+        typedef sum_node<Range,Body> sum_node_type;
+        typedef final_sum<Range,Body> final_sum_type;
+        final_sum_type* body;
+        /** Non-null if caller is requesting total. */
+        final_sum_type** sum; 
+        sum_node_type** return_slot;
+        /** Null if computing root. */
+        sum_node_type* parent_sum;
+        bool is_final;
+        bool is_right_child;
+        Range range;
+        typename Partitioner::partition_type partition;
+        /*override*/ task* execute();
+    public:
+        start_scan( sum_node_type*& return_slot_, start_scan& parent_, sum_node_type* parent_sum_ ) :
+            body(parent_.body),
+            sum(parent_.sum),
+            return_slot(&return_slot_),
+            parent_sum(parent_sum_),
+            is_final(parent_.is_final),
+            is_right_child(false),
+            range(parent_.range,split()),
+            partition(parent_.partition,split())
+        {
+            __TBB_ASSERT( !*return_slot, NULL );
+        }
+
+        start_scan( sum_node_type*& return_slot_, const Range& range_, final_sum_type& body_, const Partitioner& partitioner_) :
+            body(&body_),
+            sum(NULL),
+            return_slot(&return_slot_),
+            parent_sum(NULL),
+            is_final(true),
+            is_right_child(false),
+            range(range_),
+            partition(partitioner_)
+        {
+            __TBB_ASSERT( !*return_slot, NULL );
+        }
+
+        static void run(  const Range& range, Body& body, const Partitioner& partitioner ) {
+            if( !range.empty() ) {
+                typedef internal::start_scan<Range,Body,Partitioner> start_pass1_type;
+                internal::sum_node<Range,Body>* root = NULL;
+                typedef internal::final_sum<Range,Body> final_sum_type;
+                final_sum_type* temp_body = new(task::allocate_root()) final_sum_type( body );
+                start_pass1_type& pass1 = *new(task::allocate_root()) start_pass1_type(
+                    /*return_slot=*/root,
+                    range,
+                    *temp_body,
+                    partitioner );
+                task::spawn_root_and_wait( pass1 );
+                if( root ) {
+                    root->body = temp_body;
+                    root->incoming = NULL;
+                    root->stuff_last = &body;
+                    task::spawn_root_and_wait( *root );
+                } else {
+                    body.assign(temp_body->body);
+                    temp_body->finish_construction( range, NULL );
+                    temp_body->destroy(*temp_body);
+                }
+            }
+        }
+    };
+
+    template<typename Range, typename Body, typename Partitioner>
+    task* start_scan<Range,Body,Partitioner>::execute() {
+        typedef internal::finish_scan<Range,Body> finish_pass1_type;
+        finish_pass1_type* p = parent_sum ? static_cast<finish_pass1_type*>( parent() ) : NULL;
+        // Inspecting p->result.left_sum would ordinarily be a race condition.
+        // But we inspect it only if we are not a stolen task, in which case we
+        // know that task assigning to p->result.left_sum has completed.
+        bool treat_as_stolen = is_right_child && (is_stolen_task() || body!=p->result.left_sum);
+        if( treat_as_stolen ) {
+            // Invocation is for right child that has been really stolen or needs to be virtually stolen
+            p->right_zombie = body = new( allocate_root() ) final_sum_type(body->body);
+            is_final = false;
+        }
+        task* next_task = NULL;
+        if( (is_right_child && !treat_as_stolen) || !range.is_divisible() || partition.should_execute_range(*this) ) {
+            if( is_final )
+                (body->body)( range, final_scan_tag() );
+            else if( sum )
+                (body->body)( range, pre_scan_tag() );
+            if( sum ) 
+                *sum = body;
+            __TBB_ASSERT( !*return_slot, NULL );
+        } else {
+            sum_node_type* result;
+            if( parent_sum ) 
+                result = new(allocate_additional_child_of(*parent_sum)) sum_node_type(range,/*left_is_final=*/is_final);
+            else
+                result = new(task::allocate_root()) sum_node_type(range,/*left_is_final=*/is_final);
+            finish_pass1_type& c = *new( allocate_continuation()) finish_pass1_type(*return_slot,sum,*result);
+            // Split off right child
+            start_scan& b = *new( c.allocate_child() ) start_scan( /*return_slot=*/result->right, *this, result );
+            b.is_right_child = true;    
+            // Left child is recycling of *this.  Must recycle this before spawning b, 
+            // otherwise b might complete and decrement c.ref_count() to zero, which
+            // would cause c.execute() to run prematurely.
+            recycle_as_child_of(c);
+            c.set_ref_count(2);
+            c.spawn(b);
+            sum = &result->left_sum;
+            return_slot = &result->left;
+            is_right_child = false;
+            next_task = this;
+            parent_sum = result; 
+            __TBB_ASSERT( !*return_slot, NULL );
+        }
+        return next_task;
+    } 
+} // namespace internal
+//! @endcond
+
+// Requirements on Range concept are documented in blocked_range.h
+
+/** \page parallel_scan_body_req Requirements on parallel_scan body
+    Class \c Body implementing the concept of parallel_reduce body must define:
+    - \code Body::Body( Body&, split ); \endcode    Splitting constructor.
+                                                    Split \c b so that \c this and \c b can accumulate separately
+    - \code Body::~Body(); \endcode                 Destructor
+    - \code void Body::operator()( const Range& r, pre_scan_tag ); \endcode
+                                                    Preprocess iterations for range \c r
+    - \code void Body::operator()( const Range& r, final_scan_tag ); \endcode 
+                                                    Do final processing for iterations of range \c r
+    - \code void Body::reverse_join( Body& a ); \endcode
+                                                    Merge preprocessing state of \c a into \c this, where \c a was 
+                                                    created earlier from \c b by b's splitting constructor
+**/
+
+/** \name parallel_scan
+    See also requirements on \ref range_req "Range" and \ref parallel_scan_body_req "parallel_scan Body". **/
+//@{
+
+//! Parallel prefix with default partitioner
+/** @ingroup algorithms **/
+template<typename Range, typename Body>
+void parallel_scan( const Range& range, Body& body ) {
+    internal::start_scan<Range,Body,__TBB_DEFAULT_PARTITIONER>::run(range,body,__TBB_DEFAULT_PARTITIONER());
+}
+
+//! Parallel prefix with simple_partitioner
+/** @ingroup algorithms **/
+template<typename Range, typename Body>
+void parallel_scan( const Range& range, Body& body, const simple_partitioner& partitioner ) {
+    internal::start_scan<Range,Body,simple_partitioner>::run(range,body,partitioner);
+}
+
+//! Parallel prefix with auto_partitioner
+/** @ingroup algorithms **/
+template<typename Range, typename Body>
+void parallel_scan( const Range& range, Body& body, const auto_partitioner& partitioner ) {
+    internal::start_scan<Range,Body,auto_partitioner>::run(range,body,partitioner);
+}
+//@}
+
+} // namespace tbb
+
+#endif /* __TBB_parallel_scan_H */
+
diff --git a/tbb30_20100406oss/include/tbb/parallel_sort.h b/tbb30_20100406oss/include/tbb/parallel_sort.h
new file mode 100644 (file)
index 0000000..6fbbe80
--- /dev/null
@@ -0,0 +1,227 @@
+/*
+    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB_parallel_sort_H
+#define __TBB_parallel_sort_H
+
+#include "parallel_for.h"
+#include "blocked_range.h"
+#include <algorithm>
+#include <iterator>
+#include <functional>
+
+namespace tbb {
+
+//! @cond INTERNAL
+namespace internal {
+
+//! Range used in quicksort to split elements into subranges based on a value.
+/** The split operation selects a splitter and places all elements less than or equal 
+    to the value in the first range and the remaining elements in the second range.
+    @ingroup algorithms */
+template<typename RandomAccessIterator, typename Compare>
+class quick_sort_range: private no_assign {
+
+    inline size_t median_of_three(const RandomAccessIterator &array, size_t l, size_t m, size_t r) const {
+        return comp(array[l], array[m]) ? ( comp(array[m], array[r]) ? m : ( comp( array[l], array[r]) ? r : l ) ) 
+                                        : ( comp(array[r], array[m]) ? m : ( comp( array[r], array[l] ) ? r : l ) );
+    }
+
+    inline size_t pseudo_median_of_nine( const RandomAccessIterator &array, const quick_sort_range &range ) const {
+        size_t offset = range.size/8u;
+        return median_of_three(array, 
+                               median_of_three(array, 0, offset, offset*2),
+                               median_of_three(array, offset*3, offset*4, offset*5),
+                               median_of_three(array, offset*6, offset*7, range.size - 1) );
+
+    }
+
+public:
+
+    static const size_t grainsize = 500;
+    const Compare &comp;
+    RandomAccessIterator begin;
+    size_t size;
+
+    quick_sort_range( RandomAccessIterator begin_, size_t size_, const Compare &comp_ ) :
+        comp(comp_), begin(begin_), size(size_) {}
+
+    bool empty() const {return size==0;}
+    bool is_divisible() const {return size>=grainsize;}
+
+    quick_sort_range( quick_sort_range& range, split ) : comp(range.comp) {
+        RandomAccessIterator array = range.begin;
+        RandomAccessIterator key0 = range.begin; 
+        size_t m = pseudo_median_of_nine(array, range);
+        if (m) std::swap ( array[0], array[m] );
+
+        size_t i=0;
+        size_t j=range.size;
+        // Partition interval [i+1,j-1] with key *key0.
+        for(;;) {
+            __TBB_ASSERT( i<j, NULL );
+            // Loop must terminate since array[l]==*key0.
+            do {
+                --j;
+                __TBB_ASSERT( i<=j, "bad ordering relation?" );
+            } while( comp( *key0, array[j] ));
+            do {
+                __TBB_ASSERT( i<=j, NULL );
+                if( i==j ) goto partition;
+                ++i;
+            } while( comp( array[i],*key0 ));
+            if( i==j ) goto partition;
+            std::swap( array[i], array[j] );
+        }
+partition:
+        // Put the partition key were it belongs
+        std::swap( array[j], *key0 );
+        // array[l..j) is less or equal to key.
+        // array(j..r) is greater or equal to key.
+        // array[j] is equal to key
+        i=j+1;
+        begin = array+i;
+        size = range.size-i;
+        range.size = j;
+    }
+};
+
+//! Body class used to test if elements in a range are presorted
+/** @ingroup algorithms */
+template<typename RandomAccessIterator, typename Compare>
+class quick_sort_pretest_body : internal::no_assign {
+    const Compare &comp;
+
+public:
+    quick_sort_pretest_body(const Compare &_comp) : comp(_comp) {}
+
+    void operator()( const blocked_range<RandomAccessIterator>& range ) const {
+        task &my_task = task::self();
+        RandomAccessIterator my_end = range.end();
+
+        int i = 0;
+        for (RandomAccessIterator k = range.begin(); k != my_end; ++k, ++i) {
+            if ( i%64 == 0 && my_task.is_cancelled() ) break;
+          
+            // The k-1 is never out-of-range because the first chunk starts at begin+serial_cutoff+1
+            if ( comp( *(k), *(k-1) ) ) {
+                my_task.cancel_group_execution();
+                break;
+            }
+        }
+    }
+
+};
+
+//! Body class used to sort elements in a range that is smaller than the grainsize.
+/** @ingroup algorithms */
+template<typename RandomAccessIterator, typename Compare>
+struct quick_sort_body {
+    void operator()( const quick_sort_range<RandomAccessIterator,Compare>& range ) const {
+        //SerialQuickSort( range.begin, range.size, range.comp );
+        std::sort( range.begin, range.begin + range.size, range.comp );
+    }
+};
+
+//! Wrapper method to initiate the sort by calling parallel_for.
+/** @ingroup algorithms */
+template<typename RandomAccessIterator, typename Compare>
+void parallel_quick_sort( RandomAccessIterator begin, RandomAccessIterator end, const Compare& comp ) {
+    task_group_context my_context;
+    const int serial_cutoff = 9;
+
+    __TBB_ASSERT( begin + serial_cutoff < end, "min_parallel_size is smaller than serial cutoff?" );
+    RandomAccessIterator k;
+    for ( k = begin ; k != begin + serial_cutoff; ++k ) {
+        if ( comp( *(k+1), *k ) ) {
+            goto do_parallel_quick_sort;
+        }
+    }
+
+    parallel_for( blocked_range<RandomAccessIterator>(k+1, end),
+                  quick_sort_pretest_body<RandomAccessIterator,Compare>(comp),
+                  auto_partitioner(),
+                  my_context);
+
+    if (my_context.is_group_execution_cancelled())
+do_parallel_quick_sort:
+        parallel_for( quick_sort_range<RandomAccessIterator,Compare>(begin, end-begin, comp ), 
+                      quick_sort_body<RandomAccessIterator,Compare>(),
+                      auto_partitioner() );
+}
+
+} // namespace internal
+//! @endcond
+
+/** \page parallel_sort_iter_req Requirements on iterators for parallel_sort
+    Requirements on value type \c T of \c RandomAccessIterator for \c parallel_sort:
+    - \code void swap( T& x, T& y ) \endcode        Swaps \c x and \c y
+    - \code bool Compare::operator()( const T& x, const T& y ) \endcode
+                                                    True if x comes before y;
+**/
+
+/** \name parallel_sort
+    See also requirements on \ref parallel_sort_iter_req "iterators for parallel_sort". **/
+//@{
+
+//! Sorts the data in [begin,end) using the given comparator 
+/** The compare function object is used for all comparisons between elements during sorting.
+    The compare object must define a bool operator() function.
+    @ingroup algorithms **/
+template<typename RandomAccessIterator, typename Compare>
+void parallel_sort( RandomAccessIterator begin, RandomAccessIterator end, const Compare& comp) { 
+    const int min_parallel_size = 500; 
+    if( end > begin ) {
+        if (end - begin < min_parallel_size) { 
+            std::sort(begin, end, comp);
+        } else {
+            internal::parallel_quick_sort(begin, end, comp);
+        }
+    }
+}
+
+//! Sorts the data in [begin,end) with a default comparator \c std::less<RandomAccessIterator>
+/** @ingroup algorithms **/
+template<typename RandomAccessIterator>
+inline void parallel_sort( RandomAccessIterator begin, RandomAccessIterator end ) { 
+    parallel_sort( begin, end, std::less< typename std::iterator_traits<RandomAccessIterator>::value_type >() );
+}
+
+//! Sorts the data in the range \c [begin,end) with a default comparator \c std::less<T>
+/** @ingroup algorithms **/
+template<typename T>
+inline void parallel_sort( T * begin, T * end ) {
+    parallel_sort( begin, end, std::less< T >() );
+}   
+//@}
+
+
+} // namespace tbb
+
+#endif
+
diff --git a/tbb30_20100406oss/include/tbb/parallel_while.h b/tbb30_20100406oss/include/tbb/parallel_while.h
new file mode 100644 (file)
index 0000000..21c2bc1
--- /dev/null
@@ -0,0 +1,194 @@
+/*
+    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB_parallel_while
+#define __TBB_parallel_while
+
+#include "task.h"
+#include <new>
+
+namespace tbb {
+
+template<typename Body>
+class parallel_while;
+
+//! @cond INTERNAL
+namespace internal {
+
+    template<typename Stream, typename Body> class while_task;
+
+    //! For internal use only.
+    /** Executes one iteration of a while.
+        @ingroup algorithms */
+    template<typename Body>
+    class while_iteration_task: public task {
+        const Body& my_body;
+        typename Body::argument_type my_value;
+        /*override*/ task* execute() {
+            my_body(my_value); 
+            return NULL;
+        }
+        while_iteration_task( const typename Body::argument_type& value, const Body& body ) : 
+            my_body(body), my_value(value)
+        {}
+        template<typename Body_> friend class while_group_task;
+        friend class tbb::parallel_while<Body>;
+    };
+
+    //! For internal use only
+    /** Unpacks a block of iterations.
+        @ingroup algorithms */
+    template<typename Body>
+    class while_group_task: public task {
+        static const size_t max_arg_size = 4;         
+        const Body& my_body;
+        size_t size;
+        typename Body::argument_type my_arg[max_arg_size];
+        while_group_task( const Body& body ) : my_body(body), size(0) {} 
+        /*override*/ task* execute() {
+            typedef while_iteration_task<Body> iteration_type;
+            __TBB_ASSERT( size>0, NULL );
+            task_list list;
+            task* t; 
+            size_t k=0; 
+            for(;;) {
+                t = new( allocate_child() ) iteration_type(my_arg[k],my_body); 
+                if( ++k==size ) break;
+                list.push_back(*t);
+            }
+            set_ref_count(int(k+1));
+            spawn(list);
+            spawn_and_wait_for_all(*t);
+            return NULL;
+        }
+        template<typename Stream, typename Body_> friend class while_task;
+    };
+    
+    //! For internal use only.
+    /** Gets block of iterations from a stream and packages them into a while_group_task.
+        @ingroup algorithms */
+    template<typename Stream, typename Body>
+    class while_task: public task {
+        Stream& my_stream;
+        const Body& my_body;
+        empty_task& my_barrier;
+        /*override*/ task* execute() {
+            typedef while_group_task<Body> block_type;
+            block_type& t = *new( allocate_additional_child_of(my_barrier) ) block_type(my_body);
+            size_t k=0; 
+            while( my_stream.pop_if_present(t.my_arg[k]) ) {
+                if( ++k==block_type::max_arg_size ) {
+                    // There might be more iterations.
+                    recycle_to_reexecute();
+                    break;
+                }
+            }
+            if( k==0 ) {
+                destroy(t);
+                return NULL;
+            } else {
+                t.size = k;
+                return &t;
+            }
+        }
+        while_task( Stream& stream, const Body& body, empty_task& barrier ) : 
+            my_stream(stream),
+            my_body(body),
+            my_barrier(barrier)
+        {} 
+        friend class tbb::parallel_while<Body>;
+    };
+
+} // namespace internal
+//! @endcond
+
+//! Parallel iteration over a stream, with optional addition of more work.
+/** The Body b has the requirement: \n
+        "b(v)"                      \n
+        "b.argument_type"           \n
+    where v is an argument_type
+    @ingroup algorithms */
+template<typename Body>
+class parallel_while: internal::no_copy {
+public:
+    //! Construct empty non-running parallel while.
+    parallel_while() : my_body(NULL), my_barrier(NULL) {}
+
+    //! Destructor cleans up data members before returning.
+    ~parallel_while() {
+        if( my_barrier ) {
+            my_barrier->destroy(*my_barrier);    
+            my_barrier = NULL;
+        }
+    }
+
+    //! Type of items
+    typedef typename Body::argument_type value_type;
+
+    //! Apply body.apply to each item in the stream.
+    /** A Stream s has the requirements \n
+         "S::value_type"                \n
+         "s.pop_if_present(value) is convertible to bool */
+    template<typename Stream>
+    void run( Stream& stream, const Body& body );
+
+    //! Add a work item while running.
+    /** Should be executed only by body.apply or a thread spawned therefrom. */
+    void add( const value_type& item );
+
+private:
+    const Body* my_body;
+    empty_task* my_barrier;
+};
+
+template<typename Body>
+template<typename Stream>
+void parallel_while<Body>::run( Stream& stream, const Body& body ) {
+    using namespace internal;
+    empty_task& barrier = *new( task::allocate_root() ) empty_task();
+    my_body = &body;
+    my_barrier = &barrier;
+    my_barrier->set_ref_count(2);
+    while_task<Stream,Body>& w = *new( my_barrier->allocate_child() ) while_task<Stream,Body>( stream, body, barrier );
+    my_barrier->spawn_and_wait_for_all(w);
+    my_barrier->destroy(*my_barrier);
+    my_barrier = NULL;
+    my_body = NULL;
+}
+
+template<typename Body>
+void parallel_while<Body>::add( const value_type& item ) {
+    __TBB_ASSERT(my_barrier,"attempt to add to parallel_while that is not running");
+    typedef internal::while_iteration_task<Body> iteration_type;
+    iteration_type& i = *new( task::allocate_additional_child_of(*my_barrier) ) iteration_type(item,*my_body);
+    task::self().spawn( i );
+}
+
+} // namespace 
+
+#endif /* __TBB_parallel_while */
diff --git a/tbb30_20100406oss/include/tbb/partitioner.h b/tbb30_20100406oss/include/tbb/partitioner.h
new file mode 100644 (file)
index 0000000..98db3ac
--- /dev/null
@@ -0,0 +1,228 @@
+/*
+    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB_partitioner_H
+#define __TBB_partitioner_H
+
+#include "task.h"
+
+namespace tbb {
+class affinity_partitioner;
+
+//! @cond INTERNAL
+namespace internal {
+size_t __TBB_EXPORTED_FUNC get_initial_auto_partitioner_divisor();
+
+//! Defines entry points into tbb run-time library;
+/** The entry points are the constructor and destructor. */
+class affinity_partitioner_base_v3: no_copy {
+    friend class tbb::affinity_partitioner;
+    //! Array that remembers affinities of tree positions to affinity_id.
+    /** NULL if my_size==0. */
+    affinity_id* my_array;
+    //! Number of elements in my_array.
+    size_t my_size;
+    //! Zeros the fields.
+    affinity_partitioner_base_v3() : my_array(NULL), my_size(0) {}
+    //! Deallocates my_array.
+    ~affinity_partitioner_base_v3() {resize(0);}
+    //! Resize my_array.
+    /** Retains values if resulting size is the same. */
+    void __TBB_EXPORTED_METHOD resize( unsigned factor );
+    friend class affinity_partition_type;
+};
+
+//! Provides default methods for partition objects without affinity.
+class partition_type_base {
+public:
+    void set_affinity( task & ) {}
+    void note_affinity( task::affinity_id ) {}
+    task* continue_after_execute_range() {return NULL;}
+    bool decide_whether_to_delay() {return false;}
+    void spawn_or_delay( bool, task& b ) {
+        task::spawn(b);
+    }
+};
+
+class affinity_partition_type;
+
+template<typename Range, typename Body, typename Partitioner> class start_for;
+template<typename Range, typename Body, typename Partitioner> class start_reduce;
+template<typename Range, typename Body> class start_reduce_with_affinity;
+template<typename Range, typename Body, typename Partitioner> class start_scan;
+
+} // namespace internal
+//! @endcond
+
+//! A simple partitioner 
+/** Divides the range until the range is not divisible. 
+    @ingroup algorithms */
+class simple_partitioner {
+public:
+    simple_partitioner() {}
+private:
+    template<typename Range, typename Body, typename Partitioner> friend class internal::start_for;
+    template<typename Range, typename Body, typename Partitioner> friend class internal::start_reduce;
+    template<typename Range, typename Body, typename Partitioner> friend class internal::start_scan;
+
+    class partition_type: public internal::partition_type_base {
+    public:
+        bool should_execute_range(const task& ) {return false;}
+        partition_type( const simple_partitioner& ) {}
+        partition_type( const partition_type&, split ) {}
+    };
+};
+
+//! An auto partitioner 
+/** The range is initial divided into several large chunks.
+    Chunks are further subdivided into VICTIM_CHUNKS pieces if they are stolen and divisible.
+    @ingroup algorithms */
+class auto_partitioner {
+public:
+    auto_partitioner() {}
+
+private:
+    template<typename Range, typename Body, typename Partitioner> friend class internal::start_for;
+    template<typename Range, typename Body, typename Partitioner> friend class internal::start_reduce;
+    template<typename Range, typename Body, typename Partitioner> friend class internal::start_scan;
+
+    class partition_type: public internal::partition_type_base {
+        size_t num_chunks;
+        static const size_t VICTIM_CHUNKS = 4;
+public:
+        bool should_execute_range(const task &t) {
+            if( num_chunks<VICTIM_CHUNKS && t.is_stolen_task() )
+                num_chunks = VICTIM_CHUNKS;
+            return num_chunks==1;
+        }
+        partition_type( const auto_partitioner& ) : num_chunks(internal::get_initial_auto_partitioner_divisor()) {}
+        partition_type( partition_type& pt, split ) {
+            num_chunks = pt.num_chunks /= 2u;
+        }
+    };
+};
+
+//! An affinity partitioner
+class affinity_partitioner: internal::affinity_partitioner_base_v3 {
+public:
+    affinity_partitioner() {}
+
+private:
+    template<typename Range, typename Body, typename Partitioner> friend class internal::start_for;
+    template<typename Range, typename Body, typename Partitioner> friend class internal::start_reduce;
+    template<typename Range, typename Body> friend class internal::start_reduce_with_affinity;
+    template<typename Range, typename Body, typename Partitioner> friend class internal::start_scan;
+
+    typedef internal::affinity_partition_type partition_type;
+    friend class internal::affinity_partition_type;
+};
+
+//! @cond INTERNAL
+namespace internal {
+
+class affinity_partition_type: public no_copy {
+    //! Must be power of two
+    static const unsigned factor = 16;
+    static const size_t VICTIM_CHUNKS = 4;
+
+    internal::affinity_id* my_array;
+    task_list delay_list;
+    unsigned map_begin, map_end;
+    size_t num_chunks;
+public:
+    affinity_partition_type( affinity_partitioner& ap ) {
+        __TBB_ASSERT( (factor&(factor-1))==0, "factor must be power of two" ); 
+        ap.resize(factor);
+        my_array = ap.my_array;
+        map_begin = 0;
+        map_end = unsigned(ap.my_size);
+        num_chunks = internal::get_initial_auto_partitioner_divisor();
+    }
+    affinity_partition_type(affinity_partition_type& p, split) : my_array(p.my_array) {
+        __TBB_ASSERT( p.map_end-p.map_begin<factor || (p.map_end-p.map_begin)%factor==0, NULL );
+        num_chunks = p.num_chunks /= 2;
+        unsigned e = p.map_end;
+        unsigned d = (e - p.map_begin)/2;
+        if( d>factor ) 
+            d &= 0u-factor;
+        map_end = e;
+        map_begin = p.map_end = e-d;
+    }
+
+    bool should_execute_range(const task &t) {
+        if( num_chunks < VICTIM_CHUNKS && t.is_stolen_task() )
+            num_chunks = VICTIM_CHUNKS;
+        return num_chunks == 1;
+    }
+
+    void set_affinity( task &t ) {
+        if( map_begin<map_end )
+            t.set_affinity( my_array[map_begin] );
+    }
+    void note_affinity( task::affinity_id id ) {
+        if( map_begin<map_end ) 
+            my_array[map_begin] = id;
+    }
+    task* continue_after_execute_range() {
+        task* first = NULL;
+        if( !delay_list.empty() ) {
+            first = &delay_list.pop_front();
+            while( !delay_list.empty() ) {
+                task::spawn(*first);
+                first = &delay_list.pop_front();
+            }
+        }
+        return first;
+    }
+    bool decide_whether_to_delay() {
+        // The possible underflow caused by "-1u" is deliberate
+        return (map_begin&(factor-1))==0 && map_end-map_begin-1u<factor;
+    }
+    void spawn_or_delay( bool delay, task& b ) {
+        if( delay )  
+            delay_list.push_back(b);
+        else 
+            task::spawn(b);
+    }
+
+    ~affinity_partition_type() {
+        // The delay_list can be non-empty if an exception is thrown.
+        while( !delay_list.empty() ) {
+            task& t = delay_list.pop_front();
+            t.destroy(t);
+        } 
+    }
+};
+
+} // namespace internal
+//! @endcond
+
+
+} // namespace tbb
+
+#endif /* __TBB_partitioner_H */
diff --git a/tbb30_20100406oss/include/tbb/pipeline.h b/tbb30_20100406oss/include/tbb/pipeline.h
new file mode 100644 (file)
index 0000000..508c0e4
--- /dev/null
@@ -0,0 +1,536 @@
+/*
+    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB_pipeline_H 
+#define __TBB_pipeline_H 
+
+#include "atomic.h"
+#include "task.h"
+#include <cstddef>
+
+namespace tbb {
+
+class pipeline;
+class filter;
+
+//! @cond INTERNAL
+namespace internal {
+
+// The argument for PIPELINE_VERSION should be an integer between 2 and 9
+#define __TBB_PIPELINE_VERSION(x) (unsigned char)(x-2)<<1
+
+typedef unsigned long Token;
+typedef long tokendiff_t;
+class stage_task;
+class input_buffer;
+class pipeline_root_task;
+class pipeline_cleaner;
+
+} // namespace internal
+
+namespace interface5 {
+    template<typename T, typename U> class filter_t;
+
+    namespace internal {
+        class pipeline_proxy;
+    }
+}
+
+//! @endcond
+
+//! A stage in a pipeline.
+/** @ingroup algorithms */
+class filter: internal::no_copy {
+private:
+    //! Value used to mark "not in pipeline"
+    static filter* not_in_pipeline() {return reinterpret_cast<filter*>(intptr_t(-1));}
+    
+    //! The lowest bit 0 is for parallel vs. serial
+    static const unsigned char filter_is_serial = 0x1; 
+
+    //! 4th bit distinguishes ordered vs unordered filters.
+    /** The bit was not set for parallel filters in TBB 2.1 and earlier,
+        but is_ordered() function always treats parallel filters as out of order. */
+    static const unsigned char filter_is_out_of_order = 0x1<<4;  
+
+    //! 5th bit distinguishes thread-bound and regular filters.
+    static const unsigned char filter_is_bound = 0x1<<5;  
+
+    //! 7th bit defines exception propagation mode expected by the application.
+    static const unsigned char exact_exception_propagation =
+#if TBB_USE_CAPTURED_EXCEPTION
+            0x0;
+#else
+            0x1<<7;
+#endif /* TBB_USE_CAPTURED_EXCEPTION */
+
+    static const unsigned char current_version = __TBB_PIPELINE_VERSION(5);
+    static const unsigned char version_mask = 0x7<<1; // bits 1-3 are for version
+public:
+    enum mode {
+        //! processes multiple items in parallel and in no particular order
+        parallel = current_version | filter_is_out_of_order, 
+        //! processes items one at a time; all such filters process items in the same order
+        serial_in_order = current_version | filter_is_serial,
+        //! processes items one at a time and in no particular order
+        serial_out_of_order = current_version | filter_is_serial | filter_is_out_of_order,
+        //! @deprecated use serial_in_order instead
+        serial = serial_in_order
+    };
+protected:
+    filter( bool is_serial_ ) : 
+        next_filter_in_pipeline(not_in_pipeline()),
+        my_input_buffer(NULL),
+        my_filter_mode(static_cast<unsigned char>((is_serial_ ? serial : parallel) | exact_exception_propagation)),
+        prev_filter_in_pipeline(not_in_pipeline()),
+        my_pipeline(NULL),
+        next_segment(NULL)
+    {}
+    
+    filter( mode filter_mode ) :
+        next_filter_in_pipeline(not_in_pipeline()),
+        my_input_buffer(NULL),
+        my_filter_mode(static_cast<unsigned char>(filter_mode | exact_exception_propagation)),
+        prev_filter_in_pipeline(not_in_pipeline()),
+        my_pipeline(NULL),
+        next_segment(NULL)
+    {}
+
+public:
+    //! True if filter is serial.
+    bool is_serial() const {
+        return bool( my_filter_mode & filter_is_serial );
+    }  
+    
+    //! True if filter must receive stream in order.
+    bool is_ordered() const {
+        return (my_filter_mode & (filter_is_out_of_order|filter_is_serial))==filter_is_serial;
+    }
+
+    //! True if filter is thread-bound.
+    bool is_bound() const {
+        return ( my_filter_mode & filter_is_bound )==filter_is_bound;
+    }
+
+    //! Operate on an item from the input stream, and return item for output stream.
+    /** Returns NULL if filter is a sink. */
+    virtual void* operator()( void* item ) = 0;
+
+    //! Destroy filter.  
+    /** If the filter was added to a pipeline, the pipeline must be destroyed first. */
+    virtual __TBB_EXPORTED_METHOD ~filter();
+
+#if __TBB_TASK_GROUP_CONTEXT
+    //! Destroys item if pipeline was cancelled.
+    /** Required to prevent memory leaks.
+        Note it can be called concurrently even for serial filters.*/
+    virtual void finalize( void* /*item*/ ) {};
+#endif
+
+private:
+    //! Pointer to next filter in the pipeline.
+    filter* next_filter_in_pipeline;
+
+    //! Buffer for incoming tokens, or NULL if not required.
+    /** The buffer is required if the filter is serial or follows a thread-bound one. */
+    internal::input_buffer* my_input_buffer;
+
+    friend class internal::stage_task;
+    friend class internal::pipeline_root_task;
+    friend class pipeline;
+    friend class thread_bound_filter;
+
+    //! Storage for filter mode and dynamically checked implementation version.
+    const unsigned char my_filter_mode;
+
+    //! Pointer to previous filter in the pipeline.
+    filter* prev_filter_in_pipeline;
+
+    //! Pointer to the pipeline.
+    pipeline* my_pipeline;
+
+    //! Pointer to the next "segment" of filters, or NULL if not required.
+    /** In each segment, the first filter is not thread-bound but follows a thread-bound one. */
+    filter* next_segment;
+};
+
+//! A stage in a pipeline served by a user thread.
+/** @ingroup algorithms */
+class thread_bound_filter: public filter {
+public:
+    enum result_type {
+        // item was processed
+        success,
+        // item is currently not available
+        item_not_available,
+        // there are no more items to process
+        end_of_stream
+    };
+protected:
+    thread_bound_filter(mode filter_mode): 
+         filter(static_cast<mode>(filter_mode | filter::filter_is_bound | filter::exact_exception_propagation))
+    {}
+public:
+    //! If a data item is available, invoke operator() on that item.  
+    /** This interface is non-blocking.
+        Returns 'success' if an item was processed.
+        Returns 'item_not_available' if no item can be processed now 
+        but more may arrive in the future, or if token limit is reached. 
+        Returns 'end_of_stream' if there are no more items to process. */
+    result_type __TBB_EXPORTED_METHOD try_process_item(); 
+
+    //! Wait until a data item becomes available, and invoke operator() on that item.
+    /** This interface is blocking.
+        Returns 'success' if an item was processed.
+        Returns 'end_of_stream' if there are no more items to process.
+        Never returns 'item_not_available', as it blocks until another return condition applies. */
+    result_type __TBB_EXPORTED_METHOD process_item();
+
+private:
+    //! Internal routine for item processing
+    result_type internal_process_item(bool is_blocking);
+};
+
+//! A processing pipeling that applies filters to items.
+/** @ingroup algorithms */
+class pipeline {
+public:
+    //! Construct empty pipeline.
+    __TBB_EXPORTED_METHOD pipeline();
+
+    /** Though the current implementation declares the destructor virtual, do not rely on this 
+        detail.  The virtualness is deprecated and may disappear in future versions of TBB. */
+    virtual __TBB_EXPORTED_METHOD ~pipeline();
+
+    //! Add filter to end of pipeline.
+    void __TBB_EXPORTED_METHOD add_filter( filter& filter_ );
+
+    //! Run the pipeline to completion.
+    void __TBB_EXPORTED_METHOD run( size_t max_number_of_live_tokens );
+
+#if __TBB_TASK_GROUP_CONTEXT
+    //! Run the pipeline to completion with user-supplied context.
+    void __TBB_EXPORTED_METHOD run( size_t max_number_of_live_tokens, tbb::task_group_context& context );
+#endif
+
+    //! Remove all filters from the pipeline.
+    void __TBB_EXPORTED_METHOD clear();
+
+private:
+    friend class internal::stage_task;
+    friend class internal::pipeline_root_task;
+    friend class filter;
+    friend class thread_bound_filter;
+    friend class internal::pipeline_cleaner;
+    friend class tbb::interface5::internal::pipeline_proxy;
+
+    //! Pointer to first filter in the pipeline.
+    filter* filter_list;
+
+    //! Pointer to location where address of next filter to be added should be stored.
+    filter* filter_end;
+
+    //! task who's reference count is used to determine when all stages are done.
+    task* end_counter;
+
+    //! Number of idle tokens waiting for input stage.
+    atomic<internal::Token> input_tokens;
+
+    //! Global counter of tokens 
+    atomic<internal::Token> token_counter;
+
+    //! False until fetch_input returns NULL.
+    bool end_of_input;
+
+    //! True if the pipeline contains a thread-bound filter; false otherwise.
+    bool has_thread_bound_filters;
+
+    //! Remove filter from pipeline.
+    void remove_filter( filter& filter_ );
+
+    //! Not used, but retained to satisfy old export files.
+    void __TBB_EXPORTED_METHOD inject_token( task& self );
+
+#if __TBB_TASK_GROUP_CONTEXT
+    //! Does clean up if pipeline is cancelled or exception occured
+    void clear_filters();
+#endif
+};
+
+//------------------------------------------------------------------------
+// Support for lambda-friendly parallel_pipeline interface
+//------------------------------------------------------------------------
+
+namespace interface5 {
+
+namespace internal {
+    template<typename T, typename U, typename Body> class concrete_filter;
+}
+
+class flow_control {
+    bool is_pipeline_stopped;
+    flow_control() { is_pipeline_stopped = false; }
+    template<typename T, typename U, typename Body> friend class internal::concrete_filter;
+public:
+    void stop() { is_pipeline_stopped = true; }
+};
+
+//! @cond INTERNAL
+namespace internal {
+
+template<typename T, typename U, typename Body>
+class concrete_filter: public tbb::filter {
+    Body my_body;
+
+    /*override*/ void* operator()(void* input) {
+        T* temp_input = (T*)input;
+        // Call user's operator()() here
+        void* output = (void*) new U(my_body(*temp_input)); 
+        delete temp_input;
+        return output;
+    }
+
+public:
+    concrete_filter(tbb::filter::mode filter_mode, const Body& body) : filter(filter_mode), my_body(body) {}
+};
+
+template<typename U, typename Body>
+class concrete_filter<void,U,Body>: public filter {
+    Body my_body;
+
+    /*override*/void* operator()(void*) {
+        flow_control control;
+        U temp_output = my_body(control);
+        void* output = control.is_pipeline_stopped ? NULL : (void*) new U(temp_output); 
+        return output;
+    }
+public:
+    concrete_filter(tbb::filter::mode filter_mode, const Body& body) : filter(filter_mode), my_body(body) {}
+};
+
+template<typename T, typename Body>
+class concrete_filter<T,void,Body>: public filter {
+    Body my_body;
+   
+    /*override*/ void* operator()(void* input) {
+        T* temp_input = (T*)input;
+        my_body(*temp_input);
+        delete temp_input;
+        return NULL;
+    }
+public:
+    concrete_filter(tbb::filter::mode filter_mode, const Body& body) : filter(filter_mode), my_body(body) {}
+};
+
+template<typename Body>
+class concrete_filter<void,void,Body>: public filter {
+    Body my_body;
+    
+    /** Override privately because it is always called virtually */
+    /*override*/ void* operator()(void*) {
+        flow_control control;
+        my_body(control);
+        void* output = control.is_pipeline_stopped ? NULL : (void*)(intptr_t)-1; 
+        return output;
+    }
+public:
+    concrete_filter(filter::mode filter_mode, const Body& body) : filter(filter_mode), my_body(body) {}
+};
+
+//! The class that represents an object of the pipeline for parallel_pipeline().
+/** It primarily serves as RAII class that deletes heap-allocated filter instances. */
+class pipeline_proxy {
+    tbb::pipeline my_pipe;
+public:
+    pipeline_proxy( const filter_t<void,void>& filter_chain );
+    ~pipeline_proxy() {
+        while( filter* f = my_pipe.filter_list ) 
+            delete f; // filter destructor removes it from the pipeline
+    }
+    tbb::pipeline* operator->() { return &my_pipe; }
+};
+
+//! Abstract base class that represents a node in a parse tree underlying a filter_t.
+/** These nodes are always heap-allocated and can be shared by filter_t objects. */
+class filter_node: tbb::internal::no_copy {
+    /** Count must be atomic because it is hidden state for user, but might be shared by threads. */
+    tbb::atomic<intptr_t> ref_count;
+protected:
+    filter_node() {
+        ref_count = 0;
+#ifdef __TBB_TEST_FILTER_NODE_COUNT
+        ++(__TBB_TEST_FILTER_NODE_COUNT);
+#endif
+    }
+public:
+    //! Add concrete_filter to pipeline 
+    virtual void add_to( pipeline& ) = 0;
+    //! Increment reference count
+    void add_ref() {++ref_count;}
+    //! Decrement reference count and delete if it becomes zero.
+    void remove_ref() {
+        __TBB_ASSERT(ref_count>0,"ref_count underflow");
+        if( --ref_count==0 ) 
+            delete this;
+    }
+    virtual ~filter_node() {
+#ifdef __TBB_TEST_FILTER_NODE_COUNT
+        --(__TBB_TEST_FILTER_NODE_COUNT);
+#endif
+    }
+};
+
+//! Node in parse tree representing result of make_filter.
+template<typename T, typename U, typename Body>
+class filter_node_leaf: public filter_node  {
+    const tbb::filter::mode mode;
+    const Body& body;
+    /*override*/void add_to( pipeline& p ) {
+        concrete_filter<T,U,Body>* f = new concrete_filter<T,U,Body>(mode,body);
+        p.add_filter( *f );
+    }
+public:
+    filter_node_leaf( tbb::filter::mode m, const Body& b ) : mode(m), body(b) {}
+};
+
+//! Node in parse tree representing join of two filters.
+class filter_node_join: public filter_node {
+    friend class filter_node; // to suppress GCC 3.2 warnings
+    filter_node& left;
+    filter_node& right;
+    /*override*/~filter_node_join() {
+       left.remove_ref();
+       right.remove_ref();
+    }
+    /*override*/void add_to( pipeline& p ) {
+        left.add_to(p);
+        right.add_to(p);
+    }
+public:
+    filter_node_join( filter_node& x, filter_node& y ) : left(x), right(y) {
+       left.add_ref();
+       right.add_ref();
+    }
+};
+
+} // namespace internal
+//! @endcond
+
+template<typename T, typename U, typename Body>
+filter_t<T,U> make_filter(tbb::filter::mode mode, const Body& body) {
+    return new internal::filter_node_leaf<T,U,Body>(mode, body);
+}
+
+template<typename T, typename V, typename U>
+filter_t<T,U> operator& (const filter_t<T,V>& left, const filter_t<V,U>& right) {
+    __TBB_ASSERT(left.root,"cannot use default-constructed filter_t as left argument of '&'");
+    __TBB_ASSERT(right.root,"cannot use default-constructed filter_t as right argument of '&'");
+    return new internal::filter_node_join(*left.root,*right.root);
+}
+
+//! Class representing a chain of type-safe pipeline filters
+template<typename T, typename U>
+class filter_t {
+    typedef internal::filter_node filter_node;
+    filter_node* root;
+    filter_t( filter_node* root_ ) : root(root_) {
+        root->add_ref();
+    }
+    friend class internal::pipeline_proxy;
+    template<typename T_, typename U_, typename Body>
+    friend filter_t<T_,U_> make_filter(tbb::filter::mode, const Body& );
+    template<typename T_, typename V_, typename U_>
+    friend filter_t<T_,U_> operator& (const filter_t<T_,V_>& , const filter_t<V_,U_>& );
+public:
+    filter_t() : root(NULL) {}
+    filter_t( const filter_t<T,U>& rhs ) : root(rhs.root) {
+        if( root ) root->add_ref();
+    }
+    template<typename Body>
+    filter_t( tbb::filter::mode mode, const Body& body ) :
+        root( new internal::filter_node_leaf<T,U,Body>(mode, body) ) {
+        root->add_ref();
+    }
+
+    void operator=( const filter_t<T,U>& rhs ) {
+        // Order of operations below carefully chosen so that reference counts remain correct
+        // in unlikely event that remove_ref throws exception.
+        filter_node* old = root;
+        root = rhs.root; 
+        if( root ) root->add_ref();
+        if( old ) old->remove_ref();
+    }
+    ~filter_t() {
+        if( root ) root->remove_ref();
+    }
+    void clear() {
+        // Like operator= with filter_t() on right side.
+        if( root ) {
+            filter_node* old = root;
+            root = NULL;
+            old->remove_ref();
+        }
+    }
+};
+
+inline internal::pipeline_proxy::pipeline_proxy( const filter_t<void,void>& filter_chain ) : my_pipe() {
+    __TBB_ASSERT( filter_chain.root, "cannot apply parallel_pipeline to default-constructed filter_t"  );
+    filter_chain.root->add_to(my_pipe);
+}
+
+inline void parallel_pipeline(size_t max_number_of_live_tokens, const filter_t<void,void>& filter_chain
+#if __TBB_TASK_GROUP_CONTEXT
+    , tbb::task_group_context& context
+#endif
+    ) {
+    internal::pipeline_proxy pipe(filter_chain);
+    // tbb::pipeline::run() is called via the proxy
+    pipe->run(max_number_of_live_tokens
+#if __TBB_TASK_GROUP_CONTEXT
+              , context
+#endif
+    );
+}
+
+#if __TBB_TASK_GROUP_CONTEXT
+inline void parallel_pipeline(size_t max_number_of_live_tokens, const filter_t<void,void>& filter_chain) {
+    tbb::task_group_context context;
+    parallel_pipeline(max_number_of_live_tokens, filter_chain, context);
+}
+#endif // __TBB_TASK_GROUP_CONTEXT
+
+} // interface5
+
+using interface5::flow_control;
+using interface5::filter_t;
+using interface5::make_filter;
+using interface5::parallel_pipeline;
+
+} // tbb
+
+#endif /* __TBB_pipeline_H */
diff --git a/tbb30_20100406oss/include/tbb/queuing_mutex.h b/tbb30_20100406oss/include/tbb/queuing_mutex.h
new file mode 100644 (file)
index 0000000..ec9832c
--- /dev/null
@@ -0,0 +1,131 @@
+/*
+    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB_queuing_mutex_H
+#define __TBB_queuing_mutex_H
+
+#include "tbb_config.h"
+
+#if !TBB_USE_EXCEPTIONS && _MSC_VER
+    // Suppress "C++ exception handler used, but unwind semantics are not enabled" warning in STL headers
+    #pragma warning (push)
+    #pragma warning (disable: 4530)
+#endif
+
+#include <cstring>
+
+#if !TBB_USE_EXCEPTIONS && _MSC_VER
+    #pragma warning (pop)
+#endif
+
+#include "atomic.h"
+#include "tbb_profiling.h"
+
+namespace tbb {
+
+//! Queuing lock with local-only spinning.
+/** @ingroup synchronization */
+class queuing_mutex {
+public:
+    //! Construct unacquired mutex.
+    queuing_mutex() {
+        q_tail = NULL;
+#if TBB_USE_THREADING_TOOLS
+        internal_construct();
+#endif
+    }
+
+    //! The scoped locking pattern
+    /** It helps to avoid the common problem of forgetting to release lock.
+        It also nicely provides the "node" for queuing locks. */
+    class scoped_lock: internal::no_copy {
+        //! Initialize fields to mean "no lock held".
+        void initialize() {
+            mutex = NULL;
+#if TBB_USE_ASSERT
+            internal::poison_pointer(next);
+#endif /* TBB_USE_ASSERT */
+        }
+    public:
+        //! Construct lock that has not acquired a mutex.
+        /** Equivalent to zero-initialization of *this. */
+        scoped_lock() {initialize();}
+
+        //! Acquire lock on given mutex.
+        scoped_lock( queuing_mutex& m ) {
+            initialize();
+            acquire(m);
+        }
+
+        //! Release lock (if lock is held).
+        ~scoped_lock() {
+            if( mutex ) release();
+        }
+
+        //! Acquire lock on given mutex.
+        void __TBB_EXPORTED_METHOD acquire( queuing_mutex& m );
+
+        //! Acquire lock on given mutex if free (i.e. non-blocking)
+        bool __TBB_EXPORTED_METHOD try_acquire( queuing_mutex& m );
+
+        //! Release lock.
+        void __TBB_EXPORTED_METHOD release();
+
+    private:
+        //! The pointer to the mutex owned, or NULL if not holding a mutex.
+        queuing_mutex* mutex;
+
+        //! The pointer to the next competitor for a mutex
+        scoped_lock *next;
+
+        //! The local spin-wait variable
+        /** Inverted (0 - blocked, 1 - acquired the mutex) for the sake of 
+            zero-initialization.  Defining it as an entire word instead of
+            a byte seems to help performance slightly. */
+        uintptr_t going;
+    };
+
+    void __TBB_EXPORTED_METHOD internal_construct();
+
+    // Mutex traits
+    static const bool is_rw_mutex = false;
+    static const bool is_recursive_mutex = false;
+    static const bool is_fair_mutex = true;
+
+    friend class scoped_lock;
+private:
+    //! The last competitor requesting the lock
+    atomic<scoped_lock*> q_tail;
+
+};
+
+__TBB_DEFINE_PROFILING_SET_NAME(queuing_mutex)
+
+} // namespace tbb
+
+#endif /* __TBB_queuing_mutex_H */
diff --git a/tbb30_20100406oss/include/tbb/queuing_rw_mutex.h b/tbb30_20100406oss/include/tbb/queuing_rw_mutex.h
new file mode 100644 (file)
index 0000000..5e35478
--- /dev/null
@@ -0,0 +1,173 @@
+/*
+    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB_queuing_rw_mutex_H
+#define __TBB_queuing_rw_mutex_H
+
+#include "tbb_config.h"
+
+#if !TBB_USE_EXCEPTIONS && _MSC_VER
+    // Suppress "C++ exception handler used, but unwind semantics are not enabled" warning in STL headers
+    #pragma warning (push)
+    #pragma warning (disable: 4530)
+#endif
+
+#include <cstring>
+
+#if !TBB_USE_EXCEPTIONS && _MSC_VER
+    #pragma warning (pop)
+#endif
+
+#include "atomic.h"
+#include "tbb_profiling.h"
+
+namespace tbb {
+
+//! Reader-writer lock with local-only spinning.
+/** Adapted from Krieger, Stumm, et al. pseudocode at
+    http://www.eecg.toronto.edu/parallel/pubs_abs.html#Krieger_etal_ICPP93
+    @ingroup synchronization */
+class queuing_rw_mutex {
+public:
+    //! Construct unacquired mutex.
+    queuing_rw_mutex() {
+        q_tail = NULL;
+#if TBB_USE_THREADING_TOOLS
+        internal_construct();
+#endif
+    }
+
+    //! Destructor asserts if the mutex is acquired, i.e. q_tail is non-NULL
+    ~queuing_rw_mutex() {
+#if TBB_USE_ASSERT
+        __TBB_ASSERT( !q_tail, "destruction of an acquired mutex");
+#endif
+    }
+
+    class scoped_lock;
+    friend class scoped_lock;
+
+    //! The scoped locking pattern
+    /** It helps to avoid the common problem of forgetting to release lock.
+        It also nicely provides the "node" for queuing locks. */
+    class scoped_lock: internal::no_copy {
+        //! Initialize fields
+        void initialize() {
+            mutex = NULL;
+#if TBB_USE_ASSERT
+            state = 0xFF; // Set to invalid state
+            internal::poison_pointer(next);
+            internal::poison_pointer(prev);
+#endif /* TBB_USE_ASSERT */
+        }
+    public:
+        //! Construct lock that has not acquired a mutex.
+        /** Equivalent to zero-initialization of *this. */
+        scoped_lock() {initialize();}
+
+        //! Acquire lock on given mutex.
+        scoped_lock( queuing_rw_mutex& m, bool write=true ) {
+            initialize();
+            acquire(m,write);
+        }
+
+        //! Release lock (if lock is held).
+        ~scoped_lock() {
+            if( mutex ) release();
+        }
+
+        //! Acquire lock on given mutex.
+        void acquire( queuing_rw_mutex& m, bool write=true );
+
+        //! Try acquire lock on given mutex.
+        bool try_acquire( queuing_rw_mutex& m, bool write=true );
+
+        //! Release lock.
+        void release();
+
+        //! Upgrade reader to become a writer.
+        /** Returns true if the upgrade happened without re-acquiring the lock and false if opposite */
+        bool upgrade_to_writer();
+
+        //! Downgrade writer to become a reader.
+        bool downgrade_to_reader();
+
+    private:
+        //! The pointer to the current mutex to work
+        queuing_rw_mutex* mutex;
+
+        //! The pointer to the previous and next competitors for a mutex
+        scoped_lock * prev, * next;
+
+        typedef unsigned char state_t;
+
+        //! State of the request: reader, writer, active reader, other service states
+        atomic<state_t> state;
+
+        //! The local spin-wait variable
+        /** Corresponds to "spin" in the pseudocode but inverted for the sake of zero-initialization */
+        unsigned char going;
+
+        //! A tiny internal lock
+        unsigned char internal_lock;
+
+        //! Acquire the internal lock
+        void acquire_internal_lock();
+
+        //! Try to acquire the internal lock
+        /** Returns true if lock was successfully acquired. */
+        bool try_acquire_internal_lock();
+
+        //! Release the internal lock
+        void release_internal_lock();
+
+        //! Wait for internal lock to be released
+        void wait_for_release_of_internal_lock();
+
+        //! A helper function
+        void unblock_or_wait_on_internal_lock( uintptr_t );
+    };
+
+    void __TBB_EXPORTED_METHOD internal_construct();
+
+    // Mutex traits
+    static const bool is_rw_mutex = true;
+    static const bool is_recursive_mutex = false;
+    static const bool is_fair_mutex = true;
+
+private:
+    //! The last competitor requesting the lock
+    atomic<scoped_lock*> q_tail;
+
+};
+
+__TBB_DEFINE_PROFILING_SET_NAME(queuing_rw_mutex)
+
+} // namespace tbb
+
+#endif /* __TBB_queuing_rw_mutex_H */
diff --git a/tbb30_20100406oss/include/tbb/reader_writer_lock.h b/tbb30_20100406oss/include/tbb/reader_writer_lock.h
new file mode 100644 (file)
index 0000000..3a63969
--- /dev/null
@@ -0,0 +1,240 @@
+/*
+    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB_reader_writer_lock_H
+#define __TBB_reader_writer_lock_H
+
+#include "tbb_thread.h"
+#include "tbb_allocator.h"
+#include "atomic.h"
+
+namespace tbb {
+namespace interface5 {
+//! Writer-preference reader-writer lock with local-only spinning on readers.
+/** Loosely adapted from Mellor-Crummey and Scott pseudocode at
+    http://www.cs.rochester.edu/research/synchronization/pseudocode/rw.html#s_wp
+    @ingroup synchronization */
+    class reader_writer_lock : tbb::internal::no_copy {
+ public:
+    friend class scoped_lock;
+    friend class scoped_lock_read;
+    //! Status type for nodes associated with lock instances
+    /** waiting_nonblocking: the wait state for nonblocking lock
+          instances; for writes, these transition straight to active
+          states; for reads, these are unused.
+
+        waiting: the start and spin state for all lock instances; these will
+          transition to active state when appropriate.  Non-blocking write locks
+          transition from this state to waiting_nonblocking immediately.
+
+        active: the active state means that the lock instance holds
+          the lock; it will transition to invalid state during node deletion
+
+        invalid: the end state for all nodes; this is set in the
+          destructor so if we encounter this state, we are looking at
+          memory that has already been freed
+        
+        The state diagrams below describe the status transitions.
+        Single arrows indicate that the thread that owns the node is
+        responsible for the transition; double arrows indicate that
+        any thread could make the transition.
+
+        State diagram for scoped_lock status:
+
+        waiting ----------> waiting_nonblocking
+          |     _____________/       |
+          V    V                     V
+        active -----------------> invalid
+  
+        State diagram for scoped_lock_read status:
+
+        waiting 
+          |                        
+          V                        
+        active ----------------->invalid
+
+    */
+    enum status_t { waiting_nonblocking, waiting, active, invalid };
+
+    //! Constructs a new reader_writer_lock
+    reader_writer_lock() {
+        internal_construct();
+    }
+
+    //! Destructs a reader_writer_lock object
+    ~reader_writer_lock() {
+        internal_destroy();
+    }
+
+    //! The scoped lock pattern for write locks
+    /** Scoped locks help avoid the common problem of forgetting to release the lock.
+        This type is also serves as the node for queuing locks. */
+    class scoped_lock : tbb::internal::no_copy {
+    public:
+        friend class reader_writer_lock;
+        //! Construct with blocking attempt to acquire write lock on the passed-in lock 
+        scoped_lock(reader_writer_lock& lock) {
+            internal_construct(lock);
+        }
+        
+        //! Destructor, releases the write lock
+        ~scoped_lock() {
+            internal_destroy();
+        }
+
+        void* operator new(size_t s) {
+            return tbb::internal::allocate_via_handler_v3(s);
+        }
+        void operator delete(void* p) {
+            tbb::internal::deallocate_via_handler_v3(p);
+        }
+
+    private:
+        //! The pointer to the mutex to lock
+        reader_writer_lock *mutex;
+        //! The next queued competitor for the mutex
+        scoped_lock* next;
+        //! Status flag of the thread associated with this node
+        atomic<status_t> status;
+
+        //! Construct scoped_lock that is not holding lock
+        scoped_lock();
+
+        void __TBB_EXPORTED_METHOD internal_construct(reader_writer_lock&);
+        void __TBB_EXPORTED_METHOD internal_destroy();
+   };
+
+    //! The scoped lock pattern for read locks
+    class scoped_lock_read : tbb::internal::no_copy {
+    public:
+        friend class reader_writer_lock;
+
+        //! Construct with blocking attempt to acquire read lock on the passed-in lock 
+        scoped_lock_read(reader_writer_lock& lock) {
+            internal_construct(lock);
+        }
+
+        //! Destructor, releases the read lock
+        ~scoped_lock_read() { 
+            internal_destroy();
+        }
+        
+        void* operator new(size_t s) {
+            return tbb::internal::allocate_via_handler_v3(s);
+        }
+        void operator delete(void* p) {
+            tbb::internal::deallocate_via_handler_v3(p);
+        }
+
+    private:
+        //! The pointer to the mutex to lock
+        reader_writer_lock *mutex;
+        //! The next queued competitor for the mutex
+        scoped_lock_read *next;
+        //! Status flag of the thread associated with this node
+        atomic<status_t> status;
+
+        //! Construct scoped_lock_read that is not holding lock
+        scoped_lock_read();
+
+        void __TBB_EXPORTED_METHOD internal_construct(reader_writer_lock&);
+        void __TBB_EXPORTED_METHOD internal_destroy();
+    };
+    
+    //! Acquires the reader_writer_lock for write.  
+    /** If the lock is currently held in write mode by another
+        context, the writer will block by spinning on a local
+        variable.  Exceptions thrown: improper_lock The context tries
+        to acquire a reader_writer_lock that it already has write
+        ownership of.*/
+    void __TBB_EXPORTED_METHOD lock();
+
+    //! Tries to acquire the reader_writer_lock for write.   
+    /** This function does not block.  Return Value: True or false,
+        depending on whether the lock is acquired or not.  If the lock
+        is already held by this acquiring context, try_lock() returns
+        false. */
+    bool __TBB_EXPORTED_METHOD try_lock();
+
+    //! Acquires the reader_writer_lock for read.    
+    /** If the lock is currently held by a writer, this reader will
+        block and wait until the writers are done.  Exceptions thrown:
+        improper_lock The context tries to acquire a
+        reader_writer_lock that it already has write ownership of. */
+    void __TBB_EXPORTED_METHOD lock_read(); 
+
+    //! Tries to acquire the reader_writer_lock for read.  
+    /** This function does not block.  Return Value: True or false,
+        depending on whether the lock is acquired or not.  */
+    bool __TBB_EXPORTED_METHOD try_lock_read();
+
+    //! Releases the reader_writer_lock
+    void __TBB_EXPORTED_METHOD unlock();
+
+ private:
+    void __TBB_EXPORTED_METHOD internal_construct();
+    void __TBB_EXPORTED_METHOD internal_destroy();
+
+    //! Attempts to acquire write lock
+    /** If unavailable, spins in blocking case, returns false in non-blocking case. */
+    bool start_write(scoped_lock *);
+    //! Sets writer_head to w and attempts to unblock
+    void set_next_writer(scoped_lock *w);
+    //! Relinquishes write lock to next waiting writer or group of readers 
+    void end_write(scoped_lock *);
+    //! Checks if current thread holds write lock
+    bool is_current_writer();
+
+    //! Attempts to acquire read lock
+    /** If unavailable, spins in blocking case, returns false in non-blocking case. */
+    void start_read(scoped_lock_read *);
+    //! Unblocks pending readers
+    void unblock_readers();
+    //! Relinquishes read lock by decrementing counter; last reader wakes pending writer
+    void end_read();
+
+    //! The list of pending readers
+    atomic<scoped_lock_read*> reader_head;
+    //! The list of pending writers
+    atomic<scoped_lock*> writer_head;
+    //! The last node in the list of pending writers
+    atomic<scoped_lock*> writer_tail;
+    //! Writer that owns the mutex; tbb_thread::id() otherwise.
+    tbb_thread::id my_current_writer;
+    //! Status of mutex
+    atomic<unsigned> rdr_count_and_flags;
+};
+
+} // namespace interface5
+
+using interface5::reader_writer_lock;
+
+} // namespace tbb
+
+#endif /* __TBB_reader_writer_lock_H */
diff --git a/tbb30_20100406oss/include/tbb/recursive_mutex.h b/tbb30_20100406oss/include/tbb/recursive_mutex.h
new file mode 100644 (file)
index 0000000..ddf4283
--- /dev/null
@@ -0,0 +1,245 @@
+/*
+    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB_recursive_mutex_H
+#define __TBB_recursive_mutex_H
+
+#if _WIN32||_WIN64
+    #include <windows.h>
+    #if !defined(_WIN32_WINNT)
+    // The following Windows API function is declared explicitly;
+    // otherwise any user would have to specify /D_WIN32_WINNT=0x0400
+    extern "C" BOOL WINAPI TryEnterCriticalSection( LPCRITICAL_SECTION );
+    #endif
+#else /* if not _WIN32||_WIN64 */
+    #include <pthread.h>
+#endif /* _WIN32||_WIN64 */
+
+#include <new>
+#include "aligned_space.h"
+#include "tbb_stddef.h"
+#include "tbb_profiling.h"
+
+namespace tbb {
+//! Mutex that allows recursive mutex acquisition.
+/** Mutex that allows recursive mutex acquisition.
+    @ingroup synchronization */
+class recursive_mutex {
+public:
+    //! Construct unacquired recursive_mutex.
+    recursive_mutex() {
+#if TBB_USE_ASSERT || TBB_USE_THREADING_TOOLS
+        internal_construct();
+#else
+  #if _WIN32||_WIN64
+        InitializeCriticalSection(&impl);
+  #else
+        pthread_mutexattr_t mtx_attr;
+        int error_code = pthread_mutexattr_init( &mtx_attr );
+        if( error_code )
+            tbb::internal::handle_perror(error_code,"recursive_mutex: pthread_mutexattr_init failed");
+
+        pthread_mutexattr_settype( &mtx_attr, PTHREAD_MUTEX_RECURSIVE );
+        error_code = pthread_mutex_init( &impl, &mtx_attr );
+        if( error_code )
+            tbb::internal::handle_perror(error_code,"recursive_mutex: pthread_mutex_init failed");
+
+        pthread_mutexattr_destroy( &mtx_attr );
+  #endif /* _WIN32||_WIN64*/
+#endif /* TBB_USE_ASSERT */
+    };
+
+    ~recursive_mutex() {
+#if TBB_USE_ASSERT
+        internal_destroy();
+#else
+  #if _WIN32||_WIN64
+        DeleteCriticalSection(&impl);
+  #else
+        pthread_mutex_destroy(&impl); 
+
+  #endif /* _WIN32||_WIN64 */
+#endif /* TBB_USE_ASSERT */
+    };
+
+    class scoped_lock;
+    friend class scoped_lock;
+
+    //! The scoped locking pattern
+    /** It helps to avoid the common problem of forgetting to release lock.
+        It also nicely provides the "node" for queuing locks. */
+    class scoped_lock: internal::no_copy {
+    public:
+        //! Construct lock that has not acquired a recursive_mutex. 
+        scoped_lock() : my_mutex(NULL) {};
+
+        //! Acquire lock on given mutex.
+        scoped_lock( recursive_mutex& mutex ) {
+#if TBB_USE_ASSERT
+            my_mutex = &mutex; 
+#endif /* TBB_USE_ASSERT */
+            acquire( mutex );
+        }
+
+        //! Release lock (if lock is held).
+        ~scoped_lock() {
+            if( my_mutex ) 
+                release();
+        }
+
+        //! Acquire lock on given mutex.
+        void acquire( recursive_mutex& mutex ) {
+#if TBB_USE_ASSERT
+            internal_acquire( mutex );
+#else
+            my_mutex = &mutex;
+            mutex.lock();
+#endif /* TBB_USE_ASSERT */
+        }
+
+        //! Try acquire lock on given recursive_mutex.
+        bool try_acquire( recursive_mutex& mutex ) {
+#if TBB_USE_ASSERT
+            return internal_try_acquire( mutex );
+#else
+            bool result = mutex.try_lock();
+            if( result )
+                my_mutex = &mutex;
+            return result;
+#endif /* TBB_USE_ASSERT */
+        }
+
+        //! Release lock
+        void release() {
+#if TBB_USE_ASSERT
+            internal_release();
+#else
+            my_mutex->unlock();
+            my_mutex = NULL;
+#endif /* TBB_USE_ASSERT */
+        }
+
+    private:
+        //! The pointer to the current recursive_mutex to work
+        recursive_mutex* my_mutex;
+
+        //! All checks from acquire using mutex.state were moved here
+        void __TBB_EXPORTED_METHOD internal_acquire( recursive_mutex& m );
+
+        //! All checks from try_acquire using mutex.state were moved here
+        bool __TBB_EXPORTED_METHOD internal_try_acquire( recursive_mutex& m );
+
+        //! All checks from release using mutex.state were moved here
+        void __TBB_EXPORTED_METHOD internal_release();
+
+        friend class recursive_mutex;
+    };
+
+    // Mutex traits
+    static const bool is_rw_mutex = false;
+    static const bool is_recursive_mutex = true;
+    static const bool is_fair_mutex = false;
+
+    // C++0x compatibility interface
+    
+    //! Acquire lock
+    void lock() {
+#if TBB_USE_ASSERT
+        aligned_space<scoped_lock,1> tmp;
+        new(tmp.begin()) scoped_lock(*this);
+#else
+  #if _WIN32||_WIN64
+        EnterCriticalSection(&impl);
+  #else
+        pthread_mutex_lock(&impl);
+  #endif /* _WIN32||_WIN64 */
+#endif /* TBB_USE_ASSERT */
+    }
+
+    //! Try acquiring lock (non-blocking)
+    /** Return true if lock acquired; false otherwise. */
+    bool try_lock() {
+#if TBB_USE_ASSERT
+        aligned_space<scoped_lock,1> tmp;
+        return (new(tmp.begin()) scoped_lock)->internal_try_acquire(*this);
+#else        
+  #if _WIN32||_WIN64
+        return TryEnterCriticalSection(&impl)!=0;
+  #else
+        return pthread_mutex_trylock(&impl)==0;
+  #endif /* _WIN32||_WIN64 */
+#endif /* TBB_USE_ASSERT */
+    }
+
+    //! Release lock
+    void unlock() {
+#if TBB_USE_ASSERT
+        aligned_space<scoped_lock,1> tmp;
+        scoped_lock& s = *tmp.begin();
+        s.my_mutex = this;
+        s.internal_release();
+#else
+  #if _WIN32||_WIN64
+        LeaveCriticalSection(&impl);
+  #else
+        pthread_mutex_unlock(&impl);
+  #endif /* _WIN32||_WIN64 */
+#endif /* TBB_USE_ASSERT */
+    }
+
+    //! Return native_handle
+  #if _WIN32||_WIN64
+    typedef LPCRITICAL_SECTION native_handle_type;
+  #else
+    typedef pthread_mutex_t* native_handle_type;
+  #endif
+    native_handle_type native_handle() { return (native_handle_type) &impl; }
+
+private:
+#if _WIN32||_WIN64
+    CRITICAL_SECTION impl;
+    enum state_t {
+        INITIALIZED=0x1234,
+        DESTROYED=0x789A,
+    } state;
+#else
+    pthread_mutex_t impl;
+#endif /* _WIN32||_WIN64 */
+
+    //! All checks from mutex constructor using mutex.state were moved here
+    void __TBB_EXPORTED_METHOD internal_construct();
+
+    //! All checks from mutex destructor using mutex.state were moved here
+    void __TBB_EXPORTED_METHOD internal_destroy();
+};
+
+__TBB_DEFINE_PROFILING_SET_NAME(recursive_mutex)
+
+} // namespace tbb 
+
+#endif /* __TBB_recursive_mutex_H */
diff --git a/tbb30_20100406oss/include/tbb/scalable_allocator.h b/tbb30_20100406oss/include/tbb/scalable_allocator.h
new file mode 100644 (file)
index 0000000..2293803
--- /dev/null
@@ -0,0 +1,205 @@
+/*
+    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB_scalable_allocator_H
+#define __TBB_scalable_allocator_H
+/** @file */
+
+#include <stddef.h> /* Need ptrdiff_t and size_t from here. */
+
+#if !defined(__cplusplus) && __ICC==1100
+    #pragma warning (push)
+    #pragma warning (disable: 991)
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+#if _MSC_VER >= 1400
+#define __TBB_EXPORTED_FUNC   __cdecl
+#else
+#define __TBB_EXPORTED_FUNC
+#endif
+
+/** The "malloc" analogue to allocate block of memory of size bytes.
+  * @ingroup memory_allocation */
+void * __TBB_EXPORTED_FUNC scalable_malloc (size_t size);
+
+/** The "free" analogue to discard a previously allocated piece of memory.
+    @ingroup memory_allocation */
+void   __TBB_EXPORTED_FUNC scalable_free (void* ptr);
+
+/** The "realloc" analogue complementing scalable_malloc.
+    @ingroup memory_allocation */
+void * __TBB_EXPORTED_FUNC scalable_realloc (void* ptr, size_t size);
+
+/** The "calloc" analogue complementing scalable_malloc.
+    @ingroup memory_allocation */
+void * __TBB_EXPORTED_FUNC scalable_calloc (size_t nobj, size_t size);
+
+/** The "posix_memalign" analogue.
+    @ingroup memory_allocation */
+int __TBB_EXPORTED_FUNC scalable_posix_memalign (void** memptr, size_t alignment, size_t size);
+
+/** The "_aligned_malloc" analogue.
+    @ingroup memory_allocation */
+void * __TBB_EXPORTED_FUNC scalable_aligned_malloc (size_t size, size_t alignment);
+
+/** The "_aligned_realloc" analogue.
+    @ingroup memory_allocation */
+void * __TBB_EXPORTED_FUNC scalable_aligned_realloc (void* ptr, size_t size, size_t alignment);
+
+/** The "_aligned_free" analogue.
+    @ingroup memory_allocation */
+void __TBB_EXPORTED_FUNC scalable_aligned_free (void* ptr);
+
+/** The analogue of _msize/malloc_size/malloc_usable_size.
+    Returns the usable size of a memory block previously allocated by scalable_*,
+    or 0 (zero) if ptr does not point to such a block.
+    @ingroup memory_allocation */
+size_t __TBB_EXPORTED_FUNC scalable_msize (void* ptr);
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif /* __cplusplus */
+
+#ifdef __cplusplus
+
+#include <new>      /* To use new with the placement argument */
+
+/* Ensure that including this header does not cause implicit linkage with TBB */
+#ifndef __TBB_NO_IMPLICIT_LINKAGE
+    #define __TBB_NO_IMPLICIT_LINKAGE 1
+    #include "tbb_stddef.h"
+    #undef  __TBB_NO_IMPLICIT_LINKAGE
+#else
+    #include "tbb_stddef.h"
+#endif
+
+
+namespace tbb {
+
+#if _MSC_VER && !defined(__INTEL_COMPILER)
+    // Workaround for erroneous "unreferenced parameter" warning in method destroy.
+    #pragma warning (push)
+    #pragma warning (disable: 4100)
+#endif
+
+//! Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5
+/** The members are ordered the same way they are in section 20.4.1
+    of the ISO C++ standard.
+    @ingroup memory_allocation */
+template<typename T>
+class scalable_allocator {
+public:
+    typedef typename internal::allocator_type<T>::value_type value_type;
+    typedef value_type* pointer;
+    typedef const value_type* const_pointer;
+    typedef value_type& reference;
+    typedef const value_type& const_reference;
+    typedef size_t size_type;
+    typedef ptrdiff_t difference_type;
+    template<class U> struct rebind {
+        typedef scalable_allocator<U> other;
+    };
+
+    scalable_allocator() throw() {}
+    scalable_allocator( const scalable_allocator& ) throw() {}
+    template<typename U> scalable_allocator(const scalable_allocator<U>&) throw() {}
+
+    pointer address(reference x) const {return &x;}
+    const_pointer address(const_reference x) const {return &x;}
+
+    //! Allocate space for n objects.
+    pointer allocate( size_type n, const void* /*hint*/ =0 ) {
+        return static_cast<pointer>( scalable_malloc( n * sizeof(value_type) ) );
+    }
+
+    //! Free previously allocated block of memory
+    void deallocate( pointer p, size_type ) {
+        scalable_free( p );
+    }
+
+    //! Largest value for which method allocate might succeed.
+    size_type max_size() const throw() {
+        size_type absolutemax = static_cast<size_type>(-1) / sizeof (value_type);
+        return (absolutemax > 0 ? absolutemax : 1);
+    }
+    void construct( pointer p, const value_type& value ) {::new((void*)(p)) value_type(value);}
+    void destroy( pointer p ) {p->~value_type();}
+};
+
+#if _MSC_VER && !defined(__INTEL_COMPILER)
+    #pragma warning (pop)
+#endif // warning 4100 is back
+
+//! Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1
+/** @ingroup memory_allocation */
+template<>
+class scalable_allocator<void> {
+public:
+    typedef void* pointer;
+    typedef const void* const_pointer;
+    typedef void value_type;
+    template<class U> struct rebind {
+        typedef scalable_allocator<U> other;
+    };
+};
+
+template<typename T, typename U>
+inline bool operator==( const scalable_allocator<T>&, const scalable_allocator<U>& ) {return true;}
+
+template<typename T, typename U>
+inline bool operator!=( const scalable_allocator<T>&, const scalable_allocator<U>& ) {return false;}
+
+} // namespace tbb
+
+#if _MSC_VER
+    #if __TBB_BUILD && !defined(__TBBMALLOC_NO_IMPLICIT_LINKAGE)
+        #define __TBBMALLOC_NO_IMPLICIT_LINKAGE 1
+    #endif
+
+    #if !__TBBMALLOC_NO_IMPLICIT_LINKAGE
+        #ifdef _DEBUG
+            #pragma comment(lib, "tbbmalloc_debug.lib")
+        #else
+            #pragma comment(lib, "tbbmalloc.lib")
+        #endif
+    #endif
+
+
+#endif
+
+#endif /* __cplusplus */
+
+#if !defined(__cplusplus) && __ICC==1100
+    #pragma warning (pop)
+#endif // ICC 11.0 warning 991 is back
+
+#endif /* __TBB_scalable_allocator_H */
diff --git a/tbb30_20100406oss/include/tbb/spin_mutex.h b/tbb30_20100406oss/include/tbb/spin_mutex.h
new file mode 100644 (file)
index 0000000..a88a14a
--- /dev/null
@@ -0,0 +1,192 @@
+/*
+    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB_spin_mutex_H
+#define __TBB_spin_mutex_H
+
+#include <cstddef>
+#include <new>
+#include "aligned_space.h"
+#include "tbb_stddef.h"
+#include "tbb_machine.h"
+#include "tbb_profiling.h"
+
+namespace tbb {
+
+//! A lock that occupies a single byte.
+/** A spin_mutex is a spin mutex that fits in a single byte.  
+    It should be used only for locking short critical sections 
+    (typically &lt;20 instructions) when fairness is not an issue.  
+    If zero-initialized, the mutex is considered unheld.
+    @ingroup synchronization */
+class spin_mutex {
+    //! 0 if lock is released, 1 if lock is acquired.
+    unsigned char flag;
+
+public:
+    //! Construct unacquired lock.
+    /** Equivalent to zero-initialization of *this. */
+    spin_mutex() : flag(0) {
+#if TBB_USE_THREADING_TOOLS
+        internal_construct();
+#endif
+    }
+
+    //! Represents acquisition of a mutex.
+    class scoped_lock : internal::no_copy {
+    private:
+        //! Points to currently held mutex, or NULL if no lock is held.
+        spin_mutex* my_mutex; 
+
+        //! Value to store into spin_mutex::flag to unlock the mutex.
+        uintptr_t my_unlock_value;
+
+        //! Like acquire, but with ITT instrumentation.
+        void __TBB_EXPORTED_METHOD internal_acquire( spin_mutex& m );
+
+        //! Like try_acquire, but with ITT instrumentation.
+        bool __TBB_EXPORTED_METHOD internal_try_acquire( spin_mutex& m );
+
+        //! Like release, but with ITT instrumentation.
+        void __TBB_EXPORTED_METHOD internal_release();
+
+        friend class spin_mutex;
+
+    public:
+        //! Construct without acquiring a mutex.
+        scoped_lock() : my_mutex(NULL), my_unlock_value(0) {}
+
+        //! Construct and acquire lock on a mutex.
+        scoped_lock( spin_mutex& m ) { 
+#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT
+            my_mutex=NULL;
+            internal_acquire(m);
+#else
+            my_unlock_value = __TBB_LockByte(m.flag);
+            my_mutex=&m;
+#endif /* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT*/
+        }
+
+        //! Acquire lock.
+        void acquire( spin_mutex& m ) {
+#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT
+            internal_acquire(m);
+#else
+            my_unlock_value = __TBB_LockByte(m.flag);
+            my_mutex = &m;
+#endif /* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT*/
+        }
+
+        //! Try acquiring lock (non-blocking)
+        /** Return true if lock acquired; false otherwise. */
+        bool try_acquire( spin_mutex& m ) {
+#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT
+            return internal_try_acquire(m);
+#else
+            bool result = __TBB_TryLockByte(m.flag);
+            if( result ) {
+                my_unlock_value = 0;
+                my_mutex = &m;
+            }
+            return result;
+#endif /* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT*/
+        }
+
+        //! Release lock
+        void release() {
+#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT
+            internal_release();
+#else
+            __TBB_store_with_release(my_mutex->flag, static_cast<unsigned char>(my_unlock_value));
+            my_mutex = NULL;
+#endif /* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT */
+        }
+
+        //! Destroy lock.  If holding a lock, releases the lock first.
+        ~scoped_lock() {
+            if( my_mutex ) {
+#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT
+                internal_release();
+#else
+                __TBB_store_with_release(my_mutex->flag, static_cast<unsigned char>(my_unlock_value));
+#endif /* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT */
+            }
+        }
+    };
+
+    void __TBB_EXPORTED_METHOD internal_construct();
+
+    // Mutex traits
+    static const bool is_rw_mutex = false;
+    static const bool is_recursive_mutex = false;
+    static const bool is_fair_mutex = false;
+
+    // ISO C++0x compatibility methods
+
+    //! Acquire lock
+    void lock() {
+#if TBB_USE_THREADING_TOOLS
+        aligned_space<scoped_lock,1> tmp;
+        new(tmp.begin()) scoped_lock(*this);
+#else
+        __TBB_LockByte(flag);
+#endif /* TBB_USE_THREADING_TOOLS*/
+    }
+
+    //! Try acquiring lock (non-blocking)
+    /** Return true if lock acquired; false otherwise. */
+    bool try_lock() {
+#if TBB_USE_THREADING_TOOLS
+        aligned_space<scoped_lock,1> tmp;
+        return (new(tmp.begin()) scoped_lock)->internal_try_acquire(*this);
+#else
+        return __TBB_TryLockByte(flag);
+#endif /* TBB_USE_THREADING_TOOLS*/
+    }
+
+    //! Release lock
+    void unlock() {
+#if TBB_USE_THREADING_TOOLS
+        aligned_space<scoped_lock,1> tmp;
+        scoped_lock& s = *tmp.begin();
+        s.my_mutex = this;
+        s.my_unlock_value = 0;
+        s.internal_release();
+#else
+        __TBB_store_with_release(flag, 0);
+#endif /* TBB_USE_THREADING_TOOLS */
+    }
+
+    friend class scoped_lock;
+};
+
+__TBB_DEFINE_PROFILING_SET_NAME(spin_mutex)
+
+} // namespace tbb
+
+#endif /* __TBB_spin_mutex_H */
diff --git a/tbb30_20100406oss/include/tbb/spin_rw_mutex.h b/tbb30_20100406oss/include/tbb/spin_rw_mutex.h
new file mode 100644 (file)
index 0000000..38b3a1f
--- /dev/null
@@ -0,0 +1,228 @@
+/*
+    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB_spin_rw_mutex_H
+#define __TBB_spin_rw_mutex_H
+
+#include "tbb_stddef.h"
+#include "tbb_machine.h"
+#include "tbb_profiling.h"
+
+namespace tbb {
+
+class spin_rw_mutex_v3;
+typedef spin_rw_mutex_v3 spin_rw_mutex;
+
+//! Fast, unfair, spinning reader-writer lock with backoff and writer-preference
+/** @ingroup synchronization */
+class spin_rw_mutex_v3 {
+    //! @cond INTERNAL
+
+    //! Internal acquire write lock.
+    bool __TBB_EXPORTED_METHOD internal_acquire_writer();
+
+    //! Out of line code for releasing a write lock.  
+    /** This code is has debug checking and instrumentation for Intel(R) Thread Checker and Intel(R) Thread Profiler. */
+    void __TBB_EXPORTED_METHOD internal_release_writer();
+
+    //! Internal acquire read lock.
+    void __TBB_EXPORTED_METHOD internal_acquire_reader();
+
+    //! Internal upgrade reader to become a writer.
+    bool __TBB_EXPORTED_METHOD internal_upgrade();
+
+    //! Out of line code for downgrading a writer to a reader.   
+    /** This code is has debug checking and instrumentation for Intel(R) Thread Checker and Intel(R) Thread Profiler. */
+    void __TBB_EXPORTED_METHOD internal_downgrade();
+
+    //! Internal release read lock.
+    void __TBB_EXPORTED_METHOD internal_release_reader();
+
+    //! Internal try_acquire write lock.
+    bool __TBB_EXPORTED_METHOD internal_try_acquire_writer();
+
+    //! Internal try_acquire read lock.
+    bool __TBB_EXPORTED_METHOD internal_try_acquire_reader();
+
+    //! @endcond
+public:
+    //! Construct unacquired mutex.
+    spin_rw_mutex_v3() : state(0) {
+#if TBB_USE_THREADING_TOOLS
+        internal_construct();
+#endif
+    }
+
+#if TBB_USE_ASSERT
+    //! Destructor asserts if the mutex is acquired, i.e. state is zero.
+    ~spin_rw_mutex_v3() {
+        __TBB_ASSERT( !state, "destruction of an acquired mutex");
+    };
+#endif /* TBB_USE_ASSERT */
+
+    //! The scoped locking pattern
+    /** It helps to avoid the common problem of forgetting to release lock.
+        It also nicely provides the "node" for queuing locks. */
+    class scoped_lock : internal::no_copy {
+    public:
+        //! Construct lock that has not acquired a mutex.
+        /** Equivalent to zero-initialization of *this. */
+        scoped_lock() : mutex(NULL), is_writer(false) {}
+
+        //! Acquire lock on given mutex.
+        scoped_lock( spin_rw_mutex& m, bool write = true ) : mutex(NULL) {
+            acquire(m, write);
+        }
+
+        //! Release lock (if lock is held).
+        ~scoped_lock() {
+            if( mutex ) release();
+        }
+
+        //! Acquire lock on given mutex.
+        void acquire( spin_rw_mutex& m, bool write = true ) {
+            __TBB_ASSERT( !mutex, "holding mutex already" );
+            is_writer = write; 
+            mutex = &m;
+            if( write ) mutex->internal_acquire_writer();
+            else        mutex->internal_acquire_reader();
+        }
+
+        //! Upgrade reader to become a writer.
+        /** Returns true if the upgrade happened without re-acquiring the lock and false if opposite */
+        bool upgrade_to_writer() {
+            __TBB_ASSERT( mutex, "lock is not acquired" );
+            __TBB_ASSERT( !is_writer, "not a reader" );
+            is_writer = true; 
+            return mutex->internal_upgrade();
+        }
+
+        //! Release lock.
+        void release() {
+            __TBB_ASSERT( mutex, "lock is not acquired" );
+            spin_rw_mutex *m = mutex; 
+            mutex = NULL;
+#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT
+            if( is_writer ) m->internal_release_writer();
+            else            m->internal_release_reader();
+#else
+            if( is_writer ) __TBB_AtomicAND( &m->state, READERS ); 
+            else            __TBB_FetchAndAddWrelease( &m->state, -(intptr_t)ONE_READER);
+#endif /* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT */
+        }
+
+        //! Downgrade writer to become a reader.
+        bool downgrade_to_reader() {
+#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT
+            __TBB_ASSERT( mutex, "lock is not acquired" );
+            __TBB_ASSERT( is_writer, "not a writer" );
+            mutex->internal_downgrade();
+#else
+            __TBB_FetchAndAddW( &mutex->state, ((intptr_t)ONE_READER-WRITER));
+#endif /* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT */
+            is_writer = false;
+
+            return true;
+        }
+
+        //! Try acquire lock on given mutex.
+        bool try_acquire( spin_rw_mutex& m, bool write = true ) {
+            __TBB_ASSERT( !mutex, "holding mutex already" );
+            bool result;
+            is_writer = write; 
+            result = write? m.internal_try_acquire_writer()
+                          : m.internal_try_acquire_reader();
+            if( result ) 
+                mutex = &m;
+            return result;
+        }
+
+    private:
+        //! The pointer to the current mutex that is held, or NULL if no mutex is held.
+        spin_rw_mutex* mutex;
+
+        //! If mutex!=NULL, then is_writer is true if holding a writer lock, false if holding a reader lock.
+        /** Not defined if not holding a lock. */
+        bool is_writer;
+    };
+
+    // Mutex traits
+    static const bool is_rw_mutex = true;
+    static const bool is_recursive_mutex = false;
+    static const bool is_fair_mutex = false;
+
+    // ISO C++0x compatibility methods
+
+    //! Acquire writer lock
+    void lock() {internal_acquire_writer();}
+
+    //! Try acquiring writer lock (non-blocking)
+    /** Return true if lock acquired; false otherwise. */
+    bool try_lock() {return internal_try_acquire_writer();}
+
+    //! Release lock
+    void unlock() {
+#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT
+        if( state&WRITER ) internal_release_writer();
+        else               internal_release_reader();
+#else
+        if( state&WRITER ) __TBB_AtomicAND( &state, READERS ); 
+        else               __TBB_FetchAndAddWrelease( &state, -(intptr_t)ONE_READER);
+#endif /* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT */
+    }
+
+    // Methods for reader locks that resemble ISO C++0x compatibility methods.
+
+    //! Acquire reader lock
+    void lock_read() {internal_acquire_reader();}
+
+    //! Try acquiring reader lock (non-blocking)
+    /** Return true if reader lock acquired; false otherwise. */
+    bool try_lock_read() {return internal_try_acquire_reader();}
+
+private:
+    typedef intptr_t state_t;
+    static const state_t WRITER = 1;
+    static const state_t WRITER_PENDING = 2;
+    static const state_t READERS = ~(WRITER | WRITER_PENDING);
+    static const state_t ONE_READER = 4;
+    static const state_t BUSY = WRITER | READERS;
+    //! State of lock
+    /** Bit 0 = writer is holding lock
+        Bit 1 = request by a writer to acquire lock (hint to readers to wait)
+        Bit 2..N = number of readers holding lock */
+    state_t state;
+
+    void __TBB_EXPORTED_METHOD internal_construct();
+};
+
+__TBB_DEFINE_PROFILING_SET_NAME(spin_rw_mutex)
+
+} // namespace tbb
+
+#endif /* __TBB_spin_rw_mutex_H */
diff --git a/tbb30_20100406oss/include/tbb/task.h b/tbb30_20100406oss/include/tbb/task.h
new file mode 100644 (file)
index 0000000..900f099
--- /dev/null
@@ -0,0 +1,846 @@
+/*
+    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB_task_H
+#define __TBB_task_H
+
+#include "tbb_stddef.h"
+#include "tbb_machine.h"
+
+typedef struct ___itt_caller *__itt_caller;
+
+namespace tbb {
+
+class task;
+class task_list;
+
+#if __TBB_TASK_GROUP_CONTEXT
+class task_group_context;
+#endif /* __TBB_TASK_GROUP_CONTEXT */
+
+// MSVC does not allow taking the address of a member that was defined 
+// privately in task_base and made public in class task via a using declaration.
+#if _MSC_VER || (__GNUC__==3 && __GNUC_MINOR__<3)
+#define __TBB_TASK_BASE_ACCESS public
+#else
+#define __TBB_TASK_BASE_ACCESS private
+#endif
+
+namespace internal {
+
+    class allocate_additional_child_of_proxy: no_assign {
+        //! No longer used, but retained for binary layout compatibility.  Always NULL.
+        task* self;
+        task& parent;
+    public:
+        explicit allocate_additional_child_of_proxy( task& parent_ ) : self(NULL), parent(parent_) {}
+        task& __TBB_EXPORTED_METHOD allocate( size_t size ) const;
+        void __TBB_EXPORTED_METHOD free( task& ) const;
+    };
+
+}
+
+namespace interface5 {
+    namespace internal {
+        //! Base class for methods that became static in TBB 3.0.
+        /** TBB's evolution caused the "this" argument for several methods to become obsolete.
+            However, for backwards binary compatibility, the new methods need distinct names,
+            otherwise the One Definition Rule would be broken.  Hence the new methods are 
+            defined in this private base class, and then exposed in class task via 
+            using declarations. */
+        class task_base: tbb::internal::no_copy {
+        __TBB_TASK_BASE_ACCESS:
+            friend class tbb::task;
+
+            //! Schedule task for execution when a worker becomes available.
+            static void spawn( task& t );
+            //! Spawn multiple tasks and clear list.
+            static void spawn( task_list& list );
+
+            //! Like allocate_child, except that task's parent becomes "t", not this.
+            /** Typically used in conjunction with schedule_to_reexecute to implement while loops.
+               Atomically increments the reference count of t.parent() */
+            static tbb::internal::allocate_additional_child_of_proxy allocate_additional_child_of( task& t ) {
+                return tbb::internal::allocate_additional_child_of_proxy(t);
+            }
+
+            //! Destroy a task.
+            /** Usually, calling this method is unnecessary, because a task is
+                implicitly deleted after its execute() method runs.  However,
+                sometimes a task needs to be explicitly deallocated, such as
+                when a root task is used as the parent in spawn_and_wait_for_all. */
+            static void __TBB_EXPORTED_FUNC destroy( task& victim );
+        }; 
+    } // internal
+} // interface5
+
+//! @cond INTERNAL
+namespace internal {
+
+    class scheduler: no_copy {
+    public:
+        //! For internal use only
+        virtual void spawn( task& first, task*& next ) = 0;
+
+        //! For internal use only
+        virtual void wait_for_all( task& parent, task* child ) = 0;
+
+        //! For internal use only
+        virtual void spawn_root_and_wait( task& first, task*& next ) = 0;
+
+        //! Pure virtual destructor;
+        //  Have to have it just to shut up overzealous compilation warnings
+        virtual ~scheduler() = 0;
+#if __TBB_ARENA_PER_MASTER
+
+        //! For internal use only
+        virtual void enqueue( task& t, void* reserved ) = 0;
+#endif /* __TBB_ARENA_PER_MASTER */
+    };
+
+    //! A reference count
+    /** Should always be non-negative.  A signed type is used so that underflow can be detected. */
+    typedef intptr_t reference_count;
+
+    //! An id as used for specifying affinity.
+    typedef unsigned short affinity_id;
+
+#if __TBB_TASK_GROUP_CONTEXT
+    struct context_list_node_t {
+        context_list_node_t *my_prev,
+                            *my_next;
+    };
+
+    class allocate_root_with_context_proxy: no_assign {
+        task_group_context& my_context;
+    public:
+        allocate_root_with_context_proxy ( task_group_context& ctx ) : my_context(ctx) {}
+        task& __TBB_EXPORTED_METHOD allocate( size_t size ) const;
+        void __TBB_EXPORTED_METHOD free( task& ) const;
+    };
+#endif /* __TBB_TASK_GROUP_CONTEXT */
+
+    class allocate_root_proxy: no_assign {
+    public:
+        static task& __TBB_EXPORTED_FUNC allocate( size_t size );
+        static void __TBB_EXPORTED_FUNC free( task& );
+    };
+
+    class allocate_continuation_proxy: no_assign {
+    public:
+        task& __TBB_EXPORTED_METHOD allocate( size_t size ) const;
+        void __TBB_EXPORTED_METHOD free( task& ) const;
+    };
+
+    class allocate_child_proxy: no_assign {
+    public:
+        task& __TBB_EXPORTED_METHOD allocate( size_t size ) const;
+        void __TBB_EXPORTED_METHOD free( task& ) const;
+    };
+
+    //! Memory prefix to a task object.
+    /** This class is internal to the library.
+        Do not reference it directly, except within the library itself.
+        Fields are ordered in way that preserves backwards compatibility and yields 
+        good packing on typical 32-bit and 64-bit platforms.
+        @ingroup task_scheduling */
+    class task_prefix {
+    private:
+        friend class tbb::task;
+        friend class tbb::interface5::internal::task_base;
+        friend class tbb::task_list;
+        friend class internal::scheduler;
+        friend class internal::allocate_root_proxy;
+        friend class internal::allocate_child_proxy;
+        friend class internal::allocate_continuation_proxy;
+        friend class internal::allocate_additional_child_of_proxy;
+
+#if __TBB_TASK_GROUP_CONTEXT
+        //! Shared context that is used to communicate asynchronous state changes
+        /** Currently it is used to broadcast cancellation requests generated both 
+            by users and as the result of unhandled exceptions in the task::execute()
+            methods. */
+        task_group_context  *context;
+#endif /* __TBB_TASK_GROUP_CONTEXT */
+        
+        //! The scheduler that allocated the task, or NULL if the task is big.
+        /** Small tasks are pooled by the scheduler that allocated the task.
+            If a scheduler needs to free a small task allocated by another scheduler,
+            it returns the task to that other scheduler.  This policy avoids
+            memory space blowup issues for memory allocators that allocate from 
+            thread-specific pools. */
+        scheduler* origin;
+
+        //! The scheduler that owns the task.
+        scheduler* owner;
+
+        //! The task whose reference count includes me.
+        /** In the "blocking style" of programming, this field points to the parent task.
+            In the "continuation-passing style" of programming, this field points to the
+            continuation of the parent. */
+        tbb::task* parent;
+
+        //! Reference count used for synchronization.
+        /** In the "continuation-passing style" of programming, this field is
+            the difference of the number of allocated children minus the
+            number of children that have completed.
+            In the "blocking style" of programming, this field is one more than the difference. */
+        reference_count ref_count;
+
+        //! Obsolete. Used to be scheduling depth before TBB 2.2
+        /** Retained only for the sake of backward binary compatibility. **/
+        int depth;
+
+        //! A task::state_type, stored as a byte for compactness.
+        /** This state is exposed to users via method task::state(). */
+        unsigned char state;
+
+        //! Miscellaneous state that is not directly visible to users, stored as a byte for compactness.
+        /** 0x0 -> version 1.0 task
+            0x1 -> version >=2.1 task
+            0x20 -> task_proxy
+            0x40 -> task has live ref_count
+            0x80 -> a stolen task */
+        unsigned char extra_state;
+
+        affinity_id affinity;
+
+        //! "next" field for list of task
+        tbb::task* next;
+
+        //! The task corresponding to this task_prefix.
+        tbb::task& task() {return *reinterpret_cast<tbb::task*>(this+1);}
+    };
+
+} // namespace internal
+//! @endcond
+
+#if __TBB_TASK_GROUP_CONTEXT
+
+#if TBB_USE_CAPTURED_EXCEPTION
+    class tbb_exception;
+#else
+    namespace internal {
+        class tbb_exception_ptr;
+    }
+#endif /* !TBB_USE_CAPTURED_EXCEPTION */
+
+//! Used to form groups of tasks 
+/** @ingroup task_scheduling 
+    The context services explicit cancellation requests from user code, and unhandled 
+    exceptions intercepted during tasks execution. Intercepting an exception results 
+    in generating internal cancellation requests (which is processed in exactly the 
+    same way as external ones). 
+
+    The context is associated with one or more root tasks and defines the cancellation 
+    group that includes all the descendants of the corresponding root task(s). Association 
+    is established when a context object is passed as an argument to the task::allocate_root()
+    method. See task_group_context::task_group_context for more details.
+    
+    The context can be bound to another one, and other contexts can be bound to it,
+    forming a tree-like structure: parent -> this -> children. Arrows here designate
+    cancellation propagation direction. If a task in a cancellation group is canceled
+    all the other tasks in this group and groups bound to it (as children) get canceled too.
+
+    IMPLEMENTATION NOTE: 
+    When adding new members to task_group_context or changing types of existing ones, 
+    update the size of both padding buffers (_leading_padding and _trailing_padding)
+    appropriately. See also VERSIONING NOTE at the constructor definition below. **/
+class task_group_context : internal::no_copy {
+private:
+#if TBB_USE_CAPTURED_EXCEPTION
+    typedef tbb_exception exception_container_type;
+#else
+    typedef internal::tbb_exception_ptr exception_container_type;
+#endif
+
+    enum version_traits_word_layout {
+        traits_offset = 16,
+        version_mask = 0xFFFF,
+        traits_mask = 0xFFFFul << traits_offset
+    };
+
+public:
+    enum kind_type {
+        isolated,
+        bound
+    };
+
+    enum traits_type {
+        exact_exception = 0x0001ul << traits_offset,
+        concurrent_wait = 0x0004ul << traits_offset,
+#if TBB_USE_CAPTURED_EXCEPTION
+        default_traits = 0
+#else
+        default_traits = exact_exception
+#endif /* !TBB_USE_CAPTURED_EXCEPTION */
+    };
+
+private:
+    union {
+        //! Flavor of this context: bound or isolated.
+        kind_type my_kind;
+        uintptr_t _my_kind_aligner;
+    };
+
+    //! Pointer to the context of the parent cancellation group. NULL for isolated contexts.
+    task_group_context *my_parent;
+
+    //! Used to form the thread specific list of contexts without additional memory allocation.
+    /** A context is included into the list of the current thread when its binding to 
+        its parent happens. Any context can be present in the list of one thread only. **/
+    internal::context_list_node_t my_node;
+
+    //! Used to set and maintain stack stitching point for Intel Performance Tools.
+    __itt_caller itt_caller;
+
+    //! Leading padding protecting accesses to frequently used members from false sharing.
+    /** Read accesses to the field my_cancellation_requested are on the hot path inside
+        the scheduler. This padding ensures that this field never shares the same cache 
+        line with a local variable that is frequently written to. **/
+    char _leading_padding[internal::NFS_MaxLineSize - 
+                    2 * sizeof(uintptr_t)- sizeof(void*) - sizeof(internal::context_list_node_t)
+                          - sizeof(__itt_caller)];
+    
+    //! Specifies whether cancellation was request for this task group.
+    uintptr_t my_cancellation_requested;
+    
+    //! Version for run-time checks and behavioral traits of the context.
+    /** Version occupies low 16 bits, and traits (zero or more ORed enumerators
+        from the traits_type enumerations) take the next 16 bits.
+        Original (zeroth) version of the context did not support any traits. **/
+    uintptr_t  my_version_and_traits;
+
+    //! Pointer to the container storing exception being propagated across this task group.
+    exception_container_type *my_exception;
+
+    //! Scheduler that registered this context in its thread specific list.
+    /** This field is not terribly necessary, but it allows to get a small performance 
+        benefit by getting us rid of using thread local storage. We do not care 
+        about extra memory it takes since this data structure is excessively padded anyway. **/
+    void *my_owner;
+
+    //! Trailing padding protecting accesses to frequently used members from false sharing
+    /** \sa _leading_padding **/
+    char _trailing_padding[internal::NFS_MaxLineSize - sizeof(intptr_t) - 2 * sizeof(void*)];
+
+public:
+    //! Default & binding constructor.
+    /** By default a bound context is created. That is this context will be bound 
+        (as child) to the context of the task calling task::allocate_root(this_context) 
+        method. Cancellation requests passed to the parent context are propagated
+        to all the contexts bound to it.
+
+        If task_group_context::isolated is used as the argument, then the tasks associated
+        with this context will never be affected by events in any other context.
+        
+        Creating isolated contexts involve much less overhead, but they have limited
+        utility. Normally when an exception occurs in an algorithm that has nested
+        ones running, it is desirably to have all the nested algorithms canceled 
+        as well. Such a behavior requires nested algorithms to use bound contexts.
+        
+        There is one good place where using isolated algorithms is beneficial. It is
+        a master thread. That is if a particular algorithm is invoked directly from
+        the master thread (not from a TBB task), supplying it with explicitly 
+        created isolated context will result in a faster algorithm startup.
+        
+        VERSIONING NOTE: 
+        Implementation(s) of task_group_context constructor(s) cannot be made 
+        entirely out-of-line because the run-time version must be set by the user 
+        code. This will become critically important for binary compatibility, if 
+        we ever have to change the size of the context object.
+
+        Boosting the runtime version will also be necessary whenever new fields
+        are introduced in the currently unused padding areas or the meaning of 
+        the existing fields is changed or extended. **/
+    task_group_context ( kind_type relation_with_parent = bound,
+                         uintptr_t traits = default_traits )
+        : my_kind(relation_with_parent)
+        , my_version_and_traits(1 | traits)
+    {
+        init();
+    }
+
+    __TBB_EXPORTED_METHOD ~task_group_context ();
+
+    //! Forcefully reinitializes the context after the task tree it was associated with is completed.
+    /** Because the method assumes that all the tasks that used to be associated with 
+        this context have already finished, calling it while the context is still 
+        in use somewhere in the task hierarchy leads to undefined behavior.
+        
+        IMPORTANT: This method is not thread safe!
+
+        The method does not change the context's parent if it is set. **/ 
+    void __TBB_EXPORTED_METHOD reset ();
+
+    //! Initiates cancellation of all tasks in this cancellation group and its subordinate groups.
+    /** \return false if cancellation has already been requested, true otherwise. 
+
+        Note that canceling never fails. When false is returned, it just means that 
+        another thread (or this one) has already sent cancellation request to this
+        context or to one of its ancestors (if this context is bound). It is guaranteed
+        that when this method is concurrently called on the same not yet cancelled 
+        context, true will be returned by one and only one invocation. **/
+    bool __TBB_EXPORTED_METHOD cancel_group_execution ();
+
+    //! Returns true if the context received cancellation request.
+    bool __TBB_EXPORTED_METHOD is_group_execution_cancelled () const;
+
+    //! Records the pending exception, and cancels the task group.
+    /** May be called only from inside a catch-block. If the context is already 
+        canceled, does nothing. 
+        The method brings the task group associated with this context exactly into 
+        the state it would be in, if one of its tasks threw the currently pending 
+        exception during its execution. In other words, it emulates the actions 
+        of the scheduler's dispatch loop exception handler. **/
+    void __TBB_EXPORTED_METHOD register_pending_exception ();
+
+protected:
+    //! Out-of-line part of the constructor. 
+    /** Singled out to ensure backward binary compatibility of the future versions. **/
+    void __TBB_EXPORTED_METHOD init ();
+
+private:
+    friend class task;
+    friend class internal::allocate_root_with_context_proxy;
+
+    static const kind_type binding_required = bound;
+    static const kind_type binding_completed = kind_type(bound+1);
+    static const kind_type detached = kind_type(binding_completed+1);
+    static const kind_type dying = kind_type(detached+1);
+
+    //! Checks if any of the ancestors has a cancellation request outstanding, 
+    //! and propagates it back to descendants.
+    void propagate_cancellation_from_ancestors ();
+
+    //! For debugging purposes only.
+    bool is_alive () { 
+#if TBB_USE_DEBUG
+        return my_version_and_traits != 0xDeadBeef;
+#else
+        return true;
+#endif /* TBB_USE_DEBUG */
+    }
+}; // class task_group_context
+
+#endif /* __TBB_TASK_GROUP_CONTEXT */
+
+//! Base class for user-defined tasks.
+/** @ingroup task_scheduling */
+class task: __TBB_TASK_BASE_ACCESS interface5::internal::task_base {
+
+    //! Set reference count
+    void __TBB_EXPORTED_METHOD internal_set_ref_count( int count );
+
+    //! Decrement reference count and return its new value.
+    internal::reference_count __TBB_EXPORTED_METHOD internal_decrement_ref_count();
+
+protected:
+    //! Default constructor.
+    task() {prefix().extra_state=1;}
+
+public:
+    //! Destructor.
+    virtual ~task() {}
+
+    //! Should be overridden by derived classes.
+    virtual task* execute() = 0;
+
+    //! Enumeration of task states that the scheduler considers.
+    enum state_type {
+        //! task is running, and will be destroyed after method execute() completes.
+        executing,
+        //! task to be rescheduled.
+        reexecute,
+        //! task is in ready pool, or is going to be put there, or was just taken off.
+        ready,
+        //! task object is freshly allocated or recycled.
+        allocated,
+        //! task object is on free list, or is going to be put there, or was just taken off.
+        freed,
+        //! task to be recycled as continuation
+        recycle 
+    };
+
+    //------------------------------------------------------------------------
+    // Allocating tasks
+    //------------------------------------------------------------------------
+
+    //! Returns proxy for overloaded new that allocates a root task.
+    static internal::allocate_root_proxy allocate_root() {
+        return internal::allocate_root_proxy();
+    }
+
+#if __TBB_TASK_GROUP_CONTEXT
+    //! Returns proxy for overloaded new that allocates a root task associated with user supplied context.
+    static internal::allocate_root_with_context_proxy allocate_root( task_group_context& ctx ) {
+        return internal::allocate_root_with_context_proxy(ctx);
+    }
+#endif /* __TBB_TASK_GROUP_CONTEXT */
+
+    //! Returns proxy for overloaded new that allocates a continuation task of *this.
+    /** The continuation's parent becomes the parent of *this. */
+    internal::allocate_continuation_proxy& allocate_continuation() {
+        return *reinterpret_cast<internal::allocate_continuation_proxy*>(this);
+    }
+
+    //! Returns proxy for overloaded new that allocates a child task of *this.
+    internal::allocate_child_proxy& allocate_child() {
+        return *reinterpret_cast<internal::allocate_child_proxy*>(this);
+    }
+
+    //! Define recommended static form via import from base class.
+    using task_base::allocate_additional_child_of;
+
+#if __TBB_DEPRECATED_TASK_INTERFACE
+    //! Destroy a task.
+    /** Usually, calling this method is unnecessary, because a task is
+        implicitly deleted after its execute() method runs.  However,
+        sometimes a task needs to be explicitly deallocated, such as
+        when a root task is used as the parent in spawn_and_wait_for_all. */
+    void __TBB_EXPORTED_METHOD destroy( task& t );
+#else /* !__TBB_DEPRECATED_TASK_INTERFACE */
+    //! Define recommended static form via import from base class.
+    using task_base::destroy;
+#endif /* !__TBB_DEPRECATED_TASK_INTERFACE */
+
+    //------------------------------------------------------------------------
+    // Recycling of tasks
+    //------------------------------------------------------------------------
+
+    //! Change this to be a continuation of its former self.
+    /** The caller must guarantee that the task's refcount does not become zero until
+        after the method execute() returns.  Typically, this is done by having
+        method execute() return a pointer to a child of the task.  If the guarantee
+        cannot be made, use method recycle_as_safe_continuation instead. 
+       
+        Because of the hazard, this method may be deprecated in the future. */
+    void recycle_as_continuation() {
+        __TBB_ASSERT( prefix().state==executing, "execute not running?" );
+        prefix().state = allocated;
+    }
+
+    //! Recommended to use, safe variant of recycle_as_continuation
+    /** For safety, it requires additional increment of ref_count.
+        With no decendants and ref_count of 1, it has the semantics of recycle_to_reexecute. */
+    void recycle_as_safe_continuation() {
+        __TBB_ASSERT( prefix().state==executing, "execute not running?" );
+        prefix().state = recycle;
+    }
+
+    //! Change this to be a child of new_parent.
+    void recycle_as_child_of( task& new_parent ) {
+        internal::task_prefix& p = prefix();
+        __TBB_ASSERT( prefix().state==executing||prefix().state==allocated, "execute not running, or already recycled" );
+        __TBB_ASSERT( prefix().ref_count==0, "no child tasks allowed when recycled as a child" );
+        __TBB_ASSERT( p.parent==NULL, "parent must be null" );
+        __TBB_ASSERT( new_parent.prefix().state<=recycle, "corrupt parent's state" );
+        __TBB_ASSERT( new_parent.prefix().state!=freed, "parent already freed" );
+        p.state = allocated;
+        p.parent = &new_parent;
+#if __TBB_TASK_GROUP_CONTEXT
+        p.context = new_parent.prefix().context;
+#endif /* __TBB_TASK_GROUP_CONTEXT */
+    }
+
+    //! Schedule this for reexecution after current execute() returns.
+    /** Made obsolete by recycle_as_safe_continuation; may become deprecated. */
+    void recycle_to_reexecute() {
+        __TBB_ASSERT( prefix().state==executing, "execute not running, or already recycled" );
+        __TBB_ASSERT( prefix().ref_count==0, "no child tasks allowed when recycled for reexecution" );
+        prefix().state = reexecute;
+    }
+
+    // All depth-related methods are obsolete, and are retained for the sake 
+    // of backward source compatibility only
+    intptr_t depth() const {return 0;}
+    void set_depth( intptr_t ) {}
+    void add_to_depth( int ) {}
+
+
+    //------------------------------------------------------------------------
+    // Spawning and blocking
+    //------------------------------------------------------------------------
+
+    //! Set reference count
+    void set_ref_count( int count ) {
+#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT
+        internal_set_ref_count(count);
+#else
+        prefix().ref_count = count;
+#endif /* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT */
+    }
+
+    //! Atomically increment reference count.
+    /** Has acquire semantics */  
+    void increment_ref_count() {
+        __TBB_FetchAndIncrementWacquire( &prefix().ref_count );
+    }
+
+    //! Atomically decrement reference count.  
+    /** Has release semantics. */  
+    int decrement_ref_count() {
+#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT
+        return int(internal_decrement_ref_count());
+#else
+        return int(__TBB_FetchAndDecrementWrelease( &prefix().ref_count ))-1;
+#endif /* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT */
+    }
+
+    //! Define recommended static forms via import from base class.
+    using task_base::spawn;
+
+    //! Similar to spawn followed by wait_for_all, but more efficient.
+    void spawn_and_wait_for_all( task& child ) {
+        prefix().owner->wait_for_all( *this, &child );
+    }
+
+    //! Similar to spawn followed by wait_for_all, but more efficient.
+    void __TBB_EXPORTED_METHOD spawn_and_wait_for_all( task_list& list );
+
+    //! Spawn task allocated by allocate_root, wait for it to complete, and deallocate it.
+    static void spawn_root_and_wait( task& root ) {
+        root.prefix().owner->spawn_root_and_wait( root, root.prefix().next );
+    }
+
+    //! Spawn root tasks on list and wait for all of them to finish.
+    /** If there are more tasks than worker threads, the tasks are spawned in
+        order of front to back. */
+    static void spawn_root_and_wait( task_list& root_list );
+
+    //! Wait for reference count to become one, and set reference count to zero.
+    /** Works on tasks while waiting. */
+    void wait_for_all() {
+        prefix().owner->wait_for_all( *this, NULL );
+    }
+
+#if __TBB_ARENA_PER_MASTER
+    //! Enqueue task for starvation-resistant execution.
+    static void enqueue( task& t ) {
+        t.prefix().owner->enqueue( t, NULL );
+    }
+
+#endif /* __TBB_ARENA_PER_MASTER */
+    //! The innermost task being executed or destroyed by the current thread at the moment.
+    static task& __TBB_EXPORTED_FUNC self();
+
+    //! task on whose behalf this task is working, or NULL if this is a root.
+    task* parent() const {return prefix().parent;}
+
+#if __TBB_TASK_GROUP_CONTEXT
+    //! Shared context that is used to communicate asynchronous state changes
+    task_group_context* context() {return prefix().context;}
+#endif /* __TBB_TASK_GROUP_CONTEXT */   
+
+    //! True if task was stolen from the task pool of another thread.
+    bool is_stolen_task() const {
+        return (prefix().extra_state & 0x80)!=0;
+    }
+
+    //------------------------------------------------------------------------
+    // Debugging
+    //------------------------------------------------------------------------
+
+    //! Current execution state
+    state_type state() const {return state_type(prefix().state);}
+
+    //! The internal reference count.
+    int ref_count() const {
+#if TBB_USE_ASSERT
+        internal::reference_count ref_count_ = prefix().ref_count;
+        __TBB_ASSERT( ref_count_==int(ref_count_), "integer overflow error");
+#endif
+        return int(prefix().ref_count);
+    }
+
+    //! Obsolete, and only retained for the sake of backward compatibility. Always returns true.
+    bool __TBB_EXPORTED_METHOD is_owned_by_current_thread() const;
+
+    //------------------------------------------------------------------------
+    // Affinity
+    //------------------------------------------------------------------------
+    //! An id as used for specifying affinity.
+    /** Guaranteed to be integral type.  Value of 0 means no affinity. */
+    typedef internal::affinity_id affinity_id;
+
+    //! Set affinity for this task.
+    void set_affinity( affinity_id id ) {prefix().affinity = id;}
+
+    //! Current affinity of this task
+    affinity_id affinity() const {return prefix().affinity;}
+
+    //! Invoked by scheduler to notify task that it ran on unexpected thread.
+    /** Invoked before method execute() runs, if task is stolen, or task has 
+        affinity but will be executed on another thread. 
+
+        The default action does nothing. */
+    virtual void __TBB_EXPORTED_METHOD note_affinity( affinity_id id );
+
+#if __TBB_TASK_GROUP_CONTEXT
+    //! Initiates cancellation of all tasks in this cancellation group and its subordinate groups.
+    /** \return false if cancellation has already been requested, true otherwise. **/
+    bool cancel_group_execution () { return prefix().context->cancel_group_execution(); }
+
+    //! Returns true if the context received cancellation request.
+    bool is_cancelled () const { return prefix().context->is_group_execution_cancelled(); }
+#endif /* __TBB_TASK_GROUP_CONTEXT */
+
+private:
+    friend class interface5::internal::task_base;
+    friend class task_list;
+    friend class internal::scheduler;
+    friend class internal::allocate_root_proxy;
+#if __TBB_TASK_GROUP_CONTEXT
+    friend class internal::allocate_root_with_context_proxy;
+#endif /* __TBB_TASK_GROUP_CONTEXT */
+    friend class internal::allocate_continuation_proxy;
+    friend class internal::allocate_child_proxy;
+    friend class internal::allocate_additional_child_of_proxy;
+    
+    //! Get reference to corresponding task_prefix.
+    /** Version tag prevents loader on Linux from using the wrong symbol in debug builds. **/
+    internal::task_prefix& prefix( internal::version_tag* = NULL ) const {
+        return reinterpret_cast<internal::task_prefix*>(const_cast<task*>(this))[-1];
+    }
+}; // class task
+
+//! task that does nothing.  Useful for synchronization.
+/** @ingroup task_scheduling */
+class empty_task: public task {
+    /*override*/ task* execute() {
+        return NULL;
+    }
+};
+
+//! A list of children.
+/** Used for method task::spawn_children
+    @ingroup task_scheduling */
+class task_list: internal::no_copy {
+private:
+    task* first;
+    task** next_ptr;
+    friend class task;
+    friend class interface5::internal::task_base;
+public:
+    //! Construct empty list
+    task_list() : first(NULL), next_ptr(&first) {}
+
+    //! Destroys the list, but does not destroy the task objects.
+    ~task_list() {}
+
+    //! True if list if empty; false otherwise.
+    bool empty() const {return !first;}
+
+    //! Push task onto back of list.
+    void push_back( task& task ) {
+        task.prefix().next = NULL;
+        *next_ptr = &task;
+        next_ptr = &task.prefix().next;
+    }
+
+    //! Pop the front task from the list.
+    task& pop_front() {
+        __TBB_ASSERT( !empty(), "attempt to pop item from empty task_list" );
+        task* result = first;
+        first = result->prefix().next;
+        if( !first ) next_ptr = &first;
+        return *result;
+    }
+
+    //! Clear the list
+    void clear() {
+        first=NULL;
+        next_ptr=&first;
+    }
+};
+
+inline void interface5::internal::task_base::spawn( task& t ) {
+    t.prefix().owner->spawn( t, t.prefix().next );
+}
+
+inline void interface5::internal::task_base::spawn( task_list& list ) {
+    if( task* t = list.first ) {
+        t->prefix().owner->spawn( *t, *list.next_ptr );
+        list.clear();
+    }
+}
+
+inline void task::spawn_root_and_wait( task_list& root_list ) {
+    if( task* t = root_list.first ) {
+        t->prefix().owner->spawn_root_and_wait( *t, *root_list.next_ptr );
+        root_list.clear();
+    }
+}
+
+} // namespace tbb
+
+inline void *operator new( size_t bytes, const tbb::internal::allocate_root_proxy& ) {
+    return &tbb::internal::allocate_root_proxy::allocate(bytes);
+}
+
+inline void operator delete( void* task, const tbb::internal::allocate_root_proxy& ) {
+    tbb::internal::allocate_root_proxy::free( *static_cast<tbb::task*>(task) );
+}
+
+#if __TBB_TASK_GROUP_CONTEXT
+inline void *operator new( size_t bytes, const tbb::internal::allocate_root_with_context_proxy& p ) {
+    return &p.allocate(bytes);
+}
+
+inline void operator delete( void* task, const tbb::internal::allocate_root_with_context_proxy& p ) {
+    p.free( *static_cast<tbb::task*>(task) );
+}
+#endif /* __TBB_TASK_GROUP_CONTEXT */
+
+inline void *operator new( size_t bytes, const tbb::internal::allocate_continuation_proxy& p ) {
+    return &p.allocate(bytes);
+}
+
+inline void operator delete( void* task, const tbb::internal::allocate_continuation_proxy& p ) {
+    p.free( *static_cast<tbb::task*>(task) );
+}
+
+inline void *operator new( size_t bytes, const tbb::internal::allocate_child_proxy& p ) {
+    return &p.allocate(bytes);
+}
+
+inline void operator delete( void* task, const tbb::internal::allocate_child_proxy& p ) {
+    p.free( *static_cast<tbb::task*>(task) );
+}
+
+inline void *operator new( size_t bytes, const tbb::internal::allocate_additional_child_of_proxy& p ) {
+    return &p.allocate(bytes);
+}
+
+inline void operator delete( void* task, const tbb::internal::allocate_additional_child_of_proxy& p ) {
+    p.free( *static_cast<tbb::task*>(task) );
+}
+
+#endif /* __TBB_task_H */
diff --git a/tbb30_20100406oss/include/tbb/task_group.h b/tbb30_20100406oss/include/tbb/task_group.h
new file mode 100644 (file)
index 0000000..d245690
--- /dev/null
@@ -0,0 +1,243 @@
+/*
+    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB_task_group_H
+#define __TBB_task_group_H
+
+#include "task.h"
+#include "tbb_exception.h"
+
+namespace tbb {
+
+namespace internal {
+    template<typename F> class task_handle_task;
+}
+
+template<typename F>
+class task_handle : internal::no_assign {
+    template<typename _F> friend class internal::task_handle_task;
+
+    static const intptr_t scheduled = 0x1;
+
+    F my_func;
+    intptr_t my_state;
+
+    void mark_scheduled () {
+        // The check here is intentionally lax to avoid the impact of interlocked operation
+        if ( my_state & scheduled )
+            internal::throw_exception( internal::eid_invalid_multiple_scheduling );
+        my_state |= scheduled;
+    }
+public:
+    task_handle( const F& f ) : my_func(f), my_state(0) {}
+
+    void operator() () const { my_func(); }
+};
+
+enum task_group_status {
+    not_complete,
+    complete,
+    canceled
+};
+
+namespace internal {
+
+// Suppress gratuitous warnings from icc 11.0 when lambda expressions are used in instances of function_task.
+//#pragma warning(disable: 588)
+
+template<typename F>
+class function_task : public task {
+    F my_func;
+    /*override*/ task* execute() {
+        my_func();
+        return NULL;
+    }
+public:
+    function_task( const F& f ) : my_func(f) {}
+};
+
+template<typename F>
+class task_handle_task : public task {
+    task_handle<F>& my_handle;
+    /*override*/ task* execute() {
+        my_handle();
+        return NULL;
+    }
+public:
+    task_handle_task( task_handle<F>& h ) : my_handle(h) { h.mark_scheduled(); }
+};
+
+class task_group_base : internal::no_copy {
+protected:
+    empty_task* my_root;
+    task_group_context my_context;
+
+    task& owner () { return *my_root; }
+
+    template<typename F>
+    task_group_status internal_run_and_wait( F& f ) {
+        __TBB_TRY {
+            if ( !my_context.is_group_execution_cancelled() )
+                f();
+        } __TBB_CATCH( ... ) {
+            my_context.register_pending_exception();
+        }
+        return wait();
+    }
+
+    template<typename F, typename Task>
+    void internal_run( F& f ) {
+        owner().spawn( *new( owner().allocate_additional_child_of(*my_root) ) Task(f) );
+    }
+
+public:
+    task_group_base( uintptr_t traits = 0 )
+        : my_context(task_group_context::bound, task_group_context::default_traits | traits)
+    {
+        my_root = new( task::allocate_root(my_context) ) empty_task;
+        my_root->set_ref_count(1);
+    }
+
+    template<typename F>
+    void run( task_handle<F>& h ) {
+        internal_run< task_handle<F>, internal::task_handle_task<F> >( h );
+    }
+
+    task_group_status wait() {
+        __TBB_TRY {
+            my_root->wait_for_all();
+        } __TBB_CATCH( ... ) {
+            my_context.reset();
+            __TBB_RETHROW();
+        }
+        if ( my_context.is_group_execution_cancelled() ) {
+            my_context.reset();
+            return canceled;
+        }
+        return complete;
+    }
+
+    bool is_canceling() {
+        return my_context.is_group_execution_cancelled();
+    }
+
+    void cancel() {
+        my_context.cancel_group_execution();
+    }
+}; // class task_group_base
+
+} // namespace internal
+
+class task_group : public internal::task_group_base {
+public:
+    task_group () : task_group_base( task_group_context::concurrent_wait ) {}
+
+    ~task_group() __TBB_TRY {
+        __TBB_ASSERT( my_root->ref_count() != 0, NULL );
+        if( my_root->ref_count() > 1 )
+            my_root->wait_for_all();
+        owner().destroy(*my_root);
+    }
+#if TBB_USE_EXCEPTIONS
+    catch (...) {
+        owner().destroy(*my_root);
+        throw;
+    }
+#endif /* TBB_USE_EXCEPTIONS */
+
+#if __SUNPRO_CC
+    template<typename F>
+    void run( task_handle<F>& h ) {
+        internal_run< task_handle<F>, internal::task_handle_task<F> >( h );
+    }
+#else
+    using task_group_base::run;
+#endif
+
+    template<typename F>
+    void run( const F& f ) {
+        internal_run< const F, internal::function_task<F> >( f );
+    }
+
+    template<typename F>
+    task_group_status run_and_wait( const F& f ) {
+        return internal_run_and_wait<const F>( f );
+    }
+
+    template<typename F>
+    task_group_status run_and_wait( task_handle<F>& h ) {
+      return internal_run_and_wait< task_handle<F> >( h );
+    }
+}; // class task_group
+
+class structured_task_group : public internal::task_group_base {
+public:
+    ~structured_task_group() {
+        if( my_root->ref_count() > 1 ) {
+            bool stack_unwinding_in_progress = std::uncaught_exception();
+            // Always attempt to do proper cleanup to avoid inevitable memory corruption 
+            // in case of missing wait (for the sake of better testability & debuggability)
+            if ( !is_canceling() )
+                cancel();
+            my_root->wait_for_all();
+            owner().destroy(*my_root);
+            if ( !stack_unwinding_in_progress )
+                internal::throw_exception( internal::eid_missing_wait );
+        }
+        else {
+            if( my_root->ref_count() == 1 )
+                my_root->set_ref_count(0);
+            owner().destroy(*my_root);
+        }
+    }
+
+    template<typename F>
+    task_group_status run_and_wait ( task_handle<F>& h ) {
+        return internal_run_and_wait< task_handle<F> >( h );
+    }
+
+    task_group_status wait() {
+        task_group_status res = task_group_base::wait();
+        my_root->set_ref_count(1);
+        return res;
+    }
+}; // class structured_task_group
+
+inline 
+bool is_current_task_group_canceling() {
+    return task::self().is_cancelled();
+}
+
+template<class F>
+task_handle<F> make_task( const F& f ) {
+    return task_handle<F>( f );
+}
+
+} // namespace tbb
+
+#endif /* __TBB_task_group_H */
diff --git a/tbb30_20100406oss/include/tbb/task_scheduler_init.h b/tbb30_20100406oss/include/tbb/task_scheduler_init.h
new file mode 100644 (file)
index 0000000..458afb2
--- /dev/null
@@ -0,0 +1,106 @@
+/*
+    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB_task_scheduler_init_H
+#define __TBB_task_scheduler_init_H
+
+#include "tbb_stddef.h"
+
+namespace tbb {
+
+typedef std::size_t stack_size_type;
+
+//! @cond INTERNAL
+namespace internal {
+    //! Internal to library. Should not be used by clients.
+    /** @ingroup task_scheduling */
+    class scheduler;
+} // namespace internal
+//! @endcond
+
+//! Class representing reference to tbb scheduler.
+/** A thread must construct a task_scheduler_init, and keep it alive,
+    during the time that it uses the services of class task.
+    @ingroup task_scheduling */
+class task_scheduler_init: internal::no_copy {
+    /** NULL if not currently initialized. */
+    internal::scheduler* my_scheduler;
+public:
+
+    //! Typedef for number of threads that is automatic.
+    static const int automatic = -1;
+
+    //! Argument to initialize() or constructor that causes initialization to be deferred.
+    static const int deferred = -2;
+
+    //! Ensure that scheduler exists for this thread
+    /** A value of -1 lets tbb decide on the number of threads, which is typically 
+        the number of hardware threads. For production code, the default value of -1 
+        should be used, particularly if the client code is mixed with third party clients 
+        that might also use tbb.
+
+        The number_of_threads is ignored if any other task_scheduler_inits 
+        currently exist.  A thread may construct multiple task_scheduler_inits.  
+        Doing so does no harm because the underlying scheduler is reference counted. */
+    void __TBB_EXPORTED_METHOD initialize( int number_of_threads=automatic );
+
+    //! The overloaded method with stack size parameter
+    /** Overloading is necessary to preserve ABI compatibility */
+    void __TBB_EXPORTED_METHOD initialize( int number_of_threads, stack_size_type thread_stack_size );
+
+    //! Inverse of method initialize.
+    void __TBB_EXPORTED_METHOD terminate();
+
+    //! Shorthand for default constructor followed by call to intialize(number_of_threads).
+    task_scheduler_init( int number_of_threads=automatic, stack_size_type thread_stack_size=0 ) : my_scheduler(NULL)  {
+        initialize( number_of_threads, thread_stack_size );
+    }
+
+    //! Destroy scheduler for this thread if thread has no other live task_scheduler_inits.
+    ~task_scheduler_init() {
+        if( my_scheduler ) 
+            terminate();
+        internal::poison_pointer( my_scheduler );
+    }
+    //! Returns the number of threads tbb scheduler would create if initialized by default.
+    /** Result returned by this method does not depend on whether the scheduler 
+        has already been initialized.
+        
+        Because tbb 2.0 does not support blocking tasks yet, you may use this method
+        to boost the number of threads in the tbb's internal pool, if your tasks are 
+        doing I/O operations. The optimal number of additional threads depends on how
+        much time your tasks spend in the blocked state. */
+    static int __TBB_EXPORTED_FUNC default_num_threads ();
+
+    //! Returns true if scheduler is active (initialized); false otherwise
+    bool is_active() const { return my_scheduler != NULL; }
+};
+
+} // namespace tbb
+
+#endif /* __TBB_task_scheduler_init_H */
diff --git a/tbb30_20100406oss/include/tbb/task_scheduler_observer.h b/tbb30_20100406oss/include/tbb/task_scheduler_observer.h
new file mode 100644 (file)
index 0000000..61003e5
--- /dev/null
@@ -0,0 +1,74 @@
+/*
+    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB_task_scheduler_observer_H
+#define __TBB_task_scheduler_observer_H
+
+#include "atomic.h"
+
+#if __TBB_SCHEDULER_OBSERVER
+
+namespace tbb {
+
+namespace internal {
+
+class observer_proxy;
+
+class task_scheduler_observer_v3 {
+    friend class observer_proxy;
+    observer_proxy* my_proxy;
+    atomic<intptr_t> my_busy_count;
+public:
+    //! Enable or disable observation
+    void __TBB_EXPORTED_METHOD observe( bool state=true );
+
+    //! True if observation is enables; false otherwise.
+    bool is_observing() const {return my_proxy!=NULL;}
+
+    //! Construct observer with observation disabled.
+    task_scheduler_observer_v3() : my_proxy(NULL) {my_busy_count=0;}
+
+    //! Called by thread before first steal since observation became enabled
+    virtual void on_scheduler_entry( bool /*is_worker*/ ) {} 
+
+    //! Called by thread when it no longer takes part in task stealing.
+    virtual void on_scheduler_exit( bool /*is_worker*/ ) {}
+
+    //! Destructor
+    virtual ~task_scheduler_observer_v3() {observe(false);}
+};
+
+} // namespace internal
+
+typedef internal::task_scheduler_observer_v3 task_scheduler_observer;
+
+} // namespace tbb
+
+#endif /* __TBB_SCHEDULER_OBSERVER */
+
+#endif /* __TBB_task_scheduler_observer_H */
diff --git a/tbb30_20100406oss/include/tbb/tbb.h b/tbb30_20100406oss/include/tbb/tbb.h
new file mode 100644 (file)
index 0000000..9c5ac0f
--- /dev/null
@@ -0,0 +1,80 @@
+/*
+    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB_tbb_H
+#define __TBB_tbb_H
+
+/** 
+    This header bulk-includes declarations or definitions of all the functionality 
+    provided by TBB (save for malloc dependent headers). 
+
+    If you use only a few TBB constructs, consider including specific headers only.
+    Any header listed below can be included independently of others.
+**/
+
+#include "aligned_space.h"
+#include "atomic.h"
+#include "blocked_range.h"
+#include "blocked_range2d.h"
+#include "blocked_range3d.h"
+#include "cache_aligned_allocator.h"
+#include "combinable.h"
+#include "concurrent_unordered_map.h"
+#include "concurrent_hash_map.h"
+#include "concurrent_queue.h"
+#include "concurrent_vector.h"
+#include "critical_section.h"
+#include "enumerable_thread_specific.h"
+#include "mutex.h"
+#include "null_mutex.h"
+#include "null_rw_mutex.h"
+#include "parallel_do.h"
+#include "parallel_for.h"
+#include "parallel_for_each.h"
+#include "parallel_invoke.h"
+#include "parallel_reduce.h"
+#include "parallel_scan.h"
+#include "parallel_sort.h"
+#include "partitioner.h"
+#include "pipeline.h"
+#include "queuing_mutex.h"
+#include "queuing_rw_mutex.h"
+#include "reader_writer_lock.h"
+#include "recursive_mutex.h"
+#include "spin_mutex.h"
+#include "spin_rw_mutex.h"
+#include "task.h"
+#include "task_group.h"
+#include "task_scheduler_init.h"
+#include "task_scheduler_observer.h"
+#include "tbb_allocator.h"
+#include "tbb_exception.h"
+#include "tbb_thread.h"
+#include "tick_count.h"
+
+#endif /* __TBB_tbb_H */
diff --git a/tbb30_20100406oss/include/tbb/tbb_allocator.h b/tbb30_20100406oss/include/tbb/tbb_allocator.h
new file mode 100644 (file)
index 0000000..008422d
--- /dev/null
@@ -0,0 +1,214 @@
+/*
+    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB_tbb_allocator_H
+#define __TBB_tbb_allocator_H
+
+#include "tbb_stddef.h"
+#include <new>
+
+#if !TBB_USE_EXCEPTIONS && _MSC_VER
+    // Suppress "C++ exception handler used, but unwind semantics are not enabled" warning in STL headers
+    #pragma warning (push)
+    #pragma warning (disable: 4530)
+#endif
+
+#include <cstring>
+
+#if !TBB_USE_EXCEPTIONS && _MSC_VER
+    #pragma warning (pop)
+#endif
+
+namespace tbb {
+
+//! @cond INTERNAL
+namespace internal {
+
+    //! Deallocates memory using FreeHandler
+    /** The function uses scalable_free if scalable allocator is available and free if not*/
+    void __TBB_EXPORTED_FUNC deallocate_via_handler_v3( void *p );
+
+    //! Allocates memory using MallocHandler
+    /** The function uses scalable_malloc if scalable allocator is available and malloc if not*/
+    void* __TBB_EXPORTED_FUNC allocate_via_handler_v3( size_t n );
+
+    //! Returns true if standard malloc/free are used to work with memory.
+    bool __TBB_EXPORTED_FUNC is_malloc_used_v3();
+}
+//! @endcond
+
+#if _MSC_VER && !defined(__INTEL_COMPILER)
+    // Workaround for erroneous "unreferenced parameter" warning in method destroy.
+    #pragma warning (push)
+    #pragma warning (disable: 4100)
+#endif
+
+//! Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5
+/** The class selects the best memory allocation mechanism available 
+    from scalable_malloc and standard malloc.
+    The members are ordered the same way they are in section 20.4.1
+    of the ISO C++ standard.
+    @ingroup memory_allocation */
+template<typename T>
+class tbb_allocator {
+public:
+    typedef typename internal::allocator_type<T>::value_type value_type;
+    typedef value_type* pointer;
+    typedef const value_type* const_pointer;
+    typedef value_type& reference;
+    typedef const value_type& const_reference;
+    typedef size_t size_type;
+    typedef ptrdiff_t difference_type;
+    template<typename U> struct rebind {
+        typedef tbb_allocator<U> other;
+    };
+
+    //! Specifies current allocator
+    enum malloc_type {
+        scalable, 
+        standard
+    };
+
+    tbb_allocator() throw() {}
+    tbb_allocator( const tbb_allocator& ) throw() {}
+    template<typename U> tbb_allocator(const tbb_allocator<U>&) throw() {}
+
+    pointer address(reference x) const {return &x;}
+    const_pointer address(const_reference x) const {return &x;}
+    
+    //! Allocate space for n objects.
+    pointer allocate( size_type n, const void* /*hint*/ = 0) {
+        return pointer(internal::allocate_via_handler_v3( n * sizeof(value_type) ));
+    }
+
+    //! Free previously allocated block of memory.
+    void deallocate( pointer p, size_type ) {
+        internal::deallocate_via_handler_v3(p);        
+    }
+
+    //! Largest value for which method allocate might succeed.
+    size_type max_size() const throw() {
+        size_type max = static_cast<size_type>(-1) / sizeof (value_type);
+        return (max > 0 ? max : 1);
+    }
+    
+    //! Copy-construct value at location pointed to by p.
+    void construct( pointer p, const value_type& value ) {::new((void*)(p)) value_type(value);}
+
+    //! Destroy value at location pointed to by p.
+    void destroy( pointer p ) {p->~value_type();}
+
+    //! Returns current allocator
+    static malloc_type allocator_type() {
+        return internal::is_malloc_used_v3() ? standard : scalable;
+    }
+};
+
+#if _MSC_VER && !defined(__INTEL_COMPILER)
+    #pragma warning (pop)
+#endif // warning 4100 is back
+
+//! Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1
+/** @ingroup memory_allocation */
+template<> 
+class tbb_allocator<void> {
+public:
+    typedef void* pointer;
+    typedef const void* const_pointer;
+    typedef void value_type;
+    template<typename U> struct rebind {
+        typedef tbb_allocator<U> other;
+    };
+};
+
+template<typename T, typename U>
+inline bool operator==( const tbb_allocator<T>&, const tbb_allocator<U>& ) {return true;}
+
+template<typename T, typename U>
+inline bool operator!=( const tbb_allocator<T>&, const tbb_allocator<U>& ) {return false;}
+
+//! Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5
+/** The class is an adapter over an actual allocator that fills the allocation
+    using memset function with template argument C as the value.
+    The members are ordered the same way they are in section 20.4.1
+    of the ISO C++ standard.
+    @ingroup memory_allocation */
+template <typename T, template<typename X> class Allocator = tbb_allocator>
+class zero_allocator : public Allocator<T>
+{
+public:
+    typedef Allocator<T> base_allocator_type;
+    typedef typename base_allocator_type::value_type value_type;
+    typedef typename base_allocator_type::pointer pointer;
+    typedef typename base_allocator_type::const_pointer const_pointer;
+    typedef typename base_allocator_type::reference reference;
+    typedef typename base_allocator_type::const_reference const_reference;
+    typedef typename base_allocator_type::size_type size_type;
+    typedef typename base_allocator_type::difference_type difference_type;
+    template<typename U> struct rebind {
+        typedef zero_allocator<U, Allocator> other;
+    };
+
+    zero_allocator() throw() { }
+    zero_allocator(const zero_allocator &a) throw() : base_allocator_type( a ) { }
+    template<typename U>
+    zero_allocator(const zero_allocator<U> &a) throw() : base_allocator_type( Allocator<U>( a ) ) { }
+
+    pointer allocate(const size_type n, const void *hint = 0 ) {
+        pointer ptr = base_allocator_type::allocate( n, hint );
+        std::memset( ptr, 0, n * sizeof(value_type) );
+        return ptr;
+    }
+};
+
+//! Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1
+/** @ingroup memory_allocation */
+template<template<typename T> class Allocator> 
+class zero_allocator<void, Allocator> : public Allocator<void> {
+public:
+    typedef Allocator<void> base_allocator_type;
+    typedef typename base_allocator_type::value_type value_type;
+    typedef typename base_allocator_type::pointer pointer;
+    typedef typename base_allocator_type::const_pointer const_pointer;
+    template<typename U> struct rebind {
+        typedef zero_allocator<U, Allocator> other;
+    };
+};
+
+template<typename T1, template<typename X1> class B1, typename T2, template<typename X2> class B2>
+inline bool operator==( const zero_allocator<T1,B1> &a, const zero_allocator<T2,B2> &b) {
+    return static_cast< B1<T1> >(a) == static_cast< B2<T2> >(b);
+}
+template<typename T1, template<typename X1> class B1, typename T2, template<typename X2> class B2>
+inline bool operator!=( const zero_allocator<T1,B1> &a, const zero_allocator<T2,B2> &b) {
+    return static_cast< B1<T1> >(a) != static_cast< B2<T2> >(b);
+}
+
+} // namespace tbb 
+
+#endif /* __TBB_tbb_allocator_H */
diff --git a/tbb30_20100406oss/include/tbb/tbb_config.h b/tbb30_20100406oss/include/tbb/tbb_config.h
new file mode 100644 (file)
index 0000000..6f26e47
--- /dev/null
@@ -0,0 +1,198 @@
+/*
+    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB_tbb_config_H
+#define __TBB_tbb_config_H
+
+/** This header is supposed to contain macro definitions and C style comments only.
+    The macros defined here are intended to control such aspects of TBB build as 
+    - compilation modes
+    - feature sets
+    - workarounds presence 
+**/
+
+/** Compilation modes **/
+
+#ifndef TBB_USE_DEBUG
+#ifdef TBB_DO_ASSERT
+#define TBB_USE_DEBUG TBB_DO_ASSERT
+#else
+#define TBB_USE_DEBUG 0
+#endif /* TBB_DO_ASSERT */
+#else
+#define TBB_DO_ASSERT TBB_USE_DEBUG
+#endif /* TBB_USE_DEBUG */
+
+#ifndef TBB_USE_ASSERT
+#ifdef TBB_DO_ASSERT
+#define TBB_USE_ASSERT TBB_DO_ASSERT
+#else 
+#define TBB_USE_ASSERT TBB_USE_DEBUG
+#endif /* TBB_DO_ASSERT */
+#endif /* TBB_USE_ASSERT */
+
+#ifndef TBB_USE_THREADING_TOOLS
+#ifdef TBB_DO_THREADING_TOOLS
+#define TBB_USE_THREADING_TOOLS TBB_DO_THREADING_TOOLS
+#else 
+#define TBB_USE_THREADING_TOOLS TBB_USE_DEBUG
+#endif /* TBB_DO_THREADING_TOOLS */
+#endif /* TBB_USE_THREADING_TOOLS */
+
+#ifndef TBB_USE_PERFORMANCE_WARNINGS
+#ifdef TBB_PERFORMANCE_WARNINGS
+#define TBB_USE_PERFORMANCE_WARNINGS TBB_PERFORMANCE_WARNINGS
+#else 
+#define TBB_USE_PERFORMANCE_WARNINGS TBB_USE_DEBUG
+#endif /* TBB_PEFORMANCE_WARNINGS */
+#endif /* TBB_USE_PERFORMANCE_WARNINGS */
+
+#if !defined(__EXCEPTIONS) && !defined(_CPPUNWIND) && !defined(__SUNPRO_CC) || defined(_XBOX)
+    #if TBB_USE_EXCEPTIONS
+        #error Compilation settings do not support exception handling. Please do not set TBB_USE_EXCEPTIONS macro or set it to 0.
+    #elif !defined(TBB_USE_EXCEPTIONS)
+        #define TBB_USE_EXCEPTIONS 0
+    #endif
+#elif !defined(TBB_USE_EXCEPTIONS)
+    #define TBB_USE_EXCEPTIONS 1
+#endif
+
+#ifndef TBB_IMPLEMENT_CPP0X
+/** By default, use C++0x classes if available **/
+#if __GNUC__==4 && __GNUC_MINOR__>=4 && __GXX_EXPERIMENTAL_CXX0X__
+#define TBB_IMPLEMENT_CPP0X 0
+#else
+#define TBB_IMPLEMENT_CPP0X 1
+#endif
+#endif /* TBB_IMPLEMENT_CPP0X */
+
+/** Feature sets **/
+
+#ifndef __TBB_COUNT_TASK_NODES
+    #define __TBB_COUNT_TASK_NODES TBB_USE_ASSERT
+#endif
+
+#ifndef __TBB_TASK_GROUP_CONTEXT
+#define __TBB_TASK_GROUP_CONTEXT 1
+#endif /* __TBB_TASK_GROUP_CONTEXT */
+
+#ifndef __TBB_SCHEDULER_OBSERVER
+#define __TBB_SCHEDULER_OBSERVER 1
+#endif /* __TBB_SCHEDULER_OBSERVER */
+
+#ifndef __TBB_ARENA_PER_MASTER
+#define __TBB_ARENA_PER_MASTER 1
+#endif /* __TBB_ARENA_PER_MASTER */
+
+/* TODO: The following condition should be extended as soon as new compilers/runtimes 
+         with std::exception_ptr support appear. */
+#define __TBB_EXCEPTION_PTR_PRESENT  (_MSC_VER >= 1600 || __GXX_EXPERIMENTAL_CXX0X__ && (__GNUC__==4 && __GNUC_MINOR__>=4))
+
+
+#ifndef TBB_USE_CAPTURED_EXCEPTION
+    #if __TBB_EXCEPTION_PTR_PRESENT
+        #define TBB_USE_CAPTURED_EXCEPTION 0
+    #else
+        #define TBB_USE_CAPTURED_EXCEPTION 1
+    #endif
+#else /* defined TBB_USE_CAPTURED_EXCEPTION */
+    #if !TBB_USE_CAPTURED_EXCEPTION && !__TBB_EXCEPTION_PTR_PRESENT
+        #error Current runtime does not support std::exception_ptr. Set TBB_USE_CAPTURED_EXCEPTION and make sure that your code is ready to catch tbb::captured_exception.
+    #endif
+#endif /* defined TBB_USE_CAPTURED_EXCEPTION */
+
+
+#ifndef __TBB_DEFAULT_PARTITIONER
+#if TBB_DEPRECATED
+/** Default partitioner for parallel loop templates in TBB 1.0-2.1 */
+#define __TBB_DEFAULT_PARTITIONER tbb::simple_partitioner
+#else
+/** Default partitioner for parallel loop templates in TBB 2.2 */
+#define __TBB_DEFAULT_PARTITIONER tbb::auto_partitioner
+#endif /* TBB_DEFAULT_PARTITIONER */
+#endif /* !defined(__TBB_DEFAULT_PARTITIONER */
+
+/** Workarounds presence **/
+
+#if __GNUC__==4 && __GNUC_MINOR__>=4 && !defined(__INTEL_COMPILER)
+    #define __TBB_GCC_WARNING_SUPPRESSION_ENABLED 1
+#endif
+
+/** Macros of the form __TBB_XXX_BROKEN denote known issues that are caused by
+    the bugs in compilers, standard or OS specific libraries. They should be 
+    removed as soon as the corresponding bugs are fixed or the buggy OS/compiler
+    versions go out of the support list. 
+**/
+
+#if _MSC_VER && __INTEL_COMPILER && (__INTEL_COMPILER<1110 || __INTEL_COMPILER==1110 && __INTEL_COMPILER_BUILD_DATE < 20091012)
+    /** Necessary to avoid ICL error (or warning in non-strict mode): 
+        "exception specification for implicitly declared virtual destructor is 
+        incompatible with that of overridden one". **/
+    #define __TBB_DEFAULT_DTOR_THROW_SPEC_BROKEN 1
+#endif
+
+#if defined(_MSC_VER) && _MSC_VER < 1500 && !defined(__INTEL_COMPILER)
+    /** VS2005 and earlier do not allow declaring template class as a friend 
+        of classes defined in other namespaces. **/
+    #define __TBB_TEMPLATE_FRIENDS_BROKEN 1
+#endif
+
+#if __GLIBC__==2 && __GLIBC_MINOR__==3 || __MINGW32__
+    //! Macro controlling EH usages in TBB tests
+    /** Some older versions of glibc crash when exception handling happens concurrently. **/
+    #define __TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN 1
+#endif
+
+#if (_WIN32||_WIN64) && __INTEL_COMPILER == 1110
+    /** That's a bug in Intel compiler 11.1.044/IA-32/Windows, that leads to a worker thread crash on the thread's startup. **/
+    #define __TBB_ICL_11_1_CODE_GEN_BROKEN 1
+#endif
+
+#if __GNUC__==3 && __GNUC_MINOR__==3 && !defined(__INTEL_COMPILER)
+    /** A bug in GCC 3.3 with access to nested classes declared in protected area */
+    #define __TBB_GCC_3_3_PROTECTED_BROKEN 1
+#endif
+
+#if __FreeBSD__
+    /** A bug in FreeBSD 8.0 results in kernel panic when there is contention 
+        on a mutex created with this attribute. **/
+    #define __TBB_PRIO_INHERIT_BROKEN 1
+
+    /** A bug in FreeBSD 8.0 results in test hanging when an exception occurs 
+        during (concurrent?) object construction by means of placement new operator. **/
+    #define __TBB_PLACEMENT_NEW_EXCEPTION_SAFETY_BROKEN 1
+#endif /* __FreeBSD__ */
+
+#if (__linux__ || __APPLE__) && __i386__ && defined(__INTEL_COMPILER)
+    /** The Intel compiler for IA-32 (Linux|Mac OS X) crashes or generates 
+        incorrect code when __asm__ arguments have a cast to volatile. **/
+    #define __TBB_ICC_ASM_VOLATILE_BROKEN 1
+#endif
+
+
+#endif /* __TBB_tbb_config_H */
diff --git a/tbb30_20100406oss/include/tbb/tbb_exception.h b/tbb30_20100406oss/include/tbb/tbb_exception.h
new file mode 100644 (file)
index 0000000..3e1eecd
--- /dev/null
@@ -0,0 +1,365 @@
+/*
+    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB_exception_H
+#define __TBB_exception_H
+
+#include "tbb_stddef.h"
+
+#if !TBB_USE_EXCEPTIONS && _MSC_VER
+    // Suppress "C++ exception handler used, but unwind semantics are not enabled" warning in STL headers
+    #pragma warning (push)
+    #pragma warning (disable: 4530)
+#endif
+
+#include <stdexcept>
+
+#if !TBB_USE_EXCEPTIONS && _MSC_VER
+    #pragma warning (pop)
+#endif
+
+#if __SUNPRO_CC
+#include <string> // required to construct std exception classes
+#endif
+
+namespace tbb {
+
+//! Exception for concurrent containers
+class bad_last_alloc : public std::bad_alloc {
+public:
+    /*override*/ const char* what() const throw();
+#if __TBB_DEFAULT_DTOR_THROW_SPEC_BROKEN
+    /*override*/ ~bad_last_alloc() throw() {}
+#endif
+};
+
+//! Exception for PPL locks
+class improper_lock : public std::exception {
+public:
+    /*override*/ const char* what() const throw();
+};
+
+//! Exception for missing wait on structured_task_group
+class missing_wait : public std::exception {
+public:
+    /*override*/ const char* what() const throw();
+};
+
+//! Exception for repeated scheduling of the same task_handle 
+class invalid_multiple_scheduling : public std::exception {
+public:
+    /*override*/ const char* what() const throw();
+};
+
+namespace internal {
+//! Obsolete
+void __TBB_EXPORTED_FUNC throw_bad_last_alloc_exception_v4();
+
+enum exception_id {
+    eid_bad_alloc = 1,
+    eid_bad_last_alloc,
+    eid_nonpositive_step,
+    eid_out_of_range,
+    eid_segment_range_error,
+    eid_index_range_error,
+    eid_missing_wait,
+    eid_invalid_multiple_scheduling,
+    eid_improper_lock,
+    eid_possible_deadlock,
+    eid_operation_not_permitted,
+    eid_condvar_wait_failed,
+    eid_invalid_load_factor,
+    eid_invalid_buckets_number,
+    eid_invalid_swap,
+    eid_reservation_length_error,
+    eid_invalid_key,
+    //! The last enumerator tracks the number of defined IDs. It must remain the last one.
+    /** When adding new IDs, place them immediately _before_ this comment (that is
+        _after_ all the existing IDs. NEVER insert new IDs between the existing ones. **/
+    eid_max
+};
+
+//! Gathers all throw operators in one place.
+/** Its purpose is to minimize code bloat that can be caused by throw operators 
+    scattered in multiple places, especially in templates. **/
+void __TBB_EXPORTED_FUNC throw_exception_v4 ( exception_id );
+
+//! Versionless convenience wrapper for throw_exception_v4()
+inline void throw_exception ( exception_id eid ) { throw_exception_v4(eid); }
+
+} // namespace internal
+} // namespace tbb
+
+#if __TBB_TASK_GROUP_CONTEXT
+#include "tbb_allocator.h"
+#include <exception>
+#include <typeinfo>
+#include <new>
+
+namespace tbb {
+
+//! Interface to be implemented by all exceptions TBB recognizes and propagates across the threads.
+/** If an unhandled exception of the type derived from tbb::tbb_exception is intercepted
+    by the TBB scheduler in one of the worker threads, it is delivered to and re-thrown in
+    the root thread. The root thread is the thread that has started the outermost algorithm 
+    or root task sharing the same task_group_context with the guilty algorithm/task (the one
+    that threw the exception first).
+    
+    Note: when documentation mentions workers with respect to exception handling, 
+    masters are implied as well, because they are completely equivalent in this context.
+    Consequently a root thread can be master or worker thread. 
+
+    NOTE: In case of nested algorithms or complex task hierarchies when the nested 
+    levels share (explicitly or by means of implicit inheritance) the task group 
+    context of the outermost level, the exception may be (re-)thrown multiple times 
+    (ultimately - in each worker on each nesting level) before reaching the root 
+    thread at the outermost level. IMPORTANT: if you intercept an exception derived 
+    from this class on a nested level, you must re-throw it in the catch block by means
+    of the "throw;" operator. 
+    
+    TBB provides two implementations of this interface: tbb::captured_exception and 
+    template class tbb::movable_exception. See their declarations for more info. **/
+class tbb_exception : public std::exception
+{
+    /** No operator new is provided because the TBB usage model assumes dynamic 
+        creation of the TBB exception objects only by means of applying move()
+        operation on an exception thrown out of TBB scheduler. **/
+    void* operator new ( size_t );
+
+public:
+    //! Creates and returns pointer to the deep copy of this exception object. 
+    /** Move semantics is allowed. **/
+    virtual tbb_exception* move () throw() = 0;
+    
+    //! Destroys objects created by the move() method.
+    /** Frees memory and calls destructor for this exception object. 
+        Can and must be used only on objects created by the move method. **/
+    virtual void destroy () throw() = 0;
+
+    //! Throws this exception object.
+    /** Make sure that if you have several levels of derivation from this interface
+        you implement or override this method on the most derived level. The implementation 
+        is as simple as "throw *this;". Failure to do this will result in exception 
+        of a base class type being thrown. **/
+    virtual void throw_self () = 0;
+
+    //! Returns RTTI name of the originally intercepted exception
+    virtual const char* name() const throw() = 0;
+
+    //! Returns the result of originally intercepted exception's what() method.
+    virtual const char* what() const throw() = 0;
+
+    /** Operator delete is provided only to allow using existing smart pointers
+        with TBB exception objects obtained as the result of applying move()
+        operation on an exception thrown out of TBB scheduler. 
+        
+        When overriding method move() make sure to override operator delete as well
+        if memory is allocated not by TBB's scalable allocator. **/
+    void operator delete ( void* p ) {
+        internal::deallocate_via_handler_v3(p);
+    }
+};
+
+//! This class is used by TBB to propagate information about unhandled exceptions into the root thread.
+/** Exception of this type is thrown by TBB in the root thread (thread that started a parallel 
+    algorithm ) if an unhandled exception was intercepted during the algorithm execution in one 
+    of the workers.
+    \sa tbb::tbb_exception **/
+class captured_exception : public tbb_exception
+{
+public:
+    captured_exception ( const captured_exception& src )
+        : tbb_exception(src), my_dynamic(false)
+    {
+        set(src.my_exception_name, src.my_exception_info);
+    }
+
+    captured_exception ( const char* name_, const char* info )
+        : my_dynamic(false)
+    {
+        set(name_, info);
+    }
+
+    __TBB_EXPORTED_METHOD ~captured_exception () throw() {
+        clear();
+    }
+
+    captured_exception& operator= ( const captured_exception& src ) {
+        if ( this != &src ) {
+            clear();
+            set(src.my_exception_name, src.my_exception_info);
+        }
+        return *this;
+    }
+
+    /*override*/ 
+    captured_exception* __TBB_EXPORTED_METHOD move () throw();
+
+    /*override*/ 
+    void __TBB_EXPORTED_METHOD destroy () throw();
+
+    /*override*/ 
+    void throw_self () { __TBB_THROW(*this); }
+
+    /*override*/ 
+    const char* __TBB_EXPORTED_METHOD name() const throw();
+
+    /*override*/ 
+    const char* __TBB_EXPORTED_METHOD what() const throw();
+
+    void __TBB_EXPORTED_METHOD set ( const char* name, const char* info ) throw();
+    void __TBB_EXPORTED_METHOD clear () throw();
+
+private:
+    //! Used only by method clone().  
+    captured_exception() {}
+
+    //! Functionally equivalent to {captured_exception e(name,info); return e.clone();}
+    static captured_exception* allocate ( const char* name, const char* info );
+
+    bool my_dynamic;
+    const char* my_exception_name;
+    const char* my_exception_info;
+};
+
+//! Template that can be used to implement exception that transfers arbitrary ExceptionData to the root thread
+/** Code using TBB can instantiate this template with an arbitrary ExceptionData type 
+    and throw this exception object. Such exceptions are intercepted by the TBB scheduler
+    and delivered to the root thread (). 
+    \sa tbb::tbb_exception **/
+template<typename ExceptionData>
+class movable_exception : public tbb_exception
+{
+    typedef movable_exception<ExceptionData> self_type;
+
+public:
+    movable_exception ( const ExceptionData& data_ ) 
+        : my_exception_data(data_)
+        , my_dynamic(false)
+        , my_exception_name(
+#if TBB_USE_EXCEPTIONS
+        typeid(self_type).name()
+#else /* !TBB_USE_EXCEPTIONS */
+        "movable_exception"
+#endif /* !TBB_USE_EXCEPTIONS */
+        )
+    {}
+
+    movable_exception ( const movable_exception& src ) throw () 
+        : tbb_exception(src)
+        , my_exception_data(src.my_exception_data)
+        , my_dynamic(false)
+        , my_exception_name(src.my_exception_name)
+    {}
+
+    ~movable_exception () throw() {}
+
+    const movable_exception& operator= ( const movable_exception& src ) {
+        if ( this != &src ) {
+            my_exception_data = src.my_exception_data;
+            my_exception_name = src.my_exception_name;
+        }
+        return *this;
+    }
+
+    ExceptionData& data () throw() { return my_exception_data; }
+
+    const ExceptionData& data () const throw() { return my_exception_data; }
+
+    /*override*/ const char* name () const throw() { return my_exception_name; }
+
+    /*override*/ const char* what () const throw() { return "tbb::movable_exception"; }
+
+    /*override*/ 
+    movable_exception* move () throw() {
+        void* e = internal::allocate_via_handler_v3(sizeof(movable_exception));
+        if ( e ) {
+            ::new (e) movable_exception(*this);
+            ((movable_exception*)e)->my_dynamic = true;
+        }
+        return (movable_exception*)e;
+    }
+    /*override*/ 
+    void destroy () throw() {
+        __TBB_ASSERT ( my_dynamic, "Method destroy can be called only on dynamically allocated movable_exceptions" );
+        if ( my_dynamic ) {
+            this->~movable_exception();
+            internal::deallocate_via_handler_v3(this);
+        }
+    }
+    /*override*/ 
+    void throw_self () { __TBB_THROW( *this ); }
+
+protected:
+    //! User data
+    ExceptionData  my_exception_data;
+
+private:
+    //! Flag specifying whether this object has been dynamically allocated (by the move method)
+    bool my_dynamic;
+
+    //! RTTI name of this class
+    /** We rely on the fact that RTTI names are static string constants. **/
+    const char* my_exception_name;
+};
+
+#if !TBB_USE_CAPTURED_EXCEPTION
+namespace internal {
+
+//! Exception container that preserves the exact copy of the original exception
+/** This class can be used only when the appropriate runtime support (mandated 
+    by C++0x) is present **/
+class tbb_exception_ptr {
+    std::exception_ptr  my_ptr;
+
+public:
+    static tbb_exception_ptr* allocate ();
+    static tbb_exception_ptr* allocate ( const tbb_exception& tag );
+    //! This overload uses move semantics (i.e. it empties src)
+    static tbb_exception_ptr* allocate ( captured_exception& src );
+    
+    //! Destroys this objects
+    /** Note that objects of this type can be created only by the allocate() method. **/
+    void destroy () throw();
+
+    //! Throws the contained exception .
+    void throw_self () { std::rethrow_exception(my_ptr); }
+
+private:
+    tbb_exception_ptr ( const std::exception_ptr& src ) : my_ptr(src) {}
+    tbb_exception_ptr ( const captured_exception& src ) : my_ptr(std::copy_exception(src)) {}
+}; // class tbb::internal::tbb_exception_ptr
+
+} // namespace internal
+#endif /* !TBB_USE_CAPTURED_EXCEPTION */
+
+} // namespace tbb
+
+#endif /* __TBB_TASK_GROUP_CONTEXT */
+
+#endif /* __TBB_exception_H */
diff --git a/tbb30_20100406oss/include/tbb/tbb_machine.h b/tbb30_20100406oss/include/tbb/tbb_machine.h
new file mode 100644 (file)
index 0000000..aa13065
--- /dev/null
@@ -0,0 +1,642 @@
+/*
+    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB_machine_H
+#define __TBB_machine_H
+
+#include "tbb_stddef.h"
+
+#if _WIN32||_WIN64
+
+#ifdef _MANAGED
+#pragma managed(push, off)
+#endif
+
+#if __MINGW32__
+#include "machine/linux_ia32.h"
+extern "C" __declspec(dllimport) int __stdcall SwitchToThread( void );
+#define __TBB_Yield()  SwitchToThread()
+#elif defined(_M_IX86)
+#include "machine/windows_ia32.h"
+#elif defined(_M_AMD64) 
+#include "machine/windows_intel64.h"
+#elif _XBOX 
+#include "machine/xbox360_ppc.h"
+#else
+#error Unsupported platform
+#endif
+
+#ifdef _MANAGED
+#pragma managed(pop)
+#endif
+
+#elif __linux__ || __FreeBSD__
+
+#if __i386__
+#include "machine/linux_ia32.h"
+#elif __x86_64__
+#include "machine/linux_intel64.h"
+#elif __ia64__
+#include "machine/linux_ia64.h"
+#endif
+
+#elif __APPLE__
+
+#if __i386__
+#include "machine/linux_ia32.h"
+#elif __x86_64__
+#include "machine/linux_intel64.h"
+#elif __POWERPC__
+#include "machine/mac_ppc.h"
+#endif
+
+#elif _AIX
+
+#include "machine/ibm_aix51.h"
+
+#elif __sun || __SUNPRO_CC
+
+#define __asm__ asm 
+#define __volatile__ volatile
+#if __i386  || __i386__
+#include "machine/linux_ia32.h"
+#elif __x86_64__
+#include "machine/linux_intel64.h"
+#elif __sparc
+#include "machine/sunos_sparc.h"
+#endif
+
+#endif
+
+#if    !defined(__TBB_CompareAndSwap4) \
+    || !defined(__TBB_CompareAndSwap8) \
+    || !defined(__TBB_Yield)           \
+    || !defined(__TBB_release_consistency_helper)
+#error Minimal requirements for tbb_machine.h not satisfied 
+#endif
+
+#ifndef __TBB_load_with_acquire
+    //! Load with acquire semantics; i.e., no following memory operation can move above the load.
+    template<typename T>
+    inline T __TBB_load_with_acquire(const volatile T& location) {
+        T temp = location;
+        __TBB_release_consistency_helper();
+        return temp;
+    }
+#endif
+
+#ifndef __TBB_store_with_release
+    //! Store with release semantics; i.e., no prior memory operation can move below the store.
+    template<typename T, typename V>
+    inline void __TBB_store_with_release(volatile T& location, V value) {
+        __TBB_release_consistency_helper();
+        location = T(value); 
+    }
+#endif
+
+#ifndef __TBB_Pause
+    inline void __TBB_Pause(int32_t) {
+        __TBB_Yield();
+    }
+#endif
+
+namespace tbb {
+namespace internal {
+
+//! Class that implements exponential backoff.
+/** See implementation of spin_wait_while_eq for an example. */
+class atomic_backoff {
+    //! Time delay, in units of "pause" instructions. 
+    /** Should be equal to approximately the number of "pause" instructions
+        that take the same time as an context switch. */
+    static const int32_t LOOPS_BEFORE_YIELD = 16;
+    int32_t count;
+public:
+    atomic_backoff() : count(1) {}
+
+    //! Pause for a while.
+    void pause() {
+        if( count<=LOOPS_BEFORE_YIELD ) {
+            __TBB_Pause(count);
+            // Pause twice as long the next time.
+            count*=2;
+        } else {
+            // Pause is so long that we might as well yield CPU to scheduler.
+            __TBB_Yield();
+        }
+    }
+
+    // pause for a few times and then return false immediately.
+    bool bounded_pause() {
+        if( count<=LOOPS_BEFORE_YIELD ) {
+            __TBB_Pause(count);
+            // Pause twice as long the next time.
+            count*=2;
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    void reset() {
+        count = 1;
+    }
+};
+
+//! Spin WHILE the value of the variable is equal to a given value
+/** T and U should be comparable types. */
+template<typename T, typename U>
+void spin_wait_while_eq( const volatile T& location, U value ) {
+    atomic_backoff backoff;
+    while( location==value ) backoff.pause();
+}
+
+//! Spin UNTIL the value of the variable is equal to a given value
+/** T and U should be comparable types. */
+template<typename T, typename U>
+void spin_wait_until_eq( const volatile T& location, const U value ) {
+    atomic_backoff backoff;
+    while( location!=value ) backoff.pause();
+}
+
+// T should be unsigned, otherwise sign propagation will break correctness of bit manipulations.
+// S should be either 1 or 2, for the mask calculation to work correctly.
+// Together, these rules limit applicability of Masked CAS to unsigned char and unsigned short.
+template<size_t S, typename T>
+inline T __TBB_MaskedCompareAndSwap (volatile T *ptr, T value, T comparand ) {
+    volatile uint32_t * base = (uint32_t*)( (uintptr_t)ptr & ~(uintptr_t)0x3 );
+#if __TBB_BIG_ENDIAN
+    const uint8_t bitoffset = uint8_t( 8*( 4-S - (uintptr_t(ptr) & 0x3) ) );
+#else
+    const uint8_t bitoffset = uint8_t( 8*((uintptr_t)ptr & 0x3) );
+#endif
+    const uint32_t mask = ( (1<<(S*8)) - 1 )<<bitoffset;
+    atomic_backoff b;
+    uint32_t result;
+    for(;;) {
+        result = *base; // reload the base value which might change during the pause
+        uint32_t old_value = ( result & ~mask ) | ( comparand << bitoffset );
+        uint32_t new_value = ( result & ~mask ) | ( value << bitoffset );
+        // __TBB_CompareAndSwap4 presumed to have full fence. 
+        result = __TBB_CompareAndSwap4( base, new_value, old_value );
+        if(  result==old_value               // CAS succeeded
+          || ((result^old_value)&mask)!=0 )  // CAS failed and the bits of interest have changed
+            break;
+        else                                 // CAS failed but the bits of interest left unchanged
+            b.pause();
+    }
+    return T((result & mask) >> bitoffset);
+}
+
+template<size_t S, typename T>
+inline T __TBB_CompareAndSwapGeneric (volatile void *ptr, T value, T comparand ) { 
+    return __TBB_CompareAndSwapW((T *)ptr,value,comparand);
+}
+
+template<>
+inline uint8_t __TBB_CompareAndSwapGeneric <1,uint8_t> (volatile void *ptr, uint8_t value, uint8_t comparand ) {
+#ifdef __TBB_CompareAndSwap1
+    return __TBB_CompareAndSwap1(ptr,value,comparand);
+#else
+    return __TBB_MaskedCompareAndSwap<1,uint8_t>((volatile uint8_t *)ptr,value,comparand);
+#endif
+}
+
+template<>
+inline uint16_t __TBB_CompareAndSwapGeneric <2,uint16_t> (volatile void *ptr, uint16_t value, uint16_t comparand ) {
+#ifdef __TBB_CompareAndSwap2
+    return __TBB_CompareAndSwap2(ptr,value,comparand);
+#else
+    return __TBB_MaskedCompareAndSwap<2,uint16_t>((volatile uint16_t *)ptr,value,comparand);
+#endif
+}
+
+template<>
+inline uint32_t __TBB_CompareAndSwapGeneric <4,uint32_t> (volatile void *ptr, uint32_t value, uint32_t comparand ) { 
+    return __TBB_CompareAndSwap4(ptr,value,comparand);
+}
+
+template<>
+inline uint64_t __TBB_CompareAndSwapGeneric <8,uint64_t> (volatile void *ptr, uint64_t value, uint64_t comparand ) { 
+    return __TBB_CompareAndSwap8(ptr,value,comparand);
+}
+
+template<size_t S, typename T>
+inline T __TBB_FetchAndAddGeneric (volatile void *ptr, T addend) {
+    atomic_backoff b;
+    T result;
+    for(;;) {
+        result = *reinterpret_cast<volatile T *>(ptr);
+        // __TBB_CompareAndSwapGeneric presumed to have full fence. 
+        if( __TBB_CompareAndSwapGeneric<S,T> ( ptr, result+addend, result )==result ) 
+            break;
+        b.pause();
+    }
+    return result;
+}
+
+template<size_t S, typename T>
+inline T __TBB_FetchAndStoreGeneric (volatile void *ptr, T value) {
+    atomic_backoff b;
+    T result;
+    for(;;) {
+        result = *reinterpret_cast<volatile T *>(ptr);
+        // __TBB_CompareAndSwapGeneric presumed to have full fence.
+        if( __TBB_CompareAndSwapGeneric<S,T> ( ptr, value, result )==result ) 
+            break;
+        b.pause();
+    }
+    return result;
+}
+
+// Macro __TBB_TypeWithAlignmentAtLeastAsStrict(T) should be a type with alignment at least as 
+// strict as type T.  Type type should have a trivial default constructor and destructor, so that
+// arrays of that type can be declared without initializers.  
+// It is correct (but perhaps a waste of space) if __TBB_TypeWithAlignmentAtLeastAsStrict(T) expands
+// to a type bigger than T.
+// The default definition here works on machines where integers are naturally aligned and the
+// strictest alignment is 16.
+#ifndef __TBB_TypeWithAlignmentAtLeastAsStrict
+
+#if __GNUC__ || __SUNPRO_CC
+struct __TBB_machine_type_with_strictest_alignment {
+    int member[4];
+} __attribute__((aligned(16)));
+#elif _MSC_VER
+__declspec(align(16)) struct __TBB_machine_type_with_strictest_alignment {
+    int member[4];
+};
+#else
+#error Must define __TBB_TypeWithAlignmentAtLeastAsStrict(T) or __TBB_machine_type_with_strictest_alignment
+#endif
+
+template<size_t N> struct type_with_alignment {__TBB_machine_type_with_strictest_alignment member;};
+template<> struct type_with_alignment<1> { char member; };
+template<> struct type_with_alignment<2> { uint16_t member; };
+template<> struct type_with_alignment<4> { uint32_t member; };
+template<> struct type_with_alignment<8> { uint64_t member; };
+
+#if _MSC_VER||defined(__GNUC__)&&__GNUC__==3 && __GNUC_MINOR__<=2  
+//! Work around for bug in GNU 3.2 and MSVC compilers.
+/** Bug is that compiler sometimes returns 0 for __alignof(T) when T has not yet been instantiated.
+    The work-around forces instantiation by forcing computation of sizeof(T) before __alignof(T). */
+template<size_t Size, typename T> 
+struct work_around_alignment_bug {
+#if _MSC_VER
+    static const size_t alignment = __alignof(T);
+#else
+    static const size_t alignment = __alignof__(T);
+#endif
+};
+#define __TBB_TypeWithAlignmentAtLeastAsStrict(T) tbb::internal::type_with_alignment<tbb::internal::work_around_alignment_bug<sizeof(T),T>::alignment>
+#elif __GNUC__ || __SUNPRO_CC
+#define __TBB_TypeWithAlignmentAtLeastAsStrict(T) tbb::internal::type_with_alignment<__alignof__(T)>
+#else
+#define __TBB_TypeWithAlignmentAtLeastAsStrict(T) __TBB_machine_type_with_strictest_alignment
+#endif
+#endif  /* ____TBB_TypeWithAlignmentAtLeastAsStrict */
+
+// Template class here is to avoid instantiation of the static data for modules that don't use it
+template<typename T>
+struct reverse {
+    static const T byte_table[256];
+};
+// An efficient implementation of the reverse function utilizes a 2^8 lookup table holding the bit-reversed
+// values of [0..2^8 - 1]. Those values can also be computed on the fly at a slightly higher cost.
+template<typename T>
+const T reverse<T>::byte_table[256] = {
+    0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0, 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0,
+    0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8, 0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8,
+    0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4, 0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4,
+    0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC, 0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC,
+    0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2, 0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2,
+    0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA, 0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA,
+    0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6, 0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6,
+    0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE, 0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE,
+    0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1, 0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1,
+    0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9, 0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9,
+    0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5, 0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5,
+    0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED, 0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD,
+    0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3, 0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3,
+    0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB, 0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB,
+    0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7, 0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7,
+    0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF, 0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF
+};
+
+} // namespace internal
+} // namespace tbb
+
+#ifndef __TBB_CompareAndSwap1
+#define __TBB_CompareAndSwap1 tbb::internal::__TBB_CompareAndSwapGeneric<1,uint8_t>
+#endif
+
+#ifndef __TBB_CompareAndSwap2 
+#define __TBB_CompareAndSwap2 tbb::internal::__TBB_CompareAndSwapGeneric<2,uint16_t>
+#endif
+
+#ifndef __TBB_CompareAndSwapW
+#define __TBB_CompareAndSwapW tbb::internal::__TBB_CompareAndSwapGeneric<sizeof(ptrdiff_t),ptrdiff_t>
+#endif
+
+#ifndef __TBB_FetchAndAdd1
+#define __TBB_FetchAndAdd1 tbb::internal::__TBB_FetchAndAddGeneric<1,uint8_t>
+#endif
+
+#ifndef __TBB_FetchAndAdd2
+#define __TBB_FetchAndAdd2 tbb::internal::__TBB_FetchAndAddGeneric<2,uint16_t>
+#endif
+
+#ifndef __TBB_FetchAndAdd4
+#define __TBB_FetchAndAdd4 tbb::internal::__TBB_FetchAndAddGeneric<4,uint32_t>
+#endif
+
+#ifndef __TBB_FetchAndAdd8
+#define __TBB_FetchAndAdd8 tbb::internal::__TBB_FetchAndAddGeneric<8,uint64_t>
+#endif
+
+#ifndef __TBB_FetchAndAddW
+#define __TBB_FetchAndAddW tbb::internal::__TBB_FetchAndAddGeneric<sizeof(ptrdiff_t),ptrdiff_t>
+#endif
+
+#ifndef __TBB_FetchAndStore1
+#define __TBB_FetchAndStore1 tbb::internal::__TBB_FetchAndStoreGeneric<1,uint8_t>
+#endif
+
+#ifndef __TBB_FetchAndStore2
+#define __TBB_FetchAndStore2 tbb::internal::__TBB_FetchAndStoreGeneric<2,uint16_t>
+#endif
+
+#ifndef __TBB_FetchAndStore4
+#define __TBB_FetchAndStore4 tbb::internal::__TBB_FetchAndStoreGeneric<4,uint32_t>
+#endif
+
+#ifndef __TBB_FetchAndStore8
+#define __TBB_FetchAndStore8 tbb::internal::__TBB_FetchAndStoreGeneric<8,uint64_t>
+#endif
+
+#ifndef __TBB_FetchAndStoreW
+#define __TBB_FetchAndStoreW tbb::internal::__TBB_FetchAndStoreGeneric<sizeof(ptrdiff_t),ptrdiff_t>
+#endif
+
+#if __TBB_DECL_FENCED_ATOMICS
+
+#ifndef __TBB_CompareAndSwap1__TBB_full_fence
+#define __TBB_CompareAndSwap1__TBB_full_fence __TBB_CompareAndSwap1
+#endif 
+#ifndef __TBB_CompareAndSwap1acquire
+#define __TBB_CompareAndSwap1acquire __TBB_CompareAndSwap1__TBB_full_fence
+#endif 
+#ifndef __TBB_CompareAndSwap1release
+#define __TBB_CompareAndSwap1release __TBB_CompareAndSwap1__TBB_full_fence
+#endif 
+
+#ifndef __TBB_CompareAndSwap2__TBB_full_fence
+#define __TBB_CompareAndSwap2__TBB_full_fence __TBB_CompareAndSwap2
+#endif
+#ifndef __TBB_CompareAndSwap2acquire
+#define __TBB_CompareAndSwap2acquire __TBB_CompareAndSwap2__TBB_full_fence
+#endif
+#ifndef __TBB_CompareAndSwap2release
+#define __TBB_CompareAndSwap2release __TBB_CompareAndSwap2__TBB_full_fence
+#endif
+
+#ifndef __TBB_CompareAndSwap4__TBB_full_fence
+#define __TBB_CompareAndSwap4__TBB_full_fence __TBB_CompareAndSwap4
+#endif 
+#ifndef __TBB_CompareAndSwap4acquire
+#define __TBB_CompareAndSwap4acquire __TBB_CompareAndSwap4__TBB_full_fence
+#endif 
+#ifndef __TBB_CompareAndSwap4release
+#define __TBB_CompareAndSwap4release __TBB_CompareAndSwap4__TBB_full_fence
+#endif 
+
+#ifndef __TBB_CompareAndSwap8__TBB_full_fence
+#define __TBB_CompareAndSwap8__TBB_full_fence __TBB_CompareAndSwap8
+#endif
+#ifndef __TBB_CompareAndSwap8acquire
+#define __TBB_CompareAndSwap8acquire __TBB_CompareAndSwap8__TBB_full_fence
+#endif
+#ifndef __TBB_CompareAndSwap8release
+#define __TBB_CompareAndSwap8release __TBB_CompareAndSwap8__TBB_full_fence
+#endif
+
+#ifndef __TBB_FetchAndAdd1__TBB_full_fence
+#define __TBB_FetchAndAdd1__TBB_full_fence __TBB_FetchAndAdd1
+#endif
+#ifndef __TBB_FetchAndAdd1acquire
+#define __TBB_FetchAndAdd1acquire __TBB_FetchAndAdd1__TBB_full_fence
+#endif
+#ifndef __TBB_FetchAndAdd1release
+#define __TBB_FetchAndAdd1release __TBB_FetchAndAdd1__TBB_full_fence
+#endif
+
+#ifndef __TBB_FetchAndAdd2__TBB_full_fence
+#define __TBB_FetchAndAdd2__TBB_full_fence __TBB_FetchAndAdd2
+#endif
+#ifndef __TBB_FetchAndAdd2acquire
+#define __TBB_FetchAndAdd2acquire __TBB_FetchAndAdd2__TBB_full_fence
+#endif
+#ifndef __TBB_FetchAndAdd2release
+#define __TBB_FetchAndAdd2release __TBB_FetchAndAdd2__TBB_full_fence
+#endif
+
+#ifndef __TBB_FetchAndAdd4__TBB_full_fence
+#define __TBB_FetchAndAdd4__TBB_full_fence __TBB_FetchAndAdd4
+#endif
+#ifndef __TBB_FetchAndAdd4acquire
+#define __TBB_FetchAndAdd4acquire __TBB_FetchAndAdd4__TBB_full_fence
+#endif
+#ifndef __TBB_FetchAndAdd4release
+#define __TBB_FetchAndAdd4release __TBB_FetchAndAdd4__TBB_full_fence
+#endif
+
+#ifndef __TBB_FetchAndAdd8__TBB_full_fence
+#define __TBB_FetchAndAdd8__TBB_full_fence __TBB_FetchAndAdd8
+#endif
+#ifndef __TBB_FetchAndAdd8acquire
+#define __TBB_FetchAndAdd8acquire __TBB_FetchAndAdd8__TBB_full_fence
+#endif
+#ifndef __TBB_FetchAndAdd8release
+#define __TBB_FetchAndAdd8release __TBB_FetchAndAdd8__TBB_full_fence
+#endif
+
+#ifndef __TBB_FetchAndStore1__TBB_full_fence
+#define __TBB_FetchAndStore1__TBB_full_fence __TBB_FetchAndStore1
+#endif
+#ifndef __TBB_FetchAndStore1acquire
+#define __TBB_FetchAndStore1acquire __TBB_FetchAndStore1__TBB_full_fence
+#endif
+#ifndef __TBB_FetchAndStore1release
+#define __TBB_FetchAndStore1release __TBB_FetchAndStore1__TBB_full_fence
+#endif
+
+#ifndef __TBB_FetchAndStore2__TBB_full_fence
+#define __TBB_FetchAndStore2__TBB_full_fence __TBB_FetchAndStore2
+#endif
+#ifndef __TBB_FetchAndStore2acquire
+#define __TBB_FetchAndStore2acquire __TBB_FetchAndStore2__TBB_full_fence
+#endif
+#ifndef __TBB_FetchAndStore2release
+#define __TBB_FetchAndStore2release __TBB_FetchAndStore2__TBB_full_fence
+#endif
+
+#ifndef __TBB_FetchAndStore4__TBB_full_fence
+#define __TBB_FetchAndStore4__TBB_full_fence __TBB_FetchAndStore4
+#endif
+#ifndef __TBB_FetchAndStore4acquire
+#define __TBB_FetchAndStore4acquire __TBB_FetchAndStore4__TBB_full_fence
+#endif
+#ifndef __TBB_FetchAndStore4release
+#define __TBB_FetchAndStore4release __TBB_FetchAndStore4__TBB_full_fence
+#endif
+
+#ifndef __TBB_FetchAndStore8__TBB_full_fence
+#define __TBB_FetchAndStore8__TBB_full_fence __TBB_FetchAndStore8
+#endif
+#ifndef __TBB_FetchAndStore8acquire
+#define __TBB_FetchAndStore8acquire __TBB_FetchAndStore8__TBB_full_fence
+#endif
+#ifndef __TBB_FetchAndStore8release
+#define __TBB_FetchAndStore8release __TBB_FetchAndStore8__TBB_full_fence
+#endif
+
+#endif // __TBB_DECL_FENCED_ATOMICS
+
+// Special atomic functions
+#ifndef __TBB_FetchAndAddWrelease
+#define __TBB_FetchAndAddWrelease __TBB_FetchAndAddW
+#endif
+
+#ifndef __TBB_FetchAndIncrementWacquire
+#define __TBB_FetchAndIncrementWacquire(P) __TBB_FetchAndAddW(P,1)
+#endif
+
+#ifndef __TBB_FetchAndDecrementWrelease
+#define __TBB_FetchAndDecrementWrelease(P) __TBB_FetchAndAddW(P,(-1))
+#endif
+
+#if __TBB_WORDSIZE==4
+// On 32-bit platforms, "atomic.h" requires definition of __TBB_Store8 and __TBB_Load8
+#ifndef __TBB_Store8
+inline void __TBB_Store8 (volatile void *ptr, int64_t value) {
+    tbb::internal::atomic_backoff b;
+    for(;;) {
+        int64_t result = *(int64_t *)ptr;
+        if( __TBB_CompareAndSwap8(ptr,value,result)==result ) break;
+        b.pause();
+    }
+}
+#endif
+
+#ifndef __TBB_Load8
+inline int64_t __TBB_Load8 (const volatile void *ptr) {
+    int64_t result = *(int64_t *)ptr;
+    result = __TBB_CompareAndSwap8((volatile void *)ptr,result,result);
+    return result;
+}
+#endif
+#endif /* __TBB_WORDSIZE==4 */
+
+#ifndef __TBB_Log2
+inline intptr_t __TBB_Log2( uintptr_t x ) {
+    if( x==0 ) return -1;
+    intptr_t result = 0;
+    uintptr_t tmp;
+#if __TBB_WORDSIZE>=8
+    if( (tmp = x>>32) ) { x=tmp; result += 32; }
+#endif
+    if( (tmp = x>>16) ) { x=tmp; result += 16; }
+    if( (tmp = x>>8) )  { x=tmp; result += 8; }
+    if( (tmp = x>>4) )  { x=tmp; result += 4; }
+    if( (tmp = x>>2) )  { x=tmp; result += 2; }
+    return (x&2)? result+1: result;
+}
+#endif
+
+#ifndef __TBB_AtomicOR
+inline void __TBB_AtomicOR( volatile void *operand, uintptr_t addend ) {
+    tbb::internal::atomic_backoff b;
+    for(;;) {
+        uintptr_t tmp = *(volatile uintptr_t *)operand;
+        uintptr_t result = __TBB_CompareAndSwapW(operand, tmp|addend, tmp);
+        if( result==tmp ) break;
+        b.pause();
+    }
+}
+#endif
+
+#ifndef __TBB_AtomicAND
+inline void __TBB_AtomicAND( volatile void *operand, uintptr_t addend ) {
+    tbb::internal::atomic_backoff b;
+    for(;;) {
+        uintptr_t tmp = *(volatile uintptr_t *)operand;
+        uintptr_t result = __TBB_CompareAndSwapW(operand, tmp&addend, tmp);
+        if( result==tmp ) break;
+        b.pause();
+    }
+}
+#endif
+
+#ifndef __TBB_TryLockByte
+inline bool __TBB_TryLockByte( unsigned char &flag ) {
+    return __TBB_CompareAndSwap1(&flag,1,0)==0;
+}
+#endif
+
+#ifndef __TBB_LockByte
+inline uintptr_t __TBB_LockByte( unsigned char& flag ) {
+    if ( !__TBB_TryLockByte(flag) ) {
+        tbb::internal::atomic_backoff b;
+        do {
+            b.pause();
+        } while ( !__TBB_TryLockByte(flag) );
+    }
+    return 0;
+}
+#endif
+
+#ifndef __TBB_ReverseByte
+inline unsigned char __TBB_ReverseByte(unsigned char src) {
+    return tbb::internal::reverse<unsigned char>::byte_table[src];
+}
+#endif
+
+template<typename T>
+T __TBB_ReverseBits(T src)
+{
+    T dst;
+    unsigned char *original = (unsigned char *) &src;
+    unsigned char *reversed = (unsigned char *) &dst;
+
+    for( int i = sizeof(T)-1; i >= 0; i-- )
+        reversed[i] = __TBB_ReverseByte( original[sizeof(T)-i-1] );
+
+    return dst;
+}
+
+#endif /* __TBB_machine_H */
diff --git a/tbb30_20100406oss/include/tbb/tbb_profiling.h b/tbb30_20100406oss/include/tbb/tbb_profiling.h
new file mode 100644 (file)
index 0000000..c3bbb51
--- /dev/null
@@ -0,0 +1,105 @@
+/*
+    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB_profiling_H
+#define __TBB_profiling_H
+
+// Check if the tools support is enabled
+#if (_WIN32||_WIN64||__linux__) && !__MINGW32__ && TBB_USE_THREADING_TOOLS
+
+#if _WIN32||_WIN64
+#include <stdlib.h>  /* mbstowcs_s */
+#endif
+#include "tbb_stddef.h"
+
+namespace tbb {
+    namespace internal {
+#if _WIN32||_WIN64
+        void __TBB_EXPORTED_FUNC itt_set_sync_name_v3( void *obj, const wchar_t* name ); 
+        inline size_t multibyte_to_widechar( wchar_t* wcs, const char* mbs, size_t bufsize) {
+#if _MSC_VER>=1400
+            size_t len;
+            mbstowcs_s( &len, wcs, bufsize, mbs, _TRUNCATE );
+            return len;   // mbstowcs_s counts null terminator
+#else
+            size_t len = mbstowcs( wcs, mbs, bufsize );
+            if(wcs && len!=size_t(-1) )
+                wcs[len<bufsize-1? len: bufsize-1] = wchar_t('\0');
+            return len+1; // mbstowcs does not count null terminator
+#endif
+        }
+#else
+        void __TBB_EXPORTED_FUNC itt_set_sync_name_v3( void *obj, const char* name ); 
+#endif
+    } // namespace internal
+} // namespace tbb
+
+//! Macro __TBB_DEFINE_PROFILING_SET_NAME(T) defines "set_name" methods for sync objects of type T
+/** Should be used in the "tbb" namespace only. 
+    Don't place semicolon after it to avoid compiler warnings. **/
+#if _WIN32||_WIN64
+    #define __TBB_DEFINE_PROFILING_SET_NAME(sync_object_type)    \
+        namespace profiling {                                                       \
+            inline void set_name( sync_object_type& obj, const wchar_t* name ) {    \
+                tbb::internal::itt_set_sync_name_v3( &obj, name );                  \
+            }                                                                       \
+            inline void set_name( sync_object_type& obj, const char* name ) {       \
+                size_t len = tbb::internal::multibyte_to_widechar(NULL, name, 0);   \
+                wchar_t *wname = new wchar_t[len];                                  \
+                tbb::internal::multibyte_to_widechar(wname, name, len);             \
+                set_name( obj, wname );                                             \
+                delete[] wname;                                                     \
+            }                                                                       \
+        }
+#else /* !WIN */
+    #define __TBB_DEFINE_PROFILING_SET_NAME(sync_object_type)    \
+        namespace profiling {                                                       \
+            inline void set_name( sync_object_type& obj, const char* name ) {       \
+                tbb::internal::itt_set_sync_name_v3( &obj, name );                  \
+            }                                                                       \
+        }
+#endif /* !WIN */
+
+#else /* no tools support */
+
+#if _WIN32||_WIN64
+    #define __TBB_DEFINE_PROFILING_SET_NAME(sync_object_type)    \
+        namespace profiling {                                               \
+            inline void set_name( sync_object_type&, const wchar_t* ) {}    \
+            inline void set_name( sync_object_type&, const char* ) {}       \
+        }
+#else /* !WIN */
+    #define __TBB_DEFINE_PROFILING_SET_NAME(sync_object_type)    \
+        namespace profiling {                                               \
+            inline void set_name( sync_object_type&, const char* ) {}       \
+        }
+#endif /* !WIN */
+
+#endif /* no tools support */
+
+#endif /* __TBB_profiling_H */
diff --git a/tbb30_20100406oss/include/tbb/tbb_stddef.h b/tbb30_20100406oss/include/tbb/tbb_stddef.h
new file mode 100644 (file)
index 0000000..a4c938e
--- /dev/null
@@ -0,0 +1,320 @@
+/*
+    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB_tbb_stddef_H
+#define __TBB_tbb_stddef_H
+
+// Marketing-driven product version
+#define TBB_VERSION_MAJOR 3
+#define TBB_VERSION_MINOR 0
+
+// Engineering-focused interface version
+#define TBB_INTERFACE_VERSION 5000
+#define TBB_INTERFACE_VERSION_MAJOR TBB_INTERFACE_VERSION/1000
+
+// The oldest major interface version still supported
+// To be used in SONAME, manifests, etc.
+#define TBB_COMPATIBLE_INTERFACE_VERSION 2
+
+#define __TBB_STRING_AUX(x) #x
+#define __TBB_STRING(x) __TBB_STRING_AUX(x)
+
+// We do not need defines below for resource processing on windows
+#if !defined RC_INVOKED
+
+// Define groups for Doxygen documentation
+/**
+ * @defgroup algorithms         Algorithms
+ * @defgroup containers         Containers
+ * @defgroup memory_allocation  Memory Allocation
+ * @defgroup synchronization    Synchronization
+ * @defgroup timing             Timing
+ * @defgroup task_scheduling    Task Scheduling
+ */
+
+// Simple text that is displayed on the main page of Doxygen documentation.
+/**
+ * \mainpage Main Page
+ *
+ * Click the tabs above for information about the
+ * - <a href="./modules.html">Modules</a> (groups of functionality) implemented by the library 
+ * - <a href="./annotated.html">Classes</a> provided by the library
+ * - <a href="./files.html">Files</a> constituting the library.
+ * .
+ * Please note that significant part of TBB functionality is implemented in the form of
+ * template functions, descriptions of which are not accessible on the <a href="./annotated.html">Classes</a>
+ * tab. Use <a href="./modules.html">Modules</a> or <a href="./namespacemembers.html">Namespace/Namespace Members</a>
+ * tabs to find them.
+ *
+ * Additional pieces of information can be found here
+ * - \subpage concepts
+ * .
+ */
+
+/** \page concepts TBB concepts
+    
+    A concept is a set of requirements to a type, which are necessary and sufficient
+    for the type to model a particular behavior or a set of behaviors. Some concepts 
+    are specific to a particular algorithm (e.g. algorithm body), while other ones 
+    are common to several algorithms (e.g. range concept). 
+
+    All TBB algorithms make use of different classes implementing various concepts.
+    Implementation classes are supplied by the user as type arguments of template 
+    parameters and/or as objects passed as function call arguments. The library 
+    provides predefined  implementations of some concepts (e.g. several kinds of 
+    \ref range_req "ranges"), while other ones must always be implemented by the user. 
+    
+    TBB defines a set of minimal requirements each concept must conform to. Here is 
+    the list of different concepts hyperlinked to the corresponding requirements specifications:
+    - \subpage range_req
+    - \subpage parallel_do_body_req
+    - \subpage parallel_for_body_req
+    - \subpage parallel_reduce_body_req
+    - \subpage parallel_scan_body_req
+    - \subpage parallel_sort_iter_req
+**/
+
+// Define preprocessor symbols used to determine architecture
+#if _WIN32||_WIN64
+#   if defined(_M_AMD64)
+#       define __TBB_x86_64 1
+#   elif defined(_M_IA64)
+#       define __TBB_ipf 1
+#   elif defined(_M_IX86)||defined(__i386__) // the latter for MinGW support
+#       define __TBB_x86_32 1
+#   endif
+#else /* Assume generic Unix */
+#   if !__linux__ && !__APPLE__
+#       define __TBB_generic_os 1
+#   endif
+#   if __x86_64__
+#       define __TBB_x86_64 1
+#   elif __ia64__
+#       define __TBB_ipf 1
+#   elif __i386__||__i386  // __i386 is for Sun OS
+#       define __TBB_x86_32 1
+#   else
+#       define __TBB_generic_arch 1
+#   endif
+#endif
+
+#if _MSC_VER
+// define the parts of stdint.h that are needed, but put them inside tbb::internal
+namespace tbb {
+namespace internal {
+    typedef __int8 int8_t;
+    typedef __int16 int16_t;
+    typedef __int32 int32_t;
+    typedef __int64 int64_t;
+    typedef unsigned __int8 uint8_t;
+    typedef unsigned __int16 uint16_t;
+    typedef unsigned __int32 uint32_t;
+    typedef unsigned __int64 uint64_t;
+} // namespace internal
+} // namespace tbb
+#else
+#include <stdint.h>
+#endif /* _MSC_VER */
+
+#if _MSC_VER >=1400
+#define __TBB_EXPORTED_FUNC   __cdecl
+#define __TBB_EXPORTED_METHOD __thiscall
+#else
+#define __TBB_EXPORTED_FUNC
+#define __TBB_EXPORTED_METHOD
+#endif
+
+#include <cstddef>      /* Need size_t and ptrdiff_t (the latter on Windows only) from here. */
+
+#if _MSC_VER
+#define __TBB_tbb_windef_H
+#include "_tbb_windef.h"
+#undef __TBB_tbb_windef_H
+#endif
+
+#include "tbb_config.h"
+
+//! The namespace tbb contains all components of the library.
+namespace tbb {
+    //! Type for an assertion handler
+    typedef void(*assertion_handler_type)( const char* filename, int line, const char* expression, const char * comment );
+
+#if TBB_USE_ASSERT
+
+//! Assert that x is true.
+/** If x is false, print assertion failure message.  
+    If the comment argument is not NULL, it is printed as part of the failure message.  
+    The comment argument has no other effect. */
+#define __TBB_ASSERT(predicate,message) ((predicate)?((void)0):tbb::assertion_failure(__FILE__,__LINE__,#predicate,message))
+#define __TBB_ASSERT_EX __TBB_ASSERT
+
+    //! Set assertion handler and return previous value of it.
+    assertion_handler_type __TBB_EXPORTED_FUNC set_assertion_handler( assertion_handler_type new_handler );
+
+    //! Process an assertion failure.
+    /** Normally called from __TBB_ASSERT macro.
+        If assertion handler is null, print message for assertion failure and abort.
+        Otherwise call the assertion handler. */
+    void __TBB_EXPORTED_FUNC assertion_failure( const char* filename, int line, const char* expression, const char* comment );
+
+#else
+
+//! No-op version of __TBB_ASSERT.
+#define __TBB_ASSERT(predicate,comment) ((void)0)
+//! "Extended" version is useful to suppress warnings if a variable is only used with an assert
+#define __TBB_ASSERT_EX(predicate,comment) ((void)(1 && (predicate)))
+
+#endif /* TBB_USE_ASSERT */
+
+//! The function returns the interface version of the TBB shared library being used.
+/**
+ * The version it returns is determined at runtime, not at compile/link time.
+ * So it can be different than the value of TBB_INTERFACE_VERSION obtained at compile time.
+ */
+extern "C" int __TBB_EXPORTED_FUNC TBB_runtime_interface_version();
+
+//! Dummy type that distinguishes splitting constructor from copy constructor.
+/**
+ * See description of parallel_for and parallel_reduce for example usages.
+ * @ingroup algorithms
+ */
+class split {
+};
+
+/**
+ * @cond INTERNAL
+ * @brief Identifiers declared inside namespace internal should never be used directly by client code.
+ */
+namespace internal {
+
+using std::size_t;
+
+//! Compile-time constant that is upper bound on cache line/sector size.
+/** It should be used only in situations where having a compile-time upper 
+    bound is more useful than a run-time exact answer.
+    @ingroup memory_allocation */
+const size_t NFS_MaxLineSize = 128;
+
+template<class T, int S>
+struct padded_base : T {
+    char pad[NFS_MaxLineSize - sizeof(T) % NFS_MaxLineSize];
+};
+template<class T> struct padded_base<T, 0> : T {};
+
+//! Pads type T to fill out to a multiple of cache line size.
+template<class T>
+struct padded : padded_base<T, sizeof(T)> {};
+
+//! Extended variant of the standard offsetof macro
+/** The standard offsetof macro is not sufficient for TBB as it can be used for
+    POD-types only. The constant 0x1000 (not NULL) is necessary to appease GCC. **/
+#define __TBB_offsetof(class_name, member_name) \
+    ((ptrdiff_t)&(reinterpret_cast<class_name*>(0x1000)->member_name) - 0x1000)
+
+//! Returns address of the object containing a member with the given name and address
+#define __TBB_get_object_ref(class_name, member_name, member_addr) \
+    (*reinterpret_cast<class_name*>((char*)member_addr - __TBB_offsetof(class_name, member_name)))
+
+//! Throws std::runtime_error with what() returning error_code description prefixed with aux_info
+void __TBB_EXPORTED_FUNC handle_perror( int error_code, const char* aux_info );
+
+#if TBB_USE_EXCEPTIONS
+    #define __TBB_TRY try
+    #define __TBB_CATCH(e) catch(e)
+    #define __TBB_THROW(e) throw e
+    #define __TBB_RETHROW() throw
+#else /* !TBB_USE_EXCEPTIONS */
+    inline bool __TBB_false() { return false; }
+    #define __TBB_TRY
+    #define __TBB_CATCH(e) if ( tbb::internal::__TBB_false() )
+    #define __TBB_THROW(e) ((void)0)
+    #define __TBB_RETHROW() ((void)0)
+#endif /* !TBB_USE_EXCEPTIONS */
+
+//! Report a runtime warning.
+void __TBB_EXPORTED_FUNC runtime_warning( const char* format, ... );
+
+#if TBB_USE_ASSERT
+//! Set p to invalid pointer value.
+template<typename T>
+inline void poison_pointer( T* & p ) {
+    p = reinterpret_cast<T*>(-1);
+}
+#else
+template<typename T>
+inline void poison_pointer( T* ) {/*do nothing*/}
+#endif /* TBB_USE_ASSERT */
+
+//! Base class for types that should not be assigned.
+class no_assign {
+    // Deny assignment
+    void operator=( const no_assign& );
+public:
+#if __GNUC__
+    //! Explicitly define default construction, because otherwise gcc issues gratuitous warning.
+    no_assign() {}
+#endif /* __GNUC__ */
+};
+
+//! Base class for types that should not be copied or assigned.
+class no_copy: no_assign {
+    //! Deny copy construction
+    no_copy( const no_copy& );
+public:
+    //! Allow default construction
+    no_copy() {}
+};
+
+//! Class for determining type of std::allocator<T>::value_type.
+template<typename T>
+struct allocator_type {
+    typedef T value_type;
+};
+
+#if _MSC_VER
+//! Microsoft std::allocator has non-standard extension that strips const from a type. 
+template<typename T>
+struct allocator_type<const T> {
+    typedef T value_type;
+};
+#endif
+
+// Struct to be used as a version tag for inline functions.
+/** Version tag can be necessary to prevent loader on Linux from using the wrong 
+    symbol in debug builds (when inline functions are compiled as out-of-line). **/
+struct version_tag_v3 {};
+
+typedef version_tag_v3 version_tag;
+
+} // internal
+//! @endcond
+
+} // tbb
+
+#endif /* RC_INVOKED */
+#endif /* __TBB_tbb_stddef_H */
diff --git a/tbb30_20100406oss/include/tbb/tbb_thread.h b/tbb30_20100406oss/include/tbb/tbb_thread.h
new file mode 100644 (file)
index 0000000..0f878ff
--- /dev/null
@@ -0,0 +1,306 @@
+/*
+    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB_tbb_thread_H
+#define __TBB_tbb_thread_H
+
+#if _WIN32||_WIN64
+#include <windows.h>
+#define __TBB_NATIVE_THREAD_ROUTINE unsigned WINAPI
+#define __TBB_NATIVE_THREAD_ROUTINE_PTR(r) unsigned (WINAPI* r)( void* )
+#else
+#define __TBB_NATIVE_THREAD_ROUTINE void*
+#define __TBB_NATIVE_THREAD_ROUTINE_PTR(r) void* (*r)( void* )
+#include <pthread.h>
+#endif // _WIN32||_WIN64
+
+#include "tbb_stddef.h"
+#include "tick_count.h"
+#include <exception>             // Need std::terminate from here.
+
+#if !TBB_USE_EXCEPTIONS && _MSC_VER
+    // Suppress "C++ exception handler used, but unwind semantics are not enabled" warning in STL headers
+    #pragma warning (push)
+    #pragma warning (disable: 4530)
+#endif
+
+#include <iosfwd>
+
+#if !TBB_USE_EXCEPTIONS && _MSC_VER
+    #pragma warning (pop)
+#endif
+
+namespace tbb {
+
+//! @cond INTERNAL
+namespace internal {
+    
+    class tbb_thread_v3;
+
+} // namespace internal
+
+void swap( internal::tbb_thread_v3& t1, internal::tbb_thread_v3& t2 ); 
+
+namespace internal {
+
+    //! Allocate a closure
+    void* __TBB_EXPORTED_FUNC allocate_closure_v3( size_t size );
+    //! Free a closure allocated by allocate_closure_v3
+    void __TBB_EXPORTED_FUNC free_closure_v3( void* );
+   
+    struct thread_closure_base {
+        void* operator new( size_t size ) {return allocate_closure_v3(size);}
+        void operator delete( void* ptr ) {free_closure_v3(ptr);}
+    };
+
+    template<class F> struct thread_closure_0: thread_closure_base {
+        F function;
+
+        static __TBB_NATIVE_THREAD_ROUTINE start_routine( void* c ) {
+            thread_closure_0 *self = static_cast<thread_closure_0*>(c);
+            __TBB_TRY {
+                self->function();
+            } __TBB_CATCH( ... ) {
+                std::terminate();
+            }
+            delete self;
+            return 0;
+        }
+        thread_closure_0( const F& f ) : function(f) {}
+    };
+    //! Structure used to pass user function with 1 argument to thread.  
+    template<class F, class X> struct thread_closure_1: thread_closure_base {
+        F function;
+        X arg1;
+        //! Routine passed to Windows's _beginthreadex by thread::internal_start() inside tbb.dll
+        static __TBB_NATIVE_THREAD_ROUTINE start_routine( void* c ) {
+            thread_closure_1 *self = static_cast<thread_closure_1*>(c);
+            __TBB_TRY {
+                self->function(self->arg1);
+            } __TBB_CATCH( ... ) {
+                std::terminate();
+            }
+            delete self;
+            return 0;
+        }
+        thread_closure_1( const F& f, const X& x ) : function(f), arg1(x) {}
+    };
+    template<class F, class X, class Y> struct thread_closure_2: thread_closure_base {
+        F function;
+        X arg1;
+        Y arg2;
+        //! Routine passed to Windows's _beginthreadex by thread::internal_start() inside tbb.dll
+        static __TBB_NATIVE_THREAD_ROUTINE start_routine( void* c ) {
+            thread_closure_2 *self = static_cast<thread_closure_2*>(c);
+            __TBB_TRY {
+                self->function(self->arg1, self->arg2);
+            } __TBB_CATCH( ... ) {
+                std::terminate();
+            }
+            delete self;
+            return 0;
+        }
+        thread_closure_2( const F& f, const X& x, const Y& y ) : function(f), arg1(x), arg2(y) {}
+    };
+
+    //! Versioned thread class.
+    class tbb_thread_v3 {
+        tbb_thread_v3(const tbb_thread_v3&); // = delete;   // Deny access
+    public:
+#if _WIN32||_WIN64
+        typedef HANDLE native_handle_type; 
+#else
+        typedef pthread_t native_handle_type; 
+#endif // _WIN32||_WIN64
+
+        class id;
+        //! Constructs a thread object that does not represent a thread of execution. 
+        tbb_thread_v3() : my_handle(0)
+#if _WIN32||_WIN64
+            , my_thread_id(0)
+#endif // _WIN32||_WIN64
+        {}
+        
+        //! Constructs an object and executes f() in a new thread
+        template <class F> explicit tbb_thread_v3(F f) {
+            typedef internal::thread_closure_0<F> closure_type;
+            internal_start(closure_type::start_routine, new closure_type(f));
+        }
+        //! Constructs an object and executes f(x) in a new thread
+        template <class F, class X> tbb_thread_v3(F f, X x) {
+            typedef internal::thread_closure_1<F,X> closure_type;
+            internal_start(closure_type::start_routine, new closure_type(f,x));
+        }
+        //! Constructs an object and executes f(x,y) in a new thread
+        template <class F, class X, class Y> tbb_thread_v3(F f, X x, Y y) {
+            typedef internal::thread_closure_2<F,X,Y> closure_type;
+            internal_start(closure_type::start_routine, new closure_type(f,x,y));
+        }
+
+        tbb_thread_v3& operator=(tbb_thread_v3& x) {
+            if (joinable()) detach();
+            my_handle = x.my_handle;
+            x.my_handle = 0;
+#if _WIN32||_WIN64
+            my_thread_id = x.my_thread_id;
+            x.my_thread_id = 0;
+#endif // _WIN32||_WIN64
+            return *this;
+        }
+        void swap( tbb_thread_v3& t ) {tbb::swap( *this, t );}
+        bool joinable() const {return my_handle!=0; }
+        //! The completion of the thread represented by *this happens before join() returns.
+        void __TBB_EXPORTED_METHOD join();
+        //! When detach() returns, *this no longer represents the possibly continuing thread of execution.
+        void __TBB_EXPORTED_METHOD detach();
+        ~tbb_thread_v3() {if( joinable() ) detach();}
+        inline id get_id() const;
+        native_handle_type native_handle() { return my_handle; }
+    
+        //! The number of hardware thread contexts.
+        static unsigned __TBB_EXPORTED_FUNC hardware_concurrency();
+    private:
+        native_handle_type my_handle; 
+#if _WIN32||_WIN64
+        DWORD my_thread_id;
+#endif // _WIN32||_WIN64
+
+        /** Runs start_routine(closure) on another thread and sets my_handle to the handle of the created thread. */
+        void __TBB_EXPORTED_METHOD internal_start( __TBB_NATIVE_THREAD_ROUTINE_PTR(start_routine), 
+                             void* closure );
+        friend void __TBB_EXPORTED_FUNC move_v3( tbb_thread_v3& t1, tbb_thread_v3& t2 );
+        friend void tbb::swap( tbb_thread_v3& t1, tbb_thread_v3& t2 ); 
+    };
+        
+    class tbb_thread_v3::id { 
+#if _WIN32||_WIN64
+        DWORD my_id;
+        id( DWORD id_ ) : my_id(id_) {}
+#else
+        pthread_t my_id;
+        id( pthread_t id_ ) : my_id(id_) {}
+#endif // _WIN32||_WIN64
+        friend class tbb_thread_v3;
+    public:
+        id() : my_id(0) {}
+
+        friend bool operator==( tbb_thread_v3::id x, tbb_thread_v3::id y );
+        friend bool operator!=( tbb_thread_v3::id x, tbb_thread_v3::id y );
+        friend bool operator<( tbb_thread_v3::id x, tbb_thread_v3::id y );
+        friend bool operator<=( tbb_thread_v3::id x, tbb_thread_v3::id y );
+        friend bool operator>( tbb_thread_v3::id x, tbb_thread_v3::id y );
+        friend bool operator>=( tbb_thread_v3::id x, tbb_thread_v3::id y );
+        
+        template<class charT, class traits>
+        friend std::basic_ostream<charT, traits>&
+        operator<< (std::basic_ostream<charT, traits> &out, 
+                    tbb_thread_v3::id id)
+        {
+            out << id.my_id;
+            return out;
+        }
+        friend tbb_thread_v3::id __TBB_EXPORTED_FUNC thread_get_id_v3();
+    }; // tbb_thread_v3::id
+
+    tbb_thread_v3::id tbb_thread_v3::get_id() const {
+#if _WIN32||_WIN64
+        return id(my_thread_id);
+#else
+        return id(my_handle);
+#endif // _WIN32||_WIN64
+    }
+    void __TBB_EXPORTED_FUNC move_v3( tbb_thread_v3& t1, tbb_thread_v3& t2 );
+    tbb_thread_v3::id __TBB_EXPORTED_FUNC thread_get_id_v3();
+    void __TBB_EXPORTED_FUNC thread_yield_v3();
+    void __TBB_EXPORTED_FUNC thread_sleep_v3(const tick_count::interval_t &i);
+
+    inline bool operator==(tbb_thread_v3::id x, tbb_thread_v3::id y)
+    {
+        return x.my_id == y.my_id;
+    }
+    inline bool operator!=(tbb_thread_v3::id x, tbb_thread_v3::id y)
+    {
+        return x.my_id != y.my_id;
+    }
+    inline bool operator<(tbb_thread_v3::id x, tbb_thread_v3::id y)
+    {
+        return x.my_id < y.my_id;
+    }
+    inline bool operator<=(tbb_thread_v3::id x, tbb_thread_v3::id y)
+    {
+        return x.my_id <= y.my_id;
+    }
+    inline bool operator>(tbb_thread_v3::id x, tbb_thread_v3::id y)
+    {
+        return x.my_id > y.my_id;
+    }
+    inline bool operator>=(tbb_thread_v3::id x, tbb_thread_v3::id y)
+    {
+        return x.my_id >= y.my_id;
+    }
+
+} // namespace internal;
+
+//! Users reference thread class by name tbb_thread
+typedef internal::tbb_thread_v3 tbb_thread;
+
+using internal::operator==;
+using internal::operator!=;
+using internal::operator<;
+using internal::operator>;
+using internal::operator<=;
+using internal::operator>=;
+
+inline void move( tbb_thread& t1, tbb_thread& t2 ) {
+    internal::move_v3(t1, t2);
+}
+
+inline void swap( internal::tbb_thread_v3& t1, internal::tbb_thread_v3& t2 ) {
+    tbb::tbb_thread::native_handle_type h = t1.my_handle;
+    t1.my_handle = t2.my_handle;
+    t2.my_handle = h;
+#if _WIN32||_WIN64
+    DWORD i = t1.my_thread_id;
+    t1.my_thread_id = t2.my_thread_id;
+    t2.my_thread_id = i;
+#endif /* _WIN32||_WIN64 */
+}
+
+namespace this_tbb_thread {
+    inline tbb_thread::id get_id() { return internal::thread_get_id_v3(); }
+    //! Offers the operating system the opportunity to schedule another thread.
+    inline void yield() { internal::thread_yield_v3(); }
+    //! The current thread blocks at least until the time specified.
+    inline void sleep(const tick_count::interval_t &i) { 
+        internal::thread_sleep_v3(i);  
+    }
+}  // namespace this_tbb_thread
+
+} // namespace tbb
+
+#endif /* __TBB_tbb_thread_H */
diff --git a/tbb30_20100406oss/include/tbb/tbbmalloc_proxy.h b/tbb30_20100406oss/include/tbb/tbbmalloc_proxy.h
new file mode 100644 (file)
index 0000000..f15ca12
--- /dev/null
@@ -0,0 +1,74 @@
+/*
+    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+/*
+Replacing the standard memory allocation routines in Microsoft* C/C++ RTL 
+(malloc/free, global new/delete, etc.) with the TBB memory allocator. 
+
+Include the following header to a source of any binary which is loaded during 
+application startup
+
+#include "tbb/tbbmalloc_proxy.h"
+
+or add following parameters to the linker options for the binary which is 
+loaded during application startup. It can be either exe-file or dll.
+
+For win32
+tbbmalloc_proxy.lib /INCLUDE:"___TBB_malloc_proxy"
+win64
+tbbmalloc_proxy.lib /INCLUDE:"__TBB_malloc_proxy"
+*/
+
+#ifndef __TBB_tbbmalloc_proxy_H
+#define __TBB_tbbmalloc_proxy_H
+
+#if _MSC_VER
+
+#ifdef _DEBUG
+    #pragma comment(lib, "tbbmalloc_proxy_debug.lib")
+#else
+    #pragma comment(lib, "tbbmalloc_proxy.lib")
+#endif
+
+#if defined(_WIN64)
+    #pragma comment(linker, "/include:__TBB_malloc_proxy")
+#else
+    #pragma comment(linker, "/include:___TBB_malloc_proxy")
+#endif
+
+#else
+/* Primarily to support MinGW */
+
+extern "C" void __TBB_malloc_proxy();
+struct __TBB_malloc_proxy_caller {
+    __TBB_malloc_proxy_caller() { __TBB_malloc_proxy(); }
+} volatile __TBB_malloc_proxy_helper_object;
+
+#endif // _MSC_VER
+
+#endif //__TBB_tbbmalloc_proxy_H
diff --git a/tbb30_20100406oss/include/tbb/tick_count.h b/tbb30_20100406oss/include/tbb/tick_count.h
new file mode 100644 (file)
index 0000000..a3d25d5
--- /dev/null
@@ -0,0 +1,155 @@
+/*
+    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks 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 Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB_tick_count_H
+#define __TBB_tick_count_H
+
+#include "tbb_stddef.h"
+
+#if _WIN32||_WIN64
+#include <windows.h>
+#elif __linux__
+#include <ctime>
+#else /* generic Unix */
+#include <sys/time.h>
+#endif /* (choice of OS) */
+
+namespace tbb {
+
+//! Absolute timestamp
+/** @ingroup timing */
+class tick_count {
+public:
+    //! Relative time interval.
+    class interval_t {
+        long long value;
+        explicit interval_t( long long value_ ) : value(value_) {}
+    public:
+        //! Construct a time interval representing zero time duration
+        interval_t() : value(0) {};
+
+        //! Construct a time interval representing sec seconds time  duration
+        explicit interval_t( double sec );
+
+        //! Return the length of a time interval in seconds
+        double seconds() const;
+
+        friend class tbb::tick_count;
+
+        //! Extract the intervals from the tick_counts and subtract them.
+        friend interval_t operator-( const tick_count& t1, const tick_count& t0 );
+
+        //! Add two intervals.
+        friend interval_t operator+( const interval_t& i, const interval_t& j ) {
+            return interval_t(i.value+j.value);
+        }
+
+        //! Subtract two intervals.
+        friend interval_t operator-( const interval_t& i, const interval_t& j ) {
+            return interval_t(i.value-j.value);
+        }
+
+        //! Accumulation operator
+        interval_t& operator+=( const interval_t& i ) {value += i.value; return *this;}
+
+        //! Subtraction operator
+        interval_t& operator-=( const interval_t& i ) {value -= i.value; return *this;}
+    };
+    
+    //! Construct an absolute timestamp initialized to zero.
+    tick_count() : my_count(0) {};
+
+    //! Return current time.
+    static tick_count now();
+    
+    //! Subtract two timestamps to get the time interval between
+    friend interval_t operator-( const tick_count& t1, const tick_count& t0 );
+
+private:
+    long long my_count;
+};
+
+inline tick_count tick_count::now() {
+    tick_count result;
+#if _WIN32||_WIN64
+    LARGE_INTEGER qpcnt;
+    QueryPerformanceCounter(&qpcnt);
+    result.my_count = qpcnt.QuadPart;
+#elif __linux__
+    struct timespec ts;
+#if TBB_USE_ASSERT
+    int status = 
+#endif /* TBB_USE_ASSERT */
+        clock_gettime( CLOCK_REALTIME, &ts );
+    __TBB_ASSERT( status==0, "CLOCK_REALTIME not supported" );
+    result.my_count = static_cast<long long>(1000000000UL)*static_cast<long long>(ts.tv_sec) + static_cast<long long>(ts.tv_nsec);
+#else /* generic Unix */
+    struct timeval tv;
+#if TBB_USE_ASSERT
+    int status = 
+#endif /* TBB_USE_ASSERT */
+        gettimeofday(&tv, NULL);
+    __TBB_ASSERT( status==0, "gettimeofday failed" );
+    result.my_count = static_cast<long long>(1000000)*static_cast<long long>(tv.tv_sec) + static_cast<long long>(tv.tv_usec);
+#endif /*(choice of OS) */
+    return result;
+}
+
+inline tick_count::interval_t::interval_t( double sec )
+{
+#if _WIN32||_WIN64
+    LARGE_INTEGER qpfreq;
+    QueryPerformanceFrequency(&qpfreq);
+    value = static_cast<long long>(sec*qpfreq.QuadPart);
+#elif __linux__
+    value = static_cast<long long>(sec*1E9);
+#else /* generic Unix */
+    value = static_cast<long long>(sec*1E6);
+#endif /* (choice of OS) */
+}
+
+inline tick_count::interval_t operator-( const tick_count& t1, const tick_count& t0 ) {
+    return tick_count::interval_t( t1.my_count-t0.my_count );
+}
+
+inline double tick_count::interval_t::seconds() const {
+#if _WIN32||_WIN64
+    LARGE_INTEGER qpfreq;
+    QueryPerformanceFrequency(&qpfreq);
+    return value/(double)qpfreq.QuadPart;
+#elif __linux__
+    return value*1E-9;
+#else /* generic Unix */
+    return value*1E-6;
+#endif /* (choice of OS) */
+}
+
+} // namespace tbb
+
+#endif /* __TBB_tick_count_H */
+
diff --git a/tbb30_20100406oss/lib/ia32/vc10/irml/irml.lib b/tbb30_20100406oss/lib/ia32/vc10/irml/irml.lib
new file mode 100644 (file)
index 0000000..f5e7a8f
Binary files /dev/null and b/tbb30_20100406oss/lib/ia32/vc10/irml/irml.lib differ
diff --git a/tbb30_20100406oss/lib/ia32/vc10/irml/irml_debug.lib b/tbb30_20100406oss/lib/ia32/vc10/irml/irml_debug.lib
new file mode 100644 (file)
index 0000000..093dee3
Binary files /dev/null and b/tbb30_20100406oss/lib/ia32/vc10/irml/irml_debug.lib differ
diff --git a/tbb30_20100406oss/lib/ia32/vc10/irml_c/irml.lib b/tbb30_20100406oss/lib/ia32/vc10/irml_c/irml.lib
new file mode 100644 (file)
index 0000000..d843504
Binary files /dev/null and b/tbb30_20100406oss/lib/ia32/vc10/irml_c/irml.lib differ
diff --git a/tbb30_20100406oss/lib/ia32/vc10/irml_c/irml_debug.lib b/tbb30_20100406oss/lib/ia32/vc10/irml_c/irml_debug.lib
new file mode 100644 (file)
index 0000000..848f0b3
Binary files /dev/null and b/tbb30_20100406oss/lib/ia32/vc10/irml_c/irml_debug.lib differ
diff --git a/tbb30_20100406oss/lib/ia32/vc10/tbb.lib b/tbb30_20100406oss/lib/ia32/vc10/tbb.lib
new file mode 100644 (file)
index 0000000..07e13c0
Binary files /dev/null and b/tbb30_20100406oss/lib/ia32/vc10/tbb.lib differ
diff --git a/tbb30_20100406oss/lib/ia32/vc10/tbb_debug.lib b/tbb30_20100406oss/lib/ia32/vc10/tbb_debug.lib
new file mode 100644 (file)
index 0000000..82d7eb4
Binary files /dev/null and b/tbb30_20100406oss/lib/ia32/vc10/tbb_debug.lib differ
diff --git a/tbb30_20100406oss/lib/ia32/vc10/tbbmalloc.lib b/tbb30_20100406oss/lib/ia32/vc10/tbbmalloc.lib
new file mode 100644 (file)
index 0000000..8ef1269
Binary files /dev/null and b/tbb30_20100406oss/lib/ia32/vc10/tbbmalloc.lib differ
diff --git a/tbb30_20100406oss/lib/ia32/vc10/tbbmalloc_debug.lib b/tbb30_20100406oss/lib/ia32/vc10/tbbmalloc_debug.lib
new file mode 100644 (file)
index 0000000..96ba0e4
Binary files /dev/null and b/tbb30_20100406oss/lib/ia32/vc10/tbbmalloc_debug.lib differ
diff --git a/tbb30_20100406oss/lib/ia32/vc10/tbbmalloc_proxy.lib b/tbb30_20100406oss/lib/ia32/vc10/tbbmalloc_proxy.lib
new file mode 100644 (file)
index 0000000..7a153f0
Binary files /dev/null and b/tbb30_20100406oss/lib/ia32/vc10/tbbmalloc_proxy.lib differ
diff --git a/tbb30_20100406oss/lib/ia32/vc10/tbbmalloc_proxy_debug.lib b/tbb30_20100406oss/lib/ia32/vc10/tbbmalloc_proxy_debug.lib
new file mode 100644 (file)
index 0000000..5487dda
Binary files /dev/null and b/tbb30_20100406oss/lib/ia32/vc10/tbbmalloc_proxy_debug.lib differ