Click here to Skip to main content
15,880,503 members
Articles / General Programming / Optimization

Fastest strstr-like function in C!?

Rate me:
Please Sign up or sign in to vote.
4.81/5 (39 votes)
22 Aug 2016CPOL38 min read 269.4K   3.5K   70  
Tuned function for searching a needle in a haystack
/*
RT;.,:;:,:;;;:,:;:;:;:,:,:;:;:;:;:;:,:,:;:,:,:;:,:,:;:,:;:,:;:;:,:;:;:,:,:;:,:,:,:,:;:,:;:;:,:;:,:,:,:,:;:;:,:;:;:;:,:;:;:;:;:,:,:,:;:,:,:,:,:,:;:;:,:,:,:;:;:;:,:;:;:,:,:,:;:,:;:,:,:;:,:,:,:;:;:;:;:;:,:;:;:,:,:;:,:,:,:,:,:
.:.,:,:;:,.,:,:;:,:;:,:,:;:;:;:,:;:,:,:;:,:;:;:,:,:,:,:;:;:;:,:;:;:;:,:;:;:;:;:;:;:,:;:;:;:;:;:,:,:;:;:,:;:;:;:;:;:,:,:;:,:;:,:,:,:;:,:;:;:;:;:,:,:,:;:,:;:;:;:,:,:,:;:;:;:;:;:;:;:,:,:,:;:,:;:;:,:,:;:,:,:;:,:;:,:,:;:;:,:;:,
,.,.;:;:;:,:,:,:,:,:,:,:;:,:;:;:,:;:;:;:;:;:,:,:,:;:;:,:,:,:,:;:,:;:;:;:;:,:,:;:;:;:;:;:,:,:,:,:;:;:,:,:,:;:,:,:,:,:;:,:;:,:;:,:,:;:;:;:;:,:;:;:,:,:,:,:;:,:;:;:;:;:,:,:,:;:;:;:;:;:;:;:,:;:;:,:;:;:,:;:,:;:,:,:;:;:;:,:;:,:;:
:,:;:;:,:,:;:;:;:;:,:,:,:;:,:;:,:;:;:;:;:,:,:;:,:,:,:;:,:;:,:,:,:,:;:,:,:,:,:,:;:;:,:,:,:,:;:;:,:;:;:,:,:;:,:;:,:;:;:;:;:;:,:;:,:,:,:;:,:;:;:,:,:,:,:;:;:;:;:;:,:,:;:;:,:,:;:;:;:;:;:;:,:;:,:;:;:;:,:,:;:,:,:;:;:;:;:,:,:;:,:,
;:;:,:;:;:;:,:;:,:;:;:;:;:;:;:,:;:,:;:;:;:;:;:,:,:,:,:;:,:;:,:,:,:,:,:;:,:,:;:,:;:;:;:;:,:,:,:;:;:;:,:;:;:;:;:;:,:;:;:;:,:,:,:,:;:,:;:;:,:,:,:,:;:;:;:;:;:,:;:;:,:,:;:;:;:,:;:,:,:;:,:,:;:;:,:;:,:;:;:,:,:,:,:,:;:;:,:;:,:,:,:
:;:;:,:;:;:;:,:;:;:,:,:,:,:,:;:;:,:,:;:;:;:,:;:;:;:,:;:,:;:,:,:,:,:;:,:,:;:;:,:;:;:,:,:,:;:,:,:,:;:;:;:;:;:;:;:,:,:,:,:;:;:,:;:;:;:,:,:,:,:;:;:;:;:,:;:;:,:;:;:,:,:,:,:,:;:;:;:,:;:;:,:,:;:,:,:,:,:,:;:,:,:;:,:;:;:;:;:;:,:;:;
;:;:;:,:;:,:,:,:;:,:;:;:,:,:;:,:,:,:;:,:;:;:;:;:,:;:;:;:,:,:;:;:;:,:;:;:;:;:,:,:,:;:;:,:,:,:,:;:,:,:;:;:;:,:;:,:,:,:;:,:,:,:,:;:;:;:,:,:;:;:;:,:;:,:;:;:;:;:;:,:;:,:,:,:,:,:,:;:;:;:,:,:,:,:,:,:,:;:,:;:,:;:;:,:,:;:;:,:,:,:,:
,,:;:,:;:,:,:,:,:,:;:,:;:;:,:,:,:;:,:,:,:,:;:;:;:,:;:,:,:;:;:;:,:;:,:,:,:,:,:,:;:;:;:;:,:;:,:,:,:;:,:,:;:,:,:,:,:;:;:,:;:,:,:;:;:,:;:,:;:,:,:;:,:;:;:;:;:;:,:;:;:,:,:,:,:;:;:;:;:,:;:;:,:,:;:;:;:;:;:,:;:,:;:;:,:;:,:,:;:,:;:,
;:,:,:;:,:,:;:;:;:,:;:;:;:;:;:;:;:;:,:;:;:,:,:;:,:,:,:;:,:,:,:,:,:;:,:,:,:,:;:,:,:,:;:,:;:;:,:;:;:;:;:,:,:;:;:;:,:;:,:,:,:,:;:;:,:;:,:,:;:,:;:,:;:;:,:;:,:,:;:;:,:;:;:;:,:,:,:;:,:;:;:,:;:,:,:,:;:,:;:;:,:;:,:;:,:;:;:,:,:,:,:
:,:;:;:,:,:,:,:,:;:;:,:;:;:;:,:;:;:;:;:,:;:;:,:,:;:;:;:,:;:,:;:,:,:;:;:;:;:;:,:;:;:,:;:,:;:;:,:;:,:,:,:;:,:;:;:;:,:;:;:;:,:,:,:,:;:;:,:;:,:,:,:,:;:;:,:,:;:,:;:,:;:,:;:,:;:;:;:,:;:,:,:,:;:,:,:;:;:;:;:;:;:,:,:;:;:;:;:;:,:;:;
;:;:;:,:,:,:;:;:;:;:,:,:;:;:,:;:;:;:;:,:,:;:;:;:,:;:,:,:,:,:;:;:,:,:;:,:,:,:;:,:,:;:,:,:,:;:;:,:,:,:;:,:,:,:,:,:,:;:,:;:;:,:,:;:,:,:;:;:,:;:;:,:;:,:,:,:,:,:,:,:;:,:;:,:,:;:;:,:;:;:,:,:;:;:;:;:;:,:,:;:,:,:,:;:;:;:;:;:,:,:;:
,;:,:,:,:;:,:,:,:;:,:,:;:,:,:;:,:;:;:,:,:;:,:;:;:;:,:;:;:,:,:,:,:,:;:;:;:,:;:;:,:;:;:;:,:;:;:,:;:,:;:,:;:;:,:;:;:,:;:,:,:,:,:;:,:,:,:;:;:;:,:,:;:;:;:,:,:,:;:,:;:,:;:;:;:,:;:,:,:,:;:,:,:;:,:;:,:,:;:;:;:;:;:,:,:;:,:;:;:;:,:,
;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:,:,:;:;:,:;:,:,:,:;:;:;:,:,:,:,:,:;:;:,:;:;:,:,:;:;:,:;:,:;:;:,:;:,:,:,:;:;:;:,:;:;:,:,:,:,:;:,:,:,:,:;:;:,:;:;:;:,:,:,:,:,:,:,:;:,:,:;:,:,:,:;:;:;:;:,:;:;:;:;:,:;:;:,:,:,:;:;:;:,:;:;:;:,:,:,:
,;:;:;:,:;:,:;:,:;:;:,:,:,:,:,:;:;:,:,:;:,:,:,:,:;:,:,:,:,:,:;:;:;:,:;:,:,:;:;,,:,.,:;:;:;:,:;:;:,:,:;:;:,:,:;:;:,:,:,:;:,:;:,:;:;:;:;:,:,:;:;:;:,:,:,:,:,:;:;:;:;:;:,:;:;:;:;:;:,:;:,:,:;:,:,:;:;:,:;:,:;:;:;:,:,:;:;:,:;:;:,
;:;:,:;:;:,:,:,:;:,:,:,:;:,:;:,:,:;:,:;:;:,:;:,:;:,:,:,:;:,:,:,:;:,:;:,:,:,,;:;.,:;.;.,.,:,:,:;:;:,:;:;:;:;:;:,:;:,:,:,:,:;:,:,:;:,:,:;:,:;:,:,:,:,:,:,:,:;:;:,:;:,:;:,:;:;:;:;:,:,:;:;:;:;:,:;:;:;:,:,:;:;:,:;:,:,:;:,:;:,:,:
:;:,:;:,:;:,:,:,:,:,:;:;:,:;:;:,:;:;:;:;:;:;:;:;:;:,:,:,:,:,:;:;:;:,:,:,:;.,:,..,i;,.,;,.,:;:,:,:;:;:;:,:,:;:,:;:,:;:,:,:,:,:,:;:;:,:;:;:,:,:,:,:,:,:;:;:;:;:,:;:,:;:,:,:,:;:,:;:,:;:,:,:;:;:,:;:;:,:,:,:,:,:,:;:,:;:,:,:,:,:,
;:,:;:;:;:;:,:,:,:;:;:;:,:;:;:,:;:;:,:,:,:,:,:,:;:,:;:,:;:,:,:;:,:;:;:,:;:,.: ,iyvl;:i; ,.,,,:,:,:;:,:;:,:,:,:,:,:,:;:;:,:;:;:,:;:,:;:;:;:,:;:;:;:;:,:,:,:;:,:,:,:;:;:;:,:,:;:,:,:,:,:;:,:;:,:;:,:,:,:;:,:,:,:,:,:,:,:,:;:;:;:
:,:,:,:;:;:,:,:;:,:,:;:,:,:,:;:,:;:,:,:;:;:,:;:;:,:;:,:;:;:;:,:,:;:,:,.,,,...;vOXViiv3VYi,.,:;:,:;:;:,:;:;:;:;:,:;:,:;:;:,:,:;:;:,:,:;:;:;:;:;:;:;:,:,:;:,:,:,:,:;:,:;:,:;:,:;:;:;:,:;:;:;:,:,:;:,:,:,:,:;:,:,:;:;:;:;:,:;:,:,
;:;:;:;:,:,:,:;:;:,:,:;:;:;:;:;:;:;:;:;:,:,:;:;:;:;:;:,:,:;:,.,:,.,.,.,.,,ivtQ@DFVlv2K8BL...,.,:,:;,;:,:;:,:;:;:;:;:;:;:;:,:,:;:,:,:;:;:,:,:;:;:,:;:;:;:;:;:;:;:,:,:;:,:;:;:,:;:,:,:;:;:,:,:;:;:,:,:,:,:,:;:,:,:,:;:;:,:,:;:,:
,;:;:,:;:,:,:,:,:,:,:,:;:,:;:;:;:;:;:,:,:,:,:;:;:,:,:,:;:,.:.,.. : ..:.;ijOBE@B@E@@@Bt;yVi;;.:.,.,:,.,.,:,:;:;:,:,:,:,:;:;:;:;:,:;:,:;:,:,:;:;:,:,:;:,:,:;:;:;:;:;:,:;:;:;:,:,:;:;:;:;:,:;:,:,:,:,:;:;:,:,:;:,:;:,:;:;:,:;:;:,
;:,:,:,:;:;:;:;:,:,:,:,:;:;:,:,:;:,:;:;:,:,:;:;:,.,:,:,:,.: :ii;;   ,;ijZS8B@8B@@@@B@ECVylLyi;;,,.,.. ..,:;:;:,:;:;:;:,:;:,:,:,:,:,:,:;:;:,:,:,:;:;:,:,:;:,:;:,:,:;:;:;:;:;:;:;:;:;:,:;:,:;:;:;:,:;:;:,:,:;:,:;:;:;:,:;:,:,:,:
,,:;:;:;:;:;:;:;:,:,:,:;:;:,:;:,:;:,:;:;:,:;:,:,:,.,.,.,.;i;lBlyEtjOF16BB@EBQQQ@B88BE@8XvUVlivvi;;. ,yi:.,:;:,:;:,:;:,:;:;:;:,.,:,:;:,:,:;:;:,:;:,:;:;:,:,:,:,:,:;:;:,:,:;:,:,:;:,:,:,:,:;:,:,:;:,:,:,:;:;:,:,:,:,:,:;:,:,:,:,
;:;:;:;:,:,:;:,:,:;:;:;:,:;:;:,:;:,:;:,:;:,:,.,.;,,,;.:.iV336ScX88@B@B@EBB@8S1C3MyF8B8SlLUciyvVi;ii;@B@i..,:;:,:,:,:;:;:,:;.,.. :.;:,:;:;:,:,:,:,:,:,:,:,:;:;:,:;:,:,:;:;:;:;:,:;:,:;:,:,:,:;:,:;:,:;:;:,:,:,:,:,:;:;:,:,:;:,:
,;:,:,:,:,:;:,:,:;:;:,:;:,:,:,:,:;:;:,:;:,:,:;,;;i;Yl;,iYJljlyt$OEE@@@EQZB@@ED32G0KEG2FX1McCG$XVyvi;i@0;.,,,:;:;:;:,:;:,:;:, .i; ::;:;:;:;:;:,:;:;:,:,:,:;:;:,:;:,:,:,:;:,:;:,:,:,:;:,:;:;:,:,:;:,:;:,:;:;:;:;:;:,:;:;:;:,:,:,
;:;:,:;:;:,:;:,:;:;:;:,:;:,:,:;:;:,:;:;:,:;.,;i;yiivl;;;;;yLVlK3IX3D@B@BBB@88Z8@@83KOXIGSICIBBQ1Jly;;;, ::;:,:,,;:;:,:;:;:,. $@@; :.;:;:,:,:,:,:,:;:;:;:,:,:,:;:,:,:,:;:;:,:,:;:;:,:;:,:,:,:,:,:;:,:,:;:;:,:;:;:,:;:,:;:,:,:,:
:;:;:;:;:,:,:;:;:,:;:,:;:,:,:;:;:;:,:;:;,,:;;;it1cyVii;;,;iSE$XMj11tllJ8@@B8@@@Ei. .O@SGZ@DQQ8SKL1VLvi;;.,.;:;:,:,:,:;:;,,.. @B@2, ,:;:;:,:;:;:;:;:,:;:;:;:,:,:;:;:,:,:;:,:;:,:,:;:,:;:;:;:,:,:;:,:;:;:,:,:;:;:;:,:,:;:;:,:;:;
;:,:;:,:;:,:,:;:,:,:,:;:,:,:,:;:;:;:,:,:;:;,;ijVJVFUyii;;,;;U8BXOUi;iiivEBB@@Q;    i@B6Q@BBQDI3XFKMGOii;;.,.;:;:;:,:;:,:,:, .B@B@; .,:,:;:,:;:,:,:;:,:;:;:;:,:;:;:;:;:;:,:;:,:;:;:,:,:,:,:,:,:,:;:;:,:,:;:;:,:,:,:;:;:;:;:;:;:
:,:,:;:,:;:;:,:;:;:,:;:,:,:;:;:;:;:,:,.;:;:;;yiVUJcFUYii;;,..y0QZ1ivc0XVC8@@I     ;@@@@@@@@8O6Z$F68@8L;;;i,:.,:,,,:;:,:,:,. ,@@8@l .:,:,:;:;:;:;:,:,:,:,:;:,:,:;:,:;:;:;:;:;:,:;:,:,:,:,:;:;:;:,:;:;:;:;:,:,:;:;:;:;:;:,:;:,:,
;:;:;:,:;:;:,:;:,:,:,:,:;:,:,:;:,:;,;.;:;:,;lvlc3XVl2cYi;,;::.Y@BMK0803CE@@Di   . jB@B@@@DCUS@@B@B@B@MUi;;v;;:,.,:,.;:;:;.. 0@@X@Z; ,:;:;:;:,:,:,:,:;:;:;:;:;:;:;:,:;:;:;:,:,:;:,:;:,:,:;:,:,:,:;:;:,:;:,:;:;:,:;:;:;:;:,:;:,:
,,:,:;:;:,:,:;:,:,:;:;:;:,:,:;,,:;,;,,:;:,,lvUXCFL;iyXVyiiii;;v@@DI88St2E@8F$8KU.,B@@@B@iSi;V68@@@@@E6SU;iii;;,;.,.,:,:;::  B@8K8@; .,:,:,:;:,:;:,:,:,:;:;:,:,:,:;:;:,:;:;:;:,:;:,:;:,:,:,:;:;:;:,:;:,:;:;:,:;:,:,:,:;:;:;:;:,
;:,:;:,:;:,:;:;:,:,:,:;:;:,:;,;,,.;:;;;:,.iLVYMXLi;;iYJVUlyvv;y8@ZSQ80O2@@@B@B@BUO@@@@@jv1;.;;SB@DB@@0QMVvli;,;;i;;,,.,.,. ;@@GYEBv ::,:;:,:,:,:,:;:;:,:,:,:;:;:;:;:;:,:,:,:;:,:;:,:;:;:;:,:,:;:,:;:,:;:;:;:;:;:,:;:,:;:;:,:;:
:;:,:,:;:;:;:;:,:,:,:,:;:;:,:,.,:,:,:;;;:iUFJVYUiiiiiUcJVVvyviv8B8686SKCB@@@B@@@B@@@ytLVY;.,:iY@6IZBFCQSKSKJi;;;;;;i;;,,. .@@@FUE@v .,:;:;:;:,:;:,:,:,:;:;:;:,:;:;:;:,:,:;:;:;:;:,:;:;:;:;:;:,:,:;:,:;:;:,:;:,:,:,:,:;:,:,:,:,
;:,:,:;:;:;:;:,:;:;:;:;:,:;:;:;,;,;,,.,:;lXV2JYiiitVvjFVVvlvv;vS@8@88SOK@B@@@@@@@B@; ;Vi,.,:;;Y3QFS$L1@DDQ8QCyjl;.;;;;i;iilSECt2@@V ,:;:;:,:,:;:;:;:;:,:;:,:;:,:;:;:;:;:,:;:,:;:,:,:,:;:,:;:,:;:;:;:;:;:,:;:,:;:;:;:,:;:,:;:,:
:,:;:,:,:,:;:,:,:;:,:,:;:;:,:,:;;i;;;i;;;YVylVlll1QFijjYlyiviiv2S@8E8838B@@@@@B@@@U  . ..,:;,;;j308@OQQ3$B8@8ZSZLyyv;;;iv3MjVyFSB@v .;:,:,:,:,:;:;:,:,:,:;:;:,:;:,:;:;:,:;:,:,:,:;:,:;:;:,:,:,:;:,:,:;:;:;:;:;:;:,:,:;:,:,:,:;
;:,:,:,:,:,:,:;:,:;:;:;:,:;,;:;:;,;;iii;yUUiiivlUXQLvyUiYllililVKDQ3BQ$E@@@@@@@E@8; ,,;:;,;,;,;vCZ@B@QDKQB@8BB@8DFS3l;i;;ijJXVK2@B; ,:;,;:;:,:,:;:;:;:;:;:;:,:,:,:;:;:;:;:;:,:;:;:,:;:;:,:,:;:,:;:,:;:,:,:,:,:;:;:;:;:;:,:,:,:
,;:;:;:,:;:,:;:;:,:,:,:,:,:,:;,;,;,;,;;;iLylivvy;illiycLljllvlic0EOOQBZB@@B@B8$S@$ .,;,;,;:;,;,iyZ68B@@QDBEE06Q8OXU$jiii;;;LcXU6@i :.,,;:,:;:;:;:;:;:,:;:,:,:,:,:,:,:,:,:,:;:,:;:;:;:;:,:,:;:,:,:;:,:;:,:;:;:,:;:;:;:;:,:;:;:,
;:;:,:,:;:,:,:;:,:,:,:;:;:,:,:;:;;;;i;i;vyUlY1BJ, ,;;;ccXUjljlc0@QQSEZ6$StCK3ccM@F .;,;,;,;,;,;;vY8B@@B@@@B88QB863D32K1lv;ivjVJI0...,,;:;:,:;:,:;:;:,:;:;:,:;:,:;:;:,:;:;:;:,:;:;:,:;:,:;:;:;:,:,:,:,:;:;:;:;:;:,:;:,:;:;:;:,:
,,:,:;:;:,:,:,:;:;:;:;:;:;:;:,.,:;:;;iillcKEB@@@i  ,;ljXLFJtXt2B$O6B6OFJVVvylyl3@1 :,;,;,;,;,;,iiU@@@88@BQB@B@@@B8QQQE0IUyilyjUEEi :.;,,:,.,.;,,:;:;:,:,:;:;:;:,:;:;:;:,:;:,:;:;:;:;:,:;:;:;:;:,:,:,:,:;:;:;:,:,:,:,:;:;:;:;:,
;:,:;:,:;:;:;:,:,:,:,:;:,:,:;:,:,:;:;;i;ivU$@B@B@;  ilUjlyUcIF$0tS@@BtO1FXKXJUU2@X .;;;,;,;,,.;;iK@@@SV;,;vYFC8B@B@B@8B8S1tvlUXS@; .;,,.,.,;i,;:;:,:;:,:;:;:;:;:;:;:;:,:;:;:;:,:;:,:;:,:;:;:,:,:,:,:,:,:;:;:;:,:,:;:,:,:;:,:,:
:;:;:;:,:;:;:;:,:;:,:,:,:,:;:,:;,;,;:,;;,;;lyFZB@@ti;;iUilyjVCFLtVivLMviiiii;,;M@C .;;,;,;,;:,;;ii;i;;  .:.....;;VE@B@8@BBCXlLF@K. Yi;.,;vJc;,:;,;,;:;:,:,:,:;:;:;:;:,:;:;:;:;:;:;:;:,:,:;:,:,:;:;:;:;:,:;:;:;:;:,:;:;:;:,:;:,
;:;:,:,:,:;:,:;:,:;:;:;:,:,:,:,,,:;:;,;,;;;;lvc$BB@@@0QDSIEO2EEili,  :;.. . . ;G@Oi ;;;,;,;,;,;;v,.   ,.;.,.:..    ,BB@E6GGUVc8B; 30i:;;yv;.::;,;:,:;:;:,:;:;:,:,:,:;:;:;:,:,:;:,:;:;:,:;:;:,:;:,:,:,:,:,:;:,:;:;:,:;:;:;:,:,:
,;:;:,:,:;:;:;:;:,:;:;:,:;:;:,:,:;:;:,:;,;ilivlFXDB@B@@@B@@@B@BEZ@Qy  ;i.,.,..iZXZ3: ;;;,;,;,;,;i;,;:;:,:,:;.,.,..  ;@@Q1F1XL1O3;VGL,,iU;  ;,;,;,,:,:;:;:,:,:;:,:,:,:,:,:,:;:,:,:,:;:,:,:,:;:,:,:;:;:,:,:,:;:;:;:;:;:,:,:,:,:,
;:,:,:,:;:;:,:,:;:,:;:,:;:;:;:;:;:;:,:;:;,;;vvyL3$@B@B@B@@@@@B@B@SBM; ,;;.;,: i0tv6J..;,;;;,;,;;v,;;;,;,;:;:;:,:,.. y@@0OFXlYVB8My; ,yt;;vv;;:,,;,;:;:,:;:,:;:;:;:,:;:;:,:,:;:;:,:;:;:;:;:,:,:;:,:,:,:;:;:;:,:,:;:;:;:,:;:;:;:
:,:,:,:;:,:;:;:,:,:,:,:;:;:,:,:;:;:;:;:,:,.,ililF@B@@@@@B@@@B@@@B@@@i..l;:,;..i6XyXBji,;,;;;;;;30;:i;;,;:;,;:;:,.. iB@I20SCMtE$l;: ;L6M$1i:: ..,.,.,:,:;:;:,:,:,:;:;:;:,:;:;:,:,:;:,:,:,:;:,:,:;:;:;:,:,:;:,:;:;:,:,:;:;:,:;:;
;:;:,:,:,:;:,:,:,:;:;:,:,:;:;:,:,:,:;:;:,:,.;;vvJZ@B@B@@@@@@@@@@@B@Bi.VX;.,.: vG0VivIG3UUUJU6ZB@@;.;i;;,;,;:;,;...l8@tL2$XSBCi;.: ;y30@QLi;,vyVi;.,.,:,:;:;:,:;:;:;:;:;:;:;:;:,:;:,:,:,:,:;:,:,:,:;:;:,:;:;:;:,:,:;:;:;:;:;:,:
:,:,:,:;:,:,:,:;:,:;:;:;:,:;:,:;:,:;:;:;:;:;,;;yyJS@@@@@@@@@@@@@@@B@yi8B;:,;:.,UFvii;l1QSEGtJCO@@Qli,;,;:,:;:, ;iEBDjjYUJ$D1i;:;.;U1I@ZSKGMZ6l;Vv;.. :.,:,:,:;:;:,:,:,:;:,:,:;:;:;:,:,:;:,:,:,:;:,:;:,:,:;:,:;:,:,:;:;:,:;:;:;
;:;:;:,:,:,:;:,:,:,:;:;:;:,:;:,:;:,:;:;,;:;,;;YyyvUO@@@B@@@@@@@B@@@BMX@U:vSv:.:iUyYyjlyi;;;,;.,;M@@B6Vv;;;;;ii1E@EJllyXtGS0i;;;:iXMM@@BSQSS66Vli;.;il;;:;,,:;:;:;:;:;:;:;:,:,:,:,:,:;:;:;:;:;:;:;:,:;:;:,:;:,:;:;:,:,:,:,:,:;:
,;:,:,:,:,:;:;:;:,:,:,:;:;:,:,:;:;:;:;:;:,:,:;;villMQ@@@@@@@@@@@@@B@DEBci@Ei;v;,t@$Kli,;:;,;,;..,vVQB@@@88D@B@E$VviUjX1ZDSyi;;:iMcv8B@@@QEOGE@8B8B8@@t;;,;:;:;:,:;:,:;:,:;:;:,:;:;:;:,:;:,:,:,:;:;:;:,:,:;:;:;:;:;:;:,:;:;:,:;
;:;:,:;:;:;:;:;:,:,:,:,:;:;:;:,:,:;:;:,:;:;:;:,:;;ii10BB@@@@@B@@@@@B@BB8@BI;lOJ;UFl;;:;,;;;;;:;.::i;iiUUttXV1cVvcFM1MXO0ZXv;;,;t0;2@@EBBB88$EE@QY;jXUi;:;:;:;:,:;:;:,:;:,:,:;:;:;:;:,:;:;:,:,:,:,:,:;:,:,:;:;:;:;:,:,:;:,:,:;:
,;:,:;:,:;:,:;:,:,:;:;:,:;:,:;:,:;:;:,:,:,:,:;,;:,,iiicQZB@@@@@@@@@@@@B@B@ZOI@@M,,,;;;;;;;;;:;ii;;iMviilililV1J1FG1O1K$EMY;;,;jBviB@B8SQE8B@Q@Ei     ..,:,:;:;:,:,:,:;:;:;:;:,:,:;:;:;:,:,:,:,:,:,:;:;:,:;:;:;:;:;:;:,:;:;:,:,
;:;:;:;:;:,:,:,:;:,:;:;:,:,:,:;:;:,:,:;:;:;:;,;;;;iivlF2G6BB@@@@@@@B@@@@@B8Z@@8;,;;;;;;;;;;,;USvvVllIFUl2D$cUYLj1t3233D2Li;,;iEG;U@@@EEEBS880ESiXXl  .,.,.,:;.,:,:,:;:;:;:,:,:,:;:;:;:,:;:,:,:,:,:,:,:,:,:;:;:;:;:,:,:,:,:,:;:
,;:,:;:,:;:;:,:,:;:,:,:;:;:;:,:;:,:,:;:;:;:;:,.,:;;iiyLKME8@B@B@@@@@@@8@B@@@@@;.;i;;,;;;;;;;,0BB6@J;i$CGKQBQFcVXFOOO3SMUii;;;tBj.ZB@B@@@@@E86B@QllFL,;;,.,:,:,:;:;:;:,:,:,:;:,:,:,:;:;:,:,:;:;:,:;:;:;:,:,:,:;:;:,:,:;:,:;:,:;
;:;:,:,:,:;:;:,:;:;:,:,:,:;:;:;:;:;:;:;:,:,:;:,:,.,:;iVVtI88@@@B@@@B@B8B@B@@@K,,i;;,;,;;;;;,,iB@@@X.;SBU30EB@SGMO2$GSMJvi;i;vCQi;B@B@@@B@@@B@Q@@@GMSt,;;;,;,;,;,;:,:,:,:,:;:;:;:,:,:;:,:,:;:;:;:,:,:;:;:;:;:,:;:,:,:,:,:;:,:,:
:;:;:,:,:;:,:,:;:;:;:;:;:,:,:;:;:;:,:;:;:;:;:;:,:,,;;ivlivvcC8B@@@B@@@B@@@B@@v:i;;;;;;;i;;;;;;iJ33ii;c8Xy02QQ8OIK2ccjLli;ivviji.i@B@B@QBB@B8EB88E8E@@tlXli,;,;:;:,:;:,:;:,:;:;:,:;:;:,:;:,:,:,:;:,:,:,:,:,:;:;:,:,:;:;:,:,:,:,
;:,:,:;:,:;:;:;:,:;:,:;:;:;:;:,:;:,:;:;:;:;:;:;:,:,.;,;;i;iiJC8B@@@B@B@B@8@@M,;ii;;;;;i;i;vljyyvyvvvlUBJivVlLJFU1F1iivM2GK3Yi,. IB@B@8SS@@B$BB@88DEE@@6l;.. .:;,;:;:;:,:;:;:,:;:,:,:,:,:;:,:,:;:,:;:;:,:;:,:;:;:;:;:;:;:;:;:,:
,,:;:,:,:;:,:;:;:;:;:,:;:;:,:,:;:,:,:,:,:;:,:,:;,;,;,;,;ily1t3I88@@@@@8B8@B@;;ii;;;;;i;iiyVCXUlyvUvLj$BC;i;iiyljUKJVL8B@BB8Ei. :8@@8EB3GQ@@E8@@@BBDE8@B@B80V,,,,:;:,:,:,:;:,:,:,:;:,:,:,:,:;:;:,:,:,:,:,:,:,:,:;:;:;:,:,:;:,:,
;:;:;:,:;:,:,:;:;:;:,:;:,:,:,:;:,:;:;:;:,:,:,:;:,:;,;:;iylVlYlcKDDB8B88QBB@Y;;i;;;;;iiilccI$ZGSO6DSI0IE2l;i;iivvYyLJB@@B@B@8C;.;@@@D8B8GQ8@B868B@B@B@688@B@@$iiii;;,;,;,;:,:,:,:;:;:,:,:;:,:;:;:;:;:;:;:;:;:,:;:;:;:,:;:,:,:;:
:,:;:;:,:;:,:;:;:,:;:,:;:;:,:,:,:,:,:;:;:;:,:;:,:,:,:,:;iiivvyy1FG088B8@8@Fi;iii;;;i;lVO0QDBB@@@B@E8D$M0li;i;iiviyY3B@@@@@BBQGitB@@DQ@@@QB@@88QBB@@@8@88IZEGviiXy;,;,;,;,;:;:;:,:;:,:,:;:;:;:;:,:,:,:;:,:;:,:,:;:,:,:;:;:;:,:;
;:;:;:,:;:,:;:,:,:,:;:;:,:,:,:;:,:,:,:;:;:;:;:,:,:;:,:,:iilvliyllvylyJ0DBSy;iii;;;;;lXQQQGD3I0QGS0$S3lcOV;i;iiiilvVS@@@B@@@E8QEB@@@8B@@@D0@BB8B$E@@@@B@8QO6FX;;il;;,;,,:,:;:;:;:;:,:,:;:;:;:;:;:;:,:,:;:,:;:;:,:;:,:,:;:,:,:;:
:,:,:;:,:;:;:;:;:,:;:,:,:;:,:,:;:,:,:,:,:;:,:,:;:,:;:;:;,;,,.:.,.;;;:;vJcl;iii;i;;iyM8Q868E6JVii;viv;;lSViiiivivivY8QDBBQB@BB@@@@@B@B@B@ct8@S8BQX8B@@@@@Q88@BEY;   ..,:,:,:,:,:;:,:,:;:,:;:;:,:,:;:;:;:,:;:;:;:;:,:,:,:,:;:,:,
;:;:;:;:,:;:,:;:;:;:;:,:;:;:;:,:,:;:;:,:;:;:;:;:;:;:,:,:,.,.,:;:;,,:;;iii;vly;;;;;VI888E8QBEt;,:;,;;;,iVcvi;iiiiiicQDtE88DBE@@@@@@@@@B@@FUEB8Z@@DG@B@B@B@@@@@B@B@6i.. :.,.,:,:,:;:;:,:,:,:,:,:,:,:,:;:,:,:;:;:;:,:;:,:;:,:;:;:
,,:;:;:;:;:;:;:,:,:;:,:;:,:,:,:;:;:,:,:;:,:;:,:;:;:,:,:;:;:;,;,;,;:,,;:;;ilJviii;X$BDEZES3MDL;.;;;;;;;;vjVii;iiiiiVB8$3SS@Q6@@B@B@@@@@B@Uy3EESC@@EQ@@@@@888@B@B8B@@BLVvi,,,,:,:,:;:;:,:;:;:,:;:;:;:,:,:,:;:;:;:;:;:,:,:,:;:;:;
;:,:,:;:,:,:,:,:;:,:,:,:;:;:;:;:;:;:;:;:;:;:;:,:,:;:;:,:;:;,;:;:,:;:;:..cjvVcvll1686$G62XvlcU;,,;;i;i;;;lli;i;i;iit8@8EFSBB2B@@B@@@B@B@BU;cOSE$Q@@@8@B@B@@@EBB@BB$@8Kvi;;,;,,:,:,:,:,:,:,:;:,:;:;:,:;:,:,:,:,:,:;:;:;:;:,:;:,:
,,:;:;:,:,:,:;:;:,:;:;:,:,:,:;:;:,:;:;:,:,:,:;:,:;:;:;:,:,:,:;:,:;:,:,:yUi,y0OtQ8E6$1MUyvviVli:;;;;;;i;;ivii;i;iivLEQ6Q@B@BBB@B@B@B@B@B@Ot26S@BDD@@@@@@@8@B@@@B@B8Q@SCFi ..,.,.;:;:,:;:,:,:;:,:,:;:,:,:;:;:;:;:,:;:;:;:,:;:,:,
;:;:,:;:;:,:;:;:,:;:,:;:;:,:;:,:;:,:;:,:;:;:,:,:,:;:;:,:;:;:;:;:,:,.:.LUi,ilMIS6EOIULllvliilV;;,;;;;;;;;i;vii;iiiiLS8OE@@@@@@@@@@@@@@B@@@B@EBE@BBB@@@B@@BQBB@B@B@@@@8$@3i,;:,:;,;:;:;.;:,:,:;:;:,:;:,:,:;:,:;:,:;:;:,:;:;:;:;:
,,:;:,:;:;:,:;:,:;:,:,:;:,:;:;:;:;:,:,:;:,:,:,:,:;:,:;:,:,:,:;:;:,.:.lU;,vyXUI66KCLVvlvliiiYi;,;;;;;;;;;;iivivii;il$8BE8B@B@@@@@B@B@@@@@B@@BB@@@8BB@@@@@BQBBB@@@@@B@B@@@@Gii;;,;,;,,:,:;:;:;:;:;:;:;:;:,:;:;:,:;:,:,:,:;:;:,:;
;:;:,:,:;:;:,:;:;:;:;:;:;:;:;:,:,:;:,:,:;:;:;:;:;:,:,:,:;:,:;:,:;:,.ll;,llVtD6SK1YjlYvlii;iii,;,;;;;;;;;i;;;;;iiiil$@B@@@B@B@@@B@B@B@@@B@@@@@@EE8S@@@B@B@QB@BD8B@B@B@BBB@63y;,;:;;;,;:,:;:,:,:,:,:;:;:,:,:,:,:;:,:;:,:,:;:,:,:
:,:;:,:,:;:,:;:;:;:;:;:;:,:;:;:;:,:;:,:,:,:;:;:;:;:,:,:;:;:,:,:;:,:il;,iljc00SKFVVllilii;iiyi;,;;;;;;;;iii;i;i;;;;i$@@B@@@@@@@@@@@@@B@@@@@B@@@lX8B@@B@B@@@O88EQ@@@B@B@@@@@QXii;,;;,;,;;;,;,;:;:;:,:,:;:,:,:;:;:,:;:,:,:;:;:,:,
;:;:;:,:;:;:;:,:;:,:,:,:,:;:,:;:,:,:,:,:;:;:;:,:,:;:;:,:,:,:;:;:,:ii;;viycS$ItXyYlliiiiiiilvi,;;;;;;;;;;i;i;iii;i;iV8E8@@B@@@B@@@@@B@B@@@@@B@@@Gi;E8@@@B@@Q68E@@@@@@@B@@@BB8@QUi, :.;:;:;,;:;:,:,:,:;:,:;:,:,:,:;:;:,:,:;:;:;:
,;:,:,:;:;:;:;:,:;:,:;:,:,:,:,:,:,:,:,:;:;:,:,:,:;:,:,:;:;:;:,.,.;i;;vilVG3OtXVVvliviiiiiivv;;,;;;;;;;;;;;;;;iiiii;yD@D@B@@@B@@@@@@@B@@@@@@@@@@@V, :X@B@E@BB8@B@B@B@B@@@B@8@@It$YV;,.;:,:;:;:;:,:;:;:,:;:,:,:;:;:,:;:;:;:;:;:;
;:,:;:,:,:;:;:,:;:;:,:,:,:;:;:,:;:,:,:;:;:;:,:,:,:;:;:,:;:;:,:,.;;;;vvyVFF3XUyYvlilii;iivili;,;;;;;;;;ivv;;;iii;i;iiG@@8@@@@@B@B@@@@@B@B@@@@@@@@@v   t@@@@@@@@@@@@BDBB@@@8B88SSi;ilii;;:;:;:;:;:,:;:,:;:;:,:,:;:,:;:,:;:,:;:,:
:;:;:;:,:;:;:;:;:;:;:,:;:,:;:;:;:;:;:,:;:;:,:;:;:,:;:,:;:,:;,;.,;;;iiiV31CFXyYvlvviiiviiili;,;,;;;;;;;;lvv;;;i;i;i;iyB@8B@@@@@@@@@@@@@@@@@B@@@EIS$;. .8@B@D@@@@@@@8D6BB@BBBBQ@O;, .i;;;;,;:,:;:;:;:;:;:;:,:,:;:,:;:;:;:;:;:;:;
;:;:;:,:;:,:,:,:;:,:;:,:;:;:;:,:;:,:;:;:,:,:,:;:,:,:,:;:;:;,,:,,;;i;vvVcXYcYyiliv;iiiiiiii;;;,;;;;;;;;;;iii;i;;;iii;iG@8B@@@@@@B@@@B@@@@@@@@@BBU;,i,: ;B@2vyBB@B@@@EB8@@@B@8B@6ii,..,:;,;:,:;:,:;:;:;:;:,:;:,:;:,:,:;:,:;:,:;:
:;:;:;:,:;:,:,:;:,:,:;:,:,:,:;:,:,:;:;:;:,:,:;:,:;:,:,:;:;:,.,.;;iiviVvvilvliviviiiiiiiiii;;,;;;;;;;;;;;;i;iii;i;;;i;J@@8@@@@@B@B@B@@@B@B@@@@@@@y:.,.: ,i: ;Z@@@@@@@B@B@@@@@SB@83V:,.,:;:;:,:;:;:,:,:,:;:;:,:;:,:;:;:;:,:;:,:;
;:,:;:,:,:,:;:;:,:;:;:,:;:,:;:;:,:;:;:,:,:;:,:,:,:,:,:;:;,,:,;;iiilivvliiiiivivii;iiiilii;;,;;;;;;;;;;;;;;;;i;i;i;i;;iB@B@@@@@@@@@@@@@@@@B@B@@@@8, .,.: ..;j@@@B@@@BB8@B@@@@QSDK@E;.,:;:;:;:;:,:,:;:;:;:,:,:;:;:,:,:;:,:,:,:,:
,,:,:;:,:,:;:;:;:,:,:,:;:,:;:,:;:,:,:;:,:;:;:,:;:;:;:;:,.;:,;viivyii;iii;;;iiiiiiiilvlii;;,;,;;;;;;;;;;;;i;;;i;i;i;i,iM@B@@@B@@@B@B@@@B@@@@@B@@@Ei.  :..  .2@@@BB@@BE8B@BBB@B8$2Vtyi:,:;:;:,:;:,:;:,:;:,:;:,:,:;:,:,:;:;:,:;:,
;:;:;:;:,:,:,:;:;:,:;:;:,:;:,:;:;:,:;:,:,:;:,:,:;:;:;:,:,.,,;;;;i;;:,,;;;;iii;iiviYyy;;,;;;;;;;;;;;;i;i;;;;;i;i;i;iii;VE@B@@@B@@@@@B@B@@@B@@@@@@@B@J, . ,;I@@8@BE8@88QBBBZ8@@06B; iiV;,.;:;:,:,:;:,:;:;:;:;:,:,:;:;:,:;:,:,:,:
,;:;:,:,:,:;:;:;:,:;:;:,:;:;:;:,:;:;:,:;:,:,:,:,:;:;:,.,.;;;;;;i;;;;,;,,;;,;;;;i;;;;:,.;;i,;ii;;;i;i;;;;;;;;;;;i;i;viii8BB8@@@@@@@@@B@@@@@@@@@@@@@B@8;.:;BB@Q8BQCB@BEB8BBBEB@@BEi. ;i;:;:,:;:;:,:,:;:,:,:;:;:;:;:,:,:,:;:;:,:;
;:;:,:;:;:,:,:,:,:,:;:,:;:;:,:;:;:,:,:,:;:,:;:;:;:,.,.:.;V2J00S2S0$CMJUlylliiii;i;;;;,;,;,;,;,;,;,;;;.,:;;iivi;;iii;i,;6@BBB@B@@@@@@@@@@@B@@@@@@@BZO@BB1I@E0B@@I0B@EB8BB@BB8@88v;.:.,:,:,:,:;:,:;:;:;:,:,:;:;:,:;:,:,:,:;:,:,:
,,:;:,:,:;:,:,:,:,:,:;:;:,:;:;:;:,:,:;:,:;:;:,:,:;:,.;;;icYVjVlLYUYULXLXXKttLXctUXLUVjyYviii;i;;;i;,.,.,:;;;ili;;i;ii;,J8B8B@@B@@@B@@@@@B@@@B@B@B@BMVIKBB@$6SE6DQ@888BE8B@B@BIv@M;.,:,:;:;:,:;:,:,:,:;:;:,:,:;:,:;:;:,:;:,:;:;
;:,:;:,:;:;:;:;:;:,:,:;:;:,:;:,:,:,:,:;:;:;:;:;:;.,,iilili;;;;;.,:,.,,;,;,;,;;;;;;;;iivilivililvyVi.,.:.;;;.,,;;;;iii;;;O0EE@@@B@B@@@@@@@@@@@@@@@@@@Xl0ESM0IS6EQ@@BQB88DBBBE@I;YU;;:;:,:,:,:;:,:,:,:;:;:,:,:;:,:,:,:,:,:,:;:;:
,,:,:,:;:,:,:,:,:;:,:;:;:,:;:;:,:,:,:;:;:;:;:;:,:,,iii;i;i;i;;;;;;,;,;,;:,:,:,.,:,.,:,:,:;,;;;;;;i;;;;:,vCUv;i;;,;;i;i;;UBBB@@QB@@B@@@B@@@@@@@B@B@B@8Q8MKGOZQ@BE8@@BB@8BB@Qcv1K1.:,;:,:;:,:;:;:;:;:,:,:,:;:,:,:;:,:;:;:,:;:;:,
;:;:,:;:,:;:;:;:;:;:;:;:,:,:;:;:,:;:,:,:,:;:,:;:,:;;;;iiivvii;;;;;;;;;;,;;;;;;;;;,;;;,;;;,;,;,;,;,;;i;i;lVF2CjYii;i;;;;;iZ@8@@BE@B@@@@@B@@@@@@@B@8B@@B@$O0S8@@B$@B@Q@BBQ@BBtUiiQi ;:;:;:;:,:;:,:,:,:,:,:,:;:,:,:;:;:,:,:,:;:,:
:,:;:;:,:;:;:;:,:;:;:;:;:;:,:;:,:;:,:,:,:;:;:;:,:;,;,;;;iYlyvviiiiiiii;;;;;;;;;;;;;;,;,;;;;;;;;;;;;;;;;;,;,iyt2$cy;i;;;;,GBZMBB88BB@8@@@B@@@@@@@@@@@@@QQE@8@B@EB@@BZB@DB@@B@Iy.vJ;.;,,:,:;:;:,:;:,:;:,:,:;:;:,:;:;:,:;:;:,:;:,
;:;:;:;:,:,:,:;:,:;:;:,:,:,:;:;:;:,:,:,:,:;:,:;:,:;,;;;;vvYlylYljlyii;iii;i;;;iii;;;;;;,;;;;i;;;i;i;;;;;;;;:;,il2OXvi;;:;yEXl2@DEZE6QDBB@@@@@B@@@@@@@Q$O@B@8@8BB@@@8@EOB@@@@;iV:;i;.;:;:;:,:;:,:,:,:,:;:,:,:,:;:;:;:;:,:,:;:,:
:;:,:;:;:,:;:,:;:,:,:;:;:,:;:,:;:,:,:;:;:,:;:;:,:,,;;iililvyljVUlVlylylYlylYlylVlviviviiii;i;i;i;i;i;iii;;;;;;.,,vtGUi;;,ilyiU6EQ$3888E@@@@@@@@@B@@@BB$8B@BB@@8B8@BQB@ZQB@@O ,;;.,:;:,:,:,:,:;:,:;:;:,:;:;:;:;:;:,:;:;:;:;:;:,
;:;:;:,:;:;:,:;:;:,:,:,:;:,:,:;:;:;:,:,:,:;:;:,:;,;,iVVyJc1cF13XFX1cFK$S3U1XMtKMCUUL1tXJXlYlliiii;ilyii;i;vii;;;;.;l2ci,;;vylvVc8E6Z8ZEB@B@B@@@B@B@@@B8QBB@8@@@8B@8E@0SB@3C1;.,,;.,:;:;:;:,:;:,:,:;:,:,:;:;:,:;:,:,:,:,:,:,:;:
,,:;:,:,:,:,:;:,:,:,:;:;:;:,:,:;:;:;:;:;:,:;,;:,:,;ivUYjVXcXc2ttKGFKKG080ItXUXM8DGX1F3C$CXF0XcVLvvlciiilivlYyv;i;i;;;vi;;;y$Ui,;2@BE06DBB@B@@@@@B@@@BB6EQB8B@@Q8B@QEEZQ@Elij;:,;,;,;:;:,:,:;:;:;:,:,:;:,:;:,:;:,:;:;:,:,:,:;:;
;:,:;:;:,:;:,:;:;:,:;:;:;:;:;:,:;:,:;:,:;:,:,:,:;,;;vvVU1cXjMCG1KVFCC13cG$I1IO60GcXt0FJUJVXFICMUjYFUl;vviiyvlii;li;;i;i;;;lXSv;ijQ@BEDEEBB@@@@@B@@@@DCQ88Q@B@BSS@@@Q@DEB@V,;i.;,;:;:,:,:;:;:,:;:,:;:,:,:;:;:,:,:;:,:,:;:,:,:,:
:;:,:;:,:,:;:;:,:;:;:;:,:,:;:,:;:;:;:;:;:;,,,;:;,;,;;vlXtMX1F0M21F2ZtOD2V13$30I21KFS$ClyL2UUjtVcUK1Xlviliiilvvivvi;iiiii;;iVUyLZtK36BQXQB@@@@@@@@@@@QQ6Q0QB@BB2EB@BQ@BilY; ;;;.;:;:,:,:;:;:;:,:;:;:;:,:,:;:,:;:,:,:,:;:;:;:,:;
;:,:;:;:;:;:,:,:;:,:,:;:;:,:,:;:,:;:;:;:;:,:;:,:,:;;;;iiUJ2XCKO1J2D1UMQFUcZ6SF3FtVtFFYyjIXcVccJjXVjvviyvviVlliiii;i;i;iii;iiUltQCi;iQE0Q@BBB@B@B@B@B@8SIQQ88@BZE@@@6QQIi:.::;,;:,:;:;:;:,:,:,:,:,:;:,:;:,:,:;:;:,:,:;:;:,:,:;:
,;:;:,:,:,:,:;:;:,:,:,:,:,:;:;:;:;:,:;:,:;:,:,:;:;;i;iivV1XXU2O0XZ0KJC1M2SCMXCtJyUcMcLVFFYvylcUK1jviivvyiYVliviv;vyl;i;iil;;UUvKcCli1BBBQ@BB@@@@@@B@@8GE@@E8BBSB@@B8DBc;.,.,:;,;:,:;:;:,:;:,:;:,:,:,:,:,:;:;:,:,:,:;:;:;:;:,:,
;:;:;:,:;:;:,:;:,:,:,:,:,:;:,:;:,:;:,:;:,:;:;:,:,:;ivii;VU3F1XSS0I1J602S0JXyJC$1Jc2FtVUVjyyljVUVUyyvyyjlyyy;iyUiiiyvv;iivv;;lv;;JSMvYOBB8E@8BB@@@@@@@EEQBB@8@8E8@8@Q8Qv :,,:,:,:;:,:,:,:,:;:;:;:;:,:;:;:;:;:;:;:,:;:,:,:,:;:,:
,,:,:;:,:;:;:,:,:,:;:;:;:;:;:,:;:,:;:,:,:;:,:;:;:;,;;iiyyUM01F3SJFXIO3cItVyX3SFtUXJFJJlVljjLJCyliyyVlLlliLliijyv;iiiiyilLi:;;;;,c8yvlME@8E6@88E@B@@@@@BBQQS8EBBBB@88QBU;.;:,:;:;,;:,:;:,:,:;:,:;:,:,:,:;:,:,:,:;:;:,:;:;:;:;:,
;:,:;:,:;:,:;:;:,:,:;:;:;:;:;:,:,:,:,:;:,:;:,:;,;:;;;ivvllttFtIXUU3FJyXFGcUXGcliyVtJXVLlYUOVULYlyvVlllVvllv;vvVllvl;ivyFU:;;;:l33yilOK8QBBB@@SIMSE@@@B@B800Z$$@B@@B8@y;:::;:;:,:;:,:;:;:;:,:,:;:;:,:,:;:;:,:;:,:;:,:;:;:;:,:;:
:;:,:;:,:;:,:;:,:,:,:,:,:;:,:;:,:;:,:,:;:,:;:;:,:;:;;;;i;YJXL3FLyXXMUJLtcFXFUYvUU1KXvllliX0XlYljlVVLvyyyiliiiVVULUvVlyLV.,;i,;V8i..;vVGBSEB@BB$3GB@@@@B8$6DQ1S8B8@QB@v ;.;:,:,:,:;:;:,:;:,:;:,:,:;:;:;:;:,:;:;:,:,:;:;:;:,:;:;
;:;:;:;:;:;:;:;:;:;:,:;:;:;:;:,:;:;:,:,:,:,:,:;:;:,,;,iivYtjctIUCccjMKtYcU1UUVX3GXKYviVvvy1yjccYYvjUYvYvlvyljYliyyVyXtG;.,i;;,ii,.lyyltZ8OE8@B@EEQBB@BBQQQBQ06@Q8BBB@U.:;.;:,:,:;:,:,:,:,:;:;:,:;:;:;:;:;:;:,:;:,:,:;:;:,:,:;:
,,:,:;:,:,:,:;:;:;:,:,:;:;:,:,:,:;:,:;:;:;:;:;:;:,.;;;;iiyVXUXXKjJjtt3MGFtYylJJXVUVLjXLjyXyvjScjlvVFlllUXtVyyUlliV1XJ8L,.;;;:;;;:ycVlXvcQ88B8@B@EEQ@8BQEQBB@ZQ8B8@$B@J ,:;:;:;:,:,:,:,:;:;:,:,:,:,:,:,:;:;:;:,:,:;:,:;:,:;:,:,
;:,:;:,:;:;:;:;:;:,:;:;:;:,:,:;:,:,:;:;:;:,:,:,:;:,,;;;;iijXXVJUyL$O3UJc3FjYMcUyjLUF0tJyVyyiYVllYiLjYvYYCGJilt3LXK1F8V;.,,;;;,,.vUY;;Vv;3O8B@ZQB@EBBBZ88B8@BQOE8@BE1y,..,:,:;:,:,:;:;:;:;:;:;:,:;:;:;:;:;:;:;:,:;:;:,:,:;:,:;:
,,:,:,:;:;:;:;:;:;:,:;:,:,:;:,:;:;:;:;:,:;:,:,:,:,:,;i;;;lVXUJVUUcVJU1VyytVFILvVcFlUylYMyvivilvcjllliylyVMMCUUlVF01EG;.,,;,;,;:;ii;i;;;vivUQ8D3BBB8@SSQBDB@BI$QB@@Bi :.,.,.,:,:,:,:,:,:,:,:;:,:,:,:;:,:;:,:;:,:;:;:;:;:,:;:,:,
;:,:,:,:,:,:,:;:,:,:;:;:;:;:;:,:;:,:,:;:,:;:,:;:;.;:;;;,iiYycJKVjYUjUVUV1JLVJYUJ3VvVUvMMlililVccjycyVc3XCUt0CytI3cBE;.,,;,;,;,;;ly;,;;,;v;;iOQQQ8E8SS$QZQE@QOO88@BBiii;.,:;:,:,:,:,:;:;:,:;:,:;:;:;:,:;:,:,:,:;:,:;:;:,:,:;:,:
:,:,:,:,:;:,:,:;:;:,:,:,:,:;:;:;:,:,:,:,:;:;:;:;:;:,:;;iiiiyVF1MVXccjcU13Jivi3OZFlvUUJCFvVVYyUyViYXXj31UVUU32IXCOBBK:::;,;;;,;;;;J;;;i;iS2,;V8E@BB8EZQZ6S88SMQEBB@8cii;;;;,;:;:,:,.,:,:;:;:,:;:,:,:,:,:;:;:,:,:;:;:;:,:;:;:,:;
;:;:;:;:,:,:,:,:;:,:;:,:,:;:,:;:,:;:;:,:;:;:,:;:;:;:;:;il;ilclyjcjXUcYLj3YlvY6BZMV0cXG0cJVKVYyUJVJOKXjUyJK$SQCXCBBQ,.:;;;,;,;;;,;i;.;,;1@Xi;XDB@@B@DQ$ZOQEEM368Q@BQV;.;;;;;;;,;,;,;:,.,:,:,:,:,:;:;:,:,:;:;:;:;:;:;:,:;:,:;:;:
,;:;:,:,:,:,:;:;:;:;:;:;:;:;:,:;:;:,:,:,:;:,:,:;:,:;:;,iliijKtj1VcJCcVy3O3CIF0M21IEQO8Q3UJIKvyVMXMGZXUJ0SSIIF8@B@@i.:;,;;i;;,;;;,;:;;;:iVy;vUSD@@@BBSG$B8BD6Q@@QQ8Vli;,;;;;;;;;;;;;;,;,;:;:,:,:,:;:,:,:,:,:;:;:;:;:,:,:,:,:;:;
;:,:;:,:;:,:,:;:;:,:;:,:;:,:;:;:;:,:;:;:,:,:;:;:;:;:;:,,iiiiUJ1FIXt1S$DD$K2tFXCK33$FMCQGFC8OLVXjF2S33XKCG1$68B@S0y;.;;;:;;;,;;;,;,;,vi;.ii;;lJOE@@@BEKQBBBB8B@@Xyyv;;;;:;;;;;;i;i;;;;;;;;,;:,.;:;:,:;:;:,:,:,:,:;:;:,:;:,:,:,:
,,:,:;:,:,:,:;:;:,:;:,:;:;:,:,:,:;:;:,:,:;:,:;:;:;:,:,:;;v;;ilyXXFUcXZ$330X1KZ0$MMXUYX3ZCGIFLGSZSBOKMDG0SEE@@Syy;,.;,;,;,;,;,;,;,;:;iXi,;i;ivX0BB@8BQZE@8@BBS8QV;;;;:;;i;;,;;i;i;i;;;i;;,;,;:,:;:,:,:;:,:;:;:;:;:,:,:,:,:;:;:,
;:;:;:,:,:,:;:,:;:;:,:,:;:,:,:,:,:;:,:;:;:,:,:,:;:;:,:,,;;;;viiiJK3JCGSJGSS0EE8S02G3OISGS6ZJK$DIQBBKZE8E@@BB@2;:;:;,;,;,;,;,;,;,;,;,;;;:i;;illO8@B$S8Q@BDQ8ZEIVii;;,;,;il;;;;;iii;iili;,;:;;i,,:;:;:;:;:;:;:,:,:,:,:,:,:;:;:,:
,;:,:;:;:;:;:,:;:;:;:,:;:,:;:;:,:,:,:,:;:;:;:,:,:;:;:,:,:;;i;i;vYXFZ$6G6ZQ$0CO3$200EQE6ZSBZGG8IIQBDDS88@@@@@@J:;;;;;,;,;,;,;,;;;;;;i;;:;;i;VviVIE@QBBB8QKD8@@$viii;;;;:;;;,,,iiviyVKcVi;.:,il;.,:,:,:;:,:,:,:,:,:;:;:,:;:;:,:;
;:,:,:,:,:;:;:,:;:;:,:,:,:;:,:;:,:;:,:;:,:,:;:,:,:,:;:,:;,;,;iiiYYJ3DMOSEZDKtUK3Z0OGQS668QESQSSD@BDS@B@B@@@Bt,,;i;i;;,;,;;;,;,;,;;;;;,;;v;;ltivVMS8@@B@BQS@B@SUvv;;;;;;,;.,,;iUctVt112Sli,;jX;,:,:;:;:,:,:;:,:;:,:,:,:,:,:;:,:
,,:;:,:;:;:;:,:;:;:;:;:,:,:,:;:;:,:,:;:,:;:,:,:;:,:;:,:,:,:;:;;lvVyF1UUccO$Q68D$IQ$SO3tOQBEESEE@B@B@@@@@@BOj;;;;;;;;;;,;,;,;;;,;;;,;,;;;;i;;tZUXv1ZQ8@B@$M$@B$ylvv;;;i;;.iCEQDGQI3SB88@@Q@BS;..,:,:;:,:;:;:,:,:,:;:,:;:,:,:,:;
;:,:,:,:,:,:,:;:,:,:;:,:;:;:;:;:;:;:;:,:;:;:;:,:;:,:;:;:;:,:,:iiivVU1lVl3SD$EEB0S68Q8DE8@BBZEB@B@B@@@B@BBFl;;ii;;;;;;,;;;,;;;;;;;;;,;;;,;vY;l3Z1JC30B8EEB8@BBMVlVii;;;;:.V@B@XlillJ0@B@@8BJ:..,:;:;:,:;:,:;:,:;:;:;:;:;:,:;:,:
:,:,:,:,:,:;:,:,:,:,:;:,:,:;:;:,:,:,:,:;:,:;:;:,:;:,:;:;:;:,:;iiiylXUll3Z88BZEEB88Q88@@@BBB@B@B@@@@@@@82cVivii;i;;;;,;,;,;,;,;,;;i;,i1i;;iVjlIFjyIFDB@8@B8I8EZXVvviiii;; ;Q@BV;;;;,;l@@@,  ..,:;:;:,:;:;:,:,:,:,:;:;:,:,:,:;:;
;:;:,:,:,:;:,:,:,:,:;:;:;:,:;:,:;:;:;:;:,:;:;:;:;:;:,:,:,:;:,,i;iilvllSEQS86QEB8B8B8BB@BB8@@@B@@@@@8DD0vVyyii;i;i;;;;;;,;,;;;,;,;;;,iUXli;vVODXvlGD3BB@@@CK6EI3Vlilii;;;,.V8v;i;i;;,,K@Bv.:.,:;:,:,:,:,:;:;:,:,:,:;:,:,:,:,:;:
,,:;:,:,:;:,:,:;:;:;:;:,:,:,:,:;:;:,:;:,:,:;:;:,:,:;:;:,:,:,:;,,,;vVvV2QO6OIGQ8@68@@B@@@@BB@B@B@B@@QlcXLyjlvii;i;;;;,;;;;;,;;;,;,;,;,;;lli;ivM3CtZ888@B@Q$OESI3$Ylivii;;.,l0llvli;,;;;i$Bc,..,:;:;:,:;:,:,:;:;:,:;:,:,:,:;:,:,
;:;:;:;:,:;:,:;:,:;:;:;:,:,:,:,:;:,:;:,:,:,:,:;:,:;:;:;:;:,:;:,.,,llJcVlcMtlFO8BB8@E@@@8B8@@@B@B@B@83VcYVvvvv;i;i;;;;,;;;;;,;;;;;,;,;:;;UtViiX8GO2BB@@@@@8E68SEQMyyil;;;;:VGXlyll;;;;,;iVi;ii.,:,:;:,:;:;:,:,:;:,:,:,:;:;:;:;:
:,:;:,:,:;:;:,:;:;:;:;:;:;:;:,:;:,:,:;:;:,:,:;:;:,:;:;:,:;:;:,:;,;;iiUvvlUvijSQB8BSZ8@@BQ@@@@@@BEGFD3yiYviivii;i;i;;;;;ii;,;,;,i;;,i;;i;;VX1U$8S2GQB@@@@B@E8@@8821yvii;i,,l6Vyiviv;;;;;iilVl,..,.;:,:,:,:;:;:,:;:,:;:;:;:,:,:,
;:;:,:,:,:;:;:,:;:,:,:,:,:,:,:;:,:,:;:;:;:;:,:,:,:,:;:;:;:;:;:,,;:,;i;iivlvit3$O8BB6BBBB@B@B@8QMJVlvVivllilii;iii;;;;;;,;;;;;;;ii,iliiFl;iVyVX8ZQO8E@@@@@@@@@BB8ZXlii;i;;:yEMLYvlii;i;ivVvjli;i;,:,:;:;:,:;:,:,:;:;:,:,:;:,:;:
,;:,:;:;:;:,:,:,:,:,:,:,:;:;:;:;:,:,:,:,:;:,:;:,:;:;:,:,:,:,:;:;,,.;i;;iiyvyJXL$688B@@68@@B@01VyvylyiVyylyiv;i;iii;;;;;;,;iivyivilyUllUti;iLiJQ8E8B@@@B@B@@@BB8@QMvvii;i;,;@@@K1yl;i;;;iiXFDQGci:,:,:;:,:,:;:;:;:;:,:,:;:;:,:,
;:,:;:;:,:;:,:,:;:;:;:,:;:,:,:;:,:;:,:,:,:;:,:,:,:,:,:;:,:,:,:,:,:;:;.;;iiviyj2G3F6Q@@BS8@BtlivillLlVUclyvi;i;iii;;;;;VU;;v;vVYiivJVv;llv;VOt3BE8B@B@@@B@B@@@QB@8KFlvivi;,,M@@@BEMVii;i;iUXlli;,,:,:,:;:,:;:;:,:,:;:,:,:;:;:;:
:;:;:,:;:,:;:;:;:,:;:,:,:,:,:;:,:,:,:,:;:;:;:;:;:,:,:,:;:;:;:,:,:;:,.,,;:;iyvVLXYUX3F0CUy2Li;villyvyVjvvivilll;iiiii;Ytc;iii;ycV;iYciivVvlX0OBQQ8BZ@@@@@@@@@B@@@B8KUlvii;;.;vi;ilVllii;;,y3ti;...;:;:;:,:,:,:,:,:,:;:;:;:,:;:,
;:;:;:,:,:;:;:,:;:;:,:,:;:;:,:;:;:;:,:;:,:;:,:;:,:;:;:;:,:;:;:;:;:;:,.,:;;liiivvvillYvyivvliljLlLllvlii;vilV1Yviiiyiivl;iYYvllXl;itUVvVYVVFIE8QIEQ68@@@@@@@@@B@@@8E3MVlii;,.;.,:;,;;i;;.,lD2Qv..,:,:,:,:,:;:,:;:,:,:;:,:;:;:;:
,,:;:;:,:;:,:;:;:,:,:;:,:,:,:,:;:,:,:,:,:,:;:;:,:,:,:;:;:,:;:;:,:;:,:,:;,;vlii;iiiiviviylVcCKOJUcIJVvlYcVLvvilvli;;iiv;iv1llvvyLiLGIJXjLU136KQQSOBBBB@@@@@B@BUX@B@@@SSJcUy;,;iii;iiiiiilv0B8Q$i,:,:;:,:,:;:,:,:,:;:;:;:,:,:;:,
;:;:;:,:;:,:,:,:,:;:,:,:;:;:;:;:;:,:,:,:,:;:,:,:;:;:,:,:,:,:,:;:;:;:;:;:,,viyvi;viiiivLcJyOQ8$XV$QDI32E$tUtlVlvlYvyvUFXJjvyvVlLMXVGtUcUY21302ID6BB@8@B@B@@@B@; 1@@@B@EQ0Oyi;;iyivvllXLO@@@@8GJv:,:,:;:;:,:,:;:,:;:,:;:,:,:,:;:
:,:;:,:,:;:;:;:;:;:;:,:;:,:,:,:;:;:;:;:,:,:;:;:;:,:,:,:,:,:;:,:;:;:;:,:,:;;;iLviiylVyVc$MMG8S2VcK$0Q66G3VKGS2XLFtXyvvtMSXLY2SFlJXJSEIDIOI3MSIZSB@@S@@@@@@@@@BQ.,vB@@@@@@QZIJiiiyVYjM3@B@@Bi;:..::;:;:,:,:,:;:,:;:;:;:,:;:,:;:,
;:,:;:;:,:;:;:,:;:,:;:,:;:,:;:,:;:;:;:,:,:,:;:,:,:;:,:;:,:,:;:;:;:,:;:,:;:,.iVVlllXtUlXGO$QSD06DE2$SESGC$3ZGKU3OMVVvjtS$6OG$$jU1QSB@B8B6It66QE86BQD@@B@@@@@@icv  .i1@@@8@E8ZFiil1FZ8@DBSJl; ..,:;:,:,:;:,:,:,:;:;:,:,:,:,:;:,:
:;:,:,:;:;:;:,:;:;:;:;:;:;:,:,:;:,:;:;:;:;:,:,:;:,:,:;:,:,:;:;:,:,:;:;:,:,.;vcLVvjtCylVKK8Z6Z@@@@ESEQBQ8QDGGJcc2XUYJ1$O$OQQZCOIZSDEBQ8Q$LjUK0@B8SD0@@@B@@@S; .;, . ;yOvU@@BB3S3QQ@@@BcvY,..,.,:,:,:,:;:;:,:,:,:;:,:;:,:,:,:,:;
;:;:;:,:,:;:;:;:,:;:;:,:;:,:,:,:,:,:,:;:;:;:;:;:;:;:;:,:;:;:,:;:,:;:,:,:,.,ijVJVVycLYilLSB80EB@@@B@8BB@886ES$3030MIOEQ8QE6D2G$ESSO88B8QMcYt1G8@@@B88@B@@@@@l: ;,,.:   ,.i@@B@@@8@Z@BBSi ..,.,:,:;:;:,:;:;:,:,:;:,:,:,:;:,:,:;:
:,:;:,:;:;:;:;:;:;:,:,:;:;:,:,:;:,:;:;:,:,:,:;:,:;:,:,:,:;:;:,:;:,:,:,:,:;illYlcULlVyviXB@BEQ@@@8@@BE@@@Q88BB@88E8QBB@8@EQZE6D$EQ888Q80Fj1$B$8B@B@B@B@B@B@Gi.,.;,;.,.... ,;Y@@@3286Xyi:..,:;:;:;:;:;:;:,:;:,:;:,:,:;:,:,:,:;:,
;:;:,:;:;:;:,:,:;:,:;:;:,:,:,:;:,:,:,:;:,:;:;:;:,:;:,:;:;:,:;:;:,:,:;:;:,;viivlVCcLUUiv1B@@QB@B8@@@8BB@88E88@@@8B8BB@E88E3EEB$338BDMGC2VLV2SD8@BBQ8BB@@@@@; ..,:;:;:;:,.:   ;O@i:;i:. :.,:;:;:,:,:,:;:;:,:,:,:,:,:,:,:;:;:;:,:
:;:,:,:,:;:,:,:,:,:;:,:,:,:,:;:;:;:,:;:;:;:,:,:,:;:;:,:;:,:;:,:,:;:,:,:,:;;iiylt1ccOUvySQ@B6E@0ZQSGBB@Q6DB8@@@@B8BE@B86B8E$Z88C$E@tVVFK3tCK008B@BB8@8@B@@@i..,.;:,:,:,:,.,.. ... . ..,:;:;:,:;:,:,:,:;:;:;:;:,:;:;:,:;:,:;:,:,
;:;:,:,:,:;:;:;:,:,:,:,:;:;:,:;:,:,:,:;:,:;:;:,:,:,:;:,:;:,:,:,:;:,:;:,:;:;;lljUUy3QOijQ@@BFIS3CSt0EBSGOB@@B@@@BBEB8@EBB@@QI8QDD@B0VUXSDESZ3$Q@@@B@@@BB@@@,.,.,:,:,:,:,:,:,:,.:.,.,:,.,:;:;:,:,:,:,:;:;:,:;:,:;:;:;:;:,:,:,:,:
,;:,:,:,:;:;:;:,:;:,:,:;:;:,:,:;:,:;:,:;:;:,:,:,:,:;:;:,:;:,:,:;:;:;:,:,;;;ivVyLVXZ@QLc@B@8XJZOD03O@BBQ@@@B@B@@@BB8@@@8B8@E8B@S8@@Q$KGSQZE$3CQ8@@@@@B8E@B@y.,;.;:;:;:,:,:;:;:,:,:,:,:;:,:;:,:,:,:,:,:,:;:,:,:;:,:;:;:;:,:;:;:,
;:,:,:,:,:,:,:,:,:,:;:;:;:,:,:;:,:,:;:,:,:;:,:,:,:;:;:;:,:;:;:,:,:;:;,;:;;i;lyUyCS@@@cCB@@BcKEBBBQ@@@@@B@@@@@B@@@ED8@@BZZ3ZE@B8D@@80ICSOEB8MG$BB@@@8@B@B8B@v,,;:;:;:,:,:;:;:;:,:;:,:,:;:;:,:;:;:;:,:;:,:,:;:;:;:;:;:;:;:,:,:;:
:;:;:;:,:,:,:,:,:,:,:,:;:;:,:;:;:,:;:,:;:,:;:;:,:,:,:;:,:,:,:,:,:,:,:;.,:;iivclj3BB@BQSBBBSFC8B@B@@@@@@@@@@@BBB@BBS8@@EDKC08B@888@88QEOD8@8SIS6B8@B@B@@@IEBV.,:;:;:;:,:;:;:,:;:,:,:,:,:;:;:;:;:,:,:;:,:,:;:,:;:,:,:,:;:,:,:,:,
;:;:;:;:,:,:;:,:;:,:;:,:;:,:,:;:;:;:;:,:,:;:;:;:,:;:;:;:,:;:,:,:;:,:,:;;vvviFXj2@@@@@B@8BQI2QB@@@SEB@@@@@@@B@EB8B@@E@BBD21BB@88QQ$8Q88ES8DSSZGZ$Q8@@@@@Z1i; ..,:,:,:,:,:;:;:;:;:;:,:,:;:;:,:;:;:;:;:;:,:;:,:;:;:;:,:,:;:,:,:;:
,,:,:;:;:,:;:,:,:,:,:;:,:;:;:,:,:;:,:;:;:;:,:,:;:;:;:;:;:;:;:,:,:,:;:;,;;ilVVLU8@@@@@@@@B@EBB@@@B@8@B@@@B@@@B88@@@Q6B@BB3C8@B@8BQEBBSBB8DQSDG$K2M8@@B@@v.  :.,:,:;:;:,:,:,:,:;:;:,:,:,:,:;:,:;:,:;:;:,:;:,:;:;:;:,:,:,:;:,:,:,
;:;:,:,:;:,:;:,:;:,:,:,:,:;:,:;:;:,:,:;:;:,:;:,:;:,:,:;:,:,:,:;:;:;:,:;:,;ivyl28@B@@@@@@@@@B@@@@@@@B@@@@@@@B@Q8B@@BSBB@@QG88@88E@@@B88@8@B8GQQBQ608@@@X.:.,:,:,:;:;:;:,:;:;:,:;:;:;:,:,:,:,:,:,:;:,:;:;:;:,:;:,:,:,:,:;:;:,:,:
,,:;:;:;:,:;:,:,:;:,:;:,:;:;:;:;:;:;:,:;:,:;:,:;:,:;:,:,:,:,:;:;:,:;,;:;;;;vV16@6ZQ@B@@@@@@@B@@@B@@@@@@@@@@@@88B8@@B@@B@8B88QBB@888@B@8BB@88D8B@8Q6$li,..,.,:;:;:;:;:,:;:;:;:;:;:;:;:,:;:;:;:;:,:;:,:;:;:,:;:;:,:,:;:;:,:;:,:,
;:;:;:;:;:,:;:,:,:;:;:,:;:;:;:;:,:,:,:;:,:,:;:;:,:,:;:;:,:,:;:;:;:,,;:;.;;iilYFFG$8B@@@@@@@@@@@@@B@@@B@@@@@@@B@8B@@E@B@B@BB88E@@@DBB@BBB@B@@@8BEB8El, ..,.,:;:;:;:,:,:;:,:;:,:,:;:;:;:,:;:,:,:;:,:,:,:,:,:,:,:;:,:,:;:;:;:,:,:
,,:,:,:,:;:,:,:,:;:,:;:,:;:;:;:,:,:,:,:,:,:,:,:;:,:,:,:,:,:,:;:,:;:;:,:,,;;ilUvJSED88@B@@@B@@@@@@@BB@@@@@@B@@@8Q8@@@B@@@8B8@B@B@@BB@8B8B8B888@8BEDMy...,:;:;:,:;:;:,:,:,:,:,:,:,:,:;:;:;:;:,:;:,:;:,:;:,:,:;:,:;:;:;:;:,:;:,:;
;:,:,:,:;:;:,:,:;:;:,:;:;:,:;:;:;:;:;:;:;:;:,:,:;:;:;:,:;:;:;:,:;:,:;,,:;ivillU0B68Q@@@@@@@B@@@B@BBO@B@@@@@@@@B8@B@@@B@@B68B@BBB@@@@BE8E88BQ8EB@@BC.  ,:;:;:;:,:,:;:;:,:,:,:;:,:,:,:,:;:,:;:;:;:,:,:;:,:,:,:;:,:,:,:,:;:;:;:,:
:;:;:;:;:,:;:;:;:;:,:,:;:,:,:;:,:,:;:;:;:,:,:,:,:;:;:;:,:;:,:,:;:,:;:;:,;iii;vX@BB8@@@B@@@@@@@B@@@B@QFM@BB8B@@B@B@@@B@@@BB@@BB8@@BBBQ8Q8QB8BE8SDSBDy ..,:;,,:,:;:,:,:,:,:;:;:,:,:;:;:;:,:,:;:;:;:;:;:;:;:;:;:,:;:;:;:;:,:;:,:;
;:;:;:;:,:,:;:;:,:;:,:,:,:;:;:;:,:;:,:,:;:,:,:;.,:,.,:,.,.,.,.,:,.,.,.,:;:iillSB@B@@@@@B@@@@@@@@@B@Bl .v; ,,;v$D0Lt8@@@@@@@@@B8D88@BBEB888@BBSSGSCS81;,.,:;:;:;:,:;:,:;:;:,:,:,:;:,:;:,:,:;:;:,:,:;:;:,:,:;:,:,:,:;:,:;:,:,:;:
,;:,:,:,:;:,:,:;:,:,:,:;:;:,:,:;,;.,.,:,:;,;:;:,:,:,.,.,:,::.:.:.:.,.,,;;iiyyF6@B@@@@@@@@@@@@@@@B@SV;  .:. :.:,;ii:v086@@@BB8@QE8@B@BB8@B@8802JFJXY2BC;..,:;:;:;:,,,:;:,:,:;:;:;:;:;:,:,:;:,:;:;:;:,:;:,:,:;:;:,:,:,:,:;:;:,:;
;:,:;:;:,:;:;:;:;,,:;,;,;:,,;:,:;:;:,:;,;,;,;,;:;;;,;:;;iiiii,;,. ..;;i;villJFZQ8Q@@@B@@@@@B@@@@@Bv   ii;:,.,.;,;;;;vJS8@BBDB@BDB@BZ8B8SBBB88IFVVj1yUl;.:.:.,.,:,.,,;:,:,:;:,:,:,:,:;:;:,:,:;:,:;:,:;:;:,:;:;:;:;:,:;:,:,:,:,:
,,:,:,:;:,:;:;:;,;:;:;:;:;:,:;,;:;:;:,:;,;:;;;;iiUlYYyivyyvylYVU;iiviiivvylVVKIEQ8@@B@B@@@B@@@B@B@0Xlyi, ,.;:,:;,;;;;cS6Q@B@@@8ZQBQZZ@8$K8B@@@D3UtXXivVJi;,;:,.,.,.,:,:,.;:,:;:;:,:,:,:;:,:,:;:;:;:;:,:,:;:;:,:;:;:,:;:;:;:,:;
;:;:,:;:;:,:,:;:,:,:,,;:;,;:;:;,;:;:,:,:;,iiiilL2cViyVjlUtKyVLVl1X33$JyiUUcJ68@8B@@@@B@B@@@B@B@B8E@@@2yv: ..,:;:;;;,;iFGE88E@@@ZBB@E8@@6$S8Q@B@8ZFMtJyVyVllii;;,;:,.,.,:,:,:,,;:,:,:;:,:,:;:;:;:,:;:;:;:;:;:,:;:,:;:,:,:;:,:;:
,,:,:,:;:,:;:;:;,;:;,;:;:;:;:;:,:;,;;iiviiivii;;;vlliyj1F$KCLGCSQQD@@B0IO6GSE@@@@@@@@B8@B@EB8@EEZCcM8@@@X;...,:;:;;;;vVBBB88B@BB@@8B@@BEG8Q88@@@EDG63FlyljVliliiivii,,:,.,:;:,:;:,:,:,:,:,:,:;:,:;:,:,:;:;:;:,:;:;:,:,:,:,:;:;
;:,:,:;:,:,:;,;:;,;,;,;:;:,.,:,,;;iiyyVivvi;;;iii;lYUyUVFXXXtCO3S08B@@BQ@@@8BB@B@@@@@@@BBS$S@B8Q@SG2D8@@@@X;,.,:,,;;i;lQ@B@B@@@@@B@Q@@@ZSZEO6863B8888OJvllLUUcCUYvliiiii;;;,,.,,;:,.:.,:,:,:;:,:,:;:;:,:;:;:;:,:;:;:,:,:;:;:;:
,,:,:,:,:;:;,;,;,;:;,;.:.::;;;ivivilvlii;;;;;ylLYlvyvviyyUyVlcLcX3GE8BEE8@B@@@@@B@B@B@B@BQ068BSMX8E0LUM8@@Ey;,:;:;:,..;EB@B@B@88ME8BB@@@B@6S3@8FM@QStcVLjXJ2FKUUlyyYvYYVvi;;;i;;,;...,.,.;:;:;:;:,:,:,:,:;:,:,:;:;:,:,:;:,:,:;
;:,:,:,:;,;,;,;,;,;,, :,vyVlllUlyvlilivvylVvvivivivvyvlvyivlLlVU3C$SEQE686EQB8@@@8BE8SQSEEBE86ZXV0SctX1U36SUl,;:;:;,:;I@@8@QZLcUlvtS$USQ8B@BS28UjQSFG30COKFLUYjyliyvVVVvVlylViiii;;iFJ; :.,:;:,:,:,:,:,:;:;:;:,:;:,:;:;:;:;:,:
,;:,:;.;,;,;,;,;,;,,.;V02UlUcUlyyVvvillcLVvYlliviiilllvllvvUccVcXMK3FCXFC$I$IZZ8EBZSFFXMM6B@E88@EBSZQ8I1JMMOl;.;,;,;.,ij;;;ii,;li;;v;ili;lS@U;;;iXv1E8F13$yllccXlVVcVjlyyUylvlvyljjMCEJv;, ....:.,.,:,:,:;:;:,:,:;:;:,:,:,:;:,
;:,:;:,:;,;,;,;,;,, ;I@VlilFKVjyVllljyYyUyyycvylyvyvylYycYVyULUlLcCM3XXUKF3CSGSODSZ3GF2MO3E8@B@@@@@B@@@B@SVly;;,;;;,;.,;;.;;;.,;;;i;;iXlYlMDUillviV3IJyilljKFyVUXLJjXYUVLyUjUVLyjyVyUcG2MLl,,.. . ..:.,:,:,:,:;:;:;:;:,:;:;:;:
:,:;:;,;,;,;,;,;,,.;I8Jv,ijKVcXCLi;ylyvylVvylyyVlYlYlLVUYVvllJVVlUXIM3F3M3C0GZO$3$GD6QO$33KSQ@BB8BB@B@B@B@F. ;;;;;;;;;;ivyii;;;;;;ii;iiVLVivijVVvj1MlVLyi;iZIFJ3tcylilyyiiilyjVJLcVYvllLlX3KJXYyii:. . ..,.,:,:,,;:;:,:,:;:,:;
;:;:,:,,;,;,;,;;;. c@BFi;y0UcXFKi;ycyvlvyivivvlljyVyVYjYjvlvjjVlVUFF3F3K212FGISG$M0SQ$Z$6KG0EEBB@8@B@B@B@B@V;ivivii;iicK2VY;;;i;v;;;i;;,;;viv;;;i;vyjKFlcXGS6GGUyvYllvVlYvlvlvYyUUtX1XKtMXKMIF31G3ILVii,. . ..,:;,;,;:,:;:;:;:
,,:;:;:;,;,;;;;;..;B@B8$MES1VUV1yC8BZSYlivilvYlVlVyVlYvVUUVcctVVYVlVYJJ11GC0GZ06G0I$IG2S$EQB8@B@@@@@@@B@@@B@;ilVljlyvVXCJUYvii;lvli;;;;;,ivcLliv;;il;VX3FQS0cUjXX$68SQ68SZZQF3C$0QSQZ60DSQGIcUlylXXJX0tcVVi;...,:;:,:;:;:;:;:;
;:,:,:;:;,;,;;;,,i@@@@@BBQQMXLLJ6DSQZt8LvillylVvlvYlVlyljYUVcVLllillXMS6B8B8@BB8BB@886ED88BB@B@B@@@@@B@@@@@ZilKlLXcyUX$MXyViVlvyVvjvvii;;;Y12llviiV;,;vlvilCIcMGGLjcCKIF1X0S6SEZEQ8E@B8QB@@B@B@8QS88ESQ$$0EEBX;.;:,:;:;:;:,:,:
,,:;:;:,,;,;,;,;,OB@@@B8ZEB@0OQBS8KXyU8QylvLyyvyvlvlvlvlilvlvvilyM6@B@@@B@@@@@@@B@@@@@B@B@B@@@B@B@B@@@B@B@@OU0KcUtcLL2I2yYVcVUlylviVVYiviy2ZVlvliiiiivvVi: llj$@Qi               . .,;,;;iiiilljYX2D0E@@@@@@QV.,:;,;:;:;:,:,:;
;:,:,:;:;:;,;:;,,;;;;v@@@@@@@@@Q3S2jQB@8ZtMG$CMXKXtLJVcyvivillJK@@@@@B@@@B@@@@@@@@@B@@@B@B@B@@@B@@@@@@@@@B@B@@B8B68S62CVcUylVV1LMjVyVvlyGQ8XylUli;vYliYVV;iyviyY$8Si. ..:.:.,.:.. . . . .         . . ..:.,.. ,:;:;,,,;:,:;:;:
:,:,:,:;,;:;,;,;..   ;6@BE8@B@@SF20@@@@@8ESQQ8$SS6OZ0SO$KGIQB@@@@@B@@@@@@@@@B8SZGG2IKMctjlvlvlilvllVVUjKCSDBB@@@@@@BZSKKccVYvylYlUvv;iivC@$Y;ilyivlliviiiUMFyl;;i1EQXy,,,;,;,;:;,;:,:,:,.;.,.,.,.:.:.. . . ..,.,:;:,,;:,:,:,:;
;:,:;:,:,.,:;,;:;:,.:..    ...V@@@@@@@@@@@@B@B@@@@@B@@@B@@@B@@@@@BQtVii;;:,.:.:.:.: . . . . ..,.,.;,;,;;;;iilY1K$$8EEI3t1cLlyvlivvliiiiiOBZilvyvlilii;iiiiMUVi;i;.;Vti,.;,;:;,;:;,;,;:;,;,;,;:,:,.,:;:,:,.,.,,;,;:;,;:,:;:;:;:
:,:;:,:;:,:,:;:,:,:,:,.. . . .i@B@BBQ88@@@@@B@B@B@@@8BQ8EQ1Lvi;, . . ..:.,.,.,:,.,:,:;:,,;,;,;;;;;;;;;;;;i;i;iii;ivM$$t1Jclliliv;iililvl2@Iylyvlii;;;;iliij0v;;i;,.ilv::.;,;,;:;,;,;,;,;,;,;,;:,,;:;:,,;:;:;:;:,:;:,:,:;:;:;:,
;:,:,:;:;:,:,:;:;:,:;:,.,:,:,..                                 ..,.,:;,;:;:;:;,;,;,;,;,;;;,;;;;;;;;;;i;;;i;i;i;i;;VSCtUMUVviii;;,;iyYYvOB6jVllvviviiiiiyvy1Liyvvii;JKv:::;,;,;:;,;:;,;:;:;,,:;:,,,:,:;:;,;,;:;:;,;,;,,:,:;:,:
,;:,:;:,:,:,:,:;:;,;,;:;:,,;:,.. . . . . . . . . . . . ....:.,:,:,:;,;:;:;:;,;,;,;,;,;,;,;,;,;,;,;;;;;;;;i;;;i;iiii2ZOXJUcvlljlyi;,;illl3@8IUUYVvliv;iilyVlS0UvYlVvVyFSj.::;,;,;:;,;,,,;,;:;,;,;:;:;:,:;,;,;:;:;:,:;:;:;:,:,:,
;:;:;:;:,:;:,:;:,:;:;,;:,:;:;:;:;:;:;:,:,.,.,:,:,.,:;,,,;:,:;,;,,,;,;,;:;,;,;,;,;,;:;:;,;,;,;,;,;,;;;;;;;;;;i;iiyltZE3IjLX$C$DEZ6Ji;iillZ@@QItXyVlvii;llylVQ8KFjYvYlllLcl.,,;,;:;,;,;:;:;:;:;:,:,:;:,:;:;:;:;:;:;:;:;:,:;:;:;:
,;:;:,:,:;:;:,:;:;:;:;,;:;:;:;,;,;:,:;:,,,:;,;:;:,:;:;:;:;,;,;:;:;:;:;:;,;,;,;,;,;:;,;:;:;,;,;,;,;,;,;;;;;;;;iilvUZ@8D33CE8BB@S6QQCFi;iVS@BQM3cjyVvi;vljlyl8BQ2tllvvlViYUi.,,;:;:;,;:;,,,;:;:,:,:;:,,;,;:;:;:;:;:,:;:,:;:;:,:,
;:;:,:;:,:;:;:;:;:;:,:;:;:;:;:,,;,,,;,;:;:;:;:;:,:;:,:,:,,;,,:,:,:;:;:;:,,;,;,;:;:;:;,;,;,;,;,;,;,;,;,;;;;;;i;iilYB@@E8S8B@@@B$F6SEQMlVjE@B2GIMYVlliiilycYUB@StYyii;iiiiLl,.;,;:;:;:;:;,;:;:;:,:;:;:;:;,,:;:;:;:,:;:,:,:,:;:,:
,;:,:;:;:,:,:,:;:;:,:;:;:;:;:,:,:,:,,,:,,;:;:,:;,;:;:;:,:;:;,;:;,;,;,;:;:;:;:,,;,,:;:;,,:;,;,;,;,;,;,;,;,;;;;;;iilC@@@B@8@@@@8cX$88@8608B@B0IQ3MM$CIFC1UlyU@@8jliVVlvyiilV;,:;:;:;:;:;:;:;:;,;:,:,:,:;,;:;,;:,:,:,:;:,:;:;:;:;
;:,:;:;:;:,:,:,:;:;:,:,:;:;:,:,:;:,:,:;:,:;:;:;:;:;:;:,:,:,:;.,:,:;:;:;:;,;:;:,:;,,:;:;:;:,:;,;:;:;:;,;,;,;;;;;;iic8@B@@@@@@@61JD8@BBE@B@@@SQSSS@@@IG6B$XUI@@@SXK6BEEKl;jL;.,,;,;,;,;:;:;:;:;:;:,:;:;:;:;:;:,:,:,:;:;:;:,:;:;:
,;:;:;:,:,:;:;:;:,:;:,:;:;:,:;:,:,:;:;:;:,:,:;:,:;:;:,:,:;:;:,:,:;:,:;:;:,:,:,:,:;:;,;:;:,:,:;:;,,:,:;:;:,:;,;,;;;;l3B@@B@@@B$1D@@@@B@@@B@@BBBQB@@BtySBBG@@@B@QQ8@BO2E2F3j.,,;,,:;:;:;,,:;:;:;:,:;,,:,:;:,:;:;:;:,:,:;:;:;:;:;
;:,:;:;:,:,:;:;:;:;:;:;:,:;:;:,:,:,:,:,:;:,:,:,:,:,:;:,:,:,:,:,:,:;:;:,:,:;:,:;:,:,:,:,:;:,:;:,,;:,:,:,:,:;:;:,:,.: .:;iG@@@@B@@@@@B@B@B@@@@@B@@@@@FC8@@@@@@@@@8@@@1$QB@I:::;,;,;,;:,,;:;:,:,:,:;,;:;:;:;:,:;:,:,:,:,:,:,:;:;:
,;:,:,:,:,:,:,:,:;:;:,:;:;:;:;:,:,:;:,:,:;:,:;:;:;:,:;:;:;:;:;:;:,:,:,:,:;:,:;:;:,:;:,:,:,:,:,:;:,:,:,:;:;:;:,:;:,.:..   .;K@@0Y;;..     .;VMBB@B@@@@@B@MXXB@@@@@@@@B@@I:.:;:;,;,;:;:;,,:;:;,;:;:,:,:,:,:;:,:;:;:;:;:,:,:,:,:;
;:,:;:;:,:,:,:,:;:,:,:,:,:,:;:;:;:,:,:;:,:;:;:,:,:;:;:,:;:;:;:,:,:,:;:;:,:;:,:,:;:;:;:;:;:;:,:,:;:,:,:,:;:;:,,;,,:;:,.,..           . . .      :iV@BJ;;      .;iQ@@B0Jy...;:;:;:,:;,;:;:;:;:;,,:;:;:;:,:,:;:,:;:;:;:,:,:,:,:;:
,,:;:,:,:,:,:,:;:,:;:;:,:,:;:;:,:;:,:,:;:,:,:;:,:;:;:,:;:,:,:,:;:;:,:;:,:,:,:;:;:,:,:;:;:,:;:,:;:,:;:,:,:,:;:;:;:,:,,;,,:,.....:.,.,:,.,.,.:..         ... .       .   ..,:;:;:;:;:;:;:,:;:,:;:,:,:,:;:;:,:;:;:;:;:;:;:,:;:;:;
;:,:;:,:;:,:;:,:;:,:,:;:,:,:;:;:;:,:;:,:,:,:;:,:,:,:;:,:,:,:;:,:,:,:;:;:;:,:;:;:;:,:,:;:,:;:,:;:,:;:,:;:;:,:,:,:,:;:,:,:,:,:,.,:,:;:;:,:;:,:,.,.,.:.:.,:,:;:,.,.. . ..,:,:;:;:,:,,;:;:;:;:;,,:;:;:;:;:;:,:;:,:,:;:;:;:;:,:;:;:
,,:,:;:;:,:,:,:,:;:,:;:;:;:;:;:;:;:;:;:;:,:;:,:,:;:,:,:;:,:;:,:;:;:,:;:,:;:,:;:,:,:;:;:;:;:,:,:,:,:;:;:,:;:,:,:,:,:,:,:;:;:;:,:,:;:;:;:;:,:,:,:,:,.,:,:;:,:;:,:,:,:,:,:;:,:;:;:;:,:;:;:,:,:;:,:,:,:;:;:,:,:;:,:,:;:;:,:;:;:,:,
;:;:;:;:;:,:,:,:;:,:,:,:;:,:,:;:;:;:,:;:;:,:,:,:;:;:;:,:,:;:,:;:,:,:;:,:;:;:,:;:,:,:,:,:,:;:;:,:;:,:;:;:,:,:;:,:,:;:,:;:,:;:;:,:,:;:,:;:,:,:,:;:,:,:;:;:,:,:;:;:,:;:,:,:;:,:;:;:,:,:,:,:;:;:,:,:;:,:,:;:;:,:;:,:,:;:;:,:;:,:,:
:;:,:;:,:;:,:,:,:;:;:,:,:;:,:;:,:,:,:;:,:,:;:;:;:,:,:,:;:,:,:;:,:;:,:,:,:;:,:;:;:,:;:,:;:;:,:;:;:;:,:;:;:,:,:,:,:;:,:,:,:;:;:;:;:;:;:;:;:,:,:;:,:;:;:,:,:;:;:;:;:;:;:;:,:,:;:;:;:,:;:,:,:,:,:;:;:;:;:;:,:,:,:,:,:,:;:;:,:;:,:;
*/
// Railgun_Trolldom (the successor of Railgun_Swampshine_BailOut - avoiding second pattern comparison in BMH2 and pseudo-BMH4), copyleft 2016-Aug-19, Kaze.
// Railgun_Swampshine_BailOut, copyleft 2016-Aug-10, Kaze.
// Internet "home" page: http://www.codeproject.com/Articles/250566/Fastest-strstr-like-function-in-C
// My homepage (homeserver, often down): http://www.sanmayce.com/Railgun/
/*
!!!!!!!!!!!!!!!!!!!!!!!! BENCHMARKING GNU's memmem vs Railgun !!!!!!!!!!!!!!!!!!!!!!!! [
Add-on: 2016-Aug-22

Two things.

First, the fix from the last time was buggy, my apologies, now fixed, quite embarrassing since it is a simple left/right boundary check. It doesn't affect the speed, it appears as rare pattern hit misses.
Since I don't believe in saying "sorry" but in making things right, here my attempt to further disgrace my amateurish work follows:
Two years ago, I didn't pay due attention to adding 'Swampwalker' heuristic to the Railgun_Ennearch, I mean, only quick test was done and no real proofing - this was due not to a blunder of mine, nor carelessness, but overconfidence in my ability to write "on the fly". Stupid, indeed, however, when a coder gets momentum in writing simple etudes he starts gaining false confidence of mastering the subject, not good for sure!
Hopefully, other coders will learn to avoid such full of neglect style.

Second, wanted to present the heaviest testbed for search i.e. memmem() functions: it benefits the benchmarking (speed in real application) as well as bug-control.

The benchmark is downloadable at my INTERNET drive:
https://1drv.ms/u/s!AmWWFXGMzDmEglwjlUtnMJrfhosK

The speed showdown has three facets:
- compares the 64bit code generated from GCC 5.10 versus Intel 15.0 compilers;
- compares four types of datasets - search speed through English texts versus genome ACGT-type data versus binary versus UTF8;
- compares the tweaked Two-Way algorithm (implemented by Eric Blake) and adopted by GLIBC as memmem() versus my Railgun_Swampshine.

Note1: The GLIBC memmem() was taken from latest (2016-08-05) glibc 2.24 tar:
https://www.gnu.org/software/libc/
Note2: Eric Blake says that he enhanced the linearity of Two-Way by adding some sublinear paths, well, Railgun is all about sublinearity, so feel free to experiment with your own testfiles (worst-case-scenarios), just make such a file feed the compressor with it, then we will see how the LINEAR Two-Way behaves versus Railgun_Swampshine.
Note3: Just copy-and-paste 'Railgun_Swampshine' or 'Railgun_Ennearch' from the benchmark's source.

So the result on Core 2 Q9550s @2.83GHz DDR2 @666MHz / i5-2430M @3.00GHz DDR3 @666MHz:
--------------------------------------------------------------------------------------------------------------------------------
| Searcher                                  | GNU/GLIBC memmem()        | Railgun_Swampshine       | Railgun_Trolldom          | 
|--------------------------------------------------------------------------------------------------|---------------------------|
| Testfile\Compiler                         | Intel 15.0 | GCC 5.10     | Intel 15.0 | GCC 5.10    | Intel 15.0  | GCC 5.10    |
|------------------------------------------------------------------------------------------------------------------------------|
| Size: 27,703 bytes                        |     4506/- |   5330/14725 |    13198/- | 11581/15171 | 19105/22449 | 15493/21642 |
| Name: An_Interview_with_Carlos_Castaneda.TXT                          |            |             |             |             |
| LATENCY-WISE: Number of 'memmem()' Invocations: 308,062               |            |             |             |             |
| THROUGHPUT-WISE: Number of Total bytes Traversed: 3,242,492,648       |            |             |             |             |
|------------------------------------------------------------------------------------------------------------------------------|
| Size: 2,347,772 bytes                     |      190/- |      226/244 |     1654/- |   1729/1806 |   1794/1822 |   1743/1809 |
| Name: Gutenberg_EBook_Don_Quixote_996_(ANSI).txt                      |            |             |             |             |
| LATENCY-WISE: Number of 'memmem()' Invocations: 14,316,954            |            |             |             |             |
| THROUGHPUT-WISE: Number of Total bytes Traversed: 6,663,594,719,173   |            |             |             |             |
|------------------------------------------------------------------------------------------------------------------------------|
| Size: 899,425 bytes                       |      582/- |      760/816 |     3094/- |   2898/3088 |   3255/3289 |   2915/3322 |
| Name: Gutenberg_EBook_Dokoe_by_Hakucho_Masamune_(Japanese_UTF8).txt   |            |             |             |             |
| LATENCY-WISE: Number of 'memmem()' Invocations: 3,465,806             |            |             |             |             |
| THROUGHPUT-WISE: Number of Total bytes Traversed: 848,276,034,315     |            |             |             |             |
|------------------------------------------------------------------------------------------------------------------------------|
| Size: 4,487,433 bytes                     |      104/- |      109/116 |      445/- |     458/417 |     450/411 |     467/425 |
| Name: Dragonfly_genome_shotgun_sequence_(ACGT_alphabet).fasta         |            |             |             |             |
| LATENCY-WISE: Number of 'memmem()' Invocations: 20,540,375            |            |             |             |             |
| THROUGHPUT-WISE: Number of Total bytes Traversed: 13,592,530,857,131  |            |             |             |             |
|------------------------------------------------------------------------------------------------------------------------------|
| Size: 954,035 bytes                       |       99/- |      144/144 |      629/- |     580/682 |     634/807 |     585/725 |
| Name: LAOTZU_Wu_Wei_(BINARY).pdf                                      |            |             |             |             |
| LATENCY-WISE: Number of 'memmem()' Invocations: 27,594,933            |            |             |             |             |
| THROUGHPUT-WISE: Number of Total bytes Traversed: 8,702,455,122,519   |            |             |             |             |
|------------------------------------------------------------------------------------------------------------------------------|
| Size: 15,583,440 bytes                    |        -/- |          -/- |        -/- |     663/771 |     675/778 |     663/757 |
| Name: Arabian_Nights_complete.html                                    |            |             |             |             |
| LATENCY-WISE: Number of 'memmem()' Invocations: 72,313,262            |            |             |             |             |
| THROUGHPUT-WISE: Number of Total bytes Traversed: 105,631,163,854,099 |            |             |             |             |
--------------------------------------------------------------------------------------------------------------------------------

Note0: Railgun_Trolldom is slightly faster (both with Intel & GCC) than Railgun_Swampshine, this is mostly due to adding a bitwise BMH order 2 (8KB table overhead instead of 64KB) path - for haystacks <77777 bytes long - the warm-up is faster.
Note1: The numbers represent the rate (bytes/s) at which patterns/needles 4,5,6,8,9,10,12,13,14,16,17,18,24 bytes long are memmemed into 4KB, 256KB, 1MB, 256MB long haystacks.
in fact, these numbers are the compression speed using LZSS and memmem() as matchfinder.
Note2: The Arabian Nights is downloadable at:
https://ebooks.adelaide.edu.au/b/burton/richard/b97b/complete.html
Note3: On i5-2430M, TW is catching up since this CPU crunches instructions faster while the RAM speed is almost the same, Railgun suffers from the slow RAM fetches - the prefetcher and such suck.
Note4: With a simple English text 'Tales of 1001 Nights', 15,583,440 bytes long, the cumulative size of traversed haystack data is nearly 100TB, 105,631,163,854,099 ~ 1024^4 = 1,099,511,627,776.
Note5: With a simple French text 'Agatha_Christie_85-ebooks_(French)_TXT.tar', 32,007,168 bytes long, the cumulative size of traversed haystack data is nearly 200TB ~ 234,427,099,834,376.

Just to see how faster is Yann's Zstd in decompression (its level 12 is 377-331 MB/s faster), on Core 2 Q9550s @2.83GHz DDR2 @666MHz:
[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[
D:\Nakamichi_Kintaro++_source_executables_64bit_(GCC510-vs-Intel150)_(TW-vs-RG)_BENCHMARK>Nakamichi_Kintaro++_Intel_15.0_64bit.exe Agatha_Christie_85-ebooks_(French)_TXT.tar
Nakamichi 'Kintaro++', written by Kaze, based on Nobuo Ito's LZSS source, babealicious suggestion by m^2 enforced, muffinesque suggestion by Jim Dempsey enforced.
Note1: This compile can handle files up to 1711MB.
Note2: The matchfinder/memmem() is Railgun_Trolldom.
Current priority class is HIGH_PRIORITY_CLASS.
Compressing 32007168 bytes ...
|; Each rotation means 64KB are encoded; Done 100%; Compression Ratio: 3.53:1
NumberOfFullLiterals (lower-the-better): 164
NumberOfFlushLiteralsHeuristic (bigger-the-better): 184323
Legend: WindowSizes: 1/2/3/4=Tiny/Short/Medium/Long
NumberOf(Tiny)Matches[Short]Window (4)[2]: 226869
NumberOf(Short)Matches[Short]Window (8)[2]: 119810
NumberOf(Medium)Matches[Short]Window (12)[2]: 71202
NumberOf(Long)Matches[Short]Window (16)[2]: 31955
NumberOf(MaxLong)Matches[Short]Window (24)[2]: 7078
NumberOf(Tiny)Matches[Medium]Window (5)[3]: 257313
NumberOf(Short)Matches[Medium]Window (9)[3]: 526493
NumberOf(Medium)Matches[Medium]Window (13)[3]: 285579
NumberOf(Long)Matches[Medium]Window (17)[3]: 158873
NumberOf(MaxLong)Matches[Medium]Window (24)[3]: 51276
NumberOf(Tiny)Matches[Long]Window (6)[4]: 41075
NumberOf(Short)Matches[Long]Window (10)[4]: 240454
NumberOf(Medium)Matches[Long]Window (14)[4]: 258653
NumberOf(Long)Matches[Long]Window (18)[4]: 209007
NumberOf(MaxLong)Matches[Long]Window (24)[4]: 190929
RAM-to-RAM performance: 605 bytes/s.
Compressed to 9076876 bytes.
LATENCY-WISE: Number of 'memmem()' Invocations: 102,091,852
THROUGHPUT-WISE: Number of Total bytes Traversed: 234,427,099,834,376

D:\Nakamichi_Kintaro++_source_executables_64bit_(GCC510-vs-Intel150)_(TW-vs-RG)_BENCHMARK>"Nakamichi_Kintaro++_Intel_15.0_64bit.exe" "Agatha_Christie_85-ebooks_(French)_TXT.tar.Nakamichi"
Nakamichi 'Kintaro++', written by Kaze, based on Nobuo Ito's LZSS source, babealicious suggestion by m^2 enforced, muffinesque suggestion by Jim Dempsey enforced.
Note1: This compile can handle files up to 1711MB.
Note2: The matchfinder/memmem() is Railgun_Trolldom.
Current priority class is HIGH_PRIORITY_CLASS.
Decompressing 9076876 bytes ...
RAM-to-RAM performance: 331 MB/s.
Compression Ratio (bigger-the-better): 3.53:1

D:\Nakamichi_Kintaro++_source_executables_64bit_(GCC510-vs-Intel150)_(TW-vs-RG)_BENCHMARK>zstd-windows-v0.8.1_win64.exe -h
*** zstd command line interface 64-bits v0.8.1, by Yann Collet ***
...

D:\Nakamichi_Kintaro++_source_executables_64bit_(GCC510-vs-Intel150)_(TW-vs-RG)_BENCHMARK>zstd-windows-v0.8.1_win64.exe -b12 "Agatha_Christie_85-ebooks_(French)_TXT.tar"
12#_(French)_TXT.tar :  32007168 ->   8965791 (3.570),   6.7 MB/s , 377.0 MB/s

D:\Nakamichi_Kintaro++_source_executables_64bit_(GCC510-vs-Intel150)_(TW-vs-RG)_BENCHMARK>zstd-windows-v0.8.1_win64.exe -b22 "Agatha_Christie_85-ebooks_(French)_TXT.tar"
22#_(French)_TXT.tar :  32007168 ->   6802321 (4.705),   1.0 MB/s , 260.7 MB/s

D:\Nakamichi_Kintaro++_source_executables_64bit_(GCC510-vs-Intel150)_(TW-vs-RG)_BENCHMARK>
]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]

Two-Way is significantly slower than BMH Order 2, the speed-down is in range:
- for TEXTUAL ANSI alphabets: 1729/226= 7.6x
- for TEXTUAL UTF8 alphabets: 2898/760= 3.8x
- for TEXTUAL ACGT alphabets:  458/109= 4.2x
- for BINARY-esque alphabets:  580/144= 4.0x

For faster RAM, than mine @666MHz, and for haystacks multimegabytes long, the speedup goes beyond 8x.

The benchmark shows the real behavior (both latency and raw speed) of the memmem variants, I added also the Thierry Lecroq's Two-Way implementation:
http://www-igm.univ-mlv.fr/~lecroq/string/node26.html#SECTION00260
However, Eric Blake's one is faster, so it was chosen for the speed showdown.

Once I measured the total length of traversed haystacks, and for files 100+MB long, it went ... quintillion of bytes i.e. petabytes - good torture it is.

!!!!!!!!!!!!!!!!!!!!!!!! BENCHMARKING GNU's memmem vs Railgun !!!!!!!!!!!!!!!!!!!!!!!! ]
*/
// 2014-Apr-27: The nasty SIGNED/UNSIGNED bug in 'Swampshines' which I illustrated several months ago in my fuzzy search article now is fixed here too:
/*
The bug is this (the variables 'i' and 'PRIMALposition' are uint32_t):
Next line assumes -19 >= 0 is true:
if ( (i-(PRIMALposition-1)) >= 0) printf ("THE NASTY BUG AGAIN: %d >= 0\n", i-(PRIMALposition-1));
Next line assumes -19 >= 0 is false:
if ( (signed int)(i-(PRIMALposition-1)) >= 0) printf ("THE NASTY BUG AGAIN: %d >= 0\n", i-(PRIMALposition-1));
And the actual fix:
...
// If we miss to hit then no need to compare the original: Needle
if ( count <= 0 ) {
// I have to add out-of-range checks...
// i-(PRIMALposition-1) >= 0
// &pbTarget[i-(PRIMALposition-1)] <= pbTargetMax - 4
// i-(PRIMALposition-1)+(count-1) >= 0
// &pbTarget[i-(PRIMALposition-1)+(count-1)] <= pbTargetMax - 4

// "FIX" from 2014-Apr-27:
// Because (count-1) is negative, above fours are reduced to next twos:
// i-(PRIMALposition-1)+(count-1) >= 0
// &pbTarget[i-(PRIMALposition-1)] <= pbTargetMax - 4
	// The line below is BUGGY:
	//if ( (i-(PRIMALposition-1) >= 0) && (&pbTarget[i-(PRIMALposition-1)] <= pbTargetMax - 4) && (&pbTarget[i-(PRIMALposition-1)+(count-1)] <= pbTargetMax - 4) ) {
	// The line below is NOT OKAY, in fact so stupid, grrr, not a blunder, not carelessness, but overconfidence in writing "on the fly":
	//if ( ((signed int)(i-(PRIMALposition-1)+(count-1)) >= 0) && (&pbTarget[i-(PRIMALposition-1)] <= pbTargetMax - 4) ) {
// FIX from 2016-Aug-10 (two times failed to do simple boundary checks, pfu):
	if ( ((signed int)(i-(PRIMALposition-1)) >= 0) && (&pbTarget[i-(PRIMALposition-1)]+((PRIMALlengthCANDIDATE-4+1)-1) <= pbTargetMax - 4) ) {
		if ( *(uint32_t *)&pbTarget[i-(PRIMALposition-1)] == *(uint32_t *)(pbPattern-(PRIMALposition-1))) { // This fast check ensures not missing a match (for remainder) when going under 0 in loop below:
			count = PRIMALlengthCANDIDATE-4+1; 
			while ( count > 0 && *(uint32_t *)(pbPattern-(PRIMALposition-1)+count-1) == *(uint32_t *)(&pbTarget[i-(PRIMALposition-1)]+(count-1)) )
				count = count-4;
			if ( count <= 0 ) return(pbTarget+i-(PRIMALposition-1));	
		}
	}
}
...
*/
// Railgun_Swampshine_BailOut, copyleft 2014-Jan-31, Kaze.
// Caution: For better speed the case 'if (cbPattern==1)' was removed, so Pattern must be longer than 1 char.
#define NeedleThreshold2vs4swampLITE 9+10 // Should be bigger than 9. BMH2 works up to this value (inclusive), if bigger then BMH4 takes over. Should be <=255 otherwise the 0|1 BMH2 should be used.
char * Railgun_Trolldom (char * pbTarget, char * pbPattern, uint32_t cbTarget, uint32_t cbPattern)
{
	char * pbTargetMax = pbTarget + cbTarget;
	register uint32_t ulHashPattern;
	signed long count;

	unsigned char bm_Horspool_Order2[256*256]; // Bitwise soon...
	unsigned char bm_Horspool_Order2bitwise[(256*256)>>3]; // Bitwise soon...
	uint32_t i, Gulliver;

	uint32_t PRIMALposition, PRIMALpositionCANDIDATE;
	uint32_t PRIMALlength, PRIMALlengthCANDIDATE;
	uint32_t j, FoundAtPosition;

// Quadruplet [
    //char * pbTargetMax = pbTarget + cbTarget;
    //register unsigned long  ulHashPattern;
    unsigned long ulHashTarget;
    //unsigned long count;
    unsigned long countSTATIC;
    unsigned char SINGLET;
    unsigned long Quadruplet2nd;
    unsigned long Quadruplet3rd;
    unsigned long Quadruplet4th;
    unsigned long  AdvanceHopperGrass;
// Quadruplet ]

	if (cbPattern > cbTarget) return(NULL);

	if ( cbPattern<4 ) { 
		// SSE2 i.e. 128bit Assembly rules here, Mischa knows best:
		// ...
        	pbTarget = pbTarget+cbPattern;
		ulHashPattern = ( (*(char *)(pbPattern))<<8 ) + *(pbPattern+(cbPattern-1));
		if ( cbPattern==3 ) {
			for ( ;; ) {
				if ( ulHashPattern == ( (*(char *)(pbTarget-3))<<8 ) + *(pbTarget-1) ) {
					if ( *(char *)(pbPattern+1) == *(char *)(pbTarget-2) ) return((pbTarget-3));
				}
				if ( (char)(ulHashPattern>>8) != *(pbTarget-2) ) { 
					pbTarget++;
					if ( (char)(ulHashPattern>>8) != *(pbTarget-2) ) pbTarget++;
				}
				pbTarget++;
				if (pbTarget > pbTargetMax) return(NULL);
			}
		} else {
		}
		for ( ;; ) {
			if ( ulHashPattern == ( (*(char *)(pbTarget-2))<<8 ) + *(pbTarget-1) ) return((pbTarget-2));
			if ( (char)(ulHashPattern>>8) != *(pbTarget-1) ) pbTarget++;
			pbTarget++;
			if (pbTarget > pbTargetMax) return(NULL);
		}
	} else { //if ( cbPattern<4 )
		if ( cbPattern<=NeedleThreshold2vs4swampLITE ) { 

// This is the awesome 'Railgun_Quadruplet', it did outperform EVERYWHERE the fastest strstr (back in old GLIBCes ~2003, by the Dutch hacker Stephen R. van den Berg), suitable for short haystacks ~100bytes.
// Caution: For better speed the case 'if (cbPattern==1)' was removed, so Pattern must be longer than 1 char.
// char * Railgun_Quadruplet (char * pbTarget, char * pbPattern, unsigned long cbTarget, unsigned long cbPattern)
// ...
//    if (cbPattern > cbTarget) return(NULL);
//} else { //if ( cbPattern<4)
if (cbTarget<777) // This value is arbitrary(don't know how exactly), it ensures(at least must) better performance than 'Boyer_Moore_Horspool'.
{
        pbTarget = pbTarget+cbPattern;
        ulHashPattern = *(unsigned long *)(pbPattern);
//        countSTATIC = cbPattern-1;

    //SINGLET = *(char *)(pbPattern);
    SINGLET = ulHashPattern & 0xFF;
    Quadruplet2nd = SINGLET<<8;
    Quadruplet3rd = SINGLET<<16;
    Quadruplet4th = SINGLET<<24;

    for ( ;; )
    {
	AdvanceHopperGrass = 0;
	ulHashTarget = *(unsigned long *)(pbTarget-cbPattern);

        if ( ulHashPattern == ulHashTarget ) { // Three unnecessary comparisons here, but 'AdvanceHopperGrass' must be calculated - it has a higher priority.
//         count = countSTATIC;
//         while ( count && *(char *)(pbPattern+1+(countSTATIC-count)) == *(char *)(pbTarget-cbPattern+1+(countSTATIC-count)) ) {
//	       if ( countSTATIC==AdvanceHopperGrass+count && SINGLET != *(char *)(pbTarget-cbPattern+1+(countSTATIC-count)) ) AdvanceHopperGrass++;
//               count--;
//         }
         count = cbPattern-1;
         while ( count && *(char *)(pbPattern+(cbPattern-count)) == *(char *)(pbTarget-count) ) {
	       if ( cbPattern-1==AdvanceHopperGrass+count && SINGLET != *(char *)(pbTarget-count) ) AdvanceHopperGrass++;
               count--;
         }
         if ( count == 0) return((pbTarget-cbPattern));
        } else { // The goal here: to avoid memory accesses by stressing the registers.
    if ( Quadruplet2nd != (ulHashTarget & 0x0000FF00) ) {
         AdvanceHopperGrass++;
         if ( Quadruplet3rd != (ulHashTarget & 0x00FF0000) ) {
              AdvanceHopperGrass++;
              if ( Quadruplet4th != (ulHashTarget & 0xFF000000) ) AdvanceHopperGrass++;
         }
    }
	}

	AdvanceHopperGrass++;

	pbTarget = pbTarget + AdvanceHopperGrass;
        if (pbTarget > pbTargetMax)
            return(NULL);
    }
} else if (cbTarget<77777) { // The warmup/overhead is lowered from 64K down to 8K, however the bitwise additional instructions quickly start hurting the throughput/traversal.
// The below bitwise 0|1 BMH2 gives 1427 bytes/s for 'Don_Quixote' with Intel:
// The below bitwise 0|1 BMH2 gives 1242 bytes/s for 'Don_Quixote' with GCC:
//	} else { //if ( cbPattern<4 )
//		if ( cbPattern<=NeedleThreshold2vs4Decumanus ) { 
			// BMH order 2, needle should be >=4:
			ulHashPattern = *(uint32_t *)(pbPattern); // First four bytes
			//for (i=0; i < 256*256; i++) {bm_Horspool_Order2[i]=0;}
			for (i=0; i < (256*256)>>3; i++) {bm_Horspool_Order2bitwise[i]=0;}
			//for (i=0; i < cbPattern-1; i++) bm_Horspool_Order2[*(unsigned short *)(pbPattern+i)]=1;
			for (i=0; i < cbPattern-2+1; i++) bm_Horspool_Order2bitwise[(*(unsigned short *)(pbPattern+i))>>3]= bm_Horspool_Order2bitwise[(*(unsigned short *)(pbPattern+i))>>3] | (1<<((*(unsigned short *)(pbPattern+i))&0x7));
			i=0;
			while (i <= cbTarget-cbPattern) {
				Gulliver = 1; // 'Gulliver' is the skip
				//if ( bm_Horspool_Order2[*(unsigned short *)&pbTarget[i+cbPattern-1-1]] != 0 ) {
				if ( ( bm_Horspool_Order2bitwise[(*(unsigned short *)&pbTarget[i+cbPattern-1-1])>>3] & (1<<((*(unsigned short *)&pbTarget[i+cbPattern-1-1])&0x7)) ) != 0 ) {
					//if ( bm_Horspool_Order2[*(unsigned short *)&pbTarget[i+cbPattern-1-1-2]] == 0 ) Gulliver = cbPattern-(2-1)-2; else {
					if ( ( bm_Horspool_Order2bitwise[(*(unsigned short *)&pbTarget[i+cbPattern-1-1-2])>>3] & (1<<((*(unsigned short *)&pbTarget[i+cbPattern-1-1-2])&0x7)) ) == 0 ) Gulliver = cbPattern-(2-1)-2; else {
						if ( *(uint32_t *)&pbTarget[i] == ulHashPattern) { // This fast check ensures not missing a match (for remainder) when going under 0 in loop below:
							count = cbPattern-4+1; 
							while ( count > 0 && *(uint32_t *)(pbPattern+count-1) == *(uint32_t *)(&pbTarget[i]+(count-1)) )
								count = count-4;
							if ( count <= 0 ) return(pbTarget+i);
						}
					}
				} else Gulliver = cbPattern-(2-1);
				i = i + Gulliver;
				//GlobalI++; // Comment it, it is only for stats.
			}
			return(NULL);
//		} else { // if ( cbPattern<=NeedleThreshold2vs4Decumanus )
} else { //if (cbTarget<777)
			// BMH order 2, needle should be >=4:
			ulHashPattern = *(uint32_t *)(pbPattern); // First four bytes
			for (i=0; i < 256*256; i++) {bm_Horspool_Order2[i]=0;}
			for (i=0; i < cbPattern-1; i++) bm_Horspool_Order2[*(unsigned short *)(pbPattern+i)]=1;
			i=0;
			while (i <= cbTarget-cbPattern) {
				Gulliver = 1; // 'Gulliver' is the skip
				if ( bm_Horspool_Order2[*(unsigned short *)&pbTarget[i+cbPattern-1-1]] != 0 ) {
					if ( bm_Horspool_Order2[*(unsigned short *)&pbTarget[i+cbPattern-1-1-2]] == 0 ) Gulliver = cbPattern-(2-1)-2; else {
						if ( *(uint32_t *)&pbTarget[i] == ulHashPattern) { // This fast check ensures not missing a match (for remainder) when going under 0 in loop below:
							count = cbPattern-4+1; 
							while ( count > 0 && *(uint32_t *)(pbPattern+count-1) == *(uint32_t *)(&pbTarget[i]+(count-1)) )
								count = count-4;
							if ( count <= 0 ) return(pbTarget+i);
						}
					}
				} else Gulliver = cbPattern-(2-1);
				i = i + Gulliver;
				//GlobalI++; // Comment it, it is only for stats.
			}
			return(NULL);

// Slower than Swampshine's simple 0|1 segment:
/*
PRIMALlength=0;
for (i=0+(1); i < cbPattern-2+1+(1)-(1); i++) { // -(1) because the last BB order 2 has no counterpart(s)
    FoundAtPosition = cbPattern;
    PRIMALpositionCANDIDATE=i;
    while ( PRIMALpositionCANDIDATE <= (FoundAtPosition-1) ) {
        j = PRIMALpositionCANDIDATE + 1;
        while ( j <= (FoundAtPosition-1) ) {
            if ( *(unsigned short *)(pbPattern+PRIMALpositionCANDIDATE-(1)) == *(unsigned short *)(pbPattern+j-(1)) ) FoundAtPosition = j;
            j++;
        }
        PRIMALpositionCANDIDATE++;
    }
    PRIMALlengthCANDIDATE = (FoundAtPosition-1)-i+(2);
    if (PRIMALlengthCANDIDATE >= PRIMALlength) {PRIMALposition=i; PRIMALlength = PRIMALlengthCANDIDATE;}
}
PRIMALlengthCANDIDATE = cbPattern;
cbPattern = PRIMALlength;
pbPattern = pbPattern + (PRIMALposition-1);
if (cbPattern<4) {
	cbPattern = PRIMALlengthCANDIDATE;
	pbPattern = pbPattern - (PRIMALposition-1);
}
if (cbPattern == PRIMALlengthCANDIDATE) {
			// BMH order 2, needle should be >=4:
			ulHashPattern = *(uint32_t *)(pbPattern); // First four bytes
			for (i=0; i < 256*256; i++) {bm_Horspool_Order2[i]=0;}
			for (i=0; i < cbPattern-1; i++) bm_Horspool_Order2[*(unsigned short *)(pbPattern+i)]=1;
			i=0;
			while (i <= cbTarget-cbPattern) {
				Gulliver = 1; // 'Gulliver' is the skip
				if ( bm_Horspool_Order2[*(unsigned short *)&pbTarget[i+cbPattern-1-1]] != 0 ) {
					if ( bm_Horspool_Order2[*(unsigned short *)&pbTarget[i+cbPattern-1-1-2]] == 0 ) Gulliver = cbPattern-(2-1)-2; else {
						if ( *(uint32_t *)&pbTarget[i] == ulHashPattern) { // This fast check ensures not missing a match (for remainder) when going under 0 in loop below:
							count = cbPattern-4+1; 
							while ( count > 0 && *(uint32_t *)(pbPattern+count-1) == *(uint32_t *)(&pbTarget[i]+(count-1)) )
								count = count-4;
							if ( count <= 0 ) return(pbTarget+i);
						}
					}
				} else Gulliver = cbPattern-(2-1);
				i = i + Gulliver;
				//GlobalI++; // Comment it, it is only for stats.
			}
			return(NULL);
} else { //if (cbPattern == PRIMALlengthCANDIDATE) {
// BMH Order 2 [
			ulHashPattern = *(uint32_t *)(pbPattern); // First four bytes
			for (i=0; i < 256*256; i++) {bm_Horspool_Order2[i]= cbPattern-1;} // cbPattern-(Order-1) for Horspool; 'memset' if not optimized
			// The above 'for' gives  1424 bytes/s for 'Don_Quixote' with Intel:
			// The above 'for' gives  1431 bytes/s for 'Don_Quixote' with GCC:
			// The below 'memset' gives  1389 bytes/s for 'Don_Quixote' with Intel:
			// The below 'memset' gives  1432 bytes/s for 'Don_Quixote' with GCC:
			//memset(&bm_Horspool_Order2[0], cbPattern-1, 256*256); // Why why? It is 1700:1000 slower than above 'for'!?
			for (i=0; i < cbPattern-1; i++) bm_Horspool_Order2[*(unsigned short *)(pbPattern+i)]=i; // Rightmost appearance/position is needed
			i=0;
			while (i <= cbTarget-cbPattern) { 
				Gulliver = bm_Horspool_Order2[*(unsigned short *)&pbTarget[i+cbPattern-1-1]];
				if ( Gulliver != cbPattern-1 ) { // CASE #2: if equal means the pair (char order 2) is not found i.e. Gulliver remains intact, skip the whole pattern and fall back (Order-1) chars i.e. one char for Order 2
				if ( Gulliver == cbPattern-2 ) { // CASE #1: means the pair (char order 2) is found
					if ( *(uint32_t *)&pbTarget[i] == ulHashPattern) {
						count = cbPattern-4+1; 
						while ( count > 0 && *(uint32_t *)(pbPattern+count-1) == *(uint32_t *)(&pbTarget[i]+(count-1)) )
							count = count-4;
// If we miss to hit then no need to compare the original: Needle
if ( count <= 0 ) {
// I have to add out-of-range checks...
// i-(PRIMALposition-1) >= 0
// &pbTarget[i-(PRIMALposition-1)] <= pbTargetMax - 4
// i-(PRIMALposition-1)+(count-1) >= 0
// &pbTarget[i-(PRIMALposition-1)+(count-1)] <= pbTargetMax - 4

// "FIX" from 2014-Apr-27:
// Because (count-1) is negative, above fours are reduced to next twos:
// i-(PRIMALposition-1)+(count-1) >= 0
// &pbTarget[i-(PRIMALposition-1)] <= pbTargetMax - 4
	// The line below is BUGGY:
	//if ( (i-(PRIMALposition-1) >= 0) && (&pbTarget[i-(PRIMALposition-1)] <= pbTargetMax - 4) && (&pbTarget[i-(PRIMALposition-1)+(count-1)] <= pbTargetMax - 4) ) {
	// The line below is NOT OKAY, in fact so stupid, grrr, not a blunder, not carelessness, but overconfidence in writing "on the fly":
	//if ( ((signed int)(i-(PRIMALposition-1)+(count-1)) >= 0) && (&pbTarget[i-(PRIMALposition-1)] <= pbTargetMax - 4) ) {
// FIX from 2016-Aug-10 (two times failed to do simple boundary checks, pfu):
	if ( ((signed int)(i-(PRIMALposition-1)) >= 0) && (&pbTarget[i-(PRIMALposition-1)]+((PRIMALlengthCANDIDATE-4+1)-1) <= pbTargetMax - 4) ) {
		if ( *(uint32_t *)&pbTarget[i-(PRIMALposition-1)] == *(uint32_t *)(pbPattern-(PRIMALposition-1))) { // This fast check ensures not missing a match (for remainder) when going under 0 in loop below:
			count = PRIMALlengthCANDIDATE-4+1; 
			while ( count > 0 && *(uint32_t *)(pbPattern-(PRIMALposition-1)+count-1) == *(uint32_t *)(&pbTarget[i-(PRIMALposition-1)]+(count-1)) )
				count = count-4;
			if ( count <= 0 ) return(pbTarget+i-(PRIMALposition-1));	
		}
	}
}
					}
					Gulliver = 1;
				} else
					Gulliver = cbPattern - Gulliver - 2; // CASE #3: the pair is found and not as suffix i.e. rightmost position
				}
				i = i + Gulliver;
				//GlobalI++; // Comment it, it is only for stats.
			}
			return(NULL);
// BMH Order 2 ]
} //if (cbPattern == PRIMALlengthCANDIDATE) {
*/

/*
So the result on Core 2 Q9550s @2.83GHz:
---------------------------------------------------------------------------------------------------------------------
| testfile\Searcher                         | GNU/GLIBC memmem()    | Railgun_Swampshine    | Railgun_Trolldom      | 
|-------------------------------------------------------------------------------------------|-----------------------|
| Compiler                                  | Intel 15.0 | GCC 5.10 | Intel 15.0 | GCC 5.10 | Intel 15.0 | GCC 5.10 |
|-------------------------------------------------------------------------------------------|-----------------------|
| The_Project_Gutenberg_EBook_of_Don        |        190 |      226 |       1654 |     1729 |       1147 |     1764 |
| _Quixote_996_(ANSI).txt                   |            |          |            |          |            |          |
| 2,347,772 bytes                           |            |          |            |          |            |          |
|-------------------------------------------------------------------------------------------|-----------------------|
| The_Project_Gutenberg_EBook_of_Dokoe      |        582 |      760 |       3094 |     2898 |       2410 |     3036 |
| _by_Hakucho_Masamune_(Japanese_UTF-8).txt |            |          |            |          |            |          |
| 899,425 bytes                             |            |          |            |          |            |          |
|-------------------------------------------------------------------------------------------|-----------------------|
| Dragonfly_genome_shotgun_sequence         |        104 |      109 |        445 |      458 |        484 |      553 |
| _(ACGT_alphabet).fasta                    |            |          |            |          |            |          |
| 4,487,433 bytes                           |            |          |            |          |            |          |
|-------------------------------------------------------------------------------------------|-----------------------|
| LAOTZU_Wu_Wei_(BINARY).pdf                |         99 |      144 |        629 |      580 |        185 |      570 |
| 954,035 bytes                             |            |          |            |          |            |          |
|-------------------------------------------------------------------------------------------|-----------------------|
Below segment (when compiled with Intel) is very slow, see Railgun_Trolldom two sub-columns above, compared to GCC:
*/
/*
// BMH Order 2 [
			ulHashPattern = *(uint32_t *)(pbPattern); // First four bytes
			for (i=0; i < 256*256; i++) {bm_Horspool_Order2[i]= (cbPattern-1);} // cbPattern-(Order-1) for Horspool; 'memset' if not optimized
			// The above 'for' is translated by Intel as:
//.B5.21::                        
//  0013f 83 c0 40         add eax, 64                            
//  00142 66 0f 7f 44 14 
//        60               movdqa XMMWORD PTR [96+rsp+rdx], xmm0  
//  00148 3d 00 00 01 00   cmp eax, 65536                         
//  0014d 66 0f 7f 44 14 
//        70               movdqa XMMWORD PTR [112+rsp+rdx], xmm0 
//  00153 66 0f 7f 84 14 
//        80 00 00 00      movdqa XMMWORD PTR [128+rsp+rdx], xmm0 
//  0015c 66 0f 7f 84 14 
//        90 00 00 00      movdqa XMMWORD PTR [144+rsp+rdx], xmm0 
//  00165 89 c2            mov edx, eax                           
//  00167 72 d6            jb .B5.21 
			//memset(&bm_Horspool_Order2[0], cbPattern-1, 256*256); // Why why? It is 1700:1000 slower than above 'for'!?
			// The above 'memset' is translated by Intel as:
//  00127 41 b8 00 00 01 
//        00               mov r8d, 65536                         
//  0012d 44 8b 26         mov r12d, DWORD PTR [rsi]              
//  00130 e8 fc ff ff ff   call _intel_fast_memset                
			// ! The problem is that 256*256, 64KB, is already too much, going bitwise i.e. 8KB is not that better, when 'cbPattern-1' is bigger than 255 - an unsigned char - then 
			// we must switch to 0|1 table i.e. present or not. Since we are in 'if ( cbPattern<=NeedleThreshold2vs4swampLITE ) {' branch and NeedleThreshold2vs4swampLITE, by default, is 19 - it is okay to use 'memset'. !
			for (i=0; i < cbPattern-1; i++) bm_Horspool_Order2[*(unsigned short *)(pbPattern+i)]=i; // Rightmost appearance/position is needed
			i=0;
			while (i <= cbTarget-cbPattern) { 
				Gulliver = bm_Horspool_Order2[*(unsigned short *)&pbTarget[i+cbPattern-1-1]];
				if ( Gulliver != cbPattern-1 ) { // CASE #2: if equal means the pair (char order 2) is not found i.e. Gulliver remains intact, skip the whole pattern and fall back (Order-1) chars i.e. one char for Order 2
				if ( Gulliver == cbPattern-2 ) { // CASE #1: means the pair (char order 2) is found
					if ( *(uint32_t *)&pbTarget[i] == ulHashPattern) {
						count = cbPattern-4+1; 
						while ( count > 0 && *(uint32_t *)(pbPattern+count-1) == *(uint32_t *)(&pbTarget[i]+(count-1)) )
							count = count-4;
						if ( count <= 0 ) return(pbTarget+i);	
					}
					Gulliver = 1;
				} else
					Gulliver = cbPattern - Gulliver - 2; // CASE #3: the pair is found and not as suffix i.e. rightmost position
				}
				i = i + Gulliver;
				//GlobalI++; // Comment it, it is only for stats.
			}
			return(NULL);
// BMH Order 2 ]
*/
// Above fragment in Assembly:
/*
; mark_description "Intel(R) C++ Intel(R) 64 Compiler XE for applications running on Intel(R) 64, Version 15.0.0.108 Build 20140";
; mark_description "-O3 -QxSSE2 -D_N_XMM -D_N_prefetch_4096 -D_N_Branchfull -D_N_HIGH_PRIORITY -FA";
       ALIGN     16
.B6.1::                         ; Preds .B6.0
        push      rbx                                           ;3435.1
        push      r13                                           ;3435.1
        push      r15                                           ;3435.1
        push      rbp                                           ;3435.1
        mov       eax, 65592                                    ;3435.1
        call      __chkstk                                      ;3435.1
        sub       rsp, 65592                                    ;3435.1
        cmp       r9d, r8d                                      ;3460.18
        ja        .B6.25        ; Prob 28%                      ;3460.18
                                ; LOE rdx rcx rbx rsi rdi r12 r14 r8d r9d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B6.3::                         ; Preds .B6.1
        mov       r13d, DWORD PTR [rdx]                         ;3491.33
        lea       ebp, DWORD PTR [-1+r9]                        ;3492.67
        movzx     eax, bpl                                      ;3492.67
        xor       r10d, r10d                                    ;3492.4
        movd      xmm0, eax                                     ;3492.67
        xor       eax, eax                                      ;3492.4
        punpcklbw xmm0, xmm0                                    ;3492.67
        punpcklwd xmm0, xmm0                                    ;3492.67
        punpckldq xmm0, xmm0                                    ;3492.67
        punpcklqdq xmm0, xmm0                                   ;3492.67
                                ; LOE rdx rcx rbx rsi rdi r10 r12 r14 eax ebp r8d r9d r13d xmm0 xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B6.4::                         ; Preds .B6.4 .B6.3
        add       eax, 64                                       ;3492.4
        movdqa    XMMWORD PTR [48+rsp+r10], xmm0                ;3492.33
        cmp       eax, 65536                                    ;3492.4
        movdqa    XMMWORD PTR [64+rsp+r10], xmm0                ;3492.33
        movdqa    XMMWORD PTR [80+rsp+r10], xmm0                ;3492.33
        movdqa    XMMWORD PTR [96+rsp+r10], xmm0                ;3492.33
        mov       r10d, eax                                     ;3492.4
        jb        .B6.4         ; Prob 99%                      ;3492.4
                                ; LOE rdx rcx rbx rsi rdi r10 r12 r14 eax ebp r8d r9d r13d xmm0 xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B6.5::                         ; Preds .B6.4
        test      ebp, ebp                                      ;3515.28
        je        .B6.12        ; Prob 50%                      ;3515.28
                                ; LOE rdx rcx rbx rsi rdi r12 r14 ebp r8d r9d r13d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B6.6::                         ; Preds .B6.5
        mov       eax, 1                                        ;3515.4
        lea       r11d, DWORD PTR [-1+r9]                       ;3515.4
        mov       r15d, r11d                                    ;3515.4
        xor       r10d, r10d                                    ;3515.4
        shr       r15d, 1                                       ;3515.4
        test      r15d, r15d                                    ;3515.4
        jbe       .B6.10        ; Prob 15%                      ;3515.4
                                ; LOE rdx rcx rbx rsi rdi r12 r14 eax ebp r8d r9d r10d r11d r13d r15d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B6.8::                         ; Preds .B6.6 .B6.8
        lea       eax, DWORD PTR [r10+r10]                      ;3515.36
        movzx     ebx, WORD PTR [rax+rdx]                       ;3515.75
        mov       BYTE PTR [48+rsp+rbx], al                     ;3515.36
        lea       eax, DWORD PTR [1+r10+r10]                    ;3515.36
        inc       r10d                                          ;3515.4
        cmp       r10d, r15d                                    ;3515.4
        movzx     ebx, WORD PTR [rax+rdx]                       ;3515.75
        mov       BYTE PTR [48+rsp+rbx], al                     ;3515.36
        jb        .B6.8         ; Prob 64%                      ;3515.4
                                ; LOE rdx rcx rsi rdi r12 r14 ebp r8d r9d r10d r11d r13d r15d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B6.9::                         ; Preds .B6.8
        lea       eax, DWORD PTR [1+r10+r10]                    ;3515.4
                                ; LOE rdx rcx rbx rsi rdi r12 r14 eax ebp r8d r9d r11d r13d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B6.10::                        ; Preds .B6.9 .B6.6
        dec       eax                                           ;3515.36
        cmp       eax, r11d                                     ;3515.4
        jae       .B6.12        ; Prob 15%                      ;3515.4
                                ; LOE rax rdx rcx rbx rsi rdi r12 r14 ebp r8d r9d r13d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B6.11::                        ; Preds .B6.10
        movzx     r10d, WORD PTR [rax+rdx]                      ;3515.75
        mov       BYTE PTR [48+rsp+r10], al                     ;3515.36
                                ; LOE rdx rcx rbx rsi rdi r12 r14 ebp r8d r9d r13d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B6.12::                        ; Preds .B6.5 .B6.10 .B6.11
        xor       r10d, r10d                                    ;3516.4
        lea       r15d, DWORD PTR [-3+r9]                       ;3522.27
        movsxd    r15, r15d                                     ;3522.7
        sub       r8d, r9d                                      ;3517.16
        lea       r11d, DWORD PTR [-2+r9]                       ;3520.32
                                ; LOE rdx rcx rsi rdi r12 r14 r15 ebp r8d r9d r10d r11d r13d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B6.13::                        ; Preds .B6.12 .B6.24
        lea       eax, DWORD PTR [-2+r9+r10]                    ;3518.78
        movzx     ebx, WORD PTR [rax+rcx]                       ;3518.55
        movzx     eax, BYTE PTR [48+rsp+rbx]                    ;3518.16
        cmp       eax, ebp                                      ;3519.32
        je        .B6.24        ; Prob 50%                      ;3519.32
                                ; LOE rdx rcx rsi rdi r12 r14 r15 eax ebp r8d r9d r10d r11d r13d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B6.14::                        ; Preds .B6.13
        cmp       eax, r11d                                     ;3520.32
        jne       .B6.23        ; Prob 62%                      ;3520.32
                                ; LOE rdx rcx rsi rdi r12 r14 r15 eax ebp r8d r9d r10d r11d r13d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B6.15::                        ; Preds .B6.14
        mov       eax, r10d                                     ;3521.25
        add       rax, rcx                                      ;3521.25
        cmp       r13d, DWORD PTR [rax]                         ;3521.40
        je        .B6.17        ; Prob 50%                      ;3521.40
                                ; LOE rax rdx rcx rsi rdi r12 r14 r15 ebp r8d r9d r10d r11d r13d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B6.16::                        ; Preds .B6.26 .B6.15
        mov       eax, 1                                        ;3527.6
        jmp       .B6.24        ; Prob 100%                     ;3527.6
                                ; LOE rdx rcx rsi rdi r12 r14 r15 eax ebp r8d r9d r10d r11d r13d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B6.17::                        ; Preds .B6.15
        mov       rbx, r15                                      ;3522.7
        test      r15, r15                                      ;3523.23
        jle       .B6.22        ; Prob 2%                       ;3523.23
                                ; LOE rax rdx rcx rbx rsi rdi r12 r14 r15 ebp r8d r9d r10d r11d r13d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B6.18::                        ; Preds .B6.17
        mov       QWORD PTR [32+rsp], rsi                       ;
                                ; LOE rax rdx rcx rbx rdi r12 r14 r15 ebp r8d r9d r10d r11d r13d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B6.19::                        ; Preds .B6.20 .B6.18
        mov       esi, DWORD PTR [-1+rbx+rdx]                   ;3523.58
        cmp       esi, DWORD PTR [-1+rbx+rax]                   ;3523.79
        jne       .B6.26        ; Prob 20%                      ;3523.79
                                ; LOE rax rdx rcx rbx rdi r12 r14 r15 ebp r8d r9d r10d r11d r13d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B6.20::                        ; Preds .B6.19
        add       rbx, -4                                       ;3524.22
        test      rbx, rbx                                      ;3523.23
        jg        .B6.19        ; Prob 82%                      ;3523.23
                                ; LOE rax rdx rcx rbx rdi r12 r14 r15 ebp r8d r9d r10d r11d r13d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B6.21::                        ; Preds .B6.20
        mov       rsi, QWORD PTR [32+rsp]                       ;
                                ; LOE rax rbx rsi rdi r12 r14 xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B6.22::                        ; Preds .B6.17 .B6.21
        add       rsp, 65592                                    ;3525.32
        pop       rbp                                           ;3525.32
        pop       r15                                           ;3525.32
        pop       r13                                           ;3525.32
        pop       rbx                                           ;3525.32
        ret                                                     ;3525.32
                                ; LOE
.B6.23::                        ; Preds .B6.14
        neg       eax                                           ;3529.17
        add       eax, r9d                                      ;3529.17
        add       eax, -2                                       ;3529.40
                                ; LOE rdx rcx rsi rdi r12 r14 r15 eax ebp r8d r9d r10d r11d r13d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B6.24::                        ; Preds .B6.16 .B6.23 .B6.13
        add       r10d, eax                                     ;3531.13
        cmp       r10d, r8d                                     ;3517.25
        jbe       .B6.13        ; Prob 82%                      ;3517.25
                                ; LOE rdx rcx rsi rdi r12 r14 r15 ebp r8d r9d r10d r11d r13d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B6.25::                        ; Preds .B6.1 .B6.24
        xor       eax, eax                                      ;3534.10
        add       rsp, 65592                                    ;3534.10
        pop       rbp                                           ;3534.10
        pop       r15                                           ;3534.10
        pop       r13                                           ;3534.10
        pop       rbx                                           ;3534.10
        ret                                                     ;3534.10
                                ; LOE
.B6.26::                        ; Preds .B6.19                  ; Infreq
        mov       rsi, QWORD PTR [32+rsp]                       ;
        jmp       .B6.16        ; Prob 100%                     ;
*/

// GCC 5.10; >gcc -O3 -m64 -fomit-frame-pointer
/*
Railgun_Trolldom:
	pushq	%r15
	.seh_pushreg	%r15
	movl	$65592, %eax
	pushq	%r14
	.seh_pushreg	%r14
	pushq	%r13
	.seh_pushreg	%r13
	pushq	%r12
	.seh_pushreg	%r12
	pushq	%rbp
	.seh_pushreg	%rbp
	pushq	%rdi
	.seh_pushreg	%rdi
	pushq	%rsi
	.seh_pushreg	%rsi
	pushq	%rbx
	.seh_pushreg	%rbx
	call	___chkstk_ms
	subq	%rax, %rsp
	.seh_stackalloc	65592
	.seh_endprologue
	cmpl	%r9d, %r8d
	movq	%rcx, %rbx
	movq	%rdx, %rdi
	movl	%r8d, %r12d
	movl	%r9d, %esi
	jb	.L118
	movl	(%rdx), %ebp
	leal	-1(%r9), %edx
	movl	$65536, %r8d
	leaq	48(%rsp), %rcx
	movzbl	%dl, %edx
	call	memset
	movl	%esi, %r11d
	subl	$1, %r11d
	je	.L119
	xorl	%eax, %eax
	.p2align 4,,10
.L113:
	movzwl	(%rdi,%rax), %edx
	movb	%al, 48(%rsp,%rdx)
	addq	$1, %rax
	cmpl	%eax, %r11d
	ja	.L113
.L112:
	leal	-4(%rsi), %r9d
	movl	%r12d, %r8d
	xorl	%edx, %edx
	leal	-3(%rsi), %eax
	shrl	$2, %r9d
	subl	%esi, %r8d
	leal	-2(%rsi), %r10d
	movslq	%eax, %r14
	negq	%r9
	movl	%eax, 44(%rsp)
	leaq	-1(%r14), %r15
	salq	$2, %r9
	leaq	(%rdi,%r14), %r13
	jmp	.L117
	.p2align 4,,10
.L130:
	movl	%r10d, %eax
	subl	%ecx, %eax
	cmpl	%r10d, %ecx
	je	.L129
.L114:
	addl	%eax, %edx
	cmpl	%r8d, %edx
	ja	.L118
.L117:
	leal	(%rdx,%r10), %eax
	movzwl	(%rbx,%rax), %eax
	movzbl	48(%rsp,%rax), %ecx
	cmpl	%r11d, %ecx
	jne	.L130
	movl	%r11d, %eax
	addl	%eax, %edx
	cmpl	%r8d, %edx
	jbe	.L117
.L118:
	xorl	%eax, %eax
	jmp	.L128
	.p2align 4,,10
.L129:
	movl	%edx, %ecx
	movl	$1, %eax
	leaq	(%rbx,%rcx), %r12
	cmpl	(%r12), %ebp
	jne	.L114
	movl	44(%rsp), %esi
	testl	%esi, %esi
	jle	.L124
	movl	(%r12,%r15), %esi
	cmpl	%esi, (%rdi,%r15)
	jne	.L114
	addq	%r14, %rcx
	xorl	%eax, %eax
	addq	%rbx, %rcx
	jmp	.L116
	.p2align 4,,10
.L132:
	movl	-5(%r13,%rax), %esi
	subq	$4, %rax
	cmpl	-1(%rcx,%rax), %esi
	jne	.L131
.L116:
	cmpq	%rax, %r9
	jne	.L132
.L124:
	movq	%r12, %rax
.L128:
	addq	$65592, %rsp
	popq	%rbx
	popq	%rsi
	popq	%rdi
	popq	%rbp
	popq	%r12
	popq	%r13
	popq	%r14
	popq	%r15
	ret
	.p2align 4,,10
.L131:
	movl	$1, %eax
	jmp	.L114
.L119:
	xorl	%r11d, %r11d
	jmp	.L112
*/

} //if (cbTarget<777)

		} else { // if ( cbPattern<=NeedleThreshold2vs4swampLITE )

// Swampwalker_BAILOUT heuristic order 4 (Needle should be bigger than 4) [
// Needle: 1234567890qwertyuiopasdfghjklzxcv            PRIMALposition=01 PRIMALlength=33  '1234567890qwertyuiopasdfghjklzxcv'
// Needle: vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv            PRIMALposition=29 PRIMALlength=04  'vvvv'
// Needle: vvvvvvvvvvBOOMSHAKALAKAvvvvvvvvvv            PRIMALposition=08 PRIMALlength=20  'vvvBOOMSHAKALAKAvvvv'
// Needle: Trollland                                    PRIMALposition=01 PRIMALlength=09  'Trollland'
// Needle: Swampwalker                                  PRIMALposition=01 PRIMALlength=11  'Swampwalker'
// Needle: licenselessness                              PRIMALposition=01 PRIMALlength=15  'licenselessness'
// Needle: alfalfa                                      PRIMALposition=02 PRIMALlength=06  'lfalfa'
// Needle: Sandokan                                     PRIMALposition=01 PRIMALlength=08  'Sandokan'
// Needle: shazamish                                    PRIMALposition=01 PRIMALlength=09  'shazamish'
// Needle: Simplicius Simplicissimus                    PRIMALposition=06 PRIMALlength=20  'icius Simplicissimus'
// Needle: domilliaquadringenquattuorquinquagintillion  PRIMALposition=01 PRIMALlength=32  'domilliaquadringenquattuorquinqu'
// Needle: boom-boom                                    PRIMALposition=02 PRIMALlength=08  'oom-boom'
// Needle: vvvvv                                        PRIMALposition=01 PRIMALlength=04  'vvvv'
// Needle: 12345                                        PRIMALposition=01 PRIMALlength=05  '12345'
// Needle: likey-likey                                  PRIMALposition=03 PRIMALlength=09  'key-likey'
// Needle: BOOOOOM                                      PRIMALposition=03 PRIMALlength=05  'OOOOM'
// Needle: aaaaaBOOOOOM                                 PRIMALposition=02 PRIMALlength=09  'aaaaBOOOO'
// Needle: BOOOOOMaaaaa                                 PRIMALposition=03 PRIMALlength=09  'OOOOMaaaa'
PRIMALlength=0;
for (i=0+(1); i < cbPattern-((4)-1)+(1)-(1); i++) { // -(1) because the last BB (Building-Block) order 4 has no counterpart(s)
	FoundAtPosition = cbPattern - ((4)-1) + 1;
	PRIMALpositionCANDIDATE=i;
	while ( PRIMALpositionCANDIDATE <= (FoundAtPosition-1) ) {
		j = PRIMALpositionCANDIDATE + 1;
		while ( j <= (FoundAtPosition-1) ) {
			if ( *(uint32_t *)(pbPattern+PRIMALpositionCANDIDATE-(1)) == *(uint32_t *)(pbPattern+j-(1)) ) FoundAtPosition = j;
			j++;
		}
		PRIMALpositionCANDIDATE++;
	}
	PRIMALlengthCANDIDATE = (FoundAtPosition-1)-i+1 +((4)-1);
	if (PRIMALlengthCANDIDATE >= PRIMALlength) {PRIMALposition=i; PRIMALlength = PRIMALlengthCANDIDATE;}
	if (cbPattern-i+1 <= PRIMALlength) break;
	if (PRIMALlength > 128) break; // Bail Out for 129[+]
}
// Swampwalker_BAILOUT heuristic order 4 (Needle should be bigger than 4) ]

// Swampwalker_BAILOUT heuristic order 2 (Needle should be bigger than 2) [
// Needle: 1234567890qwertyuiopasdfghjklzxcv            PRIMALposition=01 PRIMALlength=33  '1234567890qwertyuiopasdfghjklzxcv'
// Needle: vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv            PRIMALposition=31 PRIMALlength=02  'vv'
// Needle: vvvvvvvvvvBOOMSHAKALAKAvvvvvvvvvv            PRIMALposition=09 PRIMALlength=13  'vvBOOMSHAKALA'
// Needle: Trollland                                    PRIMALposition=05 PRIMALlength=05  'lland'
// Needle: Swampwalker                                  PRIMALposition=03 PRIMALlength=09  'ampwalker'
// Needle: licenselessness                              PRIMALposition=01 PRIMALlength=13  'licenselessne'
// Needle: alfalfa                                      PRIMALposition=04 PRIMALlength=04  'alfa'
// Needle: Sandokan                                     PRIMALposition=01 PRIMALlength=07  'Sandoka'
// Needle: shazamish                                    PRIMALposition=02 PRIMALlength=08  'hazamish'
// Needle: Simplicius Simplicissimus                    PRIMALposition=08 PRIMALlength=15  'ius Simplicissi'
// Needle: domilliaquadringenquattuorquinquagintillion  PRIMALposition=01 PRIMALlength=19  'domilliaquadringenq'
// Needle: DODO                                         PRIMALposition=02 PRIMALlength=03  'ODO'
// Needle: DODOD                                        PRIMALposition=03 PRIMALlength=03  'DOD'
// Needle: aaaDODO                                      PRIMALposition=02 PRIMALlength=05  'aaDOD'
// Needle: aaaDODOD                                     PRIMALposition=02 PRIMALlength=05  'aaDOD'
// Needle: DODOaaa                                      PRIMALposition=02 PRIMALlength=05  'ODOaa'
// Needle: DODODaaa                                     PRIMALposition=03 PRIMALlength=05  'DODaa'
/*
PRIMALlength=0;
for (i=0+(1); i < cbPattern-2+1+(1)-(1); i++) { // -(1) because the last BB order 2 has no counterpart(s)
    FoundAtPosition = cbPattern;
    PRIMALpositionCANDIDATE=i;
    while ( PRIMALpositionCANDIDATE <= (FoundAtPosition-1) ) {
        j = PRIMALpositionCANDIDATE + 1;
        while ( j <= (FoundAtPosition-1) ) {
            if ( *(unsigned short *)(pbPattern+PRIMALpositionCANDIDATE-(1)) == *(unsigned short *)(pbPattern+j-(1)) ) FoundAtPosition = j;
            j++;
        }
        PRIMALpositionCANDIDATE++;
    }
    PRIMALlengthCANDIDATE = (FoundAtPosition-1)-i+(2);
    if (PRIMALlengthCANDIDATE >= PRIMALlength) {PRIMALposition=i; PRIMALlength = PRIMALlengthCANDIDATE;}
}
*/
// Swampwalker_BAILOUT heuristic order 2 (Needle should be bigger than 2) ]

/*
Legend:
'[]' points to BB forming left or right boundary;
'{}' points to BB being searched for;
'()' position of duplicate and new right boundary;

                       00000000011111111112222222222333
                       12345678901234567890123456789012
Example #1 for Needle: 1234567890qwertyuiopasdfghjklzxcv  NewNeedle = '1234567890qwertyuiopasdfghjklzxcv'
Example #2 for Needle: vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv  NewNeedle = 'vv'
Example #3 for Needle: vvvvvvvvvvBOOMSHAKALAKAvvvvvvvvvv  NewNeedle = 'vvBOOMSHAKALA'


     PRIMALlength=00; FoundAtPosition=33; 
Step 01_00: {}[12]34567890qwertyuiopasdfghjklzxc[v?] ! For position #01 the initial boundaries are PRIMALpositionCANDIDATE=LeftBoundary=01, RightBoundary=FoundAtPosition-1, the CANDIDATE PRIMAL string length is RightBoundary-LeftBoundary+(2)=(33-1)-01+(2)=33 !
Step 01_01: [{12}]34567890qwertyuiopasdfghjklzxc[v?] ! Searching for '12', FoundAtPosition = 33, PRIMALlengthCANDIDATE=RightBoundary-LeftBoundary+(2)=(33-1)-01+(2)=33 ! 
Step 01_02: [1{2]3}4567890qwertyuiopasdfghjklzxc[v?] ! Searching for '23', FoundAtPosition = 33, PRIMALlengthCANDIDATE=RightBoundary-LeftBoundary+(2)=(33-1)-01+(2)=33 ! 
...
Step 01_30: [12]34567890qwertyuiopasdfghjkl{zx}c[v?] ! Searching for 'zx', FoundAtPosition = 33, PRIMALlengthCANDIDATE=RightBoundary-LeftBoundary+(2)=(33-1)-01+(2)=33 ! 
Step 01_31: [12]34567890qwertyuiopasdfghjklz{xc}[v?] ! Searching for 'xc', FoundAtPosition = 33, PRIMALlengthCANDIDATE=RightBoundary-LeftBoundary+(2)=(33-1)-01+(2)=33 ! 
     if (PRIMALlengthCANDIDATE >= PRIMALlength) {PRIMALposition=PRIMALpositionCANDIDATE; PRIMALlength = PRIMALlengthCANDIDATE;}
Step 02_00: {}1[23]4567890qwertyuiopasdfghjklzxc[v?] ! For position #02 the initial boundaries are PRIMALpositionCANDIDATE=LeftBoundary=02, RightBoundary=FoundAtPosition-1, the CANDIDATE PRIMAL string length is RightBoundary-LeftBoundary+(2)=(33-1)-02+(2)=32 !
Step 02_01: 1[{23}]4567890qwertyuiopasdfghjklzxc[v?] ! Searching for '23', FoundAtPosition = 33, PRIMALlengthCANDIDATE=RightBoundary-LeftBoundary+(2)=(33-1)-02+(2)=32 ! 
Step 02_02: 1[2{3]4}567890qwertyuiopasdfghjklzxc[v?] ! Searching for '34', FoundAtPosition = 33, PRIMALlengthCANDIDATE=RightBoundary-LeftBoundary+(2)=(33-1)-02+(2)=32 ! 
...
Step 02_29: 1[23]4567890qwertyuiopasdfghjkl{zx}c[v?] ! Searching for 'zx', FoundAtPosition = 33, PRIMALlengthCANDIDATE=RightBoundary-LeftBoundary+(2)=(33-1)-02+(2)=32 ! 
Step 02_30: 1[23]4567890qwertyuiopasdfghjklz{xc}[v?] ! Searching for 'xc', FoundAtPosition = 33, PRIMALlengthCANDIDATE=RightBoundary-LeftBoundary+(2)=(33-1)-02+(2)=32 ! 
     if (PRIMALlengthCANDIDATE >= PRIMALlength) {PRIMALposition=PRIMALpositionCANDIDATE; PRIMALlength = PRIMALlengthCANDIDATE;}
...
Step 31_00: {}1234567890qwertyuiopasdfghjklz[xc][v?] ! For position #31 the initial boundaries are PRIMALpositionCANDIDATE=LeftBoundary=31, RightBoundary=FoundAtPosition-1, the CANDIDATE PRIMAL string length is RightBoundary-LeftBoundary+(2)=(33-1)-31+(2)=03 !
Step 31_01: 1234567890qwertyuiopasdfghjklz[{xc}][v?] ! Searching for 'xc', FoundAtPosition = 33, PRIMALlengthCANDIDATE=RightBoundary-LeftBoundary+(2)=(33-1)-31+(2)=03 ! 
     if (PRIMALlengthCANDIDATE >= PRIMALlength) {PRIMALposition=PRIMALpositionCANDIDATE; PRIMALlength = PRIMALlengthCANDIDATE;}
     Result:
     PRIMALposition=01 PRIMALlength=33, NewNeedle = '1234567890qwertyuiopasdfghjklzxcv'


     PRIMALlength=00; FoundAtPosition=33; 
Step 01_00: {}[vv]vvvvvvvvvvvvvvvvvvvvvvvvvvvvvv[v?] ! For position #01 the initial boundaries are PRIMALpositionCANDIDATE=LeftBoundary=01, RightBoundary=FoundAtPosition-1, the CANDIDATE PRIMAL string length is RightBoundary-LeftBoundary+(2)=(33-1)-01+(2)=33 !
Step 01_01: [{v(v}]v)vvvvvvvvvvvvvvvvvvvvvvvvvvvvvv  ! Searching for 'vv', FoundAtPosition = 02, PRIMALlengthCANDIDATE=RightBoundary-LeftBoundary+(2)=(02-1)-01+(2)=02 ! 
     if (PRIMALlengthCANDIDATE >= PRIMALlength) {PRIMALposition=PRIMALpositionCANDIDATE; PRIMALlength = PRIMALlengthCANDIDATE;}
Step 02_00: {}v[vv]vvvvvvvvvvvvvvvvvvvvvvvvvvvvv[v?] ! For position #02 the initial boundaries are PRIMALpositionCANDIDATE=LeftBoundary=02, RightBoundary=FoundAtPosition-1, the CANDIDATE PRIMAL string length is RightBoundary-LeftBoundary+(2)=(33-1)-02+(2)=32 !
Step 02_01: v[{v(v}]v)vvvvvvvvvvvvvvvvvvvvvvvvvvvvv  ! Searching for 'vv', FoundAtPosition = 03, PRIMALlengthCANDIDATE=RightBoundary-LeftBoundary+(2)=(03-1)-02+(2)=02 ! 
     if (PRIMALlengthCANDIDATE >= PRIMALlength) {PRIMALposition=PRIMALpositionCANDIDATE; PRIMALlength = PRIMALlengthCANDIDATE;}
...
Step 31_00: {}vvvvvvvvvvvvvvvvvvvvvvvvvvvvvv[vv][v?] ! For position #31 the initial boundaries are PRIMALpositionCANDIDATE=LeftBoundary=31, RightBoundary=FoundAtPosition-1, the CANDIDATE PRIMAL string length is RightBoundary-LeftBoundary+(2)=(33-1)-31+(2)=03 !
Step 31_01: vvvvvvvvvvvvvvvvvvvvvvvvvvvvvv[{v(v}]v)  ! Searching for 'vv', FoundAtPosition = 32, PRIMALlengthCANDIDATE=RightBoundary-LeftBoundary+(2)=(32-1)-31+(2)=02 ! 
     if (PRIMALlengthCANDIDATE >= PRIMALlength) {PRIMALposition=PRIMALpositionCANDIDATE; PRIMALlength = PRIMALlengthCANDIDATE;}
     Result:
     PRIMALposition=31 PRIMALlength=02, NewNeedle = 'vv'


     PRIMALlength=00; FoundAtPosition=33; 
Step 01_00: {}[vv]vvvvvvvvBOOMSHAKALAKAvvvvvvvvv[v?] ! For position #01 the initial boundaries are PRIMALpositionCANDIDATE=LeftBoundary=01, RightBoundary=FoundAtPosition-1, the CANDIDATE PRIMAL string length is RightBoundary-LeftBoundary+(2)=(33-1)-01+(2)=33 !
Step 01_01: [{v(v}]v)vvvvvvvBOOMSHAKALAKAvvvvvvvvvv  ! Searching for 'vv', FoundAtPosition = 02, PRIMALlengthCANDIDATE=RightBoundary-LeftBoundary+(2)=(02-1)-01+(2)=02 ! 
     if (PRIMALlengthCANDIDATE >= PRIMALlength) {PRIMALposition=PRIMALpositionCANDIDATE; PRIMALlength = PRIMALlengthCANDIDATE;}
Step 02_00: {}v[vv]vvvvvvvBOOMSHAKALAKAvvvvvvvvv[v?] ! For position #02 the initial boundaries are PRIMALpositionCANDIDATE=LeftBoundary=02, RightBoundary=FoundAtPosition-1, the CANDIDATE PRIMAL string length is RightBoundary-LeftBoundary+(2)=(33-1)-02+(2)=32 !
Step 02_01: v[{v(v}]v)vvvvvvBOOMSHAKALAKAvvvvvvvvvv  ! Searching for 'vv', FoundAtPosition = 03, PRIMALlengthCANDIDATE=RightBoundary-LeftBoundary+(2)=(03-1)-02+(2)=02 ! 
     if (PRIMALlengthCANDIDATE >= PRIMALlength) {PRIMALposition=PRIMALpositionCANDIDATE; PRIMALlength = PRIMALlengthCANDIDATE;}
...
Step 09_00: {}vvvvvvvv[vv]BOOMSHAKALAKAvvvvvvvvv[v?] ! For position #09 the initial boundaries are PRIMALpositionCANDIDATE=LeftBoundary=09, RightBoundary=FoundAtPosition-1, the CANDIDATE PRIMAL string length is RightBoundary-LeftBoundary+(2)=(33-1)-09+(2)=25 !
Step 09_01: vvvvvvvv[{vv}]BOOMSHAKALAKA(vv)vvvvvvvv  ! Searching for 'vv', FoundAtPosition = 24, PRIMALlengthCANDIDATE=RightBoundary-LeftBoundary+(2)=(24-1)-09+(2)=16 ! 
Step 09_02: vvvvvvvv[v{v]B}OOMSHAKALAKA[vv]vvvvvvvv  ! Searching for 'vB', FoundAtPosition = 24, PRIMALlengthCANDIDATE=RightBoundary-LeftBoundary+(2)=(24-1)-09+(2)=16 ! 
Step 09_03: vvvvvvvv[vv]{BO}OMSHAKALAKA[vv]vvvvvvvv  ! Searching for 'BO', FoundAtPosition = 24, PRIMALlengthCANDIDATE=RightBoundary-LeftBoundary+(2)=(24-1)-09+(2)=16 ! 
Step 09_04: vvvvvvvv[vv]B{OO}MSHAKALAKA[vv]vvvvvvvv  ! Searching for 'OO', FoundAtPosition = 24, PRIMALlengthCANDIDATE=RightBoundary-LeftBoundary+(2)=(24-1)-09+(2)=16 ! 
Step 09_05: vvvvvvvv[vv]BO{OM}SHAKALAKA[vv]vvvvvvvv  ! Searching for 'OM', FoundAtPosition = 24, PRIMALlengthCANDIDATE=RightBoundary-LeftBoundary+(2)=(24-1)-09+(2)=16 ! 
Step 09_06: vvvvvvvv[vv]BOO{MS}HAKALAKA[vv]vvvvvvvv  ! Searching for 'MS', FoundAtPosition = 24, PRIMALlengthCANDIDATE=RightBoundary-LeftBoundary+(2)=(24-1)-09+(2)=16 ! 
Step 09_07: vvvvvvvv[vv]BOOM{SH}AKALAKA[vv]vvvvvvvv  ! Searching for 'SH', FoundAtPosition = 24, PRIMALlengthCANDIDATE=RightBoundary-LeftBoundary+(2)=(24-1)-09+(2)=16 ! 
Step 09_08: vvvvvvvv[vv]BOOMS{HA}KALAKA[vv]vvvvvvvv  ! Searching for 'HA', FoundAtPosition = 24, PRIMALlengthCANDIDATE=RightBoundary-LeftBoundary+(2)=(24-1)-09+(2)=16 ! 
Step 09_09: vvvvvvvv[vv]BOOMSH{AK}AL(AK)Avvvvvvvvvv  ! Searching for 'AK', FoundAtPosition = 21, PRIMALlengthCANDIDATE=RightBoundary-LeftBoundary+(2)=(21-1)-09+(2)=13 ! 
Step 09_10: vvvvvvvv[vv]BOOMSHA{KA}L[AK]Avvvvvvvvvv  ! Searching for 'KA', FoundAtPosition = 21, PRIMALlengthCANDIDATE=RightBoundary-LeftBoundary+(2)=(21-1)-09+(2)=13 ! 
Step 09_11: vvvvvvvv[vv]BOOMSHAK{AL}[AK]Avvvvvvvvvv  ! Searching for 'AL', FoundAtPosition = 21, PRIMALlengthCANDIDATE=RightBoundary-LeftBoundary+(2)=(21-1)-09+(2)=13 ! 
Step 09_12: vvvvvvvv[vv]BOOMSHAKA{L[A}K]Avvvvvvvvvv  ! Searching for 'LA', FoundAtPosition = 21, PRIMALlengthCANDIDATE=RightBoundary-LeftBoundary+(2)=(21-1)-09+(2)=13 ! 
     if (PRIMALlengthCANDIDATE >= PRIMALlength) {PRIMALposition=PRIMALpositionCANDIDATE; PRIMALlength = PRIMALlengthCANDIDATE;}
...
Step 31_00: {}vvvvvvvv[vv]BOOMSHAKALAKAvvvvvvvvv[v?] ! For position #31 the initial boundaries are PRIMALpositionCANDIDATE=LeftBoundary=31, RightBoundary=FoundAtPosition-1, the CANDIDATE PRIMAL string length is RightBoundary-LeftBoundary+(2)=(33-1)-31+(2)=03 !
Step 31_01: vvvvvvvvvvBOOMSHAKALAKAvvvvvvv[{v(v}]v)  ! Searching for 'vv', FoundAtPosition = 32, PRIMALlengthCANDIDATE=RightBoundary-LeftBoundary+(2)=(32-1)-31+(2)=02 ! 
     if (PRIMALlengthCANDIDATE >= PRIMALlength) {PRIMALposition=PRIMALpositionCANDIDATE; PRIMALlength = PRIMALlengthCANDIDATE;}
     Result:
     PRIMALposition=09 PRIMALlength=13, NewNeedle = 'vvBOOMSHAKALA'
*/

// Here we have 4 or bigger NewNeedle, apply order 2 for pbPattern[i+(PRIMALposition-1)] with length 'PRIMALlength' and compare the pbPattern[i] with length 'cbPattern':
PRIMALlengthCANDIDATE = cbPattern;
cbPattern = PRIMALlength;
pbPattern = pbPattern + (PRIMALposition-1);

// Revision 2 commented section [
/*
if (cbPattern-1 <= 255) {
// BMH Order 2 [
			ulHashPattern = *(uint32_t *)(pbPattern); // First four bytes
			for (i=0; i < 256*256; i++) {bm_Horspool_Order2[i]= cbPattern-1;} // cbPattern-(Order-1) for Horspool; 'memset' if not optimized
			for (i=0; i < cbPattern-1; i++) bm_Horspool_Order2[*(unsigned short *)(pbPattern+i)]=i; // Rightmost appearance/position is needed
			i=0;
			while (i <= cbTarget-cbPattern) { 
				Gulliver = bm_Horspool_Order2[*(unsigned short *)&pbTarget[i+cbPattern-1-1]];
				if ( Gulliver != cbPattern-1 ) { // CASE #2: if equal means the pair (char order 2) is not found i.e. Gulliver remains intact, skip the whole pattern and fall back (Order-1) chars i.e. one char for Order 2
				if ( Gulliver == cbPattern-2 ) { // CASE #1: means the pair (char order 2) is found
					if ( *(uint32_t *)&pbTarget[i] == ulHashPattern) {
						count = cbPattern-4+1; 
						while ( count > 0 && *(uint32_t *)(pbPattern+count-1) == *(uint32_t *)(&pbTarget[i]+(count-1)) )
							count = count-4;
// If we miss to hit then no need to compare the original: Needle
if ( count <= 0 ) {
// I have to add out-of-range checks...
// i-(PRIMALposition-1) >= 0
// &pbTarget[i-(PRIMALposition-1)] <= pbTargetMax - 4
// i-(PRIMALposition-1)+(count-1) >= 0
// &pbTarget[i-(PRIMALposition-1)+(count-1)] <= pbTargetMax - 4

// "FIX" from 2014-Apr-27:
// Because (count-1) is negative, above fours are reduced to next twos:
// i-(PRIMALposition-1)+(count-1) >= 0
// &pbTarget[i-(PRIMALposition-1)] <= pbTargetMax - 4
	// The line below is BUGGY:
	//if ( (i-(PRIMALposition-1) >= 0) && (&pbTarget[i-(PRIMALposition-1)] <= pbTargetMax - 4) && (&pbTarget[i-(PRIMALposition-1)+(count-1)] <= pbTargetMax - 4) ) {
	// The line below is NOT OKAY, in fact so stupid, grrr, not a blunder, not carelessness, but overconfidence in writing "on the fly":
	//if ( ((signed int)(i-(PRIMALposition-1)+(count-1)) >= 0) && (&pbTarget[i-(PRIMALposition-1)] <= pbTargetMax - 4) ) {
// FIX from 2016-Aug-10 (two times failed to do simple boundary checks, pfu):
	if ( ((signed int)(i-(PRIMALposition-1)) >= 0) && (&pbTarget[i-(PRIMALposition-1)]+((PRIMALlengthCANDIDATE-4+1)-1) <= pbTargetMax - 4) ) {
		if ( *(uint32_t *)&pbTarget[i-(PRIMALposition-1)] == *(uint32_t *)(pbPattern-(PRIMALposition-1))) { // This fast check ensures not missing a match (for remainder) when going under 0 in loop below:
			count = PRIMALlengthCANDIDATE-4+1; 
			while ( count > 0 && *(uint32_t *)(pbPattern-(PRIMALposition-1)+count-1) == *(uint32_t *)(&pbTarget[i-(PRIMALposition-1)]+(count-1)) )
				count = count-4;
			if ( count <= 0 ) return(pbTarget+i-(PRIMALposition-1));	
		}
	}
}
					}
					Gulliver = 1;
				} else
					Gulliver = cbPattern - Gulliver - 2; // CASE #3: the pair is found and not as suffix i.e. rightmost position
				}
				i = i + Gulliver;
				//GlobalI++; // Comment it, it is only for stats.
			}
			return(NULL);
// BMH Order 2 ]
} else {
			// BMH order 2, needle should be >=4:
			ulHashPattern = *(uint32_t *)(pbPattern); // First four bytes
			for (i=0; i < 256*256; i++) {bm_Horspool_Order2[i]=0;}
			for (i=0; i < cbPattern-1; i++) bm_Horspool_Order2[*(unsigned short *)(pbPattern+i)]=1;
			i=0;
			while (i <= cbTarget-cbPattern) {
				Gulliver = 1; // 'Gulliver' is the skip
				if ( bm_Horspool_Order2[*(unsigned short *)&pbTarget[i+cbPattern-1-1]] != 0 ) {
					if ( bm_Horspool_Order2[*(unsigned short *)&pbTarget[i+cbPattern-1-1-2]] == 0 ) Gulliver = cbPattern-(2-1)-2; else {
						if ( *(uint32_t *)&pbTarget[i] == ulHashPattern) { // This fast check ensures not missing a match (for remainder) when going under 0 in loop below:
							count = cbPattern-4+1; 
							while ( count > 0 && *(uint32_t *)(pbPattern+count-1) == *(uint32_t *)(&pbTarget[i]+(count-1)) )
								count = count-4;
// If we miss to hit then no need to compare the original: Needle
if ( count <= 0 ) {
// I have to add out-of-range checks...
// i-(PRIMALposition-1) >= 0
// &pbTarget[i-(PRIMALposition-1)] <= pbTargetMax - 4
// i-(PRIMALposition-1)+(count-1) >= 0
// &pbTarget[i-(PRIMALposition-1)+(count-1)] <= pbTargetMax - 4

// "FIX" from 2014-Apr-27:
// Because (count-1) is negative, above fours are reduced to next twos:
// i-(PRIMALposition-1)+(count-1) >= 0
// &pbTarget[i-(PRIMALposition-1)] <= pbTargetMax - 4
	// The line below is BUGGY:
	//if ( (i-(PRIMALposition-1) >= 0) && (&pbTarget[i-(PRIMALposition-1)] <= pbTargetMax - 4) && (&pbTarget[i-(PRIMALposition-1)+(count-1)] <= pbTargetMax - 4) ) {
	// The line below is NOT OKAY, in fact so stupid, grrr, not a blunder, not carelessness, but overconfidence in writing "on the fly":
	//if ( ((signed int)(i-(PRIMALposition-1)+(count-1)) >= 0) && (&pbTarget[i-(PRIMALposition-1)] <= pbTargetMax - 4) ) {
// FIX from 2016-Aug-10 (two times failed to do simple boundary checks, pfu):
	if ( ((signed int)(i-(PRIMALposition-1)) >= 0) && (&pbTarget[i-(PRIMALposition-1)]+((PRIMALlengthCANDIDATE-4+1)-1) <= pbTargetMax - 4) ) {
		if ( *(uint32_t *)&pbTarget[i-(PRIMALposition-1)] == *(uint32_t *)(pbPattern-(PRIMALposition-1))) { // This fast check ensures not missing a match (for remainder) when going under 0 in loop below:
			count = PRIMALlengthCANDIDATE-4+1; 
			while ( count > 0 && *(uint32_t *)(pbPattern-(PRIMALposition-1)+count-1) == *(uint32_t *)(&pbTarget[i-(PRIMALposition-1)]+(count-1)) )
				count = count-4;
			if ( count <= 0 ) return(pbTarget+i-(PRIMALposition-1));	
		}
	}
}
						}
					}
				} else Gulliver = cbPattern-(2-1);
				i = i + Gulliver;
				//GlobalI++; // Comment it, it is only for stats.
			}
			return(NULL);
}
*/
// Revision 2 commented section ]

		if ( cbPattern<=NeedleThreshold2vs4swampLITE ) { 

			// BMH order 2, needle should be >=4:
			ulHashPattern = *(uint32_t *)(pbPattern); // First four bytes
			for (i=0; i < 256*256; i++) {bm_Horspool_Order2[i]=0;}
			// Above line is translated by Intel as:
//  0044c 41 b8 00 00 01 
//        00               mov r8d, 65536                         
//  00452 44 89 5c 24 20   mov DWORD PTR [32+rsp], r11d           
//  00457 44 89 54 24 60   mov DWORD PTR [96+rsp], r10d           
//  0045c e8 fc ff ff ff   call _intel_fast_memset                
			for (i=0; i < cbPattern-1; i++) bm_Horspool_Order2[*(unsigned short *)(pbPattern+i)]=1;
			i=0;
			while (i <= cbTarget-cbPattern) {
				Gulliver = 1; // 'Gulliver' is the skip
				if ( bm_Horspool_Order2[*(unsigned short *)&pbTarget[i+cbPattern-1-1]] != 0 ) {
					if ( bm_Horspool_Order2[*(unsigned short *)&pbTarget[i+cbPattern-1-1-2]] == 0 ) Gulliver = cbPattern-(2-1)-2; else {
						if ( *(uint32_t *)&pbTarget[i] == ulHashPattern) { // This fast check ensures not missing a match (for remainder) when going under 0 in loop below:
							count = cbPattern-4+1; 
							while ( count > 0 && *(uint32_t *)(pbPattern+count-1) == *(uint32_t *)(&pbTarget[i]+(count-1)) )
								count = count-4;

	if (cbPattern != PRIMALlengthCANDIDATE) { // No need of same comparison when Needle and NewNeedle are equal!
// If we miss to hit then no need to compare the original: Needle
if ( count <= 0 ) {
// I have to add out-of-range checks...
// i-(PRIMALposition-1) >= 0
// &pbTarget[i-(PRIMALposition-1)] <= pbTargetMax - 4
// i-(PRIMALposition-1)+(count-1) >= 0
// &pbTarget[i-(PRIMALposition-1)+(count-1)] <= pbTargetMax - 4

// "FIX" from 2014-Apr-27:
// Because (count-1) is negative, above fours are reduced to next twos:
// i-(PRIMALposition-1)+(count-1) >= 0
// &pbTarget[i-(PRIMALposition-1)] <= pbTargetMax - 4
	// The line below is BUGGY:
	//if ( (i-(PRIMALposition-1) >= 0) && (&pbTarget[i-(PRIMALposition-1)] <= pbTargetMax - 4) && (&pbTarget[i-(PRIMALposition-1)+(count-1)] <= pbTargetMax - 4) ) {
	// The line below is NOT OKAY, in fact so stupid, grrr, not a blunder, not carelessness, but overconfidence in writing "on the fly":
	//if ( ((signed int)(i-(PRIMALposition-1)+(count-1)) >= 0) && (&pbTarget[i-(PRIMALposition-1)] <= pbTargetMax - 4) ) {
// FIX from 2016-Aug-10 (two times failed to do simple boundary checks, pfu):
	if ( ((signed int)(i-(PRIMALposition-1)) >= 0) && (&pbTarget[i-(PRIMALposition-1)]+((PRIMALlengthCANDIDATE-4+1)-1) <= pbTargetMax - 4) ) {
		if ( *(uint32_t *)&pbTarget[i-(PRIMALposition-1)] == *(uint32_t *)(pbPattern-(PRIMALposition-1))) { // This fast check ensures not missing a match (for remainder) when going under 0 in loop below:
			count = PRIMALlengthCANDIDATE-4+1; 
			while ( count > 0 && *(uint32_t *)(pbPattern-(PRIMALposition-1)+count-1) == *(uint32_t *)(&pbTarget[i-(PRIMALposition-1)]+(count-1)) )
				count = count-4;
			if ( count <= 0 ) return(pbTarget+i-(PRIMALposition-1));	
		}
	}
}
	} else { //if (cbPattern != PRIMALlengthCANDIDATE)
							if ( count <= 0 ) return(pbTarget+i);
	}
						}
					}
				} else Gulliver = cbPattern-(2-1);
				i = i + Gulliver;
				//GlobalI++; // Comment it, it is only for stats.
			}
			return(NULL);

		} else { // if ( cbPattern<=NeedleThreshold2vs4swampLITE )

			// BMH pseudo-order 4, needle should be >=8+2:
			ulHashPattern = *(uint32_t *)(pbPattern); // First four bytes
			for (i=0; i < 256*256; i++) {bm_Horspool_Order2[i]=0;}
			// In line below we "hash" 4bytes to 2bytes i.e. 16bit table, how to compute TOTAL number of BBs, 'cbPattern - Order + 1' is the number of BBs for text 'cbPattern' bytes long, for example, for cbPattern=11 'fastest fox' and Order=4 we have BBs = 11-4+1=8:
			//"fast"
			//"aste"
			//"stes"
			//"test"
			//"est "
			//"st f"
			//"t fo"
			//" fox"
			//for (i=0; i < cbPattern-4+1; i++) bm_Horspool_Order2[( *(unsigned short *)(pbPattern+i+0) + *(unsigned short *)(pbPattern+i+2) ) & ( (1<<16)-1 )]=1;
			//for (i=0; i < cbPattern-4+1; i++) bm_Horspool_Order2[( (*(uint32_t *)(pbPattern+i+0)>>16)+(*(uint32_t *)(pbPattern+i+0)&0xFFFF) ) & ( (1<<16)-1 )]=1;
			// Above line is replaced by next one with better hashing:
			for (i=0; i < cbPattern-4+1; i++) bm_Horspool_Order2[( (*(uint32_t *)(pbPattern+i+0)>>(16-1))+(*(uint32_t *)(pbPattern+i+0)&0xFFFF) ) & ( (1<<16)-1 )]=1;
			i=0;
			while (i <= cbTarget-cbPattern) {
				Gulliver = 1;
				//if ( bm_Horspool_Order2[( (*(uint32_t *)&pbTarget[i+cbPattern-1-1-2]>>16)+(*(uint32_t *)&pbTarget[i+cbPattern-1-1-2]&0xFFFF) ) & ( (1<<16)-1 )] != 0 ) { // DWORD #1
				// Above line is replaced by next one with better hashing:
				if ( bm_Horspool_Order2[( (*(uint32_t *)&pbTarget[i+cbPattern-1-1-2]>>(16-1))+(*(uint32_t *)&pbTarget[i+cbPattern-1-1-2]&0xFFFF) ) & ( (1<<16)-1 )] != 0 ) { // DWORD #1
					//if ( bm_Horspool_Order2[( (*(uint32_t *)&pbTarget[i+cbPattern-1-1-2-4]>>16)+(*(uint32_t *)&pbTarget[i+cbPattern-1-1-2-4]&0xFFFF) ) & ( (1<<16)-1 )] == 0 ) Gulliver = cbPattern-(2-1)-2-4; else {
					// Above line is replaced in order to strengthen the skip by checking the middle DWORD,if the two DWORDs are 'ab' and 'cd' i.e. [2x][2a][2b][2c][2d] then the middle DWORD is 'bc'.
					// The respective offsets (backwards) are: -10/-8/-6/-4 for 'xa'/'ab'/'bc'/'cd'.
					//if ( ( bm_Horspool_Order2[( (*(uint32_t *)&pbTarget[i+cbPattern-1-1-2-6]>>16)+(*(uint32_t *)&pbTarget[i+cbPattern-1-1-2-6]&0xFFFF) ) & ( (1<<16)-1 )] ) + ( bm_Horspool_Order2[( (*(uint32_t *)&pbTarget[i+cbPattern-1-1-2-4]>>16)+(*(uint32_t *)&pbTarget[i+cbPattern-1-1-2-4]&0xFFFF) ) & ( (1<<16)-1 )] ) + ( bm_Horspool_Order2[( (*(uint32_t *)&pbTarget[i+cbPattern-1-1-2-2]>>16)+(*(uint32_t *)&pbTarget[i+cbPattern-1-1-2-2]&0xFFFF) ) & ( (1<<16)-1 )] ) < 3 ) Gulliver = cbPattern-(2-1)-2-4-2; else {
					// Above line is replaced by next one with better hashing:
					// When using (16-1) right shifting instead of 16 we will have two different pairs (if they are equal), the highest bit being lost do the job especialy for ASCII texts with no symbols in range 128-255.
					// Example for genomesque pair TT+TT being shifted by (16-1):
					// T            = 01010100
					// TT           = 01010100 01010100
					// TTTT         = 01010100 01010100 01010100 01010100
					// TTTT>>16     = 00000000 00000000 01010100 01010100
					// TTTT>>(16-1) = 00000000 00000000 10101000 10101000 <--- Due to the left shift by 1, the 8th bits of 1st and 2nd bytes are populated - usually they are 0 for English texts & 'ACGT' data.
					//if ( ( bm_Horspool_Order2[( (*(uint32_t *)&pbTarget[i+cbPattern-1-1-2-6]>>(16-1))+(*(uint32_t *)&pbTarget[i+cbPattern-1-1-2-6]&0xFFFF) ) & ( (1<<16)-1 )] ) + ( bm_Horspool_Order2[( (*(uint32_t *)&pbTarget[i+cbPattern-1-1-2-4]>>(16-1))+(*(uint32_t *)&pbTarget[i+cbPattern-1-1-2-4]&0xFFFF) ) & ( (1<<16)-1 )] ) + ( bm_Horspool_Order2[( (*(uint32_t *)&pbTarget[i+cbPattern-1-1-2-2]>>(16-1))+(*(uint32_t *)&pbTarget[i+cbPattern-1-1-2-2]&0xFFFF) ) & ( (1<<16)-1 )] ) < 3 ) Gulliver = cbPattern-(2-1)-2-4-2; else {
					// 'Maximus' uses branched 'if', again.
					if ( \
					( bm_Horspool_Order2[( (*(uint32_t *)&pbTarget[i+cbPattern-1-1-2-6 +1]>>(16-1))+(*(uint32_t *)&pbTarget[i+cbPattern-1-1-2-6 +1]&0xFFFF) ) & ( (1<<16)-1 )] ) == 0 \
					|| ( bm_Horspool_Order2[( (*(uint32_t *)&pbTarget[i+cbPattern-1-1-2-4 +1]>>(16-1))+(*(uint32_t *)&pbTarget[i+cbPattern-1-1-2-4 +1]&0xFFFF) ) & ( (1<<16)-1 )] ) == 0 \
					) Gulliver = cbPattern-(2-1)-2-4-2 +1; else {
					// Above line is not optimized (several a SHR are used), we have 5 non-overlapping WORDs, or 3 overlapping WORDs, within 4 overlapping DWORDs so:
// [2x][2a][2b][2c][2d]
// DWORD #4
// [2a] (*(uint32_t *)&pbTarget[i+cbPattern-1-1-2-6]>>16) =     !SHR to be avoided! <--
// [2x] (*(uint32_t *)&pbTarget[i+cbPattern-1-1-2-6]&0xFFFF) =                        |
//     DWORD #3                                                                       |
// [2b] (*(uint32_t *)&pbTarget[i+cbPattern-1-1-2-4]>>16) =     !SHR to be avoided!   |<--
// [2a] (*(uint32_t *)&pbTarget[i+cbPattern-1-1-2-4]&0xFFFF) = ------------------------  |
//         DWORD #2                                                                      |
// [2c] (*(uint32_t *)&pbTarget[i+cbPattern-1-1-2-2]>>16) =     !SHR to be avoided!      |<--
// [2b] (*(uint32_t *)&pbTarget[i+cbPattern-1-1-2-2]&0xFFFF) = ---------------------------  |
//             DWORD #1                                                                     |
// [2d] (*(uint32_t *)&pbTarget[i+cbPattern-1-1-2-0]>>16) =                                 |
// [2c] (*(uint32_t *)&pbTarget[i+cbPattern-1-1-2-0]&0xFFFF) = ------------------------------
//
// So in order to remove 3 SHR instructions the equal extractions are:
// DWORD #4
// [2a] (*(uint32_t *)&pbTarget[i+cbPattern-1-1-2-4]&0xFFFF) =  !SHR to be avoided! <--
// [2x] (*(uint32_t *)&pbTarget[i+cbPattern-1-1-2-6]&0xFFFF) =                        |
//     DWORD #3                                                                       |
// [2b] (*(uint32_t *)&pbTarget[i+cbPattern-1-1-2-2]&0xFFFF) =  !SHR to be avoided!   |<--
// [2a] (*(uint32_t *)&pbTarget[i+cbPattern-1-1-2-4]&0xFFFF) = ------------------------  |
//         DWORD #2                                                                      |
// [2c] (*(uint32_t *)&pbTarget[i+cbPattern-1-1-2-0]&0xFFFF) =  !SHR to be avoided!      |<--
// [2b] (*(uint32_t *)&pbTarget[i+cbPattern-1-1-2-2]&0xFFFF) = ---------------------------  |
//             DWORD #1                                                                     |
// [2d] (*(uint32_t *)&pbTarget[i+cbPattern-1-1-2-0]>>16) =                                 |
// [2c] (*(uint32_t *)&pbTarget[i+cbPattern-1-1-2-0]&0xFFFF) = ------------------------------
					//if ( ( bm_Horspool_Order2[( (*(uint32_t *)&pbTarget[i+cbPattern-1-1-2-4]&0xFFFF)+(*(uint32_t *)&pbTarget[i+cbPattern-1-1-2-6]&0xFFFF) ) & ( (1<<16)-1 )] ) + ( bm_Horspool_Order2[( (*(uint32_t *)&pbTarget[i+cbPattern-1-1-2-2]&0xFFFF)+(*(uint32_t *)&pbTarget[i+cbPattern-1-1-2-4]&0xFFFF) ) & ( (1<<16)-1 )] ) + ( bm_Horspool_Order2[( (*(uint32_t *)&pbTarget[i+cbPattern-1-1-2-0]&0xFFFF)+(*(uint32_t *)&pbTarget[i+cbPattern-1-1-2-2]&0xFFFF) ) & ( (1<<16)-1 )] ) < 3 ) Gulliver = cbPattern-(2-1)-2-6; else {
// Since the above Decumanus mumbo-jumbo (3 overlapping lookups vs 2 non-overlapping lookups) is not fast enough we go DuoDecumanus or 3x4:
// [2y][2x][2a][2b][2c][2d]
// DWORD #3
//         DWORD #2
//                 DWORD #1
					//if ( ( bm_Horspool_Order2[( (*(uint32_t *)&pbTarget[i+cbPattern-1-1-2-4]>>16)+(*(uint32_t *)&pbTarget[i+cbPattern-1-1-2-4]&0xFFFF) ) & ( (1<<16)-1 )] ) + ( bm_Horspool_Order2[( (*(uint32_t *)&pbTarget[i+cbPattern-1-1-2-8]>>16)+(*(uint32_t *)&pbTarget[i+cbPattern-1-1-2-8]&0xFFFF) ) & ( (1<<16)-1 )] ) < 2 ) Gulliver = cbPattern-(2-1)-2-8; else {
						if ( *(uint32_t *)&pbTarget[i] == ulHashPattern) {
							// Order 4 [
						// Let's try something "outrageous" like comparing with[out] overlap BBs 4bytes long instead of 1 byte back-to-back:
						// Inhere we are using order 4, 'cbPattern - Order + 1' is the number of BBs for text 'cbPattern' bytes long, for example, for cbPattern=11 'fastest fox' and Order=4 we have BBs = 11-4+1=8:
						//0:"fast" if the comparison failed here, 'count' is 1; 'Gulliver' is cbPattern-(4-1)-7
						//1:"aste" if the comparison failed here, 'count' is 2; 'Gulliver' is cbPattern-(4-1)-6
						//2:"stes" if the comparison failed here, 'count' is 3; 'Gulliver' is cbPattern-(4-1)-5
						//3:"test" if the comparison failed here, 'count' is 4; 'Gulliver' is cbPattern-(4-1)-4
						//4:"est " if the comparison failed here, 'count' is 5; 'Gulliver' is cbPattern-(4-1)-3
						//5:"st f" if the comparison failed here, 'count' is 6; 'Gulliver' is cbPattern-(4-1)-2
						//6:"t fo" if the comparison failed here, 'count' is 7; 'Gulliver' is cbPattern-(4-1)-1
						//7:" fox" if the comparison failed here, 'count' is 8; 'Gulliver' is cbPattern-(4-1)
							count = cbPattern-4+1; 
							// Below comparison is UNIdirectional:
							while ( count > 0 && *(uint32_t *)(pbPattern+count-1) == *(uint32_t *)(&pbTarget[i]+(count-1)) )
								count = count-4;

	if (cbPattern != PRIMALlengthCANDIDATE) { // No need of same comparison when Needle and NewNeedle are equal!
// count = cbPattern-4+1 = 23-4+1 = 20
// boomshakalakaZZZZZZ[ZZZZ] 20
// boomshakalakaZZ[ZZZZ]ZZZZ 20-4
// boomshakala[kaZZ]ZZZZZZZZ 20-8 = 12
// boomsha[kala]kaZZZZZZZZZZ 20-12 = 8
// boo[msha]kalakaZZZZZZZZZZ 20-16 = 4

// If we miss to hit then no need to compare the original: Needle
if ( count <= 0 ) {
// I have to add out-of-range checks...
// i-(PRIMALposition-1) >= 0
// &pbTarget[i-(PRIMALposition-1)] <= pbTargetMax - 4
// i-(PRIMALposition-1)+(count-1) >= 0
// &pbTarget[i-(PRIMALposition-1)+(count-1)] <= pbTargetMax - 4

// "FIX" from 2014-Apr-27:
// Because (count-1) is negative, above fours are reduced to next twos:
// i-(PRIMALposition-1)+(count-1) >= 0
// &pbTarget[i-(PRIMALposition-1)] <= pbTargetMax - 4
	// The line below is BUGGY:
	//if ( (i-(PRIMALposition-1) >= 0) && (&pbTarget[i-(PRIMALposition-1)] <= pbTargetMax - 4) && (&pbTarget[i-(PRIMALposition-1)+(count-1)] <= pbTargetMax - 4) ) {
	// The line below is NOT OKAY, in fact so stupid, grrr, not a blunder, not carelessness, but overconfidence in writing "on the fly":
	//if ( ((signed int)(i-(PRIMALposition-1)+(count-1)) >= 0) && (&pbTarget[i-(PRIMALposition-1)] <= pbTargetMax - 4) ) {
// FIX from 2016-Aug-10 (two times failed to do simple boundary checks, pfu):
	if ( ((signed int)(i-(PRIMALposition-1)) >= 0) && (&pbTarget[i-(PRIMALposition-1)]+((PRIMALlengthCANDIDATE-4+1)-1) <= pbTargetMax - 4) ) {
		if ( *(uint32_t *)&pbTarget[i-(PRIMALposition-1)] == *(uint32_t *)(pbPattern-(PRIMALposition-1))) { // This fast check ensures not missing a match (for remainder) when going under 0 in loop below:
			count = PRIMALlengthCANDIDATE-4+1; 
			while ( count > 0 && *(uint32_t *)(pbPattern-(PRIMALposition-1)+count-1) == *(uint32_t *)(&pbTarget[i-(PRIMALposition-1)]+(count-1)) )
				count = count-4;
			if ( count <= 0 ) return(pbTarget+i-(PRIMALposition-1));	
		}
	}
}
	} else { //if (cbPattern != PRIMALlengthCANDIDATE)
							if ( count <= 0 ) return(pbTarget+i);
	}

							// In order to avoid only-left or only-right WCS the memcmp should be done as left-to-right and right-to-left AT THE SAME TIME.
							// Below comparison is BIdirectional. It pays off when needle is 8+++ long:
//							for (count = cbPattern-4+1; count > 0; count = count-4) {
//								if ( *(uint32_t *)(pbPattern+count-1) != *(uint32_t *)(&pbTarget[i]+(count-1)) ) {break;};
//								if ( *(uint32_t *)(pbPattern+(cbPattern-4+1)-count) != *(uint32_t *)(&pbTarget[i]+(cbPattern-4+1)-count) ) {count = (cbPattern-4+1)-count +(1); break;} // +(1) because two lookups are implemented as one, also no danger of 'count' being 0 because of the fast check outwith the 'while': if ( *(uint32_t *)&pbTarget[i] == ulHashPattern)
//							}
//							if ( count <= 0 ) return(pbTarget+i);
								// Checking the order 2 pairs in mismatched DWORD, all the 3:
								//if ( bm_Horspool_Order2[*(unsigned short *)&pbTarget[i+count-1]] == 0 ) Gulliver = count; // 1 or bigger, as it should
								//if ( bm_Horspool_Order2[*(unsigned short *)&pbTarget[i+count-1+1]] == 0 ) Gulliver = count+1; // 1 or bigger, as it should
								//if ( bm_Horspool_Order2[*(unsigned short *)&pbTarget[i+count-1+1+1]] == 0 ) Gulliver = count+1+1; // 1 or bigger, as it should
							//	if ( bm_Horspool_Order2[*(unsigned short *)&pbTarget[i+count-1]] + bm_Horspool_Order2[*(unsigned short *)&pbTarget[i+count-1+1]] + bm_Horspool_Order2[*(unsigned short *)&pbTarget[i+count-1+1+1]] < 3 ) Gulliver = count; // 1 or bigger, as it should, THE MIN(count,count+1,count+1+1)
								// Above compound 'if' guarantees not that Gulliver > 1, an example:
								// Needle:    fastest tax
								// Window: ...fastast tax...
								// After matching ' tax' vs ' tax' and 'fast' vs 'fast' the mismathced DWORD is 'test' vs 'tast':
								// 'tast' when factorized down to order 2 yields: 'ta','as','st' - all the three when summed give 1+1+1=3 i.e. Gulliver remains 1.
								// Roughly speaking, this attempt maybe has its place in worst-case scenarios but not in English text and even not in ACGT data, that's why I commented it in original 'Shockeroo'.
								//if ( bm_Horspool_Order2[( (*(uint32_t *)&pbTarget[i+count-1]>>16)+(*(uint32_t *)&pbTarget[i+count-1]&0xFFFF) ) & ( (1<<16)-1 )] == 0 ) Gulliver = count; // 1 or bigger, as it should
								// Above line is replaced by next one with better hashing:
//								if ( bm_Horspool_Order2[( (*(uint32_t *)&pbTarget[i+count-1]>>(16-1))+(*(uint32_t *)&pbTarget[i+count-1]&0xFFFF) ) & ( (1<<16)-1 )] == 0 ) Gulliver = count; // 1 or bigger, as it should
							// Order 4 ]
						}
					}
				} else Gulliver = cbPattern-(2-1)-2; // -2 because we check the 4 rightmost bytes not 2.
				i = i + Gulliver;
				//GlobalI++; // Comment it, it is only for stats.
			}
			return(NULL);

		} // if ( cbPattern<=NeedleThreshold2vs4swampLITE )
		} // if ( cbPattern<=NeedleThreshold2vs4swampLITE )
	} //if ( cbPattern<4 )
}
/*
// For short needles, and mainly haystacks, 'Doublet' is quite effective. Consider it or 'Quadruplet'.
// Fixed version from 2012-Feb-27.
// Caution: For better speed the case 'if (cbPattern==1)' was removed, so Pattern must be longer than 1 char.
char * Railgun_Doublet (char * pbTarget, char * pbPattern, uint32_t cbTarget, uint32_t cbPattern)
{
	char * pbTargetMax = pbTarget + cbTarget;
	register uint32_t ulHashPattern;
	uint32_t ulHashTarget, count, countSTATIC;

	if (cbPattern > cbTarget) return(NULL);

	countSTATIC = cbPattern-2;

	pbTarget = pbTarget+cbPattern;
	ulHashPattern = (*(uint16_t *)(pbPattern));

	for ( ;; ) {
		if ( ulHashPattern == (*(uint16_t *)(pbTarget-cbPattern)) ) {
			count = countSTATIC;
			while ( count && *(char *)(pbPattern+2+(countSTATIC-count)) == *(char *)(pbTarget-cbPattern+2+(countSTATIC-count)) ) {
				count--;
			}
			if ( count == 0 ) return((pbTarget-cbPattern));
		}
		pbTarget++;
		if (pbTarget > pbTargetMax) return(NULL);
	}
}
*/
/*
; mark_description "Intel(R) C++ Intel(R) 64 Compiler XE for applications running on Intel(R) 64, Version 15.0.0.108 Build 20140";
; mark_description "-O3 -QxSSE2 -D_N_XMM -D_N_prefetch_4096 -D_N_Branchfull -D_N_HIGH_PRIORITY -FA";

_TEXT	SEGMENT      'CODE'
;	COMDAT Railgun_Trolldom
; mark_begin;
       ALIGN     16
	PUBLIC Railgun_Trolldom
Railgun_Trolldom	PROC 
; parameter 1: rcx
; parameter 2: rdx
; parameter 3: r8d
; parameter 4: r9d
.B11.1::                        ; Preds .B11.0
        push      rbx                                           ;3712.1
        push      rsi                                           ;3712.1
        push      rdi                                           ;3712.1
        push      r12                                           ;3712.1
        push      r13                                           ;3712.1
        push      r14                                           ;3712.1
        push      r15                                           ;3712.1
        push      rbp                                           ;3712.1
        mov       eax, 65640                                    ;3712.1
        call      __chkstk                                      ;3712.1
        sub       rsp, 65640                                    ;3712.1
        mov       ebx, r8d                                      ;3712.1
        mov       r13d, ebx                                     ;3713.23
        mov       rdi, rcx                                      ;3712.1
        mov       esi, r9d                                      ;3712.1
        mov       r12, rdx                                      ;3712.1
        cmp       esi, ebx                                      ;3738.18
        lea       r11, QWORD PTR [r13+rdi]                      ;3713.23
        ja        .B11.9        ; Prob 28%                      ;3738.18
                                ; LOE rsi rdi r11 r12 r13 ebx r9d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.2::                        ; Preds .B11.1
        cmp       esi, 4                                        ;3740.17
        jae       .B11.18       ; Prob 50%                      ;3740.17
                                ; LOE rsi rdi r11 r12 r13 ebx r9d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.3::                        ; Preds .B11.2
        movsx     edx, BYTE PTR [r12]                           ;3744.23
        lea       ebp, DWORD PTR [-1+rsi]                       ;3744.74
        shl       edx, 8                                        ;3744.45
        lea       rbx, QWORD PTR [rdi+rsi]                      ;3743.21
        lea       rax, QWORD PTR [-2+rsi+rdi]                   ;
        lea       rcx, QWORD PTR [-3+rsi+rdi]                   ;
        movsx     edi, BYTE PTR [r12+rbp]                       ;3744.53
        add       edx, edi                                      ;3744.53
        mov       r8d, edx                                      ;3750.32
        shr       r8d, 8                                        ;3750.32
        movsx     rbp, r8b                                      ;3750.32
        cmp       esi, 3                                        ;3745.19
        je        .B11.11       ; Prob 50%                      ;3745.19
                                ; LOE rax rcx rbx r11 r12 edx ebp xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.5::                        ; Preds .B11.3 .B11.8
        movsx     ecx, BYTE PTR [rax]                           ;3760.48
        shl       ecx, 8                                        ;3760.53
        movsx     esi, BYTE PTR [-1+rbx]                        ;3760.70
        add       ecx, esi                                      ;3760.70
        cmp       edx, ecx                                      ;3760.70
        je        .B11.41       ; Prob 20%                      ;3760.70
                                ; LOE rax rbx r11 edx ebp esi xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.6::                        ; Preds .B11.5
        cmp       ebp, esi                                      ;3761.48
        je        .B11.8        ; Prob 50%                      ;3761.48
                                ; LOE rax rbx r11 edx ebp xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.7::                        ; Preds .B11.6
        inc       rax                                           ;3761.53
        inc       rbx                                           ;3761.53
                                ; LOE rax rbx r11 edx ebp xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.8::                        ; Preds .B11.7 .B11.6
        inc       rbx                                           ;3762.4
        inc       rax                                           ;3762.4
        cmp       rbx, r11                                      ;3763.19
        jbe       .B11.5        ; Prob 80%                      ;3763.19
                                ; LOE rax rbx r11 edx ebp xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.9::                        ; Preds .B11.1 .B11.8
        xor       eax, eax                                      ;3763.38
        add       rsp, 65640                                    ;3763.38
        pop       rbp                                           ;3763.38
        pop       r15                                           ;3763.38
        pop       r14                                           ;3763.38
        pop       r13                                           ;3763.38
        pop       r12                                           ;3763.38
        pop       rdi                                           ;3763.38
        pop       rsi                                           ;3763.38
        pop       rbx                                           ;3763.38
        ret                                                     ;3763.38
                                ; LOE
.B11.11::                       ; Preds .B11.3 .B11.16
        movsx     edi, BYTE PTR [rcx]                           ;3747.49
        shl       edi, 8                                        ;3747.54
        movsx     esi, BYTE PTR [-1+rbx]                        ;3747.71
        add       edi, esi                                      ;3747.71
        movsx     r8d, BYTE PTR [-2+rbx]                        ;3748.56
        cmp       edx, edi                                      ;3747.71
        jne       .B11.13       ; Prob 50%                      ;3747.71
                                ; LOE rcx rbx r11 r12 edx ebp r8d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.12::                       ; Preds .B11.11
        cmp       r8b, BYTE PTR [1+r12]                         ;3748.56
        je        .B11.185      ; Prob 20%                      ;3748.56
                                ; LOE rcx rbx r11 r12 edx ebp r8d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.13::                       ; Preds .B11.11 .B11.12
        cmp       ebp, r8d                                      ;3750.49
        je        .B11.16       ; Prob 50%                      ;3750.49
                                ; LOE rcx rbx r11 r12 edx ebp xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.14::                       ; Preds .B11.13
        inc       rbx                                           ;3751.6
        inc       rcx                                           ;3751.6
        cmp       bpl, BYTE PTR [-2+rbx]                        ;3752.50
        je        .B11.16       ; Prob 50%                      ;3752.50
                                ; LOE rcx rbx r11 r12 edx ebp xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.15::                       ; Preds .B11.14
        inc       rcx                                           ;3752.55
        inc       rbx                                           ;3752.55
                                ; LOE rcx rbx r11 r12 edx ebp xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.16::                       ; Preds .B11.15 .B11.14 .B11.13
        inc       rbx                                           ;3754.5
        inc       rcx                                           ;3754.5
        cmp       rbx, r11                                      ;3755.20
        jbe       .B11.11       ; Prob 80%                      ;3755.20
                                ; LOE rcx rbx r11 r12 edx ebp xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.17::                       ; Preds .B11.16
        xor       eax, eax                                      ;3755.39
        add       rsp, 65640                                    ;3755.39
        pop       rbp                                           ;3755.39
        pop       r15                                           ;3755.39
        pop       r14                                           ;3755.39
        pop       r13                                           ;3755.39
        pop       r12                                           ;3755.39
        pop       rdi                                           ;3755.39
        pop       rsi                                           ;3755.39
        pop       rbx                                           ;3755.39
        ret                                                     ;3755.39
                                ; LOE
.B11.18::                       ; Preds .B11.2
        cmp       esi, 19                                       ;3766.19
        ja        .B11.82       ; Prob 50%                      ;3766.19
                                ; LOE rsi rdi r11 r12 r13 ebx r9d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.19::                       ; Preds .B11.18
        cmp       ebx, 777                                      ;3774.14
        jb        .B11.67       ; Prob 50%                      ;3774.14
                                ; LOE rsi rdi r11 r12 ebx xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.20::                       ; Preds .B11.19
        mov       ebp, DWORD PTR [r12]                          ;3825.33
        cmp       ebx, 77777                                    ;3819.21
        jae       .B11.45       ; Prob 50%                      ;3819.21
                                ; LOE rsi rdi r12 ebx ebp xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.21::                       ; Preds .B11.20
        xor       edx, edx                                      ;3827.38
        lea       rcx, QWORD PTR [32+rsp]                       ;3827.38
        mov       r8d, 8192                                     ;3827.38
        call      _intel_fast_memset                            ;3827.38
                                ; LOE rsi rdi r12 ebx ebp xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.22::                       ; Preds .B11.21
        mov       r10d, esi                                     ;3829.30
        dec       r10d                                          ;3829.30
        je        .B11.31       ; Prob 50%                      ;3829.30
                                ; LOE rsi rdi r12 ebx ebp r10d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.23::                       ; Preds .B11.22
        mov       r9d, r10d                                     ;3829.4
        xor       r8d, r8d                                      ;3829.4
        shr       r9d, 4                                        ;3829.4
        mov       eax, 1                                        ;3829.4
        xor       edx, edx                                      ;
        test      r9d, r9d                                      ;3829.4
        jbe       .B11.27       ; Prob 15%                      ;3829.4
                                ; LOE rdx rsi rdi r12 eax ebx ebp r8d r9d r10d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.25::                       ; Preds .B11.23 .B11.25
        mov       r11d, 1                                       ;3829.211
        mov       r15d, 1                                       ;3829.211
        lea       r13d, DWORD PTR [1+rdx]                       ;3829.197
        inc       r8d                                           ;3829.4
        movzx     ecx, WORD PTR [rdx+r12]                       ;3829.197
        mov       eax, ecx                                      ;3829.166
        and       ecx, 7                                        ;3829.211
        shl       r11d, cl                                      ;3829.211
        movzx     ecx, WORD PTR [r13+r12]                       ;3829.151
        mov       r14d, ecx                                     ;3829.166
        and       ecx, 7                                        ;3829.211
        lea       r13d, DWORD PTR [3+rdx]                       ;3829.197
        shl       r15d, cl                                      ;3829.211
        shr       eax, 3                                        ;3829.166
        lea       ecx, DWORD PTR [2+rdx]                        ;3829.197
        shr       r14d, 3                                       ;3829.166
        movzx     ecx, WORD PTR [rcx+r12]                       ;3829.151
        or        BYTE PTR [32+rsp+rax], r11b                   ;3829.211
        mov       eax, ecx                                      ;3829.166
        shr       eax, 3                                        ;3829.166
        and       ecx, 7                                        ;3829.211
        mov       r11d, 1                                       ;3829.211
        shl       r11d, cl                                      ;3829.211
        or        BYTE PTR [32+rsp+r14], r15b                   ;3829.211
        lea       r14d, DWORD PTR [4+rdx]                       ;3829.197
        movzx     ecx, WORD PTR [r13+r12]                       ;3829.151
        or        BYTE PTR [32+rsp+rax], r11b                   ;3829.211
        mov       eax, ecx                                      ;3829.166
        shr       eax, 3                                        ;3829.166
        and       ecx, 7                                        ;3829.211
        mov       r11d, 1                                       ;3829.211
        shl       r11d, cl                                      ;3829.211
        or        BYTE PTR [32+rsp+rax], r11b                   ;3829.211
        lea       r11d, DWORD PTR [5+rdx]                       ;3829.197
        mov       eax, 1                                        ;3829.211
        movzx     ecx, WORD PTR [r14+r12]                       ;3829.151
        mov       r15d, ecx                                     ;3829.166
        and       ecx, 7                                        ;3829.211
        mov       r14d, 1                                       ;3829.211
        shl       eax, cl                                       ;3829.211
        movzx     ecx, WORD PTR [r11+r12]                       ;3829.151
        mov       r13d, ecx                                     ;3829.166
        and       ecx, 7                                        ;3829.211
        mov       r11d, 1                                       ;3829.211
        shl       r14d, cl                                      ;3829.211
        shr       r15d, 3                                       ;3829.166
        lea       ecx, DWORD PTR [6+rdx]                        ;3829.197
        shr       r13d, 3                                       ;3829.166
        movzx     ecx, WORD PTR [rcx+r12]                       ;3829.151
        or        BYTE PTR [32+rsp+r15], al                     ;3829.211
        mov       eax, ecx                                      ;3829.166
        shr       eax, 3                                        ;3829.166
        lea       r15d, DWORD PTR [7+rdx]                       ;3829.197
        and       ecx, 7                                        ;3829.211
        shl       r11d, cl                                      ;3829.211
        or        BYTE PTR [32+rsp+r13], r14b                   ;3829.211
        lea       r13d, DWORD PTR [8+rdx]                       ;3829.197
        movzx     ecx, WORD PTR [r15+r12]                       ;3829.151
        mov       r15d, 1                                       ;3829.211
        or        BYTE PTR [32+rsp+rax], r11b                   ;3829.211
        mov       eax, ecx                                      ;3829.166
        shr       eax, 3                                        ;3829.166
        and       ecx, 7                                        ;3829.211
        mov       r11d, 1                                       ;3829.211
        shl       r11d, cl                                      ;3829.211
        or        BYTE PTR [32+rsp+rax], r11b                   ;3829.211
        lea       r11d, DWORD PTR [9+rdx]                       ;3829.197
        mov       eax, 1                                        ;3829.211
        movzx     ecx, WORD PTR [r13+r12]                       ;3829.151
        mov       r14d, ecx                                     ;3829.166
        and       ecx, 7                                        ;3829.211
        shl       eax, cl                                       ;3829.211
        movzx     ecx, WORD PTR [r11+r12]                       ;3829.151
        mov       r13d, ecx                                     ;3829.166
        and       ecx, 7                                        ;3829.211
        mov       r11d, 1                                       ;3829.211
        shl       r15d, cl                                      ;3829.211
        shr       r14d, 3                                       ;3829.166
        lea       ecx, DWORD PTR [10+rdx]                       ;3829.197
        shr       r13d, 3                                       ;3829.166
        movzx     ecx, WORD PTR [rcx+r12]                       ;3829.151
        or        BYTE PTR [32+rsp+r14], al                     ;3829.211
        mov       eax, ecx                                      ;3829.166
        shr       eax, 3                                        ;3829.166
        lea       r14d, DWORD PTR [11+rdx]                      ;3829.197
        and       ecx, 7                                        ;3829.211
        shl       r11d, cl                                      ;3829.211
        or        BYTE PTR [32+rsp+r13], r15b                   ;3829.211
        lea       r13d, DWORD PTR [12+rdx]                      ;3829.197
        movzx     ecx, WORD PTR [r14+r12]                       ;3829.151
        mov       r14d, 1                                       ;3829.211
        or        BYTE PTR [32+rsp+rax], r11b                   ;3829.211
        mov       eax, ecx                                      ;3829.166
        shr       eax, 3                                        ;3829.166
        and       ecx, 7                                        ;3829.211
        mov       r11d, 1                                       ;3829.211
        shl       r11d, cl                                      ;3829.211
        or        BYTE PTR [32+rsp+rax], r11b                   ;3829.211
        lea       r11d, DWORD PTR [13+rdx]                      ;3829.197
        mov       eax, 1                                        ;3829.211
        movzx     ecx, WORD PTR [r13+r12]                       ;3829.151
        mov       r15d, ecx                                     ;3829.166
        and       ecx, 7                                        ;3829.211
        shl       eax, cl                                       ;3829.211
        movzx     ecx, WORD PTR [r11+r12]                       ;3829.151
        mov       r13d, ecx                                     ;3829.166
        and       ecx, 7                                        ;3829.211
        mov       r11d, 1                                       ;3829.211
        shl       r14d, cl                                      ;3829.211
        shr       r15d, 3                                       ;3829.166
        lea       ecx, DWORD PTR [14+rdx]                       ;3829.197
        shr       r13d, 3                                       ;3829.166
        movzx     ecx, WORD PTR [rcx+r12]                       ;3829.151
        or        BYTE PTR [32+rsp+r15], al                     ;3829.211
        mov       eax, ecx                                      ;3829.166
        shr       eax, 3                                        ;3829.166
        lea       r15d, DWORD PTR [15+rdx]                      ;3829.197
        and       ecx, 7                                        ;3829.211
        add       edx, 16                                       ;3829.4
        shl       r11d, cl                                      ;3829.211
        or        BYTE PTR [32+rsp+r13], r14b                   ;3829.211
        movzx     ecx, WORD PTR [r15+r12]                       ;3829.151
        DB        144                                           ;3829.211
        or        BYTE PTR [32+rsp+rax], r11b                   ;3829.211
        mov       eax, ecx                                      ;3829.166
        shr       eax, 3                                        ;3829.166
        and       ecx, 7                                        ;3829.211
        mov       r11d, 1                                       ;3829.211
        shl       r11d, cl                                      ;3829.211
        or        BYTE PTR [32+rsp+rax], r11b                   ;3829.211
        cmp       r8d, r9d                                      ;3829.4
        jb        .B11.25       ; Prob 99%                      ;3829.4
                                ; LOE rdx rsi rdi r12 ebx ebp r8d r9d r10d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.26::                       ; Preds .B11.25
        shl       r8d, 4                                        ;3829.38
        lea       eax, DWORD PTR [1+r8]                         ;3829.4
                                ; LOE rsi rdi r12 eax ebx ebp r10d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.27::                       ; Preds .B11.26 .B11.23
        dec       eax                                           ;3829.38
        mov       edx, eax                                      ;3829.4
        cmp       eax, r10d                                     ;3829.4
        jae       .B11.31       ; Prob 15%                      ;3829.4
                                ; LOE rdx rsi rdi r12 eax ebx ebp r10d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.29::                       ; Preds .B11.27 .B11.29
        movzx     ecx, WORD PTR [r12+rdx]                       ;3829.151
        mov       edx, ecx                                      ;3829.166
        shr       edx, 3                                        ;3829.166
        and       ecx, 7                                        ;3829.211
        mov       r8d, 1                                        ;3829.211
        shl       r8d, cl                                       ;3829.211
        inc       eax                                           ;3829.4
        or        BYTE PTR [32+rsp+rdx], r8b                    ;3829.211
        mov       edx, eax                                      ;3829.4
        cmp       eax, r10d                                     ;3829.4
        jb        .B11.29       ; Prob 93%                      ;3829.4
                                ; LOE rdx rsi rdi r12 eax ebx ebp r10d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.31::                       ; Preds .B11.22 .B11.29 .B11.27
        xor       edx, edx                                      ;3830.4
        lea       r8d, DWORD PTR [-3+rsi]                       ;3836.192
        movsxd    r9, r8d                                       ;3838.8
        lea       r10d, DWORD PTR [-1+rsi]                      ;3844.33
        sub       ebx, esi                                      ;3831.16
                                ; LOE rsi rdi r9 r12 edx ebx ebp r8d r10d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.32::                       ; Preds .B11.31 .B11.43
        mov       r14d, 1                                       ;3834.145
        lea       eax, DWORD PTR [-2+rsi+rdx]                   ;3834.141
        movzx     ecx, WORD PTR [rax+rdi]                       ;3834.59
        mov       r11d, ecx                                     ;3834.87
        shr       r11d, 3                                       ;3834.87
        and       ecx, 7                                        ;3834.145
        shl       r14d, cl                                      ;3834.145
        movzx     r13d, BYTE PTR [32+rsp+r11]                   ;3834.12
        test      r13d, r14d                                    ;3834.145
        je        .B11.42       ; Prob 50%                      ;3834.156
                                ; LOE rsi rdi r9 r12 edx ebx ebp r8d r10d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.33::                       ; Preds .B11.32
        mov       r14d, 1                                       ;3836.150
        lea       eax, DWORD PTR [-4+rsi+rdx]                   ;3836.146
        movzx     ecx, WORD PTR [rax+rdi]                       ;3836.60
        mov       r11d, ecx                                     ;3836.90
        shr       r11d, 3                                       ;3836.90
        and       ecx, 7                                        ;3836.150
        shl       r14d, cl                                      ;3836.150
        movzx     r13d, BYTE PTR [32+rsp+r11]                   ;3836.13
        test      r13d, r14d                                    ;3836.150
        jne       .B11.35       ; Prob 50%                      ;3836.161
                                ; LOE rsi rdi r9 r12 edx ebx ebp r8d r10d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.34::                       ; Preds .B11.33
        mov       ecx, r8d                                      ;3836.165
        jmp       .B11.43       ; Prob 100%                     ;3836.165
                                ; LOE rsi rdi r9 r12 edx ecx ebx ebp r8d r10d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.35::                       ; Preds .B11.33
        mov       eax, edx                                      ;3837.26
        mov       ecx, 1                                        ;3832.5
        add       rax, rdi                                      ;3837.26
        cmp       ebp, DWORD PTR [rax]                          ;3837.41
        jne       .B11.43       ; Prob 50%                      ;3837.41
                                ; LOE rax rsi rdi r9 r12 edx ecx ebx ebp r8d r10d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.36::                       ; Preds .B11.35
        mov       r11, r9                                       ;3838.8
        test      r9, r9                                        ;3839.24
        jle       .B11.41       ; Prob 2%                       ;3839.24
                                ; LOE rax rsi rdi r9 r11 r12 edx ecx ebx ebp r8d r10d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.38::                       ; Preds .B11.36 .B11.39
        mov       r13d, DWORD PTR [-1+r11+r12]                  ;3839.59
        cmp       r13d, DWORD PTR [-1+r11+rax]                  ;3839.80
        jne       .B11.43       ; Prob 20%                      ;3839.80
                                ; LOE rax rsi rdi r9 r11 r12 edx ecx ebx ebp r8d r10d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.39::                       ; Preds .B11.38
        add       r11, -4                                       ;3840.23
        test      r11, r11                                      ;3839.24
        jg        .B11.38       ; Prob 82%                      ;3839.24
                                ; LOE rax rsi rdi r9 r11 r12 edx ecx ebx ebp r8d r10d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.41::                       ; Preds .B11.5 .B11.36 .B11.39
        add       rsp, 65640                                    ;3841.33
        pop       rbp                                           ;3841.33
        pop       r15                                           ;3841.33
        pop       r14                                           ;3841.33
        pop       r13                                           ;3841.33
        pop       r12                                           ;3841.33
        pop       rdi                                           ;3841.33
        pop       rsi                                           ;3841.33
        pop       rbx                                           ;3841.33
        ret                                                     ;3841.33
                                ; LOE
.B11.42::                       ; Preds .B11.32
        mov       ecx, r10d                                     ;3844.12
                                ; LOE rsi rdi r9 r12 edx ecx ebx ebp r8d r10d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.43::                       ; Preds .B11.38 .B11.34 .B11.35 .B11.42
        add       edx, ecx                                      ;3845.13
        cmp       edx, ebx                                      ;3831.25
        jbe       .B11.32       ; Prob 82%                      ;3831.25
                                ; LOE rsi rdi r9 r12 edx ebx ebp r8d r10d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.44::                       ; Preds .B11.43
        xor       eax, eax                                      ;3848.10
        add       rsp, 65640                                    ;3848.10
        pop       rbp                                           ;3848.10
        pop       r15                                           ;3848.10
        pop       r14                                           ;3848.10
        pop       r13                                           ;3848.10
        pop       r12                                           ;3848.10
        pop       rdi                                           ;3848.10
        pop       rsi                                           ;3848.10
        pop       rbx                                           ;3848.10
        ret                                                     ;3848.10
                                ; LOE
.B11.45::                       ; Preds .B11.20
        xor       edx, edx                                      ;3853.33
        lea       rcx, QWORD PTR [32+rsp]                       ;3853.33
        mov       r8d, 65536                                    ;3853.33
        call      _intel_fast_memset                            ;3853.33
                                ; LOE rsi rdi r12 ebx ebp xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.46::                       ; Preds .B11.45
        mov       r9d, esi                                      ;3854.28
        dec       r9d                                           ;3854.28
        je        .B11.53       ; Prob 50%                      ;3854.28
                                ; LOE rsi rdi r12 ebx ebp r9d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.47::                       ; Preds .B11.46
        mov       edx, r9d                                      ;3854.4
        mov       ecx, 1                                        ;3854.4
        shr       edx, 1                                        ;3854.4
        xor       eax, eax                                      ;3854.4
        test      edx, edx                                      ;3854.4
        jbe       .B11.51       ; Prob 15%                      ;3854.4
                                ; LOE rsi rdi r12 eax edx ecx ebx ebp r9d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.48::                       ; Preds .B11.47
        mov       cl, 1                                         ;3854.36
                                ; LOE rsi rdi r12 eax edx ebx ebp r9d cl xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.49::                       ; Preds .B11.49 .B11.48
        lea       r8d, DWORD PTR [rax+rax]                      ;3854.75
        lea       r11d, DWORD PTR [1+rax+rax]                   ;3854.75
        inc       eax                                           ;3854.4
        cmp       eax, edx                                      ;3854.4
        movzx     r10d, WORD PTR [r8+r12]                       ;3854.75
        movzx     r13d, WORD PTR [r11+r12]                      ;3854.75
        mov       BYTE PTR [32+rsp+r10], cl                     ;3854.36
        mov       BYTE PTR [32+rsp+r13], cl                     ;3854.36
        jb        .B11.49       ; Prob 64%                      ;3854.4
                                ; LOE rsi rdi r12 eax edx ebx ebp r9d cl xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.50::                       ; Preds .B11.49
        lea       ecx, DWORD PTR [1+rax+rax]                    ;3854.4
                                ; LOE rsi rdi r12 ecx ebx ebp r9d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.51::                       ; Preds .B11.50 .B11.47
        dec       ecx                                           ;3854.36
        cmp       ecx, r9d                                      ;3854.4
        jae       .B11.53       ; Prob 15%                      ;3854.4
                                ; LOE rcx rsi rdi r12 ebx ebp r9d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.52::                       ; Preds .B11.51
        movzx     eax, WORD PTR [rcx+r12]                       ;3854.75
        mov       BYTE PTR [32+rsp+rax], 1                      ;3854.36
                                ; LOE rsi rdi r12 ebx ebp r9d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.53::                       ; Preds .B11.46 .B11.51 .B11.52
        xor       edx, edx                                      ;3855.4
        lea       ecx, DWORD PTR [-3+rsi]                       ;3859.113
        movsxd    r8, ecx                                       ;3861.8
        sub       ebx, esi                                      ;3856.16
                                ; LOE rsi rdi r8 r12 edx ecx ebx ebp r9d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.54::                       ; Preds .B11.53 .B11.65
        lea       eax, DWORD PTR [-2+rsi+rdx]                   ;3858.72
        movzx     r10d, WORD PTR [rax+rdi]                      ;3858.49
        cmp       BYTE PTR [32+rsp+r10], 0                      ;3858.79
        je        .B11.64       ; Prob 50%                      ;3858.79
                                ; LOE rsi rdi r8 r12 edx ecx ebx ebp r9d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.55::                       ; Preds .B11.54
        lea       eax, DWORD PTR [-4+rsi+rdx]                   ;3859.75
        movzx     r10d, WORD PTR [rax+rdi]                      ;3859.50
        cmp       BYTE PTR [32+rsp+r10], 0                      ;3859.82
        jne       .B11.57       ; Prob 50%                      ;3859.82
                                ; LOE rsi rdi r8 r12 edx ecx ebx ebp r9d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.56::                       ; Preds .B11.55
        mov       r10d, ecx                                     ;3859.86
        jmp       .B11.65       ; Prob 100%                     ;3859.86
                                ; LOE rsi rdi r8 r12 edx ecx ebx ebp r9d r10d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.57::                       ; Preds .B11.55
        mov       eax, edx                                      ;3860.26
        mov       r10d, 1                                       ;3857.5
        add       rax, rdi                                      ;3860.26
        cmp       ebp, DWORD PTR [rax]                          ;3860.41
        jne       .B11.65       ; Prob 50%                      ;3860.41
                                ; LOE rax rsi rdi r8 r12 edx ecx ebx ebp r9d r10d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.58::                       ; Preds .B11.57
        mov       r11, r8                                       ;3861.8
        test      r8, r8                                        ;3862.24
        jle       .B11.63       ; Prob 2%                       ;3862.24
                                ; LOE rax rsi rdi r8 r11 r12 edx ecx ebx ebp r9d r10d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.60::                       ; Preds .B11.58 .B11.61
        mov       r13d, DWORD PTR [-1+r11+r12]                  ;3862.59
        cmp       r13d, DWORD PTR [-1+r11+rax]                  ;3862.80
        jne       .B11.65       ; Prob 20%                      ;3862.80
                                ; LOE rax rsi rdi r8 r11 r12 edx ecx ebx ebp r9d r10d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.61::                       ; Preds .B11.60
        add       r11, -4                                       ;3863.23
        test      r11, r11                                      ;3862.24
        jg        .B11.60       ; Prob 82%                      ;3862.24
                                ; LOE rax rsi rdi r8 r11 r12 edx ecx ebx ebp r9d r10d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.63::                       ; Preds .B11.58 .B11.61
        add       rsp, 65640                                    ;3864.33
        pop       rbp                                           ;3864.33
        pop       r15                                           ;3864.33
        pop       r14                                           ;3864.33
        pop       r13                                           ;3864.33
        pop       r12                                           ;3864.33
        pop       rdi                                           ;3864.33
        pop       rsi                                           ;3864.33
        pop       rbx                                           ;3864.33
        ret                                                     ;3864.33
                                ; LOE
.B11.64::                       ; Preds .B11.54
        mov       r10d, r9d                                     ;3867.12
                                ; LOE rsi rdi r8 r12 edx ecx ebx ebp r9d r10d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.65::                       ; Preds .B11.60 .B11.56 .B11.57 .B11.64
        add       edx, r10d                                     ;3868.13
        cmp       edx, ebx                                      ;3856.25
        jbe       .B11.54       ; Prob 82%                      ;3856.25
                                ; LOE rsi rdi r8 r12 edx ecx ebx ebp r9d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.66::                       ; Preds .B11.65
        xor       eax, eax                                      ;3871.10
        add       rsp, 65640                                    ;3871.10
        pop       rbp                                           ;3871.10
        pop       r15                                           ;3871.10
        pop       r14                                           ;3871.10
        pop       r13                                           ;3871.10
        pop       r12                                           ;3871.10
        pop       rdi                                           ;3871.10
        pop       rsi                                           ;3871.10
        pop       rbx                                           ;3871.10
        ret                                                     ;3871.10
                                ; LOE
.B11.67::                       ; Preds .B11.19
        mov       ebx, DWORD PTR [r12]                          ;3777.43
        lea       ecx, DWORD PTR [-1+rsi]                       ;3797.28
        movzx     ebp, bl                                       ;3781.5
        mov       edx, esi                                      ;3776.20
        mov       r8d, ebp                                      ;3782.30
        mov       r9d, ebp                                      ;3783.30
        mov       r10d, ebp                                     ;3784.30
        shl       r8d, 8                                        ;3782.30
        add       rdi, rdx                                      ;3776.20
        shl       r9d, 16                                       ;3783.30
        shl       r10d, 24                                      ;3784.30
        mov       QWORD PTR [65608+rsp], r12                    ;3797.28
                                ; LOE rdx rsi rdi r11 ecx ebx ebp r8d r9d r10d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.68::                       ; Preds .B11.80 .B11.67
        mov       rax, rdi                                      ;3789.36
        xor       r12d, r12d                                    ;3788.2
        sub       rax, rdx                                      ;3789.36
        mov       r13d, DWORD PTR [rax]                         ;3789.45
        cmp       ebx, r13d                                     ;3791.31
        jne       .B11.77       ; Prob 50%                      ;3791.31
                                ; LOE rax rdx rsi rdi r11 ecx ebx ebp r8d r9d r10d r12d r13d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.69::                       ; Preds .B11.68
        mov       r14d, ecx                                     ;
        mov       r13d, ecx                                     ;3797.10
        movsxd    r15, ecx                                      ;
        neg       r14d                                          ;
        neg       r15                                           ;
        add       r14d, esi                                     ;
        test      ecx, ecx                                      ;3798.18
        je        .B11.76       ; Prob 10%                      ;3798.18
                                ; LOE rax rdx rsi rdi r11 r14 r15 ecx ebx ebp r8d r9d r10d r12d r13d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.70::                       ; Preds .B11.69
        mov       DWORD PTR [65624+rsp], esi                    ;
        mov       QWORD PTR [40+rsp], rdx                       ;
        mov       QWORD PTR [32+rsp], r11                       ;
        mov       rsi, QWORD PTR [65608+rsp]                    ;
                                ; LOE rax rsi rdi r14 r15 ecx ebx ebp r8d r9d r10d r12d r13d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.71::                       ; Preds .B11.74 .B11.70
        movsx     edx, BYTE PTR [r15+rdi]                       ;3798.88
        cmp       dl, BYTE PTR [r14+rsi]                        ;3798.88
        jne       .B11.169      ; Prob 20%                      ;3798.88
                                ; LOE rax rsi rdi r15 edx ecx ebx ebp r8d r9d r10d r12d r13d r14d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.72::                       ; Preds .B11.71
        lea       r11d, DWORD PTR [r12+r13]                     ;3799.46
        cmp       ecx, r11d                                     ;3799.46
        jne       .B11.74       ; Prob 50%                      ;3799.46
                                ; LOE rax rsi rdi r15 edx ecx ebx ebp r8d r9d r10d r12d r13d r14d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.73::                       ; Preds .B11.72
        cmp       ebp, edx                                      ;3799.94
        lea       r11d, DWORD PTR [1+r12]                       ;3799.94
        cmovne    r12d, r11d                                    ;3799.94
                                ; LOE rax rsi rdi r15 ecx ebx ebp r8d r9d r10d r12d r13d r14d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.74::                       ; Preds .B11.73 .B11.72
        inc       r14d                                          ;3800.16
        inc       r15                                           ;3800.16
        dec       r13d                                          ;3800.16
        jne       .B11.71       ; Prob 82%                      ;3798.18
                                ; LOE rax rsi rdi r14 r15 ecx ebx ebp r8d r9d r10d r12d r13d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.76::                       ; Preds .B11.69 .B11.74
        add       rsp, 65640                                    ;3802.44
        pop       rbp                                           ;3802.44
        pop       r15                                           ;3802.44
        pop       r14                                           ;3802.44
        pop       r13                                           ;3802.44
        pop       r12                                           ;3802.44
        pop       rdi                                           ;3802.44
        pop       rsi                                           ;3802.44
        pop       rbx                                           ;3802.44
        ret                                                     ;3802.44
                                ; LOE
.B11.77::                       ; Preds .B11.68
        mov       eax, r13d                                     ;3804.43
        and       eax, 65280                                    ;3804.43
        cmp       r8d, eax                                      ;3804.43
        je        .B11.80       ; Prob 50%                      ;3804.43
                                ; LOE rdx rsi rdi r11 ecx ebx ebp r8d r9d r10d r12d r13d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.78::                       ; Preds .B11.77
        mov       eax, r13d                                     ;3806.48
        mov       r12d, 1                                       ;3805.10
        and       eax, 16711680                                 ;3806.48
        cmp       r9d, eax                                      ;3806.48
        je        .B11.80       ; Prob 50%                      ;3806.48
                                ; LOE rdx rsi rdi r11 ecx ebx ebp r8d r9d r10d r12d r13d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.79::                       ; Preds .B11.78
        and       r13d, -16777216                               ;3808.53
        mov       eax, 3                                        ;3808.67
        mov       r12d, 2                                       ;3808.67
        cmp       r10d, r13d                                    ;3808.67
        cmovne    r12d, eax                                     ;3808.67
                                ; LOE rdx rsi rdi r11 ecx ebx ebp r8d r9d r10d r12d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.80::                       ; Preds .B11.169 .B11.79 .B11.78 .B11.77
        inc       r12d                                          ;3813.2
        add       rdi, r12                                      ;3815.13
        cmp       rdi, r11                                      ;3816.24
        jbe       .B11.68       ; Prob 80%                      ;3816.24
                                ; LOE rdx rsi rdi r11 ecx ebx ebp r8d r9d r10d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.81::                       ; Preds .B11.80
        xor       eax, eax                                      ;3817.19
        add       rsp, 65640                                    ;3817.19
        pop       rbp                                           ;3817.19
        pop       r15                                           ;3817.19
        pop       r14                                           ;3817.19
        pop       r13                                           ;3817.19
        pop       r12                                           ;3817.19
        pop       rdi                                           ;3817.19
        pop       rsi                                           ;3817.19
        pop       rbx                                           ;3817.19
        ret                                                     ;3817.19
                                ; LOE
.B11.82::                       ; Preds .B11.18
        xor       ebp, ebp                                      ;4360.1
        lea       ecx, DWORD PTR [-3+rsi]                       ;4361.29
        mov       edx, 1                                        ;4361.6
        mov       r8d, -1                                       ;
        mov       r10d, esi                                     ;
        cmp       ecx, 1                                        ;4361.41
        jbe       .B11.184      ; Prob 10%                      ;4361.41
                                ; LOE rsi rdi r12 r13 edx ecx ebx ebp r8d r9d r10d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.83::                       ; Preds .B11.82
        mov       DWORD PTR [32+rsp], ebx                       ;4364.54
        lea       eax, DWORD PTR [-2+rsi]                       ;4362.42
        mov       QWORD PTR [40+rsp], rdi                       ;4364.54
        lea       r11d, DWORD PTR [-3+rsi]                      ;4364.54
        mov       QWORD PTR [48+rsp], r13                       ;4364.54
                                ; LOE rsi r12 eax edx ecx ebp r8d r9d r10d r11d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.84::                       ; Preds .B11.96 .B11.83
        mov       r14d, edx                                     ;4363.2
        mov       ebx, eax                                      ;4362.2
        cmp       edx, r11d                                     ;4364.54
        ja        .B11.92       ; Prob 10%                      ;4364.54
                                ; LOE rsi r12 r14 eax edx ecx ebx ebp r8d r9d r10d r11d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.85::                       ; Preds .B11.84
        mov       DWORD PTR [65624+rsp], esi                    ;4365.3
        lea       edi, DWORD PTR [-3+rsi]                       ;4366.33
        mov       r13d, edx                                     ;4365.3
                                ; LOE r12 r14 eax edx ecx ebx ebp edi r8d r9d r10d r11d r13d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.86::                       ; Preds .B11.90 .B11.85
        inc       r13d                                          ;4365.33
        mov       r15d, r13d                                    ;4365.3
        cmp       r13d, edi                                     ;4366.33
        ja        .B11.90       ; Prob 10%                      ;4366.33
                                ; LOE r12 r14 r15 eax edx ecx ebx ebp edi r8d r9d r10d r11d r13d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.87::                       ; Preds .B11.86
        mov       esi, DWORD PTR [-1+r14+r12]                   ;4367.57
                                ; LOE r12 r15 eax edx ecx ebx ebp esi edi r8d r9d r10d r11d r13d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.88::                       ; Preds .B11.88 .B11.87
        lea       r14d, DWORD PTR [-1+r15]                      ;4366.33
        cmp       esi, DWORD PTR [-1+r15+r12]                   ;4367.98
        jne       L26           ; Prob 50%                      ;4366.33
        mov       edi, r14d                                     ;4366.33
L26:                                                            ;
        jne       L27           ; Prob 50%                      ;4367.98
        mov       ebx, r15d                                     ;4367.98
L27:                                                            ;
        inc       r15d                                          ;4368.4
        cmp       r15d, edi                                     ;4366.33
        jbe       .B11.88       ; Prob 82%                      ;4366.33
                                ; LOE r12 r15 eax edx ecx ebx ebp esi edi r8d r9d r10d r11d r13d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.90::                       ; Preds .B11.88 .B11.86
        mov       r14d, r13d                                    ;4370.3
        cmp       r13d, edi                                     ;4364.54
        jbe       .B11.86       ; Prob 82%                      ;4364.54
                                ; LOE r12 r14 eax edx ecx ebx ebp edi r8d r9d r10d r11d r13d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.91::                       ; Preds .B11.90
        mov       esi, DWORD PTR [65624+rsp]                    ;
                                ; LOE r12 eax edx ecx ebx ebp esi r8d r9d r10d r11d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.92::                       ; Preds .B11.91 .B11.84
        lea       ebx, DWORD PTR [3+r8+rbx]                     ;4372.2
        cmp       ebx, ebp                                      ;4373.31
        jb        .B11.95       ; Prob 50%                      ;4373.31
                                ; LOE rsi r12 eax edx ecx ebx ebp r8d r9d r10d r11d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.93::                       ; Preds .B11.92
        mov       r9d, edx                                      ;4373.46
        mov       ebp, ebx                                      ;4373.64
        cmp       ebx, r10d                                     ;4374.23
        jae       .B11.97       ; Prob 20%                      ;4374.23
                                ; LOE rsi r12 eax edx ecx ebx ebp r8d r9d r10d r11d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.94::                       ; Preds .B11.93
        cmp       ebx, 128                                      ;4375.21
        ja        .B11.97       ; Prob 20%                      ;4375.21
        jmp       .B11.96       ; Prob 100%                     ;4375.21
                                ; LOE rsi r12 eax edx ecx ebp r8d r9d r10d r11d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.95::                       ; Preds .B11.92
        cmp       ebp, r10d                                     ;4374.23
        jae       .B11.97       ; Prob 20%                      ;4374.23
                                ; LOE rsi r12 eax edx ecx ebp r8d r9d r10d r11d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.96::                       ; Preds .B11.95 .B11.94
        inc       edx                                           ;4361.46
        dec       r10d                                          ;4361.46
        dec       r8d                                           ;4361.46
        cmp       edx, ecx                                      ;4361.41
        jb        .B11.84       ; Prob 82%                      ;4361.41
                                ; LOE rsi r12 eax edx ecx ebp r8d r9d r10d r11d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.97::                       ; Preds .B11.93 .B11.95 .B11.94 .B11.96
        mov       ebx, DWORD PTR [32+rsp]                       ;
        mov       rdi, QWORD PTR [40+rsp]                       ;
        mov       r13, QWORD PTR [48+rsp]                       ;
                                ; LOE rbx rsi rdi r12 r13 ebx ebp edi r9d r13d bl bh dil r13b xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.98::                       ; Preds .B11.97
        cmp       ebp, 19                                       ;4605.19
        lea       r14d, DWORD PTR [-1+r9]                       ;4500.41
        lea       r15, QWORD PTR [r12+r14]                      ;4500.13
        mov       r10d, DWORD PTR [r15]                         ;4608.33
        ja        .B11.131      ; Prob 50%                      ;4605.19
                                ; LOE rbx rsi rdi r12 r13 r14 r15 ebx ebp edi r9d r10d r13d bl bh dil r13b xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.99::                       ; Preds .B11.184 .B11.98
        xor       edx, edx                                      ;4609.33
        lea       rcx, QWORD PTR [32+rsp]                       ;4609.33
        mov       r8d, 65536                                    ;4609.33
        mov       DWORD PTR [65568+rsp], r10d                   ;4609.33
        mov       DWORD PTR [65616+rsp], r9d                    ;4609.33
        call      _intel_fast_memset                            ;4609.33
                                ; LOE rsi rdi r13 r14 r15 ebx ebp xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.100::                      ; Preds .B11.99
        mov       r11d, ebp                                     ;4616.28
        mov       r9d, DWORD PTR [65616+rsp]                    ;
        dec       r11d                                          ;4616.28
        mov       r10d, DWORD PTR [65568+rsp]                   ;
        je        .B11.107      ; Prob 50%                      ;4616.28
                                ; LOE rsi rdi r9 r10 r13 r14 r15 ebx ebp r9d r10d r11d r9b r10b xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.101::                      ; Preds .B11.100
        mov       eax, 1                                        ;4616.4
        lea       ecx, DWORD PTR [-1+rbp]                       ;4616.4
        mov       r8d, ecx                                      ;4616.4
        xor       edx, edx                                      ;4616.4
        shr       r8d, 1                                        ;4616.4
        test      r8d, r8d                                      ;4616.4
        jbe       .B11.105      ; Prob 15%                      ;4616.4
                                ; LOE rsi rdi r9 r10 r13 r14 r15 eax edx ecx ebx ebp r8d r9d r10d r11d r9b r10b xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.102::                      ; Preds .B11.101
        mov       al, 1                                         ;3854.36
                                ; LOE rsi rdi r13 r14 r15 edx ecx ebx ebp r8d r9d r10d r11d al xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.103::                      ; Preds .B11.103 .B11.102
        lea       r12d, DWORD PTR [rdx+rdx]                     ;4616.75
        movzx     r12d, WORD PTR [r12+r15]                      ;4616.75
        mov       BYTE PTR [32+rsp+r12], al                     ;4616.36
        lea       r12d, DWORD PTR [1+rdx+rdx]                   ;4616.75
        inc       edx                                           ;4616.4
        cmp       edx, r8d                                      ;4616.4
        movzx     r12d, WORD PTR [r12+r15]                      ;4616.75
        mov       BYTE PTR [32+rsp+r12], al                     ;4616.36
        jb        .B11.103      ; Prob 64%                      ;4616.4
                                ; LOE rsi rdi r13 r14 r15 edx ecx ebx ebp r8d r9d r10d r11d al xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.104::                      ; Preds .B11.103
        lea       eax, DWORD PTR [1+rdx+rdx]                    ;4616.4
                                ; LOE rsi rdi r13 r14 r15 eax ecx ebx ebp r9d r10d r11d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.105::                      ; Preds .B11.104 .B11.101
        dec       eax                                           ;4616.36
        cmp       eax, ecx                                      ;4616.4
        jae       .B11.107      ; Prob 15%                      ;4616.4
                                ; LOE rax rsi rdi r13 r14 r15 ebx ebp r9d r10d r11d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.106::                      ; Preds .B11.105
        movzx     edx, WORD PTR [rax+r15]                       ;4616.75
        mov       BYTE PTR [32+rsp+rdx], 1                      ;4616.36
                                ; LOE rsi rdi r13 r14 r15 ebx ebp r9d r10d r11d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.107::                      ; Preds .B11.100 .B11.105 .B11.106
        mov       r8, r15                                       ;4646.70
        lea       eax, DWORD PTR [-4+rsi]                       ;4645.109
        lea       ecx, DWORD PTR [-3+rbp]                       ;4621.113
        sub       r8, r14                                       ;4646.70
        add       rax, rdi                                      ;4645.54
        movsxd    rcx, ecx                                      ;4623.8
        lea       r12d, DWORD PTR [-3+rsi]                      ;4647.36
        mov       QWORD PTR [65576+rsp], rcx                    ;4623.8
        xor       edx, edx                                      ;4617.4
        movsxd    r12, r12d                                     ;4647.4
        sub       ebx, ebp                                      ;4618.16
        mov       QWORD PTR [65584+rsp], rax                    ;4647.4
        lea       r13, QWORD PTR [-4+r13+rdi]                   ;4645.134
        mov       QWORD PTR [65608+rsp], r8                     ;4647.4
        mov       QWORD PTR [65592+rsp], r15                    ;4647.4
        mov       QWORD PTR [65600+rsp], r14                    ;4647.4
                                ; LOE rsi rdi r12 r13 edx ecx ebx ebp r9d r10d r11d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.108::                      ; Preds .B11.107 .B11.129
        lea       eax, DWORD PTR [-2+rbp+rdx]                   ;4620.72
        movzx     r8d, WORD PTR [rax+rdi]                       ;4620.49
        cmp       BYTE PTR [32+rsp+r8], 0                       ;4620.79
        je        .B11.128      ; Prob 50%                      ;4620.79
                                ; LOE rsi rdi r12 r13 edx ecx ebx ebp r9d r10d r11d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.109::                      ; Preds .B11.108
        lea       eax, DWORD PTR [-4+rbp+rdx]                   ;4621.75
        movzx     r8d, WORD PTR [rax+rdi]                       ;4621.50
        cmp       BYTE PTR [32+rsp+r8], 0                       ;4621.82
        jne       .B11.111      ; Prob 50%                      ;4621.82
                                ; LOE rsi rdi r12 r13 edx ecx ebx ebp r9d r10d r11d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.110::                      ; Preds .B11.109
        mov       r14d, ecx                                     ;4621.86
        jmp       .B11.129      ; Prob 100%                     ;4621.86
                                ; LOE rsi rdi r12 r13 edx ecx ebx ebp r9d r10d r11d r14d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.111::                      ; Preds .B11.109
        mov       eax, edx                                      ;4622.26
        mov       r14d, 1                                       ;4619.5
        lea       r8, QWORD PTR [rdi+rax]                       ;4622.26
        cmp       r10d, DWORD PTR [r8]                          ;4622.41
        jne       .B11.129      ; Prob 50%                      ;4622.41
                                ; LOE rax rsi rdi r8 r12 r13 edx ecx ebx ebp r9d r10d r11d r14d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.112::                      ; Preds .B11.111
        mov       r15, QWORD PTR [65576+rsp]                    ;4623.8
        test      r15, r15                                      ;4624.24
        jle       .B11.176      ; Prob 2%                       ;4624.24
                                ; LOE rax rsi rdi r8 r12 r13 r15 edx ecx ebx ebp r9d r10d r11d r14d r15d r15b xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.113::                      ; Preds .B11.112
        mov       DWORD PTR [65616+rsp], r9d                    ;
        mov       DWORD PTR [65624+rsp], esi                    ;
        mov       r9, r15                                       ;
        mov       r15, QWORD PTR [65592+rsp]                    ;
                                ; LOE rax rdi r8 r9 r12 r13 r15 edx ecx ebx ebp r10d r11d r14d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.114::                      ; Preds .B11.115 .B11.113
        mov       esi, DWORD PTR [-1+r9+r15]                    ;4624.59
        cmp       esi, DWORD PTR [-1+r9+r8]                     ;4624.80
        jne       .B11.175      ; Prob 20%                      ;4624.80
                                ; LOE rax rdi r8 r9 r12 r13 r15 edx ecx ebx ebp r10d r11d r14d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.115::                      ; Preds .B11.114
        add       r9, -4                                        ;4625.23
        test      r9, r9                                        ;4624.24
        jg        .B11.114      ; Prob 82%                      ;4624.24
                                ; LOE rax rdi r8 r9 r12 r13 r15 edx ecx ebx ebp r10d r11d r14d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.116::                      ; Preds .B11.115
        mov       esi, DWORD PTR [65624+rsp]                    ;
        cmp       ebp, esi                                      ;4627.19
        mov       r9d, DWORD PTR [65616+rsp]                    ;
        mov       QWORD PTR [65592+rsp], r15                    ;
        je        .B11.127      ; Prob 50%                      ;4627.19
                                ; LOE rax rdi r8 r12 r13 edx ecx ebx ebp esi r9d r10d r11d r14d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.117::                      ; Preds .B11.176 .B11.116
        mov       r8d, edx                                      ;4645.21
        sub       r8d, r9d                                      ;4645.21
        inc       r8d                                           ;4645.21
        js        .B11.129      ; Prob 16%                      ;4645.46
                                ; LOE rax rsi rdi r8 r12 r13 edx ecx ebx ebp r9d r10d r11d r14d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.118::                      ; Preds .B11.117
        mov       r15, QWORD PTR [65584+rsp]                    ;4645.54
        mov       QWORD PTR [65568+rsp], r8                     ;4645.54
        add       r8, r15                                       ;4645.54
        cmp       r13, r8                                       ;4645.134
        jb        .B11.129      ; Prob 50%                      ;4645.134
                                ; LOE rax rsi rdi r12 r13 edx ecx ebx ebp r9d r10d r11d r14d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.119::                      ; Preds .B11.118
        mov       r8, QWORD PTR [65568+rsp]                     ;4646.22
        add       r8, rdi                                       ;4646.22
        mov       QWORD PTR [65568+rsp], r8                     ;4646.22
        mov       r15d, DWORD PTR [r8]                          ;4646.22
        mov       r8, QWORD PTR [65608+rsp]                     ;4646.96
        cmp       r15d, DWORD PTR [r8]                          ;4646.96
        jne       .B11.129      ; Prob 50%                      ;4646.96
                                ; LOE rax rsi rdi r12 r13 edx ecx ebx ebp r9d r10d r11d r14d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.120::                      ; Preds .B11.119
        mov       r8, r12                                       ;4647.4
        test      r12, r12                                      ;4648.20
        jle       .B11.124      ; Prob 2%                       ;4648.20
                                ; LOE rax rsi rdi r8 r12 r13 edx ecx ebx ebp r9d r10d r11d r14d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.121::                      ; Preds .B11.120
        mov       DWORD PTR [65616+rsp], r9d                    ;
        mov       DWORD PTR [65624+rsp], esi                    ;
        mov       r9, QWORD PTR [65568+rsp]                     ;
        mov       r15, QWORD PTR [65608+rsp]                    ;
                                ; LOE rax rdi r8 r9 r12 r13 r15 edx ecx ebx ebp r10d r11d r14d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.122::                      ; Preds .B11.123 .B11.121
        mov       esi, DWORD PTR [-1+r8+r15]                    ;4648.74
        cmp       esi, DWORD PTR [-1+r8+r9]                     ;4648.95
        jne       .B11.173      ; Prob 20%                      ;4648.95
                                ; LOE rax rdi r8 r9 r12 r13 r15 edx ecx ebx ebp r10d r11d r14d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.123::                      ; Preds .B11.122
        add       r8, -4                                        ;4649.19
        test      r8, r8                                        ;4648.20
        jg        .B11.122      ; Prob 82%                      ;4648.20
                                ; LOE rax rdi r8 r9 r12 r13 r15 edx ecx ebx ebp r10d r11d r14d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.124::                      ; Preds .B11.120 .B11.123
        mov       r14, QWORD PTR [65600+rsp]                    ;
                                ; LOE rax rdi r14 r14d r14b xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.125::                      ; Preds .B11.124
        sub       rdi, r14                                      ;4650.29
        add       rax, rdi                                      ;4650.29
        add       rsp, 65640                                    ;4650.56
        pop       rbp                                           ;4650.56
        pop       r15                                           ;4650.56
        pop       r14                                           ;4650.56
        pop       r13                                           ;4650.56
        pop       r12                                           ;4650.56
        pop       rdi                                           ;4650.56
        pop       rsi                                           ;4650.56
        pop       rbx                                           ;4650.56
        ret                                                     ;4650.56
                                ; LOE
.B11.127::                      ; Preds .B11.176 .B11.116
        mov       rax, r8                                       ;4655.33
        add       rsp, 65640                                    ;4655.33
        pop       rbp                                           ;4655.33
        pop       r15                                           ;4655.33
        pop       r14                                           ;4655.33
        pop       r13                                           ;4655.33
        pop       r12                                           ;4655.33
        pop       rdi                                           ;4655.33
        pop       rsi                                           ;4655.33
        pop       rbx                                           ;4655.33
        ret                                                     ;4655.33
                                ; LOE
.B11.128::                      ; Preds .B11.108
        mov       r14d, r11d                                    ;4659.12
                                ; LOE rsi rdi r12 r13 edx ecx ebx ebp r9d r10d r11d r14d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.129::                      ; Preds .B11.175 .B11.173 .B11.110 .B11.119 .B11.118
                                ;       .B11.117 .B11.111 .B11.128
        add       edx, r14d                                     ;4660.13
        cmp       edx, ebx                                      ;4618.25
        jbe       .B11.108      ; Prob 82%                      ;4618.25
                                ; LOE rsi rdi r12 r13 edx ecx ebx ebp r9d r10d r11d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.130::                      ; Preds .B11.129
        xor       eax, eax                                      ;4663.10
        add       rsp, 65640                                    ;4663.10
        pop       rbp                                           ;4663.10
        pop       r15                                           ;4663.10
        pop       r14                                           ;4663.10
        pop       r13                                           ;4663.10
        pop       r12                                           ;4663.10
        pop       rdi                                           ;4663.10
        pop       rsi                                           ;4663.10
        pop       rbx                                           ;4663.10
        ret                                                     ;4663.10
                                ; LOE
.B11.131::                      ; Preds .B11.98
        xor       edx, edx                                      ;4669.33
        lea       rcx, QWORD PTR [32+rsp]                       ;4669.33
        mov       r8d, 65536                                    ;4669.33
        mov       DWORD PTR [65568+rsp], r10d                   ;4669.33
        mov       DWORD PTR [65616+rsp], r9d                    ;4669.33
        call      _intel_fast_memset                            ;4669.33
                                ; LOE rbx rsi rdi r12 r13 r14 r15 ebx ebp edi r13d bl bh dil r13b xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.132::                      ; Preds .B11.131
        mov       ecx, ebp                                      ;4682.30
        mov       r9d, DWORD PTR [65616+rsp]                    ;
        add       ecx, -3                                       ;4682.30
        mov       r10d, DWORD PTR [65568+rsp]                   ;
        je        .B11.139      ; Prob 50%                      ;4682.30
                                ; LOE rbx rsi rdi r9 r10 r12 r13 r14 r15 ecx ebx ebp edi r9d r10d r13d bl bh dil r9b r10b r13b xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.133::                      ; Preds .B11.132
        mov       r8d, ecx                                      ;4682.4
        mov       eax, 1                                        ;4682.4
        shr       r8d, 1                                        ;4682.4
        xor       edx, edx                                      ;4682.4
        test      r8d, r8d                                      ;4682.4
        jbe       .B11.137      ; Prob 15%                      ;4682.4
                                ; LOE rbx rsi rdi r9 r10 r12 r13 r14 r15 eax edx ecx ebx ebp edi r8d r9d r10d r13d bl bh dil r9b r10b r13b xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.134::                      ; Preds .B11.133
        mov       DWORD PTR [65624+rsp], esi                    ;3854.36
        mov       al, 1                                         ;3854.36
                                ; LOE rdi r12 r13 r14 r15 edx ecx ebx ebp r8d r9d r10d al xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.135::                      ; Preds .B11.135 .B11.134
        lea       esi, DWORD PTR [rdx+rdx]                      ;4682.74
        mov       r11d, DWORD PTR [rsi+r15]                     ;4682.113
        mov       esi, r11d                                     ;4682.90
        shr       esi, 15                                       ;4682.90
        add       esi, r11d                                     ;4682.128
        movzx     r11d, si                                      ;4682.140
        lea       esi, DWORD PTR [1+rdx+rdx]                    ;4682.113
        inc       edx                                           ;4682.4
        mov       BYTE PTR [32+rsp+r11], al                     ;4682.38
        mov       r11d, DWORD PTR [rsi+r15]                     ;4682.74
        mov       esi, r11d                                     ;4682.90
        shr       esi, 15                                       ;4682.90
        add       esi, r11d                                     ;4682.128
        cmp       edx, r8d                                      ;4682.4
        movzx     r11d, si                                      ;4682.140
        mov       BYTE PTR [32+rsp+r11], al                     ;4682.38
        jb        .B11.135      ; Prob 64%                      ;4682.4
                                ; LOE rdi r12 r13 r14 r15 edx ecx ebx ebp r8d r9d r10d al xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.136::                      ; Preds .B11.135
        mov       esi, DWORD PTR [65624+rsp]                    ;
        lea       eax, DWORD PTR [1+rdx+rdx]                    ;4682.4
                                ; LOE rdi r12 r13 r14 r15 eax ecx ebx ebp esi r9d r10d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.137::                      ; Preds .B11.136 .B11.133
        dec       eax                                           ;4682.38
        cmp       eax, ecx                                      ;4682.4
        jae       .B11.139      ; Prob 15%                      ;4682.4
                                ; LOE rax rsi rdi r12 r13 r14 r15 ecx ebx ebp r9d r10d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.138::                      ; Preds .B11.137
        mov       edx, DWORD PTR [rax+r15]                      ;4682.74
        mov       r8d, edx                                      ;4682.90
        shr       r8d, 15                                       ;4682.90
        add       r8d, edx                                      ;4682.128
        movzx     r11d, r8w                                     ;4682.140
        mov       BYTE PTR [32+rsp+r11], 1                      ;4682.38
                                ; LOE rsi rdi r12 r13 r14 r15 ecx ebx ebp r9d r10d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.139::                      ; Preds .B11.137 .B11.132 .B11.138
        movsxd    rcx, ecx                                      ;4754.8
        lea       r8d, DWORD PTR [-4+rsi]                       ;4784.109
        lea       rax, QWORD PTR [-4+r13+rdi]                   ;4784.134
        mov       QWORD PTR [65584+rsp], rcx                    ;4754.8
        lea       r13d, DWORD PTR [-3+rsi]                      ;4786.36
        movsxd    r13, r13d                                     ;4786.4
        xor       edx, edx                                      ;4683.4
        mov       QWORD PTR [65592+rsp], r15                    ;4706.42
        sub       ebx, ebp                                      ;4684.16
        mov       QWORD PTR [65600+rsp], r14                    ;4706.42
        add       r8, rdi                                       ;4784.54
        mov       QWORD PTR [65608+rsp], r12                    ;4706.42
        lea       r11d, DWORD PTR [-8+rbp]                      ;4706.42
                                ; LOE rax rdx rsi rdi r8 r13 ecx ebx ebp r9d r10d r11d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.140::                      ; Preds .B11.139 .B11.162
        lea       r12d, DWORD PTR [-4+rbp+rdx]                  ;4688.123
        mov       r14d, DWORD PTR [r12+rdi]                     ;4688.46
        mov       r15d, r14d                                    ;4688.75
        shr       r15d, 15                                      ;4688.75
        add       r15d, r14d                                    ;4688.126
        movzx     r12d, r15w                                    ;4688.138
        cmp       BYTE PTR [32+rsp+r12], 0                      ;4688.156
        je        .B11.161      ; Prob 50%                      ;4688.156
                                ; LOE rax rdx rsi rdi r8 r13 ecx ebx ebp r9d r10d r11d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.141::                      ; Preds .B11.140
        mov       r12d, 1                                       ;4685.5
        lea       r14d, DWORD PTR [-9+rbp+rdx]                  ;4704.131
        mov       r15d, DWORD PTR [r14+rdi]                     ;4704.44
        mov       r14d, r15d                                    ;4704.78
        shr       r14d, 15                                      ;4704.78
        add       r14d, r15d                                    ;4704.134
        movzx     r15d, r14w                                    ;4704.146
        cmp       BYTE PTR [32+rsp+r15], 0                      ;4704.166
        je        .B11.143      ; Prob 50%                      ;4704.166
                                ; LOE rax rdx rsi rdi r8 r13 ecx ebx ebp r9d r10d r11d r12d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.142::                      ; Preds .B11.141
        lea       r14d, DWORD PTR [-7+rbp+rdx]                  ;4705.134
        mov       r15d, DWORD PTR [r14+rdi]                     ;4705.47
        mov       r14d, r15d                                    ;4705.81
        shr       r14d, 15                                      ;4705.81
        add       r14d, r15d                                    ;4705.137
        movzx     r15d, r14w                                    ;4705.149
        cmp       BYTE PTR [32+rsp+r15], 0                      ;4705.169
        jne       .B11.144      ; Prob 50%                      ;4705.169
                                ; LOE rax rdx rsi rdi r8 r13 ecx ebx ebp r9d r10d r11d r12d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.143::                      ; Preds .B11.141 .B11.142
        mov       r12d, r11d                                    ;4706.8
        jmp       .B11.162      ; Prob 100%                     ;4706.8
                                ; LOE rax rdx rsi rdi r8 r13 ecx ebx ebp r9d r10d r11d r12d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.144::                      ; Preds .B11.142
        mov       QWORD PTR [65576+rsp], rdx                    ;4742.26
        lea       r15, QWORD PTR [rdi+rdx]                      ;4742.26
        cmp       r10d, DWORD PTR [r15]                         ;4742.41
        jne       .B11.162      ; Prob 50%                      ;4742.41
                                ; LOE rax rsi rdi r8 r13 r15 edx ecx ebx ebp r9d r10d r11d r12d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.145::                      ; Preds .B11.144
        mov       r14, QWORD PTR [65584+rsp]                    ;4754.8
        test      r14, r14                                      ;4756.24
        jle       .B11.181      ; Prob 2%                       ;4756.24
                                ; LOE rax rsi rdi r8 r13 r14 r15 edx ecx ebx ebp r9d r10d r11d r12d r14d r14b xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.146::                      ; Preds .B11.145
        mov       DWORD PTR [65616+rsp], r9d                    ;
        mov       DWORD PTR [65624+rsp], esi                    ;
        mov       r9, QWORD PTR [65592+rsp]                     ;
                                ; LOE rax rdi r8 r9 r13 r14 r15 edx ecx ebx ebp r10d r11d r12d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.147::                      ; Preds .B11.148 .B11.146
        mov       esi, DWORD PTR [-1+r14+r9]                    ;4756.59
        cmp       esi, DWORD PTR [-1+r14+r15]                   ;4756.80
        jne       .B11.180      ; Prob 20%                      ;4756.80
                                ; LOE rax rdi r8 r9 r13 r14 r15 edx ecx ebx ebp r10d r11d r12d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.148::                      ; Preds .B11.147
        add       r14, -4                                       ;4757.23
        test      r14, r14                                      ;4756.24
        jg        .B11.147      ; Prob 82%                      ;4756.24
                                ; LOE rax rdi r8 r9 r13 r14 r15 edx ecx ebx ebp r10d r11d r12d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.149::                      ; Preds .B11.148
        mov       esi, DWORD PTR [65624+rsp]                    ;
        cmp       ebp, esi                                      ;4759.19
        mov       QWORD PTR [65592+rsp], r9                     ;
        mov       r9d, DWORD PTR [65616+rsp]                    ;
        je        .B11.160      ; Prob 50%                      ;4759.19
                                ; LOE rax rdi r8 r13 r15 edx ecx ebx ebp esi r9d r10d r11d r12d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.150::                      ; Preds .B11.181 .B11.149
        mov       r14d, edx                                     ;4784.21
        sub       r14d, r9d                                     ;4784.21
        inc       r14d                                          ;4784.21
        js        .B11.162      ; Prob 16%                      ;4784.46
                                ; LOE rax rsi rdi r8 r13 r14 edx ecx ebx ebp r9d r10d r11d r12d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.151::                      ; Preds .B11.150
        mov       QWORD PTR [65568+rsp], r14                    ;4784.54
        lea       r15, QWORD PTR [r8+r14]                       ;4784.54
        cmp       rax, r15                                      ;4784.134
        jb        .B11.162      ; Prob 50%                      ;4784.134
                                ; LOE rax rsi rdi r8 r13 r14 edx ecx ebx ebp r9d r10d r11d r12d r14d r14b xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.152::                      ; Preds .B11.151
        add       r14, rdi                                      ;4785.22
        mov       QWORD PTR [65568+rsp], r14                    ;4785.22
        mov       r15d, DWORD PTR [r14]                         ;4785.22
        mov       r14, QWORD PTR [65608+rsp]                    ;4785.96
        cmp       r15d, DWORD PTR [r14]                         ;4785.96
        jne       .B11.162      ; Prob 50%                      ;4785.96
                                ; LOE rax rsi rdi r8 r13 edx ecx ebx ebp r9d r10d r11d r12d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.153::                      ; Preds .B11.152
        mov       r14, r13                                      ;4786.4
        test      r13, r13                                      ;4787.20
        jle       .B11.157      ; Prob 2%                       ;4787.20
                                ; LOE rax rsi rdi r8 r13 r14 edx ecx ebx ebp r9d r10d r11d r12d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.154::                      ; Preds .B11.153
        mov       DWORD PTR [65616+rsp], r9d                    ;
        mov       DWORD PTR [65624+rsp], esi                    ;
        mov       r9, QWORD PTR [65568+rsp]                     ;
        mov       r15, QWORD PTR [65608+rsp]                    ;
                                ; LOE rax rdi r8 r9 r13 r14 r15 edx ecx ebx ebp r10d r11d r12d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.155::                      ; Preds .B11.156 .B11.154
        mov       esi, DWORD PTR [-1+r14+r15]                   ;4787.74
        cmp       esi, DWORD PTR [-1+r14+r9]                    ;4787.95
        jne       .B11.178      ; Prob 20%                      ;4787.95
                                ; LOE rax rdi r8 r9 r13 r14 r15 edx ecx ebx ebp r10d r11d r12d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.156::                      ; Preds .B11.155
        add       r14, -4                                       ;4788.19
        test      r14, r14                                      ;4787.20
        jg        .B11.155      ; Prob 82%                      ;4787.20
                                ; LOE rax rdi r8 r9 r13 r14 r15 edx ecx ebx ebp r10d r11d r12d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.157::                      ; Preds .B11.153 .B11.156
        mov       rax, QWORD PTR [65576+rsp]                    ;
        mov       r14, QWORD PTR [65600+rsp]                    ;
                                ; LOE rax rdi r14 eax r14d al ah r14b xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.158::                      ; Preds .B11.157
        sub       rdi, r14                                      ;4789.29
        add       rax, rdi                                      ;4789.29
        add       rsp, 65640                                    ;4789.56
        pop       rbp                                           ;4789.56
        pop       r15                                           ;4789.56
        pop       r14                                           ;4789.56
        pop       r13                                           ;4789.56
        pop       r12                                           ;4789.56
        pop       rdi                                           ;4789.56
        pop       rsi                                           ;4789.56
        pop       rbx                                           ;4789.56
        ret                                                     ;4789.56
                                ; LOE
.B11.160::                      ; Preds .B11.181 .B11.149
        mov       rax, r15                                      ;4794.33
        add       rsp, 65640                                    ;4794.33
        pop       rbp                                           ;4794.33
        pop       r15                                           ;4794.33
        pop       r14                                           ;4794.33
        pop       r13                                           ;4794.33
        pop       r12                                           ;4794.33
        pop       rdi                                           ;4794.33
        pop       rsi                                           ;4794.33
        pop       rbx                                           ;4794.33
        ret                                                     ;4794.33
                                ; LOE
.B11.161::                      ; Preds .B11.140
        mov       r12d, ecx                                     ;4821.12
                                ; LOE rax rdx rsi rdi r8 r13 ecx ebx ebp r9d r10d r11d r12d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.162::                      ; Preds .B11.180 .B11.178 .B11.152 .B11.151 .B11.150
                                ;       .B11.144 .B11.143 .B11.161
        add       edx, r12d                                     ;4822.13
        cmp       edx, ebx                                      ;4684.25
        jbe       .B11.140      ; Prob 82%                      ;4684.25
                                ; LOE rax rdx rsi rdi r8 r13 ecx ebx ebp r9d r10d r11d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.163::                      ; Preds .B11.162
        xor       eax, eax                                      ;4825.10
        add       rsp, 65640                                    ;4825.10
        pop       rbp                                           ;4825.10
        pop       r15                                           ;4825.10
        pop       r14                                           ;4825.10
        pop       r13                                           ;4825.10
        pop       r12                                           ;4825.10
        pop       rdi                                           ;4825.10
        pop       rsi                                           ;4825.10
        pop       rbx                                           ;4825.10
        ret                                                     ;4825.10
                                ; LOE
.B11.169::                      ; Preds .B11.71                 ; Infreq
        mov       QWORD PTR [65608+rsp], rsi                    ;
        mov       rdx, QWORD PTR [40+rsp]                       ;
        mov       r11, QWORD PTR [32+rsp]                       ;
        mov       esi, DWORD PTR [65624+rsp]                    ;
        jmp       .B11.80       ; Prob 100%                     ;
                                ; LOE rdx rdi r11 ecx ebx ebp esi r8d r9d r10d r12d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.173::                      ; Preds .B11.122                ; Infreq
        mov       QWORD PTR [65608+rsp], r15                    ;
        mov       r9d, DWORD PTR [65616+rsp]                    ;
        mov       esi, DWORD PTR [65624+rsp]                    ;
        jmp       .B11.129      ; Prob 100%                     ;
                                ; LOE rdi r12 r13 edx ecx ebx ebp esi r9d r10d r11d r14d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.175::                      ; Preds .B11.114                ; Infreq
        mov       QWORD PTR [65592+rsp], r15                    ;
        mov       r9d, DWORD PTR [65616+rsp]                    ;
        mov       esi, DWORD PTR [65624+rsp]                    ;
        jmp       .B11.129      ; Prob 100%                     ;
                                ; LOE rdi r12 r13 edx ecx ebx ebp esi r9d r10d r11d r14d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.176::                      ; Preds .B11.112                ; Infreq
        cmp       ebp, esi                                      ;4627.19
        jne       .B11.117      ; Prob 50%                      ;4627.19
        jmp       .B11.127      ; Prob 100%                     ;4627.19
                                ; LOE rax rsi rdi r8 r12 r13 edx ecx ebx ebp r9d r10d r11d r14d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.178::                      ; Preds .B11.155                ; Infreq
        mov       QWORD PTR [65608+rsp], r15                    ;
        mov       r9d, DWORD PTR [65616+rsp]                    ;
        mov       esi, DWORD PTR [65624+rsp]                    ;
        jmp       .B11.162      ; Prob 100%                     ;
                                ; LOE rax rdi r8 r13 edx ecx ebx ebp esi r9d r10d r11d r12d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.180::                      ; Preds .B11.147                ; Infreq
        mov       QWORD PTR [65592+rsp], r9                     ;
        mov       r9d, DWORD PTR [65616+rsp]                    ;
        mov       esi, DWORD PTR [65624+rsp]                    ;
        jmp       .B11.162      ; Prob 100%                     ;
                                ; LOE rax rdi r8 r13 edx ecx ebx ebp esi r9d r10d r11d r12d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.181::                      ; Preds .B11.145                ; Infreq
        cmp       ebp, esi                                      ;4759.19
        jne       .B11.150      ; Prob 50%                      ;4759.19
        jmp       .B11.160      ; Prob 100%                     ;4759.19
                                ; LOE rax rsi rdi r8 r13 r15 edx ecx ebx ebp r9d r10d r11d r12d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.184::                      ; Preds .B11.82                 ; Infreq
        lea       r14d, DWORD PTR [-1+r9]                       ;4500.41
        lea       r15, QWORD PTR [r12+r14]                      ;4500.13
        mov       r10d, DWORD PTR [r15]                         ;4608.33
        jmp       .B11.99       ; Prob 100%                     ;4608.33
                                ; LOE rsi rdi r13 r14 r15 ebx ebp r9d r10d xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15
.B11.185::                      ; Preds .B11.12                 ; Infreq
        mov       rax, rcx                                      ;3748.78
        add       rsp, 65640                                    ;3748.78
        pop       rbp                                           ;3748.78
        pop       r15                                           ;3748.78
        pop       r14                                           ;3748.78
        pop       r13                                           ;3748.78
        pop       r12                                           ;3748.78
        pop       rdi                                           ;3748.78
        pop       rsi                                           ;3748.78
        pop       rbx                                           ;3748.78
        ret                                                     ;3748.78
        ALIGN     16
                                ; LOE
.B11.187::
; mark_end;
Railgun_Trolldom ENDP
;Railgun_Trolldom	ENDS
_TEXT	ENDS
*/

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Other
Bulgaria Bulgaria
A Bulgarian old boy interested in search techniques, nothing special.

Comments and Discussions