mirror of
https://github.com/unidoc/unipdf.git
synced 2025-05-02 22:17:06 +08:00
12 lines
195 KiB
Go
12 lines
195 KiB
Go
//
|
|
// Copyright 2020 FoxyUtils ehf. All rights reserved.
|
|
//
|
|
// This is a commercial product and requires a license to operate.
|
|
// A trial license can be obtained at https://unidoc.io
|
|
//
|
|
// DO NOT EDIT: generated by unitwist Go source code obfuscator.
|
|
//
|
|
// Use of this source code is governed by the UniDoc End User License Agreement
|
|
// terms that can be accessed at https://unidoc.io/eula/
|
|
|
|
package bitmap ;import (_d "encoding/binary";_g "github.com/stretchr/testify/require";_bc "github.com/unidoc/unipdf/v3/common";_bb "github.com/unidoc/unipdf/v3/internal/bitwise";_ac "github.com/unidoc/unipdf/v3/internal/imageutil";_b "github.com/unidoc/unipdf/v3/internal/jbig2/basic";_e "github.com/unidoc/unipdf/v3/internal/jbig2/errors";_ab "image";_ba "math";_gc "sort";_ec "strings";_c "testing";);func (_edf *Bitmap )SetPixel (x ,y int ,pixel byte )error {_gcb :=_edf .GetByteIndex (x ,y );if _gcb > len (_edf .Data )-1{return _e .Errorf ("\u0053\u0065\u0074\u0050\u0069\u0078\u0065\u006c","\u0069\u006e\u0064\u0065x \u006f\u0075\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065\u003a\u0020%\u0064",_gcb );};_aga :=_edf .GetBitOffset (x );_fdga :=uint (7-_aga );_gbbb :=_edf .Data [_gcb ];var _dba byte ;if pixel ==1{_dba =_gbbb |(pixel &0x01<<_fdga );}else {_dba =_gbbb &^(1<<_fdga );};_edf .Data [_gcb ]=_dba ;return nil ;};func (_dded *Boxes )SelectBySize (width ,height int ,tp LocationFilter ,relation SizeComparison )(_aafd *Boxes ,_eec error ){const _ggbf ="\u0042o\u0078e\u0073\u002e\u0053\u0065\u006ce\u0063\u0074B\u0079\u0053\u0069\u007a\u0065";if _dded ==nil {return nil ,_e .Error (_ggbf ,"b\u006f\u0078\u0065\u0073 '\u0062'\u0020\u006e\u006f\u0074\u0020d\u0065\u0066\u0069\u006e\u0065\u0064");};if len (*_dded )==0{return _dded ,nil ;};switch tp {case LocSelectWidth ,LocSelectHeight ,LocSelectIfEither ,LocSelectIfBoth :default:return nil ,_e .Errorf (_ggbf ,"\u0069\u006e\u0076al\u0069\u0064\u0020\u0066\u0069\u006c\u0074\u0065\u0072\u0020\u0074\u0079\u0070\u0065\u003a\u0020\u0025\u0064",tp );};switch relation {case SizeSelectIfLT ,SizeSelectIfGT ,SizeSelectIfLTE ,SizeSelectIfGTE :default:return nil ,_e .Errorf (_ggbf ,"i\u006e\u0076\u0061\u006c\u0069\u0064 \u0072\u0065\u006c\u0061\u0074\u0069\u006f\u006e\u0020t\u0079\u0070\u0065:\u0020'\u0025\u0064\u0027",tp );};_baaf :=_dded .makeSizeIndicator (width ,height ,tp ,relation );_acfbb ,_eec :=_dded .selectWithIndicator (_baaf );if _eec !=nil {return nil ,_e .Wrap (_eec ,_ggbf ,"");};return _acfbb ,nil ;};func NewWithUnpaddedData (width ,height int ,data []byte )(*Bitmap ,error ){const _gadf ="\u004e\u0065\u0077\u0057it\u0068\u0055\u006e\u0070\u0061\u0064\u0064\u0065\u0064\u0044\u0061\u0074\u0061";_dbd :=_fefb (width ,height );_dbd .Data =data ;if _bfb :=((width *height )+7)>>3;len (data )< _bfb {return nil ,_e .Errorf (_gadf ,"\u0069\u006e\u0076\u0061\u006c\u0069\u0064\u0020\u0064a\u0074\u0061\u0020\u006c\u0065\u006e\u0067\u0074\u0068\u003a\u0020\u0027\u0025\u0064\u0027\u002e\u0020\u0054\u0068\u0065\u0020\u0064\u0061t\u0061\u0020s\u0068\u006fu\u006c\u0064\u0020\u0063\u006f\u006e\u0074\u0061\u0069\u006e\u0020\u0061\u0074 l\u0065\u0061\u0073\u0074\u003a\u0020\u0027\u0025\u0064'\u0020\u0062\u0079\u0074\u0065\u0073",len (data ),_bfb );};if _dad :=_dbd .addPadBits ();_dad !=nil {return nil ,_e .Wrap (_dad ,_gadf ,"");};return _dbd ,nil ;};func Rect (x ,y ,w ,h int )(*_ab .Rectangle ,error ){const _cfaae ="b\u0069\u0074\u006d\u0061\u0070\u002e\u0052\u0065\u0063\u0074";if x < 0{w +=x ;x =0;if w <=0{return nil ,_e .Errorf (_cfaae ,"x\u003a\u0027\u0025\u0064\u0027\u0020<\u0020\u0030\u0020\u0061\u006e\u0064\u0020\u0077\u003a \u0027\u0025\u0064'\u0020<\u003d\u0020\u0030",x ,w );};};if y < 0{h +=y ;y =0;if h <=0{return nil ,_e .Error (_cfaae ,"\u0079\u0020\u003c 0\u0020\u0061\u006e\u0064\u0020\u0062\u006f\u0078\u0020\u006f\u0066\u0066\u0020\u002b\u0071\u0075\u0061\u0064");};};_daf :=_ab .Rect (x ,y ,x +w ,y +h );return &_daf ,nil ;};func CombineBytes (oldByte ,newByte byte ,op CombinationOperator )byte {return _eada (oldByte ,newByte ,op );};type SizeComparison int ;func (_gcca *Bitmap )inverseData (){if _bbdf :=_gcca .RasterOperation (0,0,_gcca .Width ,_gcca .Height ,PixNotDst ,nil ,0,0);_bbdf !=nil {_bc .Log .Debug ("\u0049n\u0076\u0065\u0072\u0073e\u0020\u0064\u0061\u0074\u0061 \u0066a\u0069l\u0065\u0064\u003a\u0020\u0027\u0025\u0076'",_bbdf );};if _gcca .Color ==Chocolate {_gcca .Color =Vanilla ;}else {_gcca .Color =Chocolate ;};};type Point struct{X ,Y float32 ;};func (_ebcf *Boxes )Get (i int )(*_ab .Rectangle ,error ){const _bdef ="\u0042o\u0078\u0065\u0073\u002e\u0047\u0065t";if _ebcf ==nil {return nil ,_e .Error (_bdef ,"\u0027\u0042\u006f\u0078es\u0027\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");};if i > len (*_ebcf )-1{return nil ,_e .Errorf (_bdef ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );};return (*_ebcf )[i ],nil ;};func _gdcdeg (_bfbbb *Bitmap ,_eafbg ,_efafe int ,_gcgf ,_dfdbb int ,_faaa RasterOperator ){var (_cbbf int ;_baga byte ;_gccef ,_gceg int ;_eccd int ;);_fab :=_gcgf >>3;_cgcd :=_gcgf &7;if _cgcd > 0{_baga =_agbg [_cgcd ];};_cbbf =_bfbbb .RowStride *_efafe +(_eafbg >>3);switch _faaa {case PixClr :for _gccef =0;_gccef < _dfdbb ;_gccef ++{_eccd =_cbbf +_gccef *_bfbbb .RowStride ;for _gceg =0;_gceg < _fab ;_gceg ++{_bfbbb .Data [_eccd ]=0x0;_eccd ++;};if _cgcd > 0{_bfbbb .Data [_eccd ]=_gaeca (_bfbbb .Data [_eccd ],0x0,_baga );};};case PixSet :for _gccef =0;_gccef < _dfdbb ;_gccef ++{_eccd =_cbbf +_gccef *_bfbbb .RowStride ;for _gceg =0;_gceg < _fab ;_gceg ++{_bfbbb .Data [_eccd ]=0xff;_eccd ++;};if _cgcd > 0{_bfbbb .Data [_eccd ]=_gaeca (_bfbbb .Data [_eccd ],0xff,_baga );};};case PixNotDst :for _gccef =0;_gccef < _dfdbb ;_gccef ++{_eccd =_cbbf +_gccef *_bfbbb .RowStride ;for _gceg =0;_gceg < _fab ;_gceg ++{_bfbbb .Data [_eccd ]=^_bfbbb .Data [_eccd ];_eccd ++;};if _cgcd > 0{_bfbbb .Data [_eccd ]=_gaeca (_bfbbb .Data [_eccd ],^_bfbbb .Data [_eccd ],_baga );};};};};type Bitmap struct{Width ,Height int ;BitmapNumber int ;RowStride int ;Data []byte ;Color Color ;Special int ;Text string ;XResolution ,YResolution int ;};func (_fedee *ClassedPoints )XAtIndex (i int )float32 {return (*_fedee .Points )[_fedee .IntSlice [i ]].X };func _efe (_ffece uint ,_ffgg byte )byte {return _ffgg >>_ffece <<_ffece };func (_cbgc Points )GetIntY (i int )(int ,error ){if i >=len (_cbgc ){return 0,_e .Errorf ("\u0050\u006f\u0069\u006e\u0074\u0073\u002e\u0047\u0065t\u0049\u006e\u0074\u0059","\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );};return int (_cbgc [i ].Y ),nil ;};func (_aefg *byWidth )Len ()int {return len (_aefg .Values )};func (_dgbda *Bitmaps )GetBitmap (i int )(*Bitmap ,error ){const _ggccd ="\u0047e\u0074\u0042\u0069\u0074\u006d\u0061p";if _dgbda ==nil {return nil ,_e .Error (_ggccd ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0042\u0069\u0074ma\u0070\u0073");};if i > len (_dgbda .Values )-1{return nil ,_e .Errorf (_ggccd ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );};return _dgbda .Values [i ],nil ;};func (_bgce *Bitmap )GetByteIndex (x ,y int )int {return y *_bgce .RowStride +(x >>3)};func init (){for _eeae :=0;_eeae < 256;_eeae ++{_edbg [_eeae ]=uint8 (_eeae &0x1)+(uint8 (_eeae >>1)&0x1)+(uint8 (_eeae >>2)&0x1)+(uint8 (_eeae >>3)&0x1)+(uint8 (_eeae >>4)&0x1)+(uint8 (_eeae >>5)&0x1)+(uint8 (_eeae >>6)&0x1)+(uint8 (_eeae >>7)&0x1);};};func (_agee *Bitmap )setBit (_cgcf int ){_agee .Data [(_cgcf >>3)]|=0x80>>uint (_cgcf &7)};func TstCSymbol (t *_c .T )*Bitmap {t .Helper ();_deed :=New (6,6);_g .NoError (t ,_deed .SetPixel (1,0,1));_g .NoError (t ,_deed .SetPixel (2,0,1));_g .NoError (t ,_deed .SetPixel (3,0,1));_g .NoError (t ,_deed .SetPixel (4,0,1));_g .NoError (t ,_deed .SetPixel (0,1,1));_g .NoError (t ,_deed .SetPixel (5,1,1));_g .NoError (t ,_deed .SetPixel (0,2,1));_g .NoError (t ,_deed .SetPixel (0,3,1));_g .NoError (t ,_deed .SetPixel (0,4,1));_g .NoError (t ,_deed .SetPixel (5,4,1));_g .NoError (t ,_deed .SetPixel (1,5,1));_g .NoError (t ,_deed .SetPixel (2,5,1));_g .NoError (t ,_deed .SetPixel (3,5,1));_g .NoError (t ,_deed .SetPixel (4,5,1));return _deed ;};type ClassedPoints struct{*Points ;_b .IntSlice ;_daeg func (_gaecg ,_gddd int )bool ;};func (_agad *Bitmap )SetByte (index int ,v byte )error {if index > len (_agad .Data )-1||index < 0{return _e .Errorf ("\u0053e\u0074\u0042\u0079\u0074\u0065","\u0069\u006e\u0064\u0065x \u006f\u0075\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065\u003a\u0020%\u0064",index );};_agad .Data [index ]=v ;return nil ;};func (_ebbfc *Boxes )Add (box *_ab .Rectangle )error {if _ebbfc ==nil {return _e .Error ("\u0042o\u0078\u0065\u0073\u002e\u0041\u0064d","\u0027\u0042\u006f\u0078es\u0027\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");};*_ebbfc =append (*_ebbfc ,box );return nil ;};const (_ SizeComparison =iota ;SizeSelectIfLT ;SizeSelectIfGT ;SizeSelectIfLTE ;SizeSelectIfGTE ;SizeSelectIfEQ ;);func (_dda *Boxes )makeSizeIndicator (_gbfa ,_abgg int ,_cbg LocationFilter ,_badc SizeComparison )*_b .NumSlice {_eggb :=&_b .NumSlice {};var _eeb ,_eedb ,_bbc int ;for _ ,_ffff :=range *_dda {_eeb =0;_eedb ,_bbc =_ffff .Dx (),_ffff .Dy ();switch _cbg {case LocSelectWidth :if (_badc ==SizeSelectIfLT &&_eedb < _gbfa )||(_badc ==SizeSelectIfGT &&_eedb > _gbfa )||(_badc ==SizeSelectIfLTE &&_eedb <=_gbfa )||(_badc ==SizeSelectIfGTE &&_eedb >=_gbfa ){_eeb =1;};case LocSelectHeight :if (_badc ==SizeSelectIfLT &&_bbc < _abgg )||(_badc ==SizeSelectIfGT &&_bbc > _abgg )||(_badc ==SizeSelectIfLTE &&_bbc <=_abgg )||(_badc ==SizeSelectIfGTE &&_bbc >=_abgg ){_eeb =1;};case LocSelectIfEither :if (_badc ==SizeSelectIfLT &&(_bbc < _abgg ||_eedb < _gbfa ))||(_badc ==SizeSelectIfGT &&(_bbc > _abgg ||_eedb > _gbfa ))||(_badc ==SizeSelectIfLTE &&(_bbc <=_abgg ||_eedb <=_gbfa ))||(_badc ==SizeSelectIfGTE &&(_bbc >=_abgg ||_eedb >=_gbfa )){_eeb =1;};case LocSelectIfBoth :if (_badc ==SizeSelectIfLT &&(_bbc < _abgg &&_eedb < _gbfa ))||(_badc ==SizeSelectIfGT &&(_bbc > _abgg &&_eedb > _gbfa ))||(_badc ==SizeSelectIfLTE &&(_bbc <=_abgg &&_eedb <=_gbfa ))||(_badc ==SizeSelectIfGTE &&(_bbc >=_abgg &&_eedb >=_gbfa )){_eeb =1;};};_eggb .AddInt (_eeb );};return _eggb ;};func (_aff *Bitmap )String ()string {var _fecd ="\u000a";for _abba :=0;_abba < _aff .Height ;_abba ++{var _cabd string ;for _gac :=0;_gac < _aff .Width ;_gac ++{_adef :=_aff .GetPixel (_gac ,_abba );if _adef {_cabd +="\u0031";}else {_cabd +="\u0030";};};_fecd +=_cabd +"\u000a";};return _fecd ;};func (_gecf *Bitmap )resizeImageData (_cea *Bitmap )error {if _cea ==nil {return _e .Error ("\u0072e\u0073i\u007a\u0065\u0049\u006d\u0061\u0067\u0065\u0044\u0061\u0074\u0061","\u0073r\u0063 \u0069\u0073\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");};if _gecf .SizesEqual (_cea ){return nil ;};_gecf .Data =make ([]byte ,len (_cea .Data ));_gecf .Width =_cea .Width ;_gecf .Height =_cea .Height ;_gecf .RowStride =_cea .RowStride ;return nil ;};func TstFrameBitmapData ()[]byte {return _aedd .Data };const (PixSrc RasterOperator =0xc;PixDst RasterOperator =0xa;PixNotSrc RasterOperator =0x3;PixNotDst RasterOperator =0x5;PixClr RasterOperator =0x0;PixSet RasterOperator =0xf;PixSrcOrDst RasterOperator =0xe;PixSrcAndDst RasterOperator =0x8;PixSrcXorDst RasterOperator =0x6;PixNotSrcOrDst RasterOperator =0xb;PixNotSrcAndDst RasterOperator =0x2;PixSrcOrNotDst RasterOperator =0xd;PixSrcAndNotDst RasterOperator =0x4;PixNotPixSrcOrDst RasterOperator =0x1;PixNotPixSrcAndDst RasterOperator =0x7;PixNotPixSrcXorDst RasterOperator =0x9;PixPaint =PixSrcOrDst ;PixSubtract =PixNotSrcAndDst ;PixMask =PixSrcAndDst ;);type byHeight Bitmaps ;func TstWSymbol (t *_c .T ,scale ...int )*Bitmap {_cefe ,_cagda :=NewWithData (5,5,[]byte {0x88,0x88,0xA8,0xD8,0x88});_g .NoError (t ,_cagda );return TstGetScaledSymbol (t ,_cefe ,scale ...);};func _beeb (_fadb ,_bbgg int )int {if _fadb > _bbgg {return _fadb ;};return _bbgg ;};func Centroids (bms []*Bitmap )(*Points ,error ){_eafd :=make ([]Point ,len (bms ));_aaga :=_dafg ();_dcbc :=_accc ();var _aebb error ;for _efdd ,_acffg :=range bms {_eafd [_efdd ],_aebb =_acffg .centroid (_aaga ,_dcbc );if _aebb !=nil {return nil ,_aebb ;};};_ebbcc :=Points (_eafd );return &_ebbcc ,nil ;};func TstAddSymbol (t *_c .T ,bms *Bitmaps ,sym *Bitmap ,x *int ,y int ,space int ){bms .AddBitmap (sym );_eeba :=_ab .Rect (*x ,y ,*x +sym .Width ,y +sym .Height );bms .AddBox (&_eeba );*x +=sym .Width +space ;};func _fagc (_fabg ,_egeb *Bitmap ,_ddbd ,_cbcf int )(_eefa error ){const _efbe ="\u0073e\u0065d\u0066\u0069\u006c\u006c\u0042i\u006e\u0061r\u0079\u004c\u006f\u0077\u0034";var (_caacc ,_aeec ,_abbaf ,_fcfde int ;_bffd ,_fagf ,_dbgd ,_eagf ,_gdb ,_ccgcb ,_cgeb byte ;);for _caacc =0;_caacc < _ddbd ;_caacc ++{_abbaf =_caacc *_fabg .RowStride ;_fcfde =_caacc *_egeb .RowStride ;for _aeec =0;_aeec < _cbcf ;_aeec ++{_bffd ,_eefa =_fabg .GetByte (_abbaf +_aeec );if _eefa !=nil {return _e .Wrap (_eefa ,_efbe ,"\u0066i\u0072\u0073\u0074\u0020\u0067\u0065t");};_fagf ,_eefa =_egeb .GetByte (_fcfde +_aeec );if _eefa !=nil {return _e .Wrap (_eefa ,_efbe ,"\u0073\u0065\u0063\u006f\u006e\u0064\u0020\u0067\u0065\u0074");};if _caacc > 0{_dbgd ,_eefa =_fabg .GetByte (_abbaf -_fabg .RowStride +_aeec );if _eefa !=nil {return _e .Wrap (_eefa ,_efbe ,"\u0069\u0020\u003e \u0030");};_bffd |=_dbgd ;};if _aeec > 0{_eagf ,_eefa =_fabg .GetByte (_abbaf +_aeec -1);if _eefa !=nil {return _e .Wrap (_eefa ,_efbe ,"\u006a\u0020\u003e \u0030");};_bffd |=_eagf <<7;};_bffd &=_fagf ;if _bffd ==0||(^_bffd )==0{if _eefa =_fabg .SetByte (_abbaf +_aeec ,_bffd );_eefa !=nil {return _e .Wrap (_eefa ,_efbe ,"b\u0074\u0020\u003d\u003d 0\u0020|\u007c\u0020\u0028\u005e\u0062t\u0029\u0020\u003d\u003d\u0020\u0030");};continue ;};for {_cgeb =_bffd ;_bffd =(_bffd |(_bffd >>1)|(_bffd <<1))&_fagf ;if (_bffd ^_cgeb )==0{if _eefa =_fabg .SetByte (_abbaf +_aeec ,_bffd );_eefa !=nil {return _e .Wrap (_eefa ,_efbe ,"\u0073\u0065\u0074\u0074\u0069\u006e\u0067\u0020\u0070\u0072\u0065\u0076 \u0062\u0079\u0074\u0065");};break ;};};};};for _caacc =_ddbd -1;_caacc >=0;_caacc --{_abbaf =_caacc *_fabg .RowStride ;_fcfde =_caacc *_egeb .RowStride ;for _aeec =_cbcf -1;_aeec >=0;_aeec --{if _bffd ,_eefa =_fabg .GetByte (_abbaf +_aeec );_eefa !=nil {return _e .Wrap (_eefa ,_efbe ,"\u0072\u0065\u0076\u0065\u0072\u0073\u0065\u0020\u0066\u0069\u0072\u0073t\u0020\u0067\u0065\u0074");};if _fagf ,_eefa =_egeb .GetByte (_fcfde +_aeec );_eefa !=nil {return _e .Wrap (_eefa ,_efbe ,"r\u0065\u0076\u0065\u0072se\u0020g\u0065\u0074\u0020\u006d\u0061s\u006b\u0020\u0062\u0079\u0074\u0065");};if _caacc < _ddbd -1{if _gdb ,_eefa =_fabg .GetByte (_abbaf +_fabg .RowStride +_aeec );_eefa !=nil {return _e .Wrap (_eefa ,_efbe ,"\u0072\u0065v\u0065\u0072\u0073e\u0020\u0069\u0020\u003c\u0020\u0068\u0020\u002d\u0031");};_bffd |=_gdb ;};if _aeec < _cbcf -1{if _ccgcb ,_eefa =_fabg .GetByte (_abbaf +_aeec +1);_eefa !=nil {return _e .Wrap (_eefa ,_efbe ,"\u0072\u0065\u0076\u0065rs\u0065\u0020\u006a\u0020\u003c\u0020\u0077\u0070\u006c\u0020\u002d\u0020\u0031");};_bffd |=_ccgcb >>7;};_bffd &=_fagf ;if _bffd ==0||(^_bffd )==0{if _eefa =_fabg .SetByte (_abbaf +_aeec ,_bffd );_eefa !=nil {return _e .Wrap (_eefa ,_efbe ,"\u0073\u0065\u0074\u0074\u0069\u006e\u0067\u0020\u006d\u0061\u0073k\u0065\u0064\u0020\u0062\u0079\u0074\u0065\u0020\u0066\u0061i\u006c\u0065\u0064");};continue ;};for {_cgeb =_bffd ;_bffd =(_bffd |(_bffd >>1)|(_bffd <<1))&_fagf ;if (_bffd ^_cgeb )==0{if _eefa =_fabg .SetByte (_abbaf +_aeec ,_bffd );_eefa !=nil {return _e .Wrap (_eefa ,_efbe ,"\u0072e\u0076\u0065\u0072\u0073e\u0020\u0073\u0065\u0074\u0074i\u006eg\u0020p\u0072\u0065\u0076\u0020\u0062\u0079\u0074e");};break ;};};};};return nil ;};func (_ffecg *Bitmap )setFourBytes (_gegg int ,_fgb uint32 )error {if _gegg +3> len (_ffecg .Data )-1{return _e .Errorf ("\u0073\u0065\u0074F\u006f\u0075\u0072\u0042\u0079\u0074\u0065\u0073","\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",_gegg );};_ffecg .Data [_gegg ]=byte ((_fgb &0xff000000)>>24);_ffecg .Data [_gegg +1]=byte ((_fgb &0xff0000)>>16);_ffecg .Data [_gegg +2]=byte ((_fgb &0xff00)>>8);_ffecg .Data [_gegg +3]=byte (_fgb &0xff);return nil ;};var _acdb =[5]int {1,2,3,0,4};type Component int ;type RasterOperator int ;func CorrelationScore (bm1 ,bm2 *Bitmap ,area1 ,area2 int ,delX ,delY float32 ,maxDiffW ,maxDiffH int ,tab []int )(_afc float64 ,_fcab error ){const _cbbaa ="\u0063\u006fr\u0072\u0065\u006ca\u0074\u0069\u006f\u006e\u0053\u0063\u006f\u0072\u0065";if bm1 ==nil ||bm2 ==nil {return 0,_e .Error (_cbbaa ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0062\u0069\u0074ma\u0070\u0073");};if tab ==nil {return 0,_e .Error (_cbbaa ,"\u0027\u0074\u0061\u0062\u0027\u0020\u006e\u006f\u0074\u0020\u0064\u0065f\u0069\u006e\u0065\u0064");};if area1 <=0||area2 <=0{return 0,_e .Error (_cbbaa ,"\u0061\u0072\u0065\u0061s\u0020\u006d\u0075\u0073\u0074\u0020\u0062\u0065\u0020\u0067r\u0065a\u0074\u0065\u0072\u0020\u0074\u0068\u0061n\u0020\u0030");};_gfcc ,_ebgg :=bm1 .Width ,bm1 .Height ;_gbbcb ,_bgbb :=bm2 .Width ,bm2 .Height ;_befc :=_faee (_gfcc -_gbbcb );if _befc > maxDiffW {return 0,nil ;};_bdfgb :=_faee (_ebgg -_bgbb );if _bdfgb > maxDiffH {return 0,nil ;};var _ebgc ,_baee int ;if delX >=0{_ebgc =int (delX +0.5);}else {_ebgc =int (delX -0.5);};if delY >=0{_baee =int (delY +0.5);}else {_baee =int (delY -0.5);};_cfd :=_beeb (_baee ,0);_efcf :=_cegcb (_bgbb +_baee ,_ebgg );_fcfg :=bm1 .RowStride *_cfd ;_bdece :=bm2 .RowStride *(_cfd -_baee );_fgdd :=_beeb (_ebgc ,0);_gbgga :=_cegcb (_gbbcb +_ebgc ,_gfcc );_aebe :=bm2 .RowStride ;var _bebb ,_egcb int ;if _ebgc >=8{_bebb =_ebgc >>3;_fcfg +=_bebb ;_fgdd -=_bebb <<3;_gbgga -=_bebb <<3;_ebgc &=7;}else if _ebgc <=-8{_egcb =-((_ebgc +7)>>3);_bdece +=_egcb ;_aebe -=_egcb ;_ebgc +=_egcb <<3;};if _fgdd >=_gbgga ||_cfd >=_efcf {return 0,nil ;};_dgde :=(_gbgga +7)>>3;var (_beab ,_acff ,_aaa byte ;_ddfg ,_agecf ,_bafe int ;);switch {case _ebgc ==0:for _bafe =_cfd ;_bafe < _efcf ;_bafe ,_fcfg ,_bdece =_bafe +1,_fcfg +bm1 .RowStride ,_bdece +bm2 .RowStride {for _agecf =0;_agecf < _dgde ;_agecf ++{_aaa =bm1 .Data [_fcfg +_agecf ]&bm2 .Data [_bdece +_agecf ];_ddfg +=tab [_aaa ];};};case _ebgc > 0:if _aebe < _dgde {for _bafe =_cfd ;_bafe < _efcf ;_bafe ,_fcfg ,_bdece =_bafe +1,_fcfg +bm1 .RowStride ,_bdece +bm2 .RowStride {_beab ,_acff =bm1 .Data [_fcfg ],bm2 .Data [_bdece ]>>uint (_ebgc );_aaa =_beab &_acff ;_ddfg +=tab [_aaa ];for _agecf =1;_agecf < _aebe ;_agecf ++{_beab ,_acff =bm1 .Data [_fcfg +_agecf ],(bm2 .Data [_bdece +_agecf ]>>uint (_ebgc ))|(bm2 .Data [_bdece +_agecf -1]<<uint (8-_ebgc ));_aaa =_beab &_acff ;_ddfg +=tab [_aaa ];};_beab =bm1 .Data [_fcfg +_agecf ];_acff =bm2 .Data [_bdece +_agecf -1]<<uint (8-_ebgc );_aaa =_beab &_acff ;_ddfg +=tab [_aaa ];};}else {for _bafe =_cfd ;_bafe < _efcf ;_bafe ,_fcfg ,_bdece =_bafe +1,_fcfg +bm1 .RowStride ,_bdece +bm2 .RowStride {_beab ,_acff =bm1 .Data [_fcfg ],bm2 .Data [_bdece ]>>uint (_ebgc );_aaa =_beab &_acff ;_ddfg +=tab [_aaa ];for _agecf =1;_agecf < _dgde ;_agecf ++{_beab =bm1 .Data [_fcfg +_agecf ];_acff =(bm2 .Data [_bdece +_agecf ]>>uint (_ebgc ))|(bm2 .Data [_bdece +_agecf -1]<<uint (8-_ebgc ));_aaa =_beab &_acff ;_ddfg +=tab [_aaa ];};};};default:if _dgde < _aebe {for _bafe =_cfd ;_bafe < _efcf ;_bafe ,_fcfg ,_bdece =_bafe +1,_fcfg +bm1 .RowStride ,_bdece +bm2 .RowStride {for _agecf =0;_agecf < _dgde ;_agecf ++{_beab =bm1 .Data [_fcfg +_agecf ];_acff =bm2 .Data [_bdece +_agecf ]<<uint (-_ebgc );_acff |=bm2 .Data [_bdece +_agecf +1]>>uint (8+_ebgc );_aaa =_beab &_acff ;_ddfg +=tab [_aaa ];};};}else {for _bafe =_cfd ;_bafe < _efcf ;_bafe ,_fcfg ,_bdece =_bafe +1,_fcfg +bm1 .RowStride ,_bdece +bm2 .RowStride {for _agecf =0;_agecf < _dgde -1;_agecf ++{_beab =bm1 .Data [_fcfg +_agecf ];_acff =bm2 .Data [_bdece +_agecf ]<<uint (-_ebgc );_acff |=bm2 .Data [_bdece +_agecf +1]>>uint (8+_ebgc );_aaa =_beab &_acff ;_ddfg +=tab [_aaa ];};_beab =bm1 .Data [_fcfg +_agecf ];_acff =bm2 .Data [_bdece +_agecf ]<<uint (-_ebgc );_aaa =_beab &_acff ;_ddfg +=tab [_aaa ];};};};_afc =float64 (_ddfg )*float64 (_ddfg )/(float64 (area1 )*float64 (area2 ));return _afc ,nil ;};func (_dcdf *Bitmap )SetPadBits (value int ){_dcdf .setPadBits (value )};func (_cfgef Points )Get (i int )(Point ,error ){if i > len (_cfgef )-1{return Point {},_e .Errorf ("\u0050\u006f\u0069\u006e\u0074\u0073\u002e\u0047\u0065\u0074","\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );};return _cfgef [i ],nil ;};func (_ebefe *ClassedPoints )Swap (i ,j int ){_ebefe .IntSlice [i ],_ebefe .IntSlice [j ]=_ebefe .IntSlice [j ],_ebefe .IntSlice [i ];};func (_ecad *byHeight )Less (i ,j int )bool {return _ecad .Values [i ].Height < _ecad .Values [j ].Height };func (_decc *BitmapsArray )AddBitmaps (bm *Bitmaps ){_decc .Values =append (_decc .Values ,bm )};func TstOSymbol (t *_c .T ,scale ...int )*Bitmap {_fea ,_dfaee :=NewWithData (4,5,[]byte {0xF0,0x90,0x90,0x90,0xF0});_g .NoError (t ,_dfaee );return TstGetScaledSymbol (t ,_fea ,scale ...);};func (_acda *Bitmap )GetPixel (x ,y int )bool {_eade :=_acda .GetByteIndex (x ,y );_bgb :=_acda .GetBitOffset (x );_ffdd :=uint (7-_bgb );if _eade > len (_acda .Data )-1{_bc .Log .Debug ("\u0054\u0072\u0079\u0069\u006e\u0067\u0020\u0074\u006f\u0020\u0067\u0065\u0074\u0020\u0070\u0069\u0078\u0065\u006c\u0020o\u0075\u0074\u0020\u006f\u0066\u0020\u0074\u0068\u0065\u0020\u0064\u0061\u0074\u0061\u0020\u0072\u0061\u006e\u0067\u0065\u002e \u0078\u003a\u0020\u0027\u0025\u0064\u0027\u002c\u0020\u0079\u003a\u0027\u0025\u0064'\u002c\u0020\u0062m\u003a\u0020\u0027\u0025\u0073\u0027",x ,y ,_acda );return false ;};if (_acda .Data [_eade ]>>_ffdd )&0x01>=1{return true ;};return false ;};func TstTSymbol (t *_c .T ,scale ...int )*Bitmap {_bceg ,_ebegc :=NewWithData (5,5,[]byte {0xF8,0x20,0x20,0x20,0x20});_g .NoError (t ,_ebegc );return TstGetScaledSymbol (t ,_bceg ,scale ...);};func _gcge (_fafef *Bitmap ,_cbfa ,_bcgf ,_ffa ,_gged int ,_dgbd RasterOperator ,_ecaa *Bitmap ,_ecaac ,_dfbd int )error {var (_degdb byte ;_afaga int ;_afcb int ;_bfde ,_dece int ;_caff ,_gea int ;);_daac :=_ffa >>3;_bdfc :=_ffa &7;if _bdfc > 0{_degdb =_agbg [_bdfc ];};_afaga =_ecaa .RowStride *_dfbd +(_ecaac >>3);_afcb =_fafef .RowStride *_bcgf +(_cbfa >>3);switch _dgbd {case PixSrc :for _caff =0;_caff < _gged ;_caff ++{_bfde =_afaga +_caff *_ecaa .RowStride ;_dece =_afcb +_caff *_fafef .RowStride ;for _gea =0;_gea < _daac ;_gea ++{_fafef .Data [_dece ]=_ecaa .Data [_bfde ];_dece ++;_bfde ++;};if _bdfc > 0{_fafef .Data [_dece ]=_gaeca (_fafef .Data [_dece ],_ecaa .Data [_bfde ],_degdb );};};case PixNotSrc :for _caff =0;_caff < _gged ;_caff ++{_bfde =_afaga +_caff *_ecaa .RowStride ;_dece =_afcb +_caff *_fafef .RowStride ;for _gea =0;_gea < _daac ;_gea ++{_fafef .Data [_dece ]=^(_ecaa .Data [_bfde ]);_dece ++;_bfde ++;};if _bdfc > 0{_fafef .Data [_dece ]=_gaeca (_fafef .Data [_dece ],^_ecaa .Data [_bfde ],_degdb );};};case PixSrcOrDst :for _caff =0;_caff < _gged ;_caff ++{_bfde =_afaga +_caff *_ecaa .RowStride ;_dece =_afcb +_caff *_fafef .RowStride ;for _gea =0;_gea < _daac ;_gea ++{_fafef .Data [_dece ]|=_ecaa .Data [_bfde ];_dece ++;_bfde ++;};if _bdfc > 0{_fafef .Data [_dece ]=_gaeca (_fafef .Data [_dece ],_ecaa .Data [_bfde ]|_fafef .Data [_dece ],_degdb );};};case PixSrcAndDst :for _caff =0;_caff < _gged ;_caff ++{_bfde =_afaga +_caff *_ecaa .RowStride ;_dece =_afcb +_caff *_fafef .RowStride ;for _gea =0;_gea < _daac ;_gea ++{_fafef .Data [_dece ]&=_ecaa .Data [_bfde ];_dece ++;_bfde ++;};if _bdfc > 0{_fafef .Data [_dece ]=_gaeca (_fafef .Data [_dece ],_ecaa .Data [_bfde ]&_fafef .Data [_dece ],_degdb );};};case PixSrcXorDst :for _caff =0;_caff < _gged ;_caff ++{_bfde =_afaga +_caff *_ecaa .RowStride ;_dece =_afcb +_caff *_fafef .RowStride ;for _gea =0;_gea < _daac ;_gea ++{_fafef .Data [_dece ]^=_ecaa .Data [_bfde ];_dece ++;_bfde ++;};if _bdfc > 0{_fafef .Data [_dece ]=_gaeca (_fafef .Data [_dece ],_ecaa .Data [_bfde ]^_fafef .Data [_dece ],_degdb );};};case PixNotSrcOrDst :for _caff =0;_caff < _gged ;_caff ++{_bfde =_afaga +_caff *_ecaa .RowStride ;_dece =_afcb +_caff *_fafef .RowStride ;for _gea =0;_gea < _daac ;_gea ++{_fafef .Data [_dece ]|=^(_ecaa .Data [_bfde ]);_dece ++;_bfde ++;};if _bdfc > 0{_fafef .Data [_dece ]=_gaeca (_fafef .Data [_dece ],^(_ecaa .Data [_bfde ])|_fafef .Data [_dece ],_degdb );};};case PixNotSrcAndDst :for _caff =0;_caff < _gged ;_caff ++{_bfde =_afaga +_caff *_ecaa .RowStride ;_dece =_afcb +_caff *_fafef .RowStride ;for _gea =0;_gea < _daac ;_gea ++{_fafef .Data [_dece ]&=^(_ecaa .Data [_bfde ]);_dece ++;_bfde ++;};if _bdfc > 0{_fafef .Data [_dece ]=_gaeca (_fafef .Data [_dece ],^(_ecaa .Data [_bfde ])&_fafef .Data [_dece ],_degdb );};};case PixSrcOrNotDst :for _caff =0;_caff < _gged ;_caff ++{_bfde =_afaga +_caff *_ecaa .RowStride ;_dece =_afcb +_caff *_fafef .RowStride ;for _gea =0;_gea < _daac ;_gea ++{_fafef .Data [_dece ]=_ecaa .Data [_bfde ]|^(_fafef .Data [_dece ]);_dece ++;_bfde ++;};if _bdfc > 0{_fafef .Data [_dece ]=_gaeca (_fafef .Data [_dece ],_ecaa .Data [_bfde ]|^(_fafef .Data [_dece ]),_degdb );};};case PixSrcAndNotDst :for _caff =0;_caff < _gged ;_caff ++{_bfde =_afaga +_caff *_ecaa .RowStride ;_dece =_afcb +_caff *_fafef .RowStride ;for _gea =0;_gea < _daac ;_gea ++{_fafef .Data [_dece ]=_ecaa .Data [_bfde ]&^(_fafef .Data [_dece ]);_dece ++;_bfde ++;};if _bdfc > 0{_fafef .Data [_dece ]=_gaeca (_fafef .Data [_dece ],_ecaa .Data [_bfde ]&^(_fafef .Data [_dece ]),_degdb );};};case PixNotPixSrcOrDst :for _caff =0;_caff < _gged ;_caff ++{_bfde =_afaga +_caff *_ecaa .RowStride ;_dece =_afcb +_caff *_fafef .RowStride ;for _gea =0;_gea < _daac ;_gea ++{_fafef .Data [_dece ]=^(_ecaa .Data [_bfde ]|_fafef .Data [_dece ]);_dece ++;_bfde ++;};if _bdfc > 0{_fafef .Data [_dece ]=_gaeca (_fafef .Data [_dece ],^(_ecaa .Data [_bfde ]|_fafef .Data [_dece ]),_degdb );};};case PixNotPixSrcAndDst :for _caff =0;_caff < _gged ;_caff ++{_bfde =_afaga +_caff *_ecaa .RowStride ;_dece =_afcb +_caff *_fafef .RowStride ;for _gea =0;_gea < _daac ;_gea ++{_fafef .Data [_dece ]=^(_ecaa .Data [_bfde ]&_fafef .Data [_dece ]);_dece ++;_bfde ++;};if _bdfc > 0{_fafef .Data [_dece ]=_gaeca (_fafef .Data [_dece ],^(_ecaa .Data [_bfde ]&_fafef .Data [_dece ]),_degdb );};};case PixNotPixSrcXorDst :for _caff =0;_caff < _gged ;_caff ++{_bfde =_afaga +_caff *_ecaa .RowStride ;_dece =_afcb +_caff *_fafef .RowStride ;for _gea =0;_gea < _daac ;_gea ++{_fafef .Data [_dece ]=^(_ecaa .Data [_bfde ]^_fafef .Data [_dece ]);_dece ++;_bfde ++;};if _bdfc > 0{_fafef .Data [_dece ]=_gaeca (_fafef .Data [_dece ],^(_ecaa .Data [_bfde ]^_fafef .Data [_dece ]),_degdb );};};default:_bc .Log .Debug ("\u0050\u0072ov\u0069\u0064\u0065d\u0020\u0069\u006e\u0076ali\u0064 r\u0061\u0073\u0074\u0065\u0072\u0020\u006fpe\u0072\u0061\u0074\u006f\u0072\u003a\u0020%\u0076",_dgbd );return _e .Error ("\u0072\u0061\u0073\u0074er\u004f\u0070\u0042\u0079\u0074\u0065\u0041\u006c\u0069\u0067\u006e\u0065\u0064\u004co\u0077","\u0069\u006e\u0076al\u0069\u0064\u0020\u0072\u0061\u0073\u0074\u0065\u0072\u0020\u006f\u0070\u0065\u0072\u0061\u0074\u006f\u0072");};return nil ;};func _ggcfff (_gccbe *Bitmap ,_afda *Bitmap ,_agae int )(_bbeg error ){const _gffb ="\u0073\u0065\u0065\u0064\u0066\u0069\u006c\u006c\u0042\u0069\u006e\u0061r\u0079\u004c\u006f\u0077";_cgdb :=_cegcb (_gccbe .Height ,_afda .Height );_afga :=_cegcb (_gccbe .RowStride ,_afda .RowStride );switch _agae {case 4:_bbeg =_fagc (_gccbe ,_afda ,_cgdb ,_afga );case 8:_bbeg =_fbcf (_gccbe ,_afda ,_cgdb ,_afga );default:return _e .Errorf (_gffb ,"\u0063\u006f\u006e\u006e\u0065\u0063\u0074\u0069\u0076\u0069\u0074\u0079\u0020\u006d\u0075\u0073\u0074\u0020\u0062\u0065\u0020\u0034\u0020\u006fr\u0020\u0038\u0020\u002d\u0020i\u0073\u003a \u0027\u0025\u0064\u0027",_agae );};if _bbeg !=nil {return _e .Wrap (_bbeg ,_gffb ,"");};return nil ;};type MorphProcess struct{Operation MorphOperation ;Arguments []int ;};func (_ffcc *byHeight )Swap (i ,j int ){_ffcc .Values [i ],_ffcc .Values [j ]=_ffcc .Values [j ],_ffcc .Values [i ];if _ffcc .Boxes !=nil {_ffcc .Boxes [i ],_ffcc .Boxes [j ]=_ffcc .Boxes [j ],_ffcc .Boxes [i ];};};const _accb =5000;func (_gdec *Bitmaps )selectByIndicator (_abgge *_b .NumSlice )(_beae *Bitmaps ,_gafc error ){const _fcccb ="\u0042i\u0074\u006d\u0061\u0070s\u002e\u0073\u0065\u006c\u0065c\u0074B\u0079I\u006e\u0064\u0069\u0063\u0061\u0074\u006fr";if _gdec ==nil {return nil ,_e .Error (_fcccb ,"\u0027\u0062\u0027 b\u0069\u0074\u006d\u0061\u0070\u0073\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");};if _abgge ==nil {return nil ,_e .Error (_fcccb ,"'\u006e\u0061\u0027\u0020\u0069\u006ed\u0069\u0063\u0061\u0074\u006f\u0072\u0073\u0020\u006eo\u0074\u0020\u0064e\u0066i\u006e\u0065\u0064");};if len (_gdec .Values )==0{return _gdec ,nil ;};if len (*_abgge )!=len (_gdec .Values ){return nil ,_e .Errorf (_fcccb ,"\u006ea\u0020\u006ce\u006e\u0067\u0074\u0068:\u0020\u0025\u0064,\u0020\u0069\u0073\u0020\u0064\u0069\u0066\u0066\u0065re\u006e\u0074\u0020t\u0068\u0061n\u0020\u0062\u0069\u0074\u006d\u0061p\u0073\u003a \u0025\u0064",len (*_abgge ),len (_gdec .Values ));};var _babe ,_ddcb ,_dgffe int ;for _ddcb =0;_ddcb < len (*_abgge );_ddcb ++{if _babe ,_gafc =_abgge .GetInt (_ddcb );_gafc !=nil {return nil ,_e .Wrap (_gafc ,_fcccb ,"f\u0069\u0072\u0073\u0074\u0020\u0063\u0068\u0065\u0063\u006b");};if _babe ==1{_dgffe ++;};};if _dgffe ==len (_gdec .Values ){return _gdec ,nil ;};_beae =&Bitmaps {};_facag :=len (_gdec .Values )==len (_gdec .Boxes );for _ddcb =0;_ddcb < len (*_abgge );_ddcb ++{if _babe =int ((*_abgge )[_ddcb ]);_babe ==0{continue ;};_beae .Values =append (_beae .Values ,_gdec .Values [_ddcb ]);if _facag {_beae .Boxes =append (_beae .Boxes ,_gdec .Boxes [_ddcb ]);};};return _beae ,nil ;};func (_fagg *Bitmaps )GetBox (i int )(*_ab .Rectangle ,error ){const _fecge ="\u0047\u0065\u0074\u0042\u006f\u0078";if _fagg ==nil {return nil ,_e .Error (_fecge ,"\u0070\u0072\u006f\u0076id\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0027\u0042\u0069\u0074\u006d\u0061\u0070s\u0027");};if i > len (_fagg .Boxes )-1{return nil ,_e .Errorf (_fecge ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );};return _fagg .Boxes [i ],nil ;};func _cegcb (_fba ,_cdaa int )int {if _fba < _cdaa {return _fba ;};return _cdaa ;};func _fdeac (_afcc ,_ageec *Bitmap ,_eegc *Selection )(*Bitmap ,error ){const _dea ="\u006f\u0070\u0065\u006e";var _eebd error ;_afcc ,_eebd =_deb (_afcc ,_ageec ,_eegc );if _eebd !=nil {return nil ,_e .Wrap (_eebd ,_dea ,"");};_efdf ,_eebd :=_gccg (nil ,_ageec ,_eegc );if _eebd !=nil {return nil ,_e .Wrap (_eebd ,_dea ,"");};_ ,_eebd =_ebda (_afcc ,_efdf ,_eegc );if _eebd !=nil {return nil ,_e .Wrap (_eebd ,_dea ,"");};return _afcc ,nil ;};func _bbg (_gdf ,_cad *Bitmap )(_ebc error ){const _cf ="\u0065\u0078\u0070\u0061nd\u0042\u0069\u006e\u0061\u0072\u0079\u0046\u0061\u0063\u0074\u006f\u0072\u0038";_gb :=_cad .RowStride ;_dfc :=_gdf .RowStride ;var _edg ,_cd ,_gad ,_cfa ,_ced int ;for _gad =0;_gad < _cad .Height ;_gad ++{_edg =_gad *_gb ;_cd =8*_gad *_dfc ;for _cfa =0;_cfa < _gb ;_cfa ++{if _ebc =_gdf .setEightBytes (_cd +_cfa *8,_dbdf [_cad .Data [_edg +_cfa ]]);_ebc !=nil {return _e .Wrap (_ebc ,_cf ,"");};};for _ced =1;_ced < 8;_ced ++{for _cfa =0;_cfa < _dfc ;_cfa ++{if _ebc =_gdf .SetByte (_cd +_ced *_dfc +_cfa ,_gdf .Data [_cd +_cfa ]);_ebc !=nil {return _e .Wrap (_ebc ,_cf ,"");};};};};return nil ;};func _bcgb (_cbaa ,_dbff ,_fgd *Bitmap )(*Bitmap ,error ){const _ebbf ="\u0073\u0075\u0062\u0074\u0072\u0061\u0063\u0074";if _dbff ==nil {return nil ,_e .Error (_ebbf ,"'\u0073\u0031\u0027\u0020\u0069\u0073\u0020\u006e\u0069\u006c");};if _fgd ==nil {return nil ,_e .Error (_ebbf ,"'\u0073\u0032\u0027\u0020\u0069\u0073\u0020\u006e\u0069\u006c");};var _efda error ;switch {case _cbaa ==_dbff :if _efda =_cbaa .RasterOperation (0,0,_dbff .Width ,_dbff .Height ,PixNotSrcAndDst ,_fgd ,0,0);_efda !=nil {return nil ,_e .Wrap (_efda ,_ebbf ,"\u0064 \u003d\u003d\u0020\u0073\u0031");};case _cbaa ==_fgd :if _efda =_cbaa .RasterOperation (0,0,_dbff .Width ,_dbff .Height ,PixNotSrcAndDst ,_dbff ,0,0);_efda !=nil {return nil ,_e .Wrap (_efda ,_ebbf ,"\u0064 \u003d\u003d\u0020\u0073\u0032");};default:_cbaa ,_efda =_acfb (_cbaa ,_dbff );if _efda !=nil {return nil ,_e .Wrap (_efda ,_ebbf ,"");};if _efda =_cbaa .RasterOperation (0,0,_dbff .Width ,_dbff .Height ,PixNotSrcAndDst ,_fgd ,0,0);_efda !=nil {return nil ,_e .Wrap (_efda ,_ebbf ,"\u0064e\u0066\u0061\u0075\u006c\u0074");};};return _cbaa ,nil ;};const (MopDilation MorphOperation =iota ;MopErosion ;MopOpening ;MopClosing ;MopRankBinaryReduction ;MopReplicativeBinaryExpansion ;MopAddBorder ;);func CorrelationScoreThresholded (bm1 ,bm2 *Bitmap ,area1 ,area2 int ,delX ,delY float32 ,maxDiffW ,maxDiffH int ,tab ,downcount []int ,scoreThreshold float32 )(bool ,error ){const _ebbfa ="C\u006f\u0072\u0072\u0065\u006c\u0061t\u0069\u006f\u006e\u0053\u0063\u006f\u0072\u0065\u0054h\u0072\u0065\u0073h\u006fl\u0064\u0065\u0064";if bm1 ==nil {return false ,_e .Error (_ebbfa ,"\u0063\u006f\u0072\u0072\u0065\u006c\u0061\u0074\u0069\u006f\u006e\u0053\u0063\u006f\u0072\u0065\u0054\u0068\u0072\u0065\u0073\u0068\u006f\u006cd\u0065\u0064\u0020\u0062\u006d1\u0020\u0069s\u0020\u006e\u0069\u006c");};if bm2 ==nil {return false ,_e .Error (_ebbfa ,"\u0063\u006f\u0072\u0072\u0065\u006c\u0061\u0074\u0069\u006f\u006e\u0053\u0063\u006f\u0072\u0065\u0054\u0068\u0072\u0065\u0073\u0068\u006f\u006cd\u0065\u0064\u0020\u0062\u006d2\u0020\u0069s\u0020\u006e\u0069\u006c");};if area1 <=0||area2 <=0{return false ,_e .Error (_ebbfa ,"c\u006f\u0072\u0072\u0065\u006c\u0061\u0074\u0069\u006fn\u0053\u0063\u006f\u0072\u0065\u0054\u0068re\u0073\u0068\u006f\u006cd\u0065\u0064\u0020\u002d\u0020\u0061\u0072\u0065\u0061s \u006d\u0075s\u0074\u0020\u0062\u0065\u0020\u003e\u0020\u0030");};if downcount ==nil {return false ,_e .Error (_ebbfa ,"\u0070\u0072\u006fvi\u0064\u0065\u0064\u0020\u006e\u006f\u0020\u0027\u0064\u006f\u0077\u006e\u0063\u006f\u0075\u006e\u0074\u0027");};if tab ==nil {return false ,_e .Error (_ebbfa ,"p\u0072\u006f\u0076\u0069de\u0064 \u006e\u0069\u006c\u0020\u0027s\u0075\u006d\u0074\u0061\u0062\u0027");};_fegeg ,_eegf :=bm1 .Width ,bm1 .Height ;_fdad ,_cdfd :=bm2 .Width ,bm2 .Height ;if _b .Abs (_fegeg -_fdad )> maxDiffW {return false ,nil ;};if _b .Abs (_eegf -_cdfd )> maxDiffH {return false ,nil ;};_cgaf :=int (delX +_b .Sign (delX )*0.5);_daaa :=int (delY +_b .Sign (delY )*0.5);_aabag :=int (_ba .Ceil (_ba .Sqrt (float64 (scoreThreshold )*float64 (area1 )*float64 (area2 ))));_bcee :=bm2 .RowStride ;_agc :=_beeb (_daaa ,0);_ccdd :=_cegcb (_cdfd +_daaa ,_eegf );_cabcb :=bm1 .RowStride *_agc ;_cgfe :=bm2 .RowStride *(_agc -_daaa );var _cecf int ;if _ccdd <=_eegf {_cecf =downcount [_ccdd -1];};_afbg :=_beeb (_cgaf ,0);_ebfd :=_cegcb (_fdad +_cgaf ,_fegeg );var _fbfe ,_fcfd int ;if _cgaf >=8{_fbfe =_cgaf >>3;_cabcb +=_fbfe ;_afbg -=_fbfe <<3;_ebfd -=_fbfe <<3;_cgaf &=7;}else if _cgaf <=-8{_fcfd =-((_cgaf +7)>>3);_cgfe +=_fcfd ;_bcee -=_fcfd ;_cgaf +=_fcfd <<3;};var (_ffced ,_gga ,_fdac int ;_dgdbf ,_affg ,_bgeb byte ;);if _afbg >=_ebfd ||_agc >=_ccdd {return false ,nil ;};_ebdf :=(_ebfd +7)>>3;switch {case _cgaf ==0:for _gga =_agc ;_gga < _ccdd ;_gga ,_cabcb ,_cgfe =_gga +1,_cabcb +bm1 .RowStride ,_cgfe +bm2 .RowStride {for _fdac =0;_fdac < _ebdf ;_fdac ++{_dgdbf =bm1 .Data [_cabcb +_fdac ]&bm2 .Data [_cgfe +_fdac ];_ffced +=tab [_dgdbf ];};if _ffced >=_aabag {return true ,nil ;};if _cdc :=_ffced +downcount [_gga ]-_cecf ;_cdc < _aabag {return false ,nil ;};};case _cgaf > 0&&_bcee < _ebdf :for _gga =_agc ;_gga < _ccdd ;_gga ,_cabcb ,_cgfe =_gga +1,_cabcb +bm1 .RowStride ,_cgfe +bm2 .RowStride {_affg =bm1 .Data [_cabcb ];_bgeb =bm2 .Data [_cgfe ]>>uint (_cgaf );_dgdbf =_affg &_bgeb ;_ffced +=tab [_dgdbf ];for _fdac =1;_fdac < _bcee ;_fdac ++{_affg =bm1 .Data [_cabcb +_fdac ];_bgeb =bm2 .Data [_cgfe +_fdac ]>>uint (_cgaf )|bm2 .Data [_cgfe +_fdac -1]<<uint (8-_cgaf );_dgdbf =_affg &_bgeb ;_ffced +=tab [_dgdbf ];};_affg =bm1 .Data [_cabcb +_fdac ];_bgeb =bm2 .Data [_cgfe +_fdac -1]<<uint (8-_cgaf );_dgdbf =_affg &_bgeb ;_ffced +=tab [_dgdbf ];if _ffced >=_aabag {return true ,nil ;}else if _ffced +downcount [_gga ]-_cecf < _aabag {return false ,nil ;};};case _cgaf > 0&&_bcee >=_ebdf :for _gga =_agc ;_gga < _ccdd ;_gga ,_cabcb ,_cgfe =_gga +1,_cabcb +bm1 .RowStride ,_cgfe +bm2 .RowStride {_affg =bm1 .Data [_cabcb ];_bgeb =bm2 .Data [_cgfe ]>>uint (_cgaf );_dgdbf =_affg &_bgeb ;_ffced +=tab [_dgdbf ];for _fdac =1;_fdac < _ebdf ;_fdac ++{_affg =bm1 .Data [_cabcb +_fdac ];_bgeb =bm2 .Data [_cgfe +_fdac ]>>uint (_cgaf );_bgeb |=bm2 .Data [_cgfe +_fdac -1]<<uint (8-_cgaf );_dgdbf =_affg &_bgeb ;_ffced +=tab [_dgdbf ];};if _ffced >=_aabag {return true ,nil ;}else if _ffced +downcount [_gga ]-_cecf < _aabag {return false ,nil ;};};case _ebdf < _bcee :for _gga =_agc ;_gga < _ccdd ;_gga ,_cabcb ,_cgfe =_gga +1,_cabcb +bm1 .RowStride ,_cgfe +bm2 .RowStride {for _fdac =0;_fdac < _ebdf ;_fdac ++{_affg =bm1 .Data [_cabcb +_fdac ];_bgeb =bm2 .Data [_cgfe +_fdac ]<<uint (-_cgaf );_bgeb |=bm2 .Data [_cgfe +_fdac +1]>>uint (8+_cgaf );_dgdbf =_affg &_bgeb ;_ffced +=tab [_dgdbf ];};if _ffced >=_aabag {return true ,nil ;}else if _egdc :=_ffced +downcount [_gga ]-_cecf ;_egdc < _aabag {return false ,nil ;};};case _bcee >=_ebdf :for _gga =_agc ;_gga < _ccdd ;_gga ,_cabcb ,_cgfe =_gga +1,_cabcb +bm1 .RowStride ,_cgfe +bm2 .RowStride {for _fdac =0;_fdac < _ebdf ;_fdac ++{_affg =bm1 .Data [_cabcb +_fdac ];_bgeb =bm2 .Data [_cgfe +_fdac ]<<uint (-_cgaf );_bgeb |=bm2 .Data [_cgfe +_fdac +1]>>uint (8+_cgaf );_dgdbf =_affg &_bgeb ;_ffced +=tab [_dgdbf ];};_affg =bm1 .Data [_cabcb +_fdac ];_bgeb =bm2 .Data [_cgfe +_fdac ]<<uint (-_cgaf );_dgdbf =_affg &_bgeb ;_ffced +=tab [_dgdbf ];if _ffced >=_aabag {return true ,nil ;}else if _ffced +downcount [_gga ]-_cecf < _aabag {return false ,nil ;};};};_dbde :=float32 (_ffced )*float32 (_ffced )/(float32 (area1 )*float32 (area2 ));if _dbde >=scoreThreshold {_bc .Log .Trace ("\u0063\u006f\u0075\u006e\u0074\u003a\u0020\u0025\u0064\u0020\u003c\u0020\u0074\u0068\u0072\u0065\u0073\u0068\u006f\u006cd\u0020\u0025\u0064\u0020\u0062\u0075\u0074\u0020\u0073c\u006f\u0072\u0065\u0020\u0025\u0066\u0020\u003e\u003d\u0020\u0073\u0063\u006fr\u0065\u0054\u0068\u0072\u0065\u0073h\u006f\u006c\u0064 \u0025\u0066",_ffced ,_aabag ,_dbde ,scoreThreshold );};return false ,nil ;};type LocationFilter int ;func (_cda *Bitmap )thresholdPixelSum (_degf int )bool {var (_fbgc int ;_dedd uint8 ;_bdfg byte ;_eaf int ;);_gbbc :=_cda .RowStride ;_aedf :=uint (_cda .Width &0x07);if _aedf !=0{_dedd =uint8 ((0xff<<(8-_aedf ))&0xff);_gbbc --;};for _efdb :=0;_efdb < _cda .Height ;_efdb ++{for _eaf =0;_eaf < _gbbc ;_eaf ++{_bdfg =_cda .Data [_efdb *_cda .RowStride +_eaf ];_fbgc +=int (_edbg [_bdfg ]);};if _aedf !=0{_bdfg =_cda .Data [_efdb *_cda .RowStride +_eaf ]&_dedd ;_fbgc +=int (_edbg [_bdfg ]);};if _fbgc > _degf {return true ;};};return false ;};func _eb (_gd ,_be *Bitmap )(_baa error ){const _ca ="\u0065\u0078\u0070\u0061nd\u0042\u0069\u006e\u0061\u0072\u0079\u0046\u0061\u0063\u0074\u006f\u0072\u0032";_f :=_be .RowStride ;_ee :=_gd .RowStride ;var (_eca byte ;_ad uint16 ;_ea ,_ef ,_gg ,_ge ,_ga int ;);for _gg =0;_gg < _be .Height ;_gg ++{_ea =_gg *_f ;_ef =2*_gg *_ee ;for _ge =0;_ge < _f ;_ge ++{_eca =_be .Data [_ea +_ge ];_ad =_cef [_eca ];_ga =_ef +_ge *2;if _gd .RowStride !=_be .RowStride *2&&(_ge +1)*2> _gd .RowStride {_baa =_gd .SetByte (_ga ,byte (_ad >>8));}else {_baa =_gd .setTwoBytes (_ga ,_ad );};if _baa !=nil {return _e .Wrap (_baa ,_ca ,"");};};for _ge =0;_ge < _ee ;_ge ++{_ga =_ef +_ee +_ge ;_eca =_gd .Data [_ef +_ge ];if _baa =_gd .SetByte (_ga ,_eca );_baa !=nil {return _e .Wrapf (_baa ,_ca ,"c\u006f\u0070\u0079\u0020\u0064\u006fu\u0062\u006c\u0065\u0064\u0020\u006ci\u006e\u0065\u003a\u0020\u0027\u0025\u0064'\u002c\u0020\u0042\u0079\u0074\u0065\u003a\u0020\u0027\u0025d\u0027",_ef +_ge ,_ef +_ee +_ge );};};};return nil ;};func (_dacb *Bitmap )clipRectangle (_gbgg ,_baf *_ab .Rectangle )(_cfgg *Bitmap ,_ebdb error ){const _befa ="\u0063\u006c\u0069\u0070\u0052\u0065\u0063\u0074\u0061\u006e\u0067\u006c\u0065";if _gbgg ==nil {return nil ,_e .Error (_befa ,"\u0070r\u006fv\u0069\u0064\u0065\u0064\u0020n\u0069\u006c \u0027\u0062\u006f\u0078\u0027");};_adbf ,_gbfg :=_dacb .Width ,_dacb .Height ;_cegc ,_ebdb :=ClipBoxToRectangle (_gbgg ,_adbf ,_gbfg );if _ebdb !=nil {_bc .Log .Warning ("\u0027\u0062ox\u0027\u0020\u0064o\u0065\u0073\u006e\u0027t o\u0076er\u006c\u0061\u0070\u0020\u0062\u0069\u0074ma\u0070\u0020\u0027\u0062\u0027\u003a\u0020%\u0076",_ebdb );return nil ,nil ;};_adgf ,_dbgf :=_cegc .Min .X ,_cegc .Min .Y ;_fcac ,_bedg :=_cegc .Max .X -_cegc .Min .X ,_cegc .Max .Y -_cegc .Min .Y ;_cfgg =New (_fcac ,_bedg );_cfgg .Text =_dacb .Text ;if _ebdb =_cfgg .RasterOperation (0,0,_fcac ,_bedg ,PixSrc ,_dacb ,_adgf ,_dbgf );_ebdb !=nil {return nil ,_e .Wrap (_ebdb ,_befa ,"");};if _baf !=nil {*_baf =*_cegc ;};return _cfgg ,nil ;};func _feg ()(_db [256]uint16 ){for _fd :=0;_fd < 256;_fd ++{if _fd &0x01!=0{_db [_fd ]|=0x3;};if _fd &0x02!=0{_db [_fd ]|=0xc;};if _fd &0x04!=0{_db [_fd ]|=0x30;};if _fd &0x08!=0{_db [_fd ]|=0xc0;};if _fd &0x10!=0{_db [_fd ]|=0x300;};if _fd &0x20!=0{_db [_fd ]|=0xc00;};if _fd &0x40!=0{_db [_fd ]|=0x3000;};if _fd &0x80!=0{_db [_fd ]|=0xc000;};};return _db ;};func NewWithData (width ,height int ,data []byte )(*Bitmap ,error ){const _cc ="N\u0065\u0077\u0057\u0069\u0074\u0068\u0044\u0061\u0074\u0061";_ffd :=_fefb (width ,height );_ffd .Data =data ;if len (data )< height *_ffd .RowStride {return nil ,_e .Errorf (_cc ,"\u0069\u006e\u0076\u0061\u006c\u0069\u0064\u0020\u0064\u0061\u0074\u0061\u0020l\u0065\u006e\u0067\u0074\u0068\u003a \u0025\u0064\u0020\u002d\u0020\u0073\u0068\u006f\u0075\u006c\u0064\u0020\u0062e\u003a\u0020\u0025\u0064",len (data ),height *_ffd .RowStride );};return _ffd ,nil ;};func TstWordBitmap (t *_c .T ,scale ...int )*Bitmap {_edfcf :=1;if len (scale )> 0{_edfcf =scale [0];};_gffbe :=3;_ffgb :=9+7+15+2*_gffbe ;_agg :=5+_gffbe +5;_ddegc :=New (_ffgb *_edfcf ,_agg *_edfcf );_gdbe :=&Bitmaps {};var _geag *int ;_gffbe *=_edfcf ;_cede :=0;_geag =&_cede ;_dace :=0;_cdag :=TstDSymbol (t ,scale ...);TstAddSymbol (t ,_gdbe ,_cdag ,_geag ,_dace ,1*_edfcf );_cdag =TstOSymbol (t ,scale ...);TstAddSymbol (t ,_gdbe ,_cdag ,_geag ,_dace ,_gffbe );_cdag =TstISymbol (t ,scale ...);TstAddSymbol (t ,_gdbe ,_cdag ,_geag ,_dace ,1*_edfcf );_cdag =TstTSymbol (t ,scale ...);TstAddSymbol (t ,_gdbe ,_cdag ,_geag ,_dace ,_gffbe );_cdag =TstNSymbol (t ,scale ...);TstAddSymbol (t ,_gdbe ,_cdag ,_geag ,_dace ,1*_edfcf );_cdag =TstOSymbol (t ,scale ...);TstAddSymbol (t ,_gdbe ,_cdag ,_geag ,_dace ,1*_edfcf );_cdag =TstWSymbol (t ,scale ...);TstAddSymbol (t ,_gdbe ,_cdag ,_geag ,_dace ,0);*_geag =0;_dace =5*_edfcf +_gffbe ;_cdag =TstOSymbol (t ,scale ...);TstAddSymbol (t ,_gdbe ,_cdag ,_geag ,_dace ,1*_edfcf );_cdag =TstRSymbol (t ,scale ...);TstAddSymbol (t ,_gdbe ,_cdag ,_geag ,_dace ,_gffbe );_cdag =TstNSymbol (t ,scale ...);TstAddSymbol (t ,_gdbe ,_cdag ,_geag ,_dace ,1*_edfcf );_cdag =TstESymbol (t ,scale ...);TstAddSymbol (t ,_gdbe ,_cdag ,_geag ,_dace ,1*_edfcf );_cdag =TstVSymbol (t ,scale ...);TstAddSymbol (t ,_gdbe ,_cdag ,_geag ,_dace ,1*_edfcf );_cdag =TstESymbol (t ,scale ...);TstAddSymbol (t ,_gdbe ,_cdag ,_geag ,_dace ,1*_edfcf );_cdag =TstRSymbol (t ,scale ...);TstAddSymbol (t ,_gdbe ,_cdag ,_geag ,_dace ,0);TstWriteSymbols (t ,_gdbe ,_ddegc );return _ddegc ;};func (_fggc *Bitmaps )CountPixels ()*_b .NumSlice {_dcdbb :=&_b .NumSlice {};for _ ,_gded :=range _fggc .Values {_dcdbb .AddInt (_gded .CountPixels ());};return _dcdbb ;};func TstPSymbol (t *_c .T )*Bitmap {t .Helper ();_eebc :=New (5,8);_g .NoError (t ,_eebc .SetPixel (0,0,1));_g .NoError (t ,_eebc .SetPixel (1,0,1));_g .NoError (t ,_eebc .SetPixel (2,0,1));_g .NoError (t ,_eebc .SetPixel (3,0,1));_g .NoError (t ,_eebc .SetPixel (4,1,1));_g .NoError (t ,_eebc .SetPixel (0,1,1));_g .NoError (t ,_eebc .SetPixel (4,2,1));_g .NoError (t ,_eebc .SetPixel (0,2,1));_g .NoError (t ,_eebc .SetPixel (4,3,1));_g .NoError (t ,_eebc .SetPixel (0,3,1));_g .NoError (t ,_eebc .SetPixel (0,4,1));_g .NoError (t ,_eebc .SetPixel (1,4,1));_g .NoError (t ,_eebc .SetPixel (2,4,1));_g .NoError (t ,_eebc .SetPixel (3,4,1));_g .NoError (t ,_eebc .SetPixel (0,5,1));_g .NoError (t ,_eebc .SetPixel (0,6,1));_g .NoError (t ,_eebc .SetPixel (0,7,1));return _eebc ;};type Bitmaps struct{Values []*Bitmap ;Boxes []*_ab .Rectangle ;};func (_fdcd *Selection )findMaxTranslations ()(_ccee ,_gcee ,_fbgf ,_dccg int ){for _gdcef :=0;_gdcef < _fdcd .Height ;_gdcef ++{for _afagb :=0;_afagb < _fdcd .Width ;_afagb ++{if _fdcd .Data [_gdcef ][_afagb ]==SelHit {_ccee =_beeb (_ccee ,_fdcd .Cx -_afagb );_gcee =_beeb (_gcee ,_fdcd .Cy -_gdcef );_fbgf =_beeb (_fbgf ,_afagb -_fdcd .Cx );_dccg =_beeb (_dccg ,_gdcef -_fdcd .Cy );};};};return _ccee ,_gcee ,_fbgf ,_dccg ;};func _egdcb (_bfff *Bitmap ,_ebfgf ,_fdffe int ,_dabdg ,_ebba int ,_fggd RasterOperator ,_cbda *Bitmap ,_adea ,_bbfb int )error {var _gfcfe ,_dbdc ,_fdfe ,_ggcff int ;if _ebfgf < 0{_adea -=_ebfgf ;_dabdg +=_ebfgf ;_ebfgf =0;};if _adea < 0{_ebfgf -=_adea ;_dabdg +=_adea ;_adea =0;};_gfcfe =_ebfgf +_dabdg -_bfff .Width ;if _gfcfe > 0{_dabdg -=_gfcfe ;};_dbdc =_adea +_dabdg -_cbda .Width ;if _dbdc > 0{_dabdg -=_dbdc ;};if _fdffe < 0{_bbfb -=_fdffe ;_ebba +=_fdffe ;_fdffe =0;};if _bbfb < 0{_fdffe -=_bbfb ;_ebba +=_bbfb ;_bbfb =0;};_fdfe =_fdffe +_ebba -_bfff .Height ;if _fdfe > 0{_ebba -=_fdfe ;};_ggcff =_bbfb +_ebba -_cbda .Height ;if _ggcff > 0{_ebba -=_ggcff ;};if _dabdg <=0||_ebba <=0{return nil ;};var _cddg error ;switch {case _ebfgf &7==0&&_adea &7==0:_cddg =_gcge (_bfff ,_ebfgf ,_fdffe ,_dabdg ,_ebba ,_fggd ,_cbda ,_adea ,_bbfb );case _ebfgf &7==_adea &7:_cddg =_fbed (_bfff ,_ebfgf ,_fdffe ,_dabdg ,_ebba ,_fggd ,_cbda ,_adea ,_bbfb );default:_cddg =_bfdeg (_bfff ,_ebfgf ,_fdffe ,_dabdg ,_ebba ,_fggd ,_cbda ,_adea ,_bbfb );};if _cddg !=nil {return _e .Wrap (_cddg ,"r\u0061\u0073\u0074\u0065\u0072\u004f\u0070\u004c\u006f\u0077","");};return nil ;};func (_afag *ClassedPoints )GroupByY ()([]*ClassedPoints ,error ){const _dbgb ="\u0043\u006c\u0061\u0073se\u0064\u0050\u006f\u0069\u006e\u0074\u0073\u002e\u0047\u0072\u006f\u0075\u0070\u0042y\u0059";if _bbca :=_afag .validateIntSlice ();_bbca !=nil {return nil ,_e .Wrap (_bbca ,_dbgb ,"");};if _afag .IntSlice .Size ()==0{return nil ,_e .Error (_dbgb ,"\u004e\u006f\u0020\u0063la\u0073\u0073\u0065\u0073\u0020\u0070\u0072\u006f\u0076\u0069\u0064\u0065\u0064");};_afag .SortByY ();var (_dgfe []*ClassedPoints ;_aef int ;);_aabab :=-1;var _bggf *ClassedPoints ;for _bccefb :=0;_bccefb < len (_afag .IntSlice );_bccefb ++{_aef =int (_afag .YAtIndex (_bccefb ));if _aef !=_aabab {_bggf =&ClassedPoints {Points :_afag .Points };_aabab =_aef ;_dgfe =append (_dgfe ,_bggf );};_bggf .IntSlice =append (_bggf .IntSlice ,_afag .IntSlice [_bccefb ]);};for _ ,_gfbd :=range _dgfe {_gfbd .SortByX ();};return _dgfe ,nil ;};func _cfbc (_eedc ,_ecfc *Bitmap ,_adfbd ,_ebga int )(*Bitmap ,error ){const _eeec ="\u0063\u006c\u006f\u0073\u0065\u0042\u0072\u0069\u0063\u006b";if _ecfc ==nil {return nil ,_e .Error (_eeec ,"\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");};if _adfbd < 1||_ebga < 1{return nil ,_e .Error (_eeec ,"\u0068S\u0069\u007a\u0065\u0020\u0061\u006e\u0064\u0020\u0076\u0053\u0069z\u0065\u0020\u006e\u006f\u0074\u0020\u003e\u003d\u0020\u0031");};if _adfbd ==1&&_ebga ==1{return _ecfc .Copy (),nil ;};if _adfbd ==1||_ebga ==1{_aabe :=SelCreateBrick (_ebga ,_adfbd ,_ebga /2,_adfbd /2,SelHit );var _aafe error ;_eedc ,_aafe =_ddba (_eedc ,_ecfc ,_aabe );if _aafe !=nil {return nil ,_e .Wrap (_aafe ,_eeec ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u007c\u007c \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");};return _eedc ,nil ;};_gadfg :=SelCreateBrick (1,_adfbd ,0,_adfbd /2,SelHit );_deca :=SelCreateBrick (_ebga ,1,_ebga /2,0,SelHit );_eeaga ,_fedfb :=_ebda (nil ,_ecfc ,_gadfg );if _fedfb !=nil {return nil ,_e .Wrap (_fedfb ,_eeec ,"\u0031\u0073\u0074\u0020\u0064\u0069\u006c\u0061\u0074\u0065");};if _eedc ,_fedfb =_ebda (_eedc ,_eeaga ,_deca );_fedfb !=nil {return nil ,_e .Wrap (_fedfb ,_eeec ,"\u0032\u006e\u0064\u0020\u0064\u0069\u006c\u0061\u0074\u0065");};if _ ,_fedfb =_gccg (_eeaga ,_eedc ,_gadfg );_fedfb !=nil {return nil ,_e .Wrap (_fedfb ,_eeec ,"\u0031s\u0074\u0020\u0065\u0072\u006f\u0064e");};if _ ,_fedfb =_gccg (_eedc ,_eeaga ,_deca );_fedfb !=nil {return nil ,_e .Wrap (_fedfb ,_eeec ,"\u0032n\u0064\u0020\u0065\u0072\u006f\u0064e");};return _eedc ,nil ;};func (_abfg *Bitmap )nextOnPixelLow (_cfgf ,_aaf ,_egg ,_bce ,_faca int )(_afbc _ab .Point ,_aea bool ,_ebcb error ){const _befe ="B\u0069\u0074\u006d\u0061p.\u006ee\u0078\u0074\u004f\u006e\u0050i\u0078\u0065\u006c\u004c\u006f\u0077";var (_edcd int ;_dee byte ;);_gbfd :=_faca *_egg ;_gaef :=_gbfd +(_bce /8);if _dee ,_ebcb =_abfg .GetByte (_gaef );_ebcb !=nil {return _afbc ,false ,_e .Wrap (_ebcb ,_befe ,"\u0078\u0053\u0074\u0061\u0072\u0074\u0020\u0061\u006e\u0064 \u0079\u0053\u0074\u0061\u0072\u0074\u0020o\u0075\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065");};if _dee !=0{_gbdg :=_bce -(_bce %8)+7;for _edcd =_bce ;_edcd <=_gbdg &&_edcd < _cfgf ;_edcd ++{if _abfg .GetPixel (_edcd ,_faca ){_afbc .X =_edcd ;_afbc .Y =_faca ;return _afbc ,true ,nil ;};};};_bfabb :=(_bce /8)+1;_edcd =8*_bfabb ;var _daaf int ;for _gaef =_gbfd +_bfabb ;_edcd < _cfgf ;_gaef ,_edcd =_gaef +1,_edcd +8{if _dee ,_ebcb =_abfg .GetByte (_gaef );_ebcb !=nil {return _afbc ,false ,_e .Wrap (_ebcb ,_befe ,"r\u0065\u0073\u0074\u0020of\u0020t\u0068\u0065\u0020\u006c\u0069n\u0065\u0020\u0062\u0079\u0074\u0065");};if _dee ==0{continue ;};for _daaf =0;_daaf < 8&&_edcd < _cfgf ;_daaf ,_edcd =_daaf +1,_edcd +1{if _abfg .GetPixel (_edcd ,_faca ){_afbc .X =_edcd ;_afbc .Y =_faca ;return _afbc ,true ,nil ;};};};for _daee :=_faca +1;_daee < _aaf ;_daee ++{_gbfd =_daee *_egg ;for _gaef ,_edcd =_gbfd ,0;_edcd < _cfgf ;_gaef ,_edcd =_gaef +1,_edcd +8{if _dee ,_ebcb =_abfg .GetByte (_gaef );_ebcb !=nil {return _afbc ,false ,_e .Wrap (_ebcb ,_befe ,"\u0066o\u006cl\u006f\u0077\u0069\u006e\u0067\u0020\u006c\u0069\u006e\u0065\u0073");};if _dee ==0{continue ;};for _daaf =0;_daaf < 8&&_edcd < _cfgf ;_daaf ,_edcd =_daaf +1,_edcd +1{if _abfg .GetPixel (_edcd ,_daee ){_afbc .X =_edcd ;_afbc .Y =_daee ;return _afbc ,true ,nil ;};};};};return _afbc ,false ,nil ;};func _faa ()(_gee [256]uint64 ){for _gcg :=0;_gcg < 256;_gcg ++{if _gcg &0x01!=0{_gee [_gcg ]|=0xff;};if _gcg &0x02!=0{_gee [_gcg ]|=0xff00;};if _gcg &0x04!=0{_gee [_gcg ]|=0xff0000;};if _gcg &0x08!=0{_gee [_gcg ]|=0xff000000;};if _gcg &0x10!=0{_gee [_gcg ]|=0xff00000000;};if _gcg &0x20!=0{_gee [_gcg ]|=0xff0000000000;};if _gcg &0x40!=0{_gee [_gcg ]|=0xff000000000000;};if _gcg &0x80!=0{_gee [_gcg ]|=0xff00000000000000;};};return _gee ;};func _ffc (_cfg ,_fegc *Bitmap ,_cag int ,_abf []byte ,_agb int )(_agd error ){const _gef ="\u0072\u0065\u0064uc\u0065\u0052\u0061\u006e\u006b\u0042\u0069\u006e\u0061\u0072\u0079\u0032\u004c\u0065\u0076\u0065\u006c\u0032";var (_gec ,_dde ,_ecee ,_bdc ,_cgf ,_af ,_caf ,_bcd int ;_egb ,_agdg ,_ddea ,_bde uint32 ;_ecgd ,_dbg byte ;_gdce uint16 ;);_daa :=make ([]byte ,4);_gddc :=make ([]byte ,4);for _ecee =0;_ecee < _cfg .Height -1;_ecee ,_bdc =_ecee +2,_bdc +1{_gec =_ecee *_cfg .RowStride ;_dde =_bdc *_fegc .RowStride ;for _cgf ,_af =0,0;_cgf < _agb ;_cgf ,_af =_cgf +4,_af +1{for _caf =0;_caf < 4;_caf ++{_bcd =_gec +_cgf +_caf ;if _bcd <=len (_cfg .Data )-1&&_bcd < _gec +_cfg .RowStride {_daa [_caf ]=_cfg .Data [_bcd ];}else {_daa [_caf ]=0x00;};_bcd =_gec +_cfg .RowStride +_cgf +_caf ;if _bcd <=len (_cfg .Data )-1&&_bcd < _gec +(2*_cfg .RowStride ){_gddc [_caf ]=_cfg .Data [_bcd ];}else {_gddc [_caf ]=0x00;};};_egb =_d .BigEndian .Uint32 (_daa );_agdg =_d .BigEndian .Uint32 (_gddc );_ddea =_egb &_agdg ;_ddea |=_ddea <<1;_bde =_egb |_agdg ;_bde &=_bde <<1;_agdg =_ddea |_bde ;_agdg &=0xaaaaaaaa;_egb =_agdg |(_agdg <<7);_ecgd =byte (_egb >>24);_dbg =byte ((_egb >>8)&0xff);_bcd =_dde +_af ;if _bcd +1==len (_fegc .Data )-1||_bcd +1>=_dde +_fegc .RowStride {if _agd =_fegc .SetByte (_bcd ,_abf [_ecgd ]);_agd !=nil {return _e .Wrapf (_agd ,_gef ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0025d",_bcd );};}else {_gdce =(uint16 (_abf [_ecgd ])<<8)|uint16 (_abf [_dbg ]);if _agd =_fegc .setTwoBytes (_bcd ,_gdce );_agd !=nil {return _e .Wrapf (_agd ,_gef ,"s\u0065\u0074\u0074\u0069\u006e\u0067 \u0074\u0077\u006f\u0020\u0062\u0079t\u0065\u0073\u0020\u0066\u0061\u0069\u006ce\u0064\u002c\u0020\u0069\u006e\u0064\u0065\u0078\u003a\u0020%\u0064",_bcd );};_af ++;};};};return nil ;};func _cdga (_abga ,_gbc *Bitmap ,_bgf ,_fbcb ,_gabe uint ,_fdgab ,_fdd int ,_caga bool ,_fbbf ,_fecg int )error {for _fcbgb :=_fdgab ;_fcbgb < _fdd ;_fcbgb ++{if _fbbf +1< len (_abga .Data ){_ebfad :=_fcbgb +1==_fdd ;_ccd ,_abe :=_abga .GetByte (_fbbf );if _abe !=nil {return _abe ;};_fbbf ++;_ccd <<=_bgf ;_eeg ,_abe :=_abga .GetByte (_fbbf );if _abe !=nil {return _abe ;};_eeg >>=_fbcb ;_aba :=_ccd |_eeg ;if _ebfad &&!_caga {_aba =_efe (_gabe ,_aba );};_abe =_gbc .SetByte (_fecg ,_aba );if _abe !=nil {return _abe ;};_fecg ++;if _ebfad &&_caga {_ecbb ,_adfc :=_abga .GetByte (_fbbf );if _adfc !=nil {return _adfc ;};_ecbb <<=_bgf ;_aba =_efe (_gabe ,_ecbb );if _adfc =_gbc .SetByte (_fecg ,_aba );_adfc !=nil {return _adfc ;};};continue ;};_ccgf ,_ecd :=_abga .GetByte (_fbbf );if _ecd !=nil {_bc .Log .Debug ("G\u0065\u0074\u0074\u0069\u006e\u0067 \u0074\u0068\u0065\u0020\u0076\u0061l\u0075\u0065\u0020\u0061\u0074\u003a\u0020%\u0064\u0020\u0066\u0061\u0069\u006c\u0065\u0064\u003a\u0020%\u0073",_fbbf ,_ecd );return _ecd ;};_ccgf <<=_bgf ;_fbbf ++;_ecd =_gbc .SetByte (_fecg ,_ccgf );if _ecd !=nil {return _ecd ;};_fecg ++;};return nil ;};func NewClassedPoints (points *Points ,classes _b .IntSlice )(*ClassedPoints ,error ){const _gcce ="\u004e\u0065w\u0043\u006c\u0061s\u0073\u0065\u0064\u0050\u006f\u0069\u006e\u0074\u0073";if points ==nil {return nil ,_e .Error (_gcce ,"\u0070\u0072\u006f\u0076id\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0070\u006f\u0069\u006e\u0074\u0073");};if classes ==nil {return nil ,_e .Error (_gcce ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0063\u006c\u0061ss\u0065\u0073");};_fgdg :=&ClassedPoints {Points :points ,IntSlice :classes };if _dfad :=_fgdg .validateIntSlice ();_dfad !=nil {return nil ,_e .Wrap (_dfad ,_gcce ,"");};return _fgdg ,nil ;};func (_deaf CombinationOperator )String ()string {var _abce string ;switch _deaf {case CmbOpOr :_abce ="\u004f\u0052";case CmbOpAnd :_abce ="\u0041\u004e\u0044";case CmbOpXor :_abce ="\u0058\u004f\u0052";case CmbOpXNor :_abce ="\u0058\u004e\u004f\u0052";case CmbOpReplace :_abce ="\u0052E\u0050\u004c\u0041\u0043\u0045";case CmbOpNot :_abce ="\u004e\u004f\u0054";};return _abce ;};func TstWriteSymbols (t *_c .T ,bms *Bitmaps ,src *Bitmap ){for _efcdc :=0;_efcdc < bms .Size ();_efcdc ++{_eefge :=bms .Values [_efcdc ];_bcgbe :=bms .Boxes [_efcdc ];_bcaf :=src .RasterOperation (_bcgbe .Min .X ,_bcgbe .Min .Y ,_eefge .Width ,_eefge .Height ,PixSrc ,_eefge ,0,0);_g .NoError (t ,_bcaf );};};func (_bfe *Bitmap )centroid (_bddc ,_faab []int )(Point ,error ){_ddbc :=Point {};_bfe .setPadBits (0);if len (_bddc )==0{_bddc =_dafg ();};if len (_faab )==0{_faab =_accc ();};var _cffe ,_acdad ,_bgafd ,_ffee ,_fcde ,_eaag int ;var _dfeee byte ;for _fcde =0;_fcde < _bfe .Height ;_fcde ++{_adbe :=_bfe .RowStride *_fcde ;_ffee =0;for _eaag =0;_eaag < _bfe .RowStride ;_eaag ++{_dfeee =_bfe .Data [_adbe +_eaag ];if _dfeee !=0{_ffee +=_faab [_dfeee ];_cffe +=_bddc [_dfeee ]+_eaag *8*_faab [_dfeee ];};};_bgafd +=_ffee ;_acdad +=_ffee *_fcde ;};if _bgafd !=0{_ddbc .X =float32 (_cffe )/float32 (_bgafd );_ddbc .Y =float32 (_acdad )/float32 (_bgafd );};return _ddbc ,nil ;};func (_cba *Bitmap )nextOnPixel (_bdcg ,_efaf int )(_dfee _ab .Point ,_adcc bool ,_ddc error ){const _egab ="n\u0065\u0078\u0074\u004f\u006e\u0050\u0069\u0078\u0065\u006c";_dfee ,_adcc ,_ddc =_cba .nextOnPixelLow (_cba .Width ,_cba .Height ,_cba .RowStride ,_bdcg ,_efaf );if _ddc !=nil {return _dfee ,false ,_e .Wrap (_ddc ,_egab ,"");};return _dfee ,_adcc ,nil ;};func (_dffc *Bitmap )SetDefaultPixel (){for _ggdf :=range _dffc .Data {_dffc .Data [_ggdf ]=byte (0xff);};};func (_bage *Bitmap )ConnComponents (bms *Bitmaps ,connectivity int )(_ddef *Boxes ,_fede error ){const _bagd ="B\u0069\u0074\u006d\u0061p.\u0043o\u006e\u006e\u0043\u006f\u006dp\u006f\u006e\u0065\u006e\u0074\u0073";if _bage ==nil {return nil ,_e .Error (_bagd ,"\u0070r\u006f\u0076\u0069\u0064e\u0064\u0020\u0065\u006d\u0070t\u0079 \u0027b\u0027\u0020\u0062\u0069\u0074\u006d\u0061p");};if connectivity !=4&&connectivity !=8{return nil ,_e .Error (_bagd ,"\u0063\u006f\u006ene\u0063\u0074\u0069\u0076\u0069\u0074\u0079\u0020\u006e\u006f\u0074\u0020\u0034\u0020\u006f\u0072\u0020\u0038");};if bms ==nil {if _ddef ,_fede =_bage .connComponentsBB (connectivity );_fede !=nil {return nil ,_e .Wrap (_fede ,_bagd ,"");};}else {if _ddef ,_fede =_bage .connComponentsBitmapsBB (bms ,connectivity );_fede !=nil {return nil ,_e .Wrap (_fede ,_bagd ,"");};};return _ddef ,nil ;};func TstVSymbol (t *_c .T ,scale ...int )*Bitmap {_edaa ,_gcfg :=NewWithData (5,5,[]byte {0x88,0x88,0x88,0x50,0x20});_g .NoError (t ,_gcfg );return TstGetScaledSymbol (t ,_edaa ,scale ...);};func TstImageBitmapData ()[]byte {return _aedgc .Data };func (_dcdg *Bitmap )CountPixels ()int {return _dcdg .countPixels ()};type CombinationOperator int ;func (_faf *Bitmap )CreateTemplate ()*Bitmap {return _faf .createTemplate ()};func (_cfggg *Bitmap )RasterOperation (dx ,dy ,dw ,dh int ,op RasterOperator ,src *Bitmap ,sx ,sy int )error {return _eagc (_cfggg ,dx ,dy ,dw ,dh ,op ,src ,sx ,sy );};func MakePixelSumTab8 ()[]int {return _accc ()};type SizeSelection int ;func (_dfdg *Bitmap )GetChocolateData ()[]byte {if _dfdg .Color ==Vanilla {_dfdg .inverseData ();};return _dfdg .Data ;};type BoundaryCondition int ;func (_fdadg *ClassedPoints )Len ()int {return _fdadg .IntSlice .Size ()};func _fbed (_cabdd *Bitmap ,_bfga ,_bcfd ,_gfad ,_fdgb int ,_dcge RasterOperator ,_gccb *Bitmap ,_dbdb ,_febc int )error {var (_gfcfed bool ;_dfda bool ;_bfeb int ;_bdfd int ;_ddgc int ;_bggfc bool ;_cbga byte ;_ffge int ;_eefg int ;_bbbf int ;_dccf ,_bbea int ;);_gcddb :=8-(_bfga &7);_acbd :=_ggagc [_gcddb ];_ddead :=_cabdd .RowStride *_bcfd +(_bfga >>3);_fdda :=_gccb .RowStride *_febc +(_dbdb >>3);if _gfad < _gcddb {_gfcfed =true ;_acbd &=_agbg [8-_gcddb +_gfad ];};if !_gfcfed {_bfeb =(_gfad -_gcddb )>>3;if _bfeb > 0{_dfda =true ;_bdfd =_ddead +1;_ddgc =_fdda +1;};};_ffge =(_bfga +_gfad )&7;if !(_gfcfed ||_ffge ==0){_bggfc =true ;_cbga =_agbg [_ffge ];_eefg =_ddead +1+_bfeb ;_bbbf =_fdda +1+_bfeb ;};switch _dcge {case PixSrc :for _dccf =0;_dccf < _fdgb ;_dccf ++{_cabdd .Data [_ddead ]=_gaeca (_cabdd .Data [_ddead ],_gccb .Data [_fdda ],_acbd );_ddead +=_cabdd .RowStride ;_fdda +=_gccb .RowStride ;};if _dfda {for _dccf =0;_dccf < _fdgb ;_dccf ++{for _bbea =0;_bbea < _bfeb ;_bbea ++{_cabdd .Data [_bdfd +_bbea ]=_gccb .Data [_ddgc +_bbea ];};_bdfd +=_cabdd .RowStride ;_ddgc +=_gccb .RowStride ;};};if _bggfc {for _dccf =0;_dccf < _fdgb ;_dccf ++{_cabdd .Data [_eefg ]=_gaeca (_cabdd .Data [_eefg ],_gccb .Data [_bbbf ],_cbga );_eefg +=_cabdd .RowStride ;_bbbf +=_gccb .RowStride ;};};case PixNotSrc :for _dccf =0;_dccf < _fdgb ;_dccf ++{_cabdd .Data [_ddead ]=_gaeca (_cabdd .Data [_ddead ],^_gccb .Data [_fdda ],_acbd );_ddead +=_cabdd .RowStride ;_fdda +=_gccb .RowStride ;};if _dfda {for _dccf =0;_dccf < _fdgb ;_dccf ++{for _bbea =0;_bbea < _bfeb ;_bbea ++{_cabdd .Data [_bdfd +_bbea ]=^_gccb .Data [_ddgc +_bbea ];};_bdfd +=_cabdd .RowStride ;_ddgc +=_gccb .RowStride ;};};if _bggfc {for _dccf =0;_dccf < _fdgb ;_dccf ++{_cabdd .Data [_eefg ]=_gaeca (_cabdd .Data [_eefg ],^_gccb .Data [_bbbf ],_cbga );_eefg +=_cabdd .RowStride ;_bbbf +=_gccb .RowStride ;};};case PixSrcOrDst :for _dccf =0;_dccf < _fdgb ;_dccf ++{_cabdd .Data [_ddead ]=_gaeca (_cabdd .Data [_ddead ],_gccb .Data [_fdda ]|_cabdd .Data [_ddead ],_acbd );_ddead +=_cabdd .RowStride ;_fdda +=_gccb .RowStride ;};if _dfda {for _dccf =0;_dccf < _fdgb ;_dccf ++{for _bbea =0;_bbea < _bfeb ;_bbea ++{_cabdd .Data [_bdfd +_bbea ]|=_gccb .Data [_ddgc +_bbea ];};_bdfd +=_cabdd .RowStride ;_ddgc +=_gccb .RowStride ;};};if _bggfc {for _dccf =0;_dccf < _fdgb ;_dccf ++{_cabdd .Data [_eefg ]=_gaeca (_cabdd .Data [_eefg ],_gccb .Data [_bbbf ]|_cabdd .Data [_eefg ],_cbga );_eefg +=_cabdd .RowStride ;_bbbf +=_gccb .RowStride ;};};case PixSrcAndDst :for _dccf =0;_dccf < _fdgb ;_dccf ++{_cabdd .Data [_ddead ]=_gaeca (_cabdd .Data [_ddead ],_gccb .Data [_fdda ]&_cabdd .Data [_ddead ],_acbd );_ddead +=_cabdd .RowStride ;_fdda +=_gccb .RowStride ;};if _dfda {for _dccf =0;_dccf < _fdgb ;_dccf ++{for _bbea =0;_bbea < _bfeb ;_bbea ++{_cabdd .Data [_bdfd +_bbea ]&=_gccb .Data [_ddgc +_bbea ];};_bdfd +=_cabdd .RowStride ;_ddgc +=_gccb .RowStride ;};};if _bggfc {for _dccf =0;_dccf < _fdgb ;_dccf ++{_cabdd .Data [_eefg ]=_gaeca (_cabdd .Data [_eefg ],_gccb .Data [_bbbf ]&_cabdd .Data [_eefg ],_cbga );_eefg +=_cabdd .RowStride ;_bbbf +=_gccb .RowStride ;};};case PixSrcXorDst :for _dccf =0;_dccf < _fdgb ;_dccf ++{_cabdd .Data [_ddead ]=_gaeca (_cabdd .Data [_ddead ],_gccb .Data [_fdda ]^_cabdd .Data [_ddead ],_acbd );_ddead +=_cabdd .RowStride ;_fdda +=_gccb .RowStride ;};if _dfda {for _dccf =0;_dccf < _fdgb ;_dccf ++{for _bbea =0;_bbea < _bfeb ;_bbea ++{_cabdd .Data [_bdfd +_bbea ]^=_gccb .Data [_ddgc +_bbea ];};_bdfd +=_cabdd .RowStride ;_ddgc +=_gccb .RowStride ;};};if _bggfc {for _dccf =0;_dccf < _fdgb ;_dccf ++{_cabdd .Data [_eefg ]=_gaeca (_cabdd .Data [_eefg ],_gccb .Data [_bbbf ]^_cabdd .Data [_eefg ],_cbga );_eefg +=_cabdd .RowStride ;_bbbf +=_gccb .RowStride ;};};case PixNotSrcOrDst :for _dccf =0;_dccf < _fdgb ;_dccf ++{_cabdd .Data [_ddead ]=_gaeca (_cabdd .Data [_ddead ],^(_gccb .Data [_fdda ])|_cabdd .Data [_ddead ],_acbd );_ddead +=_cabdd .RowStride ;_fdda +=_gccb .RowStride ;};if _dfda {for _dccf =0;_dccf < _fdgb ;_dccf ++{for _bbea =0;_bbea < _bfeb ;_bbea ++{_cabdd .Data [_bdfd +_bbea ]|=^(_gccb .Data [_ddgc +_bbea ]);};_bdfd +=_cabdd .RowStride ;_ddgc +=_gccb .RowStride ;};};if _bggfc {for _dccf =0;_dccf < _fdgb ;_dccf ++{_cabdd .Data [_eefg ]=_gaeca (_cabdd .Data [_eefg ],^(_gccb .Data [_bbbf ])|_cabdd .Data [_eefg ],_cbga );_eefg +=_cabdd .RowStride ;_bbbf +=_gccb .RowStride ;};};case PixNotSrcAndDst :for _dccf =0;_dccf < _fdgb ;_dccf ++{_cabdd .Data [_ddead ]=_gaeca (_cabdd .Data [_ddead ],^(_gccb .Data [_fdda ])&_cabdd .Data [_ddead ],_acbd );_ddead +=_cabdd .RowStride ;_fdda +=_gccb .RowStride ;};if _dfda {for _dccf =0;_dccf < _fdgb ;_dccf ++{for _bbea =0;_bbea < _bfeb ;_bbea ++{_cabdd .Data [_bdfd +_bbea ]&=^_gccb .Data [_ddgc +_bbea ];};_bdfd +=_cabdd .RowStride ;_ddgc +=_gccb .RowStride ;};};if _bggfc {for _dccf =0;_dccf < _fdgb ;_dccf ++{_cabdd .Data [_eefg ]=_gaeca (_cabdd .Data [_eefg ],^(_gccb .Data [_bbbf ])&_cabdd .Data [_eefg ],_cbga );_eefg +=_cabdd .RowStride ;_bbbf +=_gccb .RowStride ;};};case PixSrcOrNotDst :for _dccf =0;_dccf < _fdgb ;_dccf ++{_cabdd .Data [_ddead ]=_gaeca (_cabdd .Data [_ddead ],_gccb .Data [_fdda ]|^(_cabdd .Data [_ddead ]),_acbd );_ddead +=_cabdd .RowStride ;_fdda +=_gccb .RowStride ;};if _dfda {for _dccf =0;_dccf < _fdgb ;_dccf ++{for _bbea =0;_bbea < _bfeb ;_bbea ++{_cabdd .Data [_bdfd +_bbea ]=_gccb .Data [_ddgc +_bbea ]|^(_cabdd .Data [_bdfd +_bbea ]);};_bdfd +=_cabdd .RowStride ;_ddgc +=_gccb .RowStride ;};};if _bggfc {for _dccf =0;_dccf < _fdgb ;_dccf ++{_cabdd .Data [_eefg ]=_gaeca (_cabdd .Data [_eefg ],_gccb .Data [_bbbf ]|^(_cabdd .Data [_eefg ]),_cbga );_eefg +=_cabdd .RowStride ;_bbbf +=_gccb .RowStride ;};};case PixSrcAndNotDst :for _dccf =0;_dccf < _fdgb ;_dccf ++{_cabdd .Data [_ddead ]=_gaeca (_cabdd .Data [_ddead ],_gccb .Data [_fdda ]&^(_cabdd .Data [_ddead ]),_acbd );_ddead +=_cabdd .RowStride ;_fdda +=_gccb .RowStride ;};if _dfda {for _dccf =0;_dccf < _fdgb ;_dccf ++{for _bbea =0;_bbea < _bfeb ;_bbea ++{_cabdd .Data [_bdfd +_bbea ]=_gccb .Data [_ddgc +_bbea ]&^(_cabdd .Data [_bdfd +_bbea ]);};_bdfd +=_cabdd .RowStride ;_ddgc +=_gccb .RowStride ;};};if _bggfc {for _dccf =0;_dccf < _fdgb ;_dccf ++{_cabdd .Data [_eefg ]=_gaeca (_cabdd .Data [_eefg ],_gccb .Data [_bbbf ]&^(_cabdd .Data [_eefg ]),_cbga );_eefg +=_cabdd .RowStride ;_bbbf +=_gccb .RowStride ;};};case PixNotPixSrcOrDst :for _dccf =0;_dccf < _fdgb ;_dccf ++{_cabdd .Data [_ddead ]=_gaeca (_cabdd .Data [_ddead ],^(_gccb .Data [_fdda ]|_cabdd .Data [_ddead ]),_acbd );_ddead +=_cabdd .RowStride ;_fdda +=_gccb .RowStride ;};if _dfda {for _dccf =0;_dccf < _fdgb ;_dccf ++{for _bbea =0;_bbea < _bfeb ;_bbea ++{_cabdd .Data [_bdfd +_bbea ]=^(_gccb .Data [_ddgc +_bbea ]|_cabdd .Data [_bdfd +_bbea ]);};_bdfd +=_cabdd .RowStride ;_ddgc +=_gccb .RowStride ;};};if _bggfc {for _dccf =0;_dccf < _fdgb ;_dccf ++{_cabdd .Data [_eefg ]=_gaeca (_cabdd .Data [_eefg ],^(_gccb .Data [_bbbf ]|_cabdd .Data [_eefg ]),_cbga );_eefg +=_cabdd .RowStride ;_bbbf +=_gccb .RowStride ;};};case PixNotPixSrcAndDst :for _dccf =0;_dccf < _fdgb ;_dccf ++{_cabdd .Data [_ddead ]=_gaeca (_cabdd .Data [_ddead ],^(_gccb .Data [_fdda ]&_cabdd .Data [_ddead ]),_acbd );_ddead +=_cabdd .RowStride ;_fdda +=_gccb .RowStride ;};if _dfda {for _dccf =0;_dccf < _fdgb ;_dccf ++{for _bbea =0;_bbea < _bfeb ;_bbea ++{_cabdd .Data [_bdfd +_bbea ]=^(_gccb .Data [_ddgc +_bbea ]&_cabdd .Data [_bdfd +_bbea ]);};_bdfd +=_cabdd .RowStride ;_ddgc +=_gccb .RowStride ;};};if _bggfc {for _dccf =0;_dccf < _fdgb ;_dccf ++{_cabdd .Data [_eefg ]=_gaeca (_cabdd .Data [_eefg ],^(_gccb .Data [_bbbf ]&_cabdd .Data [_eefg ]),_cbga );_eefg +=_cabdd .RowStride ;_bbbf +=_gccb .RowStride ;};};case PixNotPixSrcXorDst :for _dccf =0;_dccf < _fdgb ;_dccf ++{_cabdd .Data [_ddead ]=_gaeca (_cabdd .Data [_ddead ],^(_gccb .Data [_fdda ]^_cabdd .Data [_ddead ]),_acbd );_ddead +=_cabdd .RowStride ;_fdda +=_gccb .RowStride ;};if _dfda {for _dccf =0;_dccf < _fdgb ;_dccf ++{for _bbea =0;_bbea < _bfeb ;_bbea ++{_cabdd .Data [_bdfd +_bbea ]=^(_gccb .Data [_ddgc +_bbea ]^_cabdd .Data [_bdfd +_bbea ]);};_bdfd +=_cabdd .RowStride ;_ddgc +=_gccb .RowStride ;};};if _bggfc {for _dccf =0;_dccf < _fdgb ;_dccf ++{_cabdd .Data [_eefg ]=_gaeca (_cabdd .Data [_eefg ],^(_gccb .Data [_bbbf ]^_cabdd .Data [_eefg ]),_cbga );_eefg +=_cabdd .RowStride ;_bbbf +=_gccb .RowStride ;};};default:_bc .Log .Debug ("I\u006e\u0076\u0061\u006c\u0069\u0064 \u0072\u0061\u0073\u0074\u0065\u0072\u0020\u006f\u0070e\u0072\u0061\u0074o\u0072:\u0020\u0025\u0064",_dcge );return _e .Error ("\u0072\u0061\u0073\u0074er\u004f\u0070\u0056\u0041\u006c\u0069\u0067\u006e\u0065\u0064\u004c\u006f\u0077","\u0069\u006e\u0076al\u0069\u0064\u0020\u0072\u0061\u0073\u0074\u0065\u0072\u0020\u006f\u0070\u0065\u0072\u0061\u0074\u006f\u0072");};return nil ;};func (_affff *ClassedPoints )validateIntSlice ()error {const _fafe ="\u0076\u0061l\u0069\u0064\u0061t\u0065\u0049\u006e\u0074\u0053\u006c\u0069\u0063\u0065";for _ ,_ecfb :=range _affff .IntSlice {if _ecfb >=(_affff .Points .Size ()){return _e .Errorf (_fafe ,"c\u006c\u0061\u0073\u0073\u0020\u0069\u0064\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u0069\u0073\u0020\u006e\u006f\u0074\u0020\u0061\u0020\u0076\u0061\u006ci\u0064 \u0069\u006e\u0064\u0065x\u0020\u0069n\u0020\u0074\u0068\u0065\u0020\u0070\u006f\u0069\u006e\u0074\u0073\u0020\u006f\u0066\u0020\u0073\u0069\u007a\u0065\u003a\u0020\u0025\u0064",_ecfb ,_affff .Points .Size ());};};return nil ;};func HausTest (p1 ,p2 ,p3 ,p4 *Bitmap ,delX ,delY float32 ,maxDiffW ,maxDiffH int )(bool ,error ){const _faea ="\u0048\u0061\u0075\u0073\u0054\u0065\u0073\u0074";_edcb ,_cfgd :=p1 .Width ,p1 .Height ;_cgfa ,_ggcb :=p3 .Width ,p3 .Height ;if _b .Abs (_edcb -_cgfa )> maxDiffW {return false ,nil ;};if _b .Abs (_cfgd -_ggcb )> maxDiffH {return false ,nil ;};_acg :=int (delX +_b .Sign (delX )*0.5);_ddedg :=int (delY +_b .Sign (delY )*0.5);var _bbge error ;_adfdd :=p1 .CreateTemplate ();if _bbge =_adfdd .RasterOperation (0,0,_edcb ,_cfgd ,PixSrc ,p1 ,0,0);_bbge !=nil {return false ,_e .Wrap (_bbge ,_faea ,"p\u0031\u0020\u002d\u0053\u0052\u0043\u002d\u003e\u0020\u0074");};if _bbge =_adfdd .RasterOperation (_acg ,_ddedg ,_edcb ,_cfgd ,PixNotSrcAndDst ,p4 ,0,0);_bbge !=nil {return false ,_e .Wrap (_bbge ,_faea ,"\u0021p\u0034\u0020\u0026\u0020\u0074");};if _adfdd .Zero (){return false ,nil ;};if _bbge =_adfdd .RasterOperation (_acg ,_ddedg ,_cgfa ,_ggcb ,PixSrc ,p3 ,0,0);_bbge !=nil {return false ,_e .Wrap (_bbge ,_faea ,"p\u0033\u0020\u002d\u0053\u0052\u0043\u002d\u003e\u0020\u0074");};if _bbge =_adfdd .RasterOperation (0,0,_cgfa ,_ggcb ,PixNotSrcAndDst ,p2 ,0,0);_bbge !=nil {return false ,_e .Wrap (_bbge ,_faea ,"\u0021p\u0032\u0020\u0026\u0020\u0074");};return _adfdd .Zero (),nil ;};type Getter interface{GetBitmap ()*Bitmap ;};func _dafg ()[]int {_dffgc :=make ([]int ,256);_dffgc [0]=0;_dffgc [1]=7;var _gadd int ;for _gadd =2;_gadd < 4;_gadd ++{_dffgc [_gadd ]=_dffgc [_gadd -2]+6;};for _gadd =4;_gadd < 8;_gadd ++{_dffgc [_gadd ]=_dffgc [_gadd -4]+5;};for _gadd =8;_gadd < 16;_gadd ++{_dffgc [_gadd ]=_dffgc [_gadd -8]+4;};for _gadd =16;_gadd < 32;_gadd ++{_dffgc [_gadd ]=_dffgc [_gadd -16]+3;};for _gadd =32;_gadd < 64;_gadd ++{_dffgc [_gadd ]=_dffgc [_gadd -32]+2;};for _gadd =64;_gadd < 128;_gadd ++{_dffgc [_gadd ]=_dffgc [_gadd -64]+1;};for _gadd =128;_gadd < 256;_gadd ++{_dffgc [_gadd ]=_dffgc [_gadd -128];};return _dffgc ;};func (_agba *byWidth )Swap (i ,j int ){_agba .Values [i ],_agba .Values [j ]=_agba .Values [j ],_agba .Values [i ];if _agba .Boxes !=nil {_agba .Boxes [i ],_agba .Boxes [j ]=_agba .Boxes [j ],_agba .Boxes [i ];};};func TstWordBitmapWithSpaces (t *_c .T ,scale ...int )*Bitmap {_aceg :=1;if len (scale )> 0{_aceg =scale [0];};_bgac :=3;_accca :=9+7+15+2*_bgac +2*_bgac ;_efed :=5+_bgac +5+2*_bgac ;_ecaf :=New (_accca *_aceg ,_efed *_aceg );_bbdb :=&Bitmaps {};var _acabf *int ;_bgac *=_aceg ;_bcdg :=_bgac ;_acabf =&_bcdg ;_eeaee :=_bgac ;_adbd :=TstDSymbol (t ,scale ...);TstAddSymbol (t ,_bbdb ,_adbd ,_acabf ,_eeaee ,1*_aceg );_adbd =TstOSymbol (t ,scale ...);TstAddSymbol (t ,_bbdb ,_adbd ,_acabf ,_eeaee ,_bgac );_adbd =TstISymbol (t ,scale ...);TstAddSymbol (t ,_bbdb ,_adbd ,_acabf ,_eeaee ,1*_aceg );_adbd =TstTSymbol (t ,scale ...);TstAddSymbol (t ,_bbdb ,_adbd ,_acabf ,_eeaee ,_bgac );_adbd =TstNSymbol (t ,scale ...);TstAddSymbol (t ,_bbdb ,_adbd ,_acabf ,_eeaee ,1*_aceg );_adbd =TstOSymbol (t ,scale ...);TstAddSymbol (t ,_bbdb ,_adbd ,_acabf ,_eeaee ,1*_aceg );_adbd =TstWSymbol (t ,scale ...);TstAddSymbol (t ,_bbdb ,_adbd ,_acabf ,_eeaee ,0);*_acabf =_bgac ;_eeaee =5*_aceg +_bgac ;_adbd =TstOSymbol (t ,scale ...);TstAddSymbol (t ,_bbdb ,_adbd ,_acabf ,_eeaee ,1*_aceg );_adbd =TstRSymbol (t ,scale ...);TstAddSymbol (t ,_bbdb ,_adbd ,_acabf ,_eeaee ,_bgac );_adbd =TstNSymbol (t ,scale ...);TstAddSymbol (t ,_bbdb ,_adbd ,_acabf ,_eeaee ,1*_aceg );_adbd =TstESymbol (t ,scale ...);TstAddSymbol (t ,_bbdb ,_adbd ,_acabf ,_eeaee ,1*_aceg );_adbd =TstVSymbol (t ,scale ...);TstAddSymbol (t ,_bbdb ,_adbd ,_acabf ,_eeaee ,1*_aceg );_adbd =TstESymbol (t ,scale ...);TstAddSymbol (t ,_bbdb ,_adbd ,_acabf ,_eeaee ,1*_aceg );_adbd =TstRSymbol (t ,scale ...);TstAddSymbol (t ,_bbdb ,_adbd ,_acabf ,_eeaee ,0);TstWriteSymbols (t ,_bbdb ,_ecaf );return _ecaf ;};func _cdca (_efddb ,_fde *Bitmap ,_dgagb ,_cebg int )(*Bitmap ,error ){const _gaba ="\u0063\u006c\u006f\u0073\u0065\u0053\u0061\u0066\u0065B\u0072\u0069\u0063\u006b";if _fde ==nil {return nil ,_e .Error (_gaba ,"\u0073\u006f\u0075\u0072\u0063\u0065\u0020\u0069\u0073\u0020\u006e\u0069\u006c");};if _dgagb < 1||_cebg < 1{return nil ,_e .Error (_gaba ,"\u0068s\u0069\u007a\u0065\u0020\u0061\u006e\u0064\u0020\u0076\u0073\u0069z\u0065\u0020\u006e\u006f\u0074\u0020\u003e\u003d\u0020\u0031");};if _dgagb ==1&&_cebg ==1{return _acfb (_efddb ,_fde );};if MorphBC ==SymmetricMorphBC {_eabbb ,_ddg :=_cfbc (_efddb ,_fde ,_dgagb ,_cebg );if _ddg !=nil {return nil ,_e .Wrap (_ddg ,_gaba ,"\u0053\u0079m\u006d\u0065\u0074r\u0069\u0063\u004d\u006f\u0072\u0070\u0068\u0042\u0043");};return _eabbb ,nil ;};_adfg :=_beeb (_dgagb /2,_cebg /2);_ffb :=8*((_adfg +7)/8);_fag ,_abcd :=_fde .AddBorder (_ffb ,0);if _abcd !=nil {return nil ,_e .Wrapf (_abcd ,_gaba ,"\u0042\u006f\u0072\u0064\u0065\u0072\u0053\u0069\u007ae\u003a\u0020\u0025\u0064",_ffb );};var _fcad ,_gffg *Bitmap ;if _dgagb ==1||_cebg ==1{_badg :=SelCreateBrick (_cebg ,_dgagb ,_cebg /2,_dgagb /2,SelHit );_fcad ,_abcd =_ddba (nil ,_fag ,_badg );if _abcd !=nil {return nil ,_e .Wrap (_abcd ,_gaba ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u007c\u007c \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");};}else {_gffag :=SelCreateBrick (1,_dgagb ,0,_dgagb /2,SelHit );_efcb ,_cfgfd :=_ebda (nil ,_fag ,_gffag );if _cfgfd !=nil {return nil ,_e .Wrap (_cfgfd ,_gaba ,"\u0072\u0065\u0067\u0075la\u0072\u0020\u002d\u0020\u0066\u0069\u0072\u0073\u0074\u0020\u0064\u0069\u006c\u0061t\u0065");};_dcfe :=SelCreateBrick (_cebg ,1,_cebg /2,0,SelHit );_fcad ,_cfgfd =_ebda (nil ,_efcb ,_dcfe );if _cfgfd !=nil {return nil ,_e .Wrap (_cfgfd ,_gaba ,"\u0072\u0065\u0067ul\u0061\u0072\u0020\u002d\u0020\u0073\u0065\u0063\u006f\u006e\u0064\u0020\u0064\u0069\u006c\u0061\u0074\u0065");};if _ ,_cfgfd =_gccg (_efcb ,_fcad ,_gffag );_cfgfd !=nil {return nil ,_e .Wrap (_cfgfd ,_gaba ,"r\u0065\u0067\u0075\u006car\u0020-\u0020\u0066\u0069\u0072\u0073t\u0020\u0065\u0072\u006f\u0064\u0065");};if _ ,_cfgfd =_gccg (_fcad ,_efcb ,_dcfe );_cfgfd !=nil {return nil ,_e .Wrap (_cfgfd ,_gaba ,"\u0072\u0065\u0067\u0075la\u0072\u0020\u002d\u0020\u0073\u0065\u0063\u006f\u006e\u0064\u0020\u0065\u0072\u006fd\u0065");};};if _gffg ,_abcd =_fcad .RemoveBorder (_ffb );_abcd !=nil {return nil ,_e .Wrap (_abcd ,_gaba ,"\u0072e\u0067\u0075\u006c\u0061\u0072");};if _efddb ==nil {return _gffg ,nil ;};if _ ,_abcd =_acfb (_efddb ,_gffg );_abcd !=nil {return nil ,_abcd ;};return _efddb ,nil ;};func (_feb *Bitmap )ClipRectangle (box *_ab .Rectangle )(_egf *Bitmap ,_dgg *_ab .Rectangle ,_bca error ){const _gde ="\u0043\u006c\u0069\u0070\u0052\u0065\u0063\u0074\u0061\u006e\u0067\u006c\u0065";if box ==nil {return nil ,nil ,_e .Error (_gde ,"\u0062o\u0078 \u0069\u0073\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");};_ebfa ,_gfb :=_feb .Width ,_feb .Height ;_gaga :=_ab .Rect (0,0,_ebfa ,_gfb );if !box .Overlaps (_gaga ){return nil ,nil ,_e .Error (_gde ,"b\u006f\u0078\u0020\u0064oe\u0073n\u0027\u0074\u0020\u006f\u0076e\u0072\u006c\u0061\u0070\u0020\u0062");};_dgf :=box .Intersect (_gaga );_cab ,_gdcd :=_dgf .Min .X ,_dgf .Min .Y ;_cbe ,_eac :=_dgf .Dx (),_dgf .Dy ();_egf =New (_cbe ,_eac );_egf .Text =_feb .Text ;if _bca =_egf .RasterOperation (0,0,_cbe ,_eac ,PixSrc ,_feb ,_cab ,_gdcd );_bca !=nil {return nil ,nil ,_e .Wrap (_bca ,_gde ,"\u0050\u0069\u0078\u0053\u0072\u0063\u0020\u0074\u006f\u0020\u0063\u006ci\u0070\u0070\u0065\u0064");};_dgg =&_dgf ;return _egf ,_dgg ,nil ;};func (_bba *Bitmap )Zero ()bool {_fac :=_bba .Width /8;_bdfb :=_bba .Width &7;var _cfe byte ;if _bdfb !=0{_cfe =byte (0xff<<uint (8-_bdfb ));};var _fcg ,_aded ,_edgg int ;for _aded =0;_aded < _bba .Height ;_aded ++{_fcg =_bba .RowStride *_aded ;for _edgg =0;_edgg < _fac ;_edgg ,_fcg =_edgg +1,_fcg +1{if _bba .Data [_fcg ]!=0{return false ;};};if _bdfb > 0{if _bba .Data [_fcg ]&_cfe !=0{return false ;};};};return true ;};func _ddba (_gbfab ,_cedbg *Bitmap ,_gfcf *Selection )(*Bitmap ,error ){const _adffb ="c\u006c\u006f\u0073\u0065\u0042\u0069\u0074\u006d\u0061\u0070";var _dgga error ;if _gbfab ,_dgga =_deb (_gbfab ,_cedbg ,_gfcf );_dgga !=nil {return nil ,_dgga ;};_fee ,_dgga :=_ebda (nil ,_cedbg ,_gfcf );if _dgga !=nil {return nil ,_e .Wrap (_dgga ,_adffb ,"");};if _ ,_dgga =_gccg (_gbfab ,_fee ,_gfcf );_dgga !=nil {return nil ,_e .Wrap (_dgga ,_adffb ,"");};return _gbfab ,nil ;};type Boxes []*_ab .Rectangle ;func Centroid (bm *Bitmap ,centTab ,sumTab []int )(Point ,error ){return bm .centroid (centTab ,sumTab )};func MorphSequence (src *Bitmap ,sequence ...MorphProcess )(*Bitmap ,error ){return _aeac (src ,sequence ...);};func ClipBoxToRectangle (box *_ab .Rectangle ,wi ,hi int )(_cece *_ab .Rectangle ,_ddec error ){const _facb ="\u0043l\u0069p\u0042\u006f\u0078\u0054\u006fR\u0065\u0063t\u0061\u006e\u0067\u006c\u0065";if box ==nil {return nil ,_e .Error (_facb ,"\u0027\u0062\u006f\u0078\u0027\u0020\u006e\u006f\u0074\u0020\u0064\u0065f\u0069\u006e\u0065\u0064");};if box .Min .X >=wi ||box .Min .Y >=hi ||box .Max .X <=0||box .Max .Y <=0{return nil ,_e .Error (_facb ,"\u0027\u0062\u006fx'\u0020\u006f\u0075\u0074\u0073\u0069\u0064\u0065\u0020\u0072\u0065\u0063\u0074\u0061\u006e\u0067\u006c\u0065");};_cece =&(*box );if _cece .Min .X < 0{_cece .Max .X +=_cece .Min .X ;_cece .Min .X =0;};if _cece .Min .Y < 0{_cece .Max .Y +=_cece .Min .Y ;_cece .Min .Y =0;};if _cece .Max .X > wi {_cece .Max .X =wi ;};if _cece .Max .Y > hi {_cece .Max .Y =hi ;};return _cece ,nil ;};func (_gcdb *ClassedPoints )Less (i ,j int )bool {return _gcdb ._daeg (i ,j )};func TstRSymbol (t *_c .T ,scale ...int )*Bitmap {_cddd ,_gegb :=NewWithData (4,5,[]byte {0xF0,0x90,0xF0,0xA0,0x90});_g .NoError (t ,_gegb );return TstGetScaledSymbol (t ,_cddd ,scale ...);};func _dbf (_dae *Bitmap ,_gdg ...int )(_gdfb *Bitmap ,_ecb error ){const _fg ="\u0072\u0065\u0064uc\u0065\u0052\u0061\u006e\u006b\u0042\u0069\u006e\u0061\u0072\u0079\u0043\u0061\u0073\u0063\u0061\u0064\u0065";if _dae ==nil {return nil ,_e .Error (_fg ,"\u0073o\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061p\u0020n\u006ft\u0020\u0064\u0065\u0066\u0069\u006e\u0065d");};if len (_gdg )==0||len (_gdg )> 4{return nil ,_e .Error (_fg ,"t\u0068\u0065\u0072\u0065\u0020\u006d\u0075\u0073\u0074 \u0062\u0065\u0020\u0061\u0074\u0020\u006cea\u0073\u0074\u0020\u006fn\u0065\u0020\u0061\u006e\u0064\u0020\u0061\u0074\u0020mo\u0073\u0074 \u0034\u0020\u006c\u0065\u0076\u0065\u006c\u0073");};if _gdg [0]<=0{_bc .Log .Debug ("\u006c\u0065\u0076\u0065\u006c\u0031\u0020\u003c\u003d\u0020\u0030 \u002d\u0020\u006e\u006f\u0020\u0072\u0065\u0064\u0075\u0063t\u0069\u006f\u006e");_gdfb ,_ecb =_acfb (nil ,_dae );if _ecb !=nil {return nil ,_e .Wrap (_ecb ,_fg ,"l\u0065\u0076\u0065\u006c\u0031\u0020\u003c\u003d\u0020\u0030");};return _gdfb ,nil ;};_dcd :=_abfc ();_gdfb =_dae ;for _ceg ,_ffe :=range _gdg {if _ffe <=0{break ;};_gdfb ,_ecb =_bgc (_gdfb ,_ffe ,_dcd );if _ecb !=nil {return nil ,_e .Wrapf (_ecb ,_fg ,"\u006c\u0065\u0076\u0065\u006c\u0025\u0064\u0020\u0072\u0065\u0064\u0075c\u0074\u0069\u006f\u006e",_ceg );};};return _gdfb ,nil ;};func (_fbcc *Bitmaps )SelectBySize (width ,height int ,tp LocationFilter ,relation SizeComparison )(_gabb *Bitmaps ,_fcbe error ){const _ebfe ="B\u0069t\u006d\u0061\u0070\u0073\u002e\u0053\u0065\u006ce\u0063\u0074\u0042\u0079Si\u007a\u0065";if _fbcc ==nil {return nil ,_e .Error (_ebfe ,"\u0027\u0062\u0027 B\u0069\u0074\u006d\u0061\u0070\u0073\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");};switch tp {case LocSelectWidth ,LocSelectHeight ,LocSelectIfEither ,LocSelectIfBoth :default:return nil ,_e .Errorf (_ebfe ,"\u0070\u0072\u006f\u0076\u0069d\u0065\u0064\u0020\u0069\u006e\u0076\u0061\u006c\u0069\u0064\u0020\u006c\u006fc\u0061\u0074\u0069\u006f\u006e\u0020\u0066\u0069\u006c\u0074\u0065\u0072\u0020\u0074\u0079\u0070\u0065\u003a\u0020\u0025\u0064",tp );};switch relation {case SizeSelectIfLT ,SizeSelectIfGT ,SizeSelectIfLTE ,SizeSelectIfGTE ,SizeSelectIfEQ :default:return nil ,_e .Errorf (_ebfe ,"\u0069\u006e\u0076\u0061li\u0064\u0020\u0072\u0065\u006c\u0061\u0074\u0069\u006f\u006e\u003a\u0020\u0027\u0025d\u0027",relation );};_faef ,_fcbe :=_fbcc .makeSizeIndicator (width ,height ,tp ,relation );if _fcbe !=nil {return nil ,_e .Wrap (_fcbe ,_ebfe ,"");};_gabb ,_fcbe =_fbcc .selectByIndicator (_faef );if _fcbe !=nil {return nil ,_e .Wrap (_fcbe ,_ebfe ,"");};return _gabb ,nil ;};func Blit (src *Bitmap ,dst *Bitmap ,x ,y int ,op CombinationOperator )error {var _caeg ,_dcf int ;_acbg :=src .RowStride -1;if x < 0{_dcf =-x ;x =0;}else if x +src .Width > dst .Width {_acbg -=src .Width +x -dst .Width ;};if y < 0{_caeg =-y ;y =0;_dcf +=src .RowStride ;_acbg +=src .RowStride ;}else if y +src .Height > dst .Height {_caeg =src .Height +y -dst .Height ;};var (_bcb int ;_cdfa error ;);_fedf :=x &0x07;_afff :=8-_fedf ;_bac :=src .Width &0x07;_edag :=_afff -_bac ;_dbae :=_afff &0x07!=0;_fbge :=src .Width <=((_acbg -_dcf )<<3)+_afff ;_gagc :=dst .GetByteIndex (x ,y );_eaa :=_caeg +dst .Height ;if src .Height > _eaa {_bcb =_eaa ;}else {_bcb =src .Height ;};switch {case !_dbae :_cdfa =_addc (src ,dst ,_caeg ,_bcb ,_gagc ,_dcf ,_acbg ,op );case _fbge :_cdfa =_cecd (src ,dst ,_caeg ,_bcb ,_gagc ,_dcf ,_acbg ,_edag ,_fedf ,_afff ,op );default:_cdfa =_dgd (src ,dst ,_caeg ,_bcb ,_gagc ,_dcf ,_acbg ,_edag ,_fedf ,_afff ,op ,_bac );};return _cdfa ;};func _eff (_dfd *Bitmap ,_bea *Bitmap ,_bbb int )(_ff error ){const _cdg ="e\u0078\u0070\u0061\u006edB\u0069n\u0061\u0072\u0079\u0050\u006fw\u0065\u0072\u0032\u004c\u006f\u0077";switch _bbb {case 2:_ff =_eb (_dfd ,_bea );case 4:_ff =_de (_dfd ,_bea );case 8:_ff =_bbg (_dfd ,_bea );default:return _e .Error (_cdg ,"\u0065\u0078p\u0061\u006e\u0073\u0069o\u006e\u0020f\u0061\u0063\u0074\u006f\u0072\u0020\u006e\u006ft\u0020\u0069\u006e\u0020\u007b\u0032\u002c\u0034\u002c\u0038\u007d\u0020r\u0061\u006e\u0067\u0065");};if _ff !=nil {_ff =_e .Wrap (_ff ,_cdg ,"");};return _ff ;};func (_feed Points )GetGeometry (i int )(_bdae ,_fgcf float32 ,_dfae error ){if i > len (_feed )-1{return 0,0,_e .Errorf ("\u0050\u006f\u0069\u006e\u0074\u0073\u002e\u0047\u0065\u0074","\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );};_gefg :=_feed [i ];return _gefg .X ,_gefg .Y ,nil ;};func (_bcfg Points )YSorter ()func (_ebbcf ,_bgbg int )bool {return func (_bab ,_afe int )bool {return _bcfg [_bab ].Y < _bcfg [_afe ].Y };};func _bbf (_ccdgc ,_degd *Bitmap ,_dbb ,_bcec int )(*Bitmap ,error ){const _dgfda ="\u006fp\u0065\u006e\u0042\u0072\u0069\u0063k";if _degd ==nil {return nil ,_e .Error (_dgfda ,"\u0073o\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061p\u0020n\u006ft\u0020\u0064\u0065\u0066\u0069\u006e\u0065d");};if _dbb < 1&&_bcec < 1{return nil ,_e .Error (_dgfda ,"\u0068\u0053\u0069\u007ae \u003c\u0020\u0031\u0020\u0026\u0026\u0020\u0076\u0053\u0069\u007a\u0065\u0020\u003c \u0031");};if _dbb ==1&&_bcec ==1{return _degd .Copy (),nil ;};if _dbb ==1||_bcec ==1{var _ggee error ;_ggag :=SelCreateBrick (_bcec ,_dbb ,_bcec /2,_dbb /2,SelHit );_ccdgc ,_ggee =_fdeac (_ccdgc ,_degd ,_ggag );if _ggee !=nil {return nil ,_e .Wrap (_ggee ,_dgfda ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u007c\u007c \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");};return _ccdgc ,nil ;};_facf :=SelCreateBrick (1,_dbb ,0,_dbb /2,SelHit );_fdfa :=SelCreateBrick (_bcec ,1,_bcec /2,0,SelHit );_aaaf ,_fgc :=_gccg (nil ,_degd ,_facf );if _fgc !=nil {return nil ,_e .Wrap (_fgc ,_dgfda ,"\u0031s\u0074\u0020\u0065\u0072\u006f\u0064e");};_ccdgc ,_fgc =_gccg (_ccdgc ,_aaaf ,_fdfa );if _fgc !=nil {return nil ,_e .Wrap (_fgc ,_dgfda ,"\u0032n\u0064\u0020\u0065\u0072\u006f\u0064e");};_ ,_fgc =_ebda (_aaaf ,_ccdgc ,_facf );if _fgc !=nil {return nil ,_e .Wrap (_fgc ,_dgfda ,"\u0031\u0073\u0074\u0020\u0064\u0069\u006c\u0061\u0074\u0065");};_ ,_fgc =_ebda (_ccdgc ,_aaaf ,_fdfa );if _fgc !=nil {return nil ,_e .Wrap (_fgc ,_dgfda ,"\u0032\u006e\u0064\u0020\u0064\u0069\u006c\u0061\u0074\u0065");};return _ccdgc ,nil ;};func (_gdgf Points )GetIntX (i int )(int ,error ){if i >=len (_gdgf ){return 0,_e .Errorf ("\u0050\u006f\u0069\u006e\u0074\u0073\u002e\u0047\u0065t\u0049\u006e\u0074\u0058","\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );};return int (_gdgf [i ].X ),nil ;};func _bcad (_dce *Bitmap )(_eaeda *Bitmap ,_bfc int ,_eecd error ){const _daedg ="\u0042i\u0074\u006d\u0061\u0070.\u0077\u006f\u0072\u0064\u004da\u0073k\u0042y\u0044\u0069\u006c\u0061\u0074\u0069\u006fn";if _dce ==nil {return nil ,0,_e .Errorf (_daedg ,"\u0027\u0073\u0027\u0020bi\u0074\u006d\u0061\u0070\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006ee\u0064");};var _cddc ,_cdbc *Bitmap ;if _cddc ,_eecd =_acfb (nil ,_dce );_eecd !=nil {return nil ,0,_e .Wrap (_eecd ,_daedg ,"\u0063\u006f\u0070\u0079\u0020\u0027\u0073\u0027");};var (_fcbb [13]int ;_ecge ,_affde int ;);_cfcd :=12;_cdfc :=_b .NewNumSlice (_cfcd +1);_eaedae :=_b .NewNumSlice (_cfcd +1);var _cdgd *Boxes ;for _egbg :=0;_egbg <=_cfcd ;_egbg ++{if _egbg ==0{if _cdbc ,_eecd =_acfb (nil ,_cddc );_eecd !=nil {return nil ,0,_e .Wrap (_eecd ,_daedg ,"\u0066i\u0072\u0073\u0074\u0020\u0062\u006d2");};}else {if _cdbc ,_eecd =_aeac (_cddc ,MorphProcess {Operation :MopDilation ,Arguments :[]int {2,1}});_eecd !=nil {return nil ,0,_e .Wrap (_eecd ,_daedg ,"\u0064\u0069\u006ca\u0074\u0069\u006f\u006e\u0020\u0062\u006d\u0032");};};if _cdgd ,_eecd =_cdbc .connComponentsBB (4);_eecd !=nil {return nil ,0,_e .Wrap (_eecd ,_daedg ,"");};_fcbb [_egbg ]=len (*_cdgd );_cdfc .AddInt (_fcbb [_egbg ]);switch _egbg {case 0:_ecge =_fcbb [0];default:_affde =_fcbb [_egbg -1]-_fcbb [_egbg ];_eaedae .AddInt (_affde );};_cddc =_cdbc ;};_ggge :=true ;_bafb :=2;var _cce ,_dcba int ;for _bgcb :=1;_bgcb < len (*_eaedae );_bgcb ++{if _cce ,_eecd =_cdfc .GetInt (_bgcb );_eecd !=nil {return nil ,0,_e .Wrap (_eecd ,_daedg ,"\u0043\u0068\u0065\u0063ki\u006e\u0067\u0020\u0062\u0065\u0073\u0074\u0020\u0064\u0069\u006c\u0061\u0074\u0069o\u006e");};if _ggge &&_cce < int (0.3*float32 (_ecge )){_bafb =_bgcb +1;_ggge =false ;};if _affde ,_eecd =_eaedae .GetInt (_bgcb );_eecd !=nil {return nil ,0,_e .Wrap (_eecd ,_daedg ,"\u0067\u0065\u0074\u0074\u0069\u006e\u0067\u0020\u006ea\u0044\u0069\u0066\u0066");};if _affde > _dcba {_dcba =_affde ;};};_addd :=_dce .XResolution ;if _addd ==0{_addd =150;};if _addd > 110{_bafb ++;};if _bafb < 2{_bc .Log .Trace ("J\u0042\u0049\u0047\u0032\u0020\u0073\u0065\u0074\u0074\u0069\u006e\u0067\u0020\u0069\u0042\u0065\u0073\u0074 \u0074\u006f\u0020\u006d\u0069\u006e\u0069\u006d\u0075\u006d a\u006c\u006c\u006fw\u0061b\u006c\u0065");_bafb =2;};_bfc =_bafb +1;if _eaeda ,_eecd =_cfbc (nil ,_dce ,_bafb +1,1);_eecd !=nil {return nil ,0,_e .Wrap (_eecd ,_daedg ,"\u0067\u0065\u0074\u0074in\u0067\u0020\u006d\u0061\u0073\u006b\u0020\u0066\u0061\u0069\u006c\u0065\u0064");};return _eaeda ,_bfc ,nil ;};func (_ffef *Bitmap )removeBorderGeneral (_bee ,_caac ,_dfbc ,_aab int )(*Bitmap ,error ){const _gdcde ="\u0072\u0065\u006d\u006fve\u0042\u006f\u0072\u0064\u0065\u0072\u0047\u0065\u006e\u0065\u0072\u0061\u006c";if _bee < 0||_caac < 0||_dfbc < 0||_aab < 0{return nil ,_e .Error (_gdcde ,"\u006e\u0065g\u0061\u0074\u0069\u0076\u0065\u0020\u0062\u0072\u006f\u0064\u0065\u0072\u0020\u0072\u0065\u006d\u006f\u0076\u0065\u0020\u0076\u0061lu\u0065\u0073");};_adfe ,_badb :=_ffef .Width ,_ffef .Height ;_gacd :=_adfe -_bee -_caac ;_fcaa :=_badb -_dfbc -_aab ;if _gacd <=0{return nil ,_e .Errorf (_gdcde ,"w\u0069\u0064\u0074\u0068: \u0025d\u0020\u006d\u0075\u0073\u0074 \u0062\u0065\u0020\u003e\u0020\u0030",_gacd );};if _fcaa <=0{return nil ,_e .Errorf (_gdcde ,"\u0068\u0065\u0069\u0067ht\u003a\u0020\u0025\u0064\u0020\u006d\u0075\u0073\u0074\u0020\u0062\u0065\u0020\u003e \u0030",_fcaa );};_bbdff :=New (_gacd ,_fcaa );_bbdff .Color =_ffef .Color ;_fccbg :=_bbdff .RasterOperation (0,0,_gacd ,_fcaa ,PixSrc ,_ffef ,_bee ,_dfbc );if _fccbg !=nil {return nil ,_e .Wrap (_fccbg ,_gdcde ,"");};return _bbdff ,nil ;};func (_bdcc *ClassedPoints )xSortFunction ()func (_cbef int ,_cbab int )bool {return func (_ccac ,_beaf int )bool {return _bdcc .XAtIndex (_ccac )< _bdcc .XAtIndex (_beaf )};};func _ddff (_dafa ,_geed ,_dedc *Bitmap ,_aaaa int )(*Bitmap ,error ){const _fbdcg ="\u0073\u0065\u0065\u0064\u0046\u0069\u006c\u006c\u0042i\u006e\u0061\u0072\u0079";if _geed ==nil {return nil ,_e .Error (_fbdcg ,"s\u006fu\u0072\u0063\u0065\u0020\u0062\u0069\u0074\u006da\u0070\u0020\u0069\u0073 n\u0069\u006c");};if _dedc ==nil {return nil ,_e .Error (_fbdcg ,"'\u006da\u0073\u006b\u0027\u0020\u0062\u0069\u0074\u006da\u0070\u0020\u0069\u0073 n\u0069\u006c");};if _aaaa !=4&&_aaaa !=8{return nil ,_e .Error (_fbdcg ,"\u0063\u006f\u006en\u0065\u0063\u0074\u0069v\u0069\u0074\u0079\u0020\u006e\u006f\u0074 \u0069\u006e\u0020\u0072\u0061\u006e\u0067\u0065\u0020\u007b\u0034\u002c\u0038\u007d");};var _bgbgbe error ;_dafa ,_bgbgbe =_acfb (_dafa ,_geed );if _bgbgbe !=nil {return nil ,_e .Wrap (_bgbgbe ,_fbdcg ,"\u0063o\u0070y\u0020\u0073\u006f\u0075\u0072c\u0065\u0020t\u006f\u0020\u0027\u0064\u0027");};_dafb :=_geed .createTemplate ();_dedc .setPadBits (0);for _bcgfa :=0;_bcgfa < _accb ;_bcgfa ++{_dafb ,_bgbgbe =_acfb (_dafb ,_dafa );if _bgbgbe !=nil {return nil ,_e .Wrapf (_bgbgbe ,_fbdcg ,"\u0069\u0074\u0065\u0072\u0061\u0074\u0069\u006f\u006e\u003a\u0020\u0025\u0064",_bcgfa );};if _bgbgbe =_ggcfff (_dafa ,_dedc ,_aaaa );_bgbgbe !=nil {return nil ,_e .Wrapf (_bgbgbe ,_fbdcg ,"\u0069\u0074\u0065\u0072\u0061\u0074\u0069\u006f\u006e\u003a\u0020\u0025\u0064",_bcgfa );};if _dafb .Equals (_dafa ){break ;};};return _dafa ,nil ;};func TstDSymbol (t *_c .T ,scale ...int )*Bitmap {_ecfcb ,_bbgfc :=NewWithData (4,5,[]byte {0xf0,0x90,0x90,0x90,0xE0});_g .NoError (t ,_bbgfc );return TstGetScaledSymbol (t ,_ecfcb ,scale ...);};func _eada (_fccd ,_egbc byte ,_bgaf CombinationOperator )byte {switch _bgaf {case CmbOpOr :return _egbc |_fccd ;case CmbOpAnd :return _egbc &_fccd ;case CmbOpXor :return _egbc ^_fccd ;case CmbOpXNor :return ^(_egbc ^_fccd );case CmbOpNot :return ^(_egbc );default:return _egbc ;};};func _eagc (_gccc *Bitmap ,_gdea ,_feeg ,_adgag ,_bffe int ,_fdgfe RasterOperator ,_cdce *Bitmap ,_abgab ,_ecac int )error {const _adfga ="\u0072a\u0073t\u0065\u0072\u004f\u0070\u0065\u0072\u0061\u0074\u0069\u006f\u006e";if _gccc ==nil {return _e .Error (_adfga ,"\u006e\u0069\u006c\u0020\u0027\u0064\u0065\u0073\u0074\u0027\u0020\u0042i\u0074\u006d\u0061\u0070");};if _fdgfe ==PixDst {return nil ;};switch _fdgfe {case PixClr ,PixSet ,PixNotDst :_gaab (_gccc ,_gdea ,_feeg ,_adgag ,_bffe ,_fdgfe );return nil ;};if _cdce ==nil {_bc .Log .Debug ("\u0052a\u0073\u0074e\u0072\u004f\u0070\u0065r\u0061\u0074\u0069o\u006e\u0020\u0073\u006f\u0075\u0072\u0063\u0065\u0020bi\u0074\u006d\u0061p\u0020\u0069s\u0020\u006e\u006f\u0074\u0020\u0064e\u0066\u0069n\u0065\u0064");return _e .Error (_adfga ,"\u006e\u0069l\u0020\u0027\u0073r\u0063\u0027\u0020\u0062\u0069\u0074\u006d\u0061\u0070");};if _bfbe :=_egdcb (_gccc ,_gdea ,_feeg ,_adgag ,_bffe ,_fdgfe ,_cdce ,_abgab ,_ecac );_bfbe !=nil {return _e .Wrap (_bfbe ,_adfga ,"");};return nil ;};var _edbg [256]uint8 ;const (_ LocationFilter =iota ;LocSelectWidth ;LocSelectHeight ;LocSelectXVal ;LocSelectYVal ;LocSelectIfEither ;LocSelectIfBoth ;);func _gaeca (_agac ,_cbfg ,_cfbbg byte )byte {return (_agac &^(_cfbbg ))|(_cbfg &_cfbbg )};func (_fbcd *Bitmap )Copy ()*Bitmap {_eabc :=make ([]byte ,len (_fbcd .Data ));copy (_eabc ,_fbcd .Data );return &Bitmap {Width :_fbcd .Width ,Height :_fbcd .Height ,RowStride :_fbcd .RowStride ,Data :_eabc ,Color :_fbcd .Color ,Text :_fbcd .Text ,BitmapNumber :_fbcd .BitmapNumber ,Special :_fbcd .Special };};func _addc (_egbf ,_gbag *Bitmap ,_gagg ,_ebff ,_affb ,_bead ,_ggca int ,_ecea CombinationOperator )error {var _affba int ;_face :=func (){_affba ++;_affb +=_gbag .RowStride ;_bead +=_egbf .RowStride ;_ggca +=_egbf .RowStride };for _affba =_gagg ;_affba < _ebff ;_face (){_ffeff :=_affb ;for _ebac :=_bead ;_ebac <=_ggca ;_ebac ++{_fda ,_ddeb :=_gbag .GetByte (_ffeff );if _ddeb !=nil {return _ddeb ;};_gadc ,_ddeb :=_egbf .GetByte (_ebac );if _ddeb !=nil {return _ddeb ;};if _ddeb =_gbag .SetByte (_ffeff ,_eada (_fda ,_gadc ,_ecea ));_ddeb !=nil {return _ddeb ;};_ffeff ++;};};return nil ;};func (_ebeb *Bitmap )connComponentsBitmapsBB (_edec *Bitmaps ,_edgfa int )(_ffcf *Boxes ,_cfced error ){const _bgg ="\u0063\u006f\u006enC\u006f\u006d\u0070\u006f\u006e\u0065\u006e\u0074\u0073\u0042\u0069\u0074\u006d\u0061\u0070\u0073\u0042\u0042";if _edgfa !=4&&_edgfa !=8{return nil ,_e .Error (_bgg ,"\u0063\u006f\u006e\u006e\u0065\u0063t\u0069\u0076\u0069\u0074\u0079\u0020\u006d\u0075\u0073\u0074\u0020\u0062\u0065 \u0061\u0020\u0027\u0034\u0027\u0020\u006fr\u0020\u0027\u0038\u0027");};if _edec ==nil {return nil ,_e .Error (_bgg ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0042\u0069\u0074ma\u0070\u0073");};if len (_edec .Values )> 0{return nil ,_e .Error (_bgg ,"\u0070\u0072\u006f\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u006fn\u002d\u0065\u006d\u0070\u0074\u0079\u0020\u0042\u0069\u0074m\u0061\u0070\u0073");};if _ebeb .Zero (){return &Boxes {},nil ;};var (_bdeg ,_cegd ,_ecfd ,_abgb *Bitmap ;);_ebeb .setPadBits (0);if _bdeg ,_cfced =_acfb (nil ,_ebeb );_cfced !=nil {return nil ,_e .Wrap (_cfced ,_bgg ,"\u0062\u006d\u0031");};if _cegd ,_cfced =_acfb (nil ,_ebeb );_cfced !=nil {return nil ,_e .Wrap (_cfced ,_bgg ,"\u0062\u006d\u0032");};_cagc :=&_b .Stack {};_cagc .Aux =&_b .Stack {};_ffcf =&Boxes {};var (_abcg ,_bbad int ;_aaca _ab .Point ;_abaa bool ;_abd *_ab .Rectangle ;);for {if _aaca ,_abaa ,_cfced =_bdeg .nextOnPixel (_abcg ,_bbad );_cfced !=nil {return nil ,_e .Wrap (_cfced ,_bgg ,"");};if !_abaa {break ;};if _abd ,_cfced =_fcebe (_bdeg ,_cagc ,_aaca .X ,_aaca .Y ,_edgfa );_cfced !=nil {return nil ,_e .Wrap (_cfced ,_bgg ,"");};if _cfced =_ffcf .Add (_abd );_cfced !=nil {return nil ,_e .Wrap (_cfced ,_bgg ,"");};if _ecfd ,_cfced =_bdeg .clipRectangle (_abd ,nil );_cfced !=nil {return nil ,_e .Wrap (_cfced ,_bgg ,"\u0062\u006d\u0033");};if _abgb ,_cfced =_cegd .clipRectangle (_abd ,nil );_cfced !=nil {return nil ,_e .Wrap (_cfced ,_bgg ,"\u0062\u006d\u0034");};if _ ,_cfced =_adgb (_ecfd ,_ecfd ,_abgb );_cfced !=nil {return nil ,_e .Wrap (_cfced ,_bgg ,"\u0062m\u0033\u0020\u005e\u0020\u0062\u006d4");};if _cfced =_cegd .RasterOperation (_abd .Min .X ,_abd .Min .Y ,_abd .Dx (),_abd .Dy (),PixSrcXorDst ,_ecfd ,0,0);_cfced !=nil {return nil ,_e .Wrap (_cfced ,_bgg ,"\u0062\u006d\u0032\u0020\u002d\u0058\u004f\u0052\u002d>\u0020\u0062\u006d\u0033");};_edec .AddBitmap (_ecfd );_abcg =_aaca .X ;_bbad =_aaca .Y ;};_edec .Boxes =*_ffcf ;return _ffcf ,nil ;};func _faee (_gaf int )int {if _gaf < 0{return -_gaf ;};return _gaf ;};func _aee (_cdbd ,_bdgf *Bitmap ,_agaf CombinationOperator )*Bitmap {_dfdga :=New (_cdbd .Width ,_cdbd .Height );for _ccf :=0;_ccf < len (_dfdga .Data );_ccf ++{_dfdga .Data [_ccf ]=_eada (_cdbd .Data [_ccf ],_bdgf .Data [_ccf ],_agaf );};return _dfdga ;};func (_bgaa *Bitmaps )GroupByWidth ()(*BitmapsArray ,error ){const _ddfge ="\u0047\u0072\u006fu\u0070\u0042\u0079\u0057\u0069\u0064\u0074\u0068";if len (_bgaa .Values )==0{return nil ,_e .Error (_ddfge ,"\u006eo\u0020v\u0061\u006c\u0075\u0065\u0073 \u0070\u0072o\u0076\u0069\u0064\u0065\u0064");};_fdcb :=&BitmapsArray {};_bgaa .SortByWidth ();_ffeed :=-1;_cgebd :=-1;for _dcebf :=0;_dcebf < len (_bgaa .Values );_dcebf ++{_ccafa :=_bgaa .Values [_dcebf ].Width ;if _ccafa > _ffeed {_ffeed =_ccafa ;_cgebd ++;_fdcb .Values =append (_fdcb .Values ,&Bitmaps {});};_fdcb .Values [_cgebd ].AddBitmap (_bgaa .Values [_dcebf ]);};return _fdcb ,nil ;};func (_fage *ClassedPoints )YAtIndex (i int )float32 {return (*_fage .Points )[_fage .IntSlice [i ]].Y };func (_fca *Bitmap )AddBorder (borderSize ,val int )(*Bitmap ,error ){if borderSize ==0{return _fca .Copy (),nil ;};_bfag ,_daed :=_fca .addBorderGeneral (borderSize ,borderSize ,borderSize ,borderSize ,val );if _daed !=nil {return nil ,_e .Wrap (_daed ,"\u0041d\u0064\u0042\u006f\u0072\u0064\u0065r","");};return _bfag ,nil ;};func (_efab *Bitmap )addBorderGeneral (_gfa ,_bff ,_bef ,_gbaf int ,_fegf int )(*Bitmap ,error ){const _gff ="\u0061\u0064d\u0042\u006f\u0072d\u0065\u0072\u0047\u0065\u006e\u0065\u0072\u0061\u006c";if _gfa < 0||_bff < 0||_bef < 0||_gbaf < 0{return nil ,_e .Error (_gff ,"n\u0065\u0067\u0061\u0074iv\u0065 \u0062\u006f\u0072\u0064\u0065r\u0020\u0061\u0064\u0064\u0065\u0064");};_gfe ,_cabc :=_efab .Width ,_efab .Height ;_effg :=_gfe +_gfa +_bff ;_acec :=_cabc +_bef +_gbaf ;_eef :=New (_effg ,_acec );_eef .Color =_efab .Color ;_gae :=PixClr ;if _fegf > 0{_gae =PixSet ;};_baeb :=_eef .RasterOperation (0,0,_gfa ,_acec ,_gae ,nil ,0,0);if _baeb !=nil {return nil ,_e .Wrap (_baeb ,_gff ,"\u006c\u0065\u0066\u0074");};_baeb =_eef .RasterOperation (_effg -_bff ,0,_bff ,_acec ,_gae ,nil ,0,0);if _baeb !=nil {return nil ,_e .Wrap (_baeb ,_gff ,"\u0072\u0069\u0067h\u0074");};_baeb =_eef .RasterOperation (0,0,_effg ,_bef ,_gae ,nil ,0,0);if _baeb !=nil {return nil ,_e .Wrap (_baeb ,_gff ,"\u0074\u006f\u0070");};_baeb =_eef .RasterOperation (0,_acec -_gbaf ,_effg ,_gbaf ,_gae ,nil ,0,0);if _baeb !=nil {return nil ,_e .Wrap (_baeb ,_gff ,"\u0062\u006f\u0074\u0074\u006f\u006d");};_baeb =_eef .RasterOperation (_gfa ,_bef ,_gfe ,_cabc ,PixSrc ,_efab ,0,0);if _baeb !=nil {return nil ,_e .Wrap (_baeb ,_gff ,"\u0063\u006f\u0070\u0079");};return _eef ,nil ;};const (ComponentConn Component =iota ;ComponentCharacters ;ComponentWords ;);func TstNSymbol (t *_c .T ,scale ...int )*Bitmap {_fdcc ,_dgae :=NewWithData (4,5,[]byte {0x90,0xD0,0xB0,0x90,0x90});_g .NoError (t ,_dgae );return TstGetScaledSymbol (t ,_fdcc ,scale ...);};func (_gaae *Bitmap )equivalent (_ded *Bitmap )bool {if _gaae ==_ded {return true ;};if !_gaae .SizesEqual (_ded ){return false ;};_bcdbb :=_aee (_gaae ,_ded ,CmbOpXor );_dcdb :=_gaae .countPixels ();_ccc :=int (0.25*float32 (_dcdb ));if _bcdbb .thresholdPixelSum (_ccc ){return false ;};var (_gcd [9][9]int ;_dcdfd [18][9]int ;_affe [9][18]int ;_bdeb int ;_fgg int ;);_gefa :=9;_geb :=_gaae .Height /_gefa ;_bdac :=_gaae .Width /_gefa ;_gefc ,_adcf :=_geb /2,_bdac /2;if _geb < _bdac {_gefc =_bdac /2;_adcf =_geb /2;};_fcbg :=float64 (_gefc )*float64 (_adcf )*_ba .Pi ;_gfd :=int (float64 (_geb *_bdac /2)*0.9);_ffea :=int (float64 (_bdac *_geb /2)*0.9);for _ebb :=0;_ebb < _gefa ;_ebb ++{_bgbd :=_bdac *_ebb +_bdeb ;var _geg int ;if _ebb ==_gefa -1{_bdeb =0;_geg =_gaae .Width ;}else {_geg =_bgbd +_bdac ;if ((_gaae .Width -_bdeb )%_gefa )> 0{_bdeb ++;_geg ++;};};for _dfb :=0;_dfb < _gefa ;_dfb ++{_fccb :=_geb *_dfb +_fgg ;var _fed int ;if _dfb ==_gefa -1{_fgg =0;_fed =_gaae .Height ;}else {_fed =_fccb +_geb ;if (_gaae .Height -_fgg )%_gefa > 0{_fgg ++;_fed ++;};};var _adafb ,_cbde ,_fae ,_gfc int ;_gaaeb :=(_bgbd +_geg )/2;_adff :=(_fccb +_fed )/2;for _eaed :=_bgbd ;_eaed < _geg ;_eaed ++{for _ebfg :=_fccb ;_ebfg < _fed ;_ebfg ++{if _bcdbb .GetPixel (_eaed ,_ebfg ){if _eaed < _gaaeb {_adafb ++;}else {_cbde ++;};if _ebfg < _adff {_gfc ++;}else {_fae ++;};};};};_gcd [_ebb ][_dfb ]=_adafb +_cbde ;_dcdfd [_ebb *2][_dfb ]=_adafb ;_dcdfd [_ebb *2+1][_dfb ]=_cbde ;_affe [_ebb ][_dfb *2]=_gfc ;_affe [_ebb ][_dfb *2+1]=_fae ;};};for _adeg :=0;_adeg < _gefa *2-1;_adeg ++{for _gcdf :=0;_gcdf < (_gefa -1);_gcdf ++{var _ebcc int ;for _fedd :=0;_fedd < 2;_fedd ++{for _dcbg :=0;_dcbg < 2;_dcbg ++{_ebcc +=_dcdfd [_adeg +_fedd ][_gcdf +_dcbg ];};};if _ebcc > _ffea {return false ;};};};for _cged :=0;_cged < (_gefa -1);_cged ++{for _dgfd :=0;_dgfd < ((_gefa *2)-1);_dgfd ++{var _dcg int ;for _bfgb :=0;_bfgb < 2;_bfgb ++{for _cacc :=0;_cacc < 2;_cacc ++{_dcg +=_affe [_cged +_bfgb ][_dgfd +_cacc ];};};if _dcg > _gfd {return false ;};};};for _bagg :=0;_bagg < (_gefa -2);_bagg ++{for _gcc :=0;_gcc < (_gefa -2);_gcc ++{var _fbcdd ,_bdgb int ;for _edd :=0;_edd < 3;_edd ++{for _ffg :=0;_ffg < 3;_ffg ++{if _edd ==_ffg {_fbcdd +=_gcd [_bagg +_edd ][_gcc +_ffg ];};if (2-_edd )==_ffg {_bdgb +=_gcd [_bagg +_edd ][_gcc +_ffg ];};};};if _fbcdd > _ffea ||_bdgb > _ffea {return false ;};};};for _gaaeg :=0;_gaaeg < (_gefa -1);_gaaeg ++{for _eed :=0;_eed < (_gefa -1);_eed ++{var _cfcc int ;for _caad :=0;_caad < 2;_caad ++{for _fbdc :=0;_fbdc < 2;_fbdc ++{_cfcc +=_gcd [_gaaeg +_caad ][_eed +_fbdc ];};};if float64 (_cfcc )> _fcbg {return false ;};};};return true ;};type Selection struct{Height ,Width int ;Cx ,Cy int ;Name string ;Data [][]SelectionValue ;};func _deb (_dcc ,_efba *Bitmap ,_gfbf *Selection )(*Bitmap ,error ){const _gbca ="\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u004d\u006f\u0072\u0070\u0068A\u0072\u0067\u0073\u0032";var _ebdg ,_ccda int ;if _efba ==nil {return nil ,_e .Error (_gbca ,"s\u006fu\u0072\u0063\u0065\u0020\u0062\u0069\u0074\u006da\u0070\u0020\u0069\u0073 n\u0069\u006c");};if _gfbf ==nil {return nil ,_e .Error (_gbca ,"\u0073e\u006c \u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");};_ebdg =_gfbf .Width ;_ccda =_gfbf .Height ;if _ebdg ==0||_ccda ==0{return nil ,_e .Error (_gbca ,"\u0073\u0065\u006c\u0020\u006f\u0066\u0020\u0073\u0069\u007a\u0065\u0020\u0030");};if _dcc ==nil {return _efba .createTemplate (),nil ;};if _ccec :=_dcc .resizeImageData (_efba );_ccec !=nil {return nil ,_ccec ;};return _dcc ,nil ;};func (_ccge *Bitmap )setEightFullBytes (_gbfb int ,_aaba uint64 )error {if _gbfb +7> len (_ccge .Data )-1{return _e .Error ("\u0073\u0065\u0074\u0045\u0069\u0067\u0068\u0074\u0042\u0079\u0074\u0065\u0073","\u0069n\u0064e\u0078\u0020\u006f\u0075\u0074 \u006f\u0066 \u0072\u0061\u006e\u0067\u0065");};_ccge .Data [_gbfb ]=byte ((_aaba &0xff00000000000000)>>56);_ccge .Data [_gbfb +1]=byte ((_aaba &0xff000000000000)>>48);_ccge .Data [_gbfb +2]=byte ((_aaba &0xff0000000000)>>40);_ccge .Data [_gbfb +3]=byte ((_aaba &0xff00000000)>>32);_ccge .Data [_gbfb +4]=byte ((_aaba &0xff000000)>>24);_ccge .Data [_gbfb +5]=byte ((_aaba &0xff0000)>>16);_ccge .Data [_gbfb +6]=byte ((_aaba &0xff00)>>8);_ccge .Data [_gbfb +7]=byte (_aaba &0xff);return nil ;};func TstISymbol (t *_c .T ,scale ...int )*Bitmap {_beec ,_dgfc :=NewWithData (1,5,[]byte {0x80,0x80,0x80,0x80,0x80});_g .NoError (t ,_dgfc );return TstGetScaledSymbol (t ,_beec ,scale ...);};func (_bdaf *ClassedPoints )SortByY (){_bdaf ._daeg =_bdaf .ySortFunction ();_gc .Sort (_bdaf )};type Color int ;func _gdd (_cg *Bitmap ,_baag int )(*Bitmap ,error ){const _cfc ="\u0065x\u0070a\u006e\u0064\u0042\u0069\u006ea\u0072\u0079P\u006f\u0077\u0065\u0072\u0032";if _cg ==nil {return nil ,_e .Error (_cfc ,"\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");};if _baag ==1{return _acfb (nil ,_cg );};if _baag !=2&&_baag !=4&&_baag !=8{return nil ,_e .Error (_cfc ,"\u0066\u0061\u0063t\u006f\u0072\u0020\u006du\u0073\u0074\u0020\u0062\u0065\u0020\u0069n\u0020\u007b\u0032\u002c\u0034\u002c\u0038\u007d\u0020\u0072\u0061\u006e\u0067\u0065");};_gbg :=_baag *_cg .Width ;_def :=_baag *_cg .Height ;_fc :=New (_gbg ,_def );var _efa error ;switch _baag {case 2:_efa =_eb (_fc ,_cg );case 4:_efa =_de (_fc ,_cg );case 8:_efa =_bbg (_fc ,_cg );};if _efa !=nil {return nil ,_e .Wrap (_efa ,_cfc ,"");};return _fc ,nil ;};func _da ()(_ae [256]uint32 ){for _gfg :=0;_gfg < 256;_gfg ++{if _gfg &0x01!=0{_ae [_gfg ]|=0xf;};if _gfg &0x02!=0{_ae [_gfg ]|=0xf0;};if _gfg &0x04!=0{_ae [_gfg ]|=0xf00;};if _gfg &0x08!=0{_ae [_gfg ]|=0xf000;};if _gfg &0x10!=0{_ae [_gfg ]|=0xf0000;};if _gfg &0x20!=0{_ae [_gfg ]|=0xf00000;};if _gfg &0x40!=0{_ae [_gfg ]|=0xf000000;};if _gfg &0x80!=0{_ae [_gfg ]|=0xf0000000;};};return _ae ;};const (SelDontCare SelectionValue =iota ;SelHit ;SelMiss ;);func (_ade *Bitmap )Equals (s *Bitmap )bool {if len (_ade .Data )!=len (s .Data )||_ade .Width !=s .Width ||_ade .Height !=s .Height {return false ;};for _ccg :=0;_ccg < _ade .Height ;_ccg ++{_bcga :=_ccg *_ade .RowStride ;for _bfbd :=0;_bfbd < _ade .RowStride ;_bfbd ++{if _ade .Data [_bcga +_bfbd ]!=s .Data [_bcga +_bfbd ]{return false ;};};};return true ;};func _fbcf (_fcgd ,_fbeb *Bitmap ,_fgdb ,_cgcc int )(_egaa error ){const _ffcee ="\u0073e\u0065d\u0066\u0069\u006c\u006c\u0042i\u006e\u0061r\u0079\u004c\u006f\u0077\u0038";var (_cdcdd ,_dccb ,_bgfg ,_bagc int ;_eafa ,_feda ,_edbgg ,_bbaf ,_ffgf ,_ffgc ,_aeba ,_aabgd byte ;);for _cdcdd =0;_cdcdd < _fgdb ;_cdcdd ++{_bgfg =_cdcdd *_fcgd .RowStride ;_bagc =_cdcdd *_fbeb .RowStride ;for _dccb =0;_dccb < _cgcc ;_dccb ++{if _eafa ,_egaa =_fcgd .GetByte (_bgfg +_dccb );_egaa !=nil {return _e .Wrap (_egaa ,_ffcee ,"\u0067e\u0074 \u0073\u006f\u0075\u0072\u0063\u0065\u0020\u0062\u0079\u0074\u0065");};if _feda ,_egaa =_fbeb .GetByte (_bagc +_dccb );_egaa !=nil {return _e .Wrap (_egaa ,_ffcee ,"\u0067\u0065\u0074\u0020\u006d\u0061\u0073\u006b\u0020\u0062\u0079\u0074\u0065");};if _cdcdd > 0{if _edbgg ,_egaa =_fcgd .GetByte (_bgfg -_fcgd .RowStride +_dccb );_egaa !=nil {return _e .Wrap (_egaa ,_ffcee ,"\u0069\u0020\u003e\u0020\u0030\u0020\u0062\u0079\u0074\u0065");};_eafa |=_edbgg |(_edbgg <<1)|(_edbgg >>1);if _dccb > 0{if _aabgd ,_egaa =_fcgd .GetByte (_bgfg -_fcgd .RowStride +_dccb -1);_egaa !=nil {return _e .Wrap (_egaa ,_ffcee ,"\u0069\u0020\u003e\u00200 \u0026\u0026\u0020\u006a\u0020\u003e\u0020\u0030\u0020\u0062\u0079\u0074\u0065");};_eafa |=_aabgd <<7;};if _dccb < _cgcc -1{if _aabgd ,_egaa =_fcgd .GetByte (_bgfg -_fcgd .RowStride +_dccb +1);_egaa !=nil {return _e .Wrap (_egaa ,_ffcee ,"\u006a\u0020<\u0020\u0077\u0070l\u0020\u002d\u0020\u0031\u0020\u0062\u0079\u0074\u0065");};_eafa |=_aabgd >>7;};};if _dccb > 0{if _bbaf ,_egaa =_fcgd .GetByte (_bgfg +_dccb -1);_egaa !=nil {return _e .Wrap (_egaa ,_ffcee ,"\u006a\u0020\u003e \u0030");};_eafa |=_bbaf <<7;};_eafa &=_feda ;if _eafa ==0||^_eafa ==0{if _egaa =_fcgd .SetByte (_bgfg +_dccb ,_eafa );_egaa !=nil {return _e .Wrap (_egaa ,_ffcee ,"\u0073e\u0074t\u0069\u006e\u0067\u0020\u0065m\u0070\u0074y\u0020\u0062\u0079\u0074\u0065");};};for {_aeba =_eafa ;_eafa =(_eafa |(_eafa >>1)|(_eafa <<1))&_feda ;if (_eafa ^_aeba )==0{if _egaa =_fcgd .SetByte (_bgfg +_dccb ,_eafa );_egaa !=nil {return _e .Wrap (_egaa ,_ffcee ,"\u0073\u0065\u0074\u0074\u0069\u006e\u0067\u0020\u0070\u0072\u0065\u0076 \u0062\u0079\u0074\u0065");};break ;};};};};for _cdcdd =_fgdb -1;_cdcdd >=0;_cdcdd --{_bgfg =_cdcdd *_fcgd .RowStride ;_bagc =_cdcdd *_fbeb .RowStride ;for _dccb =_cgcc -1;_dccb >=0;_dccb --{if _eafa ,_egaa =_fcgd .GetByte (_bgfg +_dccb );_egaa !=nil {return _e .Wrap (_egaa ,_ffcee ,"\u0072\u0065\u0076er\u0073\u0065\u0020\u0067\u0065\u0074\u0020\u0073\u006f\u0075\u0072\u0063\u0065\u0020\u0062\u0079\u0074\u0065");};if _feda ,_egaa =_fbeb .GetByte (_bagc +_dccb );_egaa !=nil {return _e .Wrap (_egaa ,_ffcee ,"r\u0065\u0076\u0065\u0072se\u0020g\u0065\u0074\u0020\u006d\u0061s\u006b\u0020\u0062\u0079\u0074\u0065");};if _cdcdd < _fgdb -1{if _ffgf ,_egaa =_fcgd .GetByte (_bgfg +_fcgd .RowStride +_dccb );_egaa !=nil {return _e .Wrap (_egaa ,_ffcee ,"\u0069\u0020\u003c\u0020h\u0020\u002d\u0020\u0031\u0020\u002d\u003e\u0020\u0067\u0065t\u0020s\u006f\u0075\u0072\u0063\u0065\u0020\u0062y\u0074\u0065");};_eafa |=_ffgf |(_ffgf <<1)|_ffgf >>1;if _dccb > 0{if _aabgd ,_egaa =_fcgd .GetByte (_bgfg +_fcgd .RowStride +_dccb -1);_egaa !=nil {return _e .Wrap (_egaa ,_ffcee ,"\u0069\u0020\u003c h\u002d\u0031\u0020\u0026\u0020\u006a\u0020\u003e\u00200\u0020-\u003e \u0067e\u0074\u0020\u0073\u006f\u0075\u0072\u0063\u0065\u0020\u0062\u0079\u0074\u0065");};_eafa |=_aabgd <<7;};if _dccb < _cgcc -1{if _aabgd ,_egaa =_fcgd .GetByte (_bgfg +_fcgd .RowStride +_dccb +1);_egaa !=nil {return _e .Wrap (_egaa ,_ffcee ,"\u0069\u0020\u003c\u0020\u0068\u002d\u0031\u0020\u0026\u0026\u0020\u006a\u0020\u003c\u0077\u0070\u006c\u002d\u0031\u0020\u002d\u003e\u0020\u0067e\u0074\u0020\u0073\u006f\u0075r\u0063\u0065 \u0062\u0079\u0074\u0065");};_eafa |=_aabgd >>7;};};if _dccb < _cgcc -1{if _ffgc ,_egaa =_fcgd .GetByte (_bgfg +_dccb +1);_egaa !=nil {return _e .Wrap (_egaa ,_ffcee ,"\u006a\u0020<\u0020\u0077\u0070\u006c\u0020\u002d\u0031\u0020\u002d\u003e\u0020\u0067\u0065\u0074\u0020\u0073\u006f\u0075\u0072\u0063\u0065\u0020by\u0074\u0065");};_eafa |=_ffgc >>7;};_eafa &=_feda ;if _eafa ==0||(^_eafa )==0{if _egaa =_fcgd .SetByte (_bgfg +_dccb ,_eafa );_egaa !=nil {return _e .Wrap (_egaa ,_ffcee ,"\u0073e\u0074 \u006d\u0061\u0073\u006b\u0065\u0064\u0020\u0062\u0079\u0074\u0065");};};for {_aeba =_eafa ;_eafa =(_eafa |(_eafa >>1)|(_eafa <<1))&_feda ;if (_eafa ^_aeba )==0{if _egaa =_fcgd .SetByte (_bgfg +_dccb ,_eafa );_egaa !=nil {return _e .Wrap (_egaa ,_ffcee ,"r\u0065\u0076\u0065\u0072se\u0020s\u0065\u0074\u0020\u0070\u0072e\u0076\u0020\u0062\u0079\u0074\u0065");};break ;};};};};return nil ;};func (_dbge *ClassedPoints )SortByX (){_dbge ._daeg =_dbge .xSortFunction ();_gc .Sort (_dbge )};func _bgc (_bdg *Bitmap ,_aec int ,_ebf []byte )(_eda *Bitmap ,_gdga error ){const _ecag ="\u0072\u0065\u0064\u0075\u0063\u0065\u0052\u0061\u006e\u006b\u0042\u0069n\u0061\u0072\u0079\u0032";if _bdg ==nil {return nil ,_e .Error (_ecag ,"\u0073o\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061p\u0020n\u006ft\u0020\u0064\u0065\u0066\u0069\u006e\u0065d");};if _aec < 1||_aec > 4{return nil ,_e .Error (_ecag ,"\u006c\u0065\u0076\u0065\u006c\u0020\u006d\u0075\u0073\u0074 \u0062\u0065\u0020\u0069\u006e\u0020\u0073e\u0074\u0020\u007b\u0031\u002c\u0032\u002c\u0033\u002c\u0034\u007d");};if _bdg .Height <=1{return nil ,_e .Errorf (_ecag ,"\u0073o\u0075\u0072c\u0065\u0020\u0068e\u0069\u0067\u0068\u0074\u0020\u006d\u0075s\u0074\u0020\u0062\u0065\u0020\u0061t\u0020\u006c\u0065\u0061\u0073\u0074\u0020\u0027\u0032\u0027\u0020-\u0020\u0069\u0073\u003a\u0020\u0027\u0025\u0064\u0027",_bdg .Height );};_eda =New (_bdg .Width /2,_bdg .Height /2);if _ebf ==nil {_ebf =_abfc ();};_aeg :=_cegcb (_bdg .RowStride ,2*_eda .RowStride );switch _aec {case 1:_gdga =_adc (_bdg ,_eda ,_aec ,_ebf ,_aeg );case 2:_gdga =_ffc (_bdg ,_eda ,_aec ,_ebf ,_aeg );case 3:_gdga =_edb (_bdg ,_eda ,_aec ,_ebf ,_aeg );case 4:_gdga =_gbb (_bdg ,_eda ,_aec ,_ebf ,_aeg );};if _gdga !=nil {return nil ,_gdga ;};return _eda ,nil ;};func (_efg *Boxes )selectWithIndicator (_bacg *_b .NumSlice )(_cedb *Boxes ,_cebf error ){const _bgab ="\u0042o\u0078\u0065\u0073\u002es\u0065\u006c\u0065\u0063\u0074W\u0069t\u0068I\u006e\u0064\u0069\u0063\u0061\u0074\u006fr";if _efg ==nil {return nil ,_e .Error (_bgab ,"b\u006f\u0078\u0065\u0073 '\u0062'\u0020\u006e\u006f\u0074\u0020d\u0065\u0066\u0069\u006e\u0065\u0064");};if _bacg ==nil {return nil ,_e .Error (_bgab ,"\u0027\u006ea\u0027\u0020\u006eo\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");};if len (*_bacg )!=len (*_efg ){return nil ,_e .Error (_bgab ,"\u0062\u006f\u0078\u0065\u0073\u0020\u0027\u0062\u0027\u0020\u0068\u0061\u0073\u0020\u0064\u0069\u0066\u0066\u0065\u0072\u0065\u006e\u0074\u0020s\u0069\u007a\u0065\u0020\u0074h\u0061\u006e \u0027\u006e\u0061\u0027");};var _feddc ,_caaf int ;for _afffe :=0;_afffe < len (*_bacg );_afffe ++{if _feddc ,_cebf =_bacg .GetInt (_afffe );_cebf !=nil {return nil ,_e .Wrap (_cebf ,_bgab ,"\u0063\u0068\u0065\u0063\u006b\u0069\u006e\u0067\u0020c\u006f\u0075\u006e\u0074");};if _feddc ==1{_caaf ++;};};if _caaf ==len (*_efg ){return _efg ,nil ;};_gbfbb :=Boxes {};for _bccd :=0;_bccd < len (*_bacg );_bccd ++{_feddc =int ((*_bacg )[_bccd ]);if _feddc ==0{continue ;};_gbfbb =append (_gbfbb ,(*_efg )[_bccd ]);};_cedb =&_gbfbb ;return _cedb ,nil ;};var _ _gc .Interface =&ClassedPoints {};func (_fedeed *Bitmaps )WidthSorter ()func (_gabea ,_abad int )bool {return func (_fggdf ,_bagb int )bool {return _fedeed .Values [_fggdf ].Width < _fedeed .Values [_bagb ].Width };};func (_efacf *Bitmaps )makeSizeIndicator (_cbfdg ,_ddfa int ,_egdec LocationFilter ,_aebc SizeComparison )(_efga *_b .NumSlice ,_efca error ){const _agab ="\u0042i\u0074\u006d\u0061\u0070s\u002e\u006d\u0061\u006b\u0065S\u0069z\u0065I\u006e\u0064\u0069\u0063\u0061\u0074\u006fr";if _efacf ==nil {return nil ,_e .Error (_agab ,"\u0062\u0069\u0074ma\u0070\u0073\u0020\u0027\u0062\u0027\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");};switch _egdec {case LocSelectWidth ,LocSelectHeight ,LocSelectIfEither ,LocSelectIfBoth :default:return nil ,_e .Errorf (_agab ,"\u0070\u0072\u006f\u0076\u0069d\u0065\u0064\u0020\u0069\u006e\u0076\u0061\u006c\u0069\u0064\u0020\u006c\u006fc\u0061\u0074\u0069\u006f\u006e\u0020\u0066\u0069\u006c\u0074\u0065\u0072\u0020\u0074\u0079\u0070\u0065\u003a\u0020\u0025\u0064",_egdec );};switch _aebc {case SizeSelectIfLT ,SizeSelectIfGT ,SizeSelectIfLTE ,SizeSelectIfGTE ,SizeSelectIfEQ :default:return nil ,_e .Errorf (_agab ,"\u0069\u006e\u0076\u0061li\u0064\u0020\u0072\u0065\u006c\u0061\u0074\u0069\u006f\u006e\u003a\u0020\u0027\u0025d\u0027",_aebc );};_efga =&_b .NumSlice {};var (_acaa ,_eacg ,_acbdb int ;_ccff *Bitmap ;);for _ ,_ccff =range _efacf .Values {_acaa =0;_eacg ,_acbdb =_ccff .Width ,_ccff .Height ;switch _egdec {case LocSelectWidth :if (_aebc ==SizeSelectIfLT &&_eacg < _cbfdg )||(_aebc ==SizeSelectIfGT &&_eacg > _cbfdg )||(_aebc ==SizeSelectIfLTE &&_eacg <=_cbfdg )||(_aebc ==SizeSelectIfGTE &&_eacg >=_cbfdg )||(_aebc ==SizeSelectIfEQ &&_eacg ==_cbfdg ){_acaa =1;};case LocSelectHeight :if (_aebc ==SizeSelectIfLT &&_acbdb < _ddfa )||(_aebc ==SizeSelectIfGT &&_acbdb > _ddfa )||(_aebc ==SizeSelectIfLTE &&_acbdb <=_ddfa )||(_aebc ==SizeSelectIfGTE &&_acbdb >=_ddfa )||(_aebc ==SizeSelectIfEQ &&_acbdb ==_ddfa ){_acaa =1;};case LocSelectIfEither :if (_aebc ==SizeSelectIfLT &&(_eacg < _cbfdg ||_acbdb < _ddfa ))||(_aebc ==SizeSelectIfGT &&(_eacg > _cbfdg ||_acbdb > _ddfa ))||(_aebc ==SizeSelectIfLTE &&(_eacg <=_cbfdg ||_acbdb <=_ddfa ))||(_aebc ==SizeSelectIfGTE &&(_eacg >=_cbfdg ||_acbdb >=_ddfa ))||(_aebc ==SizeSelectIfEQ &&(_eacg ==_cbfdg ||_acbdb ==_ddfa )){_acaa =1;};case LocSelectIfBoth :if (_aebc ==SizeSelectIfLT &&(_eacg < _cbfdg &&_acbdb < _ddfa ))||(_aebc ==SizeSelectIfGT &&(_eacg > _cbfdg &&_acbdb > _ddfa ))||(_aebc ==SizeSelectIfLTE &&(_eacg <=_cbfdg &&_acbdb <=_ddfa ))||(_aebc ==SizeSelectIfGTE &&(_eacg >=_cbfdg &&_acbdb >=_ddfa ))||(_aebc ==SizeSelectIfEQ &&(_eacg ==_cbfdg &&_acbdb ==_ddfa )){_acaa =1;};};_efga .AddInt (_acaa );};return _efga ,nil ;};func (_cfdb *byHeight )Len ()int {return len (_cfdb .Values )};func _bfdeg (_ggad *Bitmap ,_gcgda ,_edgb ,_dddb ,_afcab int ,_bdgba RasterOperator ,_cggc *Bitmap ,_gffgd ,_ggcfb int )error {var (_bedcf bool ;_bcgc bool ;_faeb byte ;_bgbgb int ;_eebda int ;_abge int ;_egdg int ;_bade bool ;_gdeg int ;_dadg int ;_agdb int ;_cfbf bool ;_gbfgc byte ;_fgddf int ;_bdda int ;_cefg int ;_edea byte ;_fgdf int ;_bgd int ;_eabcc uint ;_daegb uint ;_fbbae byte ;_egfe shift ;_baagg bool ;_ege bool ;_fgde ,_eaaa int ;);if _gffgd &7!=0{_bgd =8-(_gffgd &7);};if _gcgda &7!=0{_eebda =8-(_gcgda &7);};if _bgd ==0&&_eebda ==0{_fbbae =_ggagc [0];}else {if _eebda > _bgd {_eabcc =uint (_eebda -_bgd );}else {_eabcc =uint (8-(_bgd -_eebda ));};_daegb =8-_eabcc ;_fbbae =_ggagc [_eabcc ];};if (_gcgda &7)!=0{_bedcf =true ;_bgbgb =8-(_gcgda &7);_faeb =_ggagc [_bgbgb ];_abge =_ggad .RowStride *_edgb +(_gcgda >>3);_egdg =_cggc .RowStride *_ggcfb +(_gffgd >>3);_fgdf =8-(_gffgd &7);if _bgbgb > _fgdf {_egfe =_bfabba ;if _dddb >=_bgd {_baagg =true ;};}else {_egfe =_adge ;};};if _dddb < _bgbgb {_bcgc =true ;_faeb &=_agbg [8-_bgbgb +_dddb ];};if !_bcgc {_gdeg =(_dddb -_bgbgb )>>3;if _gdeg !=0{_bade =true ;_dadg =_ggad .RowStride *_edgb +((_gcgda +_eebda )>>3);_agdb =_cggc .RowStride *_ggcfb +((_gffgd +_eebda )>>3);};};_fgddf =(_gcgda +_dddb )&7;if !(_bcgc ||_fgddf ==0){_cfbf =true ;_gbfgc =_agbg [_fgddf ];_bdda =_ggad .RowStride *_edgb +((_gcgda +_eebda )>>3)+_gdeg ;_cefg =_cggc .RowStride *_ggcfb +((_gffgd +_eebda )>>3)+_gdeg ;if _fgddf > int (_daegb ){_ege =true ;};};switch _bdgba {case PixSrc :if _bedcf {for _fgde =0;_fgde < _afcab ;_fgde ++{if _egfe ==_bfabba {_edea =_cggc .Data [_egdg ]<<_eabcc ;if _baagg {_edea =_gaeca (_edea ,_cggc .Data [_egdg +1]>>_daegb ,_fbbae );};}else {_edea =_cggc .Data [_egdg ]>>_daegb ;};_ggad .Data [_abge ]=_gaeca (_ggad .Data [_abge ],_edea ,_faeb );_abge +=_ggad .RowStride ;_egdg +=_cggc .RowStride ;};};if _bade {for _fgde =0;_fgde < _afcab ;_fgde ++{for _eaaa =0;_eaaa < _gdeg ;_eaaa ++{_edea =_gaeca (_cggc .Data [_agdb +_eaaa ]<<_eabcc ,_cggc .Data [_agdb +_eaaa +1]>>_daegb ,_fbbae );_ggad .Data [_dadg +_eaaa ]=_edea ;};_dadg +=_ggad .RowStride ;_agdb +=_cggc .RowStride ;};};if _cfbf {for _fgde =0;_fgde < _afcab ;_fgde ++{_edea =_cggc .Data [_cefg ]<<_eabcc ;if _ege {_edea =_gaeca (_edea ,_cggc .Data [_cefg +1]>>_daegb ,_fbbae );};_ggad .Data [_bdda ]=_gaeca (_ggad .Data [_bdda ],_edea ,_gbfgc );_bdda +=_ggad .RowStride ;_cefg +=_cggc .RowStride ;};};case PixNotSrc :if _bedcf {for _fgde =0;_fgde < _afcab ;_fgde ++{if _egfe ==_bfabba {_edea =_cggc .Data [_egdg ]<<_eabcc ;if _baagg {_edea =_gaeca (_edea ,_cggc .Data [_egdg +1]>>_daegb ,_fbbae );};}else {_edea =_cggc .Data [_egdg ]>>_daegb ;};_ggad .Data [_abge ]=_gaeca (_ggad .Data [_abge ],^_edea ,_faeb );_abge +=_ggad .RowStride ;_egdg +=_cggc .RowStride ;};};if _bade {for _fgde =0;_fgde < _afcab ;_fgde ++{for _eaaa =0;_eaaa < _gdeg ;_eaaa ++{_edea =_gaeca (_cggc .Data [_agdb +_eaaa ]<<_eabcc ,_cggc .Data [_agdb +_eaaa +1]>>_daegb ,_fbbae );_ggad .Data [_dadg +_eaaa ]=^_edea ;};_dadg +=_ggad .RowStride ;_agdb +=_cggc .RowStride ;};};if _cfbf {for _fgde =0;_fgde < _afcab ;_fgde ++{_edea =_cggc .Data [_cefg ]<<_eabcc ;if _ege {_edea =_gaeca (_edea ,_cggc .Data [_cefg +1]>>_daegb ,_fbbae );};_ggad .Data [_bdda ]=_gaeca (_ggad .Data [_bdda ],^_edea ,_gbfgc );_bdda +=_ggad .RowStride ;_cefg +=_cggc .RowStride ;};};case PixSrcOrDst :if _bedcf {for _fgde =0;_fgde < _afcab ;_fgde ++{if _egfe ==_bfabba {_edea =_cggc .Data [_egdg ]<<_eabcc ;if _baagg {_edea =_gaeca (_edea ,_cggc .Data [_egdg +1]>>_daegb ,_fbbae );};}else {_edea =_cggc .Data [_egdg ]>>_daegb ;};_ggad .Data [_abge ]=_gaeca (_ggad .Data [_abge ],_edea |_ggad .Data [_abge ],_faeb );_abge +=_ggad .RowStride ;_egdg +=_cggc .RowStride ;};};if _bade {for _fgde =0;_fgde < _afcab ;_fgde ++{for _eaaa =0;_eaaa < _gdeg ;_eaaa ++{_edea =_gaeca (_cggc .Data [_agdb +_eaaa ]<<_eabcc ,_cggc .Data [_agdb +_eaaa +1]>>_daegb ,_fbbae );_ggad .Data [_dadg +_eaaa ]|=_edea ;};_dadg +=_ggad .RowStride ;_agdb +=_cggc .RowStride ;};};if _cfbf {for _fgde =0;_fgde < _afcab ;_fgde ++{_edea =_cggc .Data [_cefg ]<<_eabcc ;if _ege {_edea =_gaeca (_edea ,_cggc .Data [_cefg +1]>>_daegb ,_fbbae );};_ggad .Data [_bdda ]=_gaeca (_ggad .Data [_bdda ],_edea |_ggad .Data [_bdda ],_gbfgc );_bdda +=_ggad .RowStride ;_cefg +=_cggc .RowStride ;};};case PixSrcAndDst :if _bedcf {for _fgde =0;_fgde < _afcab ;_fgde ++{if _egfe ==_bfabba {_edea =_cggc .Data [_egdg ]<<_eabcc ;if _baagg {_edea =_gaeca (_edea ,_cggc .Data [_egdg +1]>>_daegb ,_fbbae );};}else {_edea =_cggc .Data [_egdg ]>>_daegb ;};_ggad .Data [_abge ]=_gaeca (_ggad .Data [_abge ],_edea &_ggad .Data [_abge ],_faeb );_abge +=_ggad .RowStride ;_egdg +=_cggc .RowStride ;};};if _bade {for _fgde =0;_fgde < _afcab ;_fgde ++{for _eaaa =0;_eaaa < _gdeg ;_eaaa ++{_edea =_gaeca (_cggc .Data [_agdb +_eaaa ]<<_eabcc ,_cggc .Data [_agdb +_eaaa +1]>>_daegb ,_fbbae );_ggad .Data [_dadg +_eaaa ]&=_edea ;};_dadg +=_ggad .RowStride ;_agdb +=_cggc .RowStride ;};};if _cfbf {for _fgde =0;_fgde < _afcab ;_fgde ++{_edea =_cggc .Data [_cefg ]<<_eabcc ;if _ege {_edea =_gaeca (_edea ,_cggc .Data [_cefg +1]>>_daegb ,_fbbae );};_ggad .Data [_bdda ]=_gaeca (_ggad .Data [_bdda ],_edea &_ggad .Data [_bdda ],_gbfgc );_bdda +=_ggad .RowStride ;_cefg +=_cggc .RowStride ;};};case PixSrcXorDst :if _bedcf {for _fgde =0;_fgde < _afcab ;_fgde ++{if _egfe ==_bfabba {_edea =_cggc .Data [_egdg ]<<_eabcc ;if _baagg {_edea =_gaeca (_edea ,_cggc .Data [_egdg +1]>>_daegb ,_fbbae );};}else {_edea =_cggc .Data [_egdg ]>>_daegb ;};_ggad .Data [_abge ]=_gaeca (_ggad .Data [_abge ],_edea ^_ggad .Data [_abge ],_faeb );_abge +=_ggad .RowStride ;_egdg +=_cggc .RowStride ;};};if _bade {for _fgde =0;_fgde < _afcab ;_fgde ++{for _eaaa =0;_eaaa < _gdeg ;_eaaa ++{_edea =_gaeca (_cggc .Data [_agdb +_eaaa ]<<_eabcc ,_cggc .Data [_agdb +_eaaa +1]>>_daegb ,_fbbae );_ggad .Data [_dadg +_eaaa ]^=_edea ;};_dadg +=_ggad .RowStride ;_agdb +=_cggc .RowStride ;};};if _cfbf {for _fgde =0;_fgde < _afcab ;_fgde ++{_edea =_cggc .Data [_cefg ]<<_eabcc ;if _ege {_edea =_gaeca (_edea ,_cggc .Data [_cefg +1]>>_daegb ,_fbbae );};_ggad .Data [_bdda ]=_gaeca (_ggad .Data [_bdda ],_edea ^_ggad .Data [_bdda ],_gbfgc );_bdda +=_ggad .RowStride ;_cefg +=_cggc .RowStride ;};};case PixNotSrcOrDst :if _bedcf {for _fgde =0;_fgde < _afcab ;_fgde ++{if _egfe ==_bfabba {_edea =_cggc .Data [_egdg ]<<_eabcc ;if _baagg {_edea =_gaeca (_edea ,_cggc .Data [_egdg +1]>>_daegb ,_fbbae );};}else {_edea =_cggc .Data [_egdg ]>>_daegb ;};_ggad .Data [_abge ]=_gaeca (_ggad .Data [_abge ],^_edea |_ggad .Data [_abge ],_faeb );_abge +=_ggad .RowStride ;_egdg +=_cggc .RowStride ;};};if _bade {for _fgde =0;_fgde < _afcab ;_fgde ++{for _eaaa =0;_eaaa < _gdeg ;_eaaa ++{_edea =_gaeca (_cggc .Data [_agdb +_eaaa ]<<_eabcc ,_cggc .Data [_agdb +_eaaa +1]>>_daegb ,_fbbae );_ggad .Data [_dadg +_eaaa ]|=^_edea ;};_dadg +=_ggad .RowStride ;_agdb +=_cggc .RowStride ;};};if _cfbf {for _fgde =0;_fgde < _afcab ;_fgde ++{_edea =_cggc .Data [_cefg ]<<_eabcc ;if _ege {_edea =_gaeca (_edea ,_cggc .Data [_cefg +1]>>_daegb ,_fbbae );};_ggad .Data [_bdda ]=_gaeca (_ggad .Data [_bdda ],^_edea |_ggad .Data [_bdda ],_gbfgc );_bdda +=_ggad .RowStride ;_cefg +=_cggc .RowStride ;};};case PixNotSrcAndDst :if _bedcf {for _fgde =0;_fgde < _afcab ;_fgde ++{if _egfe ==_bfabba {_edea =_cggc .Data [_egdg ]<<_eabcc ;if _baagg {_edea =_gaeca (_edea ,_cggc .Data [_egdg +1]>>_daegb ,_fbbae );};}else {_edea =_cggc .Data [_egdg ]>>_daegb ;};_ggad .Data [_abge ]=_gaeca (_ggad .Data [_abge ],^_edea &_ggad .Data [_abge ],_faeb );_abge +=_ggad .RowStride ;_egdg +=_cggc .RowStride ;};};if _bade {for _fgde =0;_fgde < _afcab ;_fgde ++{for _eaaa =0;_eaaa < _gdeg ;_eaaa ++{_edea =_gaeca (_cggc .Data [_agdb +_eaaa ]<<_eabcc ,_cggc .Data [_agdb +_eaaa +1]>>_daegb ,_fbbae );_ggad .Data [_dadg +_eaaa ]&=^_edea ;};_dadg +=_ggad .RowStride ;_agdb +=_cggc .RowStride ;};};if _cfbf {for _fgde =0;_fgde < _afcab ;_fgde ++{_edea =_cggc .Data [_cefg ]<<_eabcc ;if _ege {_edea =_gaeca (_edea ,_cggc .Data [_cefg +1]>>_daegb ,_fbbae );};_ggad .Data [_bdda ]=_gaeca (_ggad .Data [_bdda ],^_edea &_ggad .Data [_bdda ],_gbfgc );_bdda +=_ggad .RowStride ;_cefg +=_cggc .RowStride ;};};case PixSrcOrNotDst :if _bedcf {for _fgde =0;_fgde < _afcab ;_fgde ++{if _egfe ==_bfabba {_edea =_cggc .Data [_egdg ]<<_eabcc ;if _baagg {_edea =_gaeca (_edea ,_cggc .Data [_egdg +1]>>_daegb ,_fbbae );};}else {_edea =_cggc .Data [_egdg ]>>_daegb ;};_ggad .Data [_abge ]=_gaeca (_ggad .Data [_abge ],_edea |^_ggad .Data [_abge ],_faeb );_abge +=_ggad .RowStride ;_egdg +=_cggc .RowStride ;};};if _bade {for _fgde =0;_fgde < _afcab ;_fgde ++{for _eaaa =0;_eaaa < _gdeg ;_eaaa ++{_edea =_gaeca (_cggc .Data [_agdb +_eaaa ]<<_eabcc ,_cggc .Data [_agdb +_eaaa +1]>>_daegb ,_fbbae );_ggad .Data [_dadg +_eaaa ]=_edea |^_ggad .Data [_dadg +_eaaa ];};_dadg +=_ggad .RowStride ;_agdb +=_cggc .RowStride ;};};if _cfbf {for _fgde =0;_fgde < _afcab ;_fgde ++{_edea =_cggc .Data [_cefg ]<<_eabcc ;if _ege {_edea =_gaeca (_edea ,_cggc .Data [_cefg +1]>>_daegb ,_fbbae );};_ggad .Data [_bdda ]=_gaeca (_ggad .Data [_bdda ],_edea |^_ggad .Data [_bdda ],_gbfgc );_bdda +=_ggad .RowStride ;_cefg +=_cggc .RowStride ;};};case PixSrcAndNotDst :if _bedcf {for _fgde =0;_fgde < _afcab ;_fgde ++{if _egfe ==_bfabba {_edea =_cggc .Data [_egdg ]<<_eabcc ;if _baagg {_edea =_gaeca (_edea ,_cggc .Data [_egdg +1]>>_daegb ,_fbbae );};}else {_edea =_cggc .Data [_egdg ]>>_daegb ;};_ggad .Data [_abge ]=_gaeca (_ggad .Data [_abge ],_edea &^_ggad .Data [_abge ],_faeb );_abge +=_ggad .RowStride ;_egdg +=_cggc .RowStride ;};};if _bade {for _fgde =0;_fgde < _afcab ;_fgde ++{for _eaaa =0;_eaaa < _gdeg ;_eaaa ++{_edea =_gaeca (_cggc .Data [_agdb +_eaaa ]<<_eabcc ,_cggc .Data [_agdb +_eaaa +1]>>_daegb ,_fbbae );_ggad .Data [_dadg +_eaaa ]=_edea &^_ggad .Data [_dadg +_eaaa ];};_dadg +=_ggad .RowStride ;_agdb +=_cggc .RowStride ;};};if _cfbf {for _fgde =0;_fgde < _afcab ;_fgde ++{_edea =_cggc .Data [_cefg ]<<_eabcc ;if _ege {_edea =_gaeca (_edea ,_cggc .Data [_cefg +1]>>_daegb ,_fbbae );};_ggad .Data [_bdda ]=_gaeca (_ggad .Data [_bdda ],_edea &^_ggad .Data [_bdda ],_gbfgc );_bdda +=_ggad .RowStride ;_cefg +=_cggc .RowStride ;};};case PixNotPixSrcOrDst :if _bedcf {for _fgde =0;_fgde < _afcab ;_fgde ++{if _egfe ==_bfabba {_edea =_cggc .Data [_egdg ]<<_eabcc ;if _baagg {_edea =_gaeca (_edea ,_cggc .Data [_egdg +1]>>_daegb ,_fbbae );};}else {_edea =_cggc .Data [_egdg ]>>_daegb ;};_ggad .Data [_abge ]=_gaeca (_ggad .Data [_abge ],^(_edea |_ggad .Data [_abge ]),_faeb );_abge +=_ggad .RowStride ;_egdg +=_cggc .RowStride ;};};if _bade {for _fgde =0;_fgde < _afcab ;_fgde ++{for _eaaa =0;_eaaa < _gdeg ;_eaaa ++{_edea =_gaeca (_cggc .Data [_agdb +_eaaa ]<<_eabcc ,_cggc .Data [_agdb +_eaaa +1]>>_daegb ,_fbbae );_ggad .Data [_dadg +_eaaa ]=^(_edea |_ggad .Data [_dadg +_eaaa ]);};_dadg +=_ggad .RowStride ;_agdb +=_cggc .RowStride ;};};if _cfbf {for _fgde =0;_fgde < _afcab ;_fgde ++{_edea =_cggc .Data [_cefg ]<<_eabcc ;if _ege {_edea =_gaeca (_edea ,_cggc .Data [_cefg +1]>>_daegb ,_fbbae );};_ggad .Data [_bdda ]=_gaeca (_ggad .Data [_bdda ],^(_edea |_ggad .Data [_bdda ]),_gbfgc );_bdda +=_ggad .RowStride ;_cefg +=_cggc .RowStride ;};};case PixNotPixSrcAndDst :if _bedcf {for _fgde =0;_fgde < _afcab ;_fgde ++{if _egfe ==_bfabba {_edea =_cggc .Data [_egdg ]<<_eabcc ;if _baagg {_edea =_gaeca (_edea ,_cggc .Data [_egdg +1]>>_daegb ,_fbbae );};}else {_edea =_cggc .Data [_egdg ]>>_daegb ;};_ggad .Data [_abge ]=_gaeca (_ggad .Data [_abge ],^(_edea &_ggad .Data [_abge ]),_faeb );_abge +=_ggad .RowStride ;_egdg +=_cggc .RowStride ;};};if _bade {for _fgde =0;_fgde < _afcab ;_fgde ++{for _eaaa =0;_eaaa < _gdeg ;_eaaa ++{_edea =_gaeca (_cggc .Data [_agdb +_eaaa ]<<_eabcc ,_cggc .Data [_agdb +_eaaa +1]>>_daegb ,_fbbae );_ggad .Data [_dadg +_eaaa ]=^(_edea &_ggad .Data [_dadg +_eaaa ]);};_dadg +=_ggad .RowStride ;_agdb +=_cggc .RowStride ;};};if _cfbf {for _fgde =0;_fgde < _afcab ;_fgde ++{_edea =_cggc .Data [_cefg ]<<_eabcc ;if _ege {_edea =_gaeca (_edea ,_cggc .Data [_cefg +1]>>_daegb ,_fbbae );};_ggad .Data [_bdda ]=_gaeca (_ggad .Data [_bdda ],^(_edea &_ggad .Data [_bdda ]),_gbfgc );_bdda +=_ggad .RowStride ;_cefg +=_cggc .RowStride ;};};case PixNotPixSrcXorDst :if _bedcf {for _fgde =0;_fgde < _afcab ;_fgde ++{if _egfe ==_bfabba {_edea =_cggc .Data [_egdg ]<<_eabcc ;if _baagg {_edea =_gaeca (_edea ,_cggc .Data [_egdg +1]>>_daegb ,_fbbae );};}else {_edea =_cggc .Data [_egdg ]>>_daegb ;};_ggad .Data [_abge ]=_gaeca (_ggad .Data [_abge ],^(_edea ^_ggad .Data [_abge ]),_faeb );_abge +=_ggad .RowStride ;_egdg +=_cggc .RowStride ;};};if _bade {for _fgde =0;_fgde < _afcab ;_fgde ++{for _eaaa =0;_eaaa < _gdeg ;_eaaa ++{_edea =_gaeca (_cggc .Data [_agdb +_eaaa ]<<_eabcc ,_cggc .Data [_agdb +_eaaa +1]>>_daegb ,_fbbae );_ggad .Data [_dadg +_eaaa ]=^(_edea ^_ggad .Data [_dadg +_eaaa ]);};_dadg +=_ggad .RowStride ;_agdb +=_cggc .RowStride ;};};if _cfbf {for _fgde =0;_fgde < _afcab ;_fgde ++{_edea =_cggc .Data [_cefg ]<<_eabcc ;if _ege {_edea =_gaeca (_edea ,_cggc .Data [_cefg +1]>>_daegb ,_fbbae );};_ggad .Data [_bdda ]=_gaeca (_ggad .Data [_bdda ],^(_edea ^_ggad .Data [_bdda ]),_gbfgc );_bdda +=_ggad .RowStride ;_cefg +=_cggc .RowStride ;};};default:_bc .Log .Debug ("\u004f\u0070e\u0072\u0061\u0074\u0069\u006f\u006e\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006e\u006f\u0074\u0020\u0070\u0065\u0072\u006d\u0069tt\u0065\u0064",_bdgba );return _e .Error ("\u0072a\u0073t\u0065\u0072\u004f\u0070\u0047e\u006e\u0065r\u0061\u006c\u004c\u006f\u0077","\u0072\u0061\u0073\u0074\u0065\u0072\u0020\u006f\u0070\u0065r\u0061\u0074\u0069\u006f\u006e\u0020\u006eo\u0074\u0020\u0070\u0065\u0072\u006d\u0069\u0074\u0074\u0065\u0064");};return nil ;};func RankHausTest (p1 ,p2 ,p3 ,p4 *Bitmap ,delX ,delY float32 ,maxDiffW ,maxDiffH ,area1 ,area3 int ,rank float32 ,tab8 []int )(_gfac bool ,_gaadb error ){const _adcd ="\u0052\u0061\u006ek\u0048\u0061\u0075\u0073\u0054\u0065\u0073\u0074";_gcdd ,_fga :=p1 .Width ,p1 .Height ;_abee ,_aabd :=p3 .Width ,p3 .Height ;if _b .Abs (_gcdd -_abee )> maxDiffW {return false ,nil ;};if _b .Abs (_fga -_aabd )> maxDiffH {return false ,nil ;};_fdaf :=int (float32 (area1 )*(1.0-rank )+0.5);_fcdd :=int (float32 (area3 )*(1.0-rank )+0.5);var _feff ,_ggcf int ;if delX >=0{_feff =int (delX +0.5);}else {_feff =int (delX -0.5);};if delY >=0{_ggcf =int (delY +0.5);}else {_ggcf =int (delY -0.5);};_egca :=p1 .CreateTemplate ();if _gaadb =_egca .RasterOperation (0,0,_gcdd ,_fga ,PixSrc ,p1 ,0,0);_gaadb !=nil {return false ,_e .Wrap (_gaadb ,_adcd ,"p\u0031\u0020\u002d\u0053\u0052\u0043\u002d\u003e\u0020\u0074");};if _gaadb =_egca .RasterOperation (_feff ,_ggcf ,_gcdd ,_fga ,PixNotSrcAndDst ,p4 ,0,0);_gaadb !=nil {return false ,_e .Wrap (_gaadb ,_adcd ,"\u0074 \u0026\u0020\u0021\u0070\u0034");};_gfac ,_gaadb =_egca .ThresholdPixelSum (_fdaf ,tab8 );if _gaadb !=nil {return false ,_e .Wrap (_gaadb ,_adcd ,"\u0074\u002d\u003e\u0074\u0068\u0072\u0065\u0073\u0068\u0031");};if _gfac {return false ,nil ;};if _gaadb =_egca .RasterOperation (_feff ,_ggcf ,_abee ,_aabd ,PixSrc ,p3 ,0,0);_gaadb !=nil {return false ,_e .Wrap (_gaadb ,_adcd ,"p\u0033\u0020\u002d\u0053\u0052\u0043\u002d\u003e\u0020\u0074");};if _gaadb =_egca .RasterOperation (0,0,_abee ,_aabd ,PixNotSrcAndDst ,p2 ,0,0);_gaadb !=nil {return false ,_e .Wrap (_gaadb ,_adcd ,"\u0074 \u0026\u0020\u0021\u0070\u0032");};_gfac ,_gaadb =_egca .ThresholdPixelSum (_fcdd ,tab8 );if _gaadb !=nil {return false ,_e .Wrap (_gaadb ,_adcd ,"\u0074\u002d\u003e\u0074\u0068\u0072\u0065\u0073\u0068\u0033");};return !_gfac ,nil ;};func (_aeeg *Bitmaps )HeightSorter ()func (_dgeg ,_fdcbg int )bool {return func (_cgeda ,_cdff int )bool {_fadd :=_aeeg .Values [_cgeda ].Height < _aeeg .Values [_cdff ].Height ;_bc .Log .Debug ("H\u0065i\u0067\u0068\u0074\u003a\u0020\u0025\u0076\u0020<\u0020\u0025\u0076\u0020= \u0025\u0076",_aeeg .Values [_cgeda ].Height ,_aeeg .Values [_cdff ].Height ,_fadd );return _fadd ;};};func (_adce *Bitmaps )SortByWidth (){_cbgd :=(*byWidth )(_adce );_gc .Sort (_cbgd )};func Copy (d ,s *Bitmap )(*Bitmap ,error ){return _acfb (d ,s )};func _cbfd (_dbab ,_gada *Bitmap ,_eeagc ,_aeda int )(*Bitmap ,error ){const _gagab ="\u0065\u0072\u006f\u0064\u0065\u0042\u0072\u0069\u0063\u006b";if _gada ==nil {return nil ,_e .Error (_gagab ,"\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");};if _eeagc < 1||_aeda < 1{return nil ,_e .Error (_gagab ,"\u0068\u0073\u0069\u007a\u0065\u0020\u0061\u006e\u0064\u0020\u0076\u0073\u0069\u007a\u0065\u0020\u0061\u0072e\u0020\u006e\u006f\u0074\u0020\u0067\u0072e\u0061\u0074\u0065\u0072\u0020\u0074\u0068\u0061\u006e\u0020\u006fr\u0020\u0065\u0071\u0075\u0061\u006c\u0020\u0074\u006f\u0020\u0031");};if _eeagc ==1&&_aeda ==1{_gdceb ,_bbade :=_acfb (_dbab ,_gada );if _bbade !=nil {return nil ,_e .Wrap (_bbade ,_gagab ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u0026\u0026 \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");};return _gdceb ,nil ;};if _eeagc ==1||_aeda ==1{_egdde :=SelCreateBrick (_aeda ,_eeagc ,_aeda /2,_eeagc /2,SelHit );_fecb ,_dfac :=_gccg (_dbab ,_gada ,_egdde );if _dfac !=nil {return nil ,_e .Wrap (_dfac ,_gagab ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u007c\u007c \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");};return _fecb ,nil ;};_cbea :=SelCreateBrick (1,_eeagc ,0,_eeagc /2,SelHit );_acdd :=SelCreateBrick (_aeda ,1,_aeda /2,0,SelHit );_fdc ,_gege :=_gccg (nil ,_gada ,_cbea );if _gege !=nil {return nil ,_e .Wrap (_gege ,_gagab ,"\u0031s\u0074\u0020\u0065\u0072\u006f\u0064e");};_dbab ,_gege =_gccg (_dbab ,_fdc ,_acdd );if _gege !=nil {return nil ,_e .Wrap (_gege ,_gagab ,"\u0032n\u0064\u0020\u0065\u0072\u006f\u0064e");};return _dbab ,nil ;};func _fcebe (_dcga *Bitmap ,_fceg *_b .Stack ,_ggfb ,_ebcbe ,_ccaff int )(_fdbb *_ab .Rectangle ,_gdgb error ){const _cgge ="\u0073e\u0065d\u0046\u0069\u006c\u006c\u0053\u0074\u0061\u0063\u006b\u0042\u0042";if _dcga ==nil {return nil ,_e .Error (_cgge ,"\u0070\u0072\u006fvi\u0064\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0027\u0073\u0027\u0020\u0042\u0069\u0074\u006d\u0061\u0070");};if _fceg ==nil {return nil ,_e .Error (_cgge ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0027\u0073\u0074ac\u006b\u0027");};switch _ccaff {case 4:if _fdbb ,_gdgb =_affgb (_dcga ,_fceg ,_ggfb ,_ebcbe );_gdgb !=nil {return nil ,_e .Wrap (_gdgb ,_cgge ,"");};return _fdbb ,nil ;case 8:if _fdbb ,_gdgb =_adgfc (_dcga ,_fceg ,_ggfb ,_ebcbe );_gdgb !=nil {return nil ,_e .Wrap (_gdgb ,_cgge ,"");};return _fdbb ,nil ;default:return nil ,_e .Errorf (_cgge ,"\u0063\u006f\u006e\u006e\u0065\u0063\u0074\u0069\u0076\u0069\u0074\u0079\u0020\u0069\u0073 \u006eo\u0074\u0020\u0034\u0020\u006f\u0072\u0020\u0038\u003a\u0020\u0027\u0025\u0064\u0027",_ccaff );};};func (_eadb *Bitmap )SizesEqual (s *Bitmap )bool {if _eadb ==s {return true ;};if _eadb .Width !=s .Width ||_eadb .Height !=s .Height {return false ;};return true ;};func (_ecgf *Bitmap )setEightBytes (_ggc int ,_aag uint64 )error {_fceb :=_ecgf .RowStride -(_ggc %_ecgf .RowStride );if _ecgf .RowStride !=_ecgf .Width >>3{_fceb --;};if _fceb >=8{return _ecgf .setEightFullBytes (_ggc ,_aag );};return _ecgf .setEightPartlyBytes (_ggc ,_fceb ,_aag );};func _abfc ()(_cfce []byte ){_cfce =make ([]byte ,256);for _bda :=0;_bda < 256;_bda ++{_ega :=byte (_bda );_cfce [_ega ]=(_ega &0x01)|((_ega &0x04)>>1)|((_ega &0x10)>>2)|((_ega &0x40)>>3)|((_ega &0x02)<<3)|((_ega &0x08)<<2)|((_ega &0x20)<<1)|(_ega &0x80);};return _cfce ;};const (AsymmetricMorphBC BoundaryCondition =iota ;SymmetricMorphBC ;);func (_abda *byWidth )Less (i ,j int )bool {return _abda .Values [i ].Width < _abda .Values [j ].Width };func _aeac (_gbbf *Bitmap ,_cdea ...MorphProcess )(_aabg *Bitmap ,_eadab error ){const _cggb ="\u006d\u006f\u0072\u0070\u0068\u0053\u0065\u0071\u0075\u0065\u006e\u0063\u0065";if _gbbf ==nil {return nil ,_e .Error (_cggb ,"\u006d\u006f\u0072\u0070\u0068\u0053\u0065\u0071\u0075\u0065\u006e\u0063\u0065 \u0073\u006f\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061\u0070\u0020\u006e\u006f\u0074\u0020\u0064\u0065f\u0069\u006e\u0065\u0064");};if len (_cdea )==0{return nil ,_e .Error (_cggb ,"m\u006f\u0072\u0070\u0068\u0053\u0065q\u0075\u0065\u006e\u0063\u0065\u002c \u0073\u0065\u0071\u0075\u0065\u006e\u0063e\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006ee\u0064");};if _eadab =_dab (_cdea ...);_eadab !=nil {return nil ,_e .Wrap (_eadab ,_cggb ,"");};var _ccdg ,_dfg ,_ggdfc int ;_aabg =_gbbf .Copy ();for _ ,_fgae :=range _cdea {switch _fgae .Operation {case MopDilation :_ccdg ,_dfg =_fgae .getWidthHeight ();_aabg ,_eadab =DilateBrick (nil ,_aabg ,_ccdg ,_dfg );if _eadab !=nil {return nil ,_e .Wrap (_eadab ,_cggb ,"");};case MopErosion :_ccdg ,_dfg =_fgae .getWidthHeight ();_aabg ,_eadab =_cbfd (nil ,_aabg ,_ccdg ,_dfg );if _eadab !=nil {return nil ,_e .Wrap (_eadab ,_cggb ,"");};case MopOpening :_ccdg ,_dfg =_fgae .getWidthHeight ();_aabg ,_eadab =_bbf (nil ,_aabg ,_ccdg ,_dfg );if _eadab !=nil {return nil ,_e .Wrap (_eadab ,_cggb ,"");};case MopClosing :_ccdg ,_dfg =_fgae .getWidthHeight ();_aabg ,_eadab =_cdca (nil ,_aabg ,_ccdg ,_dfg );if _eadab !=nil {return nil ,_e .Wrap (_eadab ,_cggb ,"");};case MopRankBinaryReduction :_aabg ,_eadab =_dbf (_aabg ,_fgae .Arguments ...);if _eadab !=nil {return nil ,_e .Wrap (_eadab ,_cggb ,"");};case MopReplicativeBinaryExpansion :_aabg ,_eadab =_cacb (_aabg ,_fgae .Arguments [0]);if _eadab !=nil {return nil ,_e .Wrap (_eadab ,_cggb ,"");};case MopAddBorder :_ggdfc =_fgae .Arguments [0];_aabg ,_eadab =_aabg .AddBorder (_ggdfc ,0);if _eadab !=nil {return nil ,_e .Wrap (_eadab ,_cggb ,"");};default:return nil ,_e .Error (_cggb ,"i\u006e\u0076\u0061\u006c\u0069\u0064\u0020\u006d\u006fr\u0070\u0068\u004f\u0070\u0065\u0072\u0061ti\u006f\u006e\u0020\u0070r\u006f\u0076\u0069\u0064\u0065\u0064\u0020\u0074\u006f t\u0068\u0065 \u0073\u0065\u0071\u0075\u0065\u006e\u0063\u0065");};};if _ggdfc > 0{_aabg ,_eadab =_aabg .RemoveBorder (_ggdfc );if _eadab !=nil {return nil ,_e .Wrap (_eadab ,_cggb ,"\u0062\u006f\u0072\u0064\u0065\u0072\u0020\u003e\u0020\u0030");};};return _aabg ,nil ;};func _bdcgd (_edde *_b .Stack ,_ccdc ,_faaed ,_ffba ,_ebcd ,_bfdf int ,_gbafd *_ab .Rectangle )(_gdgee error ){const _cded ="\u0070\u0075\u0073\u0068\u0046\u0069\u006c\u006c\u0053\u0065\u0067m\u0065\u006e\u0074\u0042\u006f\u0075\u006e\u0064\u0069\u006eg\u0042\u006f\u0078";if _edde ==nil {return _e .Error (_cded ,"\u006ei\u006c \u0073\u0074\u0061\u0063\u006b \u0070\u0072o\u0076\u0069\u0064\u0065\u0064");};if _gbafd ==nil {return _e .Error (_cded ,"\u0070\u0072\u006f\u0076i\u0064\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0069\u006da\u0067e\u002e\u0052\u0065\u0063\u0074\u0061\u006eg\u006c\u0065");};_gbafd .Min .X =_b .Min (_gbafd .Min .X ,_ccdc );_gbafd .Max .X =_b .Max (_gbafd .Max .X ,_faaed );_gbafd .Min .Y =_b .Min (_gbafd .Min .Y ,_ffba );_gbafd .Max .Y =_b .Max (_gbafd .Max .Y ,_ffba );if !(_ffba +_ebcd >=0&&_ffba +_ebcd <=_bfdf ){return nil ;};if _edde .Aux ==nil {return _e .Error (_cded ,"a\u0075x\u0053\u0074\u0061\u0063\u006b\u0020\u006e\u006ft\u0020\u0064\u0065\u0066in\u0065\u0064");};var _cbfdd *fillSegment ;_edgge ,_eceec :=_edde .Aux .Pop ();if _eceec {if _cbfdd ,_eceec =_edgge .(*fillSegment );!_eceec {return _e .Error (_cded ,"a\u0075\u0078\u0053\u0074\u0061\u0063k\u0020\u0064\u0061\u0074\u0061\u0020i\u0073\u0020\u006e\u006f\u0074\u0020\u0061 \u002a\u0066\u0069\u006c\u006c\u0053\u0065\u0067\u006d\u0065n\u0074");};}else {_cbfdd =&fillSegment {};};_cbfdd ._ecead =_ccdc ;_cbfdd ._abed =_faaed ;_cbfdd ._afea =_ffba ;_cbfdd ._gfgf =_ebcd ;_edde .Push (_cbfdd );return nil ;};func (_cgffa *ClassedPoints )ySortFunction ()func (_cegcf int ,_bfbf int )bool {return func (_dccd ,_afef int )bool {return _cgffa .YAtIndex (_dccd )< _cgffa .YAtIndex (_afef )};};func (_bbbg *Bitmap )countPixels ()int {var (_bdec int ;_affd uint8 ;_ffec byte ;_bdab int ;);_adga :=_bbbg .RowStride ;_acf :=uint (_bbbg .Width &0x07);if _acf !=0{_affd =uint8 ((0xff<<(8-_acf ))&0xff);_adga --;};for _bcff :=0;_bcff < _bbbg .Height ;_bcff ++{for _bdab =0;_bdab < _adga ;_bdab ++{_ffec =_bbbg .Data [_bcff *_bbbg .RowStride +_bdab ];_bdec +=int (_edbg [_ffec ]);};if _acf !=0{_bdec +=int (_edbg [_bbbg .Data [_bcff *_bbbg .RowStride +_bdab ]&_affd ]);};};return _bdec ;};var _cfba =[]byte {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x78,0x27,0xC2,0x27,0x91,0x00,0x22,0x48,0x21,0x03,0x24,0x91,0x00,0x22,0x48,0x21,0x02,0xA4,0x95,0x00,0x22,0x48,0x21,0x02,0x64,0x9B,0x00,0x3C,0x78,0x21,0x02,0x27,0x91,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xF8,0x00,0x00,0x00,0x00,0x00,0x7F,0xF8,0x00,0x00,0x00,0x00,0x00,0x63,0x18,0x00,0x00,0x00,0x00,0x00,0x63,0x18,0x00,0x00,0x00,0x00,0x00,0x63,0x18,0x00,0x00,0x00,0x00,0x00,0x7F,0xF8,0x00,0x00,0x00,0x00,0x00,0x15,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};func TstFrameBitmap ()*Bitmap {return _aedd .Copy ()};type byWidth Bitmaps ;func (_ged *Bitmaps )String ()string {_beda :=_ec .Builder {};for _ ,_cbdae :=range _ged .Values {_beda .WriteString (_cbdae .String ());_beda .WriteRune ('\n');};return _beda .String ();};func (_eaee *Bitmap )ToImage ()_ab .Image {_fbba ,_ffdf :=_ac .NewImage (_eaee .Width ,_eaee .Height ,1,1,_eaee .Data ,nil ,nil );if _ffdf !=nil {_bc .Log .Error ("\u0043\u006f\u006e\u0076\u0065\u0072\u0074\u0069\u006e\u0067\u0020j\u0062\u0069\u0067\u0032\u002e\u0042\u0069\u0074m\u0061p\u0020\u0074\u006f\u0020\u0069\u006d\u0061\u0067\u0065\u0075\u0074\u0069\u006c\u002e\u0049\u006d\u0061\u0067e\u0020\u0066\u0061\u0069\u006c\u0065\u0064\u003a\u0020\u0025\u0076",_ffdf );};return _fbba ;};func _edb (_fcb ,_cgg *Bitmap ,_ecc int ,_bec []byte ,_age int )(_bcde error ){const _bad ="\u0072\u0065\u0064uc\u0065\u0052\u0061\u006e\u006b\u0042\u0069\u006e\u0061\u0072\u0079\u0032\u004c\u0065\u0076\u0065\u006c\u0033";var (_gda ,_cdd ,_cbb ,_ddb ,_gag ,_add ,_abc ,_fef int ;_cddb ,_adaf ,_cgbe ,_agec uint32 ;_fce ,_cdb byte ;_fbc uint16 ;);_edae :=make ([]byte ,4);_cae :=make ([]byte ,4);for _cbb =0;_cbb < _fcb .Height -1;_cbb ,_ddb =_cbb +2,_ddb +1{_gda =_cbb *_fcb .RowStride ;_cdd =_ddb *_cgg .RowStride ;for _gag ,_add =0,0;_gag < _age ;_gag ,_add =_gag +4,_add +1{for _abc =0;_abc < 4;_abc ++{_fef =_gda +_gag +_abc ;if _fef <=len (_fcb .Data )-1&&_fef < _gda +_fcb .RowStride {_edae [_abc ]=_fcb .Data [_fef ];}else {_edae [_abc ]=0x00;};_fef =_gda +_fcb .RowStride +_gag +_abc ;if _fef <=len (_fcb .Data )-1&&_fef < _gda +(2*_fcb .RowStride ){_cae [_abc ]=_fcb .Data [_fef ];}else {_cae [_abc ]=0x00;};};_cddb =_d .BigEndian .Uint32 (_edae );_adaf =_d .BigEndian .Uint32 (_cae );_cgbe =_cddb &_adaf ;_cgbe |=_cgbe <<1;_agec =_cddb |_adaf ;_agec &=_agec <<1;_adaf =_cgbe &_agec ;_adaf &=0xaaaaaaaa;_cddb =_adaf |(_adaf <<7);_fce =byte (_cddb >>24);_cdb =byte ((_cddb >>8)&0xff);_fef =_cdd +_add ;if _fef +1==len (_cgg .Data )-1||_fef +1>=_cdd +_cgg .RowStride {if _bcde =_cgg .SetByte (_fef ,_bec [_fce ]);_bcde !=nil {return _e .Wrapf (_bcde ,_bad ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0025d",_fef );};}else {_fbc =(uint16 (_bec [_fce ])<<8)|uint16 (_bec [_cdb ]);if _bcde =_cgg .setTwoBytes (_fef ,_fbc );_bcde !=nil {return _e .Wrapf (_bcde ,_bad ,"s\u0065\u0074\u0074\u0069\u006e\u0067 \u0074\u0077\u006f\u0020\u0062\u0079t\u0065\u0073\u0020\u0066\u0061\u0069\u006ce\u0064\u002c\u0020\u0069\u006e\u0064\u0065\u0078\u003a\u0020%\u0064",_fef );};_add ++;};};};return nil ;};func _bbd (_ceb *Bitmap ,_bag ,_abb int )(*Bitmap ,error ){const _dcbb ="e\u0078\u0070\u0061\u006edB\u0069n\u0061\u0072\u0079\u0052\u0065p\u006c\u0069\u0063\u0061\u0074\u0065";if _ceb ==nil {return nil ,_e .Error (_dcbb ,"\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");};if _bag <=0||_abb <=0{return nil ,_e .Error (_dcbb ,"\u0069\u006e\u0076\u0061\u006c\u0069\u0064\u0020\u0073\u0063\u0061l\u0065\u0020\u0066\u0061\u0063\u0074\u006f\u0072\u003a\u0020<\u003d\u0020\u0030");};if _bag ==_abb {if _bag ==1{_gdc ,_fb :=_acfb (nil ,_ceb );if _fb !=nil {return nil ,_e .Wrap (_fb ,_dcbb ,"\u0078\u0046\u0061\u0063\u0074\u0020\u003d\u003d\u0020y\u0046\u0061\u0063\u0074");};return _gdc ,nil ;};if _bag ==2||_bag ==4||_bag ==8{_gba ,_dd :=_gdd (_ceb ,_bag );if _dd !=nil {return nil ,_e .Wrap (_dd ,_dcbb ,"\u0078\u0046a\u0063\u0074\u0020i\u006e\u0020\u007b\u0032\u002c\u0034\u002c\u0038\u007d");};return _gba ,nil ;};};_dff :=_bag *_ceb .Width ;_dfcc :=_abb *_ceb .Height ;_bcf :=New (_dff ,_dfcc );_bg :=_bcf .RowStride ;var (_dcbbc ,_ag ,_adb ,_efb ,_edc int ;_efd byte ;_baae error ;);for _ag =0;_ag < _ceb .Height ;_ag ++{_dcbbc =_abb *_ag *_bg ;for _adb =0;_adb < _ceb .Width ;_adb ++{if _bdf :=_ceb .GetPixel (_adb ,_ag );_bdf {_edc =_bag *_adb ;for _efb =0;_efb < _bag ;_efb ++{_bcf .setBit (_dcbbc *8+_edc +_efb );};};};for _efb =1;_efb < _abb ;_efb ++{_fcc :=_dcbbc +_efb *_bg ;for _gf :=0;_gf < _bg ;_gf ++{if _efd ,_baae =_bcf .GetByte (_dcbbc +_gf );_baae !=nil {return nil ,_e .Wrapf (_baae ,_dcbb ,"\u0072\u0065\u0070\u006cic\u0061\u0074\u0069\u006e\u0067\u0020\u006c\u0069\u006e\u0065\u003a\u0020\u0027\u0025d\u0027",_efb );};if _baae =_bcf .SetByte (_fcc +_gf ,_efd );_baae !=nil {return nil ,_e .Wrap (_baae ,_dcbb ,"\u0053\u0065\u0074\u0074in\u0067\u0020\u0062\u0079\u0074\u0065\u0020\u0066\u0061\u0069\u006c\u0065\u0064");};};};};return _bcf ,nil ;};func (_ecce *Bitmap )GetByte (index int )(byte ,error ){if index > len (_ecce .Data )-1||index < 0{return 0,_e .Errorf ("\u0047e\u0074\u0042\u0079\u0074\u0065","\u0069\u006e\u0064\u0065x:\u0020\u0025\u0064\u0020\u006f\u0075\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006eg\u0065",index );};return _ecce .Data [index ],nil ;};func (_fbfc *ClassedPoints )GetIntYByClass (i int )(int ,error ){const _acfge ="\u0043\u006c\u0061\u0073s\u0065\u0064\u0050\u006f\u0069\u006e\u0074\u0073\u002e\u0047e\u0074I\u006e\u0074\u0059\u0042\u0079\u0043\u006ca\u0073\u0073";if i >=_fbfc .IntSlice .Size (){return 0,_e .Errorf (_acfge ,"\u0069\u003a\u0020\u0027\u0025\u0064\u0027 \u0069\u0073\u0020o\u0075\u0074\u0020\u006ff\u0020\u0074\u0068\u0065\u0020\u0072\u0061\u006e\u0067\u0065\u0020\u006f\u0066\u0020\u0074\u0068\u0065\u0020\u0049\u006e\u0074\u0053\u006c\u0069\u0063\u0065",i );};return int (_fbfc .YAtIndex (i )),nil ;};func (_edfc *Bitmaps )selectByIndexes (_adfcc []int )(*Bitmaps ,error ){_efgc :=&Bitmaps {};for _ ,_cccf :=range _adfcc {_bbcagc ,_cagf :=_edfc .GetBitmap (_cccf );if _cagf !=nil {return nil ,_e .Wrap (_cagf ,"\u0073e\u006ce\u0063\u0074\u0042\u0079\u0049\u006e\u0064\u0065\u0078\u0065\u0073","");};_efgc .AddBitmap (_bbcagc );};return _efgc ,nil ;};func (_badf MorphProcess )verify (_fgad int ,_fefe ,_fbab *int )error {const _ceeg ="\u004d\u006f\u0072\u0070hP\u0072\u006f\u0063\u0065\u0073\u0073\u002e\u0076\u0065\u0072\u0069\u0066\u0079";switch _badf .Operation {case MopDilation ,MopErosion ,MopOpening ,MopClosing :if len (_badf .Arguments )!=2{return _e .Error (_ceeg ,"\u004f\u0070\u0065\u0072\u0061\u0074\u0069\u006f\u006e\u003a\u0020\u0027\u0064\u0027\u002c\u0020\u0027\u0065\u0027\u002c \u0027\u006f\u0027\u002c\u0020\u0027\u0063\u0027\u0020\u0072\u0065\u0071\u0075\u0069\u0072\u0065\u0073\u0020\u0061\u0074\u0020\u006c\u0065\u0061\u0073\u0074\u0020\u0032\u0020\u0061r\u0067\u0075\u006d\u0065\u006et\u0073");};_dade ,_bdcf :=_badf .getWidthHeight ();if _dade <=0||_bdcf <=0{return _e .Error (_ceeg ,"O\u0070er\u0061t\u0069o\u006e\u003a\u0020\u0027\u0064'\u002c\u0020\u0027e\u0027\u002c\u0020\u0027\u006f'\u002c\u0020\u0027c\u0027\u0020\u0020\u0072\u0065\u0071\u0075\u0069\u0072\u0065\u0073 \u0062\u006f\u0074h w\u0069\u0064\u0074\u0068\u0020\u0061n\u0064\u0020\u0068\u0065\u0069\u0067\u0068\u0074\u0020\u0074\u006f\u0020b\u0065 \u003e\u003d\u0020\u0030");};case MopRankBinaryReduction :_bebg :=len (_badf .Arguments );*_fefe +=_bebg ;if _bebg < 1||_bebg > 4{return _e .Error (_ceeg ,"\u004f\u0070\u0065\u0072\u0061\u0074\u0069\u006f\u006e\u003a\u0020\u0027\u0072\u0027\u0020\u0072\u0065\u0071\u0075\u0069r\u0065\u0073\u0020\u0061\u0074\u0020\u006c\u0065\u0061s\u0074\u0020\u0031\u0020\u0061\u006e\u0064\u0020\u0061\u0074\u0020\u006d\u006fs\u0074\u0020\u0034\u0020\u0061\u0072g\u0075\u006d\u0065n\u0074\u0073");};for _dgag :=0;_dgag < _bebg ;_dgag ++{if _badf .Arguments [_dgag ]< 1||_badf .Arguments [_dgag ]> 4{return _e .Error (_ceeg ,"\u0052\u0061\u006e\u006b\u0042\u0069n\u0061\u0072\u0079\u0052\u0065\u0064\u0075\u0063\u0074\u0069\u006f\u006e\u0020\u006c\u0065\u0076\u0065\u006c\u0020\u006du\u0073\u0074\u0020\u0062\u0065\u0020\u0069\u006e\u0020\u0072\u0061\u006e\u0067\u0065 \u00280\u002c\u0020\u0034\u003e");};};case MopReplicativeBinaryExpansion :if len (_badf .Arguments )==0{return _e .Error (_ceeg ,"\u0052\u0065\u0070\u006c\u0069\u0063\u0061\u0074i\u0076\u0065\u0042in\u0061\u0072\u0079\u0045\u0078\u0070a\u006e\u0073\u0069\u006f\u006e\u0020\u0072\u0065\u0071\u0075\u0069\u0072\u0065\u0073\u0020o\u006e\u0065\u0020\u0061\u0072\u0067\u0075\u006de\u006e\u0074");};_gge :=_badf .Arguments [0];if _gge !=2&&_gge !=4&&_gge !=8{return _e .Error (_ceeg ,"R\u0065\u0070\u006c\u0069\u0063\u0061\u0074\u0069\u0076\u0065\u0042\u0069\u006e\u0061\u0072\u0079\u0045\u0078\u0070\u0061\u006e\u0073\u0069\u006f\u006e\u0020m\u0075s\u0074\u0020\u0062\u0065 \u006f\u0066 \u0066\u0061\u0063\u0074\u006f\u0072\u0020\u0069\u006e\u0020\u0072\u0061\u006e\u0067\u0065\u0020\u007b\u0032\u002c\u0034\u002c\u0038\u007d");};*_fefe -=_acdb [_gge /4];case MopAddBorder :if len (_badf .Arguments )==0{return _e .Error (_ceeg ,"\u0041\u0064\u0064B\u006f\u0072\u0064\u0065r\u0020\u0072\u0065\u0071\u0075\u0069\u0072e\u0073\u0020\u006f\u006e\u0065\u0020\u0061\u0072\u0067\u0075\u006d\u0065\u006e\u0074");};_gbac :=_badf .Arguments [0];if _fgad > 0{return _e .Error (_ceeg ,"\u0041\u0064\u0064\u0042\u006f\u0072\u0064\u0065\u0072\u0020\u006d\u0075\u0073t\u0020\u0062\u0065\u0020\u0061\u0020f\u0069\u0072\u0073\u0074\u0020\u006d\u006f\u0072\u0070\u0068\u0020\u0070\u0072o\u0063\u0065\u0073\u0073");};if _gbac < 1{return _e .Error (_ceeg ,"\u0041\u0064\u0064\u0042o\u0072\u0064\u0065\u0072\u0020\u0076\u0061\u006c\u0075\u0065 \u006co\u0077\u0065\u0072\u0020\u0074\u0068\u0061n\u0020\u0030");};*_fbab =_gbac ;};return nil ;};func (_ecec *Bitmap )ThresholdPixelSum (thresh int ,tab8 []int )(_cdf bool ,_bcdc error ){const _egfg ="\u0042i\u0074\u006d\u0061\u0070\u002e\u0054\u0068\u0072\u0065\u0073\u0068o\u006c\u0064\u0050\u0069\u0078\u0065\u006c\u0053\u0075\u006d";if tab8 ==nil {tab8 =_accc ();};_fgf :=_ecec .Width >>3;_aac :=_ecec .Width &7;_dfe :=byte (0xff<<uint (8-_aac ));var (_fcec ,_dfcb ,_cfag ,_bga int ;_deg byte ;);for _fcec =0;_fcec < _ecec .Height ;_fcec ++{_cfag =_ecec .RowStride *_fcec ;for _dfcb =0;_dfcb < _fgf ;_dfcb ++{_deg ,_bcdc =_ecec .GetByte (_cfag +_dfcb );if _bcdc !=nil {return false ,_e .Wrap (_bcdc ,_egfg ,"\u0066\u0075\u006c\u006c\u0042\u0079\u0074\u0065");};_bga +=tab8 [_deg ];};if _aac !=0{_deg ,_bcdc =_ecec .GetByte (_cfag +_dfcb );if _bcdc !=nil {return false ,_e .Wrap (_bcdc ,_egfg ,"p\u0061\u0072\u0074\u0069\u0061\u006c\u0042\u0079\u0074\u0065");};_deg &=_dfe ;_bga +=tab8 [_deg ];};if _bga > thresh {return true ,nil ;};};return _cdf ,nil ;};func _dab (_acgf ...MorphProcess )(_gbagc error ){const _bafef ="v\u0065r\u0069\u0066\u0079\u004d\u006f\u0072\u0070\u0068P\u0072\u006f\u0063\u0065ss\u0065\u0073";var _bgafc ,_gceb int ;for _dabd ,_dbafg :=range _acgf {if _gbagc =_dbafg .verify (_dabd ,&_bgafc ,&_gceb );_gbagc !=nil {return _e .Wrap (_gbagc ,_bafef ,"");};};if _gceb !=0&&_bgafc !=0{return _e .Error (_bafef ,"\u004d\u006f\u0072\u0070\u0068\u0020\u0073\u0065\u0071\u0075\u0065n\u0063\u0065\u0020\u002d\u0020\u0062\u006f\u0072d\u0065r\u0020\u0061\u0064\u0064\u0065\u0064\u0020\u0062\u0075\u0074\u0020\u006e\u0065\u0074\u0020\u0072\u0065\u0064u\u0063\u0074\u0069\u006f\u006e\u0020\u006e\u006f\u0074\u0020\u0030");};return nil ;};func CorrelationScoreSimple (bm1 ,bm2 *Bitmap ,area1 ,area2 int ,delX ,delY float32 ,maxDiffW ,maxDiffH int ,tab []int )(_bgff float64 ,_dfeg error ){const _ecdg ="\u0043\u006f\u0072\u0072el\u0061\u0074\u0069\u006f\u006e\u0053\u0063\u006f\u0072\u0065\u0053\u0069\u006d\u0070l\u0065";if bm1 ==nil ||bm2 ==nil {return _bgff ,_e .Error (_ecdg ,"n\u0069l\u0020\u0062\u0069\u0074\u006d\u0061\u0070\u0073 \u0070\u0072\u006f\u0076id\u0065\u0064");};if tab ==nil {return _bgff ,_e .Error (_ecdg ,"\u0074\u0061\u0062\u0020\u0075\u006e\u0064\u0065\u0066\u0069\u006e\u0065\u0064");};if area1 ==0||area2 ==0{return _bgff ,_e .Error (_ecdg ,"\u0070\u0072\u006f\u0076\u0069\u0064\u0065\u0064\u0020\u0061\u0072e\u0061\u0073\u0020\u006d\u0075\u0073\u0074\u0020\u0062\u0065 \u003e\u0020\u0030");};_gaad ,_dfde :=bm1 .Width ,bm1 .Height ;_fdbf ,_fcfc :=bm2 .Width ,bm2 .Height ;if _faee (_gaad -_fdbf )> maxDiffW {return 0,nil ;};if _faee (_dfde -_fcfc )> maxDiffH {return 0,nil ;};var _fbef ,_ddfgd int ;if delX >=0{_fbef =int (delX +0.5);}else {_fbef =int (delX -0.5);};if delY >=0{_ddfgd =int (delY +0.5);}else {_ddfgd =int (delY -0.5);};_cbdf :=bm1 .createTemplate ();if _dfeg =_cbdf .RasterOperation (_fbef ,_ddfgd ,_fdbf ,_fcfc ,PixSrc ,bm2 ,0,0);_dfeg !=nil {return _bgff ,_e .Wrap (_dfeg ,_ecdg ,"\u0062m\u0032 \u0074\u006f\u0020\u0054\u0065\u006d\u0070\u006c\u0061\u0074\u0065");};if _dfeg =_cbdf .RasterOperation (0,0,_gaad ,_dfde ,PixSrcAndDst ,bm1 ,0,0);_dfeg !=nil {return _bgff ,_e .Wrap (_dfeg ,_ecdg ,"b\u006d\u0031\u0020\u0061\u006e\u0064\u0020\u0062\u006d\u0054");};_agf :=_cbdf .countPixels ();_bgff =float64 (_agf )*float64 (_agf )/(float64 (area1 )*float64 (area2 ));return _bgff ,nil ;};func (_bcc *Bitmap )Equivalent (s *Bitmap )bool {return _bcc .equivalent (s )};func (_ebcaa *Bitmap )connComponentsBB (_gdafg int )(_dadf *Boxes ,_ecfe error ){const _egde ="\u0042\u0069\u0074ma\u0070\u002e\u0063\u006f\u006e\u006e\u0043\u006f\u006d\u0070\u006f\u006e\u0065\u006e\u0074\u0073\u0042\u0042";if _gdafg !=4&&_gdafg !=8{return nil ,_e .Error (_egde ,"\u0063\u006f\u006e\u006e\u0065\u0063t\u0069\u0076\u0069\u0074\u0079\u0020\u006d\u0075\u0073\u0074\u0020\u0062\u0065 \u0061\u0020\u0027\u0034\u0027\u0020\u006fr\u0020\u0027\u0038\u0027");};if _ebcaa .Zero (){return &Boxes {},nil ;};_ebcaa .setPadBits (0);_bdbd ,_ecfe :=_acfb (nil ,_ebcaa );if _ecfe !=nil {return nil ,_e .Wrap (_ecfe ,_egde ,"\u0062\u006d\u0031");};_dacba :=&_b .Stack {};_dacba .Aux =&_b .Stack {};_dadf =&Boxes {};var (_efec ,_gacda int ;_bfd _ab .Point ;_adcb bool ;_gbcf *_ab .Rectangle ;);for {if _bfd ,_adcb ,_ecfe =_bdbd .nextOnPixel (_gacda ,_efec );_ecfe !=nil {return nil ,_e .Wrap (_ecfe ,_egde ,"");};if !_adcb {break ;};if _gbcf ,_ecfe =_fcebe (_bdbd ,_dacba ,_bfd .X ,_bfd .Y ,_gdafg );_ecfe !=nil {return nil ,_e .Wrap (_ecfe ,_egde ,"");};if _ecfe =_dadf .Add (_gbcf );_ecfe !=nil {return nil ,_e .Wrap (_ecfe ,_egde ,"");};_gacda =_bfd .X ;_efec =_bfd .Y ;};return _dadf ,nil ;};func (_cegf *Bitmaps )Size ()int {return len (_cegf .Values )};func _fcgb (_gageg *Bitmap ,_cgga ,_ccfe int ,_geaa ,_abbc int ,_agcc RasterOperator ){var (_gcgff bool ;_bfgfa bool ;_bffa int ;_bccefbd int ;_acbc int ;_gfcb int ;_eadc bool ;_fedg byte ;);_cdcd :=8-(_cgga &7);_dgfa :=_ggagc [_cdcd ];_cefd :=_gageg .RowStride *_ccfe +(_cgga >>3);if _geaa < _cdcd {_gcgff =true ;_dgfa &=_agbg [8-_cdcd +_geaa ];};if !_gcgff {_bffa =(_geaa -_cdcd )>>3;if _bffa !=0{_bfgfa =true ;_bccefbd =_cefd +1;};};_acbc =(_cgga +_geaa )&7;if !(_gcgff ||_acbc ==0){_eadc =true ;_fedg =_agbg [_acbc ];_gfcb =_cefd +1+_bffa ;};var _abgbg ,_bcdcg int ;switch _agcc {case PixClr :for _abgbg =0;_abgbg < _abbc ;_abgbg ++{_gageg .Data [_cefd ]=_gaeca (_gageg .Data [_cefd ],0x0,_dgfa );_cefd +=_gageg .RowStride ;};if _bfgfa {for _abgbg =0;_abgbg < _abbc ;_abgbg ++{for _bcdcg =0;_bcdcg < _bffa ;_bcdcg ++{_gageg .Data [_bccefbd +_bcdcg ]=0x0;};_bccefbd +=_gageg .RowStride ;};};if _eadc {for _abgbg =0;_abgbg < _abbc ;_abgbg ++{_gageg .Data [_gfcb ]=_gaeca (_gageg .Data [_gfcb ],0x0,_fedg );_gfcb +=_gageg .RowStride ;};};case PixSet :for _abgbg =0;_abgbg < _abbc ;_abgbg ++{_gageg .Data [_cefd ]=_gaeca (_gageg .Data [_cefd ],0xff,_dgfa );_cefd +=_gageg .RowStride ;};if _bfgfa {for _abgbg =0;_abgbg < _abbc ;_abgbg ++{for _bcdcg =0;_bcdcg < _bffa ;_bcdcg ++{_gageg .Data [_bccefbd +_bcdcg ]=0xff;};_bccefbd +=_gageg .RowStride ;};};if _eadc {for _abgbg =0;_abgbg < _abbc ;_abgbg ++{_gageg .Data [_gfcb ]=_gaeca (_gageg .Data [_gfcb ],0xff,_fedg );_gfcb +=_gageg .RowStride ;};};case PixNotDst :for _abgbg =0;_abgbg < _abbc ;_abgbg ++{_gageg .Data [_cefd ]=_gaeca (_gageg .Data [_cefd ],^_gageg .Data [_cefd ],_dgfa );_cefd +=_gageg .RowStride ;};if _bfgfa {for _abgbg =0;_abgbg < _abbc ;_abgbg ++{for _bcdcg =0;_bcdcg < _bffa ;_bcdcg ++{_gageg .Data [_bccefbd +_bcdcg ]=^(_gageg .Data [_bccefbd +_bcdcg ]);};_bccefbd +=_gageg .RowStride ;};};if _eadc {for _abgbg =0;_abgbg < _abbc ;_abgbg ++{_gageg .Data [_gfcb ]=_gaeca (_gageg .Data [_gfcb ],^_gageg .Data [_gfcb ],_fedg );_gfcb +=_gageg .RowStride ;};};};};func (_fege *Bitmap )GetUnpaddedData ()([]byte ,error ){_afb :=uint (_fege .Width &0x07);if _afb ==0{return _fege .Data ,nil ;};_gbf :=_fege .Width *_fege .Height ;if _gbf %8!=0{_gbf >>=3;_gbf ++;}else {_gbf >>=3;};_cbc :=make ([]byte ,_gbf );_gfgg :=_bb .NewWriterMSB (_cbc );const _fbd ="\u0047e\u0074U\u006e\u0070\u0061\u0064\u0064\u0065\u0064\u0044\u0061\u0074\u0061";for _gbd :=0;_gbd < _fege .Height ;_gbd ++{for _gbgc :=0;_gbgc < _fege .RowStride ;_gbgc ++{_ggf :=_fege .Data [_gbd *_fege .RowStride +_gbgc ];if _gbgc !=_fege .RowStride -1{_eae :=_gfgg .WriteByte (_ggf );if _eae !=nil {return nil ,_e .Wrap (_eae ,_fbd ,"");};continue ;};for _faaf :=uint (0);_faaf < _afb ;_faaf ++{_bfab :=_gfgg .WriteBit (int (_ggf >>(7-_faaf )&0x01));if _bfab !=nil {return nil ,_e .Wrap (_bfab ,_fbd ,"");};};};};return _cbc ,nil ;};func (_ebce *Selection )setOrigin (_becd ,_cbcc int ){_ebce .Cy ,_ebce .Cx =_becd ,_cbcc };func (_acd *Bitmap )And (s *Bitmap )(_fdg *Bitmap ,_gab error ){const _bbgf ="\u0042\u0069\u0074\u006d\u0061\u0070\u002e\u0041\u006e\u0064";if _acd ==nil {return nil ,_e .Error (_bbgf ,"\u0027b\u0069t\u006d\u0061\u0070\u0020\u0027b\u0027\u0020i\u0073\u0020\u006e\u0069\u006c");};if s ==nil {return nil ,_e .Error (_bbgf ,"\u0062\u0069\u0074\u006d\u0061\u0070\u0020\u0027\u0073\u0027\u0020\u0069s\u0020\u006e\u0069\u006c");};if !_acd .SizesEqual (s ){_bc .Log .Debug ("\u0025\u0073\u0020-\u0020\u0042\u0069\u0074\u006d\u0061\u0070\u0020\u0027\u0073\u0027\u0020\u0069\u0073\u0020\u006e\u006f\u0074\u0020\u0065\u0071\u0075\u0061\u006c\u0020\u0073\u0069\u007a\u0065 \u0077\u0069\u0074\u0068\u0020\u0027\u0062\u0027",_bbgf );};if _fdg ,_gab =_acfb (_fdg ,_acd );_gab !=nil {return nil ,_e .Wrap (_gab ,_bbgf ,"\u0063\u0061\u006e't\u0020\u0063\u0072\u0065\u0061\u0074\u0065\u0020\u0027\u0064\u0027\u0020\u0062\u0069\u0074\u006d\u0061\u0070");};if _gab =_fdg .RasterOperation (0,0,_fdg .Width ,_fdg .Height ,PixSrcAndDst ,s ,0,0);_gab !=nil {return nil ,_e .Wrap (_gab ,_bbgf ,"");};return _fdg ,nil ;};func (_gaff *Bitmaps )GroupByHeight ()(*BitmapsArray ,error ){const _aabda ="\u0047\u0072\u006f\u0075\u0070\u0042\u0079\u0048\u0065\u0069\u0067\u0068\u0074";if len (_gaff .Values )==0{return nil ,_e .Error (_aabda ,"\u006eo\u0020v\u0061\u006c\u0075\u0065\u0073 \u0070\u0072o\u0076\u0069\u0064\u0065\u0064");};_beff :=&BitmapsArray {};_gaff .SortByHeight ();_ddgg :=-1;_dceb :=-1;for _bbcag :=0;_bbcag < len (_gaff .Values );_bbcag ++{_dffe :=_gaff .Values [_bbcag ].Height ;if _dffe > _ddgg {_ddgg =_dffe ;_dceb ++;_beff .Values =append (_beff .Values ,&Bitmaps {});};_beff .Values [_dceb ].AddBitmap (_gaff .Values [_bbcag ]);};return _beff ,nil ;};func (_fdbd *Bitmaps )ClipToBitmap (s *Bitmap )(*Bitmaps ,error ){const _ccga ="B\u0069t\u006d\u0061\u0070\u0073\u002e\u0043\u006c\u0069p\u0054\u006f\u0042\u0069tm\u0061\u0070";if _fdbd ==nil {return nil ,_e .Error (_ccga ,"\u0042\u0069\u0074\u006dap\u0073\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");};if s ==nil {return nil ,_e .Error (_ccga ,"\u0073o\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061p\u0020n\u006ft\u0020\u0064\u0065\u0066\u0069\u006e\u0065d");};_cdfbe :=len (_fdbd .Values );_bdgd :=&Bitmaps {Values :make ([]*Bitmap ,_cdfbe ),Boxes :make ([]*_ab .Rectangle ,_cdfbe )};var (_dag ,_cdcdbb *Bitmap ;_ccb *_ab .Rectangle ;_caeb error ;);for _gfdg :=0;_gfdg < _cdfbe ;_gfdg ++{if _dag ,_caeb =_fdbd .GetBitmap (_gfdg );_caeb !=nil {return nil ,_e .Wrap (_caeb ,_ccga ,"");};if _ccb ,_caeb =_fdbd .GetBox (_gfdg );_caeb !=nil {return nil ,_e .Wrap (_caeb ,_ccga ,"");};if _cdcdbb ,_caeb =s .clipRectangle (_ccb ,nil );_caeb !=nil {return nil ,_e .Wrap (_caeb ,_ccga ,"");};if _cdcdbb ,_caeb =_cdcdbb .And (_dag );_caeb !=nil {return nil ,_e .Wrap (_caeb ,_ccga ,"");};_bdgd .Values [_gfdg ]=_cdcdbb ;_bdgd .Boxes [_gfdg ]=_ccb ;};return _bdgd ,nil ;};func _dgd (_bbef ,_bdgg *Bitmap ,_fbbg ,_dbaf ,_cff ,_aeb ,_cadf ,_cfbb ,_ggbb ,_befaf int ,_egd CombinationOperator ,_cca int )error {var _fadf int ;_adec :=func (){_fadf ++;_cff +=_bdgg .RowStride ;_aeb +=_bbef .RowStride ;_cadf +=_bbef .RowStride };for _fadf =_fbbg ;_fadf < _dbaf ;_adec (){var _fge uint16 ;_ede :=_cff ;for _adfd :=_aeb ;_adfd <=_cadf ;_adfd ++{_fbf ,_eaac :=_bdgg .GetByte (_ede );if _eaac !=nil {return _eaac ;};_dfa ,_eaac :=_bbef .GetByte (_adfd );if _eaac !=nil {return _eaac ;};_fge =(_fge |(uint16 (_dfa )&0xff))<<uint (_befaf );_dfa =byte (_fge >>8);if _eaac =_bdgg .SetByte (_ede ,_eada (_fbf ,_dfa ,_egd ));_eaac !=nil {return _eaac ;};_ede ++;_fge <<=uint (_ggbb );if _adfd ==_cadf {_dfa =byte (_fge >>(8-uint8 (_befaf )));if _cca !=0{_dfa =_efe (uint (8+_cfbb ),_dfa );};_fbf ,_eaac =_bdgg .GetByte (_ede );if _eaac !=nil {return _eaac ;};if _eaac =_bdgg .SetByte (_ede ,_eada (_fbf ,_dfa ,_egd ));_eaac !=nil {return _eaac ;};};};};return nil ;};func (_fega *Bitmap )RemoveBorder (borderSize int )(*Bitmap ,error ){if borderSize ==0{return _fega .Copy (),nil ;};_dge ,_bfg :=_fega .removeBorderGeneral (borderSize ,borderSize ,borderSize ,borderSize );if _bfg !=nil {return nil ,_e .Wrap (_bfg ,"\u0052\u0065\u006do\u0076\u0065\u0042\u006f\u0072\u0064\u0065\u0072","");};return _dge ,nil ;};const (_bfabba shift =iota ;_adge ;);func TstASymbol (t *_c .T )*Bitmap {t .Helper ();_dbaeb :=New (6,6);_g .NoError (t ,_dbaeb .SetPixel (1,0,1));_g .NoError (t ,_dbaeb .SetPixel (2,0,1));_g .NoError (t ,_dbaeb .SetPixel (3,0,1));_g .NoError (t ,_dbaeb .SetPixel (4,0,1));_g .NoError (t ,_dbaeb .SetPixel (5,1,1));_g .NoError (t ,_dbaeb .SetPixel (1,2,1));_g .NoError (t ,_dbaeb .SetPixel (2,2,1));_g .NoError (t ,_dbaeb .SetPixel (3,2,1));_g .NoError (t ,_dbaeb .SetPixel (4,2,1));_g .NoError (t ,_dbaeb .SetPixel (5,2,1));_g .NoError (t ,_dbaeb .SetPixel (0,3,1));_g .NoError (t ,_dbaeb .SetPixel (5,3,1));_g .NoError (t ,_dbaeb .SetPixel (0,4,1));_g .NoError (t ,_dbaeb .SetPixel (5,4,1));_g .NoError (t ,_dbaeb .SetPixel (1,5,1));_g .NoError (t ,_dbaeb .SetPixel (2,5,1));_g .NoError (t ,_dbaeb .SetPixel (3,5,1));_g .NoError (t ,_dbaeb .SetPixel (4,5,1));_g .NoError (t ,_dbaeb .SetPixel (5,5,1));return _dbaeb ;};func (_abfe *BitmapsArray )GetBox (i int )(*_ab .Rectangle ,error ){const _babf ="\u0042\u0069\u0074\u006dap\u0073\u0041\u0072\u0072\u0061\u0079\u002e\u0047\u0065\u0074\u0042\u006f\u0078";if _abfe ==nil {return nil ,_e .Error (_babf ,"p\u0072\u006f\u0076\u0069\u0064\u0065d\u0020\u006e\u0069\u006c\u0020\u0027\u0042\u0069\u0074m\u0061\u0070\u0073A\u0072r\u0061\u0079\u0027");};if i > len (_abfe .Boxes )-1{return nil ,_e .Errorf (_babf ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );};return _abfe .Boxes [i ],nil ;};func (_aace *Bitmap )setPadBits (_deda int ){_cgdd :=8-_aace .Width %8;if _cgdd ==8{return ;};_adab :=_aace .Width /8;_fbg :=_ggagc [_cgdd ];if _deda ==0{_fbg ^=_fbg ;};var _egc int ;for _bfbb :=0;_bfbb < _aace .Height ;_bfbb ++{_egc =_bfbb *_aace .RowStride +_adab ;if _deda ==0{_aace .Data [_egc ]&=_fbg ;}else {_aace .Data [_egc ]|=_fbg ;};};};func Extract (roi _ab .Rectangle ,src *Bitmap )(*Bitmap ,error ){_eecf :=New (roi .Dx (),roi .Dy ());_cga :=roi .Min .X &0x07;_cfad :=8-_cga ;_ceac :=uint (8-_eecf .Width &0x07);_ebbc :=src .GetByteIndex (roi .Min .X ,roi .Min .Y );_fbe :=src .GetByteIndex (roi .Max .X -1,roi .Min .Y );_cada :=_eecf .RowStride ==_fbe +1-_ebbc ;var _gcf int ;for _adfb :=roi .Min .Y ;_adfb < roi .Max .Y ;_adfb ++{_beee :=_ebbc ;_ebcg :=_gcf ;switch {case _ebbc ==_fbe :_fdff ,_fcee :=src .GetByte (_beee );if _fcee !=nil {return nil ,_fcee ;};_fdff <<=uint (_cga );_fcee =_eecf .SetByte (_ebcg ,_efe (_ceac ,_fdff ));if _fcee !=nil {return nil ,_fcee ;};case _cga ==0:for _gce :=_ebbc ;_gce <=_fbe ;_gce ++{_dgdb ,_fdgf :=src .GetByte (_beee );if _fdgf !=nil {return nil ,_fdgf ;};_beee ++;if _gce ==_fbe &&_cada {_dgdb =_efe (_ceac ,_dgdb );};_fdgf =_eecf .SetByte (_ebcg ,_dgdb );if _fdgf !=nil {return nil ,_fdgf ;};_ebcg ++;};default:_gdaf :=_cdga (src ,_eecf ,uint (_cga ),uint (_cfad ),_ceac ,_ebbc ,_fbe ,_cada ,_beee ,_ebcg );if _gdaf !=nil {return nil ,_gdaf ;};};_ebbc +=src .RowStride ;_fbe +=src .RowStride ;_gcf +=_eecf .RowStride ;};return _eecf ,nil ;};var (_aedd *Bitmap ;_aedgc *Bitmap ;);func DilateBrick (d ,s *Bitmap ,hSize ,vSize int )(*Bitmap ,error ){return _dgb (d ,s ,hSize ,vSize )};var (_cef =_feg ();_cgab =_da ();_dbdf =_faa (););func (_ccgc MorphProcess )getWidthHeight ()(_febd ,_edab int ){return _ccgc .Arguments [0],_ccgc .Arguments [1];};func (_eafg Points )XSorter ()func (_gacg ,_eadbd int )bool {return func (_aadf ,_dgc int )bool {return _eafg [_aadf ].X < _eafg [_dgc ].X };};func TstESymbol (t *_c .T ,scale ...int )*Bitmap {_ggcad ,_ddefe :=NewWithData (4,5,[]byte {0xF0,0x80,0xE0,0x80,0xF0});_g .NoError (t ,_ddefe );return TstGetScaledSymbol (t ,_ggcad ,scale ...);};func _dgb (_eafb ,_faeg *Bitmap ,_gfaca ,_cagd int )(*Bitmap ,error ){const _ebaf ="d\u0069\u006c\u0061\u0074\u0065\u0042\u0072\u0069\u0063\u006b";if _faeg ==nil {_bc .Log .Debug ("\u0064\u0069\u006c\u0061\u0074\u0065\u0042\u0072\u0069\u0063k\u0020\u0073\u006f\u0075\u0072\u0063\u0065 \u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");return nil ,_e .Error (_ebaf ,"\u0073o\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061p\u0020n\u006ft\u0020\u0064\u0065\u0066\u0069\u006e\u0065d");};if _gfaca < 1||_cagd < 1{return nil ,_e .Error (_ebaf ,"\u0068\u0053\u007a\u0069\u0065 \u0061\u006e\u0064\u0020\u0076\u0053\u0069\u007a\u0065\u0020\u0061\u0072\u0065 \u006e\u006f\u0020\u0067\u0072\u0065\u0061\u0074\u0065\u0072\u0020\u0065\u0071\u0075\u0061\u006c\u0020\u0074\u006f\u0020\u0031");};if _gfaca ==1&&_cagd ==1{_dced ,_dfcd :=_acfb (_eafb ,_faeg );if _dfcd !=nil {return nil ,_e .Wrap (_dfcd ,_ebaf ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u0026\u0026 \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");};return _dced ,nil ;};if _gfaca ==1||_cagd ==1{_bcdce :=SelCreateBrick (_cagd ,_gfaca ,_cagd /2,_gfaca /2,SelHit );_gbbcbd ,_fcfcb :=_ebda (_eafb ,_faeg ,_bcdce );if _fcfcb !=nil {return nil ,_e .Wrap (_fcfcb ,_ebaf ,"\u0068s\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u007c\u007c \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");};return _gbbcbd ,nil ;};_cdfb :=SelCreateBrick (1,_gfaca ,0,_gfaca /2,SelHit );_ccce :=SelCreateBrick (_cagd ,1,_cagd /2,0,SelHit );_bfcd ,_acab :=_ebda (nil ,_faeg ,_cdfb );if _acab !=nil {return nil ,_e .Wrap (_acab ,_ebaf ,"\u0031\u0073\u0074\u0020\u0064\u0069\u006c\u0061\u0074\u0065");};_eafb ,_acab =_ebda (_eafb ,_bfcd ,_ccce );if _acab !=nil {return nil ,_e .Wrap (_acab ,_ebaf ,"\u0032\u006e\u0064\u0020\u0064\u0069\u006c\u0061\u0074\u0065");};return _eafb ,nil ;};func (_ebe *Bitmap )clearAll ()error {return _ebe .RasterOperation (0,0,_ebe .Width ,_ebe .Height ,PixClr ,nil ,0,0);};func (_ebd *Bitmap )RemoveBorderGeneral (left ,right ,top ,bot int )(*Bitmap ,error ){return _ebd .removeBorderGeneral (left ,right ,top ,bot );};func (_afca *Points )Add (pt *Points )error {const _fbfg ="\u0050\u006f\u0069\u006e\u0074\u0073\u002e\u0041\u0064\u0064";if _afca ==nil {return _e .Error (_fbfg ,"\u0070o\u0069n\u0074\u0073\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");};if pt ==nil {return _e .Error (_fbfg ,"a\u0072\u0067\u0075\u006d\u0065\u006et\u0020\u0070\u006f\u0069\u006e\u0074\u0073\u0020\u006eo\u0074\u0020\u0064e\u0066i\u006e\u0065\u0064");};*_afca =append (*_afca ,*pt ...);return nil ;};const (_ SizeSelection =iota ;SizeSelectByWidth ;SizeSelectByHeight ;SizeSelectByMaxDimension ;SizeSelectByArea ;SizeSelectByPerimeter ;);func (_fegb *Bitmap )GetComponents (components Component ,maxWidth ,maxHeight int )(_dgaf *Bitmaps ,_ddcg *Boxes ,_ggdd error ){const _cegb ="B\u0069t\u006d\u0061\u0070\u002e\u0047\u0065\u0074\u0043o\u006d\u0070\u006f\u006een\u0074\u0073";if _fegb ==nil {return nil ,nil ,_e .Error (_cegb ,"\u0073\u006f\u0075\u0072\u0063\u0065\u0020\u0042\u0069\u0074\u006da\u0070\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069n\u0065\u0064\u002e");};switch components {case ComponentConn ,ComponentCharacters ,ComponentWords :default:return nil ,nil ,_e .Error (_cegb ,"\u0069\u006e\u0076\u0061l\u0069\u0064\u0020\u0063\u006f\u006d\u0070\u006f\u006e\u0065n\u0074s\u0020\u0070\u0061\u0072\u0061\u006d\u0065t\u0065\u0072");};if _fegb .Zero (){_ddcg =&Boxes {};_dgaf =&Bitmaps {};return _dgaf ,_ddcg ,nil ;};switch components {case ComponentConn :_dgaf =&Bitmaps {};if _ddcg ,_ggdd =_fegb .ConnComponents (_dgaf ,8);_ggdd !=nil {return nil ,nil ,_e .Wrap (_ggdd ,_cegb ,"\u006e\u006f \u0070\u0072\u0065p\u0072\u006f\u0063\u0065\u0073\u0073\u0069\u006e\u0067");};case ComponentCharacters :_cbba ,_ccaf :=MorphSequence (_fegb ,MorphProcess {Operation :MopClosing ,Arguments :[]int {1,6}});if _ccaf !=nil {return nil ,nil ,_e .Wrap (_ccaf ,_cegb ,"\u0063h\u0061\u0072\u0061\u0063\u0074\u0065\u0072\u0073\u0020\u0070\u0072e\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u0069\u006e\u0067");};if _bc .Log .IsLogLevel (_bc .LogLevelTrace ){_bc .Log .Trace ("\u0043o\u006d\u0070o\u006e\u0065\u006e\u0074C\u0068\u0061\u0072a\u0063\u0074\u0065\u0072\u0073\u0020\u0062\u0069\u0074ma\u0070\u0020\u0061f\u0074\u0065r\u0020\u0063\u006c\u006f\u0073\u0069n\u0067\u003a \u0025\u0073",_cbba .String ());};_fccc :=&Bitmaps {};_ddcg ,_ccaf =_cbba .ConnComponents (_fccc ,8);if _ccaf !=nil {return nil ,nil ,_e .Wrap (_ccaf ,_cegb ,"\u0063h\u0061\u0072\u0061\u0063\u0074\u0065\u0072\u0073\u0020\u0070\u0072e\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u0069\u006e\u0067");};if _bc .Log .IsLogLevel (_bc .LogLevelTrace ){_bc .Log .Trace ("\u0043\u006f\u006d\u0070\u006f\u006ee\u006e\u0074\u0043\u0068\u0061\u0072\u0061\u0063\u0074\u0065\u0072\u0073\u0020\u0062\u0069\u0074\u006d\u0061\u0070\u0020a\u0066\u0074\u0065\u0072\u0020\u0063\u006f\u006e\u006e\u0065\u0063\u0074\u0069\u0076i\u0074y\u003a\u0020\u0025\u0073",_fccc .String ());};if _dgaf ,_ccaf =_fccc .ClipToBitmap (_fegb );_ccaf !=nil {return nil ,nil ,_e .Wrap (_ccaf ,_cegb ,"\u0063h\u0061\u0072\u0061\u0063\u0074\u0065\u0072\u0073\u0020\u0070\u0072e\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u0069\u006e\u0067");};case ComponentWords :_ddag :=1;var _cgea *Bitmap ;switch {case _fegb .XResolution <=200:_cgea =_fegb ;case _fegb .XResolution <=400:_ddag =2;_cgea ,_ggdd =_dbf (_fegb ,1,0,0,0);if _ggdd !=nil {return nil ,nil ,_e .Wrap (_ggdd ,_cegb ,"w\u006f\u0072\u0064\u0020\u0070\u0072e\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u0020\u002d \u0078\u0072\u0065s\u003c=\u0034\u0030\u0030");};default:_ddag =4;_cgea ,_ggdd =_dbf (_fegb ,1,1,0,0);if _ggdd !=nil {return nil ,nil ,_e .Wrap (_ggdd ,_cegb ,"\u0077\u006f\u0072\u0064 \u0070\u0072\u0065\u0070\u0072\u006f\u0063\u0065\u0073\u0073 \u002d \u0078\u0072\u0065\u0073\u0020\u003e\u00204\u0030\u0030");};};_cfadf ,_ ,_ddf :=_bcad (_cgea );if _ddf !=nil {return nil ,nil ,_e .Wrap (_ddf ,_cegb ,"\u0077o\u0072d\u0020\u0070\u0072\u0065\u0070\u0072\u006f\u0063\u0065\u0073\u0073");};_fbag ,_ddf :=_cacb (_cfadf ,_ddag );if _ddf !=nil {return nil ,nil ,_e .Wrap (_ddf ,_cegb ,"\u0077o\u0072d\u0020\u0070\u0072\u0065\u0070\u0072\u006f\u0063\u0065\u0073\u0073");};_gcgd :=&Bitmaps {};if _ddcg ,_ddf =_fbag .ConnComponents (_gcgd ,4);_ddf !=nil {return nil ,nil ,_e .Wrap (_ddf ,_cegb ,"\u0077\u006f\u0072\u0064\u0020\u0070r\u0065\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u002c\u0020\u0063\u006f\u006en\u0065\u0063\u0074\u0020\u0065\u0078\u0070a\u006e\u0064\u0065\u0064");};if _dgaf ,_ddf =_gcgd .ClipToBitmap (_fegb );_ddf !=nil {return nil ,nil ,_e .Wrap (_ddf ,_cegb ,"\u0077o\u0072d\u0020\u0070\u0072\u0065\u0070\u0072\u006f\u0063\u0065\u0073\u0073");};};_dgaf ,_ggdd =_dgaf .SelectBySize (maxWidth ,maxHeight ,LocSelectIfBoth ,SizeSelectIfLTE );if _ggdd !=nil {return nil ,nil ,_e .Wrap (_ggdd ,_cegb ,"");};_ddcg ,_ggdd =_ddcg .SelectBySize (maxWidth ,maxHeight ,LocSelectIfBoth ,SizeSelectIfLTE );if _ggdd !=nil {return nil ,nil ,_e .Wrap (_ggdd ,_cegb ,"");};return _dgaf ,_ddcg ,nil ;};func New (width ,height int )*Bitmap {_dga :=_fefb (width ,height );_dga .Data =make ([]byte ,height *_dga .RowStride );return _dga ;};func _adc (_eea ,_abg *Bitmap ,_cee int ,_dac []byte ,_efc int )(_bdb error ){const _fff ="\u0072\u0065\u0064uc\u0065\u0052\u0061\u006e\u006b\u0042\u0069\u006e\u0061\u0072\u0079\u0032\u004c\u0065\u0076\u0065\u006c\u0031";var (_dfcg ,_eg ,_ecg ,_cfaa ,_ece ,_bdd ,_caa ,_acc int ;_edgf ,_eeag uint32 ;_bbe ,_aca byte ;_cgb uint16 ;);_ebae :=make ([]byte ,4);_cgd :=make ([]byte ,4);for _ecg =0;_ecg < _eea .Height -1;_ecg ,_cfaa =_ecg +2,_cfaa +1{_dfcg =_ecg *_eea .RowStride ;_eg =_cfaa *_abg .RowStride ;for _ece ,_bdd =0,0;_ece < _efc ;_ece ,_bdd =_ece +4,_bdd +1{for _caa =0;_caa < 4;_caa ++{_acc =_dfcg +_ece +_caa ;if _acc <=len (_eea .Data )-1&&_acc < _dfcg +_eea .RowStride {_ebae [_caa ]=_eea .Data [_acc ];}else {_ebae [_caa ]=0x00;};_acc =_dfcg +_eea .RowStride +_ece +_caa ;if _acc <=len (_eea .Data )-1&&_acc < _dfcg +(2*_eea .RowStride ){_cgd [_caa ]=_eea .Data [_acc ];}else {_cgd [_caa ]=0x00;};};_edgf =_d .BigEndian .Uint32 (_ebae );_eeag =_d .BigEndian .Uint32 (_cgd );_eeag |=_edgf ;_eeag |=_eeag <<1;_eeag &=0xaaaaaaaa;_edgf =_eeag |(_eeag <<7);_bbe =byte (_edgf >>24);_aca =byte ((_edgf >>8)&0xff);_acc =_eg +_bdd ;if _acc +1==len (_abg .Data )-1||_acc +1>=_eg +_abg .RowStride {_abg .Data [_acc ]=_dac [_bbe ];}else {_cgb =(uint16 (_dac [_bbe ])<<8)|uint16 (_dac [_aca ]);if _bdb =_abg .setTwoBytes (_acc ,_cgb );_bdb !=nil {return _e .Wrapf (_bdb ,_fff ,"s\u0065\u0074\u0074\u0069\u006e\u0067 \u0074\u0077\u006f\u0020\u0062\u0079t\u0065\u0073\u0020\u0066\u0061\u0069\u006ce\u0064\u002c\u0020\u0069\u006e\u0064\u0065\u0078\u003a\u0020%\u0064",_acc );};_bdd ++;};};};return nil ;};func (_ebeg *BitmapsArray )AddBox (box *_ab .Rectangle ){_ebeg .Boxes =append (_ebeg .Boxes ,box )};func (_ggd *Bitmap )InverseData (){_ggd .inverseData ()};func _gfed (_dacd *_b .Stack )(_fgab *fillSegment ,_fdef error ){const _geeg ="\u0070\u006f\u0070\u0046\u0069\u006c\u006c\u0053\u0065g\u006d\u0065\u006e\u0074";if _dacd ==nil {return nil ,_e .Error (_geeg ,"\u006ei\u006c \u0073\u0074\u0061\u0063\u006b \u0070\u0072o\u0076\u0069\u0064\u0065\u0064");};if _dacd .Aux ==nil {return nil ,_e .Error (_geeg ,"a\u0075x\u0053\u0074\u0061\u0063\u006b\u0020\u006e\u006ft\u0020\u0064\u0065\u0066in\u0065\u0064");};_bbde ,_daff :=_dacd .Pop ();if !_daff {return nil ,nil ;};_agdga ,_daff :=_bbde .(*fillSegment );if !_daff {return nil ,_e .Error (_geeg ,"\u0073\u0074\u0061ck\u0020\u0064\u006f\u0065\u0073\u006e\u0027\u0074\u0020c\u006fn\u0074a\u0069n\u0020\u002a\u0066\u0069\u006c\u006c\u0053\u0065\u0067\u006d\u0065\u006e\u0074");};_fgab =&fillSegment {_agdga ._ecead ,_agdga ._abed ,_agdga ._afea +_agdga ._gfgf ,_agdga ._gfgf };_dacd .Aux .Push (_agdga );return _fgab ,nil ;};func _adgfc (_dgec *Bitmap ,_aabgb *_b .Stack ,_abdg ,_cdcdb int )(_bacd *_ab .Rectangle ,_efff error ){const _bcbg ="\u0073e\u0065d\u0046\u0069\u006c\u006c\u0053\u0074\u0061\u0063\u006b\u0042\u0042";if _dgec ==nil {return nil ,_e .Error (_bcbg ,"\u0070\u0072\u006fvi\u0064\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0027\u0073\u0027\u0020\u0042\u0069\u0074\u006d\u0061\u0070");};if _aabgb ==nil {return nil ,_e .Error (_bcbg ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0027\u0073\u0074ac\u006b\u0027");};_efcd ,_ecbd :=_dgec .Width ,_dgec .Height ;_aedg :=_efcd -1;_acdaa :=_ecbd -1;if _abdg < 0||_abdg > _aedg ||_cdcdb < 0||_cdcdb > _acdaa ||!_dgec .GetPixel (_abdg ,_cdcdb ){return nil ,nil ;};_gced :=_ab .Rect (100000,100000,0,0);if _efff =_bdcgd (_aabgb ,_abdg ,_abdg ,_cdcdb ,1,_acdaa ,&_gced );_efff !=nil {return nil ,_e .Wrap (_efff ,_bcbg ,"\u0069\u006e\u0069t\u0069\u0061\u006c\u0020\u0070\u0075\u0073\u0068");};if _efff =_bdcgd (_aabgb ,_abdg ,_abdg ,_cdcdb +1,-1,_acdaa ,&_gced );_efff !=nil {return nil ,_e .Wrap (_efff ,_bcbg ,"\u0032\u006ed\u0020\u0069\u006ei\u0074\u0069\u0061\u006c\u0020\u0070\u0075\u0073\u0068");};_gced .Min .X ,_gced .Max .X =_abdg ,_abdg ;_gced .Min .Y ,_gced .Max .Y =_cdcdb ,_cdcdb ;var (_ggcc *fillSegment ;_gcdbd int ;);for _aabgb .Len ()> 0{if _ggcc ,_efff =_gfed (_aabgb );_efff !=nil {return nil ,_e .Wrap (_efff ,_bcbg ,"");};_cdcdb =_ggcc ._afea ;for _abdg =_ggcc ._ecead -1;_abdg >=0&&_dgec .GetPixel (_abdg ,_cdcdb );_abdg --{if _efff =_dgec .SetPixel (_abdg ,_cdcdb ,0);_efff !=nil {return nil ,_e .Wrap (_efff ,_bcbg ,"\u0031s\u0074\u0020\u0073\u0065\u0074");};};if _abdg >=_ggcc ._ecead -1{for {for _abdg ++;_abdg <=_ggcc ._abed +1&&_abdg <=_aedg &&!_dgec .GetPixel (_abdg ,_cdcdb );_abdg ++{};_gcdbd =_abdg ;if !(_abdg <=_ggcc ._abed +1&&_abdg <=_aedg ){break ;};for ;_abdg <=_aedg &&_dgec .GetPixel (_abdg ,_cdcdb );_abdg ++{if _efff =_dgec .SetPixel (_abdg ,_cdcdb ,0);_efff !=nil {return nil ,_e .Wrap (_efff ,_bcbg ,"\u0032n\u0064\u0020\u0073\u0065\u0074");};};if _efff =_bdcgd (_aabgb ,_gcdbd ,_abdg -1,_ggcc ._afea ,_ggcc ._gfgf ,_acdaa ,&_gced );_efff !=nil {return nil ,_e .Wrap (_efff ,_bcbg ,"n\u006f\u0072\u006d\u0061\u006c\u0020\u0070\u0075\u0073\u0068");};if _abdg > _ggcc ._abed {if _efff =_bdcgd (_aabgb ,_ggcc ._abed +1,_abdg -1,_ggcc ._afea ,-_ggcc ._gfgf ,_acdaa ,&_gced );_efff !=nil {return nil ,_e .Wrap (_efff ,_bcbg ,"\u006ce\u0061k\u0020\u006f\u006e\u0020\u0072i\u0067\u0068t\u0020\u0073\u0069\u0064\u0065");};};};continue ;};_gcdbd =_abdg +1;if _gcdbd < _ggcc ._ecead {if _efff =_bdcgd (_aabgb ,_gcdbd ,_ggcc ._ecead -1,_ggcc ._afea ,-_ggcc ._gfgf ,_acdaa ,&_gced );_efff !=nil {return nil ,_e .Wrap (_efff ,_bcbg ,"\u006c\u0065\u0061\u006b\u0020\u006f\u006e\u0020\u006c\u0065\u0066\u0074 \u0073\u0069\u0064\u0065");};};_abdg =_ggcc ._ecead ;for {for ;_abdg <=_aedg &&_dgec .GetPixel (_abdg ,_cdcdb );_abdg ++{if _efff =_dgec .SetPixel (_abdg ,_cdcdb ,0);_efff !=nil {return nil ,_e .Wrap (_efff ,_bcbg ,"\u0032n\u0064\u0020\u0073\u0065\u0074");};};if _efff =_bdcgd (_aabgb ,_gcdbd ,_abdg -1,_ggcc ._afea ,_ggcc ._gfgf ,_acdaa ,&_gced );_efff !=nil {return nil ,_e .Wrap (_efff ,_bcbg ,"n\u006f\u0072\u006d\u0061\u006c\u0020\u0070\u0075\u0073\u0068");};if _abdg > _ggcc ._abed {if _efff =_bdcgd (_aabgb ,_ggcc ._abed +1,_abdg -1,_ggcc ._afea ,-_ggcc ._gfgf ,_acdaa ,&_gced );_efff !=nil {return nil ,_e .Wrap (_efff ,_bcbg ,"\u006ce\u0061k\u0020\u006f\u006e\u0020\u0072i\u0067\u0068t\u0020\u0073\u0069\u0064\u0065");};};for _abdg ++;_abdg <=_ggcc ._abed +1&&_abdg <=_aedg &&!_dgec .GetPixel (_abdg ,_cdcdb );_abdg ++{};_gcdbd =_abdg ;if !(_abdg <=_ggcc ._abed +1&&_abdg <=_aedg ){break ;};};};_gced .Max .X ++;_gced .Max .Y ++;return &_gced ,nil ;};type SelectionValue int ;func (_gdfg *Bitmap )addPadBits ()(_bfgf error ){const _afa ="\u0062\u0069\u0074\u006d\u0061\u0070\u002e\u0061\u0064\u0064\u0050\u0061d\u0042\u0069\u0074\u0073";_adg :=_gdfg .Width %8;if _adg ==0{return nil ;};_afg :=_gdfg .Width /8;_cec :=_bb .NewReader (_gdfg .Data );_afd :=make ([]byte ,_gdfg .Height *_gdfg .RowStride );_ddeg :=_bb .NewWriterMSB (_afd );_fcf :=make ([]byte ,_afg );var (_adf int ;_aed uint64 ;);for _adf =0;_adf < _gdfg .Height ;_adf ++{if _ ,_bfgf =_cec .Read (_fcf );_bfgf !=nil {return _e .Wrap (_bfgf ,_afa ,"\u0066u\u006c\u006c\u0020\u0062\u0079\u0074e");};if _ ,_bfgf =_ddeg .Write (_fcf );_bfgf !=nil {return _e .Wrap (_bfgf ,_afa ,"\u0066\u0075\u006c\u006c\u0020\u0062\u0079\u0074\u0065\u0073");};if _aed ,_bfgf =_cec .ReadBits (byte (_adg ));_bfgf !=nil {return _e .Wrap (_bfgf ,_afa ,"\u0073\u006b\u0069\u0070\u0070\u0069\u006e\u0067\u0020\u0062\u0069\u0074\u0073");};if _bfgf =_ddeg .WriteByte (byte (_aed )<<uint (8-_adg ));_bfgf !=nil {return _e .Wrap (_bfgf ,_afa ,"\u006ca\u0073\u0074\u0020\u0062\u0079\u0074e");};};_gdfg .Data =_ddeg .Data ();return nil ;};func (_fgfb *Bitmaps )SelectByIndexes (idx []int )(*Bitmaps ,error ){const _bdgbad ="B\u0069\u0074\u006d\u0061\u0070\u0073.\u0053\u006f\u0072\u0074\u0049\u006e\u0064\u0065\u0078e\u0073\u0042\u0079H\u0065i\u0067\u0068\u0074";_abab ,_faac :=_fgfb .selectByIndexes (idx );if _faac !=nil {return nil ,_e .Wrap (_faac ,_bdgbad ,"");};return _abab ,nil ;};type BitmapsArray struct{Values []*Bitmaps ;Boxes []*_ab .Rectangle ;};func (_cafa Points )Size ()int {return len (_cafa )};func _gbb (_bae ,_cfb *Bitmap ,_cgc int ,_acb []byte ,_bed int )(_beg error ){const _ead ="\u0072\u0065\u0064uc\u0065\u0052\u0061\u006e\u006b\u0042\u0069\u006e\u0061\u0072\u0079\u0032\u004c\u0065\u0076\u0065\u006c\u0034";var (_ebg ,_gbgb ,_ceec ,_aa ,_ggb ,_edac ,_ebca ,_aad int ;_cgbd ,_bf uint32 ;_dg ,_bfa byte ;_cbf uint16 ;);_acad :=make ([]byte ,4);_ace :=make ([]byte ,4);for _ceec =0;_ceec < _bae .Height -1;_ceec ,_aa =_ceec +2,_aa +1{_ebg =_ceec *_bae .RowStride ;_gbgb =_aa *_cfb .RowStride ;for _ggb ,_edac =0,0;_ggb < _bed ;_ggb ,_edac =_ggb +4,_edac +1{for _ebca =0;_ebca < 4;_ebca ++{_aad =_ebg +_ggb +_ebca ;if _aad <=len (_bae .Data )-1&&_aad < _ebg +_bae .RowStride {_acad [_ebca ]=_bae .Data [_aad ];}else {_acad [_ebca ]=0x00;};_aad =_ebg +_bae .RowStride +_ggb +_ebca ;if _aad <=len (_bae .Data )-1&&_aad < _ebg +(2*_bae .RowStride ){_ace [_ebca ]=_bae .Data [_aad ];}else {_ace [_ebca ]=0x00;};};_cgbd =_d .BigEndian .Uint32 (_acad );_bf =_d .BigEndian .Uint32 (_ace );_bf &=_cgbd ;_bf &=_bf <<1;_bf &=0xaaaaaaaa;_cgbd =_bf |(_bf <<7);_dg =byte (_cgbd >>24);_bfa =byte ((_cgbd >>8)&0xff);_aad =_gbgb +_edac ;if _aad +1==len (_cfb .Data )-1||_aad +1>=_gbgb +_cfb .RowStride {_cfb .Data [_aad ]=_acb [_dg ];if _beg =_cfb .SetByte (_aad ,_acb [_dg ]);_beg !=nil {return _e .Wrapf (_beg ,_ead ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0025d",_aad );};}else {_cbf =(uint16 (_acb [_dg ])<<8)|uint16 (_acb [_bfa ]);if _beg =_cfb .setTwoBytes (_aad ,_cbf );_beg !=nil {return _e .Wrapf (_beg ,_ead ,"s\u0065\u0074\u0074\u0069\u006e\u0067 \u0074\u0077\u006f\u0020\u0062\u0079t\u0065\u0073\u0020\u0066\u0061\u0069\u006ce\u0064\u002c\u0020\u0069\u006e\u0064\u0065\u0078\u003a\u0020%\u0064",_aad );};_edac ++;};};};return nil ;};func (_bdcb *Points )AddPoint (x ,y float32 ){*_bdcb =append (*_bdcb ,Point {x ,y })};func _accc ()[]int {_cfge :=make ([]int ,256);for _cbag :=0;_cbag <=0xff;_cbag ++{_egfa :=byte (_cbag );_cfge [_egfa ]=int (_egfa &0x1)+(int (_egfa >>1)&0x1)+(int (_egfa >>2)&0x1)+(int (_egfa >>3)&0x1)+(int (_egfa >>4)&0x1)+(int (_egfa >>5)&0x1)+(int (_egfa >>6)&0x1)+(int (_egfa >>7)&0x1);};return _cfge ;};type MorphOperation int ;func SelCreateBrick (h ,w int ,cy ,cx int ,tp SelectionValue )*Selection {_fcccf :=_gfae (h ,w ,"");_fcccf .setOrigin (cy ,cx );var _ggaa ,_gdgfa int ;for _ggaa =0;_ggaa < h ;_ggaa ++{for _gdgfa =0;_gdgfa < w ;_gdgfa ++{_fcccf .Data [_ggaa ][_gdgfa ]=tp ;};};return _fcccf ;};type fillSegment struct{_ecead int ;_abed int ;_afea int ;_gfgf int ;};func _ebda (_dbdg *Bitmap ,_fcdda *Bitmap ,_bcca *Selection )(*Bitmap ,error ){var (_dgad *Bitmap ;_eddb error ;);_dbdg ,_eddb =_befcf (_dbdg ,_fcdda ,_bcca ,&_dgad );if _eddb !=nil {return nil ,_eddb ;};if _eddb =_dbdg .clearAll ();_eddb !=nil {return nil ,_eddb ;};var _gage SelectionValue ;for _fdea :=0;_fdea < _bcca .Height ;_fdea ++{for _fddc :=0;_fddc < _bcca .Width ;_fddc ++{_gage =_bcca .Data [_fdea ][_fddc ];if _gage ==SelHit {if _eddb =_dbdg .RasterOperation (_fddc -_bcca .Cx ,_fdea -_bcca .Cy ,_fcdda .Width ,_fcdda .Height ,PixSrcOrDst ,_dgad ,0,0);_eddb !=nil {return nil ,_eddb ;};};};};return _dbdg ,nil ;};func (_dfbf *Bitmaps )AddBox (box *_ab .Rectangle ){_dfbf .Boxes =append (_dfbf .Boxes ,box )};func MakePixelCentroidTab8 ()[]int {return _dafg ()};var (_agbg =[]byte {0x00,0x80,0xC0,0xE0,0xF0,0xF8,0xFC,0xFE,0xFF};_ggagc =[]byte {0x00,0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xFF};);func TstImageBitmap ()*Bitmap {return _aedgc .Copy ()};func (_gbfge *BitmapsArray )GetBitmaps (i int )(*Bitmaps ,error ){const _gabg ="\u0042\u0069\u0074ma\u0070\u0073\u0041\u0072\u0072\u0061\u0079\u002e\u0047\u0065\u0074\u0042\u0069\u0074\u006d\u0061\u0070\u0073";if _gbfge ==nil {return nil ,_e .Error (_gabg ,"p\u0072\u006f\u0076\u0069\u0064\u0065d\u0020\u006e\u0069\u006c\u0020\u0027\u0042\u0069\u0074m\u0061\u0070\u0073A\u0072r\u0061\u0079\u0027");};if i > len (_gbfge .Values )-1{return nil ,_e .Errorf (_gabg ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );};return _gbfge .Values [i ],nil ;};var MorphBC BoundaryCondition ;func _de (_df ,_bcg *Bitmap )(_dc error ){const _ed ="\u0065\u0078\u0070\u0061nd\u0042\u0069\u006e\u0061\u0072\u0079\u0046\u0061\u0063\u0074\u006f\u0072\u0034";_eab :=_bcg .RowStride ;_fa :=_df .RowStride ;_ecf :=_bcg .RowStride *4-_df .RowStride ;var (_ada ,_fe byte ;_cb uint32 ;_dcb ,_eba ,_ce ,_bd ,_fec ,_beb ,_cbd int ;);for _ce =0;_ce < _bcg .Height ;_ce ++{_dcb =_ce *_eab ;_eba =4*_ce *_fa ;for _bd =0;_bd < _eab ;_bd ++{_ada =_bcg .Data [_dcb +_bd ];_cb =_cgab [_ada ];_beb =_eba +_bd *4;if _ecf !=0&&(_bd +1)*4> _df .RowStride {for _fec =_ecf ;_fec > 0;_fec --{_fe =byte ((_cb >>uint (_fec *8))&0xff);_cbd =_beb +(_ecf -_fec );if _dc =_df .SetByte (_cbd ,_fe );_dc !=nil {return _e .Wrapf (_dc ,_ed ,"D\u0069\u0066\u0066\u0065\u0072\u0065n\u0074\u0020\u0072\u006f\u0077\u0073\u0074\u0072\u0069d\u0065\u0073\u002e \u004b:\u0020\u0025\u0064",_fec );};};}else if _dc =_df .setFourBytes (_beb ,_cb );_dc !=nil {return _e .Wrap (_dc ,_ed ,"");};if _dc =_df .setFourBytes (_eba +_bd *4,_cgab [_bcg .Data [_dcb +_bd ]]);_dc !=nil {return _e .Wrap (_dc ,_ed ,"");};};for _fec =1;_fec < 4;_fec ++{for _bd =0;_bd < _fa ;_bd ++{if _dc =_df .SetByte (_eba +_fec *_fa +_bd ,_df .Data [_eba +_bd ]);_dc !=nil {return _e .Wrapf (_dc ,_ed ,"\u0063\u006f\u0070\u0079\u0020\u0027\u0071\u0075\u0061\u0064\u0072\u0061\u0062l\u0065\u0027\u0020\u006c\u0069\u006ee\u003a\u0020\u0027\u0025\u0064\u0027\u002c\u0020\u0062\u0079\u0074\u0065\u003a \u0027\u0025\u0064\u0027",_fec ,_bd );};};};};return nil ;};func _fefb (_bcdb ,_cac int )*Bitmap {return &Bitmap {Width :_bcdb ,Height :_cac ,RowStride :(_bcdb +7)>>3};};func Dilate (d *Bitmap ,s *Bitmap ,sel *Selection )(*Bitmap ,error ){return _ebda (d ,s ,sel )};func _gccg (_abdf ,_fbbfe *Bitmap ,_ccea *Selection )(*Bitmap ,error ){const _cde ="\u0065\u0072\u006fd\u0065";var (_bedc error ;_cffa *Bitmap ;);_abdf ,_bedc =_befcf (_abdf ,_fbbfe ,_ccea ,&_cffa );if _bedc !=nil {return nil ,_e .Wrap (_bedc ,_cde ,"");};if _bedc =_abdf .setAll ();_bedc !=nil {return nil ,_e .Wrap (_bedc ,_cde ,"");};var _fbagc SelectionValue ;for _bggd :=0;_bggd < _ccea .Height ;_bggd ++{for _fcba :=0;_fcba < _ccea .Width ;_fcba ++{_fbagc =_ccea .Data [_bggd ][_fcba ];if _fbagc ==SelHit {_bedc =_eagc (_abdf ,_ccea .Cx -_fcba ,_ccea .Cy -_bggd ,_fbbfe .Width ,_fbbfe .Height ,PixSrcAndDst ,_cffa ,0,0);if _bedc !=nil {return nil ,_e .Wrap (_bedc ,_cde ,"");};};};};if MorphBC ==SymmetricMorphBC {return _abdf ,nil ;};_eedff ,_aege ,_cfdf ,_egcc :=_ccea .findMaxTranslations ();if _eedff > 0{if _bedc =_abdf .RasterOperation (0,0,_eedff ,_fbbfe .Height ,PixClr ,nil ,0,0);_bedc !=nil {return nil ,_e .Wrap (_bedc ,_cde ,"\u0078\u0070\u0020\u003e\u0020\u0030");};};if _cfdf > 0{if _bedc =_abdf .RasterOperation (_fbbfe .Width -_cfdf ,0,_cfdf ,_fbbfe .Height ,PixClr ,nil ,0,0);_bedc !=nil {return nil ,_e .Wrap (_bedc ,_cde ,"\u0078\u006e\u0020\u003e\u0020\u0030");};};if _aege > 0{if _bedc =_abdf .RasterOperation (0,0,_fbbfe .Width ,_aege ,PixClr ,nil ,0,0);_bedc !=nil {return nil ,_e .Wrap (_bedc ,_cde ,"\u0079\u0070\u0020\u003e\u0020\u0030");};};if _egcc > 0{if _bedc =_abdf .RasterOperation (0,_fbbfe .Height -_egcc ,_fbbfe .Width ,_egcc ,PixClr ,nil ,0,0);_bedc !=nil {return nil ,_e .Wrap (_bedc ,_cde ,"\u0079\u006e\u0020\u003e\u0020\u0030");};};return _abdf ,nil ;};func _acfb (_eee ,_bge *Bitmap )(*Bitmap ,error ){if _bge ==nil {return nil ,_e .Error ("\u0063\u006f\u0070\u0079\u0042\u0069\u0074\u006d\u0061\u0070","\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");};if _bge ==_eee {return _eee ,nil ;};if _eee ==nil {_eee =_bge .createTemplate ();copy (_eee .Data ,_bge .Data );return _eee ,nil ;};_aabad :=_eee .resizeImageData (_bge );if _aabad !=nil {return nil ,_e .Wrap (_aabad ,"\u0063\u006f\u0070\u0079\u0042\u0069\u0074\u006d\u0061\u0070","");};_eee .Text =_bge .Text ;copy (_eee .Data ,_bge .Data );return _eee ,nil ;};func _befcf (_bfee *Bitmap ,_fcaac *Bitmap ,_acfg *Selection ,_cgff **Bitmap )(*Bitmap ,error ){const _bagdf ="\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u004d\u006f\u0072\u0070\u0068A\u0072\u0067\u0073\u0031";if _fcaac ==nil {return nil ,_e .Error (_bagdf ,"\u004d\u006f\u0072\u0070\u0068\u0041\u0072\u0067\u0073\u0031\u0020'\u0073\u0027\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066i\u006e\u0065\u0064");};if _acfg ==nil {return nil ,_e .Error (_bagdf ,"\u004d\u006f\u0072\u0068p\u0041\u0072\u0067\u0073\u0031\u0020\u0027\u0073\u0065\u006c'\u0020n\u006f\u0074\u0020\u0064\u0065\u0066\u0069n\u0065\u0064");};_ggce ,_bbadd :=_acfg .Height ,_acfg .Width ;if _ggce ==0||_bbadd ==0{return nil ,_e .Error (_bagdf ,"\u0073\u0065\u006c\u0065ct\u0069\u006f\u006e\u0020\u006f\u0066\u0020\u0073\u0069\u007a\u0065\u0020\u0030");};if _bfee ==nil {_bfee =_fcaac .createTemplate ();*_cgff =_fcaac ;return _bfee ,nil ;};_bfee .Width =_fcaac .Width ;_bfee .Height =_fcaac .Height ;_bfee .RowStride =_fcaac .RowStride ;_bfee .Color =_fcaac .Color ;_bfee .Data =make ([]byte ,_fcaac .RowStride *_fcaac .Height );if _bfee ==_fcaac {*_cgff =_fcaac .Copy ();}else {*_cgff =_fcaac ;};return _bfee ,nil ;};func RasterOperation (dest *Bitmap ,dx ,dy ,dw ,dh int ,op RasterOperator ,src *Bitmap ,sx ,sy int )error {return _eagc (dest ,dx ,dy ,dw ,dh ,op ,src ,sx ,sy );};func init (){const _edggg ="\u0062\u0069\u0074\u006dap\u0073\u002e\u0069\u006e\u0069\u0074\u0069\u0061\u006c\u0069\u007a\u0061\u0074\u0069o\u006e";_aedd =New (50,40);var _gebb error ;_aedd ,_gebb =_aedd .AddBorder (2,1);if _gebb !=nil {panic (_e .Wrap (_gebb ,_edggg ,"f\u0072\u0061\u006d\u0065\u0042\u0069\u0074\u006d\u0061\u0070"));};_aedgc ,_gebb =NewWithData (50,22,_cfba );if _gebb !=nil {panic (_e .Wrap (_gebb ,_edggg ,"i\u006d\u0061\u0067\u0065\u0042\u0069\u0074\u006d\u0061\u0070"));};};func (_cdbb *Bitmaps )SortByHeight (){_cagcb :=(*byHeight )(_cdbb );_gc .Sort (_cagcb )};func (_accbd *Bitmaps )AddBitmap (bm *Bitmap ){_accbd .Values =append (_accbd .Values ,bm )};func (_fad *Bitmap )GetVanillaData ()[]byte {if _fad .Color ==Chocolate {_fad .inverseData ();};return _fad .Data ;};type shift int ;func TstGetScaledSymbol (t *_c .T ,sm *Bitmap ,scale ...int )*Bitmap {if len (scale )==0{return sm ;};if scale [0]==1{return sm ;};_cecfc ,_edcba :=MorphSequence (sm ,MorphProcess {Operation :MopReplicativeBinaryExpansion ,Arguments :scale });_g .NoError (t ,_edcba );return _cecfc ;};func _gaab (_cccc *Bitmap ,_ecgg ,_dege ,_bfbbf ,_ceda int ,_fcecb RasterOperator ){if _ecgg < 0{_bfbbf +=_ecgg ;_ecgg =0;};_agcg :=_ecgg +_bfbbf -_cccc .Width ;if _agcg > 0{_bfbbf -=_agcg ;};if _dege < 0{_ceda +=_dege ;_dege =0;};_gbgca :=_dege +_ceda -_cccc .Height ;if _gbgca > 0{_ceda -=_gbgca ;};if _bfbbf <=0||_ceda <=0{return ;};if (_ecgg &7)==0{_gdcdeg (_cccc ,_ecgg ,_dege ,_bfbbf ,_ceda ,_fcecb );}else {_fcgb (_cccc ,_ecgg ,_dege ,_bfbbf ,_ceda ,_fcecb );};};func _adgb (_ddd ,_acce ,_dec *Bitmap )(*Bitmap ,error ){const _defa ="\u0062\u0069\u0074\u006d\u0061\u0070\u002e\u0078\u006f\u0072";if _acce ==nil {return nil ,_e .Error (_defa ,"'\u0062\u0031\u0027\u0020\u0069\u0073\u0020\u006e\u0069\u006c");};if _dec ==nil {return nil ,_e .Error (_defa ,"'\u0062\u0032\u0027\u0020\u0069\u0073\u0020\u006e\u0069\u006c");};if _ddd ==_dec {return nil ,_e .Error (_defa ,"'\u0064\u0027\u0020\u003d\u003d\u0020\u0027\u0062\u0032\u0027");};if !_acce .SizesEqual (_dec ){_bc .Log .Debug ("\u0025s\u0020\u002d \u0042\u0069\u0074\u006da\u0070\u0020\u0027b\u0031\u0027\u0020\u0069\u0073\u0020\u006e\u006f\u0074 e\u0071\u0075\u0061l\u0020\u0073i\u007a\u0065\u0020\u0077\u0069\u0074h\u0020\u0027b\u0032\u0027",_defa );};var _gfgd error ;if _ddd ,_gfgd =_acfb (_ddd ,_acce );_gfgd !=nil {return nil ,_e .Wrap (_gfgd ,_defa ,"\u0063\u0061n\u0027\u0074\u0020c\u0072\u0065\u0061\u0074\u0065\u0020\u0027\u0064\u0027");};if _gfgd =_ddd .RasterOperation (0,0,_ddd .Width ,_ddd .Height ,PixSrcXorDst ,_dec ,0,0);_gfgd !=nil {return nil ,_e .Wrap (_gfgd ,_defa ,"");};return _ddd ,nil ;};func _gfae (_cfbg ,_gfcce int ,_dgff string )*Selection {_bdccd :=&Selection {Height :_cfbg ,Width :_gfcce ,Name :_dgff };_bdccd .Data =make ([][]SelectionValue ,_cfbg );for _fafa :=0;_fafa < _cfbg ;_fafa ++{_bdccd .Data [_fafa ]=make ([]SelectionValue ,_gfcce );};return _bdccd ;};func (_bgcd *Bitmap )GetBitOffset (x int )int {return x &0x07};func _cacb (_ebcgb *Bitmap ,_cadfd int )(*Bitmap ,error ){const _ffdg ="\u0065x\u0070a\u006e\u0064\u0052\u0065\u0070\u006c\u0069\u0063\u0061\u0074\u0065";if _ebcgb ==nil {return nil ,_e .Error (_ffdg ,"\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");};if _cadfd <=0{return nil ,_e .Error (_ffdg ,"i\u006e\u0076\u0061\u006cid\u0020f\u0061\u0063\u0074\u006f\u0072 \u002d\u0020\u003c\u003d\u0020\u0030");};if _cadfd ==1{_efcfc ,_bccb :=_acfb (nil ,_ebcgb );if _bccb !=nil {return nil ,_e .Wrap (_bccb ,_ffdg ,"\u0066\u0061\u0063\u0074\u006f\u0072\u0020\u003d\u0020\u0031");};return _efcfc ,nil ;};_fcfce ,_facec :=_bbd (_ebcgb ,_cadfd ,_cadfd );if _facec !=nil {return nil ,_e .Wrap (_facec ,_ffdg ,"");};return _fcfce ,nil ;};func (_fbb *Bitmap )AddBorderGeneral (left ,right ,top ,bot int ,val int )(*Bitmap ,error ){return _fbb .addBorderGeneral (left ,right ,top ,bot ,val );};type Points []Point ;const (CmbOpOr CombinationOperator =iota ;CmbOpAnd ;CmbOpXor ;CmbOpXNor ;CmbOpReplace ;CmbOpNot ;);const (Vanilla Color =iota ;Chocolate ;);func (_gca *Bitmap )setEightPartlyBytes (_bcce ,_fgfe int ,_baec uint64 )(_eag error ){var (_gaec byte ;_ddbb int ;);const _fdf ="\u0073\u0065\u0074\u0045ig\u0068\u0074\u0050\u0061\u0072\u0074\u006c\u0079\u0042\u0079\u0074\u0065\u0073";for _eddg :=1;_eddg <=_fgfe ;_eddg ++{_ddbb =64-_eddg *8;_gaec =byte (_baec >>uint (_ddbb )&0xff);_bc .Log .Trace ("\u0074\u0065\u006d\u0070\u003a\u0020\u0025\u0030\u0038\u0062\u002c\u0020\u0069\u006e\u0064\u0065\u0078\u003a %\u0064,\u0020\u0069\u0064\u0078\u003a\u0020\u0025\u0064\u002c\u0020\u0066\u0075l\u006c\u0042\u0079\u0074\u0065\u0073\u004e\u0075\u006d\u0062\u0065\u0072\u003a\u0020\u0025\u0064\u002c \u0073\u0068\u0069\u0066\u0074\u003a\u0020\u0025\u0064",_gaec ,_bcce ,_bcce +_eddg -1,_fgfe ,_ddbb );if _eag =_gca .SetByte (_bcce +_eddg -1,_gaec );_eag !=nil {return _e .Wrap (_eag ,_fdf ,"\u0066\u0075\u006c\u006c\u0042\u0079\u0074\u0065");};};_fdb :=_gca .RowStride *8-_gca .Width ;if _fdb ==0{return nil ;};_ddbb -=8;_gaec =byte (_baec >>uint (_ddbb )&0xff)<<uint (_fdb );if _eag =_gca .SetByte (_bcce +_fgfe ,_gaec );_eag !=nil {return _e .Wrap (_eag ,_fdf ,"\u0070\u0061\u0064\u0064\u0065\u0064");};return nil ;};func (_acdbg *ClassedPoints )GetIntXByClass (i int )(int ,error ){const _efdg ="\u0043\u006c\u0061\u0073s\u0065\u0064\u0050\u006f\u0069\u006e\u0074\u0073\u002e\u0047e\u0074I\u006e\u0074\u0059\u0042\u0079\u0043\u006ca\u0073\u0073";if i >=_acdbg .IntSlice .Size (){return 0,_e .Errorf (_efdg ,"\u0069\u003a\u0020\u0027\u0025\u0064\u0027 \u0069\u0073\u0020o\u0075\u0074\u0020\u006ff\u0020\u0074\u0068\u0065\u0020\u0072\u0061\u006e\u0067\u0065\u0020\u006f\u0066\u0020\u0074\u0068\u0065\u0020\u0049\u006e\u0074\u0053\u006c\u0069\u0063\u0065",i );};return int (_acdbg .XAtIndex (i )),nil ;};func _affgb (_cacd *Bitmap ,_afed *_b .Stack ,_gaecd ,_afee int )(_efac *_ab .Rectangle ,_fggf error ){const _efaa ="\u0073e\u0065d\u0046\u0069\u006c\u006c\u0053\u0074\u0061\u0063\u006b\u0042\u0042";if _cacd ==nil {return nil ,_e .Error (_efaa ,"\u0070\u0072\u006fvi\u0064\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0027\u0073\u0027\u0020\u0042\u0069\u0074\u006d\u0061\u0070");};if _afed ==nil {return nil ,_e .Error (_efaa ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0027\u0073\u0074ac\u006b\u0027");};_fafc ,_ccecf :=_cacd .Width ,_cacd .Height ;_eebg :=_fafc -1;_dbe :=_ccecf -1;if _gaecd < 0||_gaecd > _eebg ||_afee < 0||_afee > _dbe ||!_cacd .GetPixel (_gaecd ,_afee ){return nil ,nil ;};var _edfa *_ab .Rectangle ;_edfa ,_fggf =Rect (100000,100000,0,0);if _fggf !=nil {return nil ,_e .Wrap (_fggf ,_efaa ,"");};if _fggf =_bdcgd (_afed ,_gaecd ,_gaecd ,_afee ,1,_dbe ,_edfa );_fggf !=nil {return nil ,_e .Wrap (_fggf ,_efaa ,"\u0069\u006e\u0069t\u0069\u0061\u006c\u0020\u0070\u0075\u0073\u0068");};if _fggf =_bdcgd (_afed ,_gaecd ,_gaecd ,_afee +1,-1,_dbe ,_edfa );_fggf !=nil {return nil ,_e .Wrap (_fggf ,_efaa ,"\u0032\u006ed\u0020\u0069\u006ei\u0074\u0069\u0061\u006c\u0020\u0070\u0075\u0073\u0068");};_edfa .Min .X ,_edfa .Max .X =_gaecd ,_gaecd ;_edfa .Min .Y ,_edfa .Max .Y =_afee ,_afee ;var (_fbce *fillSegment ;_bccg int ;);for _afed .Len ()> 0{if _fbce ,_fggf =_gfed (_afed );_fggf !=nil {return nil ,_e .Wrap (_fggf ,_efaa ,"");};_afee =_fbce ._afea ;for _gaecd =_fbce ._ecead ;_gaecd >=0&&_cacd .GetPixel (_gaecd ,_afee );_gaecd --{if _fggf =_cacd .SetPixel (_gaecd ,_afee ,0);_fggf !=nil {return nil ,_e .Wrap (_fggf ,_efaa ,"");};};if _gaecd >=_fbce ._ecead {for _gaecd ++;_gaecd <=_fbce ._abed &&_gaecd <=_eebg &&!_cacd .GetPixel (_gaecd ,_afee );_gaecd ++{};_bccg =_gaecd ;if !(_gaecd <=_fbce ._abed &&_gaecd <=_eebg ){continue ;};}else {_bccg =_gaecd +1;if _bccg < _fbce ._ecead -1{if _fggf =_bdcgd (_afed ,_bccg ,_fbce ._ecead -1,_fbce ._afea ,-_fbce ._gfgf ,_dbe ,_edfa );_fggf !=nil {return nil ,_e .Wrap (_fggf ,_efaa ,"\u006c\u0065\u0061\u006b\u0020\u006f\u006e\u0020\u006c\u0065\u0066\u0074 \u0073\u0069\u0064\u0065");};};_gaecd =_fbce ._ecead +1;};for {for ;_gaecd <=_eebg &&_cacd .GetPixel (_gaecd ,_afee );_gaecd ++{if _fggf =_cacd .SetPixel (_gaecd ,_afee ,0);_fggf !=nil {return nil ,_e .Wrap (_fggf ,_efaa ,"\u0032n\u0064\u0020\u0073\u0065\u0074");};};if _fggf =_bdcgd (_afed ,_bccg ,_gaecd -1,_fbce ._afea ,_fbce ._gfgf ,_dbe ,_edfa );_fggf !=nil {return nil ,_e .Wrap (_fggf ,_efaa ,"n\u006f\u0072\u006d\u0061\u006c\u0020\u0070\u0075\u0073\u0068");};if _gaecd > _fbce ._abed +1{if _fggf =_bdcgd (_afed ,_fbce ._abed +1,_gaecd -1,_fbce ._afea ,-_fbce ._gfgf ,_dbe ,_edfa );_fggf !=nil {return nil ,_e .Wrap (_fggf ,_efaa ,"\u006ce\u0061k\u0020\u006f\u006e\u0020\u0072i\u0067\u0068t\u0020\u0073\u0069\u0064\u0065");};};for _gaecd ++;_gaecd <=_fbce ._abed &&_gaecd <=_eebg &&!_cacd .GetPixel (_gaecd ,_afee );_gaecd ++{};_bccg =_gaecd ;if !(_gaecd <=_fbce ._abed &&_gaecd <=_eebg ){break ;};};};_edfa .Max .X ++;_edfa .Max .Y ++;return _edfa ,nil ;};func (_caace *Bitmap )setTwoBytes (_fcd int ,_eedf uint16 )error {if _fcd +1> len (_caace .Data )-1{return _e .Errorf ("s\u0065\u0074\u0054\u0077\u006f\u0042\u0079\u0074\u0065\u0073","\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",_fcd );};_caace .Data [_fcd ]=byte ((_eedf &0xff00)>>8);_caace .Data [_fcd +1]=byte (_eedf &0xff);return nil ;};func (_cge *Bitmap )createTemplate ()*Bitmap {return &Bitmap {Width :_cge .Width ,Height :_cge .Height ,RowStride :_cge .RowStride ,Color :_cge .Color ,Text :_cge .Text ,BitmapNumber :_cge .BitmapNumber ,Special :_cge .Special ,Data :make ([]byte ,len (_cge .Data ))};};func _cecd (_gaee ,_aegc *Bitmap ,_eeaed ,_dffg ,_eabcg ,_ebef ,_aagf ,_aecb ,_cdge ,_befac int ,_fefc CombinationOperator )error {var _egdd int ;_gadb :=func (){_egdd ++;_eabcg +=_aegc .RowStride ;_ebef +=_gaee .RowStride ;_aagf +=_gaee .RowStride };for _egdd =_eeaed ;_egdd < _dffg ;_gadb (){var _eabb uint16 ;_egbe :=_eabcg ;for _ffce :=_ebef ;_ffce <=_aagf ;_ffce ++{_gffa ,_fbgd :=_aegc .GetByte (_egbe );if _fbgd !=nil {return _fbgd ;};_agag ,_fbgd :=_gaee .GetByte (_ffce );if _fbgd !=nil {return _fbgd ;};_eabb =(_eabb |uint16 (_agag ))<<uint (_befac );_agag =byte (_eabb >>8);if _ffce ==_aagf {_agag =_efe (uint (_aecb ),_agag );};if _fbgd =_aegc .SetByte (_egbe ,_eada (_gffa ,_agag ,_fefc ));_fbgd !=nil {return _fbgd ;};_egbe ++;_eabb <<=uint (_cdge );};};return nil ;};func (_ggg *Bitmap )setAll ()error {_caea :=_eagc (_ggg ,0,0,_ggg .Width ,_ggg .Height ,PixSet ,nil ,0,0);if _caea !=nil {return _e .Wrap (_caea ,"\u0073\u0065\u0074\u0041\u006c\u006c","");};return nil ;}; |