OpenCV help - find the contour of many shapes

Get help with using AutoHotkey (v1.1 and older) and its commands and hotkeys
User avatar
Blackholyman
Posts: 1293
Joined: 29 Sep 2013, 22:57
Location: Denmark
Contact:

OpenCV help - find the contour of many shapes

08 Jun 2020, 07:53

Hi

Im trying to convert this autoit OpenCv example to autohotkey

Here is my code up to now

Code: Select all

#NoEnv
#Persistent
#SingleInstance Force 
SetBatchLines, -1

#Include <OpenCV>
;#Include <gdip>

; Create a fully opaque red brush (ARGB = Transparency, red, green, blue) to draw a circle
; pBrush := Gdip_BrushCreateSolid(0xffff0000)
; pPen := Gdip_CreatePenFromBrush(pBrush, 1.0)

tagCvContour := ""
. "int flags;" ;sequence flags, including the sequence signature (CV_SEQ_MAGIC_VAL or CV_SET_MAGIC_VAL), type of the elements and some other information about the sequence.
. "int header_size;" ;size of the sequence header. It should be sizeof(CvSeq) at minimum. See CreateSeq().
. "ptr h_next;"
. "ptr h_prev;"
. "ptr v_next;"
. "ptr v_prev;" ;pointers to another sequences in a sequence tree. Sequence trees are used to store hierarchical contour structures, retrieved by FindContours()
. "int total;" ;the number of sequence elements
. "int elem_size;" ;size of each sequence element in bytes
. "ptr block_max;" ;memory storage where the sequence resides. It can be a NULL pointer.
. "ptr w_ptr;"  ;pointer to the first data block
. "int delta_elems;"
. "ptr storage;"
. "ptr free_blocks;"
. "ptr first;"
. "int x;"
. "int y;"
. "int width;"
. "int height;"
. "int color;"
. "int reserved1;"
. "int reserved2;"
. "int reserved3;"
. "int padding1;"
. "int padding2;"

file := "Images\shapes.jpg"
	
; Create OpenCV instance.
cv := new OpenCV()

pImg := cv.LoadImage(file) ; Load IPL type image
; pImg := cv.BmpToIPL(pBitmap) ; Load Bitmap image

cv.ShowImage("Example-in", pImg) ; Display input image inside window

; Create destination images
pimgGrayScale := cv.CreateImage(cv.GetSize(pImg, width, height), 8, 1)

cv.Smooth( pimg, pimg, GAUSSIAN:=2, 3, 3) ;
;cv.ShowImage("Example-in2", pImg) ; Display input image inside window

cv.CvtColor( pimg, pimgGrayScale, cv.Constants.BGR2GRAY) ; BGR2GRAY = 6
;cv.ShowImage("Example-in3", pImg) ; Display input image inside window

;//get ride of some noise by erode and dilate and convert to black and white image
pimgBW := cv.CreateImage( cv.GetSize(pimg), 8, 1) ;

cv.Erode( pimgGrayScale, pimgBW , Null:=0, 3 )

cv.Threshold( pimgBW, pimgBW, 200, 255, cv.Constants.THRESH_BINARY) ;// may need to adjust threshold value (200)

cv.Dilate( pimgBW, pimgBW, Null:=0, 3 )

cv.Threshold( pimgBW, pimgBW, 128, 255, cv.Constants.THRESH_BINARY_INV) ;

;// show black and white image
cv.ShowImage( "Example-bw", pimgBW) ;

; //setup memory block
; Local $pstorage = _cvCreateMemStorage(0); //storage area for all contours
pStorage := cv.CreateMemStorage(0) ; Storage area for all contours

; //setup sequence block
tagCvPoint := ""
. "int x;"
. "int y;"

; Local $pcontours = _cvCreateSeq(0, 64, DllStructGetSize(DllStructCreate($tagCvPoint)), $pstorage);
pcontours := cv.CreateSeq(0, 64, 2*A_PtrSize, pstorage)

msgbox % "Pointer to contours -> " pcontours

;// find all exterior and inner contours in a list format (no vertical)
;// $num_found = _cvFindContours($pimgBW, $pstorage, $pcontours, DllStructGetSize(DllStructCreate($tagCvContour)), $CV_RETR_LIST, $CV_CHAIN_APPROX_SIMPLE, _cvPoint(0,0))
num_found := cv.FindContours(pimgBW, pstorage, pcontours, 8 + NumberOfMembersInTag(tagCvContour)*A_PtrSize, cv.Constants.CV_RETR_LIST, cv.Constants.CHAIN_APPROX_SIMPLE, cv.Point(0,0))
msgbox % "Number of contours found = " num_found

;// cycle through all exterior contours "0x4299500C" or interior contours "0x4299D00C". Remove if statement for both
pnext := pcontours
;for $t = 1 to $num_found
loop % num_found
{
	;Local $vnext = DllStructCreate($tagCvSeq,$pnext)
	vnext := DllStructCreate_tagCvSeq(pnext)
	
	;$pnext = DllStructGetData($vnext,"h_next")
	DllStructGetData(vnext, 8, "ptr") ; h_next = offset = 2*A_ptrsize
	
	;~ If $pnext = 0 Then $pnext = $pcontours + DllStructGetData($vnext,"header_size") ; skip over first sequence which is empty
	if (pnext = 0)
		pnext := pcontours + DllStructGetData(vnext, 4, "int") ; "header_size" 1*a_ptrsize ; skip over first sequence which is empty
	
	
	;~ ;// Check if sequence is an exterior contour "0x4299500C"
	;~ If DllStructGetData(DllStructCreate($tagCvContour,$pnext),"flags") = 0x4299500C then
	flags := DllStructGetData(pnext, 0, "int") ; tagCvContour -> struct | "int flags;" at 0*A_ptrsize
	if (flags =  0x4299500C)
	{

		;~ ; // determine number of elements in sequence and create an array
		;~ Local $datasize = DllStructGetData(DllStructCreate($tagCvContour,$pnext),"total")
		datasize := DllStructGetData(pnext, 24, "int") ; tagCvContour -> struct | "int total;" at 6*A_ptrsize
			
		;~ dim $apts[$datasize+2][2]
		;~ $apts[0][0] = $datasize+1
		apts[0, 0] := datasize+1

		;~ ; // retrieve x,y values of each points in sequence
		;~ ;for $itt = 0 to $datasize -1
		itt := 0
		
		loop % datasize ;~ loop % datasize
		{
			itt := A_index-1
			vpoint = cv.GetSeqElem(pnext, itt) ; $vpoint = DllStructCreate($tagCvPoint, _cvGetSeqElem($pnext,$itt))
			apts[itt+1, 0] := vpoint & 0xFFFFFFFF ; DllStructGetData($vpoint,"x")
			apts[itt+1, 1] := vpoint << 32 ;  DllStructGetData($vpoint,"y")
			If (itt = 0)
			{
				apts[datasize+1, 0] := vpoint & 0xFFFFFFFF ;~ $apts[$datasize+1][0] = DllStructGetData($vpoint,"x")
				apts[datasize+1, 1] := vpoint << 32 ;~ $apts[$datasize+1][1] = DllStructGetData($vpoint,"y")
			}
			vpoint := 0 ;~ $vpoint = 0
		} ;Next
		
		;~ ; // draw it in autoit gui using gdi drawlines
		;~ _GDIPlus_GraphicsDrawLines($hGraphics, $apts)
		;Gdip_DrawLines(hGraphics, pPen, apts)
		
		;~ $vnext = 0
		vnext := 0
	} ;~ EndIf 
	
	;~ sleep(1000) ;just to show that each sequence is drawn individually
	Sleep 1000
	
} ;Next

; // Wait for the user to hit a key, then clean up the windows
; _cvWaitKey( 0 ); Opencv function to wait for a key pressed
;cv.WaitKey( 0 )

msgbox % "wait for key"

; Do
; Until GUIGetMsg() = $GUI_EVENT_CLOSE

; ;// Be tidy
; ;//
; _GDIPlus_GraphicsDispose($hGraphics)
; GUIDelete($hGUI)

cv.ReleaseImage( pimgBW ) ;
cv.ReleaseImage( pimgGrayScale ) ;
cv.ReleaseImage( pimg ) ;
cv.DestroyAllWindows() ;
cv.ClearMemStorage( pstorage ) ;
cv.ClearSeq(pcontours) ;

; _Opencv_CloseDLL()
; _GDIPlus_Shutdown()
return

	
NumberOfMembersInTag(tagCV)
{
	RegExReplace(tagCV, ";", ";", OutputVarCount)
	return OutputVarCount
}

DllStructCreate_tagCvSeq(pointer="")
{
	tagCvSeq := ""
    . "int flags;" 			; sequence flags, including the sequence signature (CV_SEQ_MAGIC_VAL or CV_SET_MAGIC_VAL), type of the elements and some other information about the sequence.
    . "int header_size;" 	;size of the sequence header. It should be sizeof(CvSeq) at minimum. See CreateSeq().
    . "ptr h_next;"
	. "ptr h_prev;"
	. "ptr v_next;"
	. "ptr v_prev;"			;pointers to another sequences in a sequence tree. Sequence trees are used to store hierarchical contour structures, retrieved by FindContours()
    . "int total;"			;the number of sequence elements
    . "int elem_size;"		;size of each sequence element in bytes
    . "ptr block_max;"		;memory storage where the sequence resides. It can be a NULL pointer.
    . "ptr w_ptr;"			;pointer to the first data block
    . "int delta_elems;"
    . "ptr storage;"
    . "ptr free_blocks;"
    . "ptr first;"
	. "int padding1;"
	. "int padding2;"
	
	if (pointer != "")
		Struct := pointer
	else
		VarSetCapacity(Struct, NumberOfMembersInTag(tagCvSeq)*8, 0)
	
	NumPut(flags, struct+0, 0, "int") ; "int flags;" 				; sequence flags, including the sequence signature (CV_SEQ_MAGIC_VAL or CV_SET_MAGIC_VAL), type of the elements and some other information about the sequence.
	NumPut(header_size, struct+0, 8, "int") ; "int header_size;" 	;size of the sequence header. It should be sizeof(CvSeq) at minimum. See CreateSeq().
	NumPut(h_next, struct+0, 16, "ptr") ; "ptr h_next;"
	NumPut(h_prev, struct+0, 24, "ptr") ; "ptr h_prev;"
	NumPut(v_next, struct+0, 32, "ptr") ; "ptr v_next;"
	NumPut(v_prev, struct+0, 40, "ptr") ; "ptr v_prev;"			;pointers to another sequences in a sequence tree. Sequence trees are used to store hierarchical contour structures, retrieved by FindContours()
	NumPut(total, struct+0, 48, "int") ; "int total;"				;the number of sequence elements
	NumPut(elem_size, struct+0, 56, "int") ; "int elem_size;"		;size of each sequence element in bytes
	NumPut(block_max, struct+0, 64, "ptr") ; "ptr block_max;"		;memory storage where the sequence resides. It can be a NULL pointer.
	NumPut(w_ptr, struct+0, 72, "ptr") ; "ptr w_ptr;"				;pointer to the first data block
	NumPut(delta_elems, struct+0, 80, "int") ; "int delta_elems;"
	NumPut(storage, struct+0, 88, "ptr") ; "ptr storage;"
	NumPut(free_blocks, struct+0, 96, "ptr") ; "ptr free_blocks;"
	NumPut(first, struct+0, 104, "ptr") ; "ptr first;"
	NumPut(padding1, struct+0, 112, "int") ; "int padding1;"
	NumPut(padding2, struct+0, 120, "int") ; "int padding2;"
	return &struct
}

DllStructGetData_tagCvSeq_h_next(pointer)
{
	pointer := NumGet(pointer+0, 16, "ptr") ; "ptr h_next;"
	return pointer
}

DllStructGetData(VarOrAddress, offset, type)
{
	return NumGet(VarOrAddress+0, offset, type)
}

~ESC:: ExitApp
and im also using/building on this class

Code: Select all

class OpenCV {
	
	__New() {
		this.Libs := new this.Libs(this)
		this.error := this.__Init.error
	}
	
	class Constants {
		static PI := 3.1415926535897932384626433832795
		static LOG2 := 0.69314718055994530941723212145818
		static AUTO_STEP := 0x7fffffff
		static DEFAULT := 0
		
		static LOAD_IMAGE_UNCHANGED := -1
		static LOAD_IMAGE_GRAYSCALE := 0
		static LOAD_IMAGE_COLOR := 1
		static LOAD_IMAGE_ANYDEPTH := 2
		static LOAD_IMAGE_ANYCOLOR := 4
		
		; These 4 flags are used by cvSet/GetWindowProperty
		static WND_PROP_FULLSCREEN := 0 	; to change/get window's fullscreen property
		static WND_PROP_AUTOSIZE := 1 		; to change/get window's autosize property
		static WND_PROP_ASPECTRATIO := 2 	; to change/get window's aspectratio property
		static WND_PROP_OPENGL := 3 		; to change/get window's opengl support

		; These 3 flags are used by cvNamedWindow and cvSet/GetWindowProperty
		static WINDOW_NORMAL := 0x00000000		; the user can resize the window (no constraint)  / also use to switch a fullscreen window to a normal size
		static WINDOW_AUTOSIZE := 0x00000001	; the user cannot resize the window, the size is constrainted by the image displayed
		static WINDOW_OPENGL := 0x00001000		; window with opengl support

		; Those flags are only for Qt
		static GUI_EXPANDED := 0x00000000	; status bar and tool bar
		static GUI_NORMAL := 0x00000010	; old fashious way

		; These 3 flags are used by cvNamedWindow and cvSet/GetWindowProperty
		static WINDOW_FULLSCREEN := 1			; change the window to fullscreen
		static WINDOW_FREERATIO := 0x00000100	; the image expends as much as it can (no ratio constraint)
		static WINDOW_KEEPRATIO := 0x00000000	; the ration image is respected.

		; Video Files and Cameras types and parameters
		static CAP_PROP_POS_MSEC := 0
		static CAP_PROP_POS_FRAMES := 1
		static CAP_PROP_POS_AVI_RATIO := 2
		static CAP_PROP_FRAME_WIDTH := 3
		static CAP_PROP_FRAME_HEIGHT := 4
		static CAP_PROP_FPS := 5
		static CAP_PROP_FOURCC := 6
		static CAP_PROP_FRAME_COUNT := 7
		static CAP_PROP_FORMAT := 8
		static CAP_PROP_MODE := 9
		static CAP_PROP_BRIGHTNESS := 10
		static CAP_PROP_CONTRAST := 11
		static CAP_PROP_SATURATION := 12
		static CAP_PROP_HUE := 13
		static CAP_PROP_GAIN := 14
		static CAP_PROP_EXPOSURE := 15
		static CAP_PROP_CONVERT_RGB := 16
		static CAP_PROP_WHITE_BALANCE_BLUE_U := 17
		static CAP_PROP_RECTIFICATION := 18
		static CAP_PROP_MONOCROME := 19
		static CAP_PROP_SHARPNESS := 20
		static CAP_PROP_AUTO_EXPOSURE := 21
		static CAP_PROP_GAMMA := 22
		static CAP_PROP_TEMPERATURE := 23
		static CAP_PROP_TRIGGER := 24
		static CAP_PROP_TRIGGER_DELAY := 25
		static CAP_PROP_WHITE_BALANCE_RED_V := 26
		static CAP_PROP_ZOOM := 27
		static CAP_PROP_FOCUS := 28
		static CAP_PROP_GUID := 29
		static CAP_PROP_ISO_SPEED := 30
		static CAP_PROP_MAX_DC1394 := 31
		static CAP_PROP_BACKLIGHT := 32
		static CAP_PROP_PAN := 33
		static CAP_PROP_TILT := 34
		static CAP_PROP_ROLL := 35
		static CAP_PROP_IRIS := 36
		static CAP_PROP_SETTINGS := 37

		; Different constant used by opencv for selecting webcam ie. dshow web cam index would be 700, 701, 702, etc...
		static CAP_ANY := 0 ;     // autodetect
		static CAP_MIL := 100 ;   // MIL proprietary drivers
		static CAP_VFW := 200 ;   // platform native
		static CAP_V4L := 200 ;
		static CAP_V4L2 := 200 ;
		static CAP_FIREWARE := 300 ;   // IEEE 1394 drivers
		static CAP_FIREWIRE := 300 ;
		static CAP_IEEE1394 := 300 ;
		static CAP_DC1394 := 300 ;
		static CAP_CMU1394 := 300 ;
		static CAP_STEREO := 400 ;   // TYZX proprietary drivers
		static CAP_TYZX := 400 ;
		static TYZX_LEFT := 400 ;
		static TYZX_RIGHT := 401 ;
		static TYZX_COLOR := 402 ;
		static TYZX_Z := 403 ;
		static CAP_QT := 500 ;   // QuickTime
		static CAP_UNICAP := 600 ;   // Unicap drivers
		static CAP_DSHOW := 700 ;   // DirectShow (via videoInput)
		static CAP_MSMF := 1400 ;  // Microsoft Media Foundation (via videoInput)
		static CAP_PVAPI := 800 ;   // PvAPI, Prosilica GigE SDK
		static CAP_OPENNI := 900 ;   // OpenNI (for Kinect)
		static CAP_OPENNI_ASUS := 910 ;   // OpenNI (for Asus Xtion)
		static CAP_ANDROID := 1000 ;  // Android
		static CAP_XIAPI := 1100 ;   // XIMEA Camera API
		static CAP_AVFOUNDATION := 1200 ;  // AVFoundation framework for iOS (OS X Lion will have the same API)
		static CAP_GIGANETIX := 1300 ;  // Smartek Giganetix GigEVisionSDK

		;/* Image smooth methods */
		static BLUR_NO_SCALE := 0
		static BLUR := 1
		static GAUSSIAN := 2
		static MEDIAN := 3
		static BILATERAL := 4

		; image types
		static IPL_DEPTH_SIGN := 0x80000000

		static IPL_DEPTH_1U := 1
		static IPL_DEPTH_8U := 8
		static IPL_DEPTH_16U := 16
		static IPL_DEPTH_32F := 32

		static IPL_DEPTH_8S := 0x80000000 | 8
		static IPL_DEPTH_16S := 0x80000000 | 16
		static IPL_DEPTH_32S := 0x80000000 | 32

		; CV channel types
		static 8UC1 := 0
		static 8UC2 := 8
		static 8UC3 := 16
		static 8UC4 := 24

		static 8SC1 := 1
		static 8SC2 := 9
		static 8SC3 := 17
		static 8SC4 := 25

		static 16UC1 := 2
		static 16UC2 := 10
		static 16UC3 := 18
		static 16UC4 := 26

		static 16SC1 := 3
		static 16SC2 := 11
		static 16SC3 := 19
		static 16SC4 := 27

		static 32SC1 := 3
		static 32SC2 := 12
		static 32SC3 := 20
		static 32SC4 := 28

		static 32FC1 := 5
		static 32FC2 := 13
		static 32FC3 := 21
		static 32FC4 := 29

		static 64FC1 := 6
		static 64FC2 := 14
		static 64FC3 := 22
		static 64FC4 := 30

		; Mouse
		static EVENT_MOUSEMOVE := 0
		static EVENT_LBUTTONDOWN := 1
		static EVENT_RBUTTONDOWN := 2
		static EVENT_MBUTTONDOWN := 3
		static EVENT_LBUTTONUP := 4
		static EVENT_RBUTTONUP := 5
		static EVENT_MBUTTONUP := 6
		static EVENT_LBUTTONDBLCLK := 7
		static EVENT_RBUTTONDBLCLK := 8
		static EVENT_MBUTTONDBLCLK := 9

		static EVENT_FLAG_LBUTTON := 1
		static EVENT_FLAG_RBUTTON := 2
		static EVENT_FLAG_MBUTTON := 4
		static EVENT_FLAG_CTRLKEY := 8
		static EVENT_FLAG_SHIFTKEY := 16
		static EVENT_FLAG_ALTKEY := 32

		; Save file image format
		static IMWRITE_JPEG_QUALITY := 1
		static IMWRITE_PNG_COMPRESSION := 16
		static IMWRITE_PNG_STRATEGY := 17
		static IMWRITE_PNG_BILEVEL := 18
		static IMWRITE_PNG_STRATEGY_DEFAULT := 0
		static IMWRITE_PNG_STRATEGY_FILTERED := 1
		static IMWRITE_PNG_STRATEGY_HUFFMAN_ONLY := 2
		static IMWRITE_PNG_STRATEGY_RLE := 3
		static IMWRITE_PNG_STRATEGY_FIXED := 4
		static IMWRITE_PXM_BINARY := 32

		; cvConvertImage flip types
		static CVTIMG_FLIP := 1
		static CVTIMG_SWAP_RB := 2

		; compare operation
		static CMP_EQ := 0
		static CMP_GT := 1
		static CMP_GE := 2
		static CMP_LT := 3
		static CMP_LE := 4
		static CMP_NE := 5

		; cvSort flags
		static SORT_EVERY_ROW := 0
		static SORT_EVERY_COLUMN := 1
		static SORT_ASCENDING := 0
		static SORT_DESCENDING := 16

		;/* types of array norm */
		static C := 1
		static L1 := 2
		static L2 := 4
		static NORM_MASK := 7
		static RELATIVE := 8
		static DIFF := 16
		static MINMAX := 32

		static DIFF_C := 16 | 1
		static DIFF_L1 := 16 | 2
		static DIFF_L2 := 16 | 4
		static RELATIVE_C := 8 | 1
		static RELATIVE_L1 := 8 | 2
		static RELATIVE_L2 := 8 | 4

		;/*********************************** CPU capabilities ***********************************/

		static CPU_NONE := 0
		static CPU_MMX := 1
		static CPU_SSE := 2
		static CPU_SSE2 := 3
		static CPU_SSE3 := 4
		static CPU_SSSE3 := 5
		static CPU_SSE4_1 := 6
		static CPU_SSE4_2 := 7
		static CPU_POPCNT := 8
		static CPU_AVX := 10
		static HARDWARE_MAX_FEATURE := 255

		; cvFindChessBoard flag

		static CALIB_CB_ADAPTIVE_THRESH := 1
		static CALIB_CB_NORMALIZE_IMAGE := 2
		static CALIB_CB_FILTER_QUADS := 4
		static CALIB_CB_FAST_CHECK := 8

		static CALIB_USE_INTRINSIC_GUESS := 1
		static CALIB_FIX_ASPECT_RATIO := 2
		static CALIB_FIX_PRINCIPAL_POINT := 4
		static CALIB_ZERO_TANGENT_DIST := 8
		static CALIB_FIX_FOCAL_LENGTH := 16
		static CALIB_FIX_K1 := 32
		static CALIB_FIX_K2 := 64
		static CALIB_FIX_K3 := 128
		static CALIB_FIX_K4 := 2048
		static CALIB_FIX_K5 := 4096
		static CALIB_FIX_K6 := 8192
		static CALIB_RATIONAL_MODEL := 16384

		;/* Filters used in pyramid decomposition */

		static GAUSSIAN_5x5 := 7

		;/* Special filters */


		static SCHARR := -1
		static MAX_SOBEL_KSIZE := 7

		;/* Constants for color conversion */


		static BGR2BGRA := 0
		static RGB2RGBA := 0

		static BGRA2BGR := 1
		static RGBA2RGB := 1

		static BGR2RGBA := 2
		static RGB2BGRA := 2

		static RGBA2BGR := 3
		static BGRA2RGB := 3

		static BGR2RGB := 4
		static RGB2BGR := 4

		static BGRA2RGBA := 5
		static RGBA2BGRA := 5

		static BGR2GRAY := 6
		static RGB2GRAY := 7
		static GRAY2BGR := 8
		static GRAY2RGB := 8
		static GRAY2BGRA := 9
		static GRAY2RGBA := 9
		static BGRA2GRAY := 10
		static RGBA2GRAY := 11

		static BGR2BGR565 := 12
		static RGB2BGR565 := 13
		static BGR5652BGR := 14
		static BGR5652RGB := 15
		static BGRA2BGR565 := 16
		static RGBA2BGR565 := 17
		static BGR5652BGRA := 18
		static BGR5652RGBA := 19

		static GRAY2BGR565 := 20
		static BGR5652GRAY := 21

		static BGR2BGR555 := 22
		static RGB2BGR555 := 23
		static BGR5552BGR := 24
		static BGR5552RGB := 25
		static BGRA2BGR555 := 26
		static RGBA2BGR555 := 27
		static BGR5552BGRA := 28
		static BGR5552RGBA := 29

		static GRAY2BGR555 := 30
		static BGR5552GRAY := 31

		static BGR2XYZ := 32
		static RGB2XYZ := 33
		static XYZ2BGR := 34
		static XYZ2RGB := 35

		static BGR2YCrCb := 36
		static RGB2YCrCb := 37
		static YCrCb2BGR := 38
		static YCrCb2RGB := 39

		static BGR2HSV := 40
		static RGB2HSV := 41

		static BGR2Lab := 44
		static RGB2Lab := 45

		static BayerBG2BGR := 46
		static BayerGB2BGR := 47
		static BayerRG2BGR := 48
		static BayerGR2BGR := 49

		static BayerBG2RGB := 48
		static BayerGB2RGB := 49
		static BayerRG2RGB := 46
		static BayerGR2RGB := 47

		static BGR2Luv := 50
		static RGB2Luv := 51
		static BGR2HLS := 52
		static RGB2HLS := 53

		static HSV2BGR := 54
		static HSV2RGB := 55

		static Lab2BGR := 56
		static Lab2RGB := 57
		static Luv2BGR := 58
		static Luv2RGB := 59
		static HLS2BGR := 60
		static HLS2RGB := 61

		static BayerBG2BGR_VNG := 62
		static BayerGB2BGR_VNG := 63
		static BayerRG2BGR_VNG := 64
		static BayerGR2BGR_VNG := 65

		static BayerBG2RGB_VNG := 64
		static BayerGB2RGB_VNG := 65
		static BayerRG2RGB_VNG := 62
		static BayerGR2RGB_VNG := 63

		static BGR2HSV_FULL := 66
		static RGB2HSV_FULL := 67
		static BGR2HLS_FULL := 68
		static RGB2HLS_FULL := 69

		static HSV2BGR_FULL := 70
		static HSV2RGB_FULL := 71
		static HLS2BGR_FULL := 72
		static HLS2RGB_FULL := 73

		static LBGR2Lab := 74
		static LRGB2Lab := 75
		static LBGR2Luv := 76
		static LRGB2Luv := 77

		static Lab2LBGR := 78
		static Lab2LRGB := 79
		static Luv2LBGR := 80
		static Luv2LRGB := 81

		static BGR2YUV := 82
		static RGB2YUV := 83
		static YUV2BGR := 84
		static YUV2RGB := 85

		static BayerBG2GRAY := 86
		static BayerGB2GRAY := 87
		static BayerRG2GRAY := 88
		static BayerGR2GRAY := 89

		;    //YUV 4:2:0 formats family
		static YUV2RGB_NV12 := 90
		static YUV2BGR_NV12 := 91
		static YUV2RGB_NV21 := 92
		static YUV2BGR_NV21 := 93
		static YUV420sp2RGB := 92
		static YUV420sp2BGR := 93

		static YUV2RGBA_NV12 := 94
		static YUV2BGRA_NV12 := 95
		static YUV2RGBA_NV21 := 96
		static YUV2BGRA_NV21 := 97
		static YUV420sp2RGBA := 96
		static YUV420sp2BGRA := 97

		static YUV2RGB_YV12 := 98
		static YUV2BGR_YV12 := 99
		static YUV2RGB_IYUV := 100
		static YUV2BGR_IYUV := 101
		static YUV2RGB_I420 := 100
		static YUV2BGR_I420 := 101
		static YUV420p2RGB := 98
		static YUV420p2BGR := 99

		static YUV2RGBA_YV12 := 102
		static YUV2BGRA_YV12 := 103
		static YUV2RGBA_IYUV := 104
		static YUV2BGRA_IYUV := 105
		static YUV2RGBA_I420 := 104
		static YUV2BGRA_I420 := 105
		static YUV420p2RGBA := 102
		static YUV420p2BGRA := 103

		static YUV2GRAY_420 := 106
		static YUV2GRAY_NV21 := 106
		static YUV2GRAY_NV12 := 106
		static YUV2GRAY_YV12 := 106
		static YUV2GRAY_IYUV := 106
		static YUV2GRAY_I420 := 106
		static YUV420sp2GRAY := 106
		static YUV420p2GRAY := 106

		;    //YUV 4:2:2 formats family
		static YUV2RGB_UYVY := 107
		static YUV2BGR_UYVY := 108
		;   //YUV2RGB_VYUY := 109
		;    //YUV2BGR_VYUY := 110
		static YUV2RGB_Y422 := 107
		static YUV2BGR_Y422 := 108
		static YUV2RGB_UYNV := 107
		static YUV2BGR_UYNV := 108

		static YUV2RGBA_UYVY := 111
		static YUV2BGRA_UYVY := 112
		;    //YUV2RGBA_VYUY := 113
		;    //YUV2BGRA_VYUY := 114
		static YUV2RGBA_Y422 := 111
		static YUV2BGRA_Y422 := 112
		static YUV2RGBA_UYNV := 111
		static YUV2BGRA_UYNV := 112

		static YUV2RGB_YUY2 := 115
		static YUV2BGR_YUY2 := 116
		static YUV2RGB_YVYU := 117
		static YUV2BGR_YVYU := 118
		static YUV2RGB_YUYV := 115
		static YUV2BGR_YUYV := 116
		static YUV2RGB_YUNV := 115
		static YUV2BGR_YUNV := 116

		static YUV2RGBA_YUY2 := 119
		static YUV2BGRA_YUY2 := 120
		static YUV2RGBA_YVYU := 121
		static YUV2BGRA_YVYU := 122
		static YUV2RGBA_YUYV := 119
		static YUV2BGRA_YUYV := 120
		static YUV2RGBA_YUNV := 119
		static YUV2BGRA_YUNV := 120

		static YUV2GRAY_UYVY := 123
		static YUV2GRAY_YUY2 := 124
		;    //YUV2GRAY_VYUY := 123
		static YUV2GRAY_Y422 := 123
		static YUV2GRAY_UYNV := 123
		static YUV2GRAY_YVYU := 124
		static YUV2GRAY_YUYV := 124
		static YUV2GRAY_YUNV := 124

		;    // alpha premultiplication
		static RGBA2mRGBA := 125
		static mRGBA2RGBA := 126

		static RGB2YUV_I420 := 127
		static BGR2YUV_I420 := 128
		static RGB2YUV_IYUV := 127
		static BGR2YUV_IYUV := 128

		static RGBA2YUV_I420 := 129
		static BGRA2YUV_I420 := 130
		static RGBA2YUV_IYUV := 129
		static BGRA2YUV_IYUV := 130
		static RGB2YUV_YV12 := 131
		static BGR2YUV_YV12 := 132
		static RGBA2YUV_YV12 := 133
		static BGRA2YUV_YV12 := 134

		static COLORCVT_MAX := 135


		;/* Sub-pixel interpolation methods */


		static INTER_NN := 0
		static INTER_LINEAR := 1
		static INTER_CUBIC := 2
		static INTER_AREA := 3
		static INTER_LANCZOS4 := 4


		;/* ... and other image warping flags */


		static WARP_FILL_OUTLIERS := 8
		static WARP_INVERSE_MAP := 16


		;/* Shapes of a structuring element for morphological operations */


		static SHAPE_RECT := 0
		static SHAPE_CROSS := 1
		static SHAPE_ELLIPSE := 2
		static SHAPE_CUSTOM := 100


		;/* Morphological operations */


		static MOP_ERODE := 0
		static MOP_DILATE := 1
		static MOP_OPEN := 2
		static MOP_CLOSE := 3
		static MOP_GRADIENT := 4
		static MOP_TOPHAT := 5
		static MOP_BLACKHAT := 6

		;/* Template matching methods */

		static TM_SQDIFF := 0
		static TM_SQDIFF_NORMED := 1
		static TM_CCORR := 2
		static TM_CCORR_NORMED := 3
		static TM_CCOEFF := 4
		static TM_CCOEFF_NORMED := 5

		;/* Contour retrieval modes */

		static RETR_EXTERNAL := 0
		static RETR_LIST := 1
		static RETR_CCOMP := 2
		static RETR_TREE := 3
		static RETR_FLOODFILL := 4

		;/* Contour approximation methods */

		static CHAIN_CODE := 0
		static CHAIN_APPROX_NONE := 1
		static CHAIN_APPROX_SIMPLE := 2
		static CHAIN_APPROX_TC89_L1 := 3
		static CHAIN_APPROX_TC89_KCOS := 4
		static LINK_RUNS := 5

		;/* Histogram comparison methods */

		static COMP_CORREL := 0
		static COMP_CHISQR := 1
		static COMP_INTERSECT := 2
		static COMP_BHATTACHARYYA := 3
		static COMP_HELLINGER := 3

		;/* Mask size for distance transform */

		static DIST_MASK_3 := 3
		static DIST_MASK_5 := 5
		static DIST_MASK_PRECISE := 0

		;/* Content of output label array: connected components or pixels */

		static DIST_LABEL_CCOMP := 0
		static DIST_LABEL_PIXEL := 1

		;/* Distance types for Distance Transform and M-estimators */

		static DIST_USER := -1  ;/* User defined distance */
		static DIST_L1 := 1   ;/* distance = |x1-x2| + |y1-y2| */
		static DIST_L2 := 2   ;/* the simple euclidean distance */
		static DIST_C := 3   ;/* distance = max(|x1-x2||y1-y2|) */
		static DIST_L12 := 4   ;/* L1-L2 metric: distance = 2(sqrt(1+x*x/2) - 1)) */
		static DIST_FAIR := 5   ;/* distance = c^2(|x|/c-log(1+|x|/c)) c = 1.3998 */
		static DIST_WELSCH := 6   ;/* distance = c^2/2(1-exp(-(x/c)^2)) c = 2.9846 */
		static DIST_HUBER := 7    ;/* distance = |x|<c ? x^2/2 : c(|x|-c/2) c=1.345 */

		;/* Threshold types */

		static THRESH_BINARY := 0  ;/* value = value > threshold ? max_value : 0       */
		static THRESH_BINARY_INV := 1  ;/* value = value > threshold ? 0 : max_value       */
		static THRESH_TRUNC := 2  ;/* value = value > threshold ? threshold : value   */
		static THRESH_TOZERO := 3  ;/* value = value > threshold ? value : 0           */
		static THRESH_TOZERO_INV := 4  ;/* value = value > threshold ? 0 : value           */
		static THRESH_MASK := 7
		static THRESH_OTSU := 8  ;/* use Otsu algorithm to choose the optimal threshold value;
												;   combine the flag with one of the above THRESH_* values */

		;/* Adaptive threshold methods */

		static ADAPTIVE_THRESH_MEAN_C := 0
		static ADAPTIVE_THRESH_GAUSSIAN_C := 1

		;/* FloodFill flags */

		static FLOODFILL_FIXED_RANGE := 1 << -16
		static FLOODFILL_MASK_ONLY := 1 << -17

		;/* Variants of a Hough transform */

		static HOUGH_STANDARD := 0
		static HOUGH_PROBABILISTIC := 1
		static HOUGH_MULTI_SCALE := 2
		static HOUGH_GRADIENT := 3

		;/* For font */
		static FONT_LIGHT := 25 ;//QFont::Light,
		static FONT_NORMAL := 50 ;//QFont::Normal,
		static FONT_DEMIBOLD := 63 ;//QFont::DemiBold,
		static FONT_BOLD := 75 ;//QFont::Bold,
		static FONT_BLACK := 87 ;//QFont::Black

		static STYLE_NORMAL := 0 ;//QFont::StyleNormal,
		static STYLE_ITALIC := 1 ;//QFont::StyleItalic,
		static STYLE_OBLIQUE := 2 ;//QFont::StyleOblique

		; type of button
		static PUSH_BUTTON := 0
		static CHECKBOX := 1
		static RADIOBOX := 2

		static TERMCRIT_ITER := 1
		static TERMCRIT_NUMBER := 1
		static TERMCRIT_EPS := 2

		;/* Contour approximation algorithms */

		static POLY_APPROX_DP := 0
	}
	
	class Libs {
		static path := "\Lib\DLL\"
		static libraries := {
		(Join, 
			opencv_core: "opencv_core2413.dll"
			opencv_highgui: "opencv_highgui2413.dll"
			opencv_imgproc: "opencv_imgproc2413.dll"
			opencv_objdetect: "opencv_objdetect2413.dll"
		)}
		
		__New(parent) {
			this.generateCallMethods(parent)
		}
		
		__Call(method, args*) {
			if (method == "call") {
				if (IsObject(args[2])) ; Remove passed 'this' inside 'call' function
					args.RemoveAt(2)
				return this.Call(args*)
			}
		}
		
		generateCallMethods(ctx) {
			for libName, dllName in this.libraries {
				ctx[libName] := ObjBindMethod(this, "call", libName)
			}
		}
		
		getDLL(libName) {
			return this.libraries[libName]
		}
		
		call(libName, fnName, params*) {
			return DllCall(this.getDLL(libName) . "\" . fnName, params*)
		}
		
		load() {
			static OriginalWorkingDir := A_ScriptDir
			SetWorkingDir % OriginalWorkingDir . this.path
			for libName, dllName in this.libraries
				DllCall("LoadLibrary", "Str", dllName, "Ptr")
			SetWorkingDir % OriginalWorkingDir
		}
		
		unload() {
			for libName, dllName in this.libraries
				if (hModule := DllCall("GetModuleHandle", "str", dllName))
					DllCall("FreeLibrary", "ptr", hModule)
		}
	}
	
	class __Init {
		static _ := OpenCV.__Init := new OpenCV.__Init()
		
		__New() {
			OpenCV.Libs.load()
			OnExit(ObjBindMethod(OpenCV.Libs, "unload"))
		}
		
		error(additionalMsg := "")	{
			Tooltip % additionalMsg
			stackTrace := (A_ThisFunc "`n" ErrorLevel)
			errorCode := "`nLastError - " A_LastError
			if ErrorLevel
				MsgBox % additionalMsg . " " . stackTrace . " " . errorCode
			return ErrorLevel
		}
	}
	
	__wrapAround(result := "") {
		this._error()
		return result
	}
		
	BmpToIPL(pBitmap) {
		if (!IsFunc("Gdip_GetImageDimensions")) {
			MsgBox % "BmpToIPL >> GDI+ Library is missing!"
			return
		}
		
		Func("Gdip_GetImageDimensions").Call(pBitmap, iW, iH)
		tBitmapData := Func("Gdip_LockBits").Call(pBitmap, 0, 0, iW, iH, Stride, Scan0, BitmapData)
		pIPL := this.CreateImageHeader(this.Size(iW, iH), 8, 4)
		this.SetData(pIPL, Scan0, Stride)
		Func("Gdip_UnlockBits").Call(pBitmap, tBitmapData)
		return pIPL
	}
	
	Load(cvfilename, cvmemstorage := 0, cvname := 0, cvreal_name := 0) {
		result := this.opencv_core("cvLoad", "AStr", cvfilename, "ptr", cvmemstorage, "ptr", cvname, "ptr", cvreal_name, "Cdecl ptr")
		return this.__wrapAround(result)
	}
	
	NamedWindow(name, flags := 0x00000001) {
		result := this.opencv_highgui("cvNamedWindow", "AStr", name, "int", flags, "Cdecl ptr")
		return this.__wrapAround(result)
	}
	
	LoadImage(filename, iscolor := 1) {
		result := this.opencv_highgui("cvLoadImage", "AStr", filename, "int", iscolor, "Cdecl ptr")
		return this.__wrapAround(result)
	}
	
	ShowImage(name, pimage) {
		result := this.opencv_highgui("cvShowImage", "AStr", name, "ptr", pimage, "Cdecl")
		return this.__wrapAround(result)
	}
	
	CreateImage(cvsize, cvdepth, cvchannels) {
		result :=  this.opencv_core("cvCreateImage", "int64", cvsize, "int", cvdepth, "int", cvchannels, "Cdecl ptr")
		return this.__wrapAround(result)
	}
	
	CreateImageHeader(cvsize, cvdepth, cvchannels) {
		result := this.opencv_core("cvCreateImageHeader", "int64", cvsize, "int", cvdepth, "int", cvchannels, "Cdecl ptr")
		return this.__wrapAround(result)
	}
	
	CreateMat(cvrows, cvcols, cvtype) {
		result := this.opencv_core("cvCreateMat", "int", cvrows, "int", cvcols, "int", cvtype, "Cdecl ptr")
		return this.__wrapAround(result)
	}
	
	MatchTemplate(cvimage, cvtempl, cvresult, cvmethod) {
		result := this.opencv_imgproc("cvMatchTemplate", "ptr", cvimage, "ptr", cvtempl, "ptr", cvresult, "int", cvmethod, "Cdecl")
		return this.__wrapAround(result)
	}
	
	Normalize(cvsrc, cvdst, cva, cvb, cvnorm_type, cvmask) {
		result := this.opencv_core("cvNormalize", "ptr", cvsrc, "ptr", cvdst, "Double", cva, "Double", cvb, "int", cvnorm_type, "ptr", cvmask, "Cdecl")
		return this.__wrapAround(result)
	}
	
	Threshold(cvsrc, cvdst, cvthreshold, cvmax_value, cvthreshold_type) {
		result := this.opencv_imgproc("cvThreshold", "ptr", cvsrc, "ptr", cvdst, "Double", cvthreshold, "Double", cvmax_value, "int", cvthreshold_type, "Cdecl double")
		return this.__wrapAround(result)
	}
	
	ArrTohBitmap(pimage, byref width = "", byref height = "") { 
		result := this.CreateImage(this.GetSize(pimage, width, height), 8, 4)
		this.CvtColor(pimage, Result, 0)  
		pData := NumGet(Result + 0, 68 + 20 * (A_PtrSize = 8), "Ptr")
		hBitmap := DllCall("CreateBitmap", "Int", width, "Int", height, "UInt", 1, "UInt", 32, "Ptr", pData)
		Return this.__wrapAround(hBitmap), this.ReleaseImage(result)
	}
	
	Scalar(value) {
		VarSetCapacity(vScalar, 32, 0)
		if IsObject(value) {
			Loop 4
			NumPut(value%A_Index%, vScalar, (A_Index - 1) * 8, "double")
		} else {
			Loop 4
			NumPut(value, vScalar, (A_Index - 1) * 8, "double")
		}
		return this.__wrapAround(&vScalar)
	}
	
	Set(cvarr, cvvalue, cvmask := 0) {
		if (A_PtrSize = 4)
			result := this.opencv_core("cvSet", "ptr", cvarr, "double", NumGet(cvvalue+0, 0, "double"), "double", NumGet(cvvalue+0, 8, "double"), "double", NumGet(cvvalue+0, 16, "double"), "double", NumGet(cvvalue+0, 24, "double"), "ptr", cvmask, "Cdecl")
		else
			result := this.opencv_core("cvSet", "ptr", cvarr, "ptr", cvvalue, "ptr", cvmask, "Cdecl")
		return this.__wrapAround(result)
	}
	
	GetSize(pimage, ByRef width := 0, ByRef height := 0) {
		WidthHeight := this.opencv_core("cvGetSize", "ptr", pimage, "Cdecl int64")

		width := 0xFFFFFFFF & WidthHeight
		height := WidthHeight >> 32
		
		return this.__wrapAround(WidthHeight)
	}
	
	Size(width, height) {
	   return this.__wrapAround(width & 0xFFFFFFFF | height << 32)
	}
	
	
	;------------------------------------------------
	;/*
	;CVAPI(void)  cvCvtColor( const CvArr* src, CvArr* dst, int code );
	;
	;
	CvtColor(cvsrc, cvdst, cvcode) {
		result := this.opencv_imgproc("cvCvtColor", "ptr", cvsrc, "ptr", cvdst, "int", cvcode, "Cdecl")
		return this.__wrapAround(result)
	}
	
	Resize(cvsrc, cvdst, cvinterpolation := 1) {
		result := this.opencv_imgproc("cvResize", "ptr", cvsrc, "ptr", cvdst, "int", cvinterpolation, "Cdecl")
		return this.__wrapAround(result)
	}
	
	EqualizeHist(cvsrc, cvdst) {
		result := this.opencv_imgproc("cvEqualizeHist", "ptr", cvsrc, "ptr", cvdst, "Cdecl")
		return this.__wrapAround(result)
	}
	
	CreateMemStorage(cvblock_size) {
		result := this.opencv_core("cvCreateMemStorage", "int", cvblock_size, "Cdecl ptr")
		return this.__wrapAround(result)
	}
	
	ClearMemStorage(cvstorage) {
	   result := this.opencv_core("cvClearMemStorage", "ptr", cvstorage, "Cdecl")
	   return this.__wrapAround(result)
	}
	
	HaarDetectObjects(cvimage, cvcascade, cvstorage, cvscale_factor := 1.1, cvmin_neighbors := 3, cvflags := 0, cvmin_size := 0, cvmax_size := 0) {
		result := this.opencv_objdetect("cvHaarDetectObjects", "ptr", cvimage, "ptr", cvcascade, "ptr", cvstorage, "double", cvscale_factor, "int", cvmin_neighbors, "int", cvflags, "int64", cvmin_size, "int64", cvmax_size, "Cdecl ptr")
		return this.__wrapAround(result)
	}
	
	GetSeqElem(cvseq, cvindex) {
		result := this.opencv_core("cvGetSeqElem", "ptr", cvseq, "int", cvindex, "Cdecl ptr")
		return this.__wrapAround(result)
	}
	
	Rectangle(cvimg, cvpt1, cvpt2, cvcolor, cvthickness, cvline_type, cvshift) {
		if (A_PtrSize = 4)
			result := this.opencv_core("cvRectangle", "ptr", cvimg, "int64", cvpt1, "int64", cvpt2, "double", NumGet(cvcolor+0, 0, "double"), "double", NumGet(cvcolor+0, 8, "double"), "double", NumGet(cvcolor+0, 16, "double"), "double", NumGet(cvcolor+0, 24, "double"), "int", cvthickness, "int", cvline_type, "int", cvshift, "Cdecl")
		else
			result := this.opencv_core("cvRectangle", "ptr", cvimg, "int64", cvpt1, "int64", cvpt2, "ptr", cvcolor, "int", cvthickness, "int", cvline_type, "int", cvshift, "Cdecl")
		return this.__wrapAround(result)
	}
	
	ReleaseImage(pimage) {
		result := this.opencv_core("cvReleaseImage", "ptr*", pimage, "Cdecl")
		return this.__wrapAround(result)
	}
	
	DestroyAllWindows() {
		result := this.opencv_highgui("cvDestroyAllWindows", "Cdecl")
		return this.__wrapAround(result)
	}
	
	ClearSeq(cvseq) {
		result := this.opencv_core("cvClearSeq", "ptr", cvseq, "Cdecl")
		return this.__wrapAround(result)
	}
	
	Point(x, y) {
		return this.__wrapAround(x & 0xFFFFFFFF | y << 32)
	}
	
	RGB(cvRed, cvGreen, cvBlue) {
		VarSetCapacity(vScalar, 32, 0)
		NumPut(cvBlue, vScalar, 0, "double")
		NumPut(cvGreen, vScalar, 8, "double")
		NumPut(cvRed, vScalar, 16, "double")
		NumPut(0, vScalar, 24, "double")
		return this.__wrapAround(&vScalar)
	}
	
	SetData(cvarr, data, step) {
		result := this.opencv_core("cvSetData", "ptr", cvarr, "ptr", data, "int", step, "Cdecl")
		return this.__wrapAround(result)
	}
	
	
	;------------------------------------------------
	;/*
	;CVAPI(void)  cvMinMaxLoc( const CvArr* arr, double* min_val, double* max_val, CvPoint* min_loc CV_DEFAULT(NULL), CvPoint* max_loc CV_DEFAULT(NULL), const CvArr* mask CV_DEFAULT(NULL) );
	;
	;
	MinMaxLoc(cvarr, cvmin_val, cvmax_val, cvmin_loc, cvmax_loc, cvmask) {
		result := this.opencv_core("cvMinMaxLoc", "ptr", cvarr, "ptr", cvmin_val, "ptr", cvmax_val, "ptr", cvmin_loc, "ptr", cvmax_loc, "ptr", cvmask, "Cdecl")
		return this.__wrapAround(result)
	}
	
	CloneImage(pimage) {
		result := this.opencv_core("cvCloneImage", "ptr", pimage, "Cdecl ptr")
		return this.__wrapAround(result)
	}
	
	ReleaseImageHeader(pimage) {
		result := this.opencv_core("cvReleaseImageHeader", "ptr*", pimage, "Cdecl")
		return this.__wrapAround(result)
	}
	
	ReleaseMat(cvmat) {
		result := this.opencv_core("cvReleaseMat", "ptr*", cvmat, "Cdecl")
		return this.__wrapAround(result)
	}
	
	;------------------------------------------------
	;/*
	;CVAPI(void) cvSmooth( const CvArr* src, CvArr* dst, int smoothtype CV_DEFAULT(CV_GAUSSIAN), int size1 CV_DEFAULT(3), int size2 CV_DEFAULT(0), double sigma1 CV_DEFAULT(0), double sigma2 CV_DEFAULT(0));
	;
	;
	Smooth( cvsrc , cvdst , cvsmoothtype = 2 , cvsize1 = 3 , cvsize2 = 0  , cvsigma1 = 0 , cvsigma2 = 0)
	{
		result := this.opencv_imgproc("cvSmooth", "ptr", cvsrc, "ptr", cvdst, "int", cvsmoothtype, "int", cvsize1, "int", cvsize2, "ptr", cvsigma1, "ptr", cvsigma2, "Cdecl")
		return this.__wrapAround(result)
	}
	
	;------------------------------------------------
	;/*
	;CVAPI(void)  cvErode( const CvArr* src, CvArr* dst, IplConvKernel* element CV_DEFAULT(NULL), int iterations CV_DEFAULT(1) );
	;
	;
	Erode( cvsrc , cvdst , cvelement = 0 , cviterations = 1 )
	{
		result := this.opencv_imgproc("cvErode", "ptr", cvsrc, "ptr", cvdst, "ptr", cvelement, "int", cviterations, "Cdecl")
		return this.__wrapAround(result)
	}

	;------------------------------------------------
	;/*
	;CVAPI(void)  cvDilate( const CvArr* src, CvArr* dst, IplConvKernel* element CV_DEFAULT(NULL), int iterations CV_DEFAULT(1) );
	;
	;
	
	cvDilate(cvsrc, cvdst, cvelement = 0, cviterations = 1 )
	{
		result := this.opencv_imgproc("cvDilate", "ptr", cvsrc, "ptr", cvdst, "ptr", cvelement, "int", cviterations, "Cdecl")
		return this.__wrapAround(result)
	}

	;------------------------------------------------
	;/*
	;CVAPI(CvSeq*)  cvCreateSeq( int seq_flags, size_t header_size, size_t elem_size, CvMemStorage* storage );
	;
	;
	
	CreateSeq( cvseq_flags , cvheader_size , cvelem_size , cvstorage )
	{
		result := this.opencv_core("cvCreateSeq" , "int" , cvseq_flags , "ptr" , cvheader_size , "ptr" , cvelem_size , "ptr" , cvstorage, "Cdecl ptr")
		return this.__wrapAround(result)
	}
	
	;------------------------------------------------
	;/*
	;CVAPI(int)  cvFindContours( CvArr* image, CvMemStorage* storage, CvSeq** first_contour, int header_size CV_DEFAULT(sizeof(CvContour)), int mode CV_DEFAULT(CV_RETR_LIST), int method CV_DEFAULT(CV_CHAIN_APPROX_SIMPLE), CvPoint offset CV_DEFAULT(cvPoint(0_0)));
	;
	;
	FindContours( cvimage, cvstorage, ByRef cvfirst_contour, cvheader_size, cvmode, cvmethod, cvoffset)
	{
		result := this.opencv_core("cvFindContours" , "ptr" , cvimage , "ptr" , cvstorage , "Ptr*" , cvfirst_contour , "int" , cvheader_size , "int" , cvmode , "int" , cvmethod , "struct" , cvoffset, "Cdecl")
		return this.__wrapAround(result)
	}
	
	;------------------------------------------------
	;/* wait for key event infinitely (delay<=0) or for "delay" milliseconds */
	;CVAPI(int) cvWaitKey(int delay CV_DEFAULT(0));

	WaitKey(delay = 0 )
	{
		result := this.opencv_highgui("cvWaitKey" , "int", delay, "int:cdecl")
		return this.__wrapAround(result)
	}
}
that i got from here https://github.com/manciuszz/AHK-OpenCV

from that github you can also get the dll's im using

Until now i have gotten to the part that is trying to create the contours Seq as that seems to return a pointer but the .FindContours call returns blank so seems i'm doing something wrong

hopefully one of you can help point out what is wrong and help me get this working :)
Also check out:
Courses on AutoHotkey

My Autohotkey Blog
:dance:
User avatar
Blackholyman
Posts: 1293
Joined: 29 Sep 2013, 22:57
Location: Denmark
Contact:

Re: OpenCV help - find the contour of many shapes

08 Jun 2020, 07:53

Here is a script that create's the image used in the example and in my script above

Code: Select all

#singleinstance force
#noenv
WriteFile("shapes.jpg", shapes_jpg())
;BinWrite("shapes.jpg", shapes_jpg())
gui, add, pic, x100, shapes.jpg
gui, add, text, xm, The Image above was created by the script.
gui, show,, by Veovis
return

WriteFile(file,data) 
{ 
   H:=DllCall("CreateFile",Str,file, Uint,0x40000000, Uint,0, UInt,0, UInt,4, Uint,0, UInt,0) 
   Loop Parse, data 
      If (A_Index & 1) 
         hex = 0x%A_LoopField% 
      Else { 
         hex = %hex%%A_LoopField% 
         DllCall("WriteFile",UInt,H, UCharP,Hex, UInt,1, UIntP,U, UInt,0) 
      } 
   DllCall("CloseHandle",Uint,H) 
}

shapes_jpg()
{
   FileBin := "FFD8FFE000104A46494600010101007800780000FFE1006845786966000049492A000800000004001A010500010000003E0000001B010500010000004600000028010300010000000200000031010200120000004E00000000000000780000000100000078000000010000005061696E742E4E45542076332E352E313000FFDB00430001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101FFDB00430101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101"
   FileBin .= "010101010101010101FFC00011080251023E03012200021101031101FFC4001F0000010501010101010100000000000000000102030405060708090A0BFFC400B5100002010303020403050504040000017D01020300041105122131410613516107227114328191A1082342B1C11552D1F02433627282090A161718191A25262728292A3435363738393A434445464748494A535455565758595A636465666768696A737475767778797A838485868788898A92939495969798999AA2A3A4A5A6A7A8A9AAB2B3B4B5B6B7B8B9BAC2C3C4C5C6C7C8C9CAD2D3D4D5D6D7D8D9DAE1E2E3E4E5E6E7E8E9EAF1F2F3F4F5F6F7F8F9FAFFC4001F0100030101010101"
   FileBin .= "010101010000000000000102030405060708090A0BFFC400B51100020102040403040705040400010277000102031104052131061241510761711322328108144291A1B1C109233352F0156272D10A162434E125F11718191A262728292A35363738393A434445464748494A535455565758595A636465666768696A737475767778797A82838485868788898A92939495969798999AA2A3A4A5A6A7A8A9AAB2B3B4B5B6B7B8B9BAC2C3C4C5C6C7C8C9CAD2D3D4D5D6D7D8D9DAE2E3E4E5E6E7E8E9EAF2F3F4F5F6F7F8F9FAFFDA000C03010002110311003F00FEFE28A28A8E45DDFE1FE401451451C8BBBFC3FC8028A28A391777F87F900514514722EEFF00"
   FileBin .= "0FF200A28A28E45DDFE1FE401451451C8BBBFC3FC8028A28A141269EBA7A7F9005145156014514500145145001451450014514500145145001451450014514500145145001451450014514500145145001451450014514500145145001451450014514500145145001451450014514500145145001451450014514500145145001451450014514500145145001451450014514500145145001451450014515C0FC41F8ABF0C3E1368CDE23F8A7F113C0FF000DFC3E8CE8DADF8EFC55A1F84F4A0F1C4F70E9F6FD76FAC6D4BA4314B314F37788E377C6D0C4454A94E8C2552AD4852A704E53A95271842115BB94E4D4629756DA474E0F058CCC715430597E1313"
   FileBin .= "8EC6E26A46961B0983A157138AC45593B469D0C3D084EAD5A927A4614E12937B2677D457E5D78DFF00E0B3FF00F04D3F015D4B63A9FED3DE1DD6AEE2965876F827C29F107C796923C5F78C5AB7843C27ACE8CF11E04538D43C89BFE594AE0311E6F6BFF05E9FF8265DC4EF0CDF1AFC4D651A3ED5BABAF83FF15DE0954330F3635B2F085DDC84C286C4B6F1498603CB0C1957E6AB71B706E1EA3A55B8AF8769D44ED284B39CBD4A2FB497D63DD7DD4AC7EDB80FA2F7D24F34C2431F97F803E32E3307520A74B1347C35E309D1AD07B4E84FFB212AF17D1D2E74F5B6CEDFB1B457C11F0C3FE0A89FF04FDF8C1716F67E0AFDAAFE148BEBB481AD34EF17EB171F0D"
   FileBin .= "F52BB6B85778E0B5D3FE2259F85AF6E2EC2A379B650C0F77091B668632715F76D9DF59EA36D05EE9F776D7D6773124F6D77693C5736F710C8A1A39619A1678E58A452192446656520A920E6BDAC0E6796E674FDB65B9860B30A4AD7A982C550C55357DAF3A152A455FA6BA9F98F1470471A70462D6038D384389F8471D27251C1713E419AE438A9383B4F970F9AE1309565CAF495A0F95E8ECCB545145771F2E14514500145145001451450014514500145145001451450014515E53E12F8DDF0BFC73E3FF001DFC2FF0B78B6CB56F1C7C356B25F18E870C5768FA6B5F2FCBE4DD4F6F1D9EA42D6602D3523A65C5D0D2EF992CB51FB35D4891371E2B31CBF055"
   FileBin .= "B0386C66370985C466788960F2EA188C452A3571F8B861EB62A786C1D3A938CF135E385C3D7C44A951539AA346AD571E4A7292EDC2E5B98E3A863F1382C06331786CAB0D0C6E6788C361AB57A39760EA626860E18AC755A509430B879E2F1386C2C6B579429CB115E8D152752A422FD5A8A28AEC38828A28A0028A28A0028A28A0028A28A0028A28A0028AF16F8D5F1F3E1DFC03D2746D67E20DDEA76F6DAFEA52E99A6C7A569971A95C4B3DBDB35D4F23AC6638A1861408AC64995DDE68FCA8E4513345F3A7FC3C7BF66AFF009FFF00197FE1293FFF002557E63C4DE34784DC199BD6C838AFC43E13E1FCEB0D4E856C46579A67384C26368D2C4D38D6C3CEAE"
   FileBin .= "1EA5455211AD4A51A94F992E684A325A4937D14F0989AB153A746A4E0EE94A316D3B6F67D4FBD28AF82FFE1E3DFB357FCFFF008CBFF0949FFF0092A8FF00878F7ECD5FF3FF00E32FFC2527FF00E4AAF03FE2647C04FF00A3BBC05FF890E07FF96F9AFBCBFA8633FE81AAFF00E027DE9457C17FF0F1EFD9ABFE7FFC65FF0084A4FF00FC9547FC3C7BF66AFF009FFF00197FE1293FFF002551FF001323E027FD1DDE02FF00C48703FF00CB7CD7DE1F50C67FD0355FFC04FBD28AF82FFE1E3DFB357FCFFF008CBFF0949FFF0092A8FF00878F7ECD5FF3FF00E32FFC2527FF00E4AA3FE2647C04FF00A3BBC05FF890E07FF96F9AFBC3EA18CFFA06ABFF00809F7A51"
   FileBin .= "5F05FF00C3C7BF66AFF9FF00F197FE1293FF00F2551FF0F1EFD9ABFE7FFC65FF0084A4FF00FC9547FC4C8F809FF477780BFF00121C0FFF002DF35F787D4319FF0040D57FF013EF4A2BE0BFF878F7ECD5FF003FFE32FF00C2527FFE4AA3FE1E3DFB357FCFFF008CBFF0949FFF0092A8FF008991F013FE8EEF017FE24381FF00E5BE6BEF0FA8633FE81AAFFE027DE9457CBBF087F6C0F831F1B7C5A7C13E09D435D3AF7F65DE6AD143AC689369B05C5BD8496C9711413B4B2ABDD2A5C89C4242EE820B870D98F07EA2AFD278578C78578E32BFEDBE0FE20CAB89328FACD6C1BCC727C651C761162B0EA0EB61DD6A3294555A4AA5373836A51538B6AD246152954A"
   FileBin .= "32E4AB0942564F964ACECF67E9A3FB828A28AFA4330A28A2800A28A2800A28A2800A28A2800AF0BD0FE3F782F5EFDA1FC7DFB37D9CD9F1AF803E1AF81BE24EA2448AD1CF63E30D67C4DA54FA7AC4A37C577A1C1A4F87751BC690ED9ADBC61A5F92098A7DBEE4CCA8ACEC405452CC4F002A824927B000126BF915FD9B7F6A4D5AFF00FE0ACC3F69ABBD498FC37FDA37E3278F3F679B19CB8027F08BD9E87E19F84CCF2093ECC22BCD5744F04B32A9744934AD4595DD9E395BE7B3CCEE39457C9A93B3FED0CC6187AB7B5A9E15C7D9D4ACEFB2A75AB61AEF4F75BF47F947897E24D1E01CC7C3FC14E309AE2BE2DC36538E73B7FB2E4D3A6F0B8BCC1BBFB90C2E65"
   FileBin .= "8FC9D549ECA9D59DDDAE9FF5D9451457D09FAB851451400514514005145140051451400578DFC76FDA07E0EFECCFF0F355F8A7F1C3C79A27C3FF000569188E4D4F5799CDC6A17D2472CB6FA4685A5DB24FAA6BFADDE24329B3D1F47B3BDD46E56295E2B6648A564F3CFDB13F6BAF855FB157C12F107C68F8AB7CED6D64574BF0A7856C2488F88BC7BE30BC8666D1FC27E1DB693FD6DEDF3C324D7774C86D748D2EDEFB57BE296765311FC847C40F15FC65FDB5BE25A7ED07FB5A5DB5C3C324EFF0A3E064124C3C09F0A7C3B70EB25BC2FA44C766A1E21BB8D209755BED4E39350BC9E2864D5581B6D3748D03F3BE37E3DA1C30A397602953C7E7F88A5ED69616"
   FileBin .= "7292C2E06849B8C719994E0D4E34E5252587C3536ABE2E50928CA9528CEBC3FB23E8BDF44CCD7C72957E32E2CCC319C23E1264D8F780C6E7986A14EA679C579B51853AD5B86B8330F894F0D571B4A8D4A53CDB3BC5C6A655C3F46BD19D7A78EC756C26578AFB97E3DFFC15FBF6B0FDA727D43C3FFB21786E3FD9AFE0DCF24B6B0FC68F1EE9B67AD7C57F14D816789AFBC2DE1A98DD687E19B6B981F746EE9AADEE163BAB0F14E977A92DA43F9CF73F00740F16F8826F1B7C67F1578EFE3C78FAF4A497FE2CF8A9E2BD67C4777348A72638EDEE6F193EC2BC241637B25FC56F12AC31158D428F78555550AAA155400AAA0055038000180001C003814B5FCF59A6"
   FileBin .= "3731CFAB7D633EC7D7CD6A7339428D77CB80C3BBDD2C2E5B06B09414744A7ECE788924BDAD7A925CC7FB09C0BC35C1BE13E5AB26F09B84F2AE01C17B254311986570F6FC5D9BC395467533FE33C4C67C4199CEB34E757091C5E1727A539CE381CAB0745AA2B98D1FC13E0DF0F22C7A0F84FC37A322A8551A5E89A6D8E141C819B6B68CE377CDC9E5BE63CF35D0496B6D2A7972DBC12478DBE5C9146E9B4F51B594AE381C631C54F4573461082E5842318AD14631514976B249745F71EDD5C562ABD475ABE26BD6AB26E4EAD5AD52A54727BC9CE72949B7D5B773CD7C45F073E1678AE3923D7BC01E16BD797716BA4D22D2CF5005D83B98F52B18EDAFE22ECA0B"
   FileBin .= "98EE54BF46C824537E1AD9FED01FB30DFAEB7FB217ED0DE3DF854219DAEE4F871AF6A92F8C7E13EB0C64DF25BDF78575E8F53B081AE119E197557B0D4755823666B2B8B5B83F695F4CA2B3851852AD1C5619D4C1E2E0EF4F1982A953078BA6F469C31386952AC95D26E2E6E32B5A516B43AF119AE2B1F9656C8B398E1788F87B131E4C5F0E713E0B09C47C3D8B859AE5C464B9D51C6E5F37CAE4A35561E35A9733951AB4E7692FD5DFD91FFE0B6FA0EB9E21D0FE0E7EDD3E0FD3BF67DF895A9BC761A1FC54D2E69E5F815E36BB2C234326AB7B73773F80AEE72D1E5357D4753D1213BA5D4B5BD1249ED74F7FDF5B7B882EE086E6D668AE6DAE2249A0B882449A"
   FileBin .= "19E19543C72C52A164923910AB23A332BA904120827F88BF15784BC39E37D16EFC3DE2AD22CF5AD22F536CD69791EE0AE0109716F2A959AD2EE1277DBDDDB4915C40E03C52230CD7D17FB07FFC1403C79FB0078B7C39F03BE3EF88B56F1CFEC6BE28D4E1D17C11E3FD5A49B50F10FECFBA95ECC12CF4ED62EB6B4B77F0EDA47DB35AE08D1600DA8E8896F15ADDE897DFACF09789B8CC1D6A396F16578E2B055671A387CFDC214AB616726A34E9E710A718D19D0937CAB31A50A7ECA5CAF174DC653C4C7FCFBFA427D07387389B2DCCF8DBE8FD95D5C8F89F0346BE639C78474F1188C765B9EE168C255B178AF0E7138CAB5F30C3E6942119D79F0663F138DFAF"
   FileBin .= "5355170EE3635E187C8EB7F5DF4553D3EFEC756B0B2D534CBCB5D474DD4AD2DEFAC2FECA78AEACEFACAEE249ED6EED2E607786E2DAE20912586689DE3963757462A41372BF7C4D349A69A6934D3BA69EA9A6B469AD99FE49CA3284A509C6509C24E3384938CA328B6A51945A4E328B4D34D269A69AB8514514C90A28A2800A28A2800A28A2800A28A2803C13F69AF8D9A67ECF5F04FC73F142FBC89AF346D2DAD7C37A74CDC6ADE2BD51858787B4EF2D59259207D4668A7BF301325BE976F7D7614A5BB63F9DFF00833E2EF137ECD3F137E1B7ED19AD5FEA7A85C6B7AEDF41F1D3CC7966BAD4B41F8817EB73AA5D5CC2399AEF4CB9962D51A22D8BAF10D9581D"
   FileBin .= "EA8CD8FB17F6FEF89FFF000B9BF683F0CFC0ED22E8DD7817E092C5E2BF1DAC4FBECB51F1FEA56F9D2B4B9CAB3C333689A64A8814ED2B26A5E22B29D7CDB650BE0DAFE8B65E23D1753D0B508FCCB3D52CE6B398000B209508496227859A07D9340FD63963471CA8AFF387C76E39C771678952C470F633D950F0BB171C270BE263272A13E30C162686373ACC64A0D7B5A14B1386C2F0ED483BDE961736A69FB3C5CD4BFD3DFA3DF00E5DC1FE16C68712607DBD7F16B072C6716616504B114F8231D84C460722CB20E7193A588AF83C5E3389E94E2AEAAE3724ACD2AD81838FF489617D67A9D959EA5A75D417B61A85ADBDED95E5B4A935BDD5A5D44B3DB5CC1346"
   FileBin .= "5A39619E174922911991D18329208356EBF347FE099DF1AAFBC61F0AB57F82BE2FBDF37C79F01EFE2F0D0F3A46371A9F816E3CD3E13D4A31236E960B28A19F444112B2C16165A44D3B7997C85BF4BABFBBF80B8BF03C79C2190F1665EBD9D1CDF030AD5F0D292954C063E94A587CCB2EACD69EDF2FC7D2C460EAF473A2DABC5A6FFCF5F10B82F30F0F38D388783B3297B5AF9263E7428E2E3171A598E5F5A30C4E579A504F5FABE679757C2E3A87554EBC54AD24D228A28AFAF3E3028A28A0028A28A0028A28A0028A28A00FCD1FF828DFFC7BFECF9FF65497FF0040D3EBE5DAFA8BFE0A37FF001EFF00B3E7FD9525FF00D034FAF976BFC9CF1F23197D203C4D"
   FileBin .= "BC53B51E09B5D276FF008C5705DCFA2C27FB9E1FFEE27FE961451457E5FECE1FC90FFC057F9792FB8DEEFBBFEBFE197DC1451451ECE1FC90FF00C057F9792FB82EFBBFEBFE197DC1451451ECE1FC90FF00C057F9792FB82EFBBFEBFE197DC1451451ECE1FC90FF00C057F9792FB82EFBBFEBFE197DC1451451ECE1FC90FF00C057F9792FB82EFBBFEBFE197DC6DFECAFFF0027ABA77FD881AD7FE9B56BF6D6BF12BF657FF93D5D3BFEC40D6BFF004DAB5FB6B5FDD5F421D3C31E30B7FD1D7E30FF00D47C98F2734FE352FF00AF10FCE41451457F649E6051451400514514005145140051451401F13FFC1457E35FFC281FD8C3E3D7C40B6BB167AECBE0BBBF07"
   FileBin .= "784E58E40974BE2AF1EC91783F45BBB25FBD35C6933EB1FDB8D1A86C5B697712BE2289D87F273E26F00EA5E13FD9C3C3D068AD269FE2CF8676DA17C44D3AEE05513E9FE26D16E8EBFABDDC65949325AFDAF57684919DD1C4194A8295FB47FF0005AEF881FF000937897F658FD97EC67F321F10F8C352F8D3E3BB3462857C3DE07B49F4CF0EC17657EFD96B5737DE2B8D637FDDFDBB49B4931E6A42C9F015DDADBDF5ADCD95D44B35ADE5BCD6B730B8CA4B6F711B45344C3BAC91BB230F426BF20E30ACF30CE7154149FB3C0612183834FE1C45751C5569C5F49454B0B1EEA54F7BE8BF803E90199BE28F10F37CAE9D56B0DC2F9161B87F0F38C9DA8E6D99D386"
   FileBin .= "75996229C93D2A53856C969371B4A1570728B7CD1B47FA9BF805F1534DF8E1F04BE14FC5ED28C4B69F117C03E18F1635BC2C1D6C2F758D26D6EB52D2DC867DB3E93A8BDDE9B7285D8C7716B2C6CCCCA4D7AED7E2FF00FC111BE254FAA7ECE3E3DF807AC5EB4FAF7ECE1F15BC49E19B686570F37FC213E2EBBBBF137872F8B6164115DEB7278C21B5560CB1DA58C0B13AC5B2083F682BF4CC971DFDA394E5F8D7F1D7C3539554BECD78AF67888FFDB95E1523F23FB2FC3AE25FF5BF81B85F88E4E2F1199E4F85A98E8C6D6A799D087D5734A3A5B5A198D0C5516AC9DE1AA5B228A28AF4CFB40A28A2800A28A2800AA1AAEA9A7687A66A3AD6B17B6BA6693A458D"
   FileBin .= "D6A7A9EA37D3C76D6761A7D8C125CDE5E5E5CCCC90DBDB5ADBC524D3CF2BAC71468EEECAAA4D5FAFC4CFF82E7FED09ACFC38FD97BC3DF003C0DA89B1F889FB5AF8C23F85B6F24324915D58FC39B44B7BDF893AA2142375ACB6777A3785B548DB3BB4AF155EC8837C431E3710E734387F25CCB39C4479E180C34EAC692769622BB6A9E170D07ADA789C4CE950868FDFA88FD27C1FF0DB34F17FC4EE0AF0DB28AB1C362B8B33CC2E5D5F1F383A94B29CAE0A78BCEF3AC4423694B0D92E4D86C7E6B898A6A52A183A8A3EF347E23FED01FB416B5FF050BFDA7B5AF8FBAC9BE4F803F0A753D4FC1DFB33F83EF838B2BBB5B1BC116AFF0013AFAC25DB1FF6C788EFAD"
   FileBin .= "22BD47780CD671C3A5E8EF2BCBE178EE6E74EB07C2DE1CD33C21E1CD17C31A34220D3342D3AD74DB38F03718ADA25432CACA143CF3B869EE252374B349248F96724EF57F244EAE2B155F138FC7D5FAC6618FAF2C563ABEB69D7A96F729A7AC70F420A3430D4F6A5429D382DB5FFA17A180C8B21CAF25E14E12C02CA783B84B2CA19070B654ADCD85CAB08E4D6231528A8AAF9B66B889D7CDB3BC6C97B4C766D8DC5E266FDF4A2514514005145140051451400562788FC3BA378B743D4FC39E20B18751D1F57B492CEFAD261959229070E8C30D14F0B849ADAE232B35BDC471CF0BA491AB0DBA294A319C65092528C938CA3249C65192B34D3D1A69B4D3D1AD0D"
   FileBin .= "28D6AB87AD4B1142AD4A35E854856A35A94E54EAD2AB4E4A74EA539C5A942709A5284A2D4A3249A69A3F473FE08A9FB5BF883C29E21D73FE09E3F1935D9F53BFF0769175E2CFD997C51AA4A0CFE22F8676ECD26A7F0FDA79363DC6A1E0E4325FE8B6ABE73C7A241AEE9F6FF67D1FC33A6249FD1E57F07BF16F59F14FC2ED47E1E7ED29F0E1DADFE23FECEFE32D27C7DA2CB1B3C6351D12DEF208FC4FA05FB46ACCFA3EA9A66F8F578C865934A1A85BE365D4A1BFB80F84DF127C3BF18FE177C3CF8B3E1199AE3C31F127C17E1AF1C68323ED131D2FC4FA45A6B1671DC2A332C77314376915CC3BB30CE9244D86422BF75F09F882AE372FC570EE32ACAA627235"
   FileBin .= "46581A9524E552B64D88E68E1A3293D673C0D6A75707296AFD8470929B73A8DBFF002A7F681784381E1CE2FC83C64E1BC0D1C164BE2ACF33A3C5182C2528D2C265BE24E4AB0B5B3CC452A34E31A786C3F1665F8FC0711D2A515184B36A9C454F0F0861F0D0A70F42A28A2BF5C3FCF10A28A2800A28A2800A28A2800AF15FDA23E31E91F00FE0DF8EBE29EAC6091BC37A34CDA3584CFB06AFE23BD2B63E1ED246D65936DF6AD71690DC3C5B9EDED0DC5D15D90391ED55F871FF00050EF8A1FF000B6FE38F83FF00679D1EE0CFE10F851F67F1E7C4911B96B6BEF15DF5B2B787F42B850C6397FB374ABB59A44C9DCBAF5EC4CAB3E9FC7E57E3371E3F0F780B35CD"
   FileBin .= "F09387F6EE3DD3C8F8668CECFDAE7D9A29D2C255707F1D1CBA947119B62E3A5F0980AE935271BFEBBE07F8791F127C44CA325C642A7FABF97AA99FF15D785D7B1E1DCA654EB636929A69C2BE6756586C9B072576B1B98E1DD9A4CF917E19E95ABC5A4EA1E2AF154F35F78D3E20EAD7DE33F166A1743FD2AE753D6EE25BE2B3E79564170D24B1602C7753DC85014803D268030303A0E0515FE6D60F0D1C1E1A961E339D574E3FBCAD564E75ABD69B73AD88AD395E552B622ACA75AB5493729D49CA526DB67FA8B8DC54B1B8AAD89953A745559FEEE8518A850C3518254E8616841251A787C3508D3C3D0A714A34E8D38422928A461F83BE23CDFB38FED03F0F7E"
   FileBin .= "3A44F2C7E15D4274F007C55821DFB25F0A6B72C71C7AACD1C78699B46B98ADB5250DCCB3693A75A2E04CD5FD275BDC41776F0DD5B4B1DC5B5CC51CF04F0BAC914D0CA8248A58E442C92472232B2BAB1565208241AFE6C7C4BA0D978A341D5740D41775AEA9672DB3B601689D8660B88C12079B6D3AC73C44F0248D49E057E9D7FC135FE36DEFC41F83575F0AFC5B77E67C42F8137B1782F54499CBDC5F7857128F076ACACCDBA6812CADAE34359797917468AEA539BC8DA4FE93FA32719AC9789B36F0FF001B55432FE2755F88787799A50A59EE0E8C239F65D06FAE6180A74336C3D28D97B5C166D55A73AADBFE5CFA55F037F6EF0A64FE23E028F3663C26F0"
   FileBin .= "FC33C4FC91F7EBF0FE36BCE5C399A55B5AEB2CCC6AE2325C4559734BD8E6192D14D428E9FA35451457F731FC00145145001451450014514500145145007E68FF00C146FF00E3DFF67CFF00B2A4BFFA069F5F2ED7D45FF051BFF8F7FD9F3FECA92FFE81A7D7CBB5FE4EF8F7FF002901E26FFD79E09FFD657047D1617FDCF0FF00F713FF004B0A28A2BF31360A28A2800A28A2800A28A2800A28A28036FF00657FF93D5D3BFEC40D6BFF004DAB5FB6B5F895FB2BFF00C9EAE9DFF6206B5FFA6D5AFDB5AFEE7FA117FC9B1E30FF00B3AFC61FFA8F931E5669FC6A5FF5E21F9C828A28AFEC93CC0A28A2800A2A96A376F61A7DF5F476379A949676973751E9BA78B6"
   FileBin .= "6BFBF7B785E55B3B25BBB9B4B46BBB96410DB2DCDDDB40667412CF121675FC9CF117FC16A7F635F08788F57F07F8AAD7E367877C57A05FDCE97AE787359F851AB69DADE93A8D9B14B9B2D434DBABB8EEED6E21653BE296256030D8DA41AE2C666580CB941E3B1987C1C6A36A9CB115614A336AD75194DA4DABA6D2774B5B58F9AE23E32E15E11861AA71467F95E434B1B39D3C255CD7174F074F11520939D3A352B38C27522A49BA71939D9DED6D4FD70A2BF1EFFE1F8BFB0EFF00CFCFC5EFFC363A97FF0026D1FF000FC5FD877FE7E7E2F7FE1B1D4BFF00936B83FD65E1EFFA1D659FF85943FF0093F3FCFB33E5FF00E234784DFF00470F84BFF0F383FF00E5"
   FileBin .= "87EC2515F8F7FF000FC5FD877FE7E7E2F7FE1B1D4BFF00936B9EF16FFC172BF63EB7F0AF89A7F0947F14F51F15C3A06B12F8674FD43E1CEA169617DAFC7A7DCBE8D677B74D7A16DAD2E7515B682E2E1B02186479091B490A5C4FC3D18CA4F39CB9A8C5C9A8E2E8CA4D257B28A9DDB7D12D5BD0CEAF8D7E1352A552ABF1078566A9C27370A79BE16A549F245CB969C2351CA7395AD0845372935149B763F31FF68EF881FF000BD7F6FF00FDA57E22C731BAF0F7C2C934BFD9F7C192316963893C1CCE3C622DA424C457FE1318B5BBC85E1014DAEB58058C924B3E6578BFC01D1750D2FE19E91A96B52CD73E22F195D6A3E38F10DE5C8C5D5EEA7E27BA6BF5BABA"
   FileBin .= "C807ED32D81B1F3CB004CC1FE55FBABED15F9146B4F132AB8BA8AD531B5EB63269EF1789A92AB187FDC384A34D2E8A09743F80E18FC46715B1F9EE322E38CE21CCB30CFB13197C54E79B62AA6329D077D9616854A38484536A30A118A7648F68FF0082737C403F07FF00E0A20DE14B99FECDE19FDA8FE16DFE902367686DA4F887F0EA27D734A9989FDC34A9E1CD3F57B2855F0F35E788152361348B1DD7F5115FC587C53D7B57F86FAA7C29F8EDE1CB79EE35FF00817F153C1DE3D861B60CD35EE956BACD926AFA56C5652F6FA9EDB3B7BD52C11AC85C2CACB133B2FEE52FFC1717F61D2066E7E2F06C0C8FF8563A89C12391C5E9E87FFAD9AFB2E12CF30197"
   FileBin .= "E1B1B80CC31B87C1FB2C5BC4617EB3561454E8E2E2A738D3E7694B93130AF29DBE1552374AEAFF00D13E03F89BC2DC299371070BF1671165790AC1E772CDB2579AE329612388CBF3DA4B118AA58675A51551E1F38A198D5ACA0DF22C6527249CAF2FD85A2BF1EFFE1F8BFB0EFF00CFCFC5EFFC363A97FF0026D1FF000FC5FD877FE7E7E2F7FE1B1D4BFF00936BEB3FD65E1EFF00A1D659FF0085943FF93F3FCFB33F77FF0088D1E137FD1C3E12FF00C3CE0FFF00961FB09457E3DFFC3F17F61DFF009F9F8BDFF86C752FFE4DAED3E19FFC1603F652F8C7E39D13E1AFC31D1BE3778CBC71E21BB5B4D33C3DA37C2FBD9AF1DB23CFB9BB793528ADB4DD36CA326E"
   FileBin .= "352D57529ED34DD36D524BBBFBBB7B68E4956A1C4790D49C29D3CDF2FA952A49429D3862A94A739C9A518C2319394A526D24926DB764AE6D86F183C2EC66270F83C271EF0BE27178BAD4F0F85C350CDB0B56BE22BD5928D3A34294272A956AD493518421194A526924D9FAA1452039009054900E0E32323A1C12323A1C1233D0914B5ED1FA3857F257FF000556F1ACDF13BFE0A7DA07835E499B42FD9C3F67ED39ADAD2570F0C5E36F88F7F71AA6A77D6F1F9B2A20BCF0B6A9E1FB791C456F7065D2577B4B08B723FAD4AFE2FBF69ABA6D5BFE0A81FB7FEA53AFEFED75DF829A446CC77B0B7B0F857A4E9A803ED5C2B45A4DB9D98F94054CBECDC7F25F187113"
   FileBin .= "870FE53848DF931FC4383A75927A4A9E13079866504D754B1182A13B778A7D0FF423F6716514313E2E7883C43563175F84BC1DE21C5E5D271529D2C6F11712F08705569C1B69C1BC9F89736A529C6EF96AB85B96723228A28AFC24FF0056028A28A0028A28A0028A28A0028A28A00CFD5F4CB4D6B4AD4F47BF8C4D63AB69F79A6DE4449025B5BEB792DAE23C8C11BE295D723919CD7EE37FC1063E235FF8BFF608D2FC09AC5C1B8D5BE017C56F895F07AEE4937ADC79361AADBF8CF4E8E68D9576259E9FE34B6D36DC234A8B6D63146D2B4B1CA17F126BF4D3FE0805797315BFEDD7E1D4948D26C7F688B0D72D6D78D916A3E22D0EF46A93A9237E6E174AB152"
   FileBin .= "A58A22DBA2C688320FD978735E787E38CB141DA38DCBF36C0D55FCD054A8E3E0DAD9F254C12B377B29CADF13BFF377D3372AC3E71F45AE39A9888A955E16E30F0FB8AB013695E9622A66198708E25424D734557C27144BDAC22D2A8E85194D374616FE8928A28AFE9E3FC300A28A2800A28A2800A28A2803C93E3B7C5AD0FE067C25F1CFC53D7D90DA784F44B8BCB4B46711BEABACCE56CF42D1A16ED3EAFAC5CD969D1BE36C46E7CD90AC71BB2FF3B1F0DAD35CBCB3D6BC7DE309DEF7C71F1375ABDF1A789EFA6044AF71ABDC4D796F6FB493E4C30C770F2C76B80B68F7325B2011C48ABF657FC1477E279F8A3F177C0FFB3468D7064F0D7808DAFC47F8A861"
   FileBin .= "7CC771ABCD6E57C2FE1CB8DBB48F234DBD37D750333C73C7AFD95CA05B8D2C6DF9F80000038000007A01C0AFF3B7C7CE327C65E2355CAF0B5BDA643C011AF9461D4257A58AE28C6469CB3EC669A49E5942387C968C9A6E962239BC232B5568FF004BBE8EBC0DFEA478654B38C651F65C43E23CB0F9CD7E78DAB61384B052A91E1DC1EB770FED6C44B159ED78A6956C2CB249CA37A485A28A2BF213F6A0ACFF00871F1324FD9BBF68FF00017C62F35ADFC13E2E921F871F15D33B6DE3D17579A05D3FC41719DC14E87756D67A94D304F30DAE90D610B2B6A4FBF42B9EF167876D3C59E1DD5FC3D7C0791A9D9C902C85771B7B81FBCB4BA45C8CC96B7290DC2027"
   FileBin .= "05A300E4122A3EB19865F89C067193D45433AC8B30C267393D66DA8C730CBEAAAD4A9546B7C3E2E0AA60B1707A54C2626BD392719B45FD572CCCB0D986499E5275F22E20CBB1791E774524E72CB732A4E8D6AD4AE9A58AC14DD2C7E0A76BD2C6E170F562D4A09AFE95A391258D258D95E39115D1D48657470195958120AB0208209041C8A7D7E7C7FC138FE395D7C51F8203C07E29BA67F88DF042F23F00F89629E5325D5E68D6A92C7E12D6D8905E48EE74CB497497B991E49AF2F743BDBD91B17285BF41EBFD4CE0BE2ACBF8DF85722E2BCADBFA9E7797D1C646949A7570B5DA74F1981AF6F871380C653AF83C4C6DEED7A1523D0FF23F8E784332E02E2EE2"
   FileBin .= "0E0FCDD278EC8732AF81956826A96330E9AA982CC30F7D6585CCB05530F8FC24FEDE1B114A5D428A28AFA73E5028A28A0028A28A0028A28A00FCD1FF00828DFF00C7BFECF9FF0065497FF40D3EBE5DAFA8BFE0A37FF1EFFB3E7FD9525FFD034FAF976BFC9DF1EFFE5203C4DFFAF3C13FFACAE08FA2C2FF00B9E1FF00EE27FE961451457E626C145145001451450014514500145145006DFECAFF00F27ABA77FD881AD7FE9B56BF6D6BF12BF657FF0093D5D3BFEC40D6BFF4DAB5FB6B5FDCFF00422FF9363C61FF00675F8C3FF51F263CACD3F8D4BFEBC43F390514515FD927981451450015F9E3FB6F7FC13B7E167ED7FA743E2AB2B83F0BFE3F786EDC1F057C"
   FileBin .= "62F0EDB08F52125BA1169A2F8CAD6DDEDCF89BC3AC711A24D326A9A4AB39D2AFA1B69F50D3F51FD0EA2B931B81C266386A984C6D08622854569426B66BE19C24AD2A7522F5854838CE0D271699E1F1170DE47C5994E2B23E21CBB0F99E598B8A5570F888DF96717CD4EBD0AB171AB86C5519DA74313879D3AF42A253A55232499FC67F8824F8A7F00BE22B7C0CFDA8FC343C0FF1010B0F0C78BADF73F807E2769B1BAC306B7E17D6FCA82C9DEE8B4624B6DB6CD05DB9D3EF6CF47D5F3A2C5E8393EA7F335FD3BFED11FB35FC1EFDA9BE1DEA3F0CBE33784ED3C49A0DDEF9F4DBE5DB6BE20F0BEADE53476FAF785F5A446BAD1F57B5DC409A12D6D796E65D3F53"
   FileBin .= "B5BFD32E6EECA7FE61FF00687FD9CBE38FFC13FB5D8ECFE223EA7F15FF00668D46FD2C7C1BF1BF4EB1967D5BC1EB712F9763E1DF895A7DBF9F2D95C401A382DB51F9ECB535DADA3DCCD7064F0DE93F94E759062F2372AC9CF19955FDDC535CD88C1A6F48632314B9A9AD1471704A3A5AB460ED297F0B788DE14E79E1AD4A99852789CFF825CFF779CFB3F6B99E43194AD0A1C454E9412AB8385D469E794611A56B4731A5869F2D7AEB93EA7F33464FA9FCCD51D3B52D3F57B1B5D4F4ABDB6D474EBE852E2CEF6CE68EE2D6E6171959219A2664753C8CAB1C1054E18102ED78EB95A4D59A6934D59A69D9A69AD1AB5ACD791F9D45C27152838CA324A51946D28C"
   FileBin .= "A2D5D34D5D34D6A9A766B60A28A299414B93EA7F33494502B27BA4FE42E4FA9FCCD35E411A349248111159DDDD82A22282CCCCCC405550096624000124E0562F88BC47A1F84F48BBD77C45A9DAE93A4D8C65EE2F2EDF6A0383B228900696E2E66236416B024971712111C31BBB053E99FB2EFEC53F197F6FCBAB1F16F8BBFE120F829FB220B8499350F2C597C42F8D56B1C87741E1D86749534BF0C4C10AC9AEDD433E9AFE605B083C4572B31D11D2A55F155E184C150789C5D4D634A164A11BA4EB579BF768D08E9CD5276BBB460A536A26D97E0333CF334C3E43C3D96D5CE33CC5AE6A381A0E30850A1CCA13C76638992F6597E5D45BFDEE2ABB4A4ED4A842"
   FileBin .= "BE2274E8CFC87E17F83FE35FED8FE3BB9F855FB2EE9E89A3697730DB7C48F8F3ABC532F81BC056729FDF45A5DDAA32EB7E229E10FF00D976361E7DDDE3033D9C70E9C973E21D2FFA53FD8F3F61DF831FB1978425D27C056136BFE3CD7E1493C7FF00163C4914373E35F1AEA0CE2E27FB4DEE1DB4BD092ECB4BA7F876CA6FB25BE16E2F65D4F577BDD5AEFE83F84FF08BE1BFC0DF02E87F0D7E14784748F04F82FC3D00874ED1747B7F2E32EC17ED17D7F73234B79AA6AB7D22F9FA8EADA95C5D6A5A85C96B8BCBA9E66673E8F5FA6E43C2F87CA9C7178A70C5E6728BBD7E5B51C2A92B4A960A9CB582B7BB3AF2FDF5557BB841FB35FDA7E17782B957034A9E7B"
   FileBin .= "9D54A39F719D4A4E32CC9D26B019342AC52AB83E1FC3544E5878357A75F31AB7CC31AAFCF3A1424B094CA28A2BEA8FDC02BF8D2FDB074993C27FF0552FDB574A9D0471F8CF4AF82BE39D2B6F49ACE3F86FE1FD37509586D5C38D66EAFA2F9778654DECE198A8FECB6BF96EFF0082D6FC3E9FE1AFEDA7FB30FED1114021F0D7C61F87FAEFC02F14DF228586DFC47E1BD5E5F127853ED8DB39BBD78F88E0B2B53B896B6F0DCC18C6B6D1ACDF95F8BF849D6E19C2636316D6539E6031755A57E5A3898627299C9EEF9612CC6139B5B462E4DA8A91FDF1FB3AB882865DE37F1170BD6A90854F107C2DE2CE1FC0466EDED733C8F1792788386A34DB693AF88A3C198A"
   FileBin .= "C361E1ABAB56BC68D38CAAD4A68F8E28A28AFC0CFF005A028A28A0028A28A0028A28A0028A28A002BF52BFE0DFAD0A5BAF875FB637C4D0CE6CBC65FB51EB5E1CD31823082E6CBC17E1CD2AE62BEB6948093C730F15885A48B747E75ACA9BCB232AFE40FC46F16DBF817C09E2BF175CB22AE83A1DFDF40AFF00767BE585934FB51CA82D777EF6F6C80B28DF2AE594648FE94FFE08F3F042F7E057FC13EBE03E8FADDABDB78ABC7DA46A1F17FC52660E9732DFFC4CD467F12E922F23930F15ED9784EEBC39A65DC6C1596E2C640EA24DC2BEDFC34C24B17C6B86AA93F6795E5598636ACADA46A625D1C061A0DEEA5523571728EE9AA13BF43F97FE9B7C4187E1FF"
   FileBin .= "00A31E7997D59C638CE3DE3DE0FE1BCBE8B76A95B0990C731E2DCEB1304D6B4B035F01C3F42B34EEAA66986EECFD39A28A2BFA64FF000FC28A28A0028A28A002BCCFE327C51D03E0BFC30F1AFC4FF12C8174AF07E8775A9B402458E5D46F8058349D22D9D95945DEB1AA4F67A65A6E529F68BB8CBE13711E995F8ADFF0529F8A2FF113E23780BF65DD0AE8BE89A19B6F891F16CDBC876B6C565F0BF872ECA6D29BA199B52BAB672EAFFDABA15F2057B3CD7E69E2EF1DAF0F381338CFE8FB3A99BD48D3CAB8770D52CD62B883336F0D96C2517ACE8E1AA4A58FC625AC70384C4CF689FA9F833E1F3F12FC42C93872BBA94F26A73A99BF1362E9DD4B07C3795258"
   FileBin .= "ACD6A466BE0C4626946397605BD2598E37094F79A3E26F874BAFEB83C49F13FC672B5D78DFE2AEBB7BE32D7AE6456568E3D4A796E74FB18958930DA5BC13992DAD46D5B48674B35554B6403D2A9A88B1AAA22844450AAAA005555180A00E00000000E829D5FE68E0F0F2C361E14AA56A988ACDCEAE271559B956C5E2EBD4957C5E2EBC9EB3AD8AC4D4AB88AB27ACAA5493EA7FA9F8CC4C71589A95A9D0A585A16A74B0B84A1150A183C1E1E9C2860F054209250A183C2D2A386A104AD1A54A11E8145145749CA1451450033E107C4E3FB377ED35E09F89B35C7D93E1FF00C49683E1C7C51DCDB2CED12FA489743F12DCE772C6749BA86D6E6E2E42178B4DB1D4"
   FileBin .= "6DE321F517DFFD1D2B0650CA415601948E410464107D08E457F341E33F0C5AF8C3C33ABF87AEF6AAEA16AE904C5771B6BC8C896CEE547526DEE52294A8C6F55284E18D7EB77FC13CBE3A5D7C60F81163E1EF12CEC7E227C1FB94F875E31867937DE5CC7A4C5E4F8775C98B16964FED3D2A05B6B8BA9599AEF57D33569412BB6BFA4FE8C1C65FD959E673E1D636AF2E0B3A588E27E175397BB4B30A6A9C78932AA57D23EDE2F0F9DE1E947E29BCE2AA5EECADFCB7F4B0E07FED7C8323F13701479B1B913C2F097167247DEAB96D57525C2D9BD6B5AFF579AC4E4189AD2BF2D3590D1BABABFDE5451457F6E9FC161451450014514500145145007E68FF00C146FF"
   FileBin .= "00E3DFF67CFF00B2A4BFFA069F5F2ED7D45FF051BFF8F7FD9F3FECA92FFE81A7D7CBB5FE4EF8F7FF002901E26FFD79E09FFD657047D1617FDCF0FF00F713FF004B0A28A2BF31360A28A2800A28A2800A28A2800A28A28036FF00657FF93D5D3BFEC40D6BFF004DAB5FB6B5F895FB2BFF00C9EAE9DFF6206B5FFA6D5AFDB5AFEE7FA117FC9B1E30FF00B3AFC61FFA8F931E5669FC6A5FF5E21F9C828A28AFEC93CC0A28A2800A28A2800AC6F10F87741F16E87AB7863C51A3697E22F0E6BD6175A5EB5A16B7636DA9E93AB69B7B13417763A8585E4735ADDDA5C42EF1CD04F1491C88C55948E2B668A4D29271924E2D34D349A69AB34D3D1A6B469E8D11529C2A"
   FileBin .= "C274EAC21529D48CA1529D48A9C2709271942709271946516D4A324D34DA69A67F333FB637FC137BC77FB25B789FE3AFEC9F0DDF8C7E025AC77FE24F88DF01F51BE9EE75AF0069F6E925E6ABE23F87DA8DDBCD71A9685636C92CF7BA6CED3EB3A75B43E64A3C4167FBED0BE51F07F8AB4AF1BF86B48F1568BF69FECCD66D8DCDAADE5BB5ADD47B2696DE68A7858901E29E19622F1BCB04C104D6D34D6F2452BFEE7FFC160FE2F5CFC2EFD88FC79A068F33278AFE37EAFA0FC12F0E431BFEF2E7FE1329E59BC4D6E63044924575E0BD2BC47604A82AB35EDB89032BF96FF86DE16D06DBC2DE1BD07C3769836DA1691A7E9513018F3058DAC56E666CF25E668DA5"
   FileBin .= "918E599DD9989249AFC778830383CBB3AA986CBD3A542584A789AF864D3A343115EACD423875BD284A9D29549D1BBA717383A6A117CA7F9EFE2CF0D70F708F88989C9B8569CF079755C970B9C66795464A797E5999E638CC546851CAA0D73E0A857C3616AE2ABE014E786A2EB61E584A787A75254CDEA28A2BCA3E082B83F88FF1034AF869E17B9F136AB6D7B7C893C16163A7E9F0B4B737FA9DE6F16768AF831DBA4AD1B6FB89BE48D548449A7786DE6EF2BCCFE327853FE135F865E31F0FA45E6DD4FA3CF79A72004BB6A9A515D534E4420165335DDA4503150498E575C10C41CABBA8A8D5749DAA2A7370D2FEF28B6B47A36DAD2E9ABEE9EC716633C4C301"
   FileBin .= "8D9E0ADF5B8616BCF0EA51E64EAC29CA505CADA4DB92495EEB99ABA92BA7FA5FFB1AFF00C12BFC47F10B57D07E3EFEDD36104E6D648B57F87DFB34249E7786FC391B059AC752F89A11DA2D6358705279BC2C5A5B500476FE259AE227B9F0AE9FFD035B5B5BD9DBC169676F0DADADAC31DBDB5B5BC4905BDBC10A08E1821862558E28638D55238E340888A155400057C8BFB01FC6BFF8682FD8F7E02FC4EB8BBFB6EB5A878134FD07C573B3979A4F17F831E6F0878A2E26572D244D7DACE8979A8C492B331B6BC8240F224892BFD835FB0F0FE5F9760B2EC3D4CBE0E51C650A3899E2AAB53C4625D5A719C6A56A96D5A8C928C22A34E9AF76108A3FD0BF0AF853"
   FileBin .= "84787384B2BC5709D073A1C4197E5F9C62738C54A188CDB399633094F11471398631462EA38D3AB6A387A4A9E130916E9616851A778B28A28AF70FD2828A28A002BF3EBFE0A77FB264DFB637EC83F10FE1B681006F897E1BFB27C4BF84176244827B7F88FE0C8EE6EF4AB282E1D923B67F1269B3EAFE127B99888ACE2D7DEF32AF6C8C9FA0B4570E699761737CBB1D95E361ED3098FC2D6C2578AD1FB3AF09425283FB3385F9E9CD6B09C6325AA47D570371967BE1E71970BF1D70CE256133FE11CF72CE20CA6BC939D358DCAF174B17469E229DD2AD85AEE9FB0C5E1E4F931186A9568544E15249FF000A9F06FE201F88DE06D3B57BC824B0F1269D24DA078C"
   FileBin .= "347B985ED6FB47F14E9045AEAD6779652A473594AF328BA4B69A3496186E238A455911D57D4EBEABFF0082AF7EC73AF7ECABF18F59FDB83E0EF87EEF53F815F15751807ED31E0FD16DE49E4F0378CAF2E44707C54D3AC614C2E8FE20BAB867D7DF1B6D3C43737524D2345E26B77D1BE42D1B59D2FC43A5D8EB7A25F5B6A7A56A76D1DDD8DF5A48B2DBDCDBCABB9248DD7F265387470C8EAAEACA3F9171F96E3723CC715926669FD7704D72D6B72C31F83936B0D98D0E8E9E220BF7B18B7EC3131AB8793E6A7AFF00D0F709F1A70C78A7C1B91F89FC0F28BE19E28849D6CB95555B13C25C474614E79DF06E6D6B4A963327C455FF0062A9563059AE4B572ECDB0"
   FileBin .= "EA547176869514515CE7B0145145001451450014515E5BF143E233781EC74BD2B41D22F7C5BF11BC67A8DB786FE1D781747B5B8D435AF14F89B539E1B2D3AD2D74FB3592EE7845E5CDBACA214324CF243676DBAEEE6DE37CEAD5851A72A951B518AE89CA526DA5184229394E73935184229CA736A314E4D23B30181C4E658BA382C2414EBD672B734E14A953A708CAA56AF88AD5251A587C361E94275F1389AD3851C3D0A752B569C29C2525D3780FE0CDFF00EDA5FB567C21FD923485B89FC1D0EA769F14BF684D46D19C45A37C31F0ADCDADE368D757116E16F77E27BB96CF47B1DE8D25AEA9ABF87EF4C6D6DE732FF6F967696D61696B63650436B67676F0"
   FileBin .= "DADADB411A4305BDB5BC6B1410C314615238A28D15238D15551142A800015F97BFF04AEFD83AE3F635F835A8F887E2535B6B5FB4AFC6DB9B4F17FC68F10A9B6B96D22631C9368BF0EB4BBCB769206D27C2115E5C477325948D677FAF5D6A77368EDA4A6930DAFEA557F46F86BC315B20CA2AE3730A5ECB37CEE74B158BA32B39E0B0B4A0E380CBE4D7DBA14E752B62126D2C5E271118B708C19FE317D363C74CB3C5BF1132FE19E0EC7ACC3C39F0BF0B8EC8B87F31A2E4B0DC4B9EE3EBD2ADC5BC6342124A4B0D9BE330B83CB7289492954E1EC8F27AF3852AF5F114D1451457E8E7F1805145140051451401E7FF00153E22E81F08FE1CF8C7E24F89E5F2B44F"
   FileBin .= "06E837DADDDAAB2ACD74F6D11FB269D6BBFE56BDD4AF1ADF4FB18CF125DDCC31E406C8FE6FFC0773AFF8BEFBC5BF183C66DE6F8C7E2D6BF79E2CD449DE56CB4EBB9A47D1F4CB5F3373C7656966EAB65106C45626CED881F66503EE7FF82997C5493C6FE2EF007ECADE1EBC6364D25B7C45F8BAD6B29022D1ECA4CF863C3F74F1B1DAF793ACDAADCDB4A81E199BC317AB98E4CD7CBB1471C31C70C48B1C5122C71C68A15111142A222A80AAAAA00550000000062BFCF7FA42719FFADDE20C787F075954C8FC3F8D4C34F9257A58AE2DCC2841E635747CB3FEC6CBAA51CB69CB574F178CCD6934A54CFF0048FE8D9C0DFEA6F8712E24C6D1F679FF0088F2A78B87"
   FileBin .= "3C6D5B07C1B9662271CAE8D9AE687F6EE694EBE6B563B55C160725AF1BC6A2BBE8A28AFC5CFDD428A28A0028A28A002AD7C07F89DFF0CE1FB51F853C6977726CFE1CFC615B6F875F10F2DB2CAC3569E45FF8467C47759DB0442CEF56DC4F74FCDB69875E94B6EB921AAD721E3BF0A5B78D3C2BABF87A7DAAF796CCD653B0CFD9B5083F7B6571900B0549D504A1706481A58B3873453C766593E372CCFF0025928677C3D98E1B39CA9B93842AE270726E782AD25AAC36658596232DC5A5BE1B17556E1572FCAF3BC066BC399EC5CF21E25CB31591E70A31529D2C26362953C7518B4D3C56558B861B34C1BB698BC1517B5CFE99C104023904641F5068AF887F60"
   FileBin .= "2F8F375F1C3E01E9117892E19FE22FC34B96F87BE3D82E24DD7F36A1A1C491699AD5D2B3195DF5AD285BCD7772CA914BAD41AC430656D4E3EDEAFF0053F84F8972DE31E1AC938A3289B9E5F9E65D86CC30EA5A54A3EDE9A954C3578FFCBBC4E16B7B4C36269BD69D7A5520F58B3FC8BE30E16CD38278A73EE12CE69AA79970FE678ACB712E1774AB3C3D471A58AC3C9FF130B8CA3ECF1784AABDDAB86AD4AAC5B8CD30A28A2BE84F9B0A28A2800A28A2803F347FE0A37FF1EFFB3E7FD9525FFD034FAF976BEA2FF828DFFC7BFECF9FF65497FF0040D3EBE5DAFF00277C7BFF009480F137FEBCF04FFEB2B823E8B0BFEE787FFB89FF00A58514515F989B051451"
   FileBin .= "400514514005145140051451401B7FB2BFFC9EAE9DFF006206B5FF00A6D5AFDB5AFC4AFD95FF00E4F574EFFB1035AFFD36AD7EDAD7F73FD08BFE4D8F187FD9D7E30FFD47C98F2B34FE352FFAF10FCE41451457F649E60514514005145140051452310A0B1380A0924F4000C927E8280DB73F9BDFF82B97C40FF858FF00B5EFECF7F022CA713E8BF063C1BACFC65F17C30B2BC43C49E27BB8F4AF0B5B5E0E5A2BED1E1D16C752B75217365E2667F9FCC061F94AB8BBAF1FB7C7AFDA3FF6A0FDA2DA7379A778EBE285F785BC1174CE2457F00780A28FC3FE1AB8B62AA1121D4347B4D2A49E38F29F6BB494EE91B74D2DEF1778C7C39E05D12E7C41E28D4E0D2F4D"
   FileBin .= "B618DF29DD35CCE559A3B3B2B75CCD777736D6F2EDE0577215E460B14723AFE178DC647198ECCB319CD2A788C5D59539C9A51585A0A386C33BBB251951A31A9EB36F5BDCFF0031B89B8869F11713F17F16D6AD08E1335CF31B57095EA4D469C726CB14328CAA7CD26A30A7570180A38AB5D479F11396AE4E52E82E2E20B4826BABA9E1B6B6B68A49EE2E2E244860821894BCB34D2C8CB1C51468ACF248ECA88A0B3100135E1361FB44F81EF75F8AC5E0D66C3C297FA85CE87A17C46BFD3AE2D7C15AEF88F4E5B69755D16C7579A34804B6305FE9B2BCF2BAC7B6F229275B6B69EC2E2FFED8FD943FE09FDF15FF006DEB9D27E257C79B5F107C1FFD963CE8353F"
   FileBin .= "0EF8055E5D2BE217C66B44613595F6A72A14B8F0DF846EF093A5E301757F6C14F87E074B8B2F17C3FD06F8B7F650FD9E3C6DF0423FD9CF5DF853E136F83B69A747A7693E0FB1D3934DB6D05A05945BEADA05E5898350D23C4304B3DC5D2F886CAEA2D624BCB9BABAB8BC9A5BBBA69BD4CBB86F36CDA84B174E50C050E4E6C27D6E94DD4C6CAE9A72A69C6A61B0D38DF96AB8BAB2BA9C69725B9BEDF847C1CE3AE39CAABE7B85AB86E17CBBD83AD91473CC1579E2788EB692A72AB868CA962328C9AB439952C7D4A7571D5A4E188A381961146589FE6541040208208041072083C8208E082390475A5ADFFDA6BF643F8D3FF04FBBF9B598DB5EF8D3FB244D7491"
   FileBin .= "69DE3886D85DF8E3E114573308ACF4BF1CDA5AA2A5C68B0B3C7696DAF5B45169372DE4C71A6837D3D96837DC5E89AE691E24D2ECF5BD0751B5D574AD422135A5F59C825865424AB0C8C3472C6E1A39A095526826478668E3951D07915615B0D5EA6131746785C552F8E854B5DC5BB46A529AF76B519FD8AB06D3DA4A32BC57E7B8EC266593E678AC8B3ECBEBE4F9E6092789CBB1366E54A4DC618CC16222BD8E6197D669FB1C6619CE9C9DE9D454ABC6A5287E8AFF00C112FE207FC23F75FB50FECBD7D37943C11E3DB0F8AFE07B594E59BC29F106CA3B4D4AD2CB2C7369A2DD693A23DC615545EF88256566779522FDF0AFE4BBF65BF8803E067FC142BF67AF"
   FileBin .= "1B4B3FD8FC39F19EC759F801E2E75648A396EBC44F05CF82D6769088DE4BAF18A786E35C957F234E6542CC1636FEB46BF48E0AC57B6C9DE124EF532DC4D5C259BD7D84AD88C33B748AA35A34A3FF005E9F54CFEC5FA38679FDA1E1FCB23AB3E6C57086718FC9395BBCFF00B3AB3866D93C927AFB2A780CC29E0A9BD9BC14E2B58C9228A28AFAF3F7F0A28A2800A28A2803235FD0343F15E87AC7867C4DA469BE20F0EF8874CBED175DD0B58B2B7D4749D6348D4EDA4B3D474CD4F4FBB8E6B5BDB1BEB49A6B6BBB5B88A482782578A54646607F944FDB3BFE0989F177F625D6BC41F183F649D035CF8BBFB2E6A17575ADF8C7E085AC977ABFC40F84066769AF75"
   FileBin .= "3F04893ED17DE26F085B67CC92206EB5AD36D576EAF0DFDBC375E29B3FEB4A90804104020F04119047A107AD7CAF15708E57C5984852C629E1F1B86E7965F99E194162F0539A5CCA2E69C2B61AAF2C562309554A8D6518B6A35214EA43F7BF013E913C75F47EE20C5661C36F0D9CF0D676B0F438BB81F3A75AA70F7136130F293A13AD1A33857CB739C07B4AB2CA33FCBE74B31CBAA54AB053AF82C4633058AFE1A7E1FF00C4EF057C4DD2FF00B57C21AD5BEA0230A2FB4F90FD9F56D2E660736FA969B291736B22B0645728D6F31466B79A68F0E7BFAFDF6FDAEBFE08F3FB2EFED3DAEDF7C4AF0BC7ACFECEFF001D2E6596EDFE29FC22F27491AD6A12B9925B"
   FileBin .= "8F19F8454DBE89E227B991DE4D4350B53A278875262897DAF4F6F1AC15F8D7F12BFE09AFFF000539F80D35C9F0F7877E1B7ED7BE0DB5795EDB57F06EBB65F0F7E221D3E1CAA4BAB786FC4D2E9DA6FDB1D155C58787AE3C5974EC4AFDAEE1D891FCFF009C704715E4539AAD9655CDF0916F9331C9294F17CF15B4ABE5B173CC30F51AD651A54B17463ADB10D23FD77F0EBE93DE0078AB87A0F2BE38C0F877C435A30FACF06F8A38EC2E40E8579594A9E55C6F5550E10CE308A6DC6857CC31BC3999D58F2B9E4D4DDD9E3B45795F887C59F1A3E1EB3C1F163F640FDA9BE1F4B0C8229AFAF3E137882FBC3C64650EA2D7C402DECECEFD594FDFB259D03AC9196DF1"
   FileBin .= "B81CA47FB4169F70E61B2F857F1CEFEE830436767F0BB5C96E44A4ED588C64AFEF18860AB9E4AB0E315F252C453A7274EAC6BD1A89D9D2AF86C4D1AA9F674AAD28544FCB96F7BAB68CFE84C3E4B8DC6518E2701532CCCB0928A9C71B95E7792E67809425671A8B1D80CC3118474E49AB4D56E4775696A8F7FA2B9BF0A7837F6D6F8AF3C367F087F612FDA02F1AF088ED757F8A1A10F849A02B3A6F5B86D57C61F61D26E2D910862D1EAD12C8D9852612E15BEE6F84BFF0456FDAE3E334B6D7FF00B5AFC75F0EFC13F03CF22C97BF0BFE022BEB7E33D42C5B092E9DAB78E75584693A1DCBC664591AC078DB4CB84219ECE367F2A0F5B2FC9B3ECE271865591669"
   FileBin .= "8BE7692AF570B5301818A7F6A78EC7C70D41C52D64A84ABD4B691A729349FC0718788DE14787342AE27C41F157813875D08B94B29C0E7D82E2EE29ACD24D51C3F0B70956CE736A75AA36A14A799D2CB303CCEF5B1B429467561F9BDABFC4CD4F5BF19E9BF07BE07F84755F8D5F1C7C473B58E87E01F07C46FCD95C0FF5B7BE25D4216FB268FA769D1E6EB5292EEE2DE3B2B54373A9DCE97605B508BFA12FF826D7FC12BD3F670D587ED1FF00B4C6A7A57C4BFDAB75EB374B16B70B79E0DF829A45E44F1BF877C0AB344A93EBCF6D34969AC78A238A2090CB71A4E88A2DA7D6358F12FDFDFB2E7EC5DFB37FEC71E146F0AFC04F86DA47851AF61B78FC41E2A9D4"
   FileBin .= "EADE38F164D6E095B8F12F8B2FFCED5B521E6B4B71069E278747D3E59E65D2F4EB185FCA1F53D7ED1C21E1952CAB114337E21AD4732CD6835530984A0A6F2BCB2AADAAD355631A98DC6435E5C5D7A74A345BBE1B0F4A6BDACBFCCCFA467D37F1DE2064F9A7875E1065D99F067006674E583E22E20CD2A508F1CF1CE0B9939E031AF0356BE1386386ABB5175F8772BC5E36BE62A3C99CE73986164B0144A28A2BF593FCFB0A28A2800A28A2800AE33E2278EB41F863E05F16FC41F145CFD9740F07E83A96BFA9CA0A79AF6FA75B49702DAD95D9165BCBC9152D2CADC307B8BA9A1823CC92283D9D61789BC31E1EF19E83AA785FC59A2E99E22F0E6B56AF65AB68"
   FileBin .= "9AC59C1A869BA85ABB2B186EAD2E52486550EA9226E5263951248CAC888EBC98F8E36781C6432DA987A598CB0B888E02AE2E139E169E325466B0B53110A6D549D0857709558C1A9CA9A9462D49A67665D2C0C330C0CF34A788AB96C7198696634B073A70C5D4C0C6B41E2E9E167553A50C44F0EAA4684EA274E355C5CD38A68FE5CFC2DF13F47F1A789BC7BF197C7FE2EF0BDA78DFE297892F759BDB0BAD7F4D8E6D0F478667B7D1B428D2E2E5678A0B0B28E1B6B6590090E9F6FA724C3CC80E3BFF00F858BF0FFF00E878F08FFE147A47FF002657EE3FFC313FEC9DFF004407E1A7FE13767FFC4D1FF0C4FF00B277FD101F869FF84DD9FF00F135FC1F87FA2E"
   FileBin .= "78A54A12F6DC53C118BC4D7AD5F178DC657867EF118DC7632BCF158DC6E21AC324EBE2B155AAD7AAD2B73CE4A2ACA28FF42B13F4B5F096B548FB0E12E3CC1612850C360F0381C3BE1D587C065F81C3D2C1E0303874F1975430583A34B0D493D5C2945C9B936DFE1C7FC2C5F87FFF0043C7847FF0A3D23FF9328FF858BF0FFF00E878F08FFE147A47FF002657EE3FFC313FEC9DFF004407E1A7FE13767FFC4D1FF0C4FF00B277FD101F869FF84DD9FF00F135B7FC4B0F89FF00F451701FFE0BE20FFE67FEACFCAFCFFF00135FE14FFD137E20FF00E05C39E5FF00519E6FEEF33F0E3FE162FC3FFF00A1E3C23FF851E91FFC9947FC2C5F87FF00F43C7847FF000A"
   FileBin .= "3D23FF00932BF71FFE189FF64EFF00A203F0D3FF0009BB3FFE268FF8627FD93BFE880FC34FFC26ECFF00F89A3FE2587C4FFF00A28B80FF00F05F107FF33FF567E573FE26BFC29FFA26FC41FF00C0B873CBFEA33CDFDDE67E1C7FC2C5F87FFF0043C7847FF0A3D23FF9328FF858BF0FFF00E878F08FFE147A47FF002657EE3FFC313FEC9DFF004407E1A7FE13767FFC4D1FF0C4FF00B277FD101F869FF84DD9FF00F1347FC4B0F89FFF00451701FF00E0BE20FF00E67FEACFCAE7FC4D7F853FF44DF883FF008170E797FD4679BFBBCCFC38FF00858BF0FF00FE878F08FF00E147A47FF2651FF0B17E1FFF00D0F1E11FFC28F48FFE4CAFDC7FF8627FD93BFE880F"
   FileBin .= "C34FFC26ECFF00F89A3FE189FF0064EFFA203F0D3FF09BB3FF00E268FF008961F13FFE8A2E03FF00C17C41FF00CCFF00D59F95CFF89AFF000A7FE89BF107FF0002E1CF2FFA8CF37F7799F8C9FB2D7C78F0CFC11FDABF44D42C7C55A25EFC3FF8E30DA7827C6F6FA6EB163770691E251711C7E15F12DD416B72C90C69A84F1D84D773ED86D6CB56D7AEE562FE5E7FA3EEBD2BE6AD33F639FD96F47D46C356D37E047C35B5D474CBCB7BFB0B95F0D5833DB5E5A4A93DB5C2092374F3209A34950956DAEA180240AFA57A74AFE88F03BC3DE2DF0D721CDF21E24CDF26CD3075F39AD9AE4B4728863A34F2C8E3E11A999E15CB1D1849D1AF8F5531F4A9D38DA9D7C5"
   FileBin .= "E2DB938CE0A3FCD3E3EF893C1BE29711649C45C2D92E7994E370F9150C9F3EAF9D4F2F757359E5D5254F29C5C6180A9562AB61B2D74B2DAB52A54BD4C3E0B049414A9D49D428A28AFDB4FC1C28A28A0028A28A00FCD1FF00828DFF00C7BFECF9FF0065497FF40D3EBE5DAFB47F6F8F86DF123C7DA07C2CBFF871E10BDF185E783FC6B2EB7A858D84B6A278A216D6E6D59ADE6B986E668A69E0314AF691CC6053BE5F2D4AB1F83FFE10BFDAB7FE8DEB5FFF00BE5FFF00922BFCA2FA446073EC1F8EFC7D8D8708F19E6381CCF0BC2353038FC9B84B3FCDF01898E178730986C47B2C665D80C461E52A35E13A5522AA7342A4650924E2D1F45837196128AF694D38"
   FileBin .= "FB45252A908B579E9752927B6BB6C6FD1581FF00085FED5BFF0046F5AFFF00DF2FFF00C9147FC217FB56FF00D1BD6BFF00F7CBFF00F2457E41ED33BFFA217C48FF00C57DC5BFFCE93A2CBFE7E51FFC1D4FFF0092FEACFCAFBF45607FC217FB56FF00D1BD6BFF00F7CBFF00F2451FF085FED5BFF46F5AFF00FDF2FF00FC9147B4CEFF00E885F123FF0015F716FF00F3A42CBFE7E51FFC1D4FFF0092FEACFCAFBF45607FC217FB56FF00D1BD6BFF00F7CBFF00F2451FF085FED5BFF46F5AFF00FDF2FF00FC9147B4CEFF00E885F123FF0015F716FF00F3A42CBFE7E51FFC1D4FFF0092FEACFCAFBF45607FC217FB56FF00D1BD6BFF00F7CBFF00F2451FF085FED5"
   FileBin .= "BFF46F5AFF00FDF2FF00FC9147B4CEFF00E885F123FF0015F716FF00F3A42CBFE7E51FFC1D4FFF0092FEACFCAFBF45607FC217FB56FF00D1BD6BFF00F7CBFF00F2451FF085FED5BFF46F5AFF00FDF2FF00FC9147B4CEFF00E885F123FF0015F716FF00F3A42CBFE7E51FFC1D4FFF0092FEACFCAFDD7ECAFF00F27ABA77FD881AD7FE9B56BF6D6BF1FF00F646F83DF1C2CBF6908BE23F8FBE1B6A9E0AD12C7C21ABE9F3DD6A2D0C50C97173043696705AA3CF25CDC5C4ACEF2B8488C50C313B4B22318925FD80AFF403E85B95E6F96F85DC452CDF26CE324A9997891C5399E0F0B9DE598DCA71B570189A395428627EA78FA343111A55254AAC6139534A52A734"
   FileBin .= "9BB33C7CD25175E9A8CA32E5A304DC64A493BCB4BABAECF7BEA1451457F5E1E68514514005145140057C61FF00050BF8D63F67FF00D8DBE3DFC4682F3EC5ADC5E07BEF0B78526495A3B94F16F8E648BC1FE1FB9B509FBD926D3350D6A2D5DD63C14B6D3EE2691A28619268FECFAFC3AFF82C27867E34FED1DABFECEDFB1E7C01F0ECDE22F137893C497DF187C73752AB5BF86FC23E1CF0B29F0DF85F58F1B6AD24535958786EF354D6BC4571E4DC43733EA57FE1CB7B4D32C350D49AD2CA7F1B883155B0993E3EA61A9D4AB8A9D0787C2D3A5173AB3C4E25AC3D1E48C7594A33A8A7656D22DB6926CFCF7C56CEB30C8BC3EE28C664F87C56333BAF974F2AC8F0"
   FileBin .= "B81A33C4632BE719C4A195E5CB0D429FBF5674B138B8622518DB969D1A9394A1084A71FC45F0CEB96BF087C03F0E3E1B68FA1EA9E32F8A1AEE9D636DE1FF00873E18B49F51F12EBDE25D7246BBB8816CECE1B9BA8A06D52EEE2049DADE49E648592CEDAE5E178D3F6A3F627FF8255DEAEB5A2FED07FB6EC3A678C7E234261D4FC0FF0003D1A1D43E1EFC2FDCC97104DAFDBAC973A7F8A7C530158B75A992F742D3AE22335C5CF88EF96C6F34AFB0BF61FF00F8274FC30FD90ECA5F196AD767E29FED0BE23B663E32F8C1E20B6125EC0D748A2EB42F04DA5C34EDE1BF0F20510C8F1C8DAAEB0A8ADA8DD8B18B4FD274CFD15AF97E1EE0E542387C5E730854AB4A"
   FileBin .= "30786CB9353C3617912509E21ABC713898DB45AD0A52BB82A92E5A91FC57C27FA3ED3CB29E599E788342862F1D82A586964FC26A70C4E57934A8461EC3139ACE37A59BE6F4F96328C2D2CB70155374238AAF0A78C8A001405501540000000000E8001C003B014B4515FA09FD58924AC9592D125B25D8A7A869F61ABD85EE95AAD95A6A5A66A56B7163A869D7F6D0DE58DF595DC4F05D59DE5A5C24905CDADCC12490CF04D1BC5344EF1C88C8C41FE787F6C4FF00825BF8CBE0CEA9AF7C75FD86F4C9756F0DDD4D3EB3F10FF661324B25B4C8374B7BAAFC25FBF2437691E648FC22AAF731ED6B7F0EB6A16A34FF0008AFF455457939BE4B82CE682A58A838D4A7"
   FileBin .= "CD2C3E2A95A388C34DAB73D29B4F47A73D392952A8B49C25A5BE178F3C3BE1CF10F2C8E073BC3CA9E2F0AE7532ACEB06E34736CA31325675B05897197EEE768AC4E0EB46AE0F1708A86268544A2E3FC32FC40F1BD87C49F857A978AFC137579A478EBE156B9A4F8DA3D26F61FB1F897C1FE24F08DFFDA2E3EDD632FEFA09AC6DD35268675568649ED9A3C89A19E18BFB43F813F14B4CF8DBF063E16FC5DD1FCA5B0F88DE03F0C78B92DE193CD5B1B8D6B49B5BCBED31DCFCDE7E957D2DCE9D728F8923B8B5963701D48AFCECFDBD3FE0975E0DFDA5A4D53E2E7C17BED3FE127ED20961771CDAEDBC1F67F07FC5182681A39344F88FA6DA412896E2F623F645F1"
   FileBin .= "4C169757CB0B88759B1D76D6DB4F874F83FE08F177F12FC13F003C63FB30FC6AF0E6AFE10F89FF00B367C41D53429F40D657CC98F823C70F3F8B7C2DACD8EA11BCD65AB68B7FAC4DE31B2D1751D32EAF34C9F4FD261FB0DD3C01638BE4787703996459FE23058C87B4C2E61845F57C7518B587C457C14A53829C2EDD0C43C355ADCF4E526A5EC93A529C13E5FC1BC25E19E2EF0C3C50CD786B8830FF005AC938B3234F2BE24C0D39ACAF33CCF87AB54AF85A75A8B7396599AD5CAB1B98BC560AACE51AAB030A984AF89A307EC7F5C68A28AFD10FEB30A28A2800A28A2800A28A2800A28A2801195586195587A30047EB4CF2A2FF009E51FF00DF0BFE1525140E"
   FileBin .= "ED6CDAF9B0000E00C0F4145145020A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800AAA965671DE4FA847696A97F756F6B69757C9044B77736B6525D4B676D3DCAA09A682D24BEBD92D6191DA3824BBB978951A794BDAA28FD361349DAE93B3BABABD9D9ABAECECDABAE8DAEA145145030A28A2800A28AAAF6A1EF6DEF7ED174A6DED6F2D45AA4ECB6530BC9AC66371716C06D96EADBEC223B39C90D6F0DDDF46A08B96C005AAACB6768B7725FADADB2DF4B6F1"
   FileBin .= "5A4B78B0C42EE4B58259A686DA4B90A267B7865B89E58A06731C724D33AA869189B345164F75B6ABC9F71349DAE93B3BABAD9D9ABAECECDABF66C28A28A06145145001451450014514500145145001451450014514500145145001451450014514500145145001451450014514500145145001451450014514500145145001451450014514500145145001451450014514500145145001451450014514500145145001451450014514500145145001451450014514500145145001451450014514500145145001451450014514500145145001451450014514500145145001451450014514500145145001451450014514500145145001451450014514500145"
   FileBin .= "14500145145001451450014514500145145001451450014514500145145001451450014514500145145001451450014514500145145001451450014514500145145001451450014514500145145001451450014514500145145001451450014514500145145001451450014514500145795FC58F8DFF0009FE076827C49F15BC75A0F8334C6594DA2EA7745F53D524854349068BA25A25C6B1AD5CA290CD6FA558DDCC8A77BA2A02C3F2E7C7DFF054CF1478A24B8D3FF667F82B79AB59EE7483E227C5795F44F0F3ED263FB458786B4DBC86F753B56244B13B7886CEF51420B9D21199D53EAF87F82789B8997B5CAB2CAB3C1C65CB5332C54A9E0B2DA6EF6927"
   FileBin .= "8DC54A9509CE3F6A951955AFDA936D27F3D9C715645913F679863E9C712D734705878CF158D9A7F0B586A0A756119749D450A7DE6926D7ECD5636B3E22F0FF00872D4DEF8875DD1F42B21D6EF59D4ECB4CB618C6733DECF04431919F9B8C8F5AFE723C57F14FF6BBF8A4F23FC40FDA3FC49E1CB09890DE1BF84B0A7822C21858A97B65D63498F4BD5AF616C1561AAFF683BAB14795A2FDD9F9F3C55F0E3E14786ED2E3C53F10AFF5DF115C0E0EA3E28F11EABA8EADA8DC7CCEB6F025B4F6925EDC48CCEFE56C68D079934C638524917F4CCBBC129549538665C4F8755EA34961725CB31399CDCE56B4156C5D5CAE9B9746E9C6AC7476725A9F098CF14D454E58"
   FileBin .= "1C8AABA514DFB7CCF1D47051497DB74B0F4F1D351EB69CA9CADA3517A1FD2DEA9FB527ECD1A2C8F06ABFB417C16B2B8452CF6D37C4EF067DA9546E1936ABACBDC004AB2A8F2F2CC0A0CB7152F853F69BFD9EFC77AED97863C15F197E1DF8B3C45A8B94B1D13C3BE27D3358D52E4AE37B4565613CF70D1C40EE9A5D822853324AE880B0FC25FD9DFF00E09CDE2BFDA45F4CF1AF8C7C3517C06F82723C57BA4DA269F1CBF143C73A7B80D0DE5A1D492E57C3FA65DC44C96FA96A113A491BC52D9691ADDA4D0EA8BFBCDF05FF0067CF841FB3EF8787877E14782749F0CC1245126A5AA4711BBF10EBB244322E35DF105D99B55D4DFCC2F24715C5C9B4B4323C7636"
   FileBin .= "D6B06D857E638CB87780786613C065F9FE719EE7D0BC2B50A14F2FA596E06A2BA943178C83C4AAB5E0FE3C3E12559464A54EAE228D44D2F7B8673BE2FCF651C5E2F28CB32ACA256953AD5678C9E37154DA4D4F0F869FB170A524FDDAD8854949352A74AA4757ECF451457E5E7DF051451400514514005145140051451400514514005145140051451400514514005145140051451400514514005145140051451400514514005145140051450083C8391EA2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A2B2F5CD6F49F0D68BAB788B5FD46D349D0F41D32FB59D6755BE992DEC74DD2F4DB596F2FEFEEE772121B5B4B5865B89E"
   FileBin .= "5760A9146CC4E066BF3764FF0082C57FC13A6292489BF681919A391A3263F853F1A668D8A3152D1CB17C3B78A442465248DD91D70E8CCA41AFA5C838338BF8AE3899F0BF0AF11F1243052A51C64B21C9332CDE3849575374638996030D8854255553A8E9AAAE2E6A13714F95DBEBF85FC3FE3CE378E327C19C15C59C5B0CBE54618F9F0D70EE6F9EC3053C429BC3C7172CB3078A8E1E55D52AAE946B383A8A9CDC135095BF4DA8AFCC6FF87C77FC13A3FE8E027FFC34BF1B3FF9DCD1FF000F8EFF0082747FD1C04FFF008697E367FF003B9AFA2FF883DE2DFF00D1AFF10FFF0010CE23FF00E7779AFBCFAAFF008809E397FD19AF153FF15F716797FD4A7CD1FA"
   FileBin .= "73457E637FC3E3BFE09D1FF47013FF00E1A5F8D9FF00CEE68FF87C77FC13A3FE8E027FFC34BF1B3FF9DCD1FF00107BC5BFFA35FE21FF00E219C47FFCEEF35F787FC404F1CBFE8CD78A9FF8AFB8B3CBFEA53E68FD39A2BE7EFD9F3F6A6F80DFB54787F59F13FC07F88365E3AD23C3DA9C7A3EB663D2BC41E1FD474BBF9A01736E97BA2F8A749D1359820BB84BB595E3E9E2CAF4C372B6B7133DB5C2C5F40D7C366595E659363B1395E7197E372ACCB073F658BCBF31C2D7C16370B51C63354F1185C4D3A55E8CDC251972D4A71972CA32B59A67E719BE4D9BF0FE658BC9B3ECAF31C9337C0545471D9566D82C4E5D98E0AB3846A2A58BC1632951C4E1EA384E13"
   FileBin .= "50AD4A127094656B4936514515C279A1451450014514500145145002120024900004924E000392493C0007249E95F925FB4CFF00C146E7B6D7355F847FB2959E99E35F1AD933D97897E29DF05BCF87FE0A94968A44D29943DB789B5780ACA56E0B4BA3413C2120B6F11BADE59DA7997EDC5FB5A788BE2AF8B75EFD987E06EB92E93E13D11E4D3BE37FC49D2A5613DCCE1DE1BCF87DE1CBC8D804895925B3F105C44FE6EA174975A4EE8B4AB0D55358F933C35E19D17C23A4DB68BA0D94765636C01C28066B8988024BABB9880F717536D0649A424E02A20489238D7F7FE05F0DB0786C2E173EE2BC37D6B1189A74F1395E41579A346142694E8E3B3851719C95"
   FileBin .= "68B5530D9727153A4E35717274E6B0F2FC738B38E7135F1188CA387EB3C3D1A13950C766F4F965527562ED570B96B69C63ECDDE15B1AD49C6A2953C3AE683AAB974F014FE21F10DC78EFE2BF88F57F8AFF00107502B25EF887C5D7126A105BB025D2D74AD36E1A4B5B4B1B427658DBF9661B24555D3EDEC220B027A28000000000000006000380001C0007000E94B505CDCDBD95B5C5E5DCD1DBDADAC12DCDCCF2B048A18204696696463C2A471AB3BB1E02826BF60A95AAE21D383B72538C6961E852846950A34D5A30A387C3D28C6951A715651A74A118AE88FCD614A9D2E79A4F9A6DCEB559CA53AB566F5954AD5A6E552ACDEADCEA4A527DCE67C69E32D2"
   FileBin .= "BC0FA24BAC6A65E572EB6DA769D6F86BDD57509B22DEC6CE3E59A491B9770AC21883CAC0ED0ADF7F7EC6FF00B07DDDF5F691FB41FED43A5C5A978CA748752F87DF09B51844BA17C3DB19596E2CB51F10E9D3EF8AFBC54E9E4CD0E99771B47A24812E3534B8D7D618BC3FE67FF04FAFD9D8FC6DF191FDAAFE2569AD2F827C2DA95DE97F023C31A8C24DB5F6A1A75CB41A8FC40BDB5917CA94D85EC2D6DA3EEF348D720B99C98DBC3BA5CD3FEE5D7E47E2571DD5CA6589E13C86BBA58CE574788733A32B55A73925ED325C1D48BBD28D25EE6655E12552AD573C1C5C68D3ACAB7E8FC0DC230CC551E21CDE8A9E154954C9B01515E9D48C5FBB99E2A9BD2A39B5CD"
   FileBin .= "82A334E10A7CB886A55274DD33A74A28A2BF9F0FD9828A28A0028A28A0028A28A002BF98EF8D5FF05D6F8F5E04F8FDF1E7E10F81FF0066CF875E22D27E0DFC59F1DFC358B55D57C6DAC5B6A3A8C1E0DF166B9E16B7D5EED0AD85B4736AEDA14FA81B4B58E54B0130B46B8B9312DD4FFD38D7F9F77C6DFF0093DAFDBC3FECE9FE337FEADAF88F5FA97857C3B94711E6D9861738C27D6E8D2C1C2A528FB5AD4B926EAD9C93A3520DB7156B4B9959BB2BEA7C871663B1B83595C3078AA985FACE26BC2ACE94694A728D3C3CAA452F6B4EA452E64AF68DDAD2E7EAFF00FC3FCBF6AEFF00A34FF857FF0085FEA7FF00C9B47FC3FCBF6AEFFA34FF00857FF85FEA7FFC"
   FileBin .= "9B5F903457EF3FF10A781FFE850FFF000AF19FFCBFD7FA5AFCBFF68E73FF00439C77FE0181F2FF00A83F2FC7D6FF00AFDFF0FF002FDABBFE8D3FE15FFE17FA9FFF0026D1FF000FF2FDABBFE8D3FE15FF00E17FA9FF00F26D7E40D147FC429E07FF00A143FF00C2BC67FF002FF5FE96A7F68E73FF00439C77FE0181F2FF00A83F2FC7D6FF00AFDFF0FF002FDABBFE8D3FE15FFE17FA9FFF0026D1FF000FF2FDABBFE8D3FE15FF00E17FA9FF00F26D7E40D147FC429E07FF00A143FF00C2BC67FF002FF5FE96A7F68E73FF00439C77FE0181F2FF00A83F2FC7D6FF00AFDFF0FF002FDABBFE8D3FE15FFE17FA9FFF0026D1FF000FF2FDABBFE8D3FE15FF00E17FA9"
   FileBin .= "FF00F26D7E40D147FC429E07FF00A143FF00C2BC67FF002FF5FE96A7F68E73FF00439C77FE0181F2FF00A83F2FC7D6FF00AFDFF0FF002FDABBFE8D3FE15FFE17FA9FFF0026D1FF000FF2FDABBFE8D3FE15FF00E17FA9FF00F26D7E40D147FC429E07FF00A143FF00C2BC67FF002FF5FE96A7F68E73FF00439C77FE0181F2FF00A83F2FC7D6FF00AFDFF0FF002FDABBFE8D3FE15FFE17FA9FFF0026D7DDDFF04D6FF82ACFC4FF00DB63F685F1CFC0AF88BF063C1FF0EA5F09FC26D4FE2545ABF86BC4DA9EAF3B4FA678A7C09E1F1A4DCDA5DC335ACB15F5AF8E23BF4BCB7BE8DED1F4FF00B3C96F39BB66B4FE64EBF4B3FE0849FF00291AF8E1FF0066B3E21FFD"
   FileBin .= "4FFE0057C971C787BC279370C66B986032CF638BC3D0E7A355E27153F672E787BCA33ACE2DEEAD252567B5F537C0E699B4733CAE954CD3155E96231B0A15A95586179254E54AA49AFDDE1A9CD3BC16AA5A2BF5D4FEC128A28AFE613F500A28A2800A28A2800A28A2800A28A2800AE4BC77E3DF057C2FF07F883E207C46F15681E08F04784F4CB8D63C4BE2AF13EA969A3683A26996AB99AF351D4AFA582DADE1525514C920696678E1895E692346F913F6E4FF008286FECE3FB01F8063F14FC64F123DF78C35D8668FE1D7C20F0B793AA7C49F88BAA2930C36DA1E86255365A4ADD148350F136AEF65A169EEE96A6EE7D56E74FD32F7F915FDA37E39FED39FF0"
   FileBin .= "522F17DA78CFF6A9BE9BE1EFC0FD1F533AB7C35FD93BC27A8DE43E1DD3555A41A6EB7F13350436D77E2AF162D9C9E5CF717D1412DBBCD751E97A7F846CEEB51D0AEBF4FE05F0C735E2D50CCB193964DC350A8E35734AF4B9AB635C1FBF86C9F0B27178DAF7F7275AF1C1619B6EBD7E751A33FD2782BC36CD38AB9730C5CE59470F426E35333AD4DCAAE31C1AE7C3E5586938CB195BECCEB371C261DFF1AB73A8D29FDB7FB6BFFC162FE33FED8D79AFFC15FD81EF35EF83BFB3FA5C5E689E36FDAAF52B3BCD1FC79E3CB6477B5BCD37E0F69B29B5D4BC2FA55CA0909F1048D65E2D9A37819A7F04CB1359EB3E29FB227FC14ABF6A0FF8271DEDA7853E2DDFF8CF"
   FileBin .= "F6B0FD8D5AF0B5CDD6A378759F8E7F052DAE24792EAFF45D5351B88C78A7C350B48D34FA0EAF7B0E9902443FB2EFFC1D189A1D5FC7AC2C2C74AB2B5D374CB3B5D3B4FB1823B5B2B1B1B78AD6CED2DA150915BDB5B40890C10C4802C71C68A88A005000AB44060558065604329008208C1041E0823820F0457F49D1E18E11C3E4F2E1BA7C3982A991CD275E3888C279B62710A2A2B31A99C2847174F308EAE94F0EE96168C652A10C2FD5E75294FF00A2A970D70A61F28970F53C830753269EB5A3888C679A622BA5658FA99AC611C4D3C7C75F653A0E9E1A8C652A30C37B094E9CFF00B4FF00801FB44FC17FDA8FE19685F183E03F8FF42F88BE01F102116DAB"
   FileBin .= "E8D3B79F617D1A44F75A26BDA55CA41AAF87BC41A7F9D12EA3A16B76763AA59349199ED5125899FDAABF801F86FA8FC77FD8EBE265C7C78FD893C5F0F81FC4D7B25BCDE3EF835AB179FE107C5DD3ED1E598E97AE7877ED36B67A7EA0C92DC43A7EA163369773A7497334BA36ADE1C9EE6F6F2E7FAA9FF82797FC158BE057EDDD66FE05BCB79BE0AFED3DE1BB47FF0084E3F67FF1A5E245ADB4B65089350D67E1F6A3711590F1BF86130D34925ADADB6BBA54004BAD68D6963369FA96A3FCF3C75E14E3F86E9D6CE323A9573AE1B8BE6AB59535FDA593A93F769E6D86A69AF649BE48665874F0755A5ED1616ACE340FC078DBC2FC7F0EC2B66D934EAE71C3D17C"
   FileBin .= "D52B282FED1CAA326AD0CD70F4D5BD926D42398504F0955AFDE2C35492A27EAAD14515F919F95051451400514514005145140051451400514564EBDAEE93E18D0F58F126BF7F6DA5687E1FD2EFF5AD6753BC9561B4D3B4BD2ED65BDBFBEBA99BE58ADED6D609679A46E1234663C0AA84275270A74E129D4A928C210845CA739C9A8C6118A4DCA52934A3149B6DA495CBA74EA56A90A54A13A956ACE34E9D3A7173A952A4E4A30842114E529CE4D46318A6E526924DB3F1C3FE0B1DFB406A1A37C3AF06FEC99E03D48DBF8F3F68ABE31F8AE7B590FDA3C3FF0008B459D66F11DE5C88CF990C7E22B9846948AE3C9D4747B1F1459E7CC0A2BF28B4AF09F87346D3"
   FileBin .= "34FD22C747D392CB4CB2B5B0B5592CEDA49041690A4117992345BA594A20324AD9791CB3B12CC49CFD47E266ADFB4FFC78F8B1FB5578823B98EC3C61AA4DE11F84DA65E8659340F85BE1AB87B2D252385B72DB5C6AAF07DB75248885FED893599E3262BE39ECABFD43E04E12FF008873C1592708C57B2CD61079C714D4A72B4AAF11E674A8CB11859CE2FDF864B85A785CA20AEE0AB617155A1678891FECCF869C0DFF00109BC3CE1DE0587EE73AA54E59F71A55A52E59D6E2DCE28D09E2F053A906B9E1C3F82A583C869ABB87B7C163311049E2A77CCFEC5D1BFE813A67FE005AFF00F1AA3FB1746FFA04E99FF8016BFF00C6AB4E8AFA8F6F5FFE7F55FF00C1"
   FileBin .= "93FF0033ECFEB589FF00A08AFF00F83AA7FF0024667F62E8DFF409D33FF002D7FF008D51FD8BA37FD0274CFF00C00B5FFE355A7451EDEBFF00CFEABFF8327FE61F5AC4FF00D0457FFC1D53FF0092373F652F8C69FB21FED93E0EF185C4CBA67C1CFDA1C69DF0A3E27C4BB6DF4AD17C5265C7813C5D708BE4DADB8B4BF9059DCDD4CCB058E8D7FE2BD4262D2CB1D7F58608201041040208E841E411EC457F1D3F11BC1565F10BC19AEF852F0229D4ACDBEC372E33F62D520227D36F06017DB05DA44665421A5B733404ED9581FDFDFF00825FFED3B7BFB487ECCFA35AF8C6EDDFE2F7C1CBC3F0AFE29DB5E4BBF52B9D5BC3D0A41A3F896E83B19A66F12E8A96D7"
   FileBin .= "57B7BB12DE6F10DBEBF6D6DB92C988FE65FA4F7067F6965793F89381A5CD8AC07D5B8638B3915E73A2A32FF56F37AD6579374A15B24C4D693B47EAD94D36DCEB6BFC77F4C7F0FDE6D92E43E2E65B41CF1B967D4F83B8DDC15E7568284DF08E7B5DA4E52FDCD3AFC3B8BAF3D21F54C8E9B6E78857FD1AA28A2BF8B0FF003D028A28A0028A28A002BE18FF008280FED11A9FC04F82325A7832764F8A7F153525F007C3C103AADE69F77A8C58D63C4B0024156D0B4F93167703725B6B9A8E8AF3C6F01941FB9EBF01BF6E7F15CBF10FF6D9B7F0B492F99A27C06F86FA74705A6F32C5178BBC711DBEB7797853EE452DC685A8E8B195C160DA45ACB9DC46CFD07C32"
   FileBin .= "C8B0F9EF15E1638DA51AF97E5587AF9D63A8CD5E15E96079161F0F516CE96271F5B0942B27A4A9549C7A9F1BC779BD6CA787EBBC2D474B199856A596616AC5DA54A78AE675AB41EEA747094F11569B5B54845F43E77F02783ECBC0FE1BB2D0ED584F70A0DD6AB7ED932EA5AADC056BDBD95DBE76DF2011C0242CF1DB470C4CCC50B1EC68A2BFA6EB55A95EAD4AD564E752A49CE727D64DDDE8B44BA24AC924924923F06A74E14A10A74D28C211518A5D12FCDBDDB7AB776F5615E7FE29F0EEB5F147C5DF0D3E03785E7920D6FE2F78B2CF45BDBB814C92695E15B274BDF12EAB246BF3186C74E8E6BFB84E93D858DFC38705D47A057B87FC13E7C2B1F8CBF6C7"
   FileBin .= "F88DE33BC884F6DF07FE1769DA1E92C5415B4D7BC73731CAB788C49C4C7474F1269ED85F9D26656602201F931D992C9329CEB3DB275327CB3118BC32925283C7CE54F099773A77528471D89C3CE516BDE8C5C7A9D384C17F6A66396654EFC99963E8E1AB357BFD562A788C659A69A6F0942B453E8E49DB43F6EBC17E10D03E1FF84BC37E08F0AD847A67873C27A2E9DA068B631018B7D3B4BB58AD2D95D82A996668E20F7170E0CB713B493CACD2C8EC7A6A28AFE31A952A56A952AD59CAA55AB3954A95272729D4A939394E7393BB94A526E52936DB6DB7A9FD3F4E9C294214A9C630A74E11A74E1149461082518C62968A318A4925A24920A28A2A0B0A28A2"
   FileBin .= "800A28A2800A28A2800AFF003EEF8DBFF27B5FB787FD9D3FC66FFD5B5F11EBFD046BFCFBBE36FF00C9ED7EDE1FF674FF0019BFF56D7C47AFDB7C0FFF0091F669FF006014FF00F4F33E1B8D3E3C93FEC2F15FFA8933028A28AFEA33E6028A28A0028A28A0028A28A0028A28A002BF4B3FE0849FF291AF8E1FF66B3E21FF00D4FF00E0057E69D7E967FC1093FE5235F1C3FECD67C43FFA9FFC00AF82F133FE48BCEFFEC1BFF6F81784FF0091BE49FF00633A5FFA66B9FD82514515FC587EBA145145001451450014515C07C53F8A5F0FBE09FC3CF16FC57F8ABE2AD2FC13F0F7C0BA3DC6BDE2AF146B323C761A4E9B6E510CAEB0C735CDCDC5C4F2C36763616505"
   FileBin .= "CDFEA57D716D61616D7379730412694A955AF569D0A34E75AB56A90A54695284AA54AB56A49429D3A708A729CE736A30845394A4D249B69174A954AF529D1A34E756B569C2952A54E329D4AB52A494214E9C229CA739C9A8C2314E52934926DA3BF2400493803924F403D4D7F3F1FF000508FF0082DA787FE15EBFADFECDDFB0DE99A2FC7CFDA523F3F4DF1378D1665D43E0CFC109433417775E24D6AD265B4F15F8A74D70F1AF87B4EBD5D2B4CD4A37B6D6F51B9D5AC65F086A3F99DFB66FFC1553F683FF008283CDAD7C2DFD9825F15FECDDFB1ECD2DD695E22F8A570ADA47C64F8E9A586782F2D3404864693C17E0AD4C2BC0F6F6971F6FD4EC1DD3C41A94"
   FileBin .= "91DCEABE0683E47F87FF000E3C1BF0BFC3F0786BC17A2DBE91A7C415E791479B7FA95C85DAD7BAA5F383717D77273FBC998AC484416D1C16E91C29FD23C17E0FE1B2C54736E38A51C4E3572D5C370AC6A7EEE83D250A99FD7A52BF32D1FF0064E1E6AA3D238DAF4AD530B2FE88E0EF09B0F972A39A719D28E2319EED5C370D467FBAA3F6A13CF2B5295F9B67FD97426A7B2C656A769E165CDE87F0F3C45ADF8F358F8E3F1E7C77ADFC71FDA0BC5529BAF107C48F17CC6F1B4F670E174AF08E9AEA965E1ED1AC2291ACB4EB7D3AD2CA1B2B15FB1E9567A3E98C34B8BD728A2BF68AB5A759C39B9230A54E14A8D1A50851A187A34D28D3A187A14A30A5428D38A5"
   FileBin .= "1852A508C2292491FB0D4AB3AAE3CDCB1853846951A54E11A54285182E5A746851A6A34A8D1A714A34E9538C6104ACA2828A28AC8CC2BC9BE237C22D13C7B75A3F892C753D63C0DF12BC29756BA9F81FE28783AF6E344F19785357D3E6FB5E997965AB69F3DA5E3C565798B98A1FB4C52DBCA5E6D3AEB4FBB7174BEB3456B46BD5C3D45528CDC26938B6ACD4A32569C27169C674E716E33A735284E2DC65169B46B46B55A1355294DC269357566A5192B4A138B4E3384D3719C269C2716E324D368FD2AFD857FE0B75E2BF865AC7873F678FF8296CB67A63DD4B0689F0F7F6C0D2ED16DFC11E2A500456567F17EDAD618ADFC2DAE6D50B75E2CB5B6B6D30074B"
   FileBin .= "9F1269BA5D95BDDF8BB51FEA074DD4B4ED674EB1D5F47BFB2D5749D52CEDB50D3353D36EA0BED3F51B0BC852E2CEFAC6F2D9E5B7BBB4BAB79239EDAE6092486786449627646563FC1CF88FC37A0F8BB46BEF0F789B49B1D6F45D4A230DEE9DA842B3DBCCBD51803868A785B12DBDCC2D1DC5B4CA93412C5322BAF75FB257EDB1FB4EFF00C130AFE2D2FC2C35EFDA3BF6327BC7B9D73E08EB1A8BDC78F7E125A5CCCF3EA1AC7C24D6AE7CC61610492497D75E1AB857D16F49B837365A56A177A878CD3F25E34F0972FCFF00DAE69C234F0F94E752E6A95F21728D0CAF339BD5CB2AA936A9E5B8B9BBBFA8D5947035A4D470D530AD468D4FCAB8C7C2BC0679ED73"
   FileBin .= "2E15861F2BCDE579D7C8DCA3432CCC66F594B2CAB36A9E5D8A9BBBFA9559470555BB50A9866A34AA7F733457CE5FB2BFED5DF03BF6CDF841A37C6EF801E308BC5DE0AD52E66D2AF964B7974ED73C2FE26B2B6B2BAD57C25E2BD1AE40B9D1BC47A4C5A8594B756721960B8B3BCB1D574BBBD4346D474ED46EFE8DAFE64C5E131580C5623058EC3D6C26330B567431386C4539D1AF42B53938D4A556954519C270926A51924D33F9BF1584C4E07135F078DC3D6C2E2F0D567471186C453952AD46B536E33A7569CD29427169A71924D0514515CE738514514005145140057E2D7FC163BF680D4346F875E0DFD933C07A91B7F1E7ED157C63F15CF6B21FB4787FE1"
   FileBin .= "168B3ACDE23BCB9119F3218FC457308D2915C793A8E8F63E28B3CF981457EC7EBDAEE93E18D0F58F126BF7F6DA5687E1FD2EFF005AD6753BC9561B4D3B4BD2ED65BDBFBEBA99BE58ADED6D609679A46E1234663C0AFE40F51F899AB7ED3FF1E3E2C7ED55E208EE63B0F186A937847E136997A1964D03E16F86AE1ECB4948E16DCB6D71AABC1F6DD4922217FB624D6678C98AF8E7FA3FE8D5C130CFB8C2B717E654155C93812387CCE30AB1E6A38DE24AF39C787702D3D2A2A388A35B38C44358BC3E572A55125888DFFAD7E887E1D53E26E3CAFC779BE1A35B877C34861737842B414A8663C5D8A9D48F0A65CE325CB52387C550C467D8A87BD1961B26950AA9"
   FileBin .= "47150BEFE8DA458681A469BA1E9502DB69BA4D8DAE9D6302E3F776D690A43106200DEE51019242374921676259893A74515FDB952A4EACE752A49CEA5494A739C9B7294E4DCA526DDDB6DB6DB7AB67FA2D52A54AD52A55AB3954AB5672A952A4DB94A739C9CA73937AB94A4DB6DEED85145150405145140056FF00ECADF1A0FEC93FB66F843C6B7D746C3E10FED15FD9FF000ABE29EF90C7A6E91E2B79BFE285F185D65A3B784DADFC82CEEAEE7610D8E8D7FE2BBF98B4B2A5605711F11BC1565F10BC19AEF852F0229D4ACDBEC372E33F62D520227D36F06017DB05DA44665421A5B733404ED958155B0196E7580CD387B3A5CD92F1165F88C9F34B454A5468"
   FileBin .= "62945D1C7528BD3EB39662E187CCB0ADED88C2D3E8DA6B1196653C4396673C2BC43173E1EE2BCAF1590671CB1539D0C3E3545D0CCA845E8F1793E3A9E1336C13E98AC152E8DA7FD8B020804104100823A1079047B114B5F9CBFF0004BFFDA76F7F690FD99F46B5F18DDBBFC5EF839787E15FC53B6BC977EA573AB787A148347F12DD076334CDE25D152DAEAF6F7625BCDE21B7D7EDADB7259311FA355FE5C71570DE65C1FC479D70C66F4D53CC324CC31180C472DDD3ABEC66D52C4D093F8F0D8BA2E9E270D557BB570F5A9D48B719267F8C1C6DC239BF01716F10F06E7B4952CD787334C56598AE5BBA55DE1EA35471786934BDA6131D8774B1983ACBDDAD85"
   FileBin .= "AF4AAC7DD9A6CA28A2BE7CF970A28A2800AFE6EBE2F3CB37EDA3FB5AC97259A74F11F80A18DA418716F1F849628557A6635821B654206362C673C827FA45AFE7C7F6C7F0DCBE02FDBAFC5B77321874EF8D5F0E7C2DE2CD365008866D5FC31649E16BDB446C05FB4C76DE1DBBD42E2304B2ADDC32B0C5C835FB1782F5A11CF73DC336955C5F0CE29505D672C2E679563AAC1756FEAD86AD51AFE5A527D0FCCFC51A72794E535D26E9E1B3CA2EABD6D18E23058EC2D393E897B6AD4E177FCFA6A79ED14515FBB1F91857D79FF04A9488F8FBF6C2B8214DD3788FE15C0EF9CC9F6686C3C77F674233F2A0679769C0DE41C96D836FC875F427FC137BC4717867F6AD"
   FileBin .= "F8EDE05B8912DD7E23FC3AF0A78DB4C47213ED771E0BBDFEC99E2849C0927CF88F55B908016305B5CBE0885DABE7F8CE954C4702F17D1A49BA9FD9F80C4D975A583CF32BC4D7F9468C2751F4B41B7B23D9E18A90A3C57C3952A34A0F1B89A177D2A6272DC6D1A567DE55251A6BBF3F63F7328A28AFE473FA3C28A28A0028A28A0028A28A0028A28A002BFCFBBE36FF00C9ED7EDE1FF674FF0019BFF56D7C47AFF411AFF3EEF8DBFF0027B5FB787FD9D3FC66FF00D5B5F11EBF6DF03FFE47D9A7FD8053FF00D3CCF86E34F8F24FFB0BC57FEA24CC0A28A2BFA8CF980A28A2800A28A2800A28A2800A28A2800AFD2CFF0082127FCA46BE387FD9ACF887FF0053FF"
   FileBin .= "008015F9A75FA59FF0424FF948D7C70FFB359F10FF00EA7FF002BE0BC4CFF922F3BFFB06FF00DBE05E13FE46F927FD8CE97FE99AE7F609451457F161FAE8514514005145140057CB7FB6D7ECFB69FB547EC97FB40FECFD731C2F75F133E19789345F0F493B2AC365E33B6B5FED7F036A92962AA63D27C65A6E87A9BAB3A2BADA152E818B0FA928AEAC16331197E37098FC24DD2C560713431986A8B7A75F0D5615A8CD79C6A4232F91D382C5D7C0633098FC2CDD3C4E0B13431787A8B7857C3D58D6A535E719C22FE47F9E77ECD3E29BBF147C1BF09AEAB0CF69E21F0AC571E06F12585D44D05E586B3E1099B4792DEF61701E2BC7B3B7B3BAB98DD51D25B965"
   FileBin .= "75570C07BCD6AFED55F0A3FE1987FE0A69FB5BFC1B86D7EC1E0FF8C377A6FED4DF0D21C491412597C4491FFE13A4B48591618E1B7F1DB6BBA3D8DBDB168E2B0F0D80842C6F05AE557F794F174332A785CDB0A92C267382C266F868A6A4A14F31A10C4CA8DD7DAC3D5A9530F35BC6A52945EA99FDC4F154730A585CD30C92C2E6F83C2E6B8749DD429E3E84312E95FBE1EACEA61E6B753A528BD530A28A2B32028A28A0028A28A002B91F1F78B2D3C09E09F1578C6F76B5BF86F42D4B56F29D828B99AD2D6492D6CD4923F797B7421B488646E966450726BAEAF17F891E02D57E3FFC47FD9D7F64CF0FCB3C5A9FED21F1A3C25E13D626B5F9A6D37C05A4EA767A"
   FileBin .= "AF8D75C28A7798F42D3845AD4D80375B69D72A371F94F461551F6F1A98A9AA784C3C6A62F19525F0D2C16129CF138BA927A59430F4AA4B75B1BE1951F6D19E266A9E16829E271751E8A9E130B4E588C5546FFB987A5525F23FAA0FF82177ECF775F00FFE09D1F086F75DB47B6F1BFC7ABAD67F68BF1B492A08E6BABCF89CD6B3F84E79136ABC721F86FA6F8296E21946E8AF05D2ED8F3E5A7EC0565685A2695E1AD1347F0E685616DA5689A0697A7E8BA3E996512C367A7697A5DA4565A7D8DA42802436D69690456F046A02A451A20E0015AB5FC31C439C57E20CF737CF311755B35CC7178E945BBFB3588AD3A94E8C7FB9469B8D282DA308452D123F89F3FC"
   FileBin .= "DAB67D9DE6B9CE22FED733CC3158D947A5355EB4EA42947A2852838D2825A46108A5A2414514578C79014514500145145007E2D7FC163BF680D4346F875E0DFD933C07A935BF8F3F68BBE31F8AA7B590FDA3C3FF00087459D66F11DE5C04224863F115CC23494571E4EA3A458F8A2CF3E60515F965A369161A0691A6687A540B6DA6E93636DA758C0B8C476D690A43129200DEE510349211BA490B3B12CC49FD0AFF0082CAFC14BEF0E5FF00C2AFDB5FC2F697176DF0E9AD7E17FC5EB4B74799A5F86DE21D4EE9F42D616203646341F10EB17F66C41DF7177E21D25A42B6F612B57C016B736F7B6D6F7969347716B77045736D7113078A7B79E359619A271C3C"
   FileBin .= "72C6EAE8C3865604706BFD20F04A864D43C1EE169643255218BC767388E24AAD255FFD6A8626346B61B12A2DA8D3C364D1CA1E02377CD85AEF116855AF5E11FF005B3E8EB86C830DE02F054F86A6AAD3C7663C4389E2EAB2518E27FD75A58C8E1F1185C5A83928D3C1F0FC721795C5C9A9E0B13F59E5857C4E269C27A28A2BF483F5C0A28A2800A28A2800A28A28037FF656F8D07F649FDB37C21E35BEBA361F087F68AFECFF00855F14F7C863D3748F15BCDFF142F8C2EB2D1DBC26D6FE416775773B086C746BFF0015DFCC5A5952BFAC004100839040208E841E41FC6BF907F865F0766FDAF3F6ABF85FFB3A240F73E01F0B5C43F15FE38DCC618C31785342"
   FileBin .= "9216B1F0E4F2AE1A29BC47717769A4B22B79AB1EBF6BA8C408D3A6DBFD7BAA845545E1554281ECA001FA0AFE43FA5751C9A3C47C1F89A524B8A715C3117C434A9A8F2BCBE86265438671389927CDFDA35B2F856A3521257FECDC2E55575F6D77FC25F4DCC3E410E2CE02C5D19A5C678DE0D84B8AA8D35170795E1F173C37076331934F9966B88CAA9E22854A7349AC9F0791D7BBFAC0EA28A2BF94CFE240A28A2800AFCD9FF8297FC0DD5FE217C23D1BE2DF822CDEEBE217C02D4AEBC61656D0216B8D5FC19711C03C6BA4AA22F99318AD2C6CF5A11EE667B4D2B50B3B68A4B8D4114FE93535D55D591D55D1D4ABA300CACAC086565390558120823041C1AF6B"
   FileBin .= "87B3BC570E675976778351956CBF111AAE94DB54F114649D3C4E16ADB5F658AC3CEAE1EADB5E4A927169D9AF2F3ACAB0F9DE578CCAF12DC6962E9382A91B73D1AB192A942BD3BE9ED2856853AB0E8E5049E8D9FCC9F863C45A778B342D37C41A54A24B2D4AD9664048324128CA5C5ACE070B3DACEB25BCC071E646C54B21563BD5DD7ED6FF00B37EABFB2278F353F89DE07D2AEAFF00F66DF881AC0B9D734CD3A09277F849E28D464DAE16DA20C23F0AEA370C174B9E358E2B75787409825D5A688DABF9D58DFD96A7676DA869D7505ED8DE4293DADD5B48B2C13C320CAC91C884AB29E9C1C820A9018103FAEF0B8BC066D80C2E739455F6F95E3939519369D5"
   FileBin .= "C2D6493AD97E3229BF658CC2CA5C9522DDAAC392BD273A356137FCDD88C2E2F2EC5D7CB731A7EC71F847CB522AFECEBD37FC3C5E19B4B9F0D5D7BD092BF24B9A94F96A425156EB921E39BAF81DF18BE0EFED076893BD8F80FC4A9A478DE2B546966BAF02789D64D235B1E50F9667B5B3BEBEFB0C6C081A9DDD9CA06E895D3ADACED5F4AB1D774BBFD1F52845C586A56B359DD44782D0CE8518A360EC91321E2900DD1C8A922E1941AE8A5EC24EA50C5D3F6D82C5D0AF82C751EB57058CA53C3E2A9AED2951A93E47D27CB2E8633F6B1E4AB879FB3C4E1EAD1C4E1AAEFECF1386AB1AD426FC95484799758B92EA7F4A7A6EA361ACE9D61ABE97776FA8699AAD95"
   FileBin .= "AEA3A75FDA4AB35ADED85EC097369776D321292DBDCDBCB1CD0C884AC91BAB0241157ABF1FFF00E09B5FB475C69626FD917E286A58F14783E09EEFE0FEB57B2154F17F80D4CD7234081E5E1F52F0D44B33D95AA4B21FEC549F4E82348FC332C93FEC057F2271570E62F8573BC5E518ABD485392AB82C5A8B54B1F97D6BCB098DA2F670AD4ADCF14DBA55A35684ED5294D2FE90E1ECEF0FC419561B31A1684A71F678AC3B779E13194D2588C3545BA9539DF95B4954A6E156378CE2D9451457CE9ED851451400514514005145140057F9F77C6DFF0093DAFDBC3FECE9FE337FEADAF88F5FE8235FE7DDF1B7FE4F6BF6F0FF00B3A7F8CDFF00AB6BE23D7EDBE07F"
   FileBin .= "FC8FB34FFB00A7FF00A799F0DC69F1E49FF6178AFF00D449981451457F519F301451450014514500145145001451450015FA59FF000424FF00948D7C70FF00B359F10FFEA7FF00002BF34EBF4B3FE0849FF291AF8E1FF66B3E21FF00D4FF00E0057C17899FF245E77FF60DFF00B7C0BC27FC8DF24FFB19D2FF00D335CFEC128A28AFE2C3F5D0A28A2800A28A2800A28A2803F98FFF008388FE140F0ADEFEC7FF00B6B6976EB10F86FF0010EFFE06FC4FBC8C12F27807E27DA5C5F687A86A04FCA34FF0BEA9A6788E3B7E547F6A78BAD772BB796F07E5BFBF507A1EC47A8F6AFEB8FF00E0A2DFB38AFED63FB12FED1BF0260B317DAF78BFE1BEAD7BE0A87644CE"
   FileBin .= "7E20F845A0F18F8042BC88FE524DE2FD0746B6BA923DB2FD8E7B944652F5FC597ECEFE377F881F073C0DAF5CC8F26AB16929A16BA25DDF685D6FC3EEDA3DFBDCAB00C93DDBDA2EA0C8C3704BC43D1857F5B784D9BFF6B702D2C24E7CD89E18CCAB65D24DDE4B2DCCFDA6639749FF007638A59AD18DFE18D3A715A592FEA9F0AF35FED4E0AA7849CB9B11C399856C04937792CBF31E7C7E024FAD9627FB4E947A28C2115D97B5514515FA11F7E145145001451450015F5B7FC116BE141F8DFF00F0522F8C1F1DEFAD8DCF84BF642F85565F0FFC2F70F0116E3E297C5AFED1B7D42F6CE770CB25D699E13B4F1BE87AA450E26845E696F218A19A2377F1578AFC45"
   FileBin .= "63E11F0C7887C53A91C58787345D4F5BBBC1019A0D36CE6BB78D09EB24A22F2A25E4B48EAAA0B100FF0044DFF040AF8097BF08FF00E09FDE15F88DE26B4F27E207ED4BE31F14FED0DE2B9E58992E25B0F16DD47A77821566932EF617BE0CD1B48F13D9C436C314DE26BE78833CF35C4DF21E22E6FF00D87C079ED78CF93159CCB0FC3983B3B4B971CE589CCE696EE2B2DC256C34DAD23F5D8297C493F92F10735FEC5E07CEAB467C989CDE54387F09676972E35CB1198CE3D5C565D86AD869B5B7D7209FC4AFFB63451457F1B1FC8814514500145145001451450070FF0012FE1EF863E2CFC3FF00197C33F1A5826A7E15F1D787356F0C6BB66E17749A7EB167"
   FileBin .= "2D9CEF03B2B982EE0597ED165748BE6DA5DC50DCC2CB2C48C3F90BF097863C4FF063C71F12FF00664F1F48F278BBE08F88EE746D3EF654684788BC0B78E2F7C27E21B3490EF36977A55CD9CF120045A585EE976F21136F55FECB2BF04BFE0B1DF036E3C27A97C35FDB6FC1FA74924DE099ECFE1B7C6CB7B18499352F87BAF5E98B40D7AE923555924D035ABC934D32CA5E69A6D5F405765B5D246CFE9FFA31F1A2CB78931BC05985750CB38D5528E56EA4AD4F0BC5B828D4FEC9716DDA1FDAF4AA62325A895BDA6231397CE6F970CADFD93F439F109653C5D9878639A62234F27F111508E4D2AD3E5A581E39CBA355E4528B93B4167B42AE2B87AAA8A4EB62B1"
   FileBin .= "99554AAF9309171F8328A82D6E6DEF6DADEF2D268EE2D6EE08AE6DAE2260F14F6F3C6B2C3344E3878E58DD5D1870CAC08E0D4F5FD9528B8C9C649C6516E328B5669A7669A7AA69E8D3D99FE804A328CA519271945B8CA2D34E324ECD34F54D35669EA98514514841451450015CE78BBC4FA77833C33ADF8A3556DB63A2D84D7B2A860AF71228096D6711391E7DEDD3C3696E0F0669A30700935D1D63FC31F83F71FB5D7ED55F0C7F6738A2967F007862683E2AFC73B88B70817C25A14D6F258786AE25421924F115DDCD9696D1E7CC45D76CF53855BFB3652BA2C465F80A18ECDF38ADF57C9724C0E2B38CDEBAB73432FC05375AB4295DAE6C46264A184C242F"
   FileBin .= "7AB8AC451A714E5349EB1C56579661B31CF73FACF0DC3DC3996E333FCFF131B73D3CAB2CA4EBE229D1BB4A58BC64953C06069DEF5B1D8AC3D18DE55123F633FE090BFB37EA3F0B3E025FFC6FF1DD8F95F15FF698BFB7F881ABBDC4456EB47F03959DFC05A02090799040FA75E5C7884C0363C4BAE5BE9F709BB4B8B67EB65416D6D6F656F6F67690456F6B6B0C56F6D6F022450C10428B1C30C5120548E28E355444450A8A02AA80389EBFCBDE36E2CCC38E78AF3CE2BCCED1C56738EA9895422DBA583C2C5468E072FA17DB0F97E0A961F07416EA95085EEEEDFF008CDE22F1C669E2471B71271B67168E3788332AB8B8E1A1272A397E0A2A387CB32BC35F55"
   FileBin .= "84CAB2EA385CBF0B1B26A861A9DF5BB6514515F2A7C5851451400514514019BAC68DA4F8874AD4B42D7B4DB1D6745D62CAE74DD5749D4ED61BED3B51D3EF216B7BBB2BDB3B94920B9B6B881DE29A1951A391199594826BF0E3F683FD817E23FC0BD4B55F881FB2F595EF8F7E18DD5C4DA8EBDF04A7B89EEBC4BE1CDE5E5B8B9F025CCCD35CEB5648A0A47A68171AFA2882236FE2427CFB0FDD9A2BEAF8578C738E11C54EAE5D529D6C26279163F2BC5A955C063A106F97DAD2528CA9D6A69BF638AA13A788A2DB50A9C929C27F3DC43C3396711D0853C6C274B134399E0F1F8771862F09296FECE6E328CE94ECBDAD0AB19D1A8BE287328CA3FCBAF847E22786"
   FileBin .= "BC6265B5B1B892C35CB46962D4BC37ABC66C35DD3AE2DDDA3BA867B0988793ECD22B24D25B996389C797318A50D1AF755FB31FB417EC49F00BF68D77D5FC5DE1993C3FE3A545FB27C46F054D1F87FC610CB1205B77BDBA8E09AC75D5B70B1AC2BAED86A325B44A63B296D0B171F98BE3EFD82FF6B9F84CD35C7C39D7BC33FB44784ADC96834ED52687C1FF0010E1B651BD918EA577FD917F244B94FB41D7B50BDBC65261D2E26923B75FE82C938FB847882108AC74787B30925CF97E755630C239BB5D61338518E1674EEFDDFAFC70353A7EF1AE67F8D66BC1FC4793B9378479C60E2DF2E2F2B839E21474B3C465ADBC44676F8BEAAF15076BFBA9A8AF9A7C6B"
   FileBin .= "E119FC429A5EAFA16A973E1AF1BF856FE0D6FC1BE2BD3A696D750D1758B39A3B9B678EE6DCADC470B4F0C4ECD1B6F8658E2B9895DE2F2E4FD72FD8BBF6E1B0F8DD147F0A3E2DAD9F837F683F0F5B086F74B98C567A5FC42B4B584B3788BC28777D9DEF64B74377AA6876ECC635126A5A489B4BFB445A67E3BEBBF11352F005E2E97F183E1B7C46F84DA9190C58F16785B558B4D99C679B0D416D237D4622159927B5B3686541BE291D72473DAFEA5F0B3E22C7A7DDD8F8EB4BD1FC4DA44F15EF86BC4BA6EB31E8BE25D0F50B7916E2DAE6C9A69AC7500B0DC2C737943CB68E55135BCB6D7691DC47F43C43C2386E2DCA6960733A3539697B4A993E7F818471DF"
   FileBin .= "509D4B39C155C3CE7471997579462F11868D64E32FDFE1E70AB753F1B26E23C470EE633C5606A41CAA384331CA7152961563210B28B70AD18D4C3632945B542BBA7669BA75633A7F0FF57F457E21FECF1FF0529D77E1E3E99F0FBF6B0C6B3A36E86C340F8F5E1783FB4AD6E621F2DBA78F349D36379C5DAC4A449AB6996ED7D2F96AF75A45E8FB56B927ECE785FC57E18F1BE85A7F89FC1DE20D1FC51E1CD5A0171A6EB7A0EA36BAAE977B09C8DD6F7B652CD6F26D60C92287DF148AD1C8AB22B28FE5BE28E0CCFB84712A8E6D8492C35593583CCB0FCD572EC7456AA587C4A8A8F3DB59E1EAAA589A5B55A3076BFEFF0090713E51C4741D4CBF10BDBD34BEB3"
   FileBin .= "81AD6A78DC2C9F4AD41B6DC2FA42B5373A1537A7524741451457CA9F40145145001451450015FE7DDF1B7FE4F6BF6F0FFB3A7F8CDFFAB6BE23D7FA08D7F199F1FBFE097DFF000518D43F6A7FDA97E227C3CFD9CECBC61E0BF8A7F1E3E27F8E7C2DAE37C5AF837A426A1E1BF11F8F7C53E22D0AF174ED6BE22695AC594B71A76B909B9B4D4B4EB4B9B69D1E268BE5DCDFAEF83F9B65994E739957CCF1F84C0529E069C61531788A58784E4AB6B184AACA2A5249A7CA9B76D6D64CF8AE31A188ABFD9352861B13898D0C562255561B0F57112846786942329428C27249C9DAF6B1F01515F5B7FC3B23FE0A99FF004695A7FF00E1EDF813FF00CF528FF87647FC15"
   FileBin .= "33FE8D2B4FFF00C3DBF027FF009EA57F44FF00AF1C21FF00451E4DFF00871C2797FD3EF3FEAEAFF29ECF17FF0042DCDBFF000D78FF00FE51E7F9F667C93457D6DFF0EC8FF82A67FD1A569FFF0087B7E04FFF003D4A3FE1D91FF054CFFA34AD3FFF000F6FC09FFE7A947FAF1C21FF00451E4DFF00871C2797FD3EF3FEAEAE7B3C5FFD0B736FFC35E3FF00F9479FE7D99F24D15F5B7FC3B23FE0A99FF4695A7FFE1EDF813FFCF528FF0087647FC1533FE8D2B4FF00FC3DBF027FF9EA51FEBC7087FD147937FE1C709E5FF4FBCFFABAB9ECF17FF42DCDBFF0D78FFF00E51E7F9F667C93457D6DFF000EC8FF0082A67FD1A569FF00F87B7E04FF00F3D4A3FE1D91FF"
   FileBin .= "00054CFF00A34AD3FF00F0F6FC09FF00E7A947FAF1C21FF451E4DFF871C2797FD3EF3FEAEAE7B3C5FF00D0B736FF00C35E3FFF009479FE7D99F24D15F5B7FC3B23FE0A99FF004695A7FF00E1EDF813FF00CF528FF87647FC1533FE8D2B4FFF00C3DBF027FF009EA51FEBC7087FD147937FE1C709E5FF004FBCFF00ABAB9ECF17FF0042DCDBFF000D78FF00FE51E7F9F667C935FA59FF000424FF00948D7C70FF00B359F10FFEA7FF00002BC27FE1D91FF054CFFA34AD3FFF000F6FC09FFE7A95FA4DFF00047EFD833F6C5FD9CBF6B9F89DF19BF689F8416DF0D3C2BE24F80FAD781B4DB98FC7FF000E3C5AF77E24BDF1AFC2CD4ED2CE1B2F05F8BFC4B7D0C5FD"
   FileBin .= "95E0FD52E67BBBE86D6D92410C0924924CAABF19E2071570DE63C279BE17059E65789C4D4C3DA9D0A38EC354AB51F3C34A74E156529BD768A6ED77B6A746070F8CA99AE512FECFCC69C2963E156AD4AD80C5D1A74E9AA555394AA55A508455E515ABDDD8FE9528A28AFE4C3F580A28A2800A28A2800A28A2800232083D0F06BF83CF8DBF0A0FECBBFF000507FDB27F6748ED9AC3C29AEF8CE3FDA23E155B8511D9B783BE2AA41ABEAF65A5C670C34EF0D6B7A845E138000409B43BCDC4B0F366FEF0EBF96DFF0083843E130F01FC59FD8CFF006D3D36D445629AFEABFB30FC56D4163401F43F1745A9789BE1D4D7B2A0124761A25FFF00C2C1BD9659B7C22EA6"
   FileBin .= "D361478A59161BBFD9BC10CDFEA9C5589C92A4ED438972CC460A9C5FC3FDA582FF00852CBA5FE3A92C357C153EEF1AE3BB4D7EBFE0BE6BF55E27C464D5276A3C4596D7C2422FE1FED0C1FF00C2865F2FF1D4950AD83A7BEB8C6ADADD7E6CD14515FD29CB2FE597DCFF00CBCD7DE7F45F2CBF965F73FF002F35F7851451472CBF965F73FEBAAFBC3965FCB2FB9FF5D57DE1451451CB2FE597DCFF00AEABEF0E597F2CBEE7FD755F79E11F1B3C31AF7C5DD43E0F7ECCDE0F95E2F167ED2FF183C0DF0B6CA58C316B0D1F50D7B4F7D775A94AAB94B1D255EC26D4DCC6E89A6C976F2298D1C1FF00408F04F83F40F87BE0CF097807C29611E97E17F04786742F08F8"
   FileBin .= "6F4C88E62D3B41F0DE976BA3E916319E331DA69F676F6E87FBB18AFE40FF00E090FF000A07C7CFF82A27887E26DEDB8BCF067EC57F08A56B3988335AC7F173E30C379A1696195BF71BD7C1F2F8C1CB7CD25AEA7E1DB47451320920FEC8EBF9FBC75CDF9B31C8786A9CBDDCA32F96678D8A7B6639E7B2AF084D77A595D0CBA51BEB1788A89249B6FF0006F1B735E6CC323E1DA73F772AC03CC71904F6C7E73ECEB46334BAD3CB6860251BEB175EA2B2BDD9451457E0C7E1C14514500145145001451450015C3FC4BF87BE18F8B3F0FF00C65F0CFC69609A9F857C75E1CD5BC31AED9B85DD269FAC59CB673BC0ECAE60BB8165FB4595D22F9B6977143730B2CB12"
   FileBin .= "30EE28ADB0F88AF84C450C5616AD4A189C356A588C3D7A5270AB46BD19C6A52AB4E71B4A1529D48C6709269C6514D6A8DF0B8AC4E071586C6E0EBD5C362F075E8E2B0B89A33953AD87C4E1EA46AD0AF4AA41A953AB4AAC23529CE2D4A338A9269A47F1A7E12F0C789FE0C78E3E25FECC9E3E91E4F177C11F11DCE8DA7DECA8D08F117816F1C5EF84FC4366921DE6D2EF4AB9B39E24008B4B0BDD2EDE4226DEABE995F79FFC163BE06DC784F52F86BFB6DF83F4E9249BC133D9FC36F8D96F6309326A5F0F75EBD31681AF5D246AAB249A06B579269A6594BCD34DABE80AECB6BA48D9F035ADCC17B6D6F7969347736B77045736D710B078A7B79E359619A27190"
   FileBin .= "F1CB1BA3A30E195811D457FA91C29C57438FB84722E35A3ECD62334A33C267F42924A383E27CBE34E9E6F4B91694A18D73A19BE169ED1C2E634A9ABBA72B7FB41C13C6F87F13F81786BC43C3FB28E2F3AA15303C4F86A2946380E32CAA346967D47D9C7DDA34F317570D9F60E92D2182CDA8525EF529A53514B83E87F23460FA1FC8D7B47D089452E0FA1FC8D183E87F23401CDF8BBC4FA77833C33ADF8A3556DB63A2D84D7B2A860AF71228096D6711391E7DEDD3C3696E0F0669A30700935FB2FF00F0485FD9BF51F859F012FF00E37F8EEC7CAF8AFF00B4C5FDBFC40D5DEE222B75A3F81CACEFE02D010483CC8207D3AF2E3C42601B1E25D72DF4FB84DDA5"
   FileBin .= "C5B3F1CFE18FC1F9FF006BAFDAABE18FECE71452CFE00F0C4D07C54F8E77116E102F84B419ADE4B0F0D5C4A843249E22BBB9B2D2DA3CF988BAED9EA50AB7F66CA57FAF1B6B6B7B2B7B7B3B4822B7B5B5862B7B6B781122860821458E18628902A471471AAA222285450155401C7F3C7D2638D3FB1786F2AF0F7035B9730E24FABF10F12A83B4E8E4B86AB2FEC0CB2A59E9F5FC653AB9C62294AD2F6585CAAA59C2AEBFCA9F4C1F107FD5EE11C97C2CCB6BF266BC5DF55E2AE2FF00672B4E870EE12B4BFD57C9AB5B6FED3C7D2AF9FE2A8CB965EC705915657856D67A28A2BF878FF38828A28A0028A28A0028A28A0028A28A0028A28A00A97D6163A9DACD63A8"
   FileBin .= "D9DA5FD95CC662B8B3BDB786EAD6789B868E6B79D1E295187051D194F706BE71F16FEC67FB2AF8DE4926F10FC03F866F73336F9AF348F0D59786AFE772BB4BDC5F7869748BB99F181BE59DDB85E46D5C7D33457760B33CCB2D9BA9976618EC04DB4DCF058BAF859B6B66E542A53775D35D0E4C5603038E8F26370785C5C7A471387A55D2F45561248FCF5D4FFE096BFB14EA0CCF6FF0BB53D219D8B9FECDF883E3F280B3066D91EA3E24D4238D49040444545562A8AA026DF55F82DFB177C1BFD9EF597D67E13DCFC42F0C1B8915F52D217E20788750F0D6B3B544606AFE1CD4AE6EF47BE956306286F24B417F6A8CDF62BAB773BC7D6B457AF8BE32E2DC7E12"
   FileBin .= "A6071FC4B9E63B07562A3570B8CCD3198AA1522ACD2A94EBD6A919D9A4D7326EE93DF53CDC3F0C70EE13110C5E1323CAF0B89A6F9A9D7C360B0F42AC1F78CE942128FC98514515F347BA145145001451450014514500145145001451450014514500145145001451450014514500145145001451450014514500145154EFD2FE4B574D32E6CECEF4BC063B8BFB19B51B558D6E226B947B4B7D434B96479AD44D0C122DEC6B6F7124573245751C2F6B3805CAF04FDA5BF666F833FB5DFC21F107C0DF8F5E13FF0084C3E1DF892E34ABEBED322D4F53D12FED752D12FE1D4F49D534BD6B45BBB1D534CBFB1BC811927B4BA8C4F6EF7363749716177756D37BD2EE"
   FileBin .= "0AA1CAB3803732A9552D8E4AA9672A09E42976207058F5A5ADF0B8AC4E0713431983C456C2E2F0B5A9E230D89C3D49D1AF87AF4A4A74AB51AB4DC674EA539C54A138494A3249A69A37C36271183C450C5E12BD6C2E2B0D5615F0F89C3D49D1AF42B52929D3AB4AAD3719D3A90925284E32528B49A699F86DFF0010EA7FC12CFF00E890F8EFFF000F2FC4AFFE6828FF0088753FE0967FF4487C77FF008797E257FF003415FB93457D7FFC44AF10BFE8B7E2AFFC3EE65FFCD27D5FFC444E3DFF00A2CB89BFF0F7987FF341F86DFF0010EA7FC12CFF00E890F8EFFF000F2FC4AFFE6828FF0088753FE0967FF4487C77FF008797E257FF003415FB93451FF112BC42"
   FileBin .= "FF00A2DF8ABFF0FB997FF3487FC444E3DFFA2CB89BFF000F7987FF00341F86DFF10EA7FC12CFFE890F8EFF00F0F2FC4AFF00E6828FF88753FE0967FF004487C77FF8797E257FF3415FB93451FF00112BC42FFA2DF8ABFF000FB997FF003487FC444E3DFF00A2CB89BFF0F7987FF341F1F7EC77FB08FECCFF00B08784FC55E0DFD9B3C0D75E10D2FC6FAF5B788FC5575AA7893C41E2AD5F59D46C6C574ED3C5C6A9E22D4350B98ACB4EB4F352C74FB56B7B2825BBBEBA580DD5EDD4D37D834515F298FCC31D9A62EBE6199633138FC76264A788C6632BD4C4626BCE318C232AB5AACA752A35084609CA4DA8C6315A248F97C763B1B99E2AB63B31C5E231D8DC44"
   FileBin .= "94EBE2F175AA623115A518C60A556B5594AA4DA846314E526D46292D124145145721CA14514500145145001451450014514500715F123E1F785BE2BF807C61F0D7C6FA726ABE13F1CF87755F0CEBF60D8569B4DD5ECE5B3B86B794AB9B7BC8565F3ECAEA31E75A5DC70DCC256589187E3E5BFF00C10EBE0DD8C1159E9BFB4BFED57A7D85AC6B05958DAF8DFC2F0DB59DAC436C16D0430F83628A3860882C71A471A22AA80AA0703F6E28AFB9E12F12B8EB8170F8CC2709F1263F25C2E615A96231986C3AC3D5A15B114612A74EBBA58AA15E9C6AAA7274DD4846329C146337250828FE91C0DE2F7895E1AE171F81E07E2ECCF87F059A6228E2F1F84C2AC2D6C3"
   FileBin .= "6231587A72A54B10E86330F89A70AF1A52749D5A5184E74D421394A34E9A8FE26FFC3913E14FFD1D1FED65FF0085E786FF00F991A3FE1C89F0A7FE8E8FF6B2FF00C2F3C37FFCC8D7ED9515F5BFF1309E32FF00D175997FE12E55E5FF0052FF002FC5F73EE7FE26A3E901FF00472F38FF00C23C97CBFEA59E5FD595BF137FE1C89F0A7FE8E8FF006B2FFC2F3C37FF00CC8D1FF0E44F853FF4747FB597FE179E1BFF00E646BF6CA8A3FE2613C65FFA2EB32FFC25CABCBFEA5FE5F8BEE1FF001351F480FF00A3979C7FE11E4BE5FF0052CF2FEACADF14FEC77FB0AFC29FD8C6D3C732781F5CF1AF8DBC4FF116FF004DBBF14F8DBE226A5A6EAFE26BCB5D1A19E2D2"
   FileBin .= "B498EEF4ED2B498A2D3ACDAEEF6E36B432DCDC5CDD3BDC5CC91C36915BFDAD4515F98E7FC419D714E6D8BCF788731C4E6D9BE3E54E58BC762E4A55AB3A3469E1E8C5F2C6308428D0A54E8D2A74E30A74E953842118C6291F8EF13F14F10F1A6798EE25E29CDB179E67B99CA94B1D99E3A6A788AFF57C3D2C2E1E2F96308429D0C350A387A34A9C214A951A50A74E1184524514515E39E0051451400514514005145140051451400514514005145140051451400514514005145140051451400514514005145140051451400514514005145140051451400514514005145140051451400514514005145140051451400514514005145140051451400514514005"
   FileBin .= "145140051451400514514005145140051451400514514005145140051451400514514005145140051451400514514005145140051451400514514005145140051451400514514005145140051451400514514005145140051451400514514005145140051451400514514005145140051451400514514005145140051451400514514005145140051451400514514005145140051451400514514005145140051451400514514005145140051451400514514005145140051451400514514005145140051451400514514005145140051451400514514005145140051451400514514005145140051451400514537CC4DFE5EF4F336EEF2F70DFB738DDB73BB6"
   FileBin .= "E78CE319E3340D26F64DD95DDBA2EFE83A8A28A04145145001451450014514500145145001451450014514500145145001457857ED33F1375FF835F023E257C4EF0B5A6917DE20F07787DB55D2ED75EB7BCBAD226B9179696E12FEDEC2FF004CBC961D93B9DB6F7F6CFB829F300041FC7BD07FE0A37FB6DF88F48B0D734CF007ECF8F61A8C3E7DB34BA3F8D6291A32C532F1B7C4ADC872ADC1EC33DC57E3DE20F8E1C13E1AE7782E1FE21867D5B33C7E59FDB1428E4D92E23348AC0FD6AA60FDA559D19254DFB7A528F2B57B72BBEA7ECDE1CF811C75E286498FE21E1A970FD1CAF2DCD2393622B6759E6172994B1F2C2431AA9518574DD55F57A919B94744EE"
   FileBin .= "BA1FBF3457E0EFFC3C03F6E9FF00A27DFB3C7FE0B3C67FFCF2BFCE0FB643FF000501FDBA4027FE15F7ECF18033FF0020CF1A7E3FF352BFC7A1F6CFC47FC4D77863FF00401C75FF0088863FFF00933EF7FE2513C55FFA0EE02FFC4CB2EFFE40FDE2A2BE1CFD813F696F1E7ED4DF087C4FE3EF885A5F85349D6745F891AAF83ED6DBC1F61AB69DA6BE9963E18F08EB514D710EB3AE6BF74F7CD75AFDE4724B1DE4501B78ED916D92449659BEE3AFDD78478AB29E37E1AC9B8B3229D7A993E7B83863B2F9E2684B0D88961E729C22EAD09B72A53E684AF0936D1F81719709671C09C519DF07F1053A14B3AE1FC754CBF31A785AF0C561E189A718CA4A96220942AC"
   FileBin .= "2D38DA715661451457D19F321451450014514500145145001451450014514500145145001451450014514500145145001451450014514500145145001451599ACEB3A4F87B49D475ED7B51B2D1F45D1ECAE751D5354D46E62B3B0D3EC2CE279EEAF2F2EA774860B7821479659657544452CC46282E9D3A95AA4295284EAD5AB38D3A74E9C653A952A4E4A30842114E539CE4D46318A72949A4936C359D6749F0EE93A96BDAF6A565A3E8BA3D95CEA5AA6ABA95CC56761A7D859C4F3DD5E5E5D4EE90C16F0428F2CB2CAEA888A5988C57C8ADFF000509FD8E54907E37E81C120E348F1530241C65597412AC38382A483D41C75FCBAFDA63F698F11FED8DE23B8F"
   FileBin .= "05F82EE353F0E7ECD3E1CD4F6DE5DA89F4FD53E2C6A9A7CE192E2E1584735BF87A099164D3B4E91418D95352D4A3FED636567A1F9B41E0FF0009DB430DBC3E1AD0921822486253A4D8B958E350880B3C0CEC42A8059D9989C9624924D68B7D5FF5D9AFF83E4ACDFF0071F04FD14724A79061719E28E65C4980E24CC547151E1BE1CAF95E16AE43829C232A1473EC4E63976669E718852556B65B87A549E5749429632ACB193AD86C27EC6FFC3C2BF638FF00A2DFA0FF00E09FC57FFCA0A3FE1E15FB1C7FD16FD07FF04FE2BFFE5057E3BFFC22BE18FF00A17341FF00C13E9FFF00C8F47FC22BE18FFA17341FFC13E9FF00FC8F45D765F8FF00F25EBFD3D3EBBF"
   FileBin .= "E256BC1DFF00A197895FF878E18FFE85BD7FA5AFEC47FC3C2BF638FF00A2DFA0FF00E09FC57FFCA0AF58F84FFB4CFC09F8E3A8EA5A3FC2CF891A1F8B756D26D23BFBFD2ED56FACB518AC649441F6C8ECB55B3B1B9BAB58A668E1B8B8B58E786D659EDE3B8789AE60127E0FFF00C22BE18FFA17341FFC13E9FF00FC8F5CBEA9E15D63C3DAE687F117E11EA03C0BF12BC1D38BED0754D26386CADEF420613697A9DBA462D6EAD2FA2796D678EEA19ADAE6DE79ACEFA29ECA792302E57BAB79ABE9B77959F5DEDEAAEEDCB8DFA2878638DC1E2B0D91F127196539CD5A138E578ECFF1792E619253C7249D08669432EC8B038E860AB4D7B1AD8AC3569D4C246A2C4F"
   FileBin .= "D5F131A52A153FA7EA2BE2EFD8FF00F6C0F0EFED2BE1DB9D1B58B687C23F197C230243E3AF02CCCD133344C96EFE23F0EA5C3B4D77A05E4EC8248CBCD75A2DD4D1D8DF493C3369BA96A9F68D26ADFD7F5FE69E8F53F85F8AF8533FE08CFF0031E19E26CBAB6579CE575BD96270D56D28CA324A7471386AD072A38AC162A8CA188C1E330F3A987C561EA53AD46A4E134C28A28A47CE85145140051451400514514005145140051457C37FB78FEDE3F09BF60FF84C7C6FE372FE26F1E789A4B8D1BE127C24D16E13FE12BF893E2C2B1AC163630247733D8685633DCDA49E22F1149693DB6956D3C104106A1AD6A1A3E8FA97263F1F83CB30988C7E3F114F0B83C2"
   FileBin .= "D3756BD7AAED0A70565D137294A4D46108A94EA4E51842329C927F43C27C27C47C73C47947097096518CCF788B3DC653C0655956029FB4C462B1152EFAB8D3A3468D38CEBE2B155E74F0D84C353AB89C4D5A542954A913F6F1FDBC7E137EC1FF00098F8DFC6E5FC4DE3CF134971A37C24F849A2DC27FC257F127C58563582C6C6048EE67B0D0AC67B9B493C45E2292D27B6D2ADA7820820D435AD4347D1F52FE476FFE2D7EDD3AAFC6C5FDBB9BE2EDE597ED4105D8BAD37E1D43338F85B65F0CD5DE71F037FB0DEECC0FA04D03B7DA2296F5966D5D9B549B526F14B9F18A5CBBBCF8B1F1EBE2C6B3FB507ED43ACC7E26F8C9E268FC9F0FF87E12E7C29F07FC27"
   FileBin .= "BA6934DF05F82F4D926B886C16C21B8952EAE9259EE65B99EF6E6E2FB50D5350D6357D57D0ABF9AF89F8AB31E29C6C2B53AB8BCB32CC15555729C351AB2A18A55A9BBD3CCF173A6D7FB5DD7361E85E54F0906E2D4EACEA49FF00B65E077809C1BE0270CE2B2BC565FC3FC75C73C4B809E5FE21E7B996030F9B645532CC5412C7702F0ED0C5D269F0F59BA59C66D18D1C6E7F8A846AD29E1B0187C1515FD3DFFC13F3FE0A07F0B7F6F5F85B2788FC3919F077C57F071B7D27E30FC1ED5EE31E24F01F890078659238A64B7B9D4FC2FA95C5BDCB685AEADB44B3AC53585FC363ACD8EA1A7DAFDFB5FC1D4D0FC52F839F14B41FDA73F663D7C783BE397839717966"
   FileBin .= "723C39F14BC360C4751F05F8CF4F12C16FA95AEA76F0476E925C490B168AD196EEC6FEC747D6347FEB23FE09F9FF000503F85BFB7AFC2D93C47E1C8CF83BE2BF838DBE93F187E0F6AF718F12780FC4803C32C91C5325BDCEA7E17D4AE2DEE5B42D756DA259D629AC2FE1B1D66C750D3ED7F53E06E3959D28E4D9CCA9D1CF68D36E9554953A19C50A69396230D1F8618AA71D719845F0BBD7A09D0728D1FE09FA53FD1625E194AB7893E1B51C6665E146658C853C6E0AA4E78CCD7C38CD71936A964D9CD569D5C56438AAADD3E1DE22A8AD5D72E579A4A9E6B4E9D4CC7EFDA28A2BF4C3F88828A28A0028A28A0028A28A0028A28A0028A28A0028A28A00F913F6"
   FileBin .= "F4FF009341F8EFFF006263FF00E9CF4EAFC38F83DFF24D3C21FF0060B1FF00A3E6AFDC7FDBD3FE4D07E3BFFD898FFF00A73D3ABF0E3E0F7FC934F087FD82C7FE8F9ABFCF9FA4F7FC9E4E1EFF00B36F3FFD697127FA37F450FF009331C4BFF67361FF00ACB618F4AA6BFDC6FF0075BF91A7535FEE37FBADFC8D7E292D9FA3FC8FDFA3BAF55F99F697FC11C7FE4DABC7DFF65D3C47FF00A80FC35AFD68AFC97FF8238FFC9B578FBFECBA788FFF00501F86B5FAD15FE80FD1AFFE4C4F863FF64CE1FF00F523127F9C1F4A1FF9482F15FF00ECACC5FF00E99C38514515FB81F828514514005145140051451400514514005145140051451400514514005145140051"
   FileBin .= "4514005145140051451400514552D4750B1D274FBED5753BB82C34CD32CEE6FF0050BDBA9121B5B3B2B485EE2EAEAE6690848A0B78239259A472AA91A3331001A37D8A8C653946108CA739C946108A7294A526946318A4DCA526D24926DB6925721D6759D27C3DA4EA3AF6BDA8D968FA2E8F6573A8EA9AA6A373159D869F616713CF757979753BA4305BC10A3CB2CB2BAA2229662315F801FB4C7ED31E23FDB1BC4771E0BF05DC6A7E1CFD9A7C39A9EDBCBB513E9FAA7C58D534F9C325C5C2B08E6B7F0F41322C9A769D22831B2A6A5A947FDAC6CACF433F698FDA63C47FB63788EE3C17E0BB9D4FC39FB357873530B7976A27D3F54F8B1AA69F3864B8B85611"
   FileBin .= "CD6FE1E82645974ED3A450D1958F52D4A3FED636567A1F1D616165A5D95B69DA75B436763670A416D6B0208E28628C61511578000E49392C4966258926B6F5FEBFAF3F4F8BFD19F03BC0FA3E19D1C2719718E129623C45C453862325C9B110855A3C0B46AC54A963B1F4A57854E2EA90929E1E8494A1C3B192A9513CE1C63969616165A5D95B69DA75B436763670A416D6B0208E28628C61511578000E49392C4966258926DD14549FBBCE73A9294E7294E739394E739394A5293BCA52936DCA4DB6DB6DB6DDDB0A28A282428A28A00E0B5FD03C45A6788B45F89DF0C75A9FC23F14FC233A5E689AE59B2C4BA82C4ACAFA56AA8CAD05DD9DDC0D259CB15DC735"
   FileBin .= "ADC5ACD3595EC33594D2463F693F63FF00DB03C3BFB4AF876E746D62DA1F08FC65F08C090F8EBC0B33344CCD1325BBF88FC3A970ED35DE81793B209232F35D68B75347637D24F0CDA6EA5AA7E4C5705AFE81E22D33C45A2FC4EF863AD4FE11F8A7E119D2F344D72CD9625D41625657D2B55465682EECEEE0692CE58AEE39AD6E2D669ACAF619ACA6923149DF47F27DB6F34B656D74B68FA38FC7788FE1C641E2E6414B25CE6AD1CAF88B2BA338709716CE9B94B2E949B9AC933A74E32AD8AE1BC556936ECAA62326C45496370519D29E2F098AFE9D68AF8D3F63CFDADF45FDA67C2B7D63AAE9E3C29F173C1496D69F107C1B22CA91C73396862D7F42698BC93E"
   FileBin .= "85A94D149B617925BBD26E49B1BB92E217D3F52D4FECBA4D58FF003078AB8573EE09E20CCF8638972FAB9667594D7F618BC2D57192F7A11AB431142B41CA9627098BA1529627078BA139D0C561AAD2AF4673A7523265145148F9E0A28A2800A28A2800A28AF86FF6F1FDBC7E137EC1FF00098F8DFC6E5FC4DE3CF134971A37C24F849A2DC27FC257F127C58563582C6C6048EE67B0D0AC67B9B493C45E2292D27B6D2ADA7820820D435AD4347D1F52E4C7E3F0796613118FC7E229E170785A6EAD7AF55DA14E0ACBA26E52949A8C211529D49CA3084653924FE8784F84F88F8E788F28E12E12CA3199EF1167B8CA780CAB2AC053F6988C5622A5DF571A7468D1"
   FileBin .= "A719D7C562ABCE9E1B0986A7571389AB4A852A95227EDE3FB78FC26FD83FE131F1BF8DCBF89BC79E2692E346F849F09345B84FF84AFE24F8B0AC6B058D8C091DCCF61A158CF73692788BC4525A4F6DA55B4F041041A86B5A868FA3EA5FC94DDDE7C58F8F5F16359FDA83F6A1D663F137C64F1347E4F87FC3F0973E14F83FE13DD349A6F82FC17A6C935C4360B610DC4A9757492CF732DCCF7B73717DA86A9A86B1ABEAA5DDE7C58F8F5F16359FDA83F6A1D663F137C64F1347E4F87FC3F0973E14F83FE13DD349A6F82FC17A6C935C4360B610DC4A9757492CF732DCCF7B73717DA86A9A86B1ABEABE855FCD5C51C518CE2DC5C67523530B93616A73E5D974F4"
   FileBin .= "9D59AD239866115A4B1325774283BC3070959735694E67FB69E05F817C39F47BE1CAD84C256C1E7BE25E7B83586E34E35C32F6987C161EA724EB707F07D79C554A39251A8A30CDF368C69E2788F134D36A96554B0B856514515F3E7EB615E65343F14BE0E7C52D07F69CFD98F5F1E0EF8E5E0E5C5E599C8F0E7C52F0D8311D47C17E33D3C4B05BEA56BA9DBC11DBA4971242C5A2B465BBB1BFB1D1F58D1FD368A89C1C9D39C2A54A35A8D4856C3E228CDD3AF87AF4E5CD4EB51A91F7A9D48495D496EAF192716D3E9C3E2234A38AC3E230B83CCB2DCCB0788CB737CA332C3C31995673956320E96372CCCF05553A58AC162A9370A94E6AF17CB5694A9D6A74EA"
   FileBin .= "47FA7BFF00827E7FC140FE16FEDEBF0B64F11F87233E0EF8AFE0E36FA4FC61F83DABDC63C49E03F1200F0CB24714C96F73A9F85F52B8B7B96D0B5D5B6896758A6B0BF86C759B1D434FB5FBF6BF83A9A1F8A5F073E29683FB4E7ECC7AF8F077C72F072E2F2CCE47873E29786C188EA3E0BF19E9E2582DF52B5D4EDE08EDD24B892162D15A32DDD8DFD8E8FAC68FFD647FC13F3FE0A07F0B7F6F5F85B2788FC3919F077C57F071B7D27E30FC1ED5EE31E24F01F890078659238A64B7B9D4FC2FA95C5BDCB685AEADB44B3AC53585FC363ACD8EA1A7DAFEEFC0DC72B3A51C9B39953A39ED1A6DD2AA92A74338A14D272C461A3F0C3154E3AE3308BE177AF413A0E5"
   FileBin .= "1A3FE51FD29FE8B12F0CA55BC49F0DA8E3332F0A332C6429E37055273C666BE1C66B8C9B54B26CE6AB4EAE2B21C5556E9F0EF115456AEB972BCD254F35A74EA663F7ED14515FA61FC441451450014514500145145001457CEBF1A3F6B0F807FB3D6ADA3687F17BC74FE13D53C41A7CDAAE936ABE16F18EBDF6AB082E0DA4B399BC35E1FD62DE02B700C7E55CCB0CCDF796329F3578C7FC3CCFF627FF00A2C92FFE1B8F8ADFFCC3D7C2E6BE28786B9166189CA73BF10382B27CD30728C31796E67C5192E031D859CE9C2AC2388C262B1B4ABD194E954A7522AA538B9539C66AF1699F7D93F853E28710E5D86CE320F0E38F33BCA71B19CB079A651C23C4198E5D"
   FileBin .= "8B8D3AB3A152586C6E0F2FAD86AF1A75A9D4A53952AB251A94EA424D4A124BEF1A2BE0EFF8799FEC4FFF0045925FFC371F15BFF987A3FE1E67FB13FF00D16497FF000DC7C56FFE61EBCEFF0088CFE107FD1D3F0EFF00F133E1DFFE78F9FE7D99E9FF00C410F1A3FE8D1789DFF881F14FFF003ABCFF003ECCEDBF6F4FF9341F8EFF00F6263FFE9CF4EAFC38F83DFF0024D3C21FF60B1FFA3E6AFD06FDADBF6F7FD947E27FECE5F163C03E07F8A326B5E2CF137865B4FD134B3E06F88DA68BDBCFB7D94DE57DBB56F095869D6DFBB8A46F32EEF208BE5DBE6062A0FE7CFC1EFF009269E10FFB058FFD1F357F12F8FDC55C31C59E2DE4B8CE17E21C9388F0986F0F"
   FileBin .= "6586C462B22CD7059B61E8621F10D7ABEC2B56C0D7AF4E9D6F673854F653929F24A32E5B34DFF75FD1CF8478AF83FC22CFB05C5BC31C41C2F8CC5788D0C56170BC439366392E2713865C354293C450A19961B0D56B5155212A6EAD38CA0AA465072E68B4BD2A9AFF0071BFDD6FE469D4D7FB8DFEEB7F235F99CB67E8FF0023F5D8EEBD57E67DA5FF000471FF00936AF1F7FD974F11FF00EA03F0D6BF5A2BF007FE09ADFB5FFECF1FB3F7C10F17783BE2DF8FDFC2BE23D53E2B6B5E26B1D3D7C27E36D784FA25DF847C11A5DBDEFDAFC37E1CD62CA3F32FB47D461FB3CD72974BF6712BC2B0CD04927E86FF00C3CCFF00627FFA2C92FF00E1B8F8ADFF00CC3D7F"
   FileBin .= "627D1FBC53F0CB26F063C3BCAB37F10F8232ACCF03C3D4286372FCC78A724C1637095957AEDD2C4E17138EA75E8544A516E15611924D36AC7F117D237C24F1573BF1CBC4CCDB25F0D38FF37CAF1FC4F8AC460732CB383B8871F80C650952A0A35F0B8CC2E5D570F88A3269A8D4A552706D4AD2D1DBEF1A2BE0EFF8799FEC4FFF0045925FFC371F15BFF987A3FE1E67FB13FF00D16497FF000DC7C56FFE61EBF62FF88CFE107FD1D3F0EFFF00133E1DFF00E78F9FE7D99F8A7FC410F1A3FE8D1789DFF881F14FFF003ABCFF003ECCFBC68AF923E19FEDD1FB2DFC61F1C689F0E3E1DFC4C7F1078CBC467511A368EDE0AF883A48BC3A56937FAE5F83A86B9E15D3"
   FileBin .= "74BB7F234BD36F6E47DAAF6112F93E443E64F245149F5BD7D7E41C4DC37C5783A998F0C67F937116028E22783AB8DC8F33C166B84A58BA74E9569E16A623035ABD28622146BD0AB3A329AA91A75A94DC546A45BF8CE22E15E27E11C6D3CB78AF8733DE18CC6B61618DA380E20CA31F93636AE0EAD4AD469E2E9E1731C3E1ABCF0D52B61EBD28578C1D2955A15A9C64E74E6A2514515EE1E08514514005145140051451400515F9D5FB72FC58F1CF86B5EF849F0DBE1CF8C354F076ADE269BC43E20F10EA7A332477B0E8DA4DB43069F13332EE6B7BA9DF546F2D658D5E7B08449B8ECC7C7DFF000967ED05FF004717F10BFEFA8FFF00926BF9538FBE95790703"
   FileBin .= "F19E7DC194782B89F89313C39570585CC731CAF179061B031C6E332DC1E68F094BFB4B33C2D7A9530D86C7E1E38892A4A10ACE74AEDC256F42965F3AB4E151D58414D37152536EC9DAFA45EF676F45DCFDD6A2BF0A7FE12CFDA0BFE8E2FE217FDF51FF00F24D1FF0967ED05FF4717F10BFEFA8FF00F926BE47FE274F2AFF00A357C6DFF874E11F2FFA9DF9FE1EB6D3FB325FF3FE97FE0353FF0091F5FE9E9FBAD457E14FFC259FB417FD1C5FC42FFBEA3FFE49A3FE12CFDA0BFE8E2FE217FDF51FFF0024D1FF0013A7957FD1ABE36FFC3A708F97FD4EFCFF000F5B1FD992FF009FF4BFF01A9FFC8FAFF4F4FDD6A2BF0A7FE12CFDA0BFE8E2FE217FDF51FF00F2"
   FileBin .= "4D63F883C7DFB4668DA26A9AB59FED05E3FBCB8D36CA6BE4B59248D1265B55334AA584B29CF948E40F2DF7300BB7935957FA6CE4B86A357115FC2CE388D1A14A75AACA398F09D494695283A95251A70CE9CE6E30526A114E52694629B7642CAE6DA4ABD2BBD17BB53776FEEFF5F3D3F7BA8AF38F83FE355F88DF0B7E1FF8E77A493789FC27A26AB7DB02AAC5AA4F6308D56DF6A0080DAEA4B776CE17E5568885E057A3D7F6765399E133ACAB2DCE70153DAE0736C060F32C15556FDE6171D87A78AC3CF46D7BD4AAC25A36B5DCF32517194A2F4716E2D7669D9FE21451457A020AF27F8F5FF243BE31FF00D92DF1FF00FEA2BAAD7AC5793FC7AFF921DF18FF00"
   FileBin .= "EC96F8FF00FF00515D569C775EABF33DBE19FF00928F87FF00EC77957FEA7E1CFE747E0D0C7C31F087FD83E53F9DF5D9AF4EAF32F835FF0024C7C21FF60E97FF004BAEEBD3691FEC6F10FF00C8FF003BFF00B1B663FF00A975828A28A0F1C28A28A0028A28A0028A28A00F7EFF008275003F6B1F8E580067E15F86F3EFFF00134D23AD7EDD57E22FFC13AFFE4EC7E397FD92BF0DFF00E9D348AFDBAAA97D9FF0AFD4FE01FA577FC9DFC4FF00D923C09FFAC9E5414514549FCDA1451450014515E41F1FFE25EAFF00067E087C59F8B1A0F82B57F88DAD7C39F0078A7C65A5F81341137F6BF8B2FBC3FA45D6A56FA1D89B6B4BFB959AFE4B75877DB58DF5CA2333"
   FileBin .= "41657532A412675AAC2851AB5EAB6A9D1A73AB51C6329B50A71739B508294E4D4536A318B93D926F43B72DCBF159B66380CAB030854C6E678DC2E5F83A752B51C3D3A98AC657A786C3C2788C454A587A10956A908CAB57AB4E8D28B73AB52108CA4BE7AFDBC7F6F1F84DFB07FC263E37F1B97F1378F3C4D25C68DF093E1268B709FF00095FC49F16158D60B1B18123B99EC342B19EE6D24F11788A4B49EDB4AB69E08208350D6B50D1F47D4BF929BBBCF8B1F1EBE2C6B3FB507ED43ACC7E26F8C9E268FC9F0FF87E12E7C29F07FC27BA6934DF05F82F4D926B886C16C21B8952EAE9259EE65B99EF6E6E2FB50D5350D6357D5795F0CFC43F17FED77E3ED5BF6C"
   FileBin .= "2F8E3E32B1F883F13BC532DCE9BA0693A79997C2BF06BC3B6B34C2CFC07E14D16E9E46D1DF4F82E59A79650F7773F6C9B5292F352BCD5F52D7358F6CAFE61E26E2BC4F1862A15BDFA191E1E7ED32BC0392E6AF25A4731C7A8B7196226AEE850BCA9E0E12B272AF2A933FDCEF04FC03C93E8E191E2F2A8FB0CD7C53CDF0DF53E3AE2E8D392865B4A7CB3AFC1BC272AD0856C3E4D46A4630CDF35E4A58AE23C4D34DAA59552C2E199451457827EAA145145001451450015E65343F14BE0E7C52D07F69CFD98F5F1E0EF8E5E0E5C5E599C8F0E7C52F0D8311D47C17E33D3C4B05BEA56BA9DBC11DBA4971242C5A2B465BBB1BFB1D1F58D1FD368A89C1C9D39C2A54"
   FileBin .= "A35A8D4856C3E228CDD3AF87AF4E5CD4EB51A91F7A9D48495D496EAF192716D3E9C3E2234A38AC3E230B83CCB2DCCB0788CB737CA332C3C31995673956320E96372CCCF05553A58AC162A9370A94E6AF17CB5694A9D6A74EA47FA7BFF827E7FC140FE16FEDEBF0B64F11F87233E0EF8AFE0E36FA4FC61F83DABDC63C49E03F1200F0CB24714C96F73A9F85F52B8B7B96D0B5D5B6896758A6B0BF86C759B1D434FB5FBF6BF811F1BF8BBC55FB2EF8DB48FDB03E08F8DED3E19FC5BF034905BDF0BAF31BC39F157439E4885DF80FC57A3C0C9FDB8BAB5BDBAC31A051314B686E0DCE9F71A5E99ADE89FDB87ECB1F18F5FF00DA0BF678F845F1A3C53F0F75AF857E"
   FileBin .= "20F88DE0BD2FC4BAAF80F5F120D4741B9BC570515A686DAE24D3AFD234D57469EEED2D2F27D1EFAC26BBB3B5B9796DE2FDF38078CEAF10D3AF956671B67596D0A556BD7A54DC70D8FC2CE5ECE9E3128AE5C3622534E388C34B9573A7570FCD49CA347FC96FA5B7D1AB03E0FE2F2BE3DE08AEE7E18F1B6698DC0659956618A53CEB84F3FC3508E3B1DC395255A51AF9D6514B0F5635F29CF68C6ACD61650C0E73EC731A74EB661EFD451457E8E7F1785145140051451401F83FFF000547821B9FDA6BF67182E218E7824F0B6A09243346B245229F104C0ABC6E0A3A9F460457867FC233E1CFFA0068BFF82CB2FF00E31EC3F2AF78FF0082A0FF00C9D07ECDDFF6"
   FileBin .= "2C5FFF00EA433579157F95FE25D1A357C65F16DD5A34AA35C4D96A4E74E13697FAAB90BB2724DDAE7FAD7E13D5AB4FC11F07A30AB5209F0BE6EED09CA2AEF8D789F5B45A57B24AFBE88C4FF8467C39FF00400D17FF0005965FFC63D87E547FC233E1CFFA0068BFF82CB2FF00E31EC3F2ADBA2BE5FEA984FF00A06C3FFE09A7FF00C89F67F58C47FCFF00ADFF008367FF00C9189FF08CF873FE801A2FFE0B2CBFF8C7B0FCAB5A0B782D614B7B6862B78225DB1C304691451AF5DA91A05455C9E8A00A968AB850A349B74A8D2A6DAB370A70836B7B37149B57D6C4CEAD5A8929D4A9349DD29CE5249F749B7661451456A66627FC233E1CFF00A0068BFF0082CB2F"
   FileBin .= "FE31EC3F2A3FE119F0E7FD00345FFC16597FF18F61F956DD15CFF54C27FD0361FF00F04D3FFE44DBEB188FF9FF005BFF0006CFFF0092313FE119F0E7FD00345FFC16597FF18F61F951FF0008CF873FE801A2FF00E0B2CBFF008C7B0FCAB6E8A3EA984FFA06C3FF00E09A7FFC887D6311FF003FEB7FE0D9FF00F2466FECCF6165A7FF00C1453F67F86C2CED6CA16F0CF8D2468AD208ADE3690FC3FF008AAAD218E25442E55514B11B885504E1463FA4AAFE703F672FF948C7ECFBFF0062B78CFF00F500F8AD5FD1FD7F607D0F2318705F8811846318C7C53CE546314A314970CF095924AC92F248FE2AFA6B394B8EBC3994A4E527E11646DCA4DB6DBE2CE35DDB"
   FileBin .= "D58514515FD707F1B05145140051451400514567EADA9D9E8BA5EA5AC6A128B7B0D26C2F352BE9C8C886D2C6DE4BAB9948EE23862773EC2B3AD569E1E955AF5A71A7468D39D5AB526D4634E9D38B9CE7293B2518C62E526DA4926D8D26DA4B76D25EACFC63F8FDE21FF84E7F6B1F8897EB279FA7FC39F0EE81E00D39FF00816E5E33ABEAA106D1892DB55BCD62D242724AE09386455E6EBCFBE1EDFDE788EDFC4BE3BD4D48D4FE20F8C7C49E2DBB2C4170DA96A73B18C901728938B868F8036C995014A8AF41AFF14679CD4E27CCB3FE2DADCDED38BB88B3CE258F3DF9A384CDB31AF88CB28B4F54B0D953C0E1A0A5AA8518A7ADCFA751508C29ADA9C230F9C5"
   FileBin .= "24DFCE577E7B85145154014514500151CD0C7710CB6F32078678A486543D1E3954A3A1F665620FB1A928A528C651946494A324E328B574E2D59A6BAA69D9A03EDAFF008278789E4BEF82BABF812F262D7FF0C3C75E22F0D88A439906977F7035CB2B827AF952DF5FEAD0419E025A6D402354AFBDABF247F627F10FFC22DFB45FC45F05CB279563F11FC15A6F8A6C5189D92EB1E17BAFB2490C408C09A5B4D4359BC976F2C96C0B9C2C42BF5BABFD27FA2B710BCF7C14E16C255A8EA63384AA665C158A526DCA11E1BC755C1659CCDFBDFBDC8D6578857D796B2DD599E26610E4C5547D2A28D55FF6FC537FF937320A28A2BFA28E20AF27F8F5FF00243BE31FFD"
   FileBin .= "92DF1FFF00EA2BAAD7AC5793FC7AFF00921DF18FFEC96F8FFF00F515D569C775EABF33DBE19FF928F87FFEC77957FEA7E1CFE74BE0D7FC931F087FD83A5FFD2EBBAF4DAF32F835FF0024C7C21FF60E97FF004BAEEBD3691FEC6F10FF00C8FF003BFF00B1B663FF00A975828A28A0F1C28A28A0028A28A0028A28A00F7EFF008275FF00C9D8FC72FF00B257E1BFFD3A6915FB755F88BFF04EBFF93B1F8E5FF64AFC37FF00A74D22BF6EAAA5F67FC2BF53F807E95DFF00277F13FF00648F027FEB2795051451527F368514514005040208201046083C820F50477068A2803F98DFF829E7FC130FC51F09BC51E29FDB63F626F0B35F5BDF35C6B9FB477ECE3A1C0C"
   FileBin .= "967E2BB34696EF54F88DF0E74BB58DC5AF89AD43DCEA1AE685A7DB3C97B235CEAFA3DADC5D5C6B3A36BBF98BF0FF00E207863E267862C3C59E13BF5BDD36F576491B854BDD36F5154DCE99A9DB06736B7F6A5D44B1166492368AE6DA59ED27B7B897FBAC20104100823041E4107A823B835FCC6FFC14F3FE0987E28F84DE28F14FEDB1FB137859AFADEF9AE35CFDA3BF671D0E064B3F15D9A34B77AA7C46F873A5DAC6E2D7C4D6A1EE750D7342D3ED9E4BD91AE757D1ED6E2EAE359D1B5DFC3B8EB8167839E2388387F0F29E1E729D7CDF28A10BCA126DCAAE6397528AD65BCF198382FDE7BD88C3C7DAFB4A757FD4DFA2AFD2AB0DC5186CA3C21F17F37A586C"
   FileBin .= "EB0D4B0F957877E21E6B8850A58AA5051A380E0CE33C7D69251A514A186E1BE24C4CEF827ECB29CDAABCBDE131580FCF9A2B8BF87FF103C31F133C3161E2CF09DFADEE9B7ABB248DC2A5EE9B7A8AA6E74CD4ED8339B5BFB52EA2588B32491B45736D2CF693DBDC4BDA57E5B09C2AC23529CA3384E2A50945DE328BD534D6E99FDD78AC2E270389AF83C650AB86C561AACE8D7A15A0E15695583E594271959A69AF46ACD369A614514559CE1451450015C878EFC77E19F871E1AD43C57E2BD412C34AB04C71B5EEAFAE9D58DBE9DA75B9656BBBFBB652B040A40C079A678ADE29A68CF1DF8EFC33F0E3C35A878AFC57A82586956098E36BDD5F5D3AB1B7D3B4EB"
   FileBin .= "72CAD777F76CA5608148180F34CF15BC534D1FE8BFFC1327FE0993E27F8FFE27F0B7EDA5FB68F85A4D3BC1BA74906BBFB397ECE7AEC0CD6D1DB3325CE99F123E24E99731AADD4F74A96F7DA16837D6EA6FCADBEA9AA5BC3A5C3A5E97375E5996E619E6614F29CAA9C6A62EA4554AD5A6A4F0D97E19C94658BC5C959A8A775468C5AAB89A8BD9D3D14E70F0B8D38D3843C2DE10C67883E20E36A61387F0756784CB32CC24E9ACF38C33C8D35568F0EF0F51AB753AD38B8D4CCB33A91960B24C149E2F16E53961B0D893FE0993FF0004C9F13FC7FF0013F85BF6D2FDB47C2D269DE0DD3A4835DFD9CBF673D76066B68ED9992E74CF891F1274CB98D56EA7BA54B7"
   FileBin .= "BED0B41BEB7537E56DF54D52DE1D2E1D2F4B9BFA8F550A02A80AAA00000C0007000038000A154280AA02AA8000030001C0000E000296BFA5386F86F2FE18CBE382C12752AD46AAE371B5545E271D8971519D7AD2495969CB468C6D4A853B53A6924DBFF137C6CF1B38BFC73E2FA9C4FC4F529E130383A52CBF85F85F013A8B23E13C8E351CE8E5795D1A8DB94E4DAAD98E635B9B1B9B636553198CA929CA10A6514515F427E3C14514500145145007E0FF00FC151E786DBF69AFD9C67B89A38208FC2DA83C934D22C7146A3C41312CF239088A3D58815E19FF000937873FE83FA2FF00E0CECBFF008FFB8FCEBF727E347EC9FF0000FF00685D5B46D73E2F7815"
   FileBin .= "FC59AA787F4F9B4AD26E97C53E31D07ECB613DC1BB96030F86BC41A3DBCE5AE0993CDB98A6997EEAC813E5AF18FF0087667EC4FF00F446E5FF00C38FF15BFF009B8AFE1BE3CFA3CF8A19DF887C6DC53C3F89E069E55C4F9AE1331C2D3CDF39CF7078FA11C3E4D96E5B3A75E8E0F86B30C3A6EA60AA4E2E9E2AA274E51BDA5789FDEBE1D7D24BC2AE1EF0DB81B84B88B09E2053CE385B2AC7E5B8CA993645C3B9865B88962B3FCDB37A7570D5F1BC5D95E25A54B318539C6AE0E9B5529CD479A3CB297E4EFF00C24DE1CFFA0FE8BFF833B2FF00E3FEE3F3A3FE126F0E7FD07F45FF00C19D97FF001FF71F9D7EB17FC3B33F627FFA2372FF00E1C7F8ADFF00CDC5"
   FileBin .= "1FF0ECCFD89FFE88DCBFF871FE2B7FF3715F31FF0012D9E34FFCFCF0CFFF00124E26FF00E837FAB3F2BFD77FC4D2781FFF003E7C54FF00C45384FF00FA3FFEACFCAFF93BFF000937873FE83FA2FF00E0CECBFF008FFB8FCEB5A0B882EA14B8B69A2B88255DD1CD04892C522F4DC92216465C8EAA48AFB07F6B6FD823F651F861FB397C58F1F781FE1749A2F8B3C33E196D4344D50F8E7E236A42CAF3EDF650F9BF61D5BC5B7FA75CFEEE5917CBBBB39E2F9B779658291F9F3F07BFE49A7843FEC163FF0047CD5F96715F0BF16F0071561B8538B69F0FCB158DC81E7F86C470FE659863E82A0B1F2CBFD8D7FED0CA72AA90ABED29CE7EE53A90E5E5F7EEDA5FAD"
   FileBin .= "F06F18F07F88DC2B8BE2BE0FA9C491C260388170FE2F0DC499565996E23EB12CBA398AAD87FECCCF73BA7528FB39C69BF69528CD4F9AD0714A52F4AA28A6BFDC6FF75BF91AF31BB26FB2B9EDA5769777631BFE126F0E7FD07F45FF00C19D97FF001FF71F9D1FF0937873FE83FA2FFE0CECBFF8FF00B8FCEBD57FE09ADFB207ECF1FB40FC10F1778C7E2DF801FC55E23D2FE2B6B5E19B1D417C59E36D0441A25A7847C11AA5BD97D93C37E23D1ECA4F2EFB58D466FB44D6CF74DF68113CCD0C30471FE86FFC3B33F627FF00A2372FFE1C7F8ADFFCDC57DE7047837E2BF1EF09E45C6394478030D9671060619860A8663C41C414B1B4E8CE73828E269E1B857154"
   FileBin .= "2152F09371A588AD1B5AD36F43F37E3DF1C7C22F0F38C78878273A9788B8ACD386F31A996E3B119670CF0DD6C055AF4A309CA785A98AE36C1E22746D5172CAAE168CDB52BD35A5FF00277FE126F0E7FD07F45FFC19D97FF1FF0071F9D1FF000937873FE83FA2FF00E0CECBFF008FFB8FCEBF58BFE1D99FB13FFD11B97FF0E3FC56FF00E6E28FF87667EC4FFF00446E5FFC38FF0015BFF9B8AFAAFF00896CF1A7FE7E7867FF008927137FF41BFD59F95FE47FE2693C0FFF009F3E2A7FE229C27FFD1FFF00567E57FCA6FD99EFECB50FF828A7ECFF003585E5ADEC2BE19F1A46D2DA4F15C46B20F87FF1559A33244CE81C2B231527700CA48C30CFF4955F247C33"
   FileBin .= "FD85FF0065BF83DE38D13E23FC3BF866FE1FF197870EA2746D61BC6BF10756166755D26FF43BF274FD73C55A969771E7E97A95EDB0FB5594C22F3BCF87CB9E38A58FEB7AFE93FA3EF869C4BE1870C711E57C5588C92BE639E71963F88E9AC87178EC660E8E17179464797C28CEB63F2ECB2B3AF1AD96579CA31C3CA9AA73A4D55949CA31FE5FFA46F8A5C2FE2BF15F0C66DC2586CFB0F96641C0F9770BD57C4583CBF038EAF8CC1E75C4199D4AF4F0F96E6B9C508E19D1CDE85383962D557529D54E9460A1399451457EF07F3E0514514005145140057CA9FB6BF8D1BC13FB367C47B882429A878934FB6F0569F1A921E793C57770E93A84519C361D7449B54B"
   FileBin .= "818009F2485218861F55D7E63FFC1427C43FDA9AEFC0CF8590BF991DEF88B53F1FEB76FD96D7C396A2CF4A32FCBCC7742F75D887CC007800C17642BF89FD23389AA70AF82DC7D8FC3D5F658FC7E4EF86F2B9C5DAA4733E2AC450E1DC1D4A4B773C3D5CC962968D28D094E4B92326BAB054D54C4D24F58C65ED25FE1A6B9DFDF6B79DEDD4F93BC3BA5AE89A0E8FA4A803FB3F4DB3B572BD1A68A0459E4E3009926F32462382CC48E0D6CD1457F96B87A14F0B87A186A51E5A587A34A8D38ADA30A508D3825E918A47BEDDDB6FABBFDE1451456C20A28A2800A28A28033742F10FFC201F1C3E067C42F30C16D63E3687C2BACCF9C2268FE2F85F46BB9AE3B186CE"
   FileBin .= "D2EAFEE3E6E03ED65064095FBC5D6BF9F1F89DA63EA9E08D7121DC2E6C604D5AD9D0B0923974B952F1DA32BF3090C114D1A95F9817F97E6C57EE37C1EF1A2FC45F857F0FBC6E245925F12F84743D4EF76E311EA735842355B7217E5DD6BA92DDDB385E03C4C06457F5CFD0D33FFAB679E25706549DA18B8E45C6F97536FE2A95A8CF8773B708F4F67FD99914E6E29DE58A4E567BF9D99C2F0A157B39D27F2B4E3FFA54BEEF43D228A28AFEF73C80AE7FC57E1CB1F18785FC47E12D4DE74D37C4FA16ADE1ED424B5758AE92CB58B0B8D3AE9EDE47491239D60B890C4ED1BAAC8158A381B4F41451B1AD1AD570F5A9622854952AD42AD3AD46AC1DA74EAD29A9D3"
   FileBin .= "A917D2509C54A2FA348FE673C6FF000E7C6DFB22F8E6DFE11FC4CC5EF81F549AE5FE16FC4B86D8DB693ACE9E67321D335420B45A7EAD68F3A25F59CD2B49653CA92096EB49BAB1BF3D5F5E95FBCBF193E0DF80BE3BF80B58F877F113478F55D0B558F7C3326C8B53D1B53891C596B7A25E9491EC355B07919ADEE155E3911E6B4BB86E6C6E6EAD67FE7D7C7DE01F1EFEC9FE3D83E157C559E4D57C19AAC92FFC2AEF8A3E53C7A6EB7A6C6EAB1E95AB48CD22586AB60924305DD9CD33C96123C4CB2DCE9173617E6AC9ABADFAAFC3F1E9F73D6CE5FE9D783FE31607C63C0BC0E62F0F80F13B01879D6CCB2FA71851C371961A8439B119EE49463CB0A79BD38465"
   FileBin .= "5F3CC968AB4D2A99A6590FABFD6B0B82E968A3AF4A2A4FD4428A28A0028A28A002B8DF1B78DB4CF04E989777692DEEA57B28B4D1344B4064D4358D4242A90DADAC28AF215323C6259446E230EAAAB24D2430CA78DBC6DA678274C4BBBB496F752BD945A689A25A0326A1AC6A1215486D6D6145790A991E312CA23711875555926921865FD12FD8A3F628D4F44D4EC7F686FDA1AC62BDF8A17B14777E08F045D46B269DF0CF4E914C96B71716B219233E2B31BEE8E36DE7412EF248F26BB24D358525D5EDFD7A5FF5F249B5E1F1871870DF86FC373E2DE2D9CA7879CAAE1F20C830F5634B33E2BCCE9453783C1B6A52C365B8694A9CB38CE254E547034651A546"
   FileBin .= "35F1F5F0D86A9D67FC13FF00F660F1D7C2F5F147C6EF8B93369FF11BE29695A7D8C5E0C86358A1F07F85EDA54BCB2B3D4FEF3BEB97063B53716BBC9D2E1816DEE649B509EF56DBF4B28A293777FD7F5ABD5FE092D0FF002F38F78E33AF1178AB34E2DCFDE1E38FCCA54210C360A8AC3E072FC0E0F0F4F079765B82A29C9C30B80C150A386A2EA4EA57A91A7ED71156B57A952ACCA28A291F1C14514500145145001410082080411820F2083D411DC1A28A00FE637FE0A79FF04C3F147C26F1478A7F6D8FD89BC2CD7D6F7CD71AE7ED1DFB38E8703259F8AECD1A5BBD53E237C39D2ED63716BE26B50F73A86B9A169F6CF25EC8D73ABE8F6B717571ACE8DAEFE6"
   FileBin .= "2FC3FF00881E18F899E18B0F16784EFD6F74DBD5D9246E152F74DBD455373A66A76C19CDADFDA97512C4599248DA2B9B6967B49EDEE25FEEB08041040208C1079041EA08EE0D7F31BFF053CFF8261F8A3E1378A3C53FB6C7EC4DE166BEB7BE6B8D73F68EFD9C7438192CFC57668D2DDEA9F11BE1CE976B1B8B5F135A87B9D435CD0B4FB6792F646B9D5F47B5B8BAB8D6746D77F0EE3AE059E0E788E20E1FC3CA7879CA75F37CA2842F2849B72AB98E5D4A2B596F3C660E0BF79EF6230F1F6BED29D5FF00537E8ABF4AAC371461B28F087C5FCDE961B3AC352C3E55E1DF8879AE2142962A941468E038338CF1F5A49469452861B86F893133BE09FB2CA736AAF2"
   FileBin .= "F784C5603F3E68AE2FE1FF00C40F0C7C4CF0C5878B3C277EB7BA6DEAEC92370A97BA6DEA2A9B9D3353B60CE6D6FED4BA89622CC9246D15CDB4B3DA4F6F712F695F96C270AB08D4A728CE138A94251778CA2F54D35BA67F75E2B0B89C0E26BE0F1942AE1B1586AB3A35E85683855A5560F96509C65669A6BD1AB34DA6985721E3BF1DF867E1C786B50F15F8AF504B0D2AC131C6D7BABEBA75636FA769D6E595AEEFEED94AC10290301E699E2B78A69A33C77E3BF0CFC38F0D6A1E2BF15EA0961A5582638DAF757D74EAC6DF4ED3ADCB2B5DDFDDB295820520603CD33C56F14D347FA2FF00F04C9FF8264F89FE3FF89FC2DFB697EDA3E16934EF06E9D241AEFECE"
   FileBin .= "5FB39EBB0335B476CCC973A67C48F893A65CC6AB753DD2A5BDF685A0DF5BA9BF2B6FAA6A96F0E970E97A5CDDD9665B986799853CA72AA71A98BA91552B569A93C365F867251962F172566A29DD51A316AAE26A2F674F4539C3E6B8D38D3843C2DE10C67883E20E36A61387F0756784CB32CC24E9ACF38C33C8D35568F0EF0F51AB753AD38B8D4CCB33A91960B24C149E2F16E53961B0D893FE0993FF0004C9F13FC7FF0013F85BF6D2FDB47C2D269DE0DD3A4835DFD9CBF673D76066B68ED9992E74CF891F1274CB98D56EA7BA54B7BED0B41BEB7537E56DF54D52DE1D2E1D2F4B9BFA8F550A02A80AAA00000C0007000038000A154280AA02AA8000030001C0"
   FileBin .= "000E000296BFA5386F86F2FE18CBE382C12752AD46AAE371B5545E271D8971519D7AD2495969CB468C6D4A853B53A6924DBFF137C6CF1B38BFC73E2FA9C4FC4F529E130383A52CBF85F85F013A8B23E13C8E351CE8E5795D1A8DB94E4DAAD98E635B9B1B9B636553198CA929CA10A6514515F427E3C14514500145145001451450014514500145145007C89FB7A7FC9A0FC77FFB131FFF004E7A757E1C7C1EFF009269E10FFB058FFD1F357EE3FEDE9FF2683F1DFF00EC4C7FFD39E9D5F871F07BFE49A7843FEC163FF47CD5FE7CFD27BFE4F270F7FD9B79FF00EB4B893FD1BFA287FC998E25FF00B39B0FFD65B0C7A5535FEE37FBADFC8D3A9AFF0071BFDD6F"
   FileBin .= "E46BF1496CFD1FE47EFD1DD7AAFCCFB4BFE08E3FF26D5E3EFF00B2E9E23FFD407E1AD7EB457E4BFF00C11C7FE4DABC7DFF0065D3C47FFA80FC35AFD68AFF00407E8D7FF2627C31FF00B2670FFF00A91893FCE0FA50FF00CA4178AFFF0065662FFF004CE1C28A28AFDC0FC1428A28A0028A28A0028A28A0028A28A002BF14FE3F7887FE139FDAC7E225FAC9E7E9FF000E7C3BA078034E7FE05B978CEAFAA841B4624B6D56F358B4909C92B824E19157F67356D4ECF45D2F52D6350945BD86936179A95F4E4644369636F25D5CCA47711C313B9F615FCFF7C3DBFBCF11DBF897C77A9A91A9FC41F18F893C5B765882E1B52D4E76319202E5127170D1F006D932A0"
   FileBin .= "29515FC43F4CFCFAF83F0E382E9CFDECD33ECCB8AF1F4E2F5780E17C02C261A1556B6854CDF3EC0D7A7749CAA605F2B6A13B7AB96435AD55F48AA71F59BBBFFC962D7CF5DCF41A28A2BF8B4F4C28A28A0028A28A0028A28A008E6863B8865B79903C33C52432A1E8F1CAA51D0FB32B107D8D7DBDFF0004F0F13C97DF05757F025E4C5AFF00E1878EBC45E1B11487320D2EFEE06B965704F5F2A5BEBFD5A0833C04B4DA8046A95F12D7B17EC4FE21FF00845BF68BF88BE0B964F2AC7E23F82B4DF14D8A313B25D63C2F75F6492188118134B69A86B3792EDE592D8173858857E9BE05E7FF00EAC78DBC038D9CFD9E173F9671C118F95EC9D3CF704B1D96A9F46A"
   FileBin .= "59EE4B95D085F69625B8EADA7862E1ED30B5975828D55FF6E4AD2FFC964FEE3F5BA8A28AFF0058CF9E0A28A2800AF2CF8C9F06FC05F1DFC05AC7C3BF889A3C7AAE85AAC7BE1993645A9E8DA9C48E2CB5BD12F4A48F61AAD83C8CD6F70AAF1C88F35A5DC3736373756B3FA9D14D369DD7F5FE69F55B33B72DCC71F93E3F079AE558CC4E5D9965D89A38CC0E3B075A787C56131587A91AB431187AD4DC6A52AB4AA463384E324D347F345E3EF00F8F7F64FF001EC1F0ABE2ACF26ABE0CD56497FE1577C51F29E3D375BD3637558F4AD5A466912C355B0492182EECE699E4B091E26596E748B9B0BF3D2F5E95FBCBF193E0DF80BE3BF80F57F877F117478F55D0B5"
   FileBin .= "58F7C5326C8B53D1B52895C596B7A25EB248D61AAD8348CD6F70AAF1C88F2DA5DC3736373756B3FE6F47FF0004A4B5B78D2DECFF0069AF8B16F6B0A2C56D6E2D6C888208C04861056FD1088E35541B5114051B554600AB465AF328BEB7BEFA764FD7577E8F6727FE83705FD26B80F88F22C3D7F11330ABC2DC618671C3E6988C0E478CCC328E22B463C99D61A8E574E6F2AC7D6B496698074A3839E22D8BC04A9D3AF3C1E17E3BA2BEC7FF0087552FFD1D07C59FFC04B4FF00E58D1FF0EAA5FF00A3A0F8B3FF0080969FFCB1A3963FCF1FBA5E5E5E7F87ADBEB3FE23C781FF00F45F623FF111E24F2FFA84F37F7799F1C571BE36F1B699E09D312EEED25BDD4A"
   FileBin .= "F65169A2689680C9A86B1A8485521B5B58515E42A6478C4B288DC461D555649A486197EF9FF87552FF00D1D07C59FF00C04B4FFE58D7B4FC03FF0082787C38F837E3E83E26F897C61E27F8BDE2ED220487C2973E358AD4D8F85E5DECEDA8D8D9235C79BAAA17616575713B269E5E49ED2DD2F4C77511CB15AF327DD2BDFA774AFBED75EAB5B72E37E90FE0A65783C566187E22CCF8971585A152AE1320C1E419B6575735C524961F095333CC2853C36030D52AB5F5BC53556B52C346ACB0F42B57F674E5E5FF00B147EC51A9E89A9D8FED0DFB4358C57BF142F628EEFC11E08BA8D64D3BE19E9D22992D6E2E2D6432467C56637DD1C6DBCE825DE491E4D7649A"
   FileBin .= "6B0FD58A28A96EFE9D17F5D5DB5FB9592497F017885E217127899C4989E25E25C4C675E718E1B2FCBF0D1952CB325CB294A4F0B94E5385729470D82C3464ECAF2AD88AD2AB8AC555AF8BAF5AB5428A28A47C38514514005145140051451400514514005040208201046083C820F50477068A2803F98DFF00829E7FC130FC51F09BC51E29FDB63F626F0B35F5BDF35C6B9FB477ECE3A1C0C967E2BB34696EF54F88DF0E74BB58DC5AF89AD43DCEA1AE685A7DB3C97B235CEAFA3DADC5D5C6B3A36BBF92B17C7AF8652FC333F15FFB7E24F0C247B2589827F6BC5AB84DC7C38DA7090B9D7B7908B661CC6F115BF49CE98CB7A7FBDC20104100823041E4107A823B"
   FileBin .= "835F933A87FC1187F62CD4BF6B94FDACE7F0A6A02E9B501E2CBEF8308FA68F835A97C4B49DA68FE21DDF85CE9E656D48CAEF7D73A2A5E27872F359C6AD71A5B4F2DF25EFE35C55E1AE2711982C7F0BCB09858E3EBFFC2960B132953C2E1AAD495EA669838D38B69B6DCF13818A842BD4B55A52A55255554FF4ABC03FA6CE4994708CF853C76A3C439ED6E11CAEFC15C4F9242962B3DCEF0581A4A184E05E23AD8AAB08FB38C5428647C5155E22BE55848CF038FA18DC2D3C0BC2FE6AFF00C1327FE0993E27F8FF00E27F0B7EDA5FB68F85A4D3BC1BA74906BBFB397ECE7AEC0CD6D1DB3325CE99F123E24E99731AADD4F74A96F7DA16837D6EA6FCADBEA9AA5B"
   FileBin .= "C3A5C3A5E9737F51EAA1405501554000018000E00007000142A8501540555000006000380001C00052D7E89C37C3797F0C65F1C16093A956A35571B8DAAA2F138EC4B8A8CEBD6924ACB4E5A34636A5429DA9D34926DFF1B78D9E36717F8E7C5F5389F89EA53C2607074A597F0BF0BE02751647C2791C6A39D1CAF2BA351B729C9B55B31CC6B7363736C6CAA63319525394214CA28A2BE84FC7828A28A0028A28A0028A28A0028A28A0028A28A0028A28A00F913F6F4FF9341F8EFF00F6263FFE9CF4EAFC38F83DFF0024D3C21FF60B1FFA3E6AFE837F699F865AFF00C65F811F12BE18F85AEF48B1F1078C7C3EDA569775AF5C5E5AE910DC9BCB4B80F7F71616"
   FileBin .= "1A9DE450EC81C6EB7B0B97DC5479641247E3DE83FF0004E4FDB6FC39A458687A678FFF0067C4B0D3A1F22D965D63C6B2C8B1862F8791BE1AEE73966E4F638EC2BF86FE921C19C6D9CF89B9167BC3DC1F9F711E594782259557C4E4D87C3D78D0C73CF3138BF615556C4E1DC5FB0719DD732B4E27F7A7D18B8E781722F0C788B21E25E33E1FE19CD2B71DC337C3E1B3AC462B0F2C4603FB030F8375E8BA184C4A925888CA9B5271778BEDAF014D7FB8DFEEB7F235EB1FF0EFFF00DBA7FE8A0FECF1FF00833F19FF00F3B5FF00393ED80FFC13FBF6E9208FF8583FB3C608C7FC84FC69F8FF00CD35FF000EA7DB1F893E06F139A6BFE21671D6A9FF00CCBF01FF00"
   FileBin .= "CF33F7C5E2278549A7FF00115F80B46BFE66398FFF003A8F7AFF008238FF00C9B578FBFECBA788FF00F501F86B5FAD15F0E7EC09FB34F8F3F659F843E27F00FC42D53C29AB6B3AD7C48D57C616B73E0FBFD5B51D3534CBEF0C7847458A1B89B59D0F40BA4BE5BAD02F249228ECE5805BC96CEB72F23CB143F71D7F7B780F91E6DC37E0FF0087F9167B80AF95E7196641470D9865F8951588C262235ABCA54AAA84A715351945BE59496BB9FE797D20B3FC9F8A3C69F11B88387F30A19AE4B9B71262717976638573787C5E1A74A8C635A939C61370938C92E6845E9B0514515FAD9F8E051451400514514005145140051451401F2A7EDAFE346F04FECD9F11EE"
   FileBin .= "2090A6A1E24D3EDBC15A7C6A4879E4F15DDC3A4EA114670D875D126D52E060027C9214862187E60F8774B5D1341D1F495007F67E9B676AE57A34D1408B3C9C601324DE648C47059891C1AFD6BFDA27E01E97FB43784347F096ABE26D67C2F1E8BE25B4F145ADEE8F1DB4EF25E59D86A5A7C51DC4172B87448F529A589E396278A7546CB2EE43F2AFFC3BB22FFA381F899FF7E6D3FF0092EBF827E90FE1578BDC71E29ACFF86B84A9679C3980E13CAB24CA6BC788724CBA50C43C7661986713A986CC71742BC675AAE2305479A3174E74B054E49DDCADEBE0ABE1A961F92757926EA4A524E137A5A318D9C53564AEFCB53E57A2BEA8FF008775C5FF004703F133"
   FileBin .= "FEFCDA7FF25D1FF0EEB8BFE8E07E267FDF9B4FFE4BAFC63FE20178F3FF0046DE3FF897F0A797FD4C7CFF000F5B757D6F09FF00410BFF0005D5F2FEE79FE0FB1F2BD15F547FC3BAE2FF00A381F899FF007E6D3FF92E8FF8775C5FF4703F133FEFCDA7FF0025D1FF00100BC79FFA36F1FF00C4BF853CBFEA63E7F87AD8FADE13FE8217FE0BABE5FDCF3FC1F63E57A2BEA8FF008775C5FF004703F133FEFCDA7FF25D1FF0EEB8BFE8E07E267FDF9B4FFE4BA3FE20178F3FF46DE3FF00897F0A797FD4C7CFF0F5B1F5BC27FD042FFC1757CBFB9E7F83EC7CAF457D51FF000EEB8BFE8E07E267FDF9B4FF00E4BA3FE1DD717FD1C0FC4CFF00BF369FFC9747FC402F1E"
   FileBin .= "7FE8DBC7FF0012FE14F2FF00A98F9FE1EB63EB784FFA085FF82EAF97F73CFF0007D8F95EB3742F10FF00C201F1C3E067C42F30C16D63E3687C2BACCF9C2268FE2F85F46BB9AE3B186CED2EAFEE3E6E03ED65064095F5D7FC3BAE2FFA381F899FF7E6D3FF0092EAB5DFFC137349D49238354F8E7F11750B449E1B836F35B58301242DB92489A5B899229D39314C63731390C15802A63FE2027D20A96232DC6E07C3CA587C7E539C64D9DE0311538BF85F928E3B26CD30799E1A73F67984AA287B5C2C633E48CA4E0E4945DDC43EB783B493AF7528CA2D2A756ED4A366BE15FCDDF74FB1FA63D68A6449E5471C7BDE4F2D1137C84191F6285DEE4000BB632C4000"
   FileBin .= "B12401D29F5FEAF45C9C62E4B964E29CA29DD464D2BABF5B3BABF53E7828A28AA00A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A439C7CA403C724161D79E0153C8C81CF079E7182B450014514500145145001451450014514500145145001451450014514500145145001451450014514500145145001451450014514500145145001451450014514500145145001451450"
   FileBin .= "01451450014514500145145001451450014514500145145001451450014514500145145001451450014514500145145001451450014514500145145001451450014514500145145001451450014514500145145001451450014514500145145001451450014514500145145001451450014514500145145001451450014515CEF8ABC5DE16F02E857DE27F19F88F45F0A78774C8BCDD435BF106A567A4E97689D17CEBDBE9618119DB09147BFCC9642B1C6AEECAA6E9D3A95670A54A13A956A4A30A74E9C6539CE72694610845394A526D28C629B6DA49364CE70A70954A938D3A708B94E73928C2114AEE52949A518A5AB6DA496E745457E61F8DBFE0AAFF00"
   FileBin .= "0074BBEBAD27E18F863E267C6ABFB590C4D7BE0EF0D49A7F86C48A42C8B26A9AECB65A96C049F2E7B7D06EAD2655F363B8684C723F9BC5FF00055BD563977EA1FB277C4886C32099EC7C51A7EA57DB31F3B0D34787ED7E71C6D8FED5F3F27729E2BEEB0FE1871E6268AAD0E1CC5D18CA2A718636BE0B2FC44A2ECD5B0B8EC561B13769A697B2BBE8B63E4AB71EF0950A8E94B39A15651972B961A8E2B17493EABDBE16856A3A757ED2CBAB3F6128AF813E147FC14A3F660F89DAA5BF87353F10EB3F097C5570E9145A0FC5AD293C2CB2CCC76EC8F5E8AEF51F0CC45E4DB1DB45A86B1617774CEAB0DAB49BE34FBE239239A3496191258A5459239636578E48DC"
   FileBin .= "0647475255D1D486565255948209041AF98CDF22CE721AEB0D9CE598DCB6B49395386330F528AAB056BCE85492F675E9EA97B4A339C2FA731EF65D9BE599BD275F2CC7E171D4A2D29BC3D58D474E4F68D5827CF4A5FDDA918CBC87D14515E49E88514514005145140051451400514514005145140051451400514514005145140051451400514514005145140051451400514514005145140051451400514514005145140051451400514514005145140051451400514514005145140051451400514578D7C6FF008F7F0D7F676F0CE89E34F8B1AD1F0DF8475AF19787FC112788A5883E97A26A5E2692E20D32FB5E9BCC56B0D105D40B6F7DA988E5874E59D2"
   FileBin .= "EEF441A7C377796D152A53A34E756ACE34E9538B94EA4E4A308456AE5293B28C52D5B6D24B56EC736331B84CBB0B5F1D8FC4D0C1E0F0D4DD5C4E2B13521470F42947E2AB5AACDC614E9C7794E72518ABB9349367B2D1505B5CDBDE5BC177693C3756B750C7716D736F224D6F7104C8248678668CB472C3246CAF1C88C51D1832B1041A9EAD34D5D3BA7AA6B66BB9D09A6934D34D269A774D3D534D68D35AA6B70A28A2818514514005145140051451400514514005145721E3EF1CF86BE19F82BC51F103C617E9A67867C21A35F6BBACDE361992CEC61695A2B788B29B8BCBA7096B636887CEBCBC9A0B5855A59914E94A955AF569D0A34E756B56A90A54A953"
   FileBin .= "8B9D4A956A49429D384629CA539CDA8C62937293492BB22A54A7469D4AB5671A74A942552A549B51842108B94E7293B28C6314DB6F4493678B7ED45FB51780FF0065BF017FC255E2A12EB3E23D665974DF02F8174D942EB7E30D702A05B6B602399ACF4CB469A09357D59E0962B18A58A1861BCD4AEF4FD3EF3F05FC6FAA7C51FDA4FC491FC40FDA2B5C975148E66B9F0AFC2CD2E6B8B3F04F82ED65198E15D39276173A918CAC779757135CDEDCAA2C7A96A17D1AC56B689A978CFC55FB47FC4ED63F68AF88F149149A9B4961F0BFC2734A67B2F04F826DE59469B1DBAB2AA35FDD2492DCCF7AB143F6CBABABDD556345D42DE2B4EC6BFAC784384309C11848"
   FileBin .= "5E14AB71456A69E65995A3525974A715CD966573D551F629BA78CC6D26AB622B7B4853A91C3463197F3B7127126278A71327CD528E454A7FEC381BCA0B1918BF771D8F8E8EABAB653C3E1AA2F67469F24A70759B71AD676567A7DB4567616B6D6369028482D6D208ADADA141FC31410A2471A8F44503DAACD1457D24A5293729372937772936DB6F76DBD5BF3678492492492495924AC92EC92D12307C41E17F0F78AAC9AC3C43A4596AB6C43041730833405860C96B72BB6E6D25C71E6DB4B1498E3760915D97C0CFDA53E2B7EC67A8D9DA5C5EEB7F147F66F79E28B56F095FDC7DB7C4FF000DECE4902BEA5E0EBBB8745FB05A86F39F469248747B90258E58"
   FileBin .= "F49BB9E4D75F2E992471CB1BC52A24B14A8D1C91C8AAF1C91BA9574746055D1D495656055949041069626961331C154CAF36C2D3CCB2BAFA55C1D7BB5095ACABE12AAFDE60F174F7A788A1284D3F767CF4DCA12AA1531182C553C7E5D5E782C7D1D69E2695AF249A6E96221F06270F3B253A3554A2D6B1E595A4BFA25F01F8EFC27F137C21A078F3C0DADD9F887C29E26D3E2D4B47D5AC64DF0DC412164923910812DADE59CE9359DFD8DC24577617D05CD95DC30DCC12C69D757F3D9FB1B7C70B9FD95BE33D97C32D7EFA45F803F1AB5A8EDB48FB54A5AD3E1DFC47BC31C1672C72C8C52D346D71841A7EA1E6148922363A8C92C69A26A32DE7F4275FCB5C71"
   FileBin .= "C235B84337FAAC6A4B15966369FD7328C74A294B1184949C5D3ACA294618CC2544E862E9AB255231AB08AA55A937FD01C29C474F88F2DF6F2846863F0B3586CCB0B16DAA388515255295DB94B0D888355B0F2777CB274E4FDA539A4514515F187D3851451400514514005145140051451400515C978B3C7FE05F01592EA5E3AF1A784FC17A73B2A25FF8B3C45A47876CD9DDD62555BAD62F2CE02CF23AC6A0392CECAA32CC0565783BE2DFC29F888CE9F0FF00E26FC3EF1CBC409917C1FE33F0E7899E31B04A4BAE8BA95EB20F2CAC84B003610FF74835B2C3D774DD5542B3A4B7AAA9CDD35BEF351E55B3EBD1F621D482972B9C14BF95C9737DD7BFE07A1514"
   FileBin .= "5158961451450014515C078CBE2C7C2CF875E5FF00C2C0F895E00F02F9C3317FC263E31F0EF867CD1B1E5CC7FDB5A8D96F1E5A3C9F2E7E4477FBAAC45D3A752AC9429539D49BDA14E129C9FA4629B7BAE9D4529462AF2928AEF2692FBDD91DFD15C8F84BE20780FC7D68F7FE04F1B7847C69611B32C97BE13F1268DE23B4464731B2B5CE8F7B790AB2C80A3067055C1420302075D4A709D3938CE128496F19C5C64BD5349AFB81352574D34F669A6BEF414514548C28A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A0028A28A002BF1DFFE0B9512CDFB0BDF42F9D92FC5AF86913E0E0ED9"
   FileBin .= "350BE46C7A1C138F435FB115F8F7FF0005C4FF00931DB9FF00B2BDF0C7FF004E57B5E1F136BC3D9D7FD8B719FF00A6667E61E3524FC25F1113D53E12CE535DD3C2544D7CD687C1FF00B07FEDE1E22FD8EFC45A07ECDFFB486BF79AE7ECE7AE5E47A57C20F8BFAAC8F3DC7C2CB89DF169E0BF1A5D9CEDF082E76585FBE13C3483CD8B6F8616E2DFC2BFD36DB5CDBDE5BC177693C3756B750C7716D736F224D6F7104C8248678668CB472C3246CAF1C88C51D1832B1041AFE3F3C49E1CD17C59A36A1E1FF10D841A9E93A942D05D5ACE090467292C4E08920B88240B2DBDC44E93413224B13ABA861F4B7EC1FF00B78788BF63BF11681FB37FED21AFDE6B9FB39E"
   FileBin .= "B9791E95F083E2FEAB23CF71F0B2E277C5A782FC697673B7C20B9D9617EF84F0D20F362DBE185B8B7F0AFC470D7124B2C74B2DCCEA39E5D371860F1951B72C14A5651C36266F7C336D46856936E8E94EA3F67CB28FF3BF83DE3055E129E0B83B8C7193ABC315654B0BC3FC418AA929D4C82A4F929E1F28CDEBD46E53CA27292A797665564DE5EDC3098C9FD51D1AD87FE9D28A82DAE6DEF2DE0BBB49E1BAB5BA863B8B6B9B79126B7B8826412433C33465A39619236578E44628E8C1958820D4F5FA9A69ABA774F54D6CD773FB5934D269A69A4D34EE9A7AA69AD1A6B54D6E145145030A28A2800A28A2800A28A2800AFC67FF0082A2FC4FB9F157887E18FECA"
   FileBin .= "BA15E3C767AF327C4BF8AC6DA4656FF845F48BA961F0D68B3C91B36D8F51D4ED2FEFE686455921BDB2F0DDDA9F2A424FECC74AFE63F5AF183FC5FF00DA13F684F8CB3486EACF57F1DDE782BC2533312A9E12F05AC3A3E9925B2F091C5A8D8D9E95793A479437AB70E4BCAD2C8FFADF83D944317C438ACEEBC14E8F0DE0BEB941495E2F35C554585CB5B56F8A8396231D4DF4A983833F38F12F32961F27C3E574A5CB533AC57B0AD6766B2FC347EB18D4ADADAADA8E165D1C311246E450C56F1450411A430411A430C31A848E28A25091C71A280AA888A15554055500000002A4A28AFDF9B6DB6DB6DBBB6F56DBDDB7D5B3F1D492492D12564BB2414514521851"
   FileBin .= "451401C7F8F7C256DE36F0A6ADE1EB808B2DD5B9934FB861CDA6A76F996C2E4301B955270A936C219EDA49A2C8121AFDADFD817E3B5EFC78FD9D3C31A9F88EE1E6F1F7816E2E3E1CF8FC5C36EBC975FF000CC56F15BEA777B9B7BDCEB5A2CDA66A77B2ED589B549F528611B6D980FC82AF78FF00827678C1FC03FB577C50F85F2CA61D0FE31F81AD3C79A4C05898FF00E12BF095DC90DEC5021F9527BFD3EFFC43A85E3A6D674B1B35943AA4453E4FC40CA219D706665EEA9633209473BC0CADEF2A0A54F0F9B504FA539E1670C5CE3D678083D35BFD1F06E632CAF89F02EED61B374F2AC546FEEFB4929D6CBEB34B7943111961D37B47172F2B7EEC514515FC"
   FileBin .= "A67F428514514005145140051451401E0FFB4B7ED2FF00057F643F833E31F8F9FB4078DB4EF01FC34F0459ADC6A7AB5E892E2F350BEB8630E97E1EF0F6956CB25FEBDE25D72ECA5968DA269B0CF797B70F90890453CF17F187FB4AFF00C15FFF00E0A15FB7D6A1A8DB7C02F11EB1FB047ECA5792C91F872FFC3EB0CDFB4CFC4AD0CB37D9B5CD53C5D04C927802DF538562BCB2B6F045DE873E99E7983FB7FC75A73477EF83FF00055BFDA5753FF8287FFC141FC6FF000B9EFE4BEFD923F60DF13DE7C3FD0BC28B2B3F87FE24FED156426B1F881E2ED76D14FD9B544F096A115FF8474C86E1AEEDA0D2B498A7B354B5F1B788ADAE3C800000000000000030001C"
   FileBin .= "0000E000380074AFEBFF000E7C34C9F86F29CBF3ACF72EC366BC4F9961A86614B0F98D186270390613154E15F054E381AD1950C466D5684E9E26BD5C5D3A91C0FB4A74285186229D5AD2FCEF39CEB118DC456C3616B4E86068CE54652A32953AB8BA94E4E3564EAC5A9470F192708460D3ABCB29CA4E128C4F95A7FD8E7E0FEBFAADCF897E25CDE3EF8C7E30BF632EA7E31F89FF0010BC57AFF887529D8B34935F5EDB6A5A68BB67924965FF004A8E76592467DC5F0C22BCFD89FF0067792782FF0045F08EA9E10D66CE54B8B0D77C29E2FF0015E99AA69D731B9922B9B169757BBB482E2190EF8A61685E3214290AAA07D5F457EC6B38CD6294639862E108C5"
   FileBin .= "4634A15A70A3182DA11A306A92A692B7B35050B69CB6D0F9D787A0DB6E8D36DBBB93845C9BEEE4D39397F79BBF99D17C04FDB8FF00E0A75FB08DDD95DFC26F8F5AD7ED77F06F4B312EA5FB3F7ED39AA5DF89F5E1A2C0C035AF80FE284D38F12E8D7F6D66658749B18750B2F0DD8911193C2BAFF936FA71FEB93FE09C5FF054AFD9CBFE0A4BE04D4F53F86771A8F813E30781E2820F8BDFB3EF8E9E2B2F88DF0E752322DACF71F66296E3C4DE1196FF0036DA6F8BB4BB78EDDE4786C75CB0F0F6BED3E876FF00C7CD78AF8A34FF008A9F083E26F84BF6BAFD9575E97C0DFB4C7C229C6ABA5DD5946CDA5FC4BF0F5BA6358F87FE34D2E296DE2D7F4CD774C5974B"
   FileBin .= "6B5BA71F6EB593FB2A59E0274ED4348FCEB8BFC39E1DE37C3D5E5C260722E256A52C167783A14F0785C5E22DEE61B3CC261A10C3D5A55E5EE3CCA95286370D392AB5A58AA319517EC65D9C6332C9C6F52AE2B0574AAE1AA4E55274E1A5E7859CDB9C6514AEA8CA4E9CD5E3154E4D497FA4D57E71FF00C1457FE0A7DFB37FFC136FE1F69FE20F8B37DA878BBE2878D12E2DBE117C05F03F93A87C4BF89BAB238B68CD9587EF0685E17B6BD9218358F176A711B1B42FF62D2EDB5CF104D61A0DF7CDD63FF05BAFD9C2E3FE09633FFC14A2E228E192C74D3E09BFF82A35455F1227ED34B1258AFC0F8AE0DB35D97B9D6658B5A875CFECB79E3F8652FF00C27D71A4"
   FileBin .= "A5A41716717F229A143F15BE3A7C57F16FED91FB576B1378C7F68FF8B3336A3E45E232E8DF093C233061A07C3BF04E912BCB1E8365A1695247A698A366B8B487CEB3927B9BFB9D7B56D77F14F0F3C23C466F98E658BE30A18BCB726C8331AB95E2B0317EC31D9B6718669D7CAF0F55A92A187C345C2A6618E829F253AB4296179AAE223568FD3671C410C3D1A14F2E9D3AD88C5D18D78556B9A950C34FE1AF38E9CD39DA51A349DAF28CA53B460D4BE91F8FDFB78FFC14F7F6F0BABFB9F895F1CF58FD8DBE0AEAAEFF00D95F00FF00669D4EE3C3FE2D6D1A563E5DBF8EFE2C43247E29D5351BAB3648757B1FB73786AFCF9A1BC17A17993D857C4F67FB147ECF"
   FileBin .= "2B713EA3AE785357F196B7792B5C6A1AF78B7C61E2AD5355D46E647124B737CD0EAD676771733380659DACC48F9605B0EE1BEAFA2BFA8B2E951C970F1C1E4184C2641838A518E1B27A31C12928DACF1188A7FED78CABA272AF8CAF5EB4DDDCA6DB3E1AB736267ED71752A62EABD79F112756DE508BFDDD38F68D38422BA247CA91FEC6FF0006B44D52DBC47F0E7FE13AF843E2FB0712E99E30F867F107C57A0F8874C9D5408E6D3EF2E752D492CDD5951CB5B430B33A062DB8B337E8F7ECDBFF000573FF0082897EC077FA745F1A7C4FACFEDF9FB2B58CB1278923F1598E3FDA5FE1E684A42DCEB5A0F8DAE2696E7C74BA6C27ED9756BE36BBD7CEA4B6ED6EBA"
   FileBin .= "8F81AC5A7D620F0CA38208201041041E460FF9FF001E2B2CD68E0788B0F2C171365F85CFF0938B838E614D54C5D14EFEFE0B324963F035A376E1530F5E0AFA4E1383941D61E7570735570556784A8ADAD17CB4E5669DAA51FE1558BB59A9C1BECD3B35FDD7FECC1FB50FC10FDB1BE0B7847E3F7ECF9E36B1F1D7C38F18DBC8D697F6CAF6BA9E8FAADA6C8F56F0CF89F479C2DFE81E27D0EE185B6ABA3DFC693C2C61B9B76B9D3EEECAF2E7E81AFE073FE097FF00B4A6A1FF0004E6FF008283F80FC2B0EA1269FF00B257EDD7E2AD33E17F8F3C26F3345E1CF877F1E3517FB27C38F1F68B6AE56CB481AE6AB730787B5AF29ED6CFFE11ED4759BBD43CDB7F0AF8"
   FileBin .= "66DAC3FBE3AFE33F12B81DF03E7D0C2E1AB55C5E4B99E1D6639262EB28AAF2C2CAA4E8D5C262F912A7F5DC06229CF0F5DC14615A2A962A10A70C4429C7F48C9734FED4C2B9CE31A789A13F6389A71BF22A8A2A51A94EFAFB3AB0929C136DC5B9536E4E0DB28A28AFCF0F5C28A28A0028A28A0028A28A0028AF947E267EDD7FB17FC1AF18EA7F0F7E2BFED53F007E1DF8EF445B57D67C1FE30F8A9E0DD0BC49A40BEB58EF6C9753D1EFF5786FB4F92EACA782F208AEE08A596CEE2DEE510C1710C8FC1FFC3CF7FE09D3FF0047BFFB2EFF00E1EAF01FFF002EABD9A5C3BC415E953AD4322CE6B51AB08D4A55696578DA94AAD39A5284E9D4850709C249A71945B8"
   FileBin .= "C934D369A3D7A59067B5E9C2B51C9337AD46AC23529D5A596E32A53A9092BC6709C28B8CE124D38CA2DA69DD368FBAA8AF857FE1E7BFF04E9FFA3DFF00D977FF000F5780FF00F97547FC3CF7FE09D3FF0047BFFB2EFF00E1EAF01FFF002EAB4FF55F897FE89DCF7FF0D38FFF00E67F35F797FEADF117FD0833AFFC35E3BFF941F75515F0AFFC3CF7FE09D3FF0047BFFB2EFF00E1EAF01FFF002EA8FF00879EFF00C13A7FE8F7FF0065DFFC3D5E03FF00E5D51FEABF12FF00D13B9EFF00E1A71FFF00CCFE6BEF0FF56F88BFE8419D7FE1AF1DFF00CA0FBAA8AF857FE1E7BFF04E9FFA3DFF00D977FF000F5780FF00F97547FC3CF7FE09D3FF0047BFFB2EFF00E1"
   FileBin .= "EAF01FFF002EA8FF0055F897FE89DCF7FF000D38FF00FE67F35F787FAB7C45FF00420CEBFF000D78EFFE507DD5457C2BFF000F3DFF008274FF00D1EFFECBBFF87ABC07FF00CBAA3FE1E7BFF04E9FFA3DFF00D977FF000F5780FF00F97547FAAFC4BFF44EE7BFF869C7FF00F33F9AFBC3FD5BE22FFA10675FF86BC77FF283EEAA2BE15FF879EFFC13A7FE8F7FF65DFF00C3D5E03FFE5D57DABA16B9A2789F44D1FC4BE1AD5F4CF107877C43A5E9FAE681AF6897F6BAAE8DADE8BAB5A437FA5EAFA4EA9632CF65A8E99A958DC4179617F693CD6B776B345716F2C91488E7871B95669972A72CC32DC7E02355C95296370788C2AA8E29392A6EBD3A6A6E2A49C946"
   FileBin .= "ED269BDD1C78CCAF33CBE30963F2EC7606355CA34E58CC26230D1A928A4E4A0EB53829B8A69C946ED269BDCD5AFCE5FDBDBF6FF7FD89357F82BA15A7C19D53E30EADF19DBE20269B65A578BADBC2D3E992780D3C1D24C98B9F0FEBA2FDB518FC59BD76B59FD9574E7CF9FF00685F27F46ABF9F2FF82D6FFC96FF00F827E7FD7FFED1BFFA6AF8495F23C4F8DC565F9262F1783ABEC7134EA60A14EAF253A9C8ABE3F0B426F92AC674E4DD3AB34B9A2D26EEB5499F8EF8D3C479D70A78739DE79C3D8D59766D87C670EE1B0D8CFABE1B17EC2399712E5196E264B0F8CA55F0D5252C2E2EBC23ED694D4652538A528C5AD3FF0087D9FC40FF00A310F1D7FE1DAD27"
   FileBin .= "FF00983A3FE1F67F103FE8C43C75FF00876B49FF00E60EBE09A2BF3BFF0058788BFE87153FF08B2EF2FF00A84F2FC7D6FF00C8DFF116BC5CFF00A2FB11FF0088EF0AF97FD49BC9FDFE47DEDFF0FB3F881FF4621E3AFF00C3B5A4FF00F30747FC3ECFE207FD18878EBFF0ED693FFCC1D7C13451FEB0F117FD0E2A7FE1165DE5FF00509E5F8FADCFF88B5E2E7FD17D88FF00C477857CBFEA4DE4FEFF0023EF6FF87D9FC40FFA310F1D7FE1DAD27FF983AF8E3F6E7FF82827C49FDB37E069F82F6BFB24F8C7E1E493F8D7C27E276F11DDF8EF4EF1243147E1EBC96792D4E9B0F86746918DC2CF8130BC022D9931499C0E428AC3159BE798CC357C262335A9528626"
   FileBin .= "94E8D682C265F172A7523CB38A9470AA71BC5B578C9357BA77577E5E77E20F897C45946639166FC6F89C56579B612B6071F878E45C3541D7C2E221ECEB5355A86534EB52738392E7A5384E37BC649A4C53C927D49AC3F11F87345F1668B7FE1FF105841A9693A94260BAB59D72083CA4B13A9124171038596DEE21649A09912589D5D430DBA2BCF718CA2E124A516B95C64934D5ACD34F469F53E5674E9D5A72A55611A94E71709C2715284E0D5A519C649A9464AE9A6ACD33DF3F60FF00DBC3C45FB1DF88B40FD9BFF690D7EF35CFD9CF5CBC8F4AF841F17F5591E7B8F859713BE2D3C17E34BB39DBE105CECB0BF7C27869079B16DF0C2DC5BF857FA6DB6B9B"
   FileBin .= "7BCB782EED2786EAD6EA18EE2DAE6DE449ADEE20990490CF0CD1968E58648D95E39118A3A3065620835FC7DF88FC39A2F8B345BFF0FF00882C20D4B49D4A1305D5ACEB9041E52589D48920B881C2CB6F710B24D04C892C4EAEA187D2FF00B07FEDE1E22FD8EFC45A07ECDFFB486BF79AE7ECE7AE5E47A57C20F8BFAAC8F3DC7C2CB89DF169E0BF1A5D9CEDF082E76585FBE13C3483CD8B6F8616E2DFC2BF51C37C472CAE54B2CCCAACA79749C69E0F1951B94B0526D2861B1537BE19B6A342B49DE8E94EA3F67CB28FEEBE0FF8C15784AAE0F83B8C7173ABC315674F0BC3F9FE2AA4A75387E7371A787CA337AF51B94F289CA4A9E5D98D593797B70C262E7F54"
   FileBin .= "F635B0FF00D3A51505B5CDBDE5BC177693C3756B750C7716D736F224D6F7104C8248678668CB472C3246CAF1C88C51D1832B1041A9EBF524D3574EE9EA9AD9AEE7F6AA69A4D34D349A69DD34F54D35A34D6A9ADC28A28A061451450014514500798FC6BF1749E00F839F15BC730CA619FC1DF0E7C6BE26B791402CB75A2786F52D4AD820390D234F6F1AC6A47CCECABDEBF9A7F823A60D2FE187856320896F2D6E355998FDE91F53BDB8BC8DD8F73F66960404F25117249AFDEDFDBCEFE6D3BF63EF8FF710332BC9E02BDB062A704C3AA5E5969970A7FD9682EE4561DD4915F87DE05856DBC13E0FB75C110F85B408C11DF669568A5BDCB10493D49249AFE8DF"
   FileBin .= "07E8C69F0AE77884AD3C667F85C3CE5D650C065F3AB08F7B46598CDF6D5763F12F12AAB9F1065941FC386CA2BD68AE8A58BC646126BCDAC1C53F248EAA8A28AFD2CF840A28A2800A28A2800AA9E03D6DFC17FB587ECA5E33864F21A7F895FF00080DDCDF36D7B6F8836EBE1658A52A47C8A9AB5E91BBE4532348E36A1AB75E69F10AEA4D3357F83FAD42424FA1FC6DF875AA452104846B5D4E5752C1487651208D8AC64392A304004D6B4E8C7150C660E6B9A18ECB734C0D48DAFCD0C5E5F89A1256BABE9534EB7B5B5B113AB2C3CF0D898BB4F0B8DC062A0EF6B4B0F8CA1593BF9387F9E973FA9BA2907207D052D7F111FD56B549F70A28A2800A28A2800AE2"
   FileBin .= "7E25F8BE3F87DF0E7C7FE3D96137117827C13E2AF17490282CD3A786F42BFD65E155054932AD9140032E4B6323A8EDAB96F1CF85ACBC73E0AF18782B52FF0090778C3C2FE20F0BDFF19FF43F1069377A4DD71DFF007176FC77E95AD1E455A93ABFC25569FB4FF073AE7FFC96E4CF9B925CBF172CB97FC5676FC6C7F9A4FEC5B15E5D7C06D1BC5FAC5D49A8F89BE23789BC6FE3CF15EAB398DAEB57D7F58F156A96B73A95DBC691ABDCDD5B69D68F310AA03E555555428FABEBE54FD8D62D4B45F82E9F0F75F84DB78A3E13F8E7E20FC37F14D931F9EC75DD0BC57A95D5D59B82A92036D1EA70423CD8A29195016404E4FD575FE8E66ED3CD31EE2E2E9BC55595"
   FileBin .= "270B723A1293950F676D3D9FB170F67CBA72592D0FC6F0FF00C0A5BDFD9C79AFF1735973F37F7B9AFCDE770A28A2BCE360A28A2803E2F9BF664D79FE397F6D2789A55FD9FAE3C5B07C67BDF855FDABA8FF00634DF1BECF4CB8D12DFC467C35E51D1DA430DD4BA9B6AED29BC6F32E7446B71A6C88B5F68514575E2F1D88C6AA0ABCA2FEAF4A3461CB08C39946C9D4A9CA97B4AD34A2AA569DEA545182949F2AB674E9429F372A7EFC9C9DDDEDE4AFB456BCB1D95DDB70A28A2B90D028A28A00F953F6D2B09A6FD9EFC59ADD85CCD61ADF82F53F0A78CBC3DA9DB48D0DD699AC68FE26D2D63BEB49D0ABC17715A5D5E25BCC843C72C8ACBC8C57FA497C1AF1ACFF"
   FileBin .= "00127E107C2AF8897300B6B9F1EFC37F03F8D2E2D86DC5BCFE28F0C697AE4D00DAA8B88A4BE68C6D455C2F0AA381FE6DBFB674F7D3FC07D6BC27A35BB5EF88FE237893C15E00F0C69E9B7CDD4B5BD73C4FA6CB169F00664067B9B3B1BC48BE6015F0EDF2A9AFF49FF85BE0A83E1B7C32F875F0EEDA77BAB7F017813C23E0BB7B990A992E20F0BE81A7E8914D2145442F2A58AC8C55114B312A8A0ED1F887D201D2FEC1E098CEDF58799F13CA8EDCEB0BF57E1F552FADFD9CABA5C9A72F3C6ADB54EFF4FC25CDF5BCC9ABF27B0C12976E7E7C538DBCD46F7F271BE9CA779451457F2F1F72145145001451450015F277EDC1FB57783BF628FD983E2B7ED15E3236"
   FileBin .= "D731F823C3F32F85BC3F35C0B797C61E3BD59BFB33C17E13B521BCF2758D7AE2CE3D427B68E7934CD1A3D53589216B5D3AE197EB1AFE387FE0B01FB4A7FC362FEDADA1FECBFE14D47EDFF00BF630BF4F11FC506B59449A578CFF00687BF8A5B6B5D0AE31BE1BC87E1DD87DA34631B2A183569BE20E957C8E1F4F907DEF871C26B8BB89B0D83C4C66B27C045E679E558B71E5CB70D3873E1E335F0D7C7D69D1C061EDEF2A988552CE34E6D7DC787BC2CB8AF88F0F84C429ACAB03079967356375CB97E1A70E6A119AF86B63AB4A960A875552BA9DB969C9AFCD0F87FF000A22F1DDA6BDF167F685D0343F887F1A3E3278A35AF8A1E3FD6BC5DA1E9DAB5EDAEB3E"
   FileBin .= "2EBA6D4DF49B64BFB79FFB3ADECA399449A75BEC82CAEA49ECE055B4B6B58E3EFF00FE144FC14FFA249F0DFF00F08BF0EFFF002BEBD5A8AFEC9A9996325393A55EB61A92B46961F0F56A52A187A504A14A851A5094614E952A71853A718A49462B43FAF6A6618B94DBA75AAE1E9E91A542855A94A850A504A34A8D1A71928C2952A718D384524A318A4794FF00C289F829FF004493E1BFFE117E1DFF00E57D1FF0A27E0A7FD124F86FFF00845F877FF95F5EAD454FF6863FFE83B19FF8535BFF0093F25F711F5EC6FF00D0662BFF000A2AFF00F26794FF00C289F829FF004493E1BFFE117E1DFF00E57D1FF0A27E0A7FD124F86FFF00845F877FF95F5EAD451F"
   FileBin .= "DA18FF00FA0EC67FE14D6FFE4FC97DC1F5EC6FFD0662BFF0A2AFFF0026794FFC289F829FF4493E1BFF00E117E1DFFE57D1FF000A27E0A7FD124F86FF00F845F877FF0095F5EAD451FDA18FFF00A0EC67FE14D6FF00E4FC97DC1F5EC6FF00D0662BFF000A2AFF00F26794FF00C289F829FF004493E1BFFE117E1DFF00E57D1FF0A27E0A7FD124F86FFF00845F877FF95F5EAD5CBF8DBC5FA3F80BC27AFF008C75E9BC9D2BC3DA6DC6A375B4A8966312E20B3B70C42BDDDF5CB436769192049733C4848DD9154F1B99559C29D3C663653A928C2118E22BB72949A8C62929EADBB24BD0A862F30A93853862B1729CE5184231AF59B94A4D28C5253BB6DB49247927"
   FileBin .= "837F63EF077ED6DFB55FC14FD8DBE16FC3FF0009786E6F146A517C40F8DDE37F0CF85B43B1D57C01F05FC317114DAF5D41A8DB586ED3F53D6F747A4E92D26D57D6B50F0ED8DCA358EB6E4FFA0C7843C27E1CF00F84BC2FE06F0869367E1FF097833C3DA2F853C2FA158218EC345F0F78774DB6D2345D26CA36662969A769B676D696E8598AC30A024919AFC36FF820C7EC7FAC7C29F809E22FDAEBE2D695F67F8E9FB61CF63E33586EE27179E0DF82D6DE649F0D7C2D68274F3ACE2D6AC661E2DBA58A45377A55DF846D352885F680367EF657F2F78D1C613CFF003FA59161B173C5655C2CAB60A155D69D5863336A8E1FDAD8D8CA52929538D6A50C0E1A49B8"
   FileBin .= "BC3E123560D7B795FF009A3C60E2D9E7B9ED3C970F8A9E232CE1A55B071ABED655618BCD2A4A3FDA98B8C9CA4A508D5A70C161E49B8CA861635616F6F2B95FCF97FC16B7FE4B7FFC13F3FEBFFF0068DFFD357C24AFE836BF9F2FF82D6FFC96FF00F827E7FD7FFED1BFFA6AF8495FCE5C67FF0024E63BFEBF659FFAB5C09FC69F48AFF9349C41FF00634E0DFF00D6D7878F8728A28AFCBCFE250A28A2800A28A2800A28A2800AC4F11F87345F1668B7FE1FF105841A9693A94260BAB59D72083CA4B13A9124171038596DEE21649A09912589D5D430DBA424282CC42AA8259890000064924F0001C92780294A319C5C6494A324D4A3249A69EE9A7A34C8A94E9D"
   FileBin .= "5A73A75611A94EA45C2709A5284E125694671926A5192BA69AB34CF7DFD83FF6F0F117EC77E22D03F66FFDA435FBCD73F673D72F23D2BE107C5FD56479EE3E165C4EF8B4F05F8D2ECE76F84173B2C2FDF09E1A41E6C5B7C30B716FE15FE9B6DAE6DEF2DE0BBB49E1BAB5BA863B8B6B9B79126B7B8826412433C33465A39619236578E44628E8C1958820D7F1E3F06BE0278FBFE0A1FF00116EBE147C3A69341F807E11D52C9BE33FC677B28AEAD5DADA68EEE2F08F819AE637B5D47C4577E5A4904D1EF86D90A6AB7ACBA4A5A5BF88BFAD8F85DF0DBC2BF07BE1DF833E17781ED6EACBC23E03F0F69BE19F0F5B5F6A179AA5E43A66976E96D6CB73A85FCB3DDD"
   FileBin .= "D4C554B3C92C8465B6C4B1C21234FBEE07C4665570B5E95652AB955071865D8AACDFB6934DAAB87A6DA6EBE1685B969D7935CAEF460EAC617A7FD63F46BCE38BF30C8B31C1E610A98CE0ACB274B0DC259DE3AA4FEBB55D394E9E372AC239A94F32C9B2D708D3C2665567074AA73E5F4678CA58753C377B451457DD9FD3414514500145145007C8FF00B79D84DA97EC7DF1FEDE056778FC037B7EC14648874ABBB2D4EE58FF00B296F692BB9EC8AD5F87BE05985CF827C1F70BD26F0B787E4FA17D26D188C76209208EC4115FD177C68F08BF8FFE0FFC54F02C51F9D3F8C7E1CF8D7C316F18C066B8D73C39A8E996FB18E76C8B3DCC6D1BF5570AC395AFE693E0"
   FileBin .= "86A6354F861E1672C4CB656D73A54CAC72D1BE9B7B73691AB67904DB47048A0F212450403C57F46F83F5A3538573BC3A7EFE133FC262271B6D0C7E5F529424DF44E597CD2DF55D2FAFE25E255274F8832BAEFE1C4E515E945F472C263213946FDD4719176EC7ABD14515FA59F08145145001451450015E6BF106D64D5358F83BA1C203CFAEFC6EF873A54719C8121BAD4E58D412BF3AAF9A625250871B863A9AF4AAABE01D11BC6BFB597ECA5E0C8504E60F88EDE3EBB8893B12DBE1FDA8F1524B22A839529A45E850E36398CC4D9121AD69D78E1618CC64DB8D3C0E5B9A63AA495FDD86132EC4D772BADADC8ACFBDADAD9112A52C44F0D8682BCF158EC06160"
   FileBin .= "B5BB96231B42924ADD7DF6FB77D2E7F4B23803E82968A2BF888FEAB5A24BB0514514005145140051451401FC0BFF00C146BE05DC7EC5FF00F055FF008DDE1B368DA7FC24FDB86D9FF695F8537A62F2B4E4F8937535CC7F193C311DC0D96CDABDCF8AC6B7E269ED9023DAE8FAB7846DBCA692F639AE3CDEBFAB6FF82D17FC13CEF3F6FF00FD932E6C7E1BAC1A77ED37F017567F8BDFB3778843416D75278C347B759358F00497F3EC4834CF88BA5DA47A5AADC4F069D6FE2AB0F08EB5AA3BD8E8B34527F1D3F04FE2A47F157C206FEFF4EB8F0E78DFC377F75E15F88FE0CD46DEE2C357F0878DB4691ACF5BD2350D36F563BDB2C5DC32C96F15D46B3C685AD2E4"
   FileBin .= "25F5A5E410FF00707877C4F4F8BF83B2FC53A8A79BE41430B91E7B479AF55C70D4950CA33369EAE963B054A142AD47BE3F0989E6FE253E6FCC338C13CBF31AB4D47970F8B954C4E16566A379C94B11413DB9A9559B9462B6A552165EEBB7B0514515F6079C14514500145145001451450014515E43F1B7E2B5A7C23F045C6BA9653EB9E28D5AEADFC3BE03F09D8C33DDEA9E2CF196AADF67D1745B0B2B4492F2E8C970CB2DD25AC725C7D9A3923B68E5BC96D6DE6D6851A988AD4E8528F354AB35082BA4AEFACA4ECA318ABCA526D46314E526926C9949422E527651577FF016EDBD925AB7A2D4FA53F603F81973FB69FF00C1563F67EF87A96B2DF7C29FD8DA"
   FileBin .= "483F6A5F8C97B1A97B05F186813DA49F087C2D732306B67D427F1749E1ED464D3A4DCF7FE1B9BC51B6371A75D793FDFD57E387FC1137FE09E3A9FEC17FB2A35EFC54862BBFDA9BF68DD5ADFE2EFED17ACBF9525EE9BAE6A104F37863E19ADD425A37B2F873A66A57769751DBCB3D89F17EAFE2FBCD2E77D2AF2C122FD8FAFE3FF17F8B70FC51C54E8E5B5957C9387B0CB26CB2B41FEEF192A556A56CC332877863B1D56B4A84F7960A9E1399269A3F44E1ECBE781C073568F2E27173FACD68BDE9A94631A545F674A9462A6BA54752DA0514515F951EF05145140051451D3AD007E78FFC1507F6D5B1FD853F646F1E7C59B1682EFE287884C7F0E3E077879E31"
   FileBin .= "732EBBF15FC596D770787DD6C086FB759786ADADF50F176AD6A446B7BA768371A6C72C779A85A07FE3DBE08FC3DBDF879E0782DF5FBD9F58F1CF89AFEFBC63F10FC417B70F7BA8EB9E34F10CA6FB59BBBDBF959E6BE9219641662EE572F77F676BC93F7F75316FA93FE0A15FB49FFC379FEDF5ACCBA15F8D4FF66FFD8AEF355F879F0E1A091A5D1FC6BF19A79ADFFE16078DA16567B6BD874AD42C2DB4AD1EEE0925B6934FF0FF008735AD3E4F2B5CBC593CEABFB2BC3EE18FF54784F0D87AF4F9338CF961F38CE2EAD3C3D095372CA32C9758BC3E1AACB198883B38E2B192A5357C346DFD79C05C39FEAAF0BE1E856A7C99BE79EC335CDB995AA51A32A6E595"
   FileBin .= "65D2BA4E2F0F87AB2C55783B3589C5CA9CD37878D8A28A2BEB8FAC0A28A2800A28A2800A28A2800A83F677FD9D6E3FE0A03FB6E7C37FD989A09EE7E097C25934FF008D3FB4FDFC2B27D8EEB41D1EE6DE5F0C7C359E753120BAF19EA17165A75D5AA4E2ED74AD5350D72C55A7F0B5CA0F3FF8B5F1174DF853E00F1178DB51093369769B34BB16621B54D6EEDBECDA4E9B184FDE37DAAF64884ED106782D12E6E88D90391FD42FFC117FF626D47F645FD942CBC4DF122C1D3F68AFDA4AFADFE31FC6DBCBE87CAD5B4BBBD6A196EBC23E01B9565592D8782F44D41C6A3A71DD1D978B759F152DBBB5A3DB2A7CDF1AF132E0FE16C666D4A6A19B660EAE519024ED52"
   FileBin .= "18BAB497D773282DED95E12A73D39D9A8E3B1182BE9CD6F9DE32E235C25C338BCD295450CD71CEA65591C535CF0C555A5FED998453D7972DC2CF9E9CD26A38DAF83BE9CD6FD73B5B5B7B2B6B7B2B3821B4B3B4822B5B5B5B68921B7B7B782358A1820863558E18618D1638A28D5523450AA028004F4515FC56DB6DB6EEDEADBDDBEECFE396DB6DB776F56DEEDF7615FCF97FC16B7FE4B7FF00C13F3FEBFF00F68DFF00D357C24AFE836BF153FE0AD9FB337ED2FF001DFC69FB2778C3F676F854BF14A4F84B37C66B8F155949E33F03F83E3B16F16DBFC35B6D091E6F18F88F417BA17CBA26B4E1B4C8EFBECC6C76DE0B7FB4DB79DF37C5D46B62387F1B4B0F46"
   FileBin .= "B622ABA9809468E1E94EB569AA799612A4F929538CA73E5A7094DA8C5DA316DE899F8E78FB97E6199F8599FE132BCBF1F9AE3658FE16AF4F039660B139863AB53C2716E478BC4CA860F094AB626B7B1C350AD5EA2A54E6E34E9CE6D72C5B5F9754574DFF000CA1FF00053AFF00A330D3FF00F0FBFC17FF00E6EE8FF8650FF829D7FD19869FFF0087DFE0BFFF003775F987D5730FFA14673FF869CC3FF99CFE27FEC6E28FFA2238FF00FF00105E2BFF00E747F567E57E668AE9BFE1943FE0A75FF4661A7FFE1F7F82FF00FCDDD1FF000CA1FF00053AFF00A330D3FF00F0FBFC17FF00E6EE8FAAE61FF428CE7FF0D3987FF3387F637147FD111C7FFF00882F15FF"
   FileBin .= "00F3A3FAB3F2BF334574DFF0CA1FF053AFFA330D3FFF000FBFC17FFE6EEBC8FE35F82BF6DEFD9CBC18BF11BE367ECBFA77823C0E35BD27C3F36BC7E2D7C3BF11F95A96B53343616E34DF0A788F5CD598CEF1C804AB626DE3DBFBF9A20C09CEAD2C650A73AD5B2CCDA8D2A5173A956AE578EA74E9C22AF29CE73A0A308C56AE526925AB673633059E65D84C463F30E12E36C0607094A75F158CC6706713E1B0985A14D7354AD88C456CAA146851A71BCAA55AB38C2114E52924AE76D45078247A5212141662155412CC4800003249278000E493C014B733BE97E9B812141662155412CC4800003249278000E493C01589F043E087C49FF82807C49BDF85DF0BAF"
   FileBin .= "6F7C2BF01FC2B7B0C1F1AFE35C10E609A03B6497C13E099645F2353D6F5383284A192D92DA43A8EA27FB1BECD6DE233E087C10F893FF000500F8937BF0BBE175EDEF857E03F856F6183E35FC6B821CC134076C92F827C132C8BE46A7ADEA7065094325B25B48751D44FF00637D9ADBC47FD5C7C16F82DF0DFF0067CF86FE1AF851F0A3C3567E17F05F85ECD6DAC6C6D977DC5DDC3FCF7BABEAF7AF9B8D5359D52E0BDDEA7A9DDBCB7579752BC923E36AAFB390E43533DA8ABD652A793D393539A6E33CC67176950A12569470D09271AF5E2D3A8D3A345FC738FE93E16F85B8BF137171CCF338D7C1F0060EBCA15EBC253A388E2CC4519F2D4CBB2EA91E5A94B2"
   FileBin .= "6A55232A7996654DA96264A781C0CD3588C4503E0B7C16F86FFB3E7C37F0D7C28F851E1AB3F0BF82FC2F66B6D63636CBBEE2EEE1FE7BDD5F57BD7CDC6A9ACEA9705EEF53D4EEDE5BABCBA95E491F1B557D528A2BF5CA54A9D1A70A54610A54A9C630A74E9C5461084528C6318C52518C6292492B24AC7F7B60F0785CBF0B86C0E070D430782C1D0A586C2E170D4A1470F87C3D182A74A8D1A54D4614E9538463084211518C52495828A28AB3A428A28A0028A28A003AD7F325AFF83DFE107ED13FB427C1B96236D65A6F8E6EFC75E11858611FC27E3558758B08ED9BEECB0E99677BA5D8CCE9F28BDFB5215495248D7FA6DAFC6CFF0082A37C2EB9F0CEB7F0CB"
   FileBin .= "F6ABD0ACE492DBC34F17C37F8AAB6D1B3B3784B59BC9A4F0EEB33246A032697AB5EDFD8CB248CD24F7BA9787EDC6228095FD6BC1ECDE184E22C4E495E6A14789305F52A0E4ED159AE1AA471596DDBD39ABCA35F034D75A98C8AD15D9F9CF89796CB139350CD2945CAA64B8AFACD5514DC9E02BC7D86376FB3493A58A974E5C337E4FE42A2A282686E6186E2DE549A0B88A39A09A260F1CB0CA8248A58DD495749119591812194820E0D4B5FBFB4D369A69A7669E8D35BA6BA347E3A9A6AE9DD3D535B35DC28A28A401451450015EF5FF0004E9F07BF8F7F6AAF8A7F14E584CDA1FC20F0459FC3FD1E720AC5FF094F8AAF24B8D42481C9DB24FA7D8E9FAF69F78"
   FileBin .= "A8498E3D42CDA52A248437CA7E3FF16DBF827C27AB6BF31569E084C1A65B93F35E6AB720C5616CAA3E670D31124C10164B68A7970421AFDB4FD82FE045E7C03FD9D3C2DA2F8860687C79E349EE7E227C4033A05BB8FC47E268EDE58F4CBB2543ADCE87A341A5E9179197922FED2B4BF9E1212E2BE4BC41CDE392F0666369F2E333F94724C0C6FEF3C3F3D2C4E6D5D2BA6E9D3C3429E0E52D94F1F0B5DA76FA4E0DCBA59A71360BDDBE1B288BCD3152B5E2AAA53A397D26FA4E75E53C4455AFCB8493EC7D9D451457F2A1FD0814514500145145001451450015FC8AFF00C171BFE099DE2DF845E3EF127FC1503F640F094DABC1716A6EBF6D7F821E1EB6DBFF00"
   FileBin .= "096F87ECC34971F1DBC33A6DBA103C43A241E65CFC40FB242D2C91C6DE3796168E5F1F5D6A5FD75535D12456475574756474750CAE8C086565208656048652082090462BEB782F8C332E09CF28E7197F2D6A6E2F0D9965F564D61734CBAACA2F1182C45AEE2A7C91A946B453A986C4D3A588A5EFD349F06659750CCF0D2C3D6BC5A7CF46B47E3A15A29F254877B5DA9C5FBB3839425A33FCE8BC07E3BF0BFC4AF0AE91E33F076A70EABA16B36EB3DBCF19026825000B8B0BE80333D9EA3652EEB7BDB497124132329CAED66EBEBEF6FF0082A9FF00C11FBC7BFB1DF8C7C6BFB6E7FC13FBC1977E2BF813E21BABBF147ED2BFB25787A077B8F049C9B9D5BE28FC"
   FileBin .= "14D2EDD5D8E8312FDA2F35EF07D85BBCDE128C493E916B79E0726C3C05F99BF0DFE25F837E2C7856C7C61E07D5E1D5B48BC1E5C8A3115F6997A888F71A66AD6658CB61A8DB6F4F36DE5CABA3C5736D24F693DBDC4BFDAD9466F94712E55473EE1FC43C4E5B59C69D7A351C7EBD94E2E51E69E5F99D28B7ECABC1F37B1AC97B0C6D24ABE1E524E7087E6588C3E23055E584C5C392B415E328DFD957A7B2AD424FE283D14A2FDFA72F76693B37DE514515DA661451450014515C47C43F88DE0FF859E16BFF001878DF588347D1AC1768693E7BABFBB7476834DD32D14F9D7FA8DD146105AC0A58AAC934AD15B4334D1DD3A752B54852A50954AB524A10A708B94E"
   FileBin .= "7293B28C62AEDB6FA214A4A29CA4D46295DB6EC925D5B65CF1BF8DBC33F0EFC2FABF8C7C5FAA41A4683A2DB35CDE5D4CC373B7DD86D2D21C87BABFBC98A5BD959C21A6B9B89238A352CD5FAB9FF043EFF826978B3E3BFC45F0BFFC14F3F6BBF085CE89E1CD193EDBFB11FC10F125B066D2B4F95D66B5FDA03C55A55CC655757BD11C379F0E8DC46259A610F8DEDA35B0D3BE1FEA2FE63FF04B2FF824378F3F6DFF00167833F6D2FDBDBC177FE0FF00D9B7C3F796DE26FD9CBF652F125ACB05F7C502ACD3695F143E32E977023913C23709E4DDE81E16BDB70DE35B5749EE2183C0331FF8589FDA5451450451C30C690C30C691451448A91C5146A1238E345015"
   FileBin .= "111405445015540000000AFC4FC56F1330F94E1719C1FC338A857CD3154E785E22CE70B514E8E030F35CB5F24CB6BC1B8D5C4D657A59AE3694BD9D3A6E780C3CA72962671FA6C8724962274B31C6D371A14DAA983C3548B52AB35670C4D68BF86106B9A85392BB76AB34AD04DF451457F2C1F76145145001451450015F90DFF059FF00DB6B52FD90FF00651BCF0DFC36BF923FDA2BF690BF9FE0EFC11B4B198C7AB69779ACC30DB78BBC7D6C54892D8782B44D410E9DA82EE4B3F16EB3E156B88DED1EE4A7EB95D5D5B58DB5C5EDE5C436B696904B737575732A416F6D6D046D2CF3CF34ACB1C50C31A3492CB232A468ACCCC14135FC23FED11FB455CFFC1407"
   FileBin .= "F6DCF891FB4D89E5B9F825F08A4D47E0AFECC1632337D8AF342D22E6E22F137C4A82122346B9F196A13DEEA36B76D08B94D2B54D3F43BD66B8F0BC0EBFAA784BC274F88B88FF00B4330A2AAE47C390A79966109ABD3C5E2BDA5B2CCB1DF492C66260E788875C0E1B16F4695FF4EF0AF85A9F107107D7B1F47DA64BC3F1A79863A325FBBC56279DACB72D77D24B1789873D7875C161F14F4695FCFF00E12FC3AD3BE157C3FF000EF8274E2933697681F54BF5521B55D6EED8DCEADA948CE3CC6FB55EC92981652CF05A2DB5B03B20403D1E8A2BFAA2B55A95EAD4AF564E756ACE552A49EF29CDB949FDEF45B25A2D0FE9EAB5675AAD4AD564E552ACE552727BCA"
   FileBin .= "536E527F36F65A2D9681451456666145145001451450014515E41F1BBE215EFC3CF03CF71A0594FAC78E7C4D7F65E0EF879E1FB2B76BDD435BF1A78865FB0E8D6B656118696FA486590DE1B48919EEFECEB671FEFAE61075A146788AD4A853B73D59C6116DDA2AEF594E4F48C20AF29C9E918A726D24CD68519E22B53A34EDCF526A09B69455DEB2949E918455E5393B28C539369267D4BFF04F5FD9B7FE1BCFF6FAD1A1D72C06A7FB37FEC5779A57C44F88EB3C465D1BC69F19A69AE3FE15FF0082675757B6BD874AD42C2E755D5ECE78E5B7974FD03C49A2EA11F93AE59B3FF6E5D3A57E797FC12FBF62BB1FD857F646F01FC27BE482EBE287888C9F11FE38"
   FileBin .= "F8823916EA5D77E2C78B2DAD27F10A1BE46617B63E1AB7B7D3FC23A4DD2944BDD3B41B7D4A4892EEFEE8BFE86D7F2578A3C5B0E2AE25A8B0351CF23C969BCAB265B46B50A5393C4E62E3B7B4CCB14EA62799A53587786A32FE0A3F953C4BE2A8713F1154FA9D473C9B28A6F2CCA3A46B51A536F118F6B45CF98E25D4C45DA52541E1E8CAFEC50514515F9B9F9E851451400514514005145140057E3DFF00C1713FE4C76E7FECAF7C31FF00D395ED7EC257E3D7FC171982FEC3974588007C5DF862493C0006A37A4927B000124D787C4DFF0024F675FF0062DC5FFE9999F98F8D3FF269BC43F2E13CE5BF4584A977F23F251C85DCCC42AAEE2CC4800019249278"
   FileBin .= "000E493C01587F043E087C49FF0082807C49BDF85DF0BAF6F7C2BF01FC2B7B0C1F1AFE35C10E609A03B6497C13E099645F2353D6F5383284A192D92DA43A8EA27FB1BECD6DE235F823F047E24FFC1407E255F7C2EF85B7B7BE15F80FE16BD8A0F8D7F1AE087304D0315925F04F8265917C8D4F5BD4E0CA12864B64B690EA3A89FEC6FB35B788FF00AB7F82DF05BE1BFECF9F0DFC35F0A3E14786ACFC2FE0BF0BD9ADB58D8DB2EFB8BBB87F9EF757D5EF5F371AA6B3AA5C17BBD4F53BB796EAF2EA579247C6D55FCF320C86A67B38D6ACA54F27A52B4E69B8CF319C5DA5428497BD1C34649AAF5E2FF78D3A345DB9EA47F937C2BF0B717E26E26199E671AF83E0"
   FileBin .= "0C1D670AF5E129D1C47166228CB96A65D97548F2D4A593529C654F32CCA9C94B13253C0E0669AC462281F05BE0B7C37FD9F3E1BF86BE147C28F0D59F85FC17E17B35B6B1B1B65DF717770FF3DEEAFABDEBE6E354D6754B82F77A9EA776F2DD5E5D4AF248F8DAABEA94515FAE52A54E8D3852A30852A54E31853A74E2A308422946318C62928C63149249592563FBDF0783C2E5F85C36070386A183C160E852C36170B86A50A387C3E1E8C153A5468D2A6A30A74A9C231842108A8C62924AC14514559D214514500145145001451450015C9F8EFC13E1BF891E0DF13780BC5FA7C7AAF867C5BA35FE85AD58C87699ACB5081A091A19305ADEEA02C2E2CEEE2DB3"
   FileBin .= "5A5DC50DCC0C93448EBD6515A52AB52855A75E8D49D2AD46A42AD2AB4E4E1529D4A7253A752128B4E33849294649A69A4D3BA22A53A75A9CE955846A52AB0953A94E694A1384D38CA128BD1C6516D34F469B47F303AC781FC53FB357C50D5BF677F8892CB34366F26A3F0A3C5F3C7E4D9F8D3C177134A74F48E427CB8F54B30B25A5C58877FB35EDBDE69B133C36DA7CD7FD757EE07ED39FB31F807F6A2F00B7847C5CB2E95AE6952C9A97823C71A6C6BFDBDE0CD7B6A6CBEB17DF0B5D585CB430C7ABE9124D141A8C1144E92DA6A369A6EA363F825E3DD13E2B7ECCBE228FC0BFB446873DBD84B3B5AF853E2DE8F6D757DE0BF17DB207F24CD7D1C01ACF5511"
   FileBin .= "47BAEECEE62835184113DFD8436E5351BBFEB0E10E30C271B6129C5D4A5438A28D24B31CB5B8D3799CA9C57366595C5B4AB4AB24EA633054FF007D42AFB4A94A9CB0F25287F3B71270D62785B133B42A55C86A49BC1639734D60A32768E071D2B374D536F930F899BF67569F242738D64D4BADA2AA58EA163A9DAC57BA6DEDA6A1673AEE86EECAE22BAB6957D639E0778DC73FC2C6ADD7D2CA328C9C65171945B4E324D4935BA69D9A6BAA67849A92528B4D3574D34D34F669AD1A7DD053259638239269A44861851E596595D638E28E352F249248E42A22282CEEC42AA82490013581E23F167873C2566D7DE22D5ECB4B802B346B3CA0DCDC95EA96967187BA"
   FileBin .= "BB93FD8B786460324800123BEF815FB307C56FDB22FEC752D5ECB5CF855FB36ACF1DC5FF00882F61165E2DF8996D1481CD8F856D278E411697701446DACCF1CDA3C1979636D6EEE07D2ED9626B60F2DC154CD737C553CB72BA3F1E2EBEF564B5587C151FE2637175126A9E1E8464EFEF5474E946738DE1E96271B8A86032EC3CF1B8FAB6E4C3D3DA116D275B1352CE187C3C2F79D5AAE31FB31E69B8C5F4DFB17FC0DBAFDA97E32597C58F11E9F2FF00C284F831ACACFE1C8AF2165B4F88BF11ACDA39ED99619502DD68BA03F93A85EF99BA3629A7E9AF148BAAEB105A7F41D5CAF81FC11E14F86FE12D03C0BE08D12CBC3BE14F0CE9F0E97A2E8F60856DED6D"
   FileBin .= "610492EEE5E6B9BAB895A4BABEBEBA926BCBFBD9A7BDBD9E7BAB89A57EAABF9678E38B6B717E70F171A52C2E5983A7F53CA30329293C360E327273ACE3EE4F178AA92962317523A3A9254E0FD952A497EFFC29C394F8732DFABCA71AF8FC4CD62331C5A56F6D88715154E9DD73470D87825470F076B422E725ED2A4DB28A28AF8D3E9C28A28A0028A28A0028A28A0028A28A002BF972FF00829DFF00C109756D5BC5DE28FDB0FF00E09A31687F0FBE396A0F73ADFC57FD9A677B5D17E12FC7D9448F77797DE1B8649EC746F027C43BD692EA49236934EF0CF88751B8FB7ADF784B5AB8D6756F10FF0051B457D3F0A717E79C1999C734C8F14A94E5154B1984AD"
   FileBin .= "1F6D80CCB0BCCA53C2661856D4311424D5D3BC2B519DAB61AAD1AF18548F0E3F2FC2E6541D0C4C2E93E6A7522F96AD19F4A94A766E125D778C97BB38CA2DA7FE6D1F0E3E32D8F8C75AF107C3EF1778735FF853F1AFC0F7B73A47C40F839E3EB0BAD07C69E17D62C1BCBBF80E9BA9DBD8DE5E5AC120CB4A2D21BAB78DE17D42CACBCF804BECF5FD6D7FC147BFE0911FB327FC14634683C41E29B7BEF847FB46F862CD53E1CFED2FF0E2086C3E20F876E2D159B4CD3FC4F1C52D943E3DF095BCFB77687AC5D5BEA5A7DB49789E14F10F85EEAFAEAF64FE3D7F68AF851FB5C7FC1373C636BE00FDB9BC10FAB7C37D4F523A57C3BFDAEFE1C69D7DABFC29F19A12C6"
   FileBin .= "C6DBC602D6CE39FC15E2B9A0476B9D1B54B2D3B517920BB9EC74CD5345B493C4F75FD7FC1DC75C3DC794E34F2D9472BE2051BE2386B17594AAD59249CEA6478A9F2ACCE86F2FAABE4CCA8C5494A857A707899FE7998E558CCA9B9574EBE12FEE6369C1A8C55D24B154D5FD84EEEDED15E849DAD2837C8BB0A2B093C53E197F0FFF00C25A9E21D15BC2C6C4EA63C46354B23A17F6705DC6F8EABE7FD845A0504B5C19FCA1820B039C637ECF7F0DBF6B0FF828DF8D6EFE1BFEC23E0631781F4AD48693F11BF6B4F887617BA47C20F00A808D796FE1E9EE6C6697C5FE298E096292CF45D2EC754D4DFCEB7BA93458743B8FF8492D3EB6AC69E1B0D89C763EBD0CB7"
   FileBin .= "2FC12E6C6E619854586C26115ED6AB566AEEAC9FBB4B0F4E33C4569DA9D2A539B48E08F34E70A54A13AD5AABB53A34A3CF52A79C62BECA5ACA6DA8456B2925A9C87C4AF8CDA5F81F55D07C0FE1DD0B5DF89BF18BC6D7B69A3FC3EF83FE04B1B9D77C6FE2CD675297ECDA65ADBE97A6DBDEDEDBDBDDDCE228E7FB24F71705655D3ACEFE6864857F7D7FE0995FF0424D75FC5BE17FDB03FE0A7169A2F8D7E2DE9CF6DAE7C23FD95A092DB58F859F039CB25D5A6A5E388E2B8BDD1BC79E3EB775B771A5F9BAA786344BCB75BCBEBFF15EA71E90DE17FD3DFF00826EFF00C11FFF00669FF827569B71E2CD156FBE33FED33E28B329F10FF697F88F6D0DE78DF569AE"
   FileBin .= "A255D4B4BF065A4D35FC3F0FFC277126F53A56977979ACEA76C2DA0F147893C442C74F369FAC75FCE3C7DE33BC551C4E43C0F2C460F2FAD09E1F1FC45562F0F9A6694A4B96A50C0534F9F29CBAAABA9BE6FED0C5D36A35E786A53A9847F6394F0DAA72862B3351A95A2D4E960E2F9A85092B38CAB3DB115A2D5D69EC69BD62A724AA20000600C01C003A01E9451457F3D1F5E145145001451450014515CE78C3C5BE1BF00784FC4FE3AF18EB167E1EF08F837C3FAC78ABC51AF6A32793A7E8BE1FD034FB8D5759D56F65C1F2ED2C34FB4B8BBB870AC56389C804F155084EA4E14E9C653A9394610841394E7393518C63149B94A52694524DB6D24AE54213A938"
   FileBin .= "53A7194E7394610845394A7393518C631576E526D2496ADB491F871FF05E6FDB0B5AF84DF017C3BFB23FC24D585B7C75FDB0E6D43C1665B490FDAFC1DF05E0090FC4BF155D1898CB651EB36139F0A5A492223DCE9777E2DBED2E61A8787C18FF00023C13E10D1FC03E13D03C1DA0C3E4E95E1ED36DF4EB5C8512CE625CDC5E5C15015EEEFAE5A6BDBB900024B99E57C0DD8AC9D6FE32F897F6D7FDA6BE30FEDC3E3482F6D74DF1ADF4FE02F807E1BD487EFBC19F04BC2B7D7367A2429096923B6BFD6E559F53D5FECCC237D7AFBC4D796CED67ACAA8EFEBFB6F85786E1C1DC3780C81C62B306FF00B4B3FA91B373CDF134E29E15C97C54F2AC3AA78182BB8FD6"
   FileBin .= "238CAD0B2AECFECCE17E1E8F0970EE07226A3F5F95B30CF2A46CDCF36C4538A9619C95F9A9E59414305049B8FB68E2AAC7F8CC28A28AF6CF6828A28A0028A28A0028A28A002BE99FF823FF00ECD67F6C5FDB5B5CFDA83C57A77F687C01FD8C2FDBC3BF0BD6E62F3349F19FED117F1477373AEDB655E1BD8BE1DD8791AC8903A1B7D5A7F87DAAD83C8AFA8463F3F7E33EB7E319ECFC29F09FE14D85C6B5F19FE3AF8A74CF85DF0C346B16D97926B5E24BBB7D327D5564C7FA2C1A5477D117D41CAC3A75CDD59DEDD14B482E248FFB70FD883F651F077EC51FB307C29FD9D7C1A2DAE63F03F87E26F14F8821B716F2F8BFC79AB31D4BC67E2CBA0419C9D635EB8B"
   FileBin .= "C92C20B9926934CD1A3D33468E56B5D3ADD53E1BC4CE27FF0055B852AD0C354E4CE78A215F2DC172BB54C2E511B4337C72B6B09622328E5787969CCAB63A507CF8776F89F123893FD5AE17A9430F539337E258D7CBF07CAED530D9546D0CD71A9AD612C44651CB684B4728D6C64A0F9A81F58D14515FC807F2685145140051451400514514005145140057C5DFB76FECA775FB657C17D2BE0AA78961F08E9379F123C19E22F146B9E4B5CEA16FE17F0FCF7973AB43A15B18A4B79B5CBD4923B3D38DF14B1B592737B722E63B636575F68D1586270D471987AD85C443DA50C453952AD4DB694E9CD38CE2DA69A528B69B4D3D7469EA7979DE4D9771165198E459"
   FileBin .= "BD0FAD6579AE16AE071F86E79D3588C2578F256A329D3946A463560DC24E128CB964F9651766BCAFE0B7C16F86FF00B3E7C37F0D7C28F851E1AB3F0BF82FC2F66B6D63636CBBEE2EEE1FE7BDD5F57BD7CDC6A9ACEA9705EEF53D4EEDE5BABCBA95E491F1B557D528A2B4A54A9D1A70A54610A54A9C630A74E9C5461084528C6318C52518C6292492B24AC75E0F0785CBF0B86C0E070D430782C1D0A586C2E170D4A1470F87C3D182A74A8D1A54D4614E9538463084211518C52495828A28AB3A428A28A0028A28A0028A28A0028A28A0028A28A002B0BC49E18F0DF8CB45BFF0E78B740D1FC4DE1FD4E136FA8E89AF69B67AB6957D0920F9775617D14F6D3A86"
   FileBin .= "0197CC8895701970C01ADDA2AA139D39C2A539CA9D484A3384E12719C27169C650945A946516938C934D349A7726708548CA152319C271719C271528CA2D59C651926A516B469A69AD19F99BE39FF82567ECEBAE5FDCEB1F0EF59F88FF0005B53B96795A0F01F8AA59342799F967974BD7E0D56E922DE72B69A76ABA75A46A4C514291ED55F3587FE09425E609A97ED51F166E34DDC99B7B0D334ED36FCC58FDEA1D48EA57819DCFDC76B32B18CAB472E735FAF9457DD61FC4EE3CC2D15461C498DAB18C54633C5C30B8EAF14AD6E5C4E370F88C426AD64D55BA5A267C9D6E03E12AF55D5964986A7293E69470F531184A5277BB6E861AB51A2EFD7DCB3EA7C2"
   FileBin .= "1F097FE09C5FB2E7C29D4E1F10CBE13D4BE26F8AADDE39A2F11FC57D4D7C5D711CF1E184F1E8C2D2C3C31E7A4AAB35BDD49A1CB7B6D22AB5BDCC6CB93F76A22C6A91A2AA2228554450AAAAA005545180AAA38000C018029D457CC66D9E6719EE2162B39CCF1B99D78A71854C6622A57F65076F728C67270A34F45FBBA518415B489EF65D94E5B94517432CC0E170349BBCA386A30A7CF2FE6A924B9EA4BFBD52529798514515E51E805145140051451400514514005145140051451400514514005727E3AF01F823E27F8475FF0087FF00123C23E1BF1EF81BC57A74DA4789BC1FE30D134EF11F86B5FD32E00F3AC357D1756B6BBD3AFED5CAAB795756F22891"
   FileBin .= "12450244561D6515509CE94E1529CE54EA5394674EA424E1384E0D4A1384A2D4A328C929465169C5A4D34D09A524E3249C5A69A6934D35669A7A34D68D3D1A3F9CC9FF00E0D8CFF827ACDF1CCF8F9356F8D96FF0224D4D7C5137EC89078FF504F8392F8B96527ED2BA9F3E3A87C34D013BBC3E9E215D492E0F970789E1D1153415FE80BE1FFC3CF01FC27F06787BE1D7C31F06F863E1F780BC27A745A4F867C1DE0DD134EF0E786B41D360C98ECF4AD1B49B7B4B0B280333C8CB0409E64AF24D216964776EC68AFA1CF78BF8A389A9E0E8F1067D99E6F4B014D53C253C6E2AA56852D395D4E56F96A622714A35715554F135528AA9566A2ADC785CBB03829549"
   FileBin .= "61309430F2AAEF3952A718B96B7E5BAD6304FE1A71B423AF2C55C28A28AF9C3B428A28A0028A28A0028A28A002BE4EFDB7FF0065A8FF006D0FD99BE23FECDD71F127C4DF0A2C7E23C3A1DAEA3E2EF0A5A5A6A1A8C7A7E91E22D2B5DBAD26E2C2F26B54BDD275B8F4C3A66AB6897B64F7165732C4F3B40F35BCFF0058D15D581C6E272DC6E1331C155F638CC0E2686330B5B92153D96230D5235A8D450AB19D39B8548464A3384A0ED6945ABA3AB058CC4E5D8CC2E3F0753D8E2F0588A38BC2D6E584DD2C461EA46AD1A8A15233A7270A908C94670945DAD28B5747F30FA5FF00C1B8BABE8BA6D868FA47FC143BE32E9DA5E97696D61A7585A7C31F0D436D6565"
   FileBin .= "6912416D6D0449E2E0B1C30C31A2222F01540E4E6AFF00FC43B1E27FFA48DFC6EFFC36DE1DFF00E6BBDBF9FA9AFE9A68AFD15F8C9E244A4E52E228CA4DF34A4F26C85B6DB4DB6DE5776DB576FAB6CFBF7E2EF884DB6F3F4DB6DB6F29C95B6DEADB6F2EBB6DEADBDCFE65BFE21D8F13FF00D246FE377FE1B6F0EFFF0035DEDFCFD4D1FF0010EC789FFE9237F1BBFF000DB7877FF9AEF6FE7EA6BFA69A297FC463F11BFE8A1874FF00993641D2DFF52BFEEAFC45FF001173C41FFA1F47FF000D3927FF003B4FE65BFE21D8F13FFD246FE377FE1B6F0EFF00F35DEDFCFD4D1FF10EC789FF00E9237F1BBFF0DB7877FF009AEF6FE7EA6BFA69A28FF88C7E237FD143"
   FileBin .= "0E9FF326C83A5BFEA57FDD5F887FC45CF107FE87D1FF00C34E49FF00CED3F996FF0088763C4FFF00491BF8DDFF0086DBC3BFFCD77B7F3F5347FC43B1E27FFA48DFC6EFFC36DE1DFF00E6BBDBF9FA9AFE9A68A3FE231F88DFF450C3A7FCC9B20E96FF00A95FF757E21FF1173C41FF00A1F47FF0D3927FF3B4FE65BFE21D8F13FF00D246FE377FE1B6F0EFFF0035DEDFCFD4D1FF0010EC789FFE9237F1BBFF000DB7877FF9AEF6FE7EA6BFA69A28FF0088C7E237FD1430E9FF00326C83A5BFEA57FDD5F887FC45CF107FE87D1FFC34E49FFCED3F117F621FF82297817F64BFDA1B4EFDA57C77F1FBC79FB48F8FBC23E16D5FC39F0D62F1BF86F47D074BF01DD788"
   FileBin .= "924B3D73C49630D9EA3ABCF79AE4FA2CF7DA1D8CDE7D9DBD9D86B1ABB4D05F5D4BA74FA67EDD51457C667FC479DF1463A398E7D8FA9986321429E169D49D3A14614B0F49CA54E8D1A186A5470F469A94EA4DC695282954A93A92BCE7293F90CF788738E25C6ACC33BC74F1D8B8D1A786854953A34634E8527270A54A8E1E9D2A14A0A539CDC69D38A9549CEA4AF39CA4CA28A2BC43C60A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28"
   FileBin .= "A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2800A28A2803FFFD9"
   Return FileBin
}
Also check out:
Courses on AutoHotkey

My Autohotkey Blog
:dance:
malcev
Posts: 1769
Joined: 12 Aug 2014, 12:37

Re: OpenCV help - find the contour of many shapes

08 Jun 2020, 10:06

I think here is error in function
FindContours( cvimage, cvstorage, ByRef cvfirst_contour, cvheader_size, cvmode, cvmethod, cvoffset)
{
result := this.opencv_core("cvFindContours" , "ptr" , cvimage , "ptr" , cvstorage , "Ptr*" , cvfirst_contour , "int" , cvheader_size , "int" , cvmode , "int" , cvmethod , "struct" , cvoffset, "Cdecl")
return this.__wrapAround(result)
}
Also as I remember You can use OpenCV 3 with 1 dll only.
But You will have to use haarcascades without GPU in that case.
User avatar
Blackholyman
Posts: 1293
Joined: 29 Sep 2013, 22:57
Location: Denmark
Contact:

Re: OpenCV help - find the contour of many shapes

08 Jun 2020, 11:47

Hi @malcev

Thanks for helping, really not good at this but I am hoping to somehow solve it with some help :)

After reading this topic https://www.autohotkey.com/boards/viewtopic.php?t=60442 where you get help by a few other members like @just me and @Helgef

I tried changing it to this

Code: Select all

FindContours( cvimage, cvstorage, ByRef cvfirst_contour, cvheader_size, cvmode, cvmethod, cvoffset)
{
	result := this.opencv_core("cvFindContours" , "ptr" , cvimage , "ptr" , cvstorage , "Ptr*" , cvfirst_contour , "int" , cvheader_size , "int" , cvmode , "int" , cvmethod , "int64" , cvoffset, "Cdecl")
	return this.__wrapAround(result)
}
but the number of contours returned still seems blank
Also check out:
Courses on AutoHotkey

My Autohotkey Blog
:dance:
BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: OpenCV help - find the contour of many shapes

08 Jun 2020, 12:17

Helgef wrote:
08 Jun 2020, 12:11
Verboten.
:o Welch ein Gruß an den Dänischen Nachbarn. :lol: :shifty: :silent:
malcev
Posts: 1769
Joined: 12 Aug 2014, 12:37

Re: OpenCV help - find the contour of many shapes

08 Jun 2020, 12:42

Also Your structure is not correct: - int = 4 bytes, therefore it has this offsets

Code: Select all

0    . "int flags;" 			; sequence flags, including the sequence signature (CV_SEQ_MAGIC_VAL or CV_SET_MAGIC_VAL), type of the elements and some other information about the sequence.
4    . "int header_size;" 	;size of the sequence header. It should be sizeof(CvSeq) at minimum. See CreateSeq().
8   . "ptr h_next;"
8+A_PtrSize	. "ptr h_prev;"
8+2*A_PtrSize	. "ptr v_next;"
8+3*A_PtrSize	. "ptr v_prev;"			;pointers to another sequences in a sequence tree. Sequence trees are used to store hierarchical contour structures, retrieved by FindContours()
8+4*A_PtrSize    . "int total;"			;the number of sequence elements
12+4*A_PtrSize    . "int elem_size;"		;size of each sequence element in bytes
16+4*A_PtrSize    . "ptr block_max;"		;memory storage where the sequence resides. It can be a NULL pointer.
16+5*A_PtrSize    . "ptr w_ptr;"			;pointer to the first data block
16+6*A_PtrSize    . "int delta_elems;"
16+7*A_PtrSize    . "ptr storage;"
16+8*A_PtrSize   . "ptr free_blocks;"
16+9*A_PtrSize    . "ptr first;"
16+10*A_PtrSize	. "int padding1;"
20+10*A_PtrSize	. "int padding2;"
User avatar
Blackholyman
Posts: 1293
Joined: 29 Sep 2013, 22:57
Location: Denmark
Contact:

Re: OpenCV help - find the contour of many shapes

08 Jun 2020, 13:45

Thank you @Helgef

I have removed the & from the return of both Scalar(), RGB() and DllStructCreate_tagCvSeq that was the only places I found that issue...

okay thanks for the help @malcev
for now i did this

Code: Select all

tagCvContour := {"Offsets":{"flags" : 0    ; "int flags;" 			; sequence flags, including the sequence signature (CV_SEQ_MAGIC_VAL or CV_SET_MAGIC_VAL), type of the elements and some other information about the sequence.
	, "header_size" : 4    ; "int header_size;" 	;size of the sequence header. It should be sizeof(CvSeq) at minimum. See CreateSeq().
	, "h_next" : 8   ; "ptr h_next;"
	, "h_prev" : 8+A_PtrSize	; "ptr h_prev;"
	, "v_next" : 8+2*A_PtrSize	; "ptr v_next;"
	, "v_prev" : 8+3*A_PtrSize	; "ptr v_prev;"			;pointers to another sequences in a sequence tree. Sequence trees are used to store hierarchical contour structures, retrieved by FindContours()
	, "total" : 8+4*A_PtrSize   ; "int total;"			;the number of sequence elements
	, "elem_size" : 12+4*A_PtrSize    ; "int elem_size;"		;size of each sequence element in bytes
	, "block_max" : 16+4*A_PtrSize    ; "ptr block_max;"		;memory storage where the sequence resides. It can be a NULL pointer;
	, "w_ptr" : 16+5*A_PtrSize    ; "ptr w_ptr;"			;pointer to the first data block
	, "delta_elems" : 16+6*A_PtrSize    ; "int delta_elems;"
	, "storage" : 16+7*A_PtrSize    ; "ptr storage;"
	, "free_blocks" : 16+8*A_PtrSize   ; "ptr free_blocks;"
	, "first" : 16+9*A_PtrSize    ; "ptr first;"
	, "padding1" : 16+10*A_PtrSize	; "int padding1;"
	, "padding2" : 20+10*A_PtrSize }}	; "int padding2;"
and tried using it like this

Code: Select all

;// find all exterior and inner contours in a list format (no vertical)
;// $num_found = _cvFindContours($pimgBW, $pstorage, $pcontours, DllStructGetSize(DllStructCreate($tagCvContour)), $CV_RETR_LIST, $CV_CHAIN_APPROX_SIMPLE, _cvPoint(0,0))
num_found := cv.FindContours(pimgBW, pstorage, pcontours, header_Size := tagCvContour.offsets.padding2+A_ptrsize, cv.Constants.CV_RETR_LIST, cv.Constants.CHAIN_APPROX_SIMPLE, cv.Point(0,0))
msgbox % "Number of contours found = " num_found
and like this

Code: Select all

;// find all exterior and inner contours in a list format (no vertical)
;// $num_found = _cvFindContours($pimgBW, $pstorage, $pcontours, DllStructGetSize(DllStructCreate($tagCvContour)), $CV_RETR_LIST, $CV_CHAIN_APPROX_SIMPLE, _cvPoint(0,0))
;// int header_size CV_DEFAULT(sizeof(CvContour))
num_found := cv.FindContours(pimgBW, pstorage, pcontours, header_Size := tagCvContour.offsets.header_size, cv.Constants.CV_RETR_LIST, cv.Constants.CHAIN_APPROX_SIMPLE, cv.Point(0,0))
msgbox % "Number of contours found = " num_found
the return value still seems blank :( not sure if my feeble attempts are doing anything
Also check out:
Courses on AutoHotkey

My Autohotkey Blog
:dance:
malcev
Posts: 1769
Joined: 12 Aug 2014, 12:37

Re: OpenCV help - find the contour of many shapes

08 Jun 2020, 15:16

In Scalar() and RGB() it is OK.

Code: Select all

msgbox % numget(_cvScalar(1)+0, 0, "double")

_cvScalar(value)
{
   VarSetCapacity(vScalar, 8, 0)
   NumPut(value, vScalar, 0, "double")
   return &vScalar
}
Also You have to test each dllcall for errors.
User avatar
Blackholyman
Posts: 1293
Joined: 29 Sep 2013, 22:57
Location: Denmark
Contact:

Re: OpenCV help - find the contour of many shapes

08 Jun 2020, 16:17

okay i fixed those two back :)

In my tests everything up until cv.FindContours() seems to be working without any errors but i truly do not know if the pointer i seem to be getting from this pcontours := cv.CreateSeq(0, 64, 16, pstorage) is right or if the parameters i am passing to cv.FindContours() are correct or not

Code: Select all

#NoEnv
#Persistent
#SingleInstance Force 
SetBatchLines, -1

#Include <OpenCV>
#Include <gdip>

; Create a fully opaque red brush (ARGB = Transparency, red, green, blue) to draw a circle
; pBrush := Gdip_BrushCreateSolid(0xffff0000)
; pPen := Gdip_CreatePenFromBrush(pBrush, 1.0)


tagCvContour := {"Offsets":{"flags" : 0    ; "int flags;" 			; sequence flags, including the sequence signature (CV_SEQ_MAGIC_VAL or CV_SET_MAGIC_VAL), type of the elements and some other information about the sequence.
	, "header_size" : 4    ; "int header_size;" 	;size of the sequence header. It should be sizeof(CvSeq) at minimum. See CreateSeq().
	, "h_next" : 8   ; "ptr h_next;"
	, "h_prev" : 8+A_PtrSize	; "ptr h_prev;"
	, "v_next" : 8+2*A_PtrSize	; "ptr v_next;"
	, "v_prev" : 8+3*A_PtrSize	; "ptr v_prev;"			;pointers to another sequences in a sequence tree. Sequence trees are used to store hierarchical contour structures, retrieved by FindContours()
	, "total" : 8+4*A_PtrSize   ; "int total;"			;the number of sequence elements
	, "elem_size" : 12+4*A_PtrSize    ; "int elem_size;"		;size of each sequence element in bytes
	, "block_max" : 16+4*A_PtrSize    ; "ptr block_max;"		;memory storage where the sequence resides. It can be a NULL pointer;
	, "w_ptr" : 16+5*A_PtrSize    ; "ptr w_ptr;"			;pointer to the first data block
	, "delta_elems" : 16+6*A_PtrSize    ; "int delta_elems;"
	, "storage" : 16+7*A_PtrSize    ; "ptr storage;"
	, "free_blocks" : 16+8*A_PtrSize   ; "ptr free_blocks;"
	, "first" : 16+9*A_PtrSize    ; "ptr first;"
	, "padding1" : 16+10*A_PtrSize	; "int padding1;"
	, "padding2" : 20+10*A_PtrSize }}	; "int padding2;"

file := "Images\shapes.jpg"

; Create OpenCV instance.
cv := new OpenCV()

pImg := cv.LoadImage(file) ; Load IPL type image
; pImg := cv.BmpToIPL(pBitmap) ; Load Bitmap image

cv.ShowImage("Example-in", pImg) ; Display input image inside window

; Create destination images
pimgGrayScale := cv.CreateImage(cv.GetSize(pImg, width, height), 8, 1)

cv.Smooth( pimg, pimg, GAUSSIAN:=2, 3, 3) ;
;cv.ShowImage("Example-in2", pImg) ; Display input image inside window

cv.CvtColor( pimg, pimgGrayScale, cv.Constants.BGR2GRAY) ; BGR2GRAY = 6
;cv.ShowImage("Example-in3", pimgGrayScale) ; Display input image inside window

;//get ride of some noise by erode and dilate and convert to black and white image
pimgBW := cv.CreateImage( cv.GetSize(pimg), 8, 1) ;

cv.Erode( pimgGrayScale, pimgBW , Null:=0, 3 )
;cv.ShowImage("Example-in4", pimgBW) ; Display input image inside window

cv.Threshold( pimgBW, pimgBW, 200, 255, cv.Constants.THRESH_BINARY) ;// may need to adjust threshold value (200)
;cv.ShowImage("Example-in5", pimgBW) ; Display input image inside window

cv.Dilate( pimgBW, pimgBW, Null:=0, 3 )
;cv.ShowImage("Example-in6", pimgBW) ; Display input image inside window

cv.Threshold( pimgBW, pimgBW, 128, 255, cv.Constants.THRESH_BINARY_INV) ;

;// show black and white image
cv.ShowImage( "Example-bw", pimgBW) ;

; //setup memory block
; Local $pstorage = _cvCreateMemStorage(0); //storage area for all contours
pStorage := cv.CreateMemStorage(0) ; Storage area for all contours

; //setup sequence block
tagCvPoint := ""
. "int x;"
. "int y;"

; Local $pcontours = _cvCreateSeq(0, 64, DllStructGetSize(DllStructCreate($tagCvPoint)), $pstorage);
pcontours := cv.CreateSeq(0, 64, 16, pstorage)

msgbox % "Pointer to contours -> " pcontours

;// find all exterior and inner contours in a list format (no vertical)
;// $num_found = _cvFindContours($pimgBW, $pstorage, $pcontours, DllStructGetSize(DllStructCreate($tagCvContour)), $CV_RETR_LIST, $CV_CHAIN_APPROX_SIMPLE, _cvPoint(0,0))
num_found := cv.FindContours(pimgBW, pstorage, pcontours, header_Size := tagCvContour.offsets.padding2+A_ptrsize, cv.Constants.CV_RETR_LIST, cv.Constants.CHAIN_APPROX_SIMPLE, cv.Point(0,0))
msgbox % "Number of contours found = " num_found

cv.ReleaseImage( pimgBW ) ;
cv.ReleaseImage( pimgGrayScale ) ;
cv.ReleaseImage( pimg ) ;
cv.DestroyAllWindows() ;
cv.ClearMemStorage( pstorage ) ;
cv.ClearSeq(pcontours) ;
return

DllStructCreate_tagCvSeq(pointer="")
{
	tagCvSeq := {"Offsets":{"flags" : 0    ; "int flags;" 			; sequence flags, including the sequence signature (CV_SEQ_MAGIC_VAL or CV_SET_MAGIC_VAL), type of the elements and some other information about the sequence.
	, "header_size" : 4    ; "int header_size;" 	;size of the sequence header. It should be sizeof(CvSeq) at minimum. See CreateSeq().
	, "h_next" : 8   ; "ptr h_next;"
	, "h_prev" : 8+A_PtrSize	; "ptr h_prev;"
	, "v_next" : 8+2*A_PtrSize	; "ptr v_next;"
	, "v_prev" : 8+3*A_PtrSize	; "ptr v_prev;"			;pointers to another sequences in a sequence tree. Sequence trees are used to store hierarchical contour structures, retrieved by FindContours()
	, "total" : 8+4*A_PtrSize   ; "int total;"			;the number of sequence elements
	, "elem_size" : 12+4*A_PtrSize    ; "int elem_size;"		;size of each sequence element in bytes
	, "block_max" : 16+4*A_PtrSize    ; "ptr block_max;"		;memory storage where the sequence resides. It can be a NULL pointer;
	, "w_ptr" : 16+5*A_PtrSize    ; "ptr w_ptr;"			;pointer to the first data block
	, "delta_elems" : 16+6*A_PtrSize    ; "int delta_elems;"
	, "storage" : 16+7*A_PtrSize    ; "ptr storage;"
	, "free_blocks" : 16+8*A_PtrSize   ; "ptr free_blocks;"
	, "first" : 16+9*A_PtrSize    ; "ptr first;"
	, "padding1" : 16+10*A_PtrSize	; "int padding1;"
	, "padding2" : 20+10*A_PtrSize }}	; "int padding2;"
	
	if (pointer != "")
		Struct := pointer
	else
		VarSetCapacity(Struct, 64, 0)
	
	NumPut(flags, struct+0, 		tagCvSeq.Offsets.falgs, "int") ; "int flags;" 				; sequence flags, including the sequence signature (CV_SEQ_MAGIC_VAL or CV_SET_MAGIC_VAL), type of the elements and some other information about the sequence.
	NumPut(header_size, struct+0, tagCvSeq.Offsets.header_size, "int") ; "int header_size;" 	;size of the sequence header. It should be sizeof(CvSeq) at minimum. See CreateSeq().
	NumPut(h_next, struct+0,		tagCvSeq.Offsets.h_next, "ptr") ; "ptr h_next;"
	NumPut(h_prev, struct+0,		tagCvSeq.Offsets.h_prev, "ptr") ; "ptr h_prev;"
	NumPut(v_next, struct+0,		tagCvSeq.Offsets.v_next, "ptr") ; "ptr v_next;"
	NumPut(v_prev, struct+0,		tagCvSeq.Offsets.v_prev, "ptr") ; "ptr v_prev;"			;pointers to another sequences in a sequence tree. Sequence trees are used to store hierarchical contour structures, retrieved by FindContours()
	NumPut(total, struct+0, 		tagCvSeq.Offsets.total, "int") ; "int total;"				;the number of sequence elements
	NumPut(elem_size, struct+0, 	tagCvSeq.Offsets.elem_size, "int") ; "int elem_size;"		;size of each sequence element in bytes
	NumPut(block_max, struct+0, 	tagCvSeq.Offsets.block_max, "ptr") ; "ptr block_max;"		;memory storage where the sequence resides. It can be a NULL pointer.
	NumPut(w_ptr, struct+0, 		tagCvSeq.Offsets.w_ptr, "ptr") ; "ptr w_ptr;"				;pointer to the first data block
	NumPut(delta_elems, struct+0, tagCvSeq.Offsets.delta_elems, "int") ; "int delta_elems;"
	NumPut(storage, struct+0, 	tagCvSeq.Offsets.storage, "ptr") ; "ptr storage;"
	NumPut(free_blocks, struct+0, tagCvSeq.Offsets.free_blocks, "ptr") ; "ptr free_blocks;"
	NumPut(first, struct+0, 		tagCvSeq.Offsets.first, "ptr") ; "ptr first;"
	NumPut(padding1, struct+0, 	tagCvSeq.Offsets.padding1, "int") ; "int padding1;"
	NumPut(padding2, struct+0, 	tagCvSeq.Offsets.padding2, "int") ; "int padding2;"
	return struct
}

DllStructGetData(VarOrAddress, offset, type)
{
	return NumGet(VarOrAddress+0, offset, type)
}

~ESC:: ExitApp
this runs seems to be working images show up color and black&white but cv.FindContours() seems to still return a blank
Also check out:
Courses on AutoHotkey

My Autohotkey Blog
:dance:
malcev
Posts: 1769
Joined: 12 Aug 2014, 12:37

Re: OpenCV help - find the contour of many shapes

08 Jun 2020, 18:29

Sorry, I do not want to inspect Your complicated code.
For me it works like this:

Code: Select all

file := "shapes.jpg"
window1 := "Example-in"
window2 := "Example-bw"

Global opencv := { opencv_core: "opencv_core2413.dll" 
, opencv_highgui: "opencv_highgui2413.dll"
, opencv_imgproc: "opencv_imgproc2413.dll" }
_OpenCV_Startup()

pimg := _cvLoadImage(file)
_cvShowImage(window1, pimg)
pimgGrayScale := _cvCreateImage(_cvGetSize(pimg, width, height), 8, 1)
_cvSmooth(pimg, pimg, CV_GAUSSIAN := 2, 3, 3)
_cvCvtColor(pimg, pimgGrayScale, CV_BGR2GRAY := 6)
pimgBW := _cvCreateImage(_cvGetSize(pimg, width, height), 8, 1)
_cvErode(pimgGrayScale, pimgBW, 0, 3)
_cvThreshold(pimgBW, pimgBW, 200, 255, CV_THRESH_BINARY := 0)
_cvDilate(pimgBW, pimgBW, 0, 3)
_cvThreshold(pimgBW, pimgBW, 128, 255, CV_THRESH_BINARY_INV := 1)
_cvShowImage(window2, pimgBW)
pstorage := _cvCreateMemStorage(0)
pcontours := _cvCreateSeq(0, 24+10*A_PtrSize, tagCvPointSize := 8, pstorage)
msgbox % num_found := _cvFindContours(pimgBW, pstorage, pcontours, 56+10*A_PtrSize, CV_RETR_LIST := 1, CV_CHAIN_APPROX_SIMPLE := 2, 0)



_OpenCV_Startup()
{
   For key, value in opencv
      DllCall("LoadLibrary", "Str", value, "Ptr")
}

_cvLoadImage(filename, iscolor := 1)  ;  CV_LOAD_IMAGE_COLOR
{
   Result := DllCall(opencv.opencv_highgui "\cvLoadImage", "AStr", filename, "int", iscolor, "Cdecl ptr")
   if !Result or ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
   return Result
}

_cvNamedWindow(name, flags := 0x00000001)   ;   CV_WINDOW_AUTOSIZE 
{
   DllCall(opencv.opencv_highgui "\cvNamedWindow", "AStr", name, "int", flags, "Cdecl ptr")
   if ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
}

_cvShowImage(name, pimage)
{
   DllCall(opencv.opencv_highgui "\cvShowImage", "AStr", name, "ptr", pimage, "Cdecl")
   if ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
}

_cvGetSize(pimage, ByRef width := 0, ByRef height := 0)
{
   WidthHeight := DllCall(opencv.opencv_core "\cvGetSize", "ptr", pimage, "Cdecl int64")
   width := 0xFFFFFFFF & WidthHeight
   height := WidthHeight >> 32
   if ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
   return WidthHeight
}

_cvCreateMat(cvrows, cvcols, cvtype)
{
   Result := DllCall(opencv.opencv_core "\cvCreateMat", "int", cvrows, "int", cvcols, "int", cvtype, "Cdecl ptr")
   if !Result or ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
   return Result
}

_cvMatchTemplate(cvimage, cvtempl, cvresult, cvmethod)
{
   DllCall(opencv.opencv_imgproc "\cvMatchTemplate", "ptr", cvimage, "ptr", cvtempl, "ptr", cvresult, "int", cvmethod, "Cdecl")
   if ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
}

_cvNormalize(cvsrc, cvdst, cva, cvb, cvnorm_type, cvmask)
{
   DllCall(opencv.opencv_core "\cvNormalize", "ptr", cvsrc, "ptr", cvdst, "Double", cva, "Double", cvb, "int", cvnorm_type, "ptr", cvmask, "Cdecl")
   if ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
}

_cvThreshold(cvsrc, cvdst, cvthreshold, cvmax_value, cvthreshold_type)
{
   DllCall(opencv.opencv_imgproc "\cvThreshold", "ptr", cvsrc, "ptr", cvdst, "Double", cvthreshold, "Double", cvmax_value, "int", cvthreshold_type, "Cdecl double")
   if ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
}

_cvSize(width, height)
{
   return width&0xFFFFFFFF|height<<32
}

_cvPoint(x, y)
{
   return x&0xFFFFFFFF|y<<32
}

_cvCreateImage(cvsize, cvdepth, cvchannels)
{
   Result := DllCall(opencv.opencv_core "\cvCreateImage", "int64", cvsize, "int", cvdepth, "int", cvchannels, "Cdecl ptr")
   if !Result or ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
   return Result
}

_cvArrTohBitmap(pimage, byref width = "", byref height = "") { 
	Result := _cvCreateImage(_cvGetSize(pimage, width, height), 8, 4)
	_cvCvtColor(pimage, Result, 0)  
	pData := NumGet(Result + 0, 68 + 20 * (A_PtrSize = 8), "Ptr")
	hBitmap := DllCall("CreateBitmap", "Int", width, "Int", height, "UInt", 1, "UInt", 32, "Ptr", pData)
	Return hBitmap, _cvReleaseImage(Result)
}

_cvScalar(value)
{
   VarSetCapacity(vScalar, 32, 0)
   if IsObject(value)
   {
      loop 4
         NumPut(value%A_Index%, vScalar, (A_Index-1)*8, "double")
   }
   else
   {
      loop 4
         NumPut(value, vScalar, (A_Index-1)*8, "double")
   }
   return &vScalar
}

_CV_RGB(cvRed, cvGreen, cvBlue)
{
   VarSetCapacity(vScalar, 32, 0)
   NumPut(cvBlue, vScalar, 0, "double")
   NumPut(cvGreen, vScalar, 8, "double")
   NumPut(cvRed, vScalar, 16, "double")
   NumPut(0, vScalar, 24, "double")
   return &vScalar
}

_cvSet(cvarr, cvvalue, cvmask := 0)
{
   if (A_PtrSize = 4)
      DllCall(opencv.opencv_core "\cvSet", "ptr", cvarr, "double", NumGet(cvvalue+0, 0, "double"), "double", NumGet(cvvalue+0, 8, "double"), "double", NumGet(cvvalue+0, 16, "double"), "double", NumGet(cvvalue+0, 24, "double"), "ptr", cvmask, "Cdecl")
   else
      DllCall(opencv.opencv_core "\cvSet", "ptr", cvarr, "ptr", cvvalue, "ptr", cvmask, "Cdecl")
   if ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
}

_cvMinMaxLoc(cvarr, cvmin_val, cvmax_val, cvmin_loc, cvmax_loc, cvmask)
{
   DllCall(opencv.opencv_core "\cvMinMaxLoc", "ptr", cvarr, "ptr", cvmin_val, "ptr", cvmax_val, "ptr", cvmin_loc, "ptr", cvmax_loc, "ptr", cvmask, "Cdecl")
   if ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
}

_cvRectangle(cvimg, cvpt1, cvpt2, cvcolor, cvthickness, cvline_type, cvshift)
{
   if (A_PtrSize = 4)
      DllCall(opencv.opencv_core "\cvRectangle", "ptr", cvimg, "int64", cvpt1, "int64", cvpt2, "double", NumGet(cvcolor+0, 0, "double"), "double", NumGet(cvcolor+0, 8, "double"), "double", NumGet(cvcolor+0, 16, "double"), "double", NumGet(cvcolor+0, 24, "double"), "int", cvthickness, "int", cvline_type, "int", cvshift, "Cdecl")
   else
      DllCall(opencv.opencv_core "\cvRectangle", "ptr", cvimg, "int64", cvpt1, "int64", cvpt2, "ptr", cvcolor, "int", cvthickness, "int", cvline_type, "int", cvshift, "Cdecl")
   if ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
}

_cvCvtColor(cvsrc, cvdst, cvcode)
{
   DllCall(opencv.opencv_imgproc "\cvCvtColor", "ptr", cvsrc, "ptr", cvdst, "int", cvcode, "Cdecl")
   if ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
}

_cvResize(cvsrc, cvdst, cvinterpolation := 1)   ; CV_INTER_LINEAR
{
   DllCall(opencv.opencv_imgproc "\cvResize", "ptr", cvsrc, "ptr", cvdst, "int", cvinterpolation, "Cdecl")
   if ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
}

_cvEqualizeHist(cvsrc, cvdst)
{
   DllCall(opencv.opencv_imgproc "\cvEqualizeHist", "ptr", cvsrc, "ptr", cvdst, "Cdecl")
   if ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
}

_cvLoad(cvfilename, cvmemstorage := 0, cvname := 0, cvreal_name := 0)
{
   Result := DllCall(opencv.opencv_core "\cvLoad", "AStr", cvfilename, "ptr", cvmemstorage, "ptr", cvname, "ptr", cvreal_name, "Cdecl ptr")
   if ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
   return Result
}

_cvCreateMemStorage(cvblock_size)
{
   Result := DllCall(opencv.opencv_core "\cvCreateMemStorage", "int", cvblock_size, "Cdecl ptr")
   if ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
   return Result
}

_cvClearMemStorage(cvstorage)
{
   DllCall(opencv.opencv_core "\cvClearMemStorage", "ptr", cvstorage, "Cdecl")
   if ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
}

_cvHaarDetectObjects(cvimage, cvcascade, cvstorage, cvscale_factor := 1.1, cvmin_neighbors := 3, cvflags := 0, cvmin_size := 0, cvmax_size := 0)
{
   Result := DllCall(opencv.opencv_objdetect "\cvHaarDetectObjects", "ptr", cvimage, "ptr", cvcascade, "ptr", cvstorage, "double", cvscale_factor, "int", cvmin_neighbors, "int", cvflags, "int64", cvmin_size, "int64", cvmax_size, "Cdecl ptr")
   if ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
   return Result
}

_cvGetSeqElem(cvseq, cvindex)
{
   Result := DllCall(opencv.opencv_core "\cvGetSeqElem", "ptr", cvseq, "int", cvindex, "Cdecl ptr")
   if !Result or ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
   return Result
}

_cvCreateSeq(cvseq_flags, cvheader_size, cvelem_size, cvstorage)
{
   Result := DllCall(opencv.opencv_core "\cvCreateSeq", "int", cvseq_flags, "ptr", cvheader_size, "ptr", cvelem_size, "ptr", cvstorage, "Cdecl ptr")
   if !Result or ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
   return Result
}

_cvDilate(cvsrc, cvdst, cvelement = 0, cviterations = 1)
{
   Result := DllCall(opencv.opencv_imgproc "\cvDilate", "ptr", cvsrc, "ptr", cvdst, "ptr", cvelement, "int", cviterations, "Cdecl")
   if !Result or ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
   return Result
}

_cvErode(cvsrc, cvdst, cvelement = 0, cviterations = 1)
{
   Result := DllCall(opencv.opencv_imgproc "\cvErode", "ptr", cvsrc, "ptr", cvdst, "ptr", cvelement, "int", cviterations, "Cdecl")
   if !Result or ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
   return Result
}

_cvSmooth(cvsrc, cvdst, cvsmoothtype = 2, cvsize1 = 3, cvsize2 = 0, cvsigma1 = 0, cvsigma2 = 0)
{
   Result := DllCall(opencv.opencv_imgproc "\cvSmooth", "ptr", cvsrc, "ptr", cvdst, "int", cvsmoothtype, "int", cvsize1, "int", cvsize2, "double", cvsigma1, "double", cvsigma2, "Cdecl")
   if !Result or ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
   return Result
}

_cvFindContours(cvimage, cvstorage, ByRef cvfirst_contour, cvheader_size, cvmode, cvmethod, cvoffset)
{
   Result := DllCall(opencv.opencv_imgproc "\cvFindContours", "ptr", cvimage, "ptr", cvstorage, "ptr*", cvfirst_contour, "int", cvheader_size, "int", cvmode, "int", cvmethod, "int64", cvoffset, "Cdecl")
   if !Result or ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
   return Result
}

_cvReleaseImage(pimage)
{
   DllCall(opencv.opencv_core "\cvReleaseImage", "ptr*", pimage, "Cdecl")
   if ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
}

_cvReleaseMat(cvmat)
{
   DllCall(opencv.opencv_core "\cvReleaseMat", "ptr*", cvmat, "Cdecl")
   if ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
}

_cvDestroyAllWindows()
{
   DllCall(opencv.opencv_highgui "\cvDestroyAllWindows", "Cdecl")
   if ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
}

_cvClearSeq(cvseq)
{
   DllCall(opencv.opencv_core "\cvClearSeq", "ptr", cvseq, "Cdecl")
   if ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
}

_Opencv_CloseDLL()
{
   For key, value in opencv
      if hModule := DllCall("GetModuleHandle", "str", value)
         DllCall("FreeLibrary", "ptr", hModule)
}

_Error(val)
{
   msgbox % val "`nLastError - " A_LastError
   ExitApp
}
Helgef
Posts: 4709
Joined: 17 Jul 2016, 01:02
Contact:

Re: OpenCV help - find the contour of many shapes

09 Jun 2020, 00:26

malcev wrote:
08 Jun 2020, 15:16
In Scalar() and RGB() it is OK.
It is not OK. Local variables are for use only when the function executes. You have no guarantees after the function returns. For example, this will fail,

Code: Select all

value := 1.000000000000011
msgbox % numget(_cvScalar(value), 0, "double") == value
It fails because when the function returns, it stores an empty string at the address you return, overwriting the first (two) byte(s) with the zero terminator.
You can use byref,

Code: Select all

_cvScalar(byref storage)
{
   if !isByref(storage)
		throw
   value := storage
   VarSetCapacity(storage, 8, 0)
   NumPut(value, storage, 0, "double")
   return
}
value := cpy := 1.000000000000011
_cvScalar(value)
msgbox % numget(value, "double") == cpy
V2 documentation says,
& wrote: The address is usually not valid after MyVar has been reassigned by means of any of the assignment operators (including ++ and --), or has been used as an output variable for a built-in function. The address of the contents of a function's local variable is not valid after the function returns. The address of an object is valid only until its last reference has been released.
V1 docs doesn't say this, but it applies to v1 too.

Cheers.
just me
Posts: 9442
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: OpenCV help - find the contour of many shapes

09 Jun 2020, 04:37

Hi Blackholyman,

do you run 32-bit or 64-bit AHK/DLLs?
(I don't know if OpenCV 2.4.13 supports 64-bit.)
User avatar
Blackholyman
Posts: 1293
Joined: 29 Sep 2013, 22:57
Location: Denmark
Contact:

Re: OpenCV help - find the contour of many shapes

09 Jun 2020, 06:50

Hi @just me

i'm using 32-bit AHK/dlls
Also check out:
Courses on AutoHotkey

My Autohotkey Blog
:dance:
User avatar
Blackholyman
Posts: 1293
Joined: 29 Sep 2013, 22:57
Location: Denmark
Contact:

Re: OpenCV help - find the contour of many shapes

09 Jun 2020, 07:32

Hi @malcev

After seeing your working example above i have gone over all my class methods/functions with a fine tooth comb and did find out why FindContours kept failing even after making the size and other small fixes

your version:

Code: Select all

_cvFindContours(cvimage, cvstorage, ByRef cvfirst_contour, cvheader_size, cvmode, cvmethod, cvoffset)
{
   Result := DllCall(opencv.opencv_imgproc "\cvFindContours", "ptr", cvimage, "ptr", cvstorage, "ptr*", cvfirst_contour, "int", cvheader_size, "int", cvmode, "int", cvmethod, "int64", cvoffset, "Cdecl")
   if !Result or ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
   return Result
}
my version

Code: Select all

FindContours( 	cvimage, cvstorage, ByRef cvfirst_contour, cvheader_size, cvmode, cvmethod, cvoffset)
{
	result := this.opencv_core("cvFindContours" , "ptr" , cvimage , "ptr" , cvstorage , "Ptr*" , cvfirst_contour , "int" , cvheader_size , "int" , cvmode , "int" , cvmethod , "int64" , cvoffset, "Cdecl")
	return this.__wrapAround(A_ThisFunc, result)
}
also found an error in the class method __wrapAround so it was not showing errors

class with those things fixed

Code: Select all

class OpenCV {
	
	__New() {
		this.Libs := new this.Libs(this)
		this.error := this.__Init.error
	}
	
	class Constants {
		static PI := 3.1415926535897932384626433832795
		static LOG2 := 0.69314718055994530941723212145818
		static AUTO_STEP := 0x7fffffff
		static DEFAULT := 0
		
		static LOAD_IMAGE_UNCHANGED := -1
		static LOAD_IMAGE_GRAYSCALE := 0
		static LOAD_IMAGE_COLOR := 1
		static LOAD_IMAGE_ANYDEPTH := 2
		static LOAD_IMAGE_ANYCOLOR := 4
		
		; These 4 flags are used by cvSet/GetWindowProperty
		static WND_PROP_FULLSCREEN := 0 	; to change/get window's fullscreen property
		static WND_PROP_AUTOSIZE := 1 		; to change/get window's autosize property
		static WND_PROP_ASPECTRATIO := 2 	; to change/get window's aspectratio property
		static WND_PROP_OPENGL := 3 		; to change/get window's opengl support
		
		; These 3 flags are used by cvNamedWindow and cvSet/GetWindowProperty
		static WINDOW_NORMAL := 0x00000000		; the user can resize the window (no constraint)  / also use to switch a fullscreen window to a normal size
		static WINDOW_AUTOSIZE := 0x00000001	; the user cannot resize the window, the size is constrainted by the image displayed
		static WINDOW_OPENGL := 0x00001000		; window with opengl support
		
		; Those flags are only for Qt
		static GUI_EXPANDED := 0x00000000	; status bar and tool bar
		static GUI_NORMAL := 0x00000010	; old fashious way
		
		; These 3 flags are used by cvNamedWindow and cvSet/GetWindowProperty
		static WINDOW_FULLSCREEN := 1			; change the window to fullscreen
		static WINDOW_FREERATIO := 0x00000100	; the image expends as much as it can (no ratio constraint)
		static WINDOW_KEEPRATIO := 0x00000000	; the ration image is respected.
		
		; Video Files and Cameras types and parameters
		static CAP_PROP_POS_MSEC := 0
		static CAP_PROP_POS_FRAMES := 1
		static CAP_PROP_POS_AVI_RATIO := 2
		static CAP_PROP_FRAME_WIDTH := 3
		static CAP_PROP_FRAME_HEIGHT := 4
		static CAP_PROP_FPS := 5
		static CAP_PROP_FOURCC := 6
		static CAP_PROP_FRAME_COUNT := 7
		static CAP_PROP_FORMAT := 8
		static CAP_PROP_MODE := 9
		static CAP_PROP_BRIGHTNESS := 10
		static CAP_PROP_CONTRAST := 11
		static CAP_PROP_SATURATION := 12
		static CAP_PROP_HUE := 13
		static CAP_PROP_GAIN := 14
		static CAP_PROP_EXPOSURE := 15
		static CAP_PROP_CONVERT_RGB := 16
		static CAP_PROP_WHITE_BALANCE_BLUE_U := 17
		static CAP_PROP_RECTIFICATION := 18
		static CAP_PROP_MONOCROME := 19
		static CAP_PROP_SHARPNESS := 20
		static CAP_PROP_AUTO_EXPOSURE := 21
		static CAP_PROP_GAMMA := 22
		static CAP_PROP_TEMPERATURE := 23
		static CAP_PROP_TRIGGER := 24
		static CAP_PROP_TRIGGER_DELAY := 25
		static CAP_PROP_WHITE_BALANCE_RED_V := 26
		static CAP_PROP_ZOOM := 27
		static CAP_PROP_FOCUS := 28
		static CAP_PROP_GUID := 29
		static CAP_PROP_ISO_SPEED := 30
		static CAP_PROP_MAX_DC1394 := 31
		static CAP_PROP_BACKLIGHT := 32
		static CAP_PROP_PAN := 33
		static CAP_PROP_TILT := 34
		static CAP_PROP_ROLL := 35
		static CAP_PROP_IRIS := 36
		static CAP_PROP_SETTINGS := 37
		
		; Different constant used by opencv for selecting webcam ie. dshow web cam index would be 700, 701, 702, etc...
		static CAP_ANY := 0 ;     // autodetect
		static CAP_MIL := 100 ;   // MIL proprietary drivers
		static CAP_VFW := 200 ;   // platform native
		static CAP_V4L := 200 ;
		static CAP_V4L2 := 200 ;
		static CAP_FIREWARE := 300 ;   // IEEE 1394 drivers
		static CAP_FIREWIRE := 300 ;
		static CAP_IEEE1394 := 300 ;
		static CAP_DC1394 := 300 ;
		static CAP_CMU1394 := 300 ;
		static CAP_STEREO := 400 ;   // TYZX proprietary drivers
		static CAP_TYZX := 400 ;
		static TYZX_LEFT := 400 ;
		static TYZX_RIGHT := 401 ;
		static TYZX_COLOR := 402 ;
		static TYZX_Z := 403 ;
		static CAP_QT := 500 ;   // QuickTime
		static CAP_UNICAP := 600 ;   // Unicap drivers
		static CAP_DSHOW := 700 ;   // DirectShow (via videoInput)
		static CAP_MSMF := 1400 ;  // Microsoft Media Foundation (via videoInput)
		static CAP_PVAPI := 800 ;   // PvAPI, Prosilica GigE SDK
		static CAP_OPENNI := 900 ;   // OpenNI (for Kinect)
		static CAP_OPENNI_ASUS := 910 ;   // OpenNI (for Asus Xtion)
		static CAP_ANDROID := 1000 ;  // Android
		static CAP_XIAPI := 1100 ;   // XIMEA Camera API
		static CAP_AVFOUNDATION := 1200 ;  // AVFoundation framework for iOS (OS X Lion will have the same API)
		static CAP_GIGANETIX := 1300 ;  // Smartek Giganetix GigEVisionSDK
		
		;/* Image smooth methods */
		static BLUR_NO_SCALE := 0
		static BLUR := 1
		static GAUSSIAN := 2
		static MEDIAN := 3
		static BILATERAL := 4
		
		; image types
		static IPL_DEPTH_SIGN := 0x80000000
		
		static IPL_DEPTH_1U := 1
		static IPL_DEPTH_8U := 8
		static IPL_DEPTH_16U := 16
		static IPL_DEPTH_32F := 32
		
		static IPL_DEPTH_8S := 0x80000000 | 8
		static IPL_DEPTH_16S := 0x80000000 | 16
		static IPL_DEPTH_32S := 0x80000000 | 32
		
		; CV channel types
		static 8UC1 := 0
		static 8UC2 := 8
		static 8UC3 := 16
		static 8UC4 := 24
		
		static 8SC1 := 1
		static 8SC2 := 9
		static 8SC3 := 17
		static 8SC4 := 25
		
		static 16UC1 := 2
		static 16UC2 := 10
		static 16UC3 := 18
		static 16UC4 := 26
		
		static 16SC1 := 3
		static 16SC2 := 11
		static 16SC3 := 19
		static 16SC4 := 27
		
		static 32SC1 := 3
		static 32SC2 := 12
		static 32SC3 := 20
		static 32SC4 := 28
		
		static 32FC1 := 5
		static 32FC2 := 13
		static 32FC3 := 21
		static 32FC4 := 29
		
		static 64FC1 := 6
		static 64FC2 := 14
		static 64FC3 := 22
		static 64FC4 := 30
		
		; Mouse
		static EVENT_MOUSEMOVE := 0
		static EVENT_LBUTTONDOWN := 1
		static EVENT_RBUTTONDOWN := 2
		static EVENT_MBUTTONDOWN := 3
		static EVENT_LBUTTONUP := 4
		static EVENT_RBUTTONUP := 5
		static EVENT_MBUTTONUP := 6
		static EVENT_LBUTTONDBLCLK := 7
		static EVENT_RBUTTONDBLCLK := 8
		static EVENT_MBUTTONDBLCLK := 9
		
		static EVENT_FLAG_LBUTTON := 1
		static EVENT_FLAG_RBUTTON := 2
		static EVENT_FLAG_MBUTTON := 4
		static EVENT_FLAG_CTRLKEY := 8
		static EVENT_FLAG_SHIFTKEY := 16
		static EVENT_FLAG_ALTKEY := 32
		
		; Save file image format
		static IMWRITE_JPEG_QUALITY := 1
		static IMWRITE_PNG_COMPRESSION := 16
		static IMWRITE_PNG_STRATEGY := 17
		static IMWRITE_PNG_BILEVEL := 18
		static IMWRITE_PNG_STRATEGY_DEFAULT := 0
		static IMWRITE_PNG_STRATEGY_FILTERED := 1
		static IMWRITE_PNG_STRATEGY_HUFFMAN_ONLY := 2
		static IMWRITE_PNG_STRATEGY_RLE := 3
		static IMWRITE_PNG_STRATEGY_FIXED := 4
		static IMWRITE_PXM_BINARY := 32
		
		; cvConvertImage flip types
		static CVTIMG_FLIP := 1
		static CVTIMG_SWAP_RB := 2
		
		; compare operation
		static CMP_EQ := 0
		static CMP_GT := 1
		static CMP_GE := 2
		static CMP_LT := 3
		static CMP_LE := 4
		static CMP_NE := 5
		
		; cvSort flags
		static SORT_EVERY_ROW := 0
		static SORT_EVERY_COLUMN := 1
		static SORT_ASCENDING := 0
		static SORT_DESCENDING := 16
		
		;/* types of array norm */
		static C := 1
		static L1 := 2
		static L2 := 4
		static NORM_MASK := 7
		static RELATIVE := 8
		static DIFF := 16
		static MINMAX := 32
		
		static DIFF_C := 16 | 1
		static DIFF_L1 := 16 | 2
		static DIFF_L2 := 16 | 4
		static RELATIVE_C := 8 | 1
		static RELATIVE_L1 := 8 | 2
		static RELATIVE_L2 := 8 | 4
		
		;/*********************************** CPU capabilities ***********************************/
		
		static CPU_NONE := 0
		static CPU_MMX := 1
		static CPU_SSE := 2
		static CPU_SSE2 := 3
		static CPU_SSE3 := 4
		static CPU_SSSE3 := 5
		static CPU_SSE4_1 := 6
		static CPU_SSE4_2 := 7
		static CPU_POPCNT := 8
		static CPU_AVX := 10
		static HARDWARE_MAX_FEATURE := 255
		
		; cvFindChessBoard flag
		
		static CALIB_CB_ADAPTIVE_THRESH := 1
		static CALIB_CB_NORMALIZE_IMAGE := 2
		static CALIB_CB_FILTER_QUADS := 4
		static CALIB_CB_FAST_CHECK := 8
		
		static CALIB_USE_INTRINSIC_GUESS := 1
		static CALIB_FIX_ASPECT_RATIO := 2
		static CALIB_FIX_PRINCIPAL_POINT := 4
		static CALIB_ZERO_TANGENT_DIST := 8
		static CALIB_FIX_FOCAL_LENGTH := 16
		static CALIB_FIX_K1 := 32
		static CALIB_FIX_K2 := 64
		static CALIB_FIX_K3 := 128
		static CALIB_FIX_K4 := 2048
		static CALIB_FIX_K5 := 4096
		static CALIB_FIX_K6 := 8192
		static CALIB_RATIONAL_MODEL := 16384
		
		;/* Filters used in pyramid decomposition */
		
		static GAUSSIAN_5x5 := 7
		
		;/* Special filters */
		
		
		static SCHARR := -1
		static MAX_SOBEL_KSIZE := 7
		
		;/* Constants for color conversion */
		
		
		static BGR2BGRA := 0
		static RGB2RGBA := 0
		
		static BGRA2BGR := 1
		static RGBA2RGB := 1
		
		static BGR2RGBA := 2
		static RGB2BGRA := 2
		
		static RGBA2BGR := 3
		static BGRA2RGB := 3
		
		static BGR2RGB := 4
		static RGB2BGR := 4
		
		static BGRA2RGBA := 5
		static RGBA2BGRA := 5
		
		static BGR2GRAY := 6
		static RGB2GRAY := 7
		static GRAY2BGR := 8
		static GRAY2RGB := 8
		static GRAY2BGRA := 9
		static GRAY2RGBA := 9
		static BGRA2GRAY := 10
		static RGBA2GRAY := 11
		
		static BGR2BGR565 := 12
		static RGB2BGR565 := 13
		static BGR5652BGR := 14
		static BGR5652RGB := 15
		static BGRA2BGR565 := 16
		static RGBA2BGR565 := 17
		static BGR5652BGRA := 18
		static BGR5652RGBA := 19
		
		static GRAY2BGR565 := 20
		static BGR5652GRAY := 21
		
		static BGR2BGR555 := 22
		static RGB2BGR555 := 23
		static BGR5552BGR := 24
		static BGR5552RGB := 25
		static BGRA2BGR555 := 26
		static RGBA2BGR555 := 27
		static BGR5552BGRA := 28
		static BGR5552RGBA := 29
		
		static GRAY2BGR555 := 30
		static BGR5552GRAY := 31
		
		static BGR2XYZ := 32
		static RGB2XYZ := 33
		static XYZ2BGR := 34
		static XYZ2RGB := 35
		
		static BGR2YCrCb := 36
		static RGB2YCrCb := 37
		static YCrCb2BGR := 38
		static YCrCb2RGB := 39
		
		static BGR2HSV := 40
		static RGB2HSV := 41
		
		static BGR2Lab := 44
		static RGB2Lab := 45
		
		static BayerBG2BGR := 46
		static BayerGB2BGR := 47
		static BayerRG2BGR := 48
		static BayerGR2BGR := 49
		
		static BayerBG2RGB := 48
		static BayerGB2RGB := 49
		static BayerRG2RGB := 46
		static BayerGR2RGB := 47
		
		static BGR2Luv := 50
		static RGB2Luv := 51
		static BGR2HLS := 52
		static RGB2HLS := 53
		
		static HSV2BGR := 54
		static HSV2RGB := 55
		
		static Lab2BGR := 56
		static Lab2RGB := 57
		static Luv2BGR := 58
		static Luv2RGB := 59
		static HLS2BGR := 60
		static HLS2RGB := 61
		
		static BayerBG2BGR_VNG := 62
		static BayerGB2BGR_VNG := 63
		static BayerRG2BGR_VNG := 64
		static BayerGR2BGR_VNG := 65
		
		static BayerBG2RGB_VNG := 64
		static BayerGB2RGB_VNG := 65
		static BayerRG2RGB_VNG := 62
		static BayerGR2RGB_VNG := 63
		
		static BGR2HSV_FULL := 66
		static RGB2HSV_FULL := 67
		static BGR2HLS_FULL := 68
		static RGB2HLS_FULL := 69
		
		static HSV2BGR_FULL := 70
		static HSV2RGB_FULL := 71
		static HLS2BGR_FULL := 72
		static HLS2RGB_FULL := 73
		
		static LBGR2Lab := 74
		static LRGB2Lab := 75
		static LBGR2Luv := 76
		static LRGB2Luv := 77
		
		static Lab2LBGR := 78
		static Lab2LRGB := 79
		static Luv2LBGR := 80
		static Luv2LRGB := 81
		
		static BGR2YUV := 82
		static RGB2YUV := 83
		static YUV2BGR := 84
		static YUV2RGB := 85
		
		static BayerBG2GRAY := 86
		static BayerGB2GRAY := 87
		static BayerRG2GRAY := 88
		static BayerGR2GRAY := 89
		
		;    //YUV 4:2:0 formats family
		static YUV2RGB_NV12 := 90
		static YUV2BGR_NV12 := 91
		static YUV2RGB_NV21 := 92
		static YUV2BGR_NV21 := 93
		static YUV420sp2RGB := 92
		static YUV420sp2BGR := 93
		
		static YUV2RGBA_NV12 := 94
		static YUV2BGRA_NV12 := 95
		static YUV2RGBA_NV21 := 96
		static YUV2BGRA_NV21 := 97
		static YUV420sp2RGBA := 96
		static YUV420sp2BGRA := 97
		
		static YUV2RGB_YV12 := 98
		static YUV2BGR_YV12 := 99
		static YUV2RGB_IYUV := 100
		static YUV2BGR_IYUV := 101
		static YUV2RGB_I420 := 100
		static YUV2BGR_I420 := 101
		static YUV420p2RGB := 98
		static YUV420p2BGR := 99
		
		static YUV2RGBA_YV12 := 102
		static YUV2BGRA_YV12 := 103
		static YUV2RGBA_IYUV := 104
		static YUV2BGRA_IYUV := 105
		static YUV2RGBA_I420 := 104
		static YUV2BGRA_I420 := 105
		static YUV420p2RGBA := 102
		static YUV420p2BGRA := 103
		
		static YUV2GRAY_420 := 106
		static YUV2GRAY_NV21 := 106
		static YUV2GRAY_NV12 := 106
		static YUV2GRAY_YV12 := 106
		static YUV2GRAY_IYUV := 106
		static YUV2GRAY_I420 := 106
		static YUV420sp2GRAY := 106
		static YUV420p2GRAY := 106
		
		;    //YUV 4:2:2 formats family
		static YUV2RGB_UYVY := 107
		static YUV2BGR_UYVY := 108
		;   //YUV2RGB_VYUY := 109
		;    //YUV2BGR_VYUY := 110
		static YUV2RGB_Y422 := 107
		static YUV2BGR_Y422 := 108
		static YUV2RGB_UYNV := 107
		static YUV2BGR_UYNV := 108
		
		static YUV2RGBA_UYVY := 111
		static YUV2BGRA_UYVY := 112
		;    //YUV2RGBA_VYUY := 113
		;    //YUV2BGRA_VYUY := 114
		static YUV2RGBA_Y422 := 111
		static YUV2BGRA_Y422 := 112
		static YUV2RGBA_UYNV := 111
		static YUV2BGRA_UYNV := 112
		
		static YUV2RGB_YUY2 := 115
		static YUV2BGR_YUY2 := 116
		static YUV2RGB_YVYU := 117
		static YUV2BGR_YVYU := 118
		static YUV2RGB_YUYV := 115
		static YUV2BGR_YUYV := 116
		static YUV2RGB_YUNV := 115
		static YUV2BGR_YUNV := 116
		
		static YUV2RGBA_YUY2 := 119
		static YUV2BGRA_YUY2 := 120
		static YUV2RGBA_YVYU := 121
		static YUV2BGRA_YVYU := 122
		static YUV2RGBA_YUYV := 119
		static YUV2BGRA_YUYV := 120
		static YUV2RGBA_YUNV := 119
		static YUV2BGRA_YUNV := 120
		
		static YUV2GRAY_UYVY := 123
		static YUV2GRAY_YUY2 := 124
		;    //YUV2GRAY_VYUY := 123
		static YUV2GRAY_Y422 := 123
		static YUV2GRAY_UYNV := 123
		static YUV2GRAY_YVYU := 124
		static YUV2GRAY_YUYV := 124
		static YUV2GRAY_YUNV := 124
		
		;    // alpha premultiplication
		static RGBA2mRGBA := 125
		static mRGBA2RGBA := 126
		
		static RGB2YUV_I420 := 127
		static BGR2YUV_I420 := 128
		static RGB2YUV_IYUV := 127
		static BGR2YUV_IYUV := 128
		
		static RGBA2YUV_I420 := 129
		static BGRA2YUV_I420 := 130
		static RGBA2YUV_IYUV := 129
		static BGRA2YUV_IYUV := 130
		static RGB2YUV_YV12 := 131
		static BGR2YUV_YV12 := 132
		static RGBA2YUV_YV12 := 133
		static BGRA2YUV_YV12 := 134
		
		static COLORCVT_MAX := 135
		
		
		;/* Sub-pixel interpolation methods */
		
		
		static INTER_NN := 0
		static INTER_LINEAR := 1
		static INTER_CUBIC := 2
		static INTER_AREA := 3
		static INTER_LANCZOS4 := 4
		
		
		;/* ... and other image warping flags */
		
		
		static WARP_FILL_OUTLIERS := 8
		static WARP_INVERSE_MAP := 16
		
		
		;/* Shapes of a structuring element for morphological operations */
		
		
		static SHAPE_RECT := 0
		static SHAPE_CROSS := 1
		static SHAPE_ELLIPSE := 2
		static SHAPE_CUSTOM := 100
		
		
		;/* Morphological operations */
		
		
		static MOP_ERODE := 0
		static MOP_DILATE := 1
		static MOP_OPEN := 2
		static MOP_CLOSE := 3
		static MOP_GRADIENT := 4
		static MOP_TOPHAT := 5
		static MOP_BLACKHAT := 6
		
		;/* Template matching methods */
		
		static TM_SQDIFF := 0
		static TM_SQDIFF_NORMED := 1
		static TM_CCORR := 2
		static TM_CCORR_NORMED := 3
		static TM_CCOEFF := 4
		static TM_CCOEFF_NORMED := 5
		
		;/* Contour retrieval modes */
		
		static RETR_EXTERNAL := 0
		static RETR_LIST := 1
		static RETR_CCOMP := 2
		static RETR_TREE := 3
		static RETR_FLOODFILL := 4
		
		;/* Contour approximation methods */
		
		static CHAIN_CODE := 0
		static CHAIN_APPROX_NONE := 1
		static CHAIN_APPROX_SIMPLE := 2
		static CHAIN_APPROX_TC89_L1 := 3
		static CHAIN_APPROX_TC89_KCOS := 4
		static LINK_RUNS := 5
		
		;/* Histogram comparison methods */
		
		static COMP_CORREL := 0
		static COMP_CHISQR := 1
		static COMP_INTERSECT := 2
		static COMP_BHATTACHARYYA := 3
		static COMP_HELLINGER := 3
		
		;/* Mask size for distance transform */
		
		static DIST_MASK_3 := 3
		static DIST_MASK_5 := 5
		static DIST_MASK_PRECISE := 0
		
		;/* Content of output label array: connected components or pixels */
		
		static DIST_LABEL_CCOMP := 0
		static DIST_LABEL_PIXEL := 1
		
		;/* Distance types for Distance Transform and M-estimators */
		
		static DIST_USER := -1  ;/* User defined distance */
		static DIST_L1 := 1   ;/* distance = |x1-x2| + |y1-y2| */
		static DIST_L2 := 2   ;/* the simple euclidean distance */
		static DIST_C := 3   ;/* distance = max(|x1-x2||y1-y2|) */
		static DIST_L12 := 4   ;/* L1-L2 metric: distance = 2(sqrt(1+x*x/2) - 1)) */
		static DIST_FAIR := 5   ;/* distance = c^2(|x|/c-log(1+|x|/c)) c = 1.3998 */
		static DIST_WELSCH := 6   ;/* distance = c^2/2(1-exp(-(x/c)^2)) c = 2.9846 */
		static DIST_HUBER := 7    ;/* distance = |x|<c ? x^2/2 : c(|x|-c/2) c=1.345 */
		
		;/* Threshold types */
		
		static THRESH_BINARY := 0  ;/* value = value > threshold ? max_value : 0       */
		static THRESH_BINARY_INV := 1  ;/* value = value > threshold ? 0 : max_value       */
		static THRESH_TRUNC := 2  ;/* value = value > threshold ? threshold : value   */
		static THRESH_TOZERO := 3  ;/* value = value > threshold ? value : 0           */
		static THRESH_TOZERO_INV := 4  ;/* value = value > threshold ? 0 : value           */
		static THRESH_MASK := 7
		static THRESH_OTSU := 8  ;/* use Otsu algorithm to choose the optimal threshold value;
												;   combine the flag with one of the above THRESH_* values */
		
		;/* Adaptive threshold methods */
		
		static ADAPTIVE_THRESH_MEAN_C := 0
		static ADAPTIVE_THRESH_GAUSSIAN_C := 1
		
		;/* FloodFill flags */
		
		static FLOODFILL_FIXED_RANGE := 1 << -16
		static FLOODFILL_MASK_ONLY := 1 << -17
		
		;/* Variants of a Hough transform */
		
		static HOUGH_STANDARD := 0
		static HOUGH_PROBABILISTIC := 1
		static HOUGH_MULTI_SCALE := 2
		static HOUGH_GRADIENT := 3
		
		;/* For font */
		static FONT_LIGHT := 25 ;//QFont::Light,
		static FONT_NORMAL := 50 ;//QFont::Normal,
		static FONT_DEMIBOLD := 63 ;//QFont::DemiBold,
		static FONT_BOLD := 75 ;//QFont::Bold,
		static FONT_BLACK := 87 ;//QFont::Black
		
		static STYLE_NORMAL := 0 ;//QFont::StyleNormal,
		static STYLE_ITALIC := 1 ;//QFont::StyleItalic,
		static STYLE_OBLIQUE := 2 ;//QFont::StyleOblique
		
		; type of button
		static PUSH_BUTTON := 0
		static CHECKBOX := 1
		static RADIOBOX := 2
		
		static TERMCRIT_ITER := 1
		static TERMCRIT_NUMBER := 1
		static TERMCRIT_EPS := 2
		
		;/* Contour approximation algorithms */
		
		static POLY_APPROX_DP := 0
	}
	
	class Libs {
		static path := "\Lib\DLL\"
		static libraries := {
		(Join, 
			opencv_core: "opencv_core2413.dll"
			opencv_highgui: "opencv_highgui2413.dll"
			opencv_imgproc: "opencv_imgproc2413.dll"
			opencv_objdetect: "opencv_objdetect2413.dll"
		)}
			
			__New(parent) {
				this.generateCallMethods(parent)
			}
			
			__Call(method, args*) {
				if (method == "call") {
					if (IsObject(args[2])) ; Remove passed 'this' inside 'call' function
						args.RemoveAt(2)
					return this.Call(args*)
				}
			}
			
			generateCallMethods(ctx) {
				for libName, dllName in this.libraries {
					ctx[libName] := ObjBindMethod(this, "call", libName)
				}
			}
			
			getDLL(libName) {
				return this.libraries[libName]
			}
			
			call(libName, fnName, params*) {
				return DllCall(this.getDLL(libName) . "\" . fnName, params*)
			}
			
			load() {
				static OriginalWorkingDir := A_ScriptDir
				SetWorkingDir % OriginalWorkingDir . this.path
				for libName, dllName in this.libraries
					DllCall("LoadLibrary", "Str", dllName, "Ptr")
				SetWorkingDir % OriginalWorkingDir
			}
			
			unload() {
				for libName, dllName in this.libraries
					if (hModule := DllCall("GetModuleHandle", "str", dllName))
						DllCall("FreeLibrary", "ptr", hModule)
			}
		}
		
		class __Init {
			static _ := OpenCV.__Init := new OpenCV.__Init()
			
			__New() {
				OpenCV.Libs.load()
				OnExit(ObjBindMethod(OpenCV.Libs, "unload"))
			}
			
			error(TheFunc := "", result := "", additionalMsg := "")	{
				Tooltip % additionalMsg
				stackTrace := (TheFunc "`nErrorlevel: " ErrorLevel)
				errorCode := "`nLastError: " A_LastError
				if ErrorLevel
					MsgBox % additionalMsg . "`n" . stackTrace . " " . errorCode
				return ErrorLevel
			}
		}
		
		__wrapAround(TheFunc, result := "") {
			this.error(TheFunc, result)
			return result
		}
		
		BmpToIPL(pBitmap) {
			if (!IsFunc("Gdip_GetImageDimensions")) {
				MsgBox % "BmpToIPL >> GDI+ Library is missing!"
				return
			}
			
			Func("Gdip_GetImageDimensions").Call(pBitmap, iW, iH)
			tBitmapData := Func("Gdip_LockBits").Call(pBitmap, 0, 0, iW, iH, Stride, Scan0, BitmapData)
			pIPL := this.CreateImageHeader(this.Size(iW, iH), 8, 4)
			this.SetData(pIPL, Scan0, Stride)
			Func("Gdip_UnlockBits").Call(pBitmap, tBitmapData)
			return pIPL
		}
		
		Load(cvfilename, cvmemstorage := 0, cvname := 0, cvreal_name := 0) {
			result := this.opencv_core("cvLoad", "AStr", cvfilename, "ptr", cvmemstorage, "ptr", cvname, "ptr", cvreal_name, "Cdecl ptr")
			return this.__wrapAround(A_ThisFunc, result)
		}
		
		
		NamedWindow(name, flags := 0x00000001) {
			result := this.opencv_highgui("cvNamedWindow", "AStr", name, "int", flags, "Cdecl ptr")
			return this.__wrapAround(A_ThisFunc, result)
		}
		
		LoadImage(filename, iscolor := 1) {
			result := this.opencv_highgui("cvLoadImage", "AStr", filename, "int", iscolor, "Cdecl ptr")
			return this.__wrapAround(A_ThisFunc, result)
		}
		
		ShowImage(name, pimage) {
			result := this.opencv_highgui("cvShowImage", "AStr", name, "ptr", pimage, "Cdecl")
			return this.__wrapAround(A_ThisFunc, result)
		}
		
		CreateImage(cvsize, cvdepth, cvchannels) {
			result :=  this.opencv_core("cvCreateImage", "int64", cvsize, "int", cvdepth, "int", cvchannels, "Cdecl ptr")
			return this.__wrapAround(A_ThisFunc, result)
		}
		
		CreateImageHeader(cvsize, cvdepth, cvchannels) {
			result := this.opencv_core("cvCreateImageHeader", "int64", cvsize, "int", cvdepth, "int", cvchannels, "Cdecl ptr")
			return this.__wrapAround(A_ThisFunc, result)
		}
		
		CreateMat(cvrows, cvcols, cvtype) {
			result := this.opencv_core("cvCreateMat", "int", cvrows, "int", cvcols, "int", cvtype, "Cdecl ptr")
			return this.__wrapAround(A_ThisFunc, result)
		}
		
		MatchTemplate(cvimage, cvtempl, cvresult, cvmethod) {
			result := this.opencv_imgproc("cvMatchTemplate", "ptr", cvimage, "ptr", cvtempl, "ptr", cvresult, "int", cvmethod, "Cdecl")
			return this.__wrapAround(A_ThisFunc, result)
		}
		
		Normalize(cvsrc, cvdst, cva, cvb, cvnorm_type, cvmask) {
			result := this.opencv_core("cvNormalize", "ptr", cvsrc, "ptr", cvdst, "Double", cva, "Double", cvb, "int", cvnorm_type, "ptr", cvmask, "Cdecl")
			return this.__wrapAround(A_ThisFunc, result)
		}
		
		Threshold(cvsrc, cvdst, cvthreshold, cvmax_value, cvthreshold_type) {
			result := this.opencv_imgproc("cvThreshold", "ptr", cvsrc, "ptr", cvdst, "Double", cvthreshold, "Double", cvmax_value, "int", cvthreshold_type, "Cdecl double")
			return this.__wrapAround(A_ThisFunc, result)
		}
		
		ArrTohBitmap(pimage, byref width = "", byref height = "") { 
			result := this.CreateImage(this.GetSize(pimage, width, height), 8, 4)
			this.CvtColor(pimage, Result, 0)  
			pData := NumGet(Result + 0, 68 + 20 * (A_PtrSize = 8), "Ptr")
			hBitmap := DllCall("CreateBitmap", "Int", width, "Int", height, "UInt", 1, "UInt", 32, "Ptr", pData)
			Return this.__wrapAround(A_ThisFunc, hBitmap), this.ReleaseImage(result)
		}
		
		Scalar(byref storage)
		{
			if !isByref(storage)
				throw
			value := storage
			VarSetCapacity(storage, 32, 0)
			if IsObject(value) {
				Loop 4
					NumPut(value%A_Index%, storage, (A_Index - 1) * 8, "double")
			} else {
				Loop 4
					NumPut(value, storage, (A_Index - 1) * 8, "double")
			}
			return this.__wrapAround(A_ThisFunc, result)
		}
		
		Set(cvarr, cvvalue, cvmask := 0) {
			if (A_PtrSize = 4)
				result := this.opencv_core("cvSet", "ptr", cvarr, "double", NumGet(cvvalue+0, 0, "double"), "double", NumGet(cvvalue+0, 8, "double"), "double", NumGet(cvvalue+0, 16, "double"), "double", NumGet(cvvalue+0, 24, "double"), "ptr", cvmask, "Cdecl")
			else
				result := this.opencv_core("cvSet", "ptr", cvarr, "ptr", cvvalue, "ptr", cvmask, "Cdecl")
			return this.__wrapAround(A_ThisFunc, result)
		}
		
		GetSize(pimage, ByRef width := 0, ByRef height := 0) {
			WidthHeight := this.opencv_core("cvGetSize", "ptr", pimage, "Cdecl int64")
			
			width := 0xFFFFFFFF & WidthHeight
			height := WidthHeight >> 32
			
			return this.__wrapAround(A_ThisFunc, WidthHeight)
		}
		
		Size(width, height) {
			return this.__wrapAround(A_ThisFunc, width & 0xFFFFFFFF | height << 32)
		}
		
		
		;------------------------------------------------
		;/*
		;CVAPI(void)  cvCvtColor( const CvArr* src, CvArr* dst, int code );
		;
		;
		CvtColor(cvsrc, cvdst, cvcode) {
			result := this.opencv_imgproc("cvCvtColor", "ptr", cvsrc, "ptr", cvdst, "int", cvcode, "Cdecl")
			return this.__wrapAround(A_ThisFunc, result)
		}
		
		Resize(cvsrc, cvdst, cvinterpolation := 1) {
			result := this.opencv_imgproc("cvResize", "ptr", cvsrc, "ptr", cvdst, "int", cvinterpolation, "Cdecl")
			return this.__wrapAround(A_ThisFunc, result)
		}
		
		EqualizeHist(cvsrc, cvdst) {
			result := this.opencv_imgproc("cvEqualizeHist", "ptr", cvsrc, "ptr", cvdst, "Cdecl")
			return this.__wrapAround(A_ThisFunc, result)
		}
		
		CreateMemStorage(cvblock_size) {
			result := this.opencv_core("cvCreateMemStorage", "int", cvblock_size, "Cdecl ptr")
			return this.__wrapAround(A_ThisFunc, result)
		}
		
		ClearMemStorage(cvstorage) {
			result := this.opencv_core("cvClearMemStorage", "ptr", cvstorage, "Cdecl")
			return this.__wrapAround(A_ThisFunc, result)
		}
		
		HaarDetectObjects(cvimage, cvcascade, cvstorage, cvscale_factor := 1.1, cvmin_neighbors := 3, cvflags := 0, cvmin_size := 0, cvmax_size := 0) {
			result := this.opencv_objdetect("cvHaarDetectObjects", "ptr", cvimage, "ptr", cvcascade, "ptr", cvstorage, "double", cvscale_factor, "int", cvmin_neighbors, "int", cvflags, "int64", cvmin_size, "int64", cvmax_size, "Cdecl ptr")
			return this.__wrapAround(A_ThisFunc, result)
		}
		
		GetSeqElem(cvseq, cvindex) {
			result := this.opencv_core("cvGetSeqElem", "ptr", cvseq, "int", cvindex, "Cdecl ptr")
			return this.__wrapAround(A_ThisFunc, result)
		}
		
		Rectangle(cvimg, cvpt1, cvpt2, cvcolor, cvthickness, cvline_type, cvshift) {
			if (A_PtrSize = 4)
				result := this.opencv_core("cvRectangle", "ptr", cvimg, "int64", cvpt1, "int64", cvpt2, "double", NumGet(cvcolor+0, 0, "double"), "double", NumGet(cvcolor+0, 8, "double"), "double", NumGet(cvcolor+0, 16, "double"), "double", NumGet(cvcolor+0, 24, "double"), "int", cvthickness, "int", cvline_type, "int", cvshift, "Cdecl")
			else
				result := this.opencv_core("cvRectangle", "ptr", cvimg, "int64", cvpt1, "int64", cvpt2, "ptr", cvcolor, "int", cvthickness, "int", cvline_type, "int", cvshift, "Cdecl")
			return this.__wrapAround(A_ThisFunc, result)
		}
		
		ReleaseImage(pimage) {
			result := this.opencv_core("cvReleaseImage", "ptr*", pimage, "Cdecl")
			return this.__wrapAround(A_ThisFunc, result)
		}
		
		DestroyAllWindows() {
			result := this.opencv_highgui("cvDestroyAllWindows", "Cdecl")
			return this.__wrapAround(A_ThisFunc, result)
		}
		
		ClearSeq(cvseq) {
			result := this.opencv_core("cvClearSeq", "ptr", cvseq, "Cdecl")
			return this.__wrapAround(A_ThisFunc, result)
		}
		
		Point(x, y) {
			return this.__wrapAround(A_ThisFunc, x & 0xFFFFFFFF | y << 32)
		}
		
		RGB(cvRed, cvGreen, cvBlue, ByRef storage := "") {
			VarSetCapacity(storage, 32, 0)
			NumPut(cvBlue, storage, 0, "double")
			NumPut(cvGreen, storage, 8, "double")
			NumPut(cvRed, storage, 16, "double")
			NumPut(0, storage, 24, "double")
			return this.__wrapAround(A_ThisFunc, storage)
		}
		
		SetData(cvarr, data, step) {
			result := this.opencv_core("cvSetData", "ptr", cvarr, "ptr", data, "int", step, "Cdecl")
			return this.__wrapAround(A_ThisFunc, result)
		}
		
		
		;------------------------------------------------
		;/*
		;CVAPI(void)  cvMinMaxLoc( const CvArr* arr, double* min_val, double* max_val, CvPoint* min_loc CV_DEFAULT(NULL), CvPoint* max_loc CV_DEFAULT(NULL), const CvArr* mask CV_DEFAULT(NULL) );
		;
		;
		MinMaxLoc(cvarr, cvmin_val, cvmax_val, cvmin_loc, cvmax_loc, cvmask) {
			result := this.opencv_core("cvMinMaxLoc", "ptr", cvarr, "ptr", cvmin_val, "ptr", cvmax_val, "ptr", cvmin_loc, "ptr", cvmax_loc, "ptr", cvmask, "Cdecl")
			return this.__wrapAround(A_ThisFunc, result)
		}
		
		CloneImage(pimage) {
			result := this.opencv_core("cvCloneImage", "ptr", pimage, "Cdecl ptr")
			return this.__wrapAround(A_ThisFunc, result)
		}
		
		ReleaseImageHeader(pimage) {
			result := this.opencv_core("cvReleaseImageHeader", "ptr*", pimage, "Cdecl")
			return this.__wrapAround(A_ThisFunc, result)
		}
		
		ReleaseMat(cvmat) {
			result := this.opencv_core("cvReleaseMat", "ptr*", cvmat, "Cdecl")
			return this.__wrapAround(A_ThisFunc, result)
		}
		
		;------------------------------------------------
		;/*
		;CVAPI(void) cvSmooth( const CvArr* src, CvArr* dst, int smoothtype CV_DEFAULT(CV_GAUSSIAN), int size1 CV_DEFAULT(3), int size2 CV_DEFAULT(0), double sigma1 CV_DEFAULT(0), double sigma2 CV_DEFAULT(0));
		;
		;
		Smooth( cvsrc , cvdst , cvsmoothtype = 2 , cvsize1 = 3 , cvsize2 = 0  , cvsigma1 = 0 , cvsigma2 = 0)
		{
			result := this.opencv_imgproc("cvSmooth", "ptr", cvsrc, "ptr", cvdst, "int", cvsmoothtype, "int", cvsize1, "int", cvsize2, "double", cvsigma1, "double", cvsigma2, "Cdecl")
			return this.__wrapAround(A_ThisFunc, result)
		}
		
		;------------------------------------------------
		;/*
		;CVAPI(void)  cvErode( const CvArr* src, CvArr* dst, IplConvKernel* element CV_DEFAULT(NULL), int iterations CV_DEFAULT(1) );
		;
		;
		Erode( cvsrc , cvdst , cvelement = 0 , cviterations = 1 )
		{
			result := this.opencv_imgproc("cvErode", "ptr", cvsrc, "ptr", cvdst, "ptr", cvelement, "int", cviterations, "Cdecl")
			return this.__wrapAround(A_ThisFunc, result)
		}
		
		;------------------------------------------------
		;/*
		;CVAPI(void)  cvDilate( const CvArr* src, CvArr* dst, IplConvKernel* element CV_DEFAULT(NULL), int iterations CV_DEFAULT(1) );
		;
		;
		
		cvDilate(cvsrc, cvdst, cvelement = 0, cviterations = 1 )
		{
			result := this.opencv_imgproc("cvDilate", "ptr", cvsrc, "ptr", cvdst, "ptr", cvelement, "int", cviterations, "Cdecl")
			return this.__wrapAround(A_ThisFunc, result)
		}
		
		;------------------------------------------------
		;/*
		;CVAPI(CvSeq*)  cvCreateSeq( int seq_flags, size_t header_size, size_t elem_size, CvMemStorage* storage );
		;
		;
		
		CreateSeq( 		cvseq_flags, cvheader_size, cvelem_size , cvstorage)
		{
			result := this.opencv_core("cvCreateSeq" , "int" , cvseq_flags , "ptr" , cvheader_size , "ptr" , cvelem_size , "ptr" , cvstorage, "Cdecl ptr")
			return this.__wrapAround(A_ThisFunc, result)
		}

		;------------------------------------------------
		;/*
		;CVAPI(int)  cvFindContours( CvArr* image, CvMemStorage* storage, CvSeq** first_contour, int header_size CV_DEFAULT(sizeof(CvContour)), int mode CV_DEFAULT(CV_RETR_LIST), int method CV_DEFAULT(CV_CHAIN_APPROX_SIMPLE), CvPoint offset CV_DEFAULT(cvPoint(0_0)));
		;
		;
		FindContours( 	cvimage, cvstorage, ByRef cvfirst_contour, cvheader_size, cvmode, cvmethod, cvoffset)
		{
			result := this.opencv_imgproc("cvFindContours" , "ptr" , cvimage , "ptr" , cvstorage , "Ptr*" , cvfirst_contour , "int" , cvheader_size , "int" , cvmode , "int" , cvmethod , "int64" , cvoffset, "Cdecl")
			return this.__wrapAround(A_ThisFunc, result)
		}

		;------------------------------------------------
		;/* wait for key event infinitely (delay<=0) or for "delay" milliseconds */
		;CVAPI(int) cvWaitKey(int delay CV_DEFAULT(0));
		
		WaitKey(delay = 0 )
		{
			result := this.opencv_highgui("cvWaitKey" , "int", delay, "int:cdecl")
			return this.__wrapAround(A_ThisFunc, result)
		}
	}
	
Now i get the number of contours returned, nice

So now I can get the loop going the right amount of times :)

but doing what this Autoit line does here Local $vnext = DllStructCreate($tagCvSeq,$pnext) not really sure how to reproduce that in AHK
autoit docs: DllStructCreate

this is what i tried

Code: Select all

DllStructCreate("tagCvSeq", pnext)
vnext := pnext

DllStructCreate(tag_name, byref struct := "")
{
	Tags := {"tagCvSeq"
				:{"Offsets"
					:{"flags" : 0    ; "int flags;" 			; sequence flags, including the sequence signature (CV_SEQ_MAGIC_VAL or CV_SET_MAGIC_VAL), type of the elements and some other information about the sequence.
					, "header_size" : 4    ; "int header_size;" 	;size of the sequence header. It should be sizeof(CvSeq) at minimum. See CreateSeq().
					, "h_next" : 8   ; "ptr h_next;"
					, "h_prev" : 8+A_PtrSize	; "ptr h_prev;"
					, "v_next" : 8+2*A_PtrSize	; "ptr v_next;"
					, "v_prev" : 8+3*A_PtrSize	; "ptr v_prev;"			;pointers to another sequences in a sequence tree. Sequence trees are used to store hierarchical contour structures, retrieved by FindContours()
					, "total" : 8+4*A_PtrSize   ; "int total;"			;the number of sequence elements
					, "elem_size" : 12+4*A_PtrSize    ; "int elem_size;"		;size of each sequence element in bytes
					, "block_max" : 16+4*A_PtrSize    ; "ptr block_max;"		;memory storage where the sequence resides. It can be a NULL pointer;
					, "w_ptr" : 16+5*A_PtrSize    ; "ptr w_ptr;"			;pointer to the first data block
					, "delta_elems" : 16+6*A_PtrSize    ; "int delta_elems;"
					, "storage" : 16+7*A_PtrSize    ; "ptr storage;"
					, "free_blocks" : 16+8*A_PtrSize   ; "ptr free_blocks;"
					, "first" : 16+9*A_PtrSize    ; "ptr first;"
					, "padding1" : 16+10*A_PtrSize	; "int padding1;"
					, "padding2" : 20+10*A_PtrSize }}}	; "int padding2;"
	
	if (struct = "")
		VarSetCapacity(Struct, 24+10*A_PtrSize, 0)
	
	NumPut(flags, struct+0, 		Tags[tag_name].Offsets.falgs, "int") ; "int flags;" 				; sequence flags, including the sequence signature (CV_SEQ_MAGIC_VAL or CV_SET_MAGIC_VAL), type of the elements and some other information about the sequence.
	NumPut(header_size, struct+0, Tags[tag_name].Offsets.header_size, "int") ; "int header_size;" 	;size of the sequence header. It should be sizeof(CvSeq) at minimum. See CreateSeq().
	NumPut(h_next, struct+0,		Tags[tag_name].Offsets.h_next, "ptr") ; "ptr h_next;"
	NumPut(h_prev, struct+0,		Tags[tag_name].Offsets.h_prev, "ptr") ; "ptr h_prev;"
	NumPut(v_next, struct+0,		Tags[tag_name].Offsets.v_next, "ptr") ; "ptr v_next;"
	NumPut(v_prev, struct+0,		Tags[tag_name].Offsets.v_prev, "ptr") ; "ptr v_prev;"			;pointers to another sequences in a sequence tree. Sequence trees are used to store hierarchical contour structures, retrieved by FindContours()
	NumPut(total, struct+0, 		Tags[tag_name].Offsets.total, "int") ; "int total;"				;the number of sequence elements
	NumPut(elem_size, struct+0, 	Tags[tag_name].Offsets.elem_size, "int") ; "int elem_size;"		;size of each sequence element in bytes
	NumPut(block_max, struct+0, 	Tags[tag_name].Offsets.block_max, "ptr") ; "ptr block_max;"		;memory storage where the sequence resides. It can be a NULL pointer.
	NumPut(w_ptr, struct+0, 		Tags[tag_name].Offsets.w_ptr, "ptr") ; "ptr w_ptr;"				;pointer to the first data block
	NumPut(delta_elems, struct+0, Tags[tag_name].Offsets.delta_elems, "int") ; "int delta_elems;"
	NumPut(storage, struct+0, 	Tags[tag_name].Offsets.storage, "ptr") ; "ptr storage;"
	NumPut(free_blocks, struct+0, Tags[tag_name].Offsets.free_blocks, "ptr") ; "ptr free_blocks;"
	NumPut(first, struct+0, 		Tags[tag_name].Offsets.first, "ptr") ; "ptr first;"
	NumPut(padding1, struct+0, 	Tags[tag_name].Offsets.padding1, "int") ; "int padding1;"
	NumPut(padding2, struct+0, 	Tags[tag_name].Offsets.padding2, "int") ; "int padding2;"
	return
}
but trying to get something from the struct like the "h_next=8" pointer does not seem to work

Code: Select all

#NoEnv
#Persistent
#SingleInstance Force 
SetBatchLines, -1

#Include Lib\OpenCV.ahk


tagCvContour := {"Offsets":{"flags" : 0    ; "int flags;" 			; sequence flags, including the sequence signature (CV_SEQ_MAGIC_VAL or CV_SET_MAGIC_VAL), type of the elements and some other information about the sequence.
	, "header_size" : 4    ; "int header_size;" 	;size of the sequence header. It should be sizeof(CvSeq) at minimum. See CreateSeq().
	, "h_next" : 8   ; "ptr h_next;"
	, "h_prev" : 8+A_PtrSize	; "ptr h_prev;"
	, "v_next" : 8+2*A_PtrSize	; "ptr v_next;"
	, "v_prev" : 8+3*A_PtrSize	; "ptr v_prev;"			;pointers to another sequences in a sequence tree. Sequence trees are used to store hierarchical contour structures, retrieved by FindContours()
	, "total" : 8+4*A_PtrSize   ; "int total;"			;the number of sequence elements
	, "elem_size" : 12+4*A_PtrSize    ; "int elem_size;"		;size of each sequence element in bytes
	, "block_max" : 16+4*A_PtrSize    ; "ptr block_max;"		;memory storage where the sequence resides. It can be a NULL pointer;
	, "w_ptr" : 16+5*A_PtrSize    ; "ptr w_ptr;"			;pointer to the first data block
	, "delta_elems" : 16+6*A_PtrSize    ; "int delta_elems;"
	, "storage" : 16+7*A_PtrSize    ; "ptr storage;"
	, "free_blocks" : 16+8*A_PtrSize   ; "ptr free_blocks;"
	, "first" : 16+9*A_PtrSize    ; "ptr first;"
	, "padding1" : 16+10*A_PtrSize	; "int padding1;"
	, "padding2" : 20+10*A_PtrSize }}	; "int padding2;"

file := "Images\shapes.jpg"
; file := "Images\2.png"
; file := "Images\home screen.png"

; Create OpenCV instance.
cv := new OpenCV()

pImg := cv.LoadImage(file) ; Load IPL type image
; pImg := cv.BmpToIPL(pBitmap) ; Load Bitmap image

cv.ShowImage("Example-in", pImg) ; Display input image inside window

; Create destination images
pimgGrayScale := cv.CreateImage(cv.GetSize(pImg, width, height), 8, 1)

cv.Smooth( pimg, pimg, GAUSSIAN:=2, 3, 3) ;
;cv.ShowImage("Example-in2", pImg) ; Display input image inside window

cv.CvtColor( pimg, pimgGrayScale, cv.Constants.BGR2GRAY) ; BGR2GRAY = 6
;cv.ShowImage("Example-in3", pimgGrayScale) ; Display input image inside window

;//get ride of some noise by erode and dilate and convert to black and white image
pimgBW := cv.CreateImage( cv.GetSize(pimg), 8, 1) ;

cv.Erode( pimgGrayScale, pimgBW , Null:=0, 3 )
;cv.ShowImage("Example-in4", pimgBW) ; Display input image inside window

cv.Threshold( pimgBW, pimgBW, 200, 255, cv.Constants.THRESH_BINARY) ;// may need to adjust threshold value (200)
;cv.ShowImage("Example-in5", pimgBW) ; Display input image inside window

cv.Dilate( pimgBW, pimgBW, Null:=0, 3 )
;cv.ShowImage("Example-in6", pimgBW) ; Display input image inside window

cv.Threshold( pimgBW, pimgBW, 128, 255, cv.Constants.THRESH_BINARY_INV) ;

;// show black and white image
cv.ShowImage( "Example-bw", pimgBW) ;

; //setup memory block
; Local $pstorage = _cvCreateMemStorage(0); //storage area for all contours
pStorage := cv.CreateMemStorage(0) ; Storage area for all contours

; Local $pcontours = _cvCreateSeq(0, 64, DllStructGetSize(DllStructCreate($tagCvPoint)), $pstorage);
pcontours := cv.CreateSeq(0, 24+10*A_PtrSize, tagCvPointSize := 8, pstorage)
;msgbox % "Pointer to contours -> " pcontours

;// find all exterior and inner contours in a list format (no vertical)
;// $num_found = _cvFindContours($pimgBW, $pstorage, $pcontours, DllStructGetSize(DllStructCreate($tagCvContour)), $CV_RETR_LIST, $CV_CHAIN_APPROX_SIMPLE, _cvPoint(0,0))
num_found := cv.FindContours(pimgBW, pstorage, pcontours, 56+10*A_PtrSize, CV_RETR_LIST := 1, CV_CHAIN_APPROX_SIMPLE := 2, 0)
msgbox % "Number of contours found = " num_found

;// cycle through all exterior contours "0x4299500C" or interior contours "0x4299D00C". Remove if statement for both
pnext := pcontours

;for $t = 1 to $num_found
loop % num_found
{
	;Local $vnext = DllStructCreate($tagCvSeq,$pnext)
	msgbox % NumGet(pnext+0, 8+4*A_PtrSize, "int") ; total
	DllStructCreate("tagCvSeq", pnext)
	vnext := pnext
	msgbox % NumGet(vnext+0, h_next:=8, "int") ; h_next = 8
	
	;$pnext = DllStructGetData($vnext,"h_next")
	pnext := DllStructGetData(vnext, h_next:=8, "ptr") ; h_next = 8
	
	msgbox % total := DllStructGetData(pnext, 8+4*A_PtrSize, "int") ; total = 24 = 8+4*A_PtrSize
	
	;~ If $pnext = 0 Then $pnext = $pcontours + DllStructGetData($vnext,"header_size") ; skip over first sequence which is empty
	if (pnext = 0)
		pnext := pcontours + DllStructGetData(vnext, 4, "int") ; "header_size" 1*a_ptrsize ; skip over first sequence which is empty
	
	
	;~ ;// Check if sequence is an exterior contour "0x4299500C"
	;~ If DllStructGetData(DllStructCreate($tagCvContour,$pnext),"flags") = 0x4299500C then
	flags := DllStructGetData(pnext, 0, "int") ; tagCvContour -> struct | "int flags;" at 0*A_ptrsize
	if (flags =  0x4299500C)
	{
		
		;~ ; // determine number of elements in sequence and create an array
		;~ Local $datasize = DllStructGetData(DllStructCreate($tagCvContour,$pnext),"total")
		datasize := DllStructGetData(pnext, 24, "int") ; tagCvContour -> struct | "int total;" at 6*A_ptrsize
		
		;~ dim $apts[$datasize+2][2]
		;~ $apts[0][0] = $datasize+1
		apts[0, 0] := datasize+1
		
		;~ ; // retrieve x,y values of each points in sequence
		;~ ;for $itt = 0 to $datasize -1
		itt := 0
		
		loop % datasize ;~ loop % datasize
		{
			itt := A_index-1
			vpoint = cv.GetSeqElem(pnext, itt) ; $vpoint = DllStructCreate($tagCvPoint, _cvGetSeqElem($pnext,$itt))
			apts[itt+1, 0] := vpoint & 0xFFFFFFFF ; DllStructGetData($vpoint,"x")
			apts[itt+1, 1] := vpoint << 32 ;  DllStructGetData($vpoint,"y")
			If (itt = 0)
			{
				apts[datasize+1, 0] := vpoint & 0xFFFFFFFF ;~ $apts[$datasize+1][0] = DllStructGetData($vpoint,"x")
				apts[datasize+1, 1] := vpoint << 32 ;~ $apts[$datasize+1][1] = DllStructGetData($vpoint,"y")
			}
			vpoint := 0 ;~ $vpoint = 0
		} ;Next
		
		;~ ; // draw it in autoit gui using gdi drawlines
		;~ _GDIPlus_GraphicsDrawLines($hGraphics, $apts)
		;Gdip_DrawLines(hGraphics, pPen, apts)
		
		;~ $vnext = 0
		vnext := 0
	} ;~ EndIf 
	
	;~ sleep(1000) ;just to show that each sequence is drawn individually
	Sleep 1000
	
} ;Next

; // Wait for the user to hit a key, then clean up the windows
; _cvWaitKey( 0 ); Opencv function to wait for a key pressed
;cv.WaitKey( 0 )

msgbox % "wait for key"

; Do
; Until GUIGetMsg() = $GUI_EVENT_CLOSE

; ;// Be tidy
; ;//
; _GDIPlus_GraphicsDispose($hGraphics)
; GUIDelete($hGUI)

cv.ReleaseImage( pimgBW ) ;
cv.ReleaseImage( pimgGrayScale ) ;
cv.ReleaseImage( pimg ) ;
cv.DestroyAllWindows() ;
cv.ClearMemStorage( pstorage ) ;
cv.ClearSeq(pcontours) ;

; _Opencv_CloseDLL()
; _GDIPlus_Shutdown()
return


NumberOfMembersInTag(tagCV)
{
	RegExReplace(tagCV, ";", ";", OutputVarCount)
	return OutputVarCount
}

DllStructCreate(tag_name, byref struct := "")
{
	Tags := {"tagCvSeq"
				:{"Offsets"
					:{"flags" : 0    ; "int flags;" 			; sequence flags, including the sequence signature (CV_SEQ_MAGIC_VAL or CV_SET_MAGIC_VAL), type of the elements and some other information about the sequence.
					, "header_size" : 4    ; "int header_size;" 	;size of the sequence header. It should be sizeof(CvSeq) at minimum. See CreateSeq().
					, "h_next" : 8   ; "ptr h_next;"
					, "h_prev" : 8+A_PtrSize	; "ptr h_prev;"
					, "v_next" : 8+2*A_PtrSize	; "ptr v_next;"
					, "v_prev" : 8+3*A_PtrSize	; "ptr v_prev;"			;pointers to another sequences in a sequence tree. Sequence trees are used to store hierarchical contour structures, retrieved by FindContours()
					, "total" : 8+4*A_PtrSize   ; "int total;"			;the number of sequence elements
					, "elem_size" : 12+4*A_PtrSize    ; "int elem_size;"		;size of each sequence element in bytes
					, "block_max" : 16+4*A_PtrSize    ; "ptr block_max;"		;memory storage where the sequence resides. It can be a NULL pointer;
					, "w_ptr" : 16+5*A_PtrSize    ; "ptr w_ptr;"			;pointer to the first data block
					, "delta_elems" : 16+6*A_PtrSize    ; "int delta_elems;"
					, "storage" : 16+7*A_PtrSize    ; "ptr storage;"
					, "free_blocks" : 16+8*A_PtrSize   ; "ptr free_blocks;"
					, "first" : 16+9*A_PtrSize    ; "ptr first;"
					, "padding1" : 16+10*A_PtrSize	; "int padding1;"
					, "padding2" : 20+10*A_PtrSize }}}	; "int padding2;"
	
	if (struct = "")
		VarSetCapacity(Struct, 24+10*A_PtrSize, 0)
	
	NumPut(flags, struct+0, 		Tags[tag_name].Offsets.falgs, "int") ; "int flags;" 				; sequence flags, including the sequence signature (CV_SEQ_MAGIC_VAL or CV_SET_MAGIC_VAL), type of the elements and some other information about the sequence.
	NumPut(header_size, struct+0, Tags[tag_name].Offsets.header_size, "int") ; "int header_size;" 	;size of the sequence header. It should be sizeof(CvSeq) at minimum. See CreateSeq().
	NumPut(h_next, struct+0,		Tags[tag_name].Offsets.h_next, "ptr") ; "ptr h_next;"
	NumPut(h_prev, struct+0,		Tags[tag_name].Offsets.h_prev, "ptr") ; "ptr h_prev;"
	NumPut(v_next, struct+0,		Tags[tag_name].Offsets.v_next, "ptr") ; "ptr v_next;"
	NumPut(v_prev, struct+0,		Tags[tag_name].Offsets.v_prev, "ptr") ; "ptr v_prev;"			;pointers to another sequences in a sequence tree. Sequence trees are used to store hierarchical contour structures, retrieved by FindContours()
	NumPut(total, struct+0, 		Tags[tag_name].Offsets.total, "int") ; "int total;"				;the number of sequence elements
	NumPut(elem_size, struct+0, 	Tags[tag_name].Offsets.elem_size, "int") ; "int elem_size;"		;size of each sequence element in bytes
	NumPut(block_max, struct+0, 	Tags[tag_name].Offsets.block_max, "ptr") ; "ptr block_max;"		;memory storage where the sequence resides. It can be a NULL pointer.
	NumPut(w_ptr, struct+0, 		Tags[tag_name].Offsets.w_ptr, "ptr") ; "ptr w_ptr;"				;pointer to the first data block
	NumPut(delta_elems, struct+0, Tags[tag_name].Offsets.delta_elems, "int") ; "int delta_elems;"
	NumPut(storage, struct+0, 	Tags[tag_name].Offsets.storage, "ptr") ; "ptr storage;"
	NumPut(free_blocks, struct+0, Tags[tag_name].Offsets.free_blocks, "ptr") ; "ptr free_blocks;"
	NumPut(first, struct+0, 		Tags[tag_name].Offsets.first, "ptr") ; "ptr first;"
	NumPut(padding1, struct+0, 	Tags[tag_name].Offsets.padding1, "int") ; "int padding1;"
	NumPut(padding2, struct+0, 	Tags[tag_name].Offsets.padding2, "int") ; "int padding2;"
	return
}

DllStructGetData(VarOrAddress, offset, type)
{
	return NumGet(VarOrAddress+0, offset, type)
}

~ESC:: ExitApp[code]
Also check out:
Courses on AutoHotkey

My Autohotkey Blog
:dance:
malcev
Posts: 1769
Joined: 12 Aug 2014, 12:37

Re: OpenCV help - find the contour of many shapes

09 Jun 2020, 19:53

Helgef, thanks for clarification.
I change functions to this

Code: Select all

value := 1.000000000000011
msgbox % numget(_cvScalar(vScalar, 1.000000000000011), 0, "double") == value

_cvScalar(ByRef vScalar, value)
{
   VarSetCapacity(vScalar, 8, 0)
   NumPut(value, vScalar, 0, "double")
   return &vScalar
}
just me, my code works with 32bit and 64 bit.
AutoIt code - 32 bit only.

Blackholyman, I just see that We do not need ByRef cvfirst_contour in _cvFindContours function.
It will work like this:

Code: Select all

file := "shapes.jpg"
window1 := "Example-in"
window2 := "Example-bw"

Global opencv := { opencv_core: "opencv_core2413.dll" 
, opencv_highgui: "opencv_highgui2413.dll"
, opencv_imgproc: "opencv_imgproc2413.dll" }
_OpenCV_Startup()

pimg := _cvLoadImage(file)
_cvShowImage(window1, pimg)
pimgGrayScale := _cvCreateImage(_cvGetSize(pimg, width, height), 8, 1)
_cvSmooth(pimg, pimg, CV_GAUSSIAN := 2, 3, 3)
_cvCvtColor(pimg, pimgGrayScale, CV_BGR2GRAY := 6)
pimgBW := _cvCreateImage(_cvGetSize(pimg, width, height), 8, 1)
_cvErode(pimgGrayScale, pimgBW, 0, 3)
_cvThreshold(pimgBW, pimgBW, 200, 255, CV_THRESH_BINARY := 0)
_cvDilate(pimgBW, pimgBW, 0, 3)
_cvThreshold(pimgBW, pimgBW, 128, 255, CV_THRESH_BINARY_INV := 1)
_cvShowImage(window2, pimgBW)
pstorage := _cvCreateMemStorage(0)
pcontours := _cvCreateSeq(0, 24+10*A_PtrSize, tagCvPointSize := 8, pstorage)
num_found := _cvFindContours(pimgBW, pstorage, pcontours, 56+10*A_PtrSize, CV_RETR_LIST := 1, CV_CHAIN_APPROX_SIMPLE := 2, 0)
pnext := pcontours
loop % num_found
{
   vnext := pnext
   pnext := NumGet(vnext+0, 8, "ptr")
   if (pnext = 0)
      pnext := pcontours + NumGet(vnext+0, 4, "int")
   if (NumGet(pnext+0, 0, "int") = 0x4299500C)
   {
      msgbox % datasize := NumGet(pnext+0, 8+4*A_PtrSize, "int")
   }
}





_OpenCV_Startup()
{
   For key, value in opencv
      DllCall("LoadLibrary", "Str", value, "Ptr")
}

_cvLoadImage(filename, iscolor := 1)  ;  CV_LOAD_IMAGE_COLOR
{
   Result := DllCall(opencv.opencv_highgui "\cvLoadImage", "AStr", filename, "int", iscolor, "Cdecl ptr")
   if !Result or ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
   return Result
}

_cvNamedWindow(name, flags := 0x00000001)   ;   CV_WINDOW_AUTOSIZE 
{
   DllCall(opencv.opencv_highgui "\cvNamedWindow", "AStr", name, "int", flags, "Cdecl ptr")
   if ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
}

_cvShowImage(name, pimage)
{
   DllCall(opencv.opencv_highgui "\cvShowImage", "AStr", name, "ptr", pimage, "Cdecl")
   if ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
}

_cvGetSize(pimage, ByRef width := 0, ByRef height := 0)
{
   WidthHeight := DllCall(opencv.opencv_core "\cvGetSize", "ptr", pimage, "Cdecl int64")
   width := 0xFFFFFFFF & WidthHeight
   height := WidthHeight >> 32
   if ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
   return WidthHeight
}

_cvCreateMat(cvrows, cvcols, cvtype)
{
   Result := DllCall(opencv.opencv_core "\cvCreateMat", "int", cvrows, "int", cvcols, "int", cvtype, "Cdecl ptr")
   if !Result or ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
   return Result
}

_cvMatchTemplate(cvimage, cvtempl, cvresult, cvmethod)
{
   DllCall(opencv.opencv_imgproc "\cvMatchTemplate", "ptr", cvimage, "ptr", cvtempl, "ptr", cvresult, "int", cvmethod, "Cdecl")
   if ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
}

_cvNormalize(cvsrc, cvdst, cva, cvb, cvnorm_type, cvmask)
{
   DllCall(opencv.opencv_core "\cvNormalize", "ptr", cvsrc, "ptr", cvdst, "Double", cva, "Double", cvb, "int", cvnorm_type, "ptr", cvmask, "Cdecl")
   if ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
}

_cvThreshold(cvsrc, cvdst, cvthreshold, cvmax_value, cvthreshold_type)
{
   DllCall(opencv.opencv_imgproc "\cvThreshold", "ptr", cvsrc, "ptr", cvdst, "Double", cvthreshold, "Double", cvmax_value, "int", cvthreshold_type, "Cdecl double")
   if ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
}

_cvSize(width, height)
{
   return width&0xFFFFFFFF|height<<32
}

_cvPoint(x, y)
{
   return x&0xFFFFFFFF|y<<32
}

_cvCreateImage(cvsize, cvdepth, cvchannels)
{
   Result := DllCall(opencv.opencv_core "\cvCreateImage", "int64", cvsize, "int", cvdepth, "int", cvchannels, "Cdecl ptr")
   if !Result or ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
   return Result
}

_cvArrTohBitmap(pimage, byref width = "", byref height = "") { 
	Result := _cvCreateImage(_cvGetSize(pimage, width, height), 8, 4)
	_cvCvtColor(pimage, Result, 0)  
	pData := NumGet(Result + 0, 68 + 20 * (A_PtrSize = 8), "Ptr")
	hBitmap := DllCall("CreateBitmap", "Int", width, "Int", height, "UInt", 1, "UInt", 32, "Ptr", pData)
	Return hBitmap, _cvReleaseImage(Result)
}

_cvScalar(ByRef vScalar, value)
{
   VarSetCapacity(vScalar, 32, 0)
   if IsObject(value)
   {
      loop 4
         NumPut(value%A_Index%, vScalar, (A_Index-1)*8, "double")
   }
   else
   {
      loop 4
         NumPut(value, vScalar, (A_Index-1)*8, "double")
   }
   return &vScalar
}

_CV_RGB(ByRef vScalar, cvRed, cvGreen, cvBlue)
{
   VarSetCapacity(vScalar, 32, 0)
   NumPut(cvBlue, vScalar, 0, "double")
   NumPut(cvGreen, vScalar, 8, "double")
   NumPut(cvRed, vScalar, 16, "double")
   NumPut(0, vScalar, 24, "double")
   return &vScalar
}

_cvSet(cvarr, cvvalue, cvmask := 0)
{
   if (A_PtrSize = 4)
      DllCall(opencv.opencv_core "\cvSet", "ptr", cvarr, "double", NumGet(cvvalue+0, 0, "double"), "double", NumGet(cvvalue+0, 8, "double"), "double", NumGet(cvvalue+0, 16, "double"), "double", NumGet(cvvalue+0, 24, "double"), "ptr", cvmask, "Cdecl")
   else
      DllCall(opencv.opencv_core "\cvSet", "ptr", cvarr, "ptr", cvvalue, "ptr", cvmask, "Cdecl")
   if ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
}

_cvMinMaxLoc(cvarr, cvmin_val, cvmax_val, cvmin_loc, cvmax_loc, cvmask)
{
   DllCall(opencv.opencv_core "\cvMinMaxLoc", "ptr", cvarr, "ptr", cvmin_val, "ptr", cvmax_val, "ptr", cvmin_loc, "ptr", cvmax_loc, "ptr", cvmask, "Cdecl")
   if ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
}

_cvRectangle(cvimg, cvpt1, cvpt2, cvcolor, cvthickness, cvline_type, cvshift)
{
   if (A_PtrSize = 4)
      DllCall(opencv.opencv_core "\cvRectangle", "ptr", cvimg, "int64", cvpt1, "int64", cvpt2, "double", NumGet(cvcolor+0, 0, "double"), "double", NumGet(cvcolor+0, 8, "double"), "double", NumGet(cvcolor+0, 16, "double"), "double", NumGet(cvcolor+0, 24, "double"), "int", cvthickness, "int", cvline_type, "int", cvshift, "Cdecl")
   else
      DllCall(opencv.opencv_core "\cvRectangle", "ptr", cvimg, "int64", cvpt1, "int64", cvpt2, "ptr", cvcolor, "int", cvthickness, "int", cvline_type, "int", cvshift, "Cdecl")
   if ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
}

_cvCvtColor(cvsrc, cvdst, cvcode)
{
   DllCall(opencv.opencv_imgproc "\cvCvtColor", "ptr", cvsrc, "ptr", cvdst, "int", cvcode, "Cdecl")
   if ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
}

_cvResize(cvsrc, cvdst, cvinterpolation := 1)   ; CV_INTER_LINEAR
{
   DllCall(opencv.opencv_imgproc "\cvResize", "ptr", cvsrc, "ptr", cvdst, "int", cvinterpolation, "Cdecl")
   if ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
}

_cvEqualizeHist(cvsrc, cvdst)
{
   DllCall(opencv.opencv_imgproc "\cvEqualizeHist", "ptr", cvsrc, "ptr", cvdst, "Cdecl")
   if ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
}

_cvLoad(cvfilename, cvmemstorage := 0, cvname := 0, cvreal_name := 0)
{
   Result := DllCall(opencv.opencv_core "\cvLoad", "AStr", cvfilename, "ptr", cvmemstorage, "ptr", cvname, "ptr", cvreal_name, "Cdecl ptr")
   if ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
   return Result
}

_cvCreateMemStorage(cvblock_size)
{
   Result := DllCall(opencv.opencv_core "\cvCreateMemStorage", "int", cvblock_size, "Cdecl ptr")
   if ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
   return Result
}

_cvClearMemStorage(cvstorage)
{
   DllCall(opencv.opencv_core "\cvClearMemStorage", "ptr", cvstorage, "Cdecl")
   if ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
}

_cvHaarDetectObjects(cvimage, cvcascade, cvstorage, cvscale_factor := 1.1, cvmin_neighbors := 3, cvflags := 0, cvmin_size := 0, cvmax_size := 0)
{
   Result := DllCall(opencv.opencv_objdetect "\cvHaarDetectObjects", "ptr", cvimage, "ptr", cvcascade, "ptr", cvstorage, "double", cvscale_factor, "int", cvmin_neighbors, "int", cvflags, "int64", cvmin_size, "int64", cvmax_size, "Cdecl ptr")
   if ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
   return Result
}

_cvGetSeqElem(cvseq, cvindex)
{
   Result := DllCall(opencv.opencv_core "\cvGetSeqElem", "ptr", cvseq, "int", cvindex, "Cdecl ptr")
   if !Result or ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
   return Result
}

_cvCreateSeq(cvseq_flags, cvheader_size, cvelem_size, cvstorage)
{
   Result := DllCall(opencv.opencv_core "\cvCreateSeq", "int", cvseq_flags, "ptr", cvheader_size, "ptr", cvelem_size, "ptr", cvstorage, "Cdecl ptr")
   if !Result or ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
   return Result
}

_cvDilate(cvsrc, cvdst, cvelement = 0, cviterations = 1)
{
   Result := DllCall(opencv.opencv_imgproc "\cvDilate", "ptr", cvsrc, "ptr", cvdst, "ptr", cvelement, "int", cviterations, "Cdecl")
   if !Result or ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
   return Result
}

_cvErode(cvsrc, cvdst, cvelement = 0, cviterations = 1)
{
   Result := DllCall(opencv.opencv_imgproc "\cvErode", "ptr", cvsrc, "ptr", cvdst, "ptr", cvelement, "int", cviterations, "Cdecl")
   if !Result or ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
   return Result
}

_cvSmooth(cvsrc, cvdst, cvsmoothtype = 2, cvsize1 = 3, cvsize2 = 0, cvsigma1 = 0, cvsigma2 = 0)
{
   Result := DllCall(opencv.opencv_imgproc "\cvSmooth", "ptr", cvsrc, "ptr", cvdst, "int", cvsmoothtype, "int", cvsize1, "int", cvsize2, "double", cvsigma1, "double", cvsigma2, "Cdecl")
   if !Result or ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
   return Result
}

_cvFindContours(cvimage, cvstorage, cvfirst_contour, cvheader_size, cvmode, cvmethod, cvoffset)
{
   Result := DllCall(opencv.opencv_imgproc "\cvFindContours", "ptr", cvimage, "ptr", cvstorage, "ptr*", cvfirst_contour, "int", cvheader_size, "int", cvmode, "int", cvmethod, "int64", cvoffset, "Cdecl")
   if !Result or ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
   return Result
}

_cvReleaseImage(pimage)
{
   DllCall(opencv.opencv_core "\cvReleaseImage", "ptr*", pimage, "Cdecl")
   if ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
}

_cvReleaseMat(cvmat)
{
   DllCall(opencv.opencv_core "\cvReleaseMat", "ptr*", cvmat, "Cdecl")
   if ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
}

_cvDestroyAllWindows()
{
   DllCall(opencv.opencv_highgui "\cvDestroyAllWindows", "Cdecl")
   if ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
}

_cvClearSeq(cvseq)
{
   DllCall(opencv.opencv_core "\cvClearSeq", "ptr", cvseq, "Cdecl")
   if ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
}

_Opencv_CloseDLL()
{
   For key, value in opencv
      if hModule := DllCall("GetModuleHandle", "str", value)
         DllCall("FreeLibrary", "ptr", hModule)
}

_Error(val)
{
   msgbox % val "`nLastError - " A_LastError
   ExitApp
}
just me
Posts: 9442
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: OpenCV help - find the contour of many shapes

10 Jun 2020, 05:27

@Blackholyman
AHK does not need functions like DllStructCreate() for an existing pointer because it's able to access memory using this pointer by NumGet()/NumPut(). Your version of DllStructCreate() takes the passed memory pointer and overwrites the memory pointed to with the contents of uninitialized local variables. That doesn't seem to make sense.
User avatar
Blackholyman
Posts: 1293
Joined: 29 Sep 2013, 22:57
Location: Denmark
Contact:

Re: OpenCV help - find the contour of many shapes

11 Jun 2020, 06:22

Hey

Thank you @malcev for that help

I made the last few parts happen from there
Spoiler
I also put all the needed files here on github

@just me thanks for letting me know that my version was wrong, i did kinda know that we are able to use the Num... functions, but when looking at the autoit call it seems as if it is helping the user a bit as the other DllStruct... functions let you get/set values by "string name" without remembering the ptr offset, i was just hoping to do something kinda similar to that :)
Also check out:
Courses on AutoHotkey

My Autohotkey Blog
:dance:

Return to “Ask for Help (v1)”

Who is online

Users browsing this forum: Google [Bot] and 243 guests