Files
RetroArch/samples/tasks/patch_stream/patch_stream_test.c
T
LibretroAdmin f140e9592a Soft-patching: apply a streamed IPS patch to the loaded ROM where it lies
A streamed IPS patch built its target as the source arrived: a second
buffer the size of the ROM, taken at open, every byte of the source
copied into it, then the records laid over it, and the source freed.
The target of an IPS patch is the source with the records on it, and
the source is the content buffer the load already owns.

patch_stream_finish_into() finishes a stream whose source the caller
owns (malloc'd, given to patch_stream_set_source()): an IPS patch puts
its records on that buffer in place, growing it with realloc() only
when the target is longer, and any other format hands back its target
in the buffer's place. On failure the buffer is still the unpatched
source, as before. Fed in place, IPS copies nothing while the source
arrives; a chunk fed from elsewhere copies what came before through to
the target and carries on as before. The target is no longer taken at
open but by the first copy-through, so the in-place path never takes
one. The content load finishes its patch with finish_into().

A 16 MiB ROM with a 2000-record IPS patch, first touch: 6.7 ms ->
0.05 ms to apply, and 16 MiB less heap during the load.

The patch_stream test finishes every in-place and fallback comparison
with finish_into() on a buffer of its own, and checks a 4 MiB IPS
source is patched where it lies without being moved or copied. Leaving
the grown tail unzeroed, skipping the records in place or in the
catch-up, copying nothing in the catch-up, or copying through while fed
in place each fail it.
2026-11-03 00:25:08 +01:00

1743 lines
93 KiB
C

/* Copyright (C) 2010-2026 The RetroArch team
*
* ---------------------------------------------------------------------------------------
* The following license statement only applies to this file (patch_stream_test.c).
* ---------------------------------------------------------------------------------------
*
* Permission is hereby granted, free of charge,
* to any person obtaining a copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software,
* and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
/* Differential harness for the streaming patch appliers.
*
* The streaming appliers in tasks/patch_stream.c must produce output
* byte-identical to the whole-buffer appliers in tasks/task_patch.c, for
* every patch format, at every chunk size. This harness holds a copy of
* the whole-buffer logic as the oracle, generates random valid patches,
* and compares the two across a range of chunk sizes - including 1-byte
* chunks, which maximise the number of suspend/resume cycles the
* streaming interpreters go through.
*
* The size distribution is deliberately edge-heavy. A streaming applier
* has failure modes the whole-buffer form cannot have, because the whole
* buffer form always has everything: an empty source (feed() never
* called), a source that ends short of its declared length, and chunk
* boundaries landing inside a patch command. Those cases are generated
* explicitly; the first of them caught a real bug during development.
*
* Note what is deliberately not asserted: that a damaged patch is
* refused. That holds for BPS, UPS and xdelta, which can detect
* damage, but not for IPS, which carries no checksum, no length and no
* framing beyond a terminator - a truncated IPS is a shorter valid IPS
* as far as the format is concerned, and both appliers apply its
* intact records. The contract enforced here is the one that holds
* for every format: whatever the whole-buffer applier does with a
* given patch, the streaming one does too.
*
* The .xdelta format is covered differently from the other three. Its
* decoder is verified against the reference implementation in
* samples/encodings/vcdiff; what is checked here is the delegation -
* that feeding a stream through this module's own API, in chunks,
* reaches that decoder and returns what decoding the whole buffer at
* once returns. A golden patch from the reference encoder stands in
* for the generator the other formats have, since there is no xdelta
* encoder in the tree.
*
* Build: make (SANITIZER=address,undefined for a checked run)
* Run: ./patch_stream_test
*/
#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "../../../tasks/patch_stream.h"
#define PATCH_SUCCESS 0
#define PATCH_FAIL 1
/* Verbatim extraction of ips_apply_patch/ups_apply_patch logic from
* tasks/task_patch.c, including the checksum validation.
*
* The validation is here deliberately. An earlier version of this
* oracle omitted it and compared output bytes alone, on the reasoning
* that byte-identical output was the streaming appliers' job. That
* left the appliers free to accept patches the whole-buffer form
* refuses, and both the UPS and the BPS applier did exactly that -
* applying a patch built for a different revision of the content and
* returning a plausible target instead of refusing. Comparing bytes
* cannot see that: on a patch whose checksums are correct, which is
* everything this file generates, both sides agree on the bytes while
* disagreeing on whether the patch should have been applied at all.
* So the oracle returns a verdict and the verdict is compared. */
#include <stdlib.h>
#include <string.h>
static uint32_t CT[256]; static int I=0;
static void ct(void){uint32_t i,j,c;if(I)return;for(i=0;i<256;i++){c=i;for(j=0;j<8;j++)c=(c&1)?0xEDB88320u^(c>>1):c>>1;CT[i]=c;}I=1;}
static uint32_t ocrc(const uint8_t*p,size_t n)
{ uint32_t c=~0u; ct(); while(n--) c=CT[(c^*p++)&0xFF]^(c>>8); return ~c; }
int oracle_ips(const uint8_t *pd, uint64_t pl, const uint8_t *sd, uint64_t sl, uint8_t **td, uint64_t *tl)
{
uint32_t off=5, tlen=(uint32_t)sl;
uint8_t *t;
/* pass 1: target length */
/* pass 1: determine the target length */
{
uint32_t o = 5;
for (;;)
{
uint32_t a, l;
if (o > pl - 3)
break;
a = (pd[o] << 16) | (pd[o + 1] << 8) | pd[o + 2];
o += 3;
if (a == 0x454f46) /* EOF */
{
if (o == pl)
break;
if (o == pl - 3)
{
tlen = (pd[o] << 16) | (pd[o + 1] << 8) | pd[o + 2];
o += 3;
break;
}
}
if (o > pl - 2)
break;
l = (pd[o] << 8) | pd[o + 1];
o += 2;
if (l)
{
if (o > pl - l)
break;
a += l;
o += l;
}
else
{
uint32_t r;
if (o > pl - 3)
break;
r = (pd[o] << 8) | pd[o + 1];
o += 2;
if (!r)
break;
a += r;
o++;
}
if (a > tlen)
tlen = a;
}
}
if (!(t = (uint8_t*)malloc(tlen ? tlen : 1)))
return PATCH_FAIL;
if (sl)
memcpy(t, sd, (size_t)sl);
if (tlen > sl)
memset(t + sl, 0, tlen - sl);
/* pass 2: apply the records */
for (;;)
{
uint32_t a, l;
if (off > pl - 3)
break;
a = (pd[off] << 16) | (pd[off + 1] << 8) | pd[off + 2];
off += 3;
if (a == 0x454f46) /* EOF */
{
if (off == pl || off == pl - 3)
{
*td = t;
*tl = tlen;
return PATCH_SUCCESS;
}
}
if (off > pl - 2)
break;
l = (pd[off] << 8) | pd[off + 1];
off += 2;
if (l)
{
if (off > pl - l)
break;
while (l--)
t[a++] = pd[off++];
}
else
{
uint32_t r;
if (off > pl - 3)
break;
r = (pd[off] << 8) | pd[off + 1];
off += 2;
if (!r)
break;
while (r--)
t[a++] = pd[off];
off++;
}
}
*td=t;*tl=tlen;return PATCH_SUCCESS;
}
/* UPS oracle */
struct u{const uint8_t*p;const uint8_t*s;uint8_t*t;unsigned pl,sl,tl;unsigned po,so,to;};
static uint8_t upr(struct u*d){ if(d->po<d->pl) return d->p[d->po++]; return 0; }
static uint8_t usr(struct u*d){ if(d->so<d->sl) return d->s[d->so++]; d->so++; return 0; }
static void utw(struct u*d,uint8_t n){ if(d->to<d->tl) d->t[d->to]=n; d->to++; }
static uint64_t udec(struct u*d){ uint64_t o=0,s=1; for(;;){ uint8_t x=upr(d); o+=(x&0x7f)*s; if(x&0x80)break; s<<=7; o+=s; } return o; }
int oracle_ups(const uint8_t *pd, uint64_t pl, const uint8_t *sd, uint64_t sl, uint8_t **td, uint64_t *tl)
{
struct u d; unsigned srl, trl; uint8_t *t;
ct(); (void)ct;
d.p=pd; d.s=sd; d.pl=(unsigned)pl; d.sl=(unsigned)sl;
d.po=0; d.so=0; d.to=0;
if(pl<18||memcmp(pd,"UPS1",4))return PATCH_FAIL;
d.po=4;
srl=(unsigned)udec(&d); trl=(unsigned)udec(&d);
t=(uint8_t*)calloc(1,trl?trl:1); if(!t)return PATCH_FAIL;
d.t=t; d.tl=trl;
while(d.po < d.pl-12){ unsigned n=(unsigned)udec(&d);
while(n--) utw(&d,usr(&d));
for(;;){ uint8_t px=upr(&d); utw(&d, px^usr(&d)); if(px==0)break; } }
while(d.so<srl) utw(&d,usr(&d));
while(d.to<trl) utw(&d,usr(&d));
/* trailer: source, target and patch checksums, four bytes each */
{ uint32_t want_s=0,want_t=0,want_p=0,have_s,have_t,have_p; int k;
if(pl<12){ free(t); return PATCH_FAIL; }
for(k=0;k<4;k++){
want_s|=(uint32_t)pd[pl-12+k]<<(k*8);
want_t|=(uint32_t)pd[pl- 8+k]<<(k*8);
want_p|=(uint32_t)pd[pl- 4+k]<<(k*8); }
have_p=ocrc(pd,(size_t)(pl-4));
have_s=ocrc(sd,(size_t)sl);
have_t=ocrc(t,(size_t)trl);
if(have_p!=want_p){ free(t); return PATCH_FAIL; }
if(have_s==want_s && srl==(unsigned)sl)
{ if(have_t!=want_t || trl!=(unsigned)trl){ free(t); return PATCH_FAIL; } }
else if(have_s==want_t && trl==(unsigned)sl)
{ if(have_t!=want_s){ free(t); return PATCH_FAIL; } }
else { free(t); return PATCH_FAIL; } }
*td=t;*tl=trl;return PATCH_SUCCESS;
}
/* BPS oracle: verbatim structure from bps_apply_patch. */
struct b{const uint8_t*m;const uint8_t*s;uint8_t*t;uint64_t ml,sl,tl;uint64_t mo,so,to,oo;};
static uint8_t br(struct b*d){ if(d->mo<d->ml) return d->m[d->mo++]; return 0; }
static uint64_t bd(struct b*d){uint64_t v=0,sh=1;for(;;){uint8_t x=br(d);v+=(x&0x7f)*sh;if(x&0x80)break;sh<<=7;v+=sh;}return v;}
int oracle_bps(const uint8_t *md,uint64_t ml,const uint8_t *sd,uint64_t sl,uint8_t **td,uint64_t *tl)
{
struct b d; uint64_t ss,ts,ms,i; uint8_t *t;
if(ml<19||memcmp(md,"BPS1",4))return PATCH_FAIL;
d.m=md;d.s=sd;d.ml=ml;d.sl=sl;d.mo=4;d.so=0;d.to=0;d.oo=0;
ss=bd(&d); ts=bd(&d); ms=bd(&d);
if(ms>ml-d.mo)return PATCH_FAIL;
for(i=0;i<ms;i++)br(&d);
if(ss>sl)return PATCH_FAIL;
t=(uint8_t*)calloc(1,ts?(size_t)ts:1); if(!t)return PATCH_FAIL;
d.t=t; d.tl=ts;
while(d.mo < d.ml-12){
uint64_t len=bd(&d); unsigned mode=len&3; len=(len>>2)+1;
if(d.oo>=d.tl||len>d.tl-d.oo){free(t);return PATCH_FAIL;}
switch(mode){
case 0: if(d.oo+len>d.sl){free(t);return PATCH_FAIL;}
while(len--){t[d.oo]=sd[d.oo];d.oo++;} break;
case 1: if(d.mo+len>d.ml-12){free(t);return PATCH_FAIL;}
while(len--){t[d.oo++]=br(&d);} break;
default:{
int64_t off=(int64_t)bd(&d); int neg=off&1; off>>=1; if(neg)off=-off;
if(mode==2){ d.so+=off;
if(d.so>d.sl||len>d.sl-d.so){free(t);return PATCH_FAIL;}
while(len--){t[d.oo++]=sd[d.so++];} }
else { d.to+=off;
if(d.to>d.tl||len>d.tl-d.to){free(t);return PATCH_FAIL;}
while(len--){t[d.oo++]=t[d.to++];} }
break;}
}
}
{ uint32_t want_s=0,want_t=0,want_p=0; int k;
if(ml<12){ free(t); return PATCH_FAIL; }
for(k=0;k<4;k++){
want_s|=(uint32_t)md[ml-12+k]<<(k*8);
want_t|=(uint32_t)md[ml- 8+k]<<(k*8);
want_p|=(uint32_t)md[ml- 4+k]<<(k*8); }
if(ocrc(sd,(size_t)sl)!=want_s){ free(t); return PATCH_FAIL; }
if(ocrc(t,(size_t)ts)!=want_t){ free(t); return PATCH_FAIL; }
if(ocrc(md,(size_t)(ml-4))!=want_p){ free(t); return PATCH_FAIL; } }
*td=t;*tl=ts;return PATCH_SUCCESS;
}
static int g_finish_failures = 0;
static void pstream_fail_note(void){ g_finish_failures++; printf(" finish() failed\n"); }
/* Hypothesis: harness aliasing, not applier bug. Same trials, but each
* cmp_stream gets its own private copy of the patch buffer. */
static unsigned R=2463534242u;
static unsigned xr(void){R^=R<<13;R^=R>>17;R^=R<<5;return R;}
static void put24(uint8_t*b,uint32_t v){b[0]=v>>16;b[1]=v>>8;b[2]=v;}
static size_t make_ips(uint8_t*pat,const uint8_t*src,size_t sl,size_t*want){size_t o=0;int recs=1+xr()%12,i;uint32_t maxend=(uint32_t)sl;memcpy(pat,"PATCH",5);o=5;for(i=0;i<recs;i++){uint32_t addr=xr()%(sl?sl+64:64);if(addr==0x454f46)addr++;if(xr()&1){uint32_t len=1+xr()%40;put24(pat+o,addr);o+=3;pat[o++]=len>>8;pat[o++]=len;{uint32_t k;for(k=0;k<len;k++)pat[o++]=(uint8_t)xr();}if(addr+len>maxend)maxend=addr+len;}else{uint32_t len=1+xr()%60;put24(pat+o,addr);o+=3;pat[o++]=0;pat[o++]=0;pat[o++]=len>>8;pat[o++]=len;pat[o++]=(uint8_t)xr();if(addr+len>maxend)maxend=addr+len;}}memcpy(pat+o,"EOF",3);o+=3;if(xr()&1){uint32_t tl=maxend+(xr()%128);put24(pat+o,tl);o+=3;*want=tl;}else *want=maxend;return o;}
static void enc(uint8_t*b,size_t*o,uint64_t v){for(;;){uint8_t x=v&0x7f;v>>=7;if(!v){b[(*o)++]=x|0x80;break;}b[(*o)++]=x;v--;}}
static uint32_t crc(const uint8_t*p,size_t n){static uint32_t T[256];static int I=0;uint32_t c;if(!I){uint32_t i,j;for(i=0;i<256;i++){c=i;for(j=0;j<8;j++)c=(c&1)?0xEDB88320u^(c>>1):c>>1;T[i]=c;}I=1;}c=~0u;while(n--)c=T[(c^*p++)&0xFF]^(c>>8);return ~c;}
static size_t make_ups(uint8_t*pat,const uint8_t*src,size_t sl,uint8_t*tgt,size_t tl){size_t o=0,i=0;memcpy(pat,"UPS1",4);o=4;enc(pat,&o,sl);enc(pat,&o,tl);while(i<tl||i<sl){size_t run=0;while(i<tl){uint8_t s=i<sl?src[i]:0;if(s!=tgt[i])break;i++;run++;}enc(pat,&o,run);for(;;){uint8_t s=i<sl?src[i]:0,t=i<tl?tgt[i]:0,x=s^t;pat[o++]=x;i++;if(x==0)break;if(i>tl&&i>sl)break;}}{uint32_t sc=crc(src,sl),tc=crc(tgt,tl),pc;int k;for(k=0;k<4;k++)pat[o++]=sc>>(k*8);for(k=0;k<4;k++)pat[o++]=tc>>(k*8);pc=crc(pat,o);for(k=0;k<4;k++)pat[o++]=pc>>(k*8);}return o;}
/* How a comparison feeds the source: 0 as a copy the stream keeps, 1 in
* place (patch_stream_set_source() on a buffer of its own, which
* patch_stream_finish_into() then turns into the target), 2 in place
* for the first half and then from another buffer, which must fall back
* to the copy with what came before. The other buffer is freed as soon
* as it is fed, so a stream still reading it is caught under ASan. */
static void feed_src(patch_stream_t*ps,const uint8_t*src,size_t sl,size_t chunk,int mode){
size_t p=0,half=sl/2;uint8_t*alt=NULL;
if(mode){patch_stream_set_source(ps,src);}
if(mode==2&&sl){alt=malloc(sl);memcpy(alt,src,sl);}
while(p<sl){size_t n=chunk<sl-p?chunk:sl-p;
patch_stream_feed(ps,(mode==2&&p>=half?alt:src)+p,n);p+=n;}
free(alt);}
/* Feed @src and finish into *out: false, and *out NULL, if refused */
static int run_stream(patch_stream_t*ps,const uint8_t*src,size_t sl,size_t chunk,int mode,uint8_t**out,size_t*ol){
uint8_t*own;
*out=NULL;*ol=0;
if(!mode){feed_src(ps,src,sl,chunk,0);
if(!patch_stream_finish(ps,out,ol)){*out=NULL;return 0;}return 1;}
own=malloc(sl?sl:1);if(sl)memcpy(own,src,sl);
feed_src(ps,own,sl,chunk,mode);*ol=sl;
if(!patch_stream_finish_into(ps,&own,ol)){free(own);*out=NULL;*ol=0;return 0;}
*out=own;return 1;}
static int cmp1(int fmt,const uint8_t*pat,size_t pl,const uint8_t*src,size_t sl,size_t chunk,int mode){
uint8_t *os,*ss;uint64_t ol;size_t sl2;patch_stream_t*ps;
uint8_t *priv=malloc(pl?pl:1); if(pl) memcpy(priv,pat,pl); /* private copy */
if(fmt==0){oracle_ips(priv,pl,src,sl,&os,&ol);ps=patch_stream_ips_open(priv,pl,sl);}
else{oracle_ups(priv,pl,src,sl,&os,&ol);ps=patch_stream_ups_open(priv,pl,sl);}
if(!ps){free(os);free(priv);return 0;}
if(!run_stream(ps,src,sl,chunk,mode,&ss,&sl2)){
/* finish_into() has no empty target to hand back */
if(mode&&!ol){free(os);patch_stream_free(ps);free(priv);return 0;}
pstream_fail_note();free(os);patch_stream_free(ps);free(priv);return 1;}
{int bad=(sl2!=ol)||(ol&&memcmp(os,ss,ol));
free(os);free(ss);patch_stream_free(ps);free(priv);return bad;}}
/* A feed of one, two or three bytes at a time is for a source up to
* 1025 bytes, past its 1024-byte edges: over a larger one it is a call
* a byte and finds nothing the seven-byte feed does not. */
#define TINY_ONLY_SMALL(ci,sl) ((ci)<3 && (sl)>1025)
static int run_ips_ups(void){
size_t chunks[]={1,2,3,7,64,1024,1<<20};int trial,ci,fails=0,total=0;
/* the patches are built here, once allocated: each comparison reads
* its own exact-size copy (cmp1), where an overread is caught */
uint8_t*pat=malloc(1<<21);
for(trial=0;trial<20000;trial++){
size_t sl; {unsigned m=xr()%10; sl = m==0?0 : m==1?1 : m==2?2 : m==3?(xr()%4) : m==4?1024 : m==5?1025 : xr()%8192;}uint8_t*src=malloc(sl?sl:1);size_t k;size_t pl,wtl;
for(k=0;k<sl;k++)src[k]=(uint8_t)xr();
pl=make_ips(pat,src,sl,&wtl);
for(ci=0;ci<7;ci++){if(TINY_ONLY_SMALL(ci,sl))continue;total++;fails+=cmp1(0,pat,pl,src,sl,chunks[ci],(trial+ci)%3);}
{long tld=(long)sl+((long)(xr()%256)-128);size_t tl=tld<0?0:(size_t)tld;uint8_t*tgt=malloc(tl?tl:1);
for(k=0;k<tl;k++)tgt[k]=(uint8_t)((k<sl?src[k]:0)^((xr()&3)?0:xr()));
pl=make_ups(pat,src,sl,tgt,tl);
for(ci=0;ci<7;ci++){if(TINY_ONLY_SMALL(ci,sl))continue;total++;fails+=cmp1(1,pat,pl,src,sl,chunks[ci],(trial+ci)%3);}
free(tgt);}
free(src);}
free(pat);
printf("%s: %d comparisons, %d mismatches (private patch copies)\n",fails?"FAIL":"PASS",total,fails);
return fails!=0;}
/* Differential test for streaming BPS: build valid BPS patches, compare
* streamed output against the oracle across chunk sizes. */
static unsigned R2=13579;
static unsigned xr2(void){R2^=R2<<13;R2^=R2>>17;R2^=R2<<5;return R2;}
static void enc2(uint8_t*b,size_t*o,uint64_t v){for(;;){uint8_t x=v&0x7f;v>>=7;if(!v){b[(*o)++]=x|0x80;break;}b[(*o)++]=x;v--;}}
static uint32_t crc2(const uint8_t*p,size_t n){static uint32_t T[256];static int I=0;uint32_t c;if(!I){uint32_t i,j;for(i=0;i<256;i++){c=i;for(j=0;j<8;j++)c=(c&1)?0xEDB88320u^(c>>1):c>>1;T[i]=c;}I=1;}c=~0u;while(n--)c=T[(c^*p++)&0xFF]^(c>>8);return ~c;}
/* Emit a random but VALID bps: walk output, choosing commands whose
* bounds hold. Track expected target as we go. */
static size_t make_bps(uint8_t*pat,const uint8_t*src,size_t sl,uint8_t*tgt,size_t tl)
{
size_t o=0,oo=0; int64_t so=0,to=0;
memcpy(pat,"BPS1",4);o=4;
enc2(pat,&o,sl); enc2(pat,&o,tl); enc2(pat,&o,0); /* no markup */
while(oo<tl){
unsigned mode; uint64_t len;
uint64_t maxlen=tl-oo; if(maxlen>32)maxlen=32;
len=1+xr2()%maxlen;
mode=xr2()&3;
/* validity filters */
if(mode==0 && oo+len>sl) mode=1;
if(mode==2){ if(sl==0){mode=1;} }
if(mode==3){ if(to<=0||(uint64_t)to>=oo){mode=1;} }
switch(mode){
case 0: /* SOURCE_READ */
enc2(pat,&o,((len-1)<<2)|0);
{ uint64_t k; for(k=0;k<len;k++){ tgt[oo]=src[oo]; oo++; } }
break;
case 1: /* TARGET_READ */
enc2(pat,&o,((len-1)<<2)|1);
{ uint64_t k; for(k=0;k<len;k++){ uint8_t v=(uint8_t)xr2(); pat[o++]=v; tgt[oo++]=v; } }
break;
case 2: { /* SOURCE_COPY */
int64_t ns; int64_t delta;
if(len>sl){ len=sl; }
ns = (int64_t)(xr2()%(sl-len+1));
delta = ns-so;
enc2(pat,&o,((len-1)<<2)|2);
enc2(pat,&o, (uint64_t)((delta<0? ((-delta)<<1)|1 : (delta<<1))));
so=ns;
{ uint64_t k; for(k=0;k<len;k++){ tgt[oo++]=src[so++]; } }
break; }
default: { /* TARGET_COPY */
int64_t nt, delta;
if(len>oo) len=oo;
if(len==0){ continue; }
nt=(int64_t)(xr2()%(oo-len+1));
delta=nt-to;
enc2(pat,&o,((len-1)<<2)|3);
enc2(pat,&o,(uint64_t)((delta<0? ((-delta)<<1)|1 : (delta<<1))));
to=nt;
{ uint64_t k; for(k=0;k<len;k++){ tgt[oo++]=tgt[to++]; } }
break; }
}
}
{
uint32_t sc = crc2(src, sl), tc = crc2(tgt, tl), pc;
int k;
for (k = 0; k < 4; k++)
pat[o++] = sc >> (k * 8);
for (k = 0; k < 4; k++)
pat[o++] = tc >> (k * 8);
pc = crc2(pat, o);
for (k = 0; k < 4; k++)
pat[o++] = pc >> (k * 8);
}
return o;
}
static int run_bps(void)
{
size_t chunks[]={1,3,64,1024,1<<20};
int trial,ci,fails=0,total=0,skipped=0;
for(trial=0;trial<4000;trial++){
size_t sl,tl,k,pl;
static uint8_t src[6000],tgt[6000],pat[200000];
{ unsigned m=xr2()%8; sl = m==0?0: m==1?1: m==2?2: xr2()%6000; }
tl = 1+xr2()%6000;
for(k=0;k<sl;k++)src[k]=(uint8_t)xr2();
pl=make_bps(pat,src,sl,tgt,tl);
for(ci=0;ci<5;ci++){
uint8_t *os,*ss; uint64_t ol; size_t sl2; patch_stream_t*ps;
uint8_t *priv=malloc(pl); memcpy(priv,pat,pl);
if(oracle_bps(priv,pl,src,sl,&os,&ol)!=PATCH_SUCCESS){ skipped++; free(priv); continue; }
ps=patch_stream_bps_open(priv,pl,sl);
if(!ps){ skipped++; free(os); free(priv); continue; }
total++;
if(!run_stream(ps,src,sl,chunks[ci],(trial+ci)%3,&ss,&sl2)){ fails++; printf("finish failed t=%d chunk=%zu\n",trial,chunks[ci]); patch_stream_free(ps); free(os); free(priv); continue; }
if(sl2!=ol||(ol&&memcmp(os,ss,ol))){ fails++;
printf("MISMATCH t=%d chunk=%zu sl=%zu tl=%zu\n",trial,chunks[ci],sl,tl);
for(k=0;k<ol&&k<8;k++) if(os[k]!=ss[k]){printf(" first diff@%zu %02x vs %02x\n",k,os[k],ss[k]);break;} }
free(os);free(ss);patch_stream_free(ps);free(priv);
}
}
printf("%s: %d comparisons, %d mismatches (%d skipped)\n",fails?"FAIL":"PASS",total,fails,skipped);
return fails!=0;
}
/* --------------------------------------------------------------------
* xdelta: the streamed path must agree with the whole-buffer one
* -------------------------------------------------------------------- */
#ifdef HAVE_XDELTA
#include <encodings/encoding_vcdiff.h>
/* Generated by the reference xdelta3 encoder. */
static const unsigned char xd_src[6000] = {
0x0d,0x2a,0x47,0x64,0x81,0x9e,0xbb,0xd8,0xf5,0x12,0x2f,0x4c,
0x69,0x86,0xa3,0xc0,0xdd,0xfa,0x17,0x34,0x51,0x6e,0x8b,0xa8,
0xc5,0xe2,0xff,0x1c,0x39,0x56,0x73,0x90,0xad,0xca,0xe7,0x04,
0x21,0x3e,0x5b,0x78,0x95,0xb2,0xcf,0xec,0x09,0x26,0x43,0x60,
0x7d,0x9a,0xb7,0xd4,0xf1,0x0e,0x2b,0x48,0x65,0x82,0x9f,0xbc,
0xd9,0xf6,0x13,0x30,0x4d,0x6a,0x87,0xa4,0xc1,0xde,0xfb,0x18,
0x35,0x52,0x6f,0x8c,0xa9,0xc6,0xe3,0x00,0x1d,0x3a,0x57,0x74,
0x91,0xae,0xcb,0xe8,0x05,0x22,0x3f,0x5c,0x79,0x96,0xb3,0xd0,
0xed,0x0a,0x27,0x44,0x61,0x7e,0x9b,0xb8,0xd5,0xf2,0x0f,0x2c,
0x49,0x66,0x83,0xa0,0xbd,0xda,0xf7,0x14,0x31,0x4e,0x6b,0x88,
0xa5,0xc2,0xdf,0xfc,0x19,0x36,0x53,0x70,0x8d,0xaa,0xc7,0xe4,
0x01,0x1e,0x3b,0x58,0x75,0x92,0xaf,0xcc,0xe9,0x06,0x23,0x40,
0x5d,0x7a,0x97,0xb4,0xd1,0xee,0x0b,0x28,0x45,0x62,0x7f,0x9c,
0xb9,0xd6,0xf3,0x10,0x2d,0x4a,0x67,0x84,0xa1,0xbe,0xdb,0xf8,
0x15,0x32,0x4f,0x6c,0x89,0xa6,0xc3,0xe0,0xfd,0x1a,0x37,0x54,
0x71,0x8e,0xab,0xc8,0xe5,0x02,0x1f,0x3c,0x59,0x76,0x93,0xb0,
0xcd,0xea,0x07,0x24,0x41,0x5e,0x7b,0x98,0xb5,0xd2,0xef,0x0c,
0x29,0x46,0x63,0x80,0x9d,0xba,0xd7,0xf4,0x11,0x2e,0x4b,0x68,
0x85,0xa2,0xbf,0xdc,0xf9,0x16,0x33,0x50,0x6d,0x8a,0xa7,0xc4,
0xe1,0xfe,0x1b,0x38,0x55,0x72,0x8f,0xac,0xc9,0xe6,0x03,0x20,
0x3d,0x5a,0x77,0x94,0xb1,0xce,0xeb,0x08,0x25,0x42,0x5f,0x7c,
0x99,0xb6,0xd3,0xf0,0x0d,0x2a,0x47,0x64,0x81,0x9e,0xbb,0xd8,
0xf5,0x12,0x2f,0x4c,0x69,0x86,0xa3,0xc0,0xdd,0xfa,0x17,0x34,
0x51,0x6e,0x8b,0xa8,0xc5,0xe2,0xff,0x1c,0x39,0x56,0x73,0x90,
0xad,0xca,0xe7,0x04,0x21,0x3e,0x5b,0x78,0x95,0xb2,0xcf,0xec,
0x09,0x26,0x43,0x60,0x7d,0x9a,0xb7,0xd4,0xf1,0x0e,0x2b,0x48,
0x65,0x82,0x9f,0xbc,0xd9,0xf6,0x13,0x30,0x4d,0x6a,0x87,0xa4,
0xc1,0xde,0xfb,0x18,0x35,0x52,0x6f,0x8c,0xa9,0xc6,0xe3,0x00,
0x1d,0x3a,0x57,0x74,0x91,0xae,0xcb,0xe8,0x05,0x22,0x3f,0x5c,
0x79,0x96,0xb3,0xd0,0xed,0x0a,0x27,0x44,0x61,0x7e,0x9b,0xb8,
0xd5,0xf2,0x0f,0x2c,0x49,0x66,0x83,0xa0,0xbd,0xda,0xf7,0x14,
0x31,0x4e,0x6b,0x88,0xa5,0xc2,0xdf,0xfc,0x19,0x36,0x53,0x70,
0x8d,0xaa,0xc7,0xe4,0x01,0x1e,0x3b,0x58,0x75,0x92,0xaf,0xcc,
0xe9,0x06,0x23,0x40,0x5d,0x7a,0x97,0xb4,0xd1,0xee,0x0b,0x28,
0x45,0x62,0x7f,0x9c,0xb9,0xd6,0xf3,0x10,0x2d,0x4a,0x67,0x84,
0xa1,0xbe,0xdb,0xf8,0x15,0x32,0x4f,0x6c,0x89,0xa6,0xc3,0xe0,
0xfd,0x1a,0x37,0x54,0x71,0x8e,0xab,0xc8,0xe5,0x02,0x1f,0x3c,
0x59,0x76,0x93,0xb0,0xcd,0xea,0x07,0x24,0x41,0x5e,0x7b,0x98,
0xb5,0xd2,0xef,0x0c,0x29,0x46,0x63,0x80,0x9d,0xba,0xd7,0xf4,
0x11,0x2e,0x4b,0x68,0x85,0xa2,0xbf,0xdc,0xf9,0x16,0x33,0x50,
0x6d,0x8a,0xa7,0xc4,0xe1,0xfe,0x1b,0x38,0x55,0x72,0x8f,0xac,
0xc9,0xe6,0x03,0x20,0x3d,0x5a,0x77,0x94,0xb1,0xce,0xeb,0x08,
0x25,0x42,0x5f,0x7c,0x99,0xb6,0xd3,0xf0,0x0d,0x2a,0x47,0x64,
0x81,0x9e,0xbb,0xd8,0xf5,0x12,0x2f,0x4c,0x69,0x86,0xa3,0xc0,
0xdd,0xfa,0x17,0x34,0x51,0x6e,0x8b,0xa8,0xc5,0xe2,0xff,0x1c,
0x39,0x56,0x73,0x90,0xad,0xca,0xe7,0x04,0x21,0x3e,0x5b,0x78,
0x95,0xb2,0xcf,0xec,0x09,0x26,0x43,0x60,0x7d,0x9a,0xb7,0xd4,
0xf1,0x0e,0x2b,0x48,0x65,0x82,0x9f,0xbc,0xd9,0xf6,0x13,0x30,
0x4d,0x6a,0x87,0xa4,0xc1,0xde,0xfb,0x18,0x35,0x52,0x6f,0x8c,
0xa9,0xc6,0xe3,0x00,0x1d,0x3a,0x57,0x74,0x91,0xae,0xcb,0xe8,
0x05,0x22,0x3f,0x5c,0x79,0x96,0xb3,0xd0,0xed,0x0a,0x27,0x44,
0x61,0x7e,0x9b,0xb8,0xd5,0xf2,0x0f,0x2c,0x49,0x66,0x83,0xa0,
0xbd,0xda,0xf7,0x14,0x31,0x4e,0x6b,0x88,0xa5,0xc2,0xdf,0xfc,
0x19,0x36,0x53,0x70,0x8d,0xaa,0xc7,0xe4,0x01,0x1e,0x3b,0x58,
0x75,0x92,0xaf,0xcc,0xe9,0x06,0x23,0x40,0x5d,0x7a,0x97,0xb4,
0xd1,0xee,0x0b,0x28,0x45,0x62,0x7f,0x9c,0xb9,0xd6,0xf3,0x10,
0x2d,0x4a,0x67,0x84,0xa1,0xbe,0xdb,0xf8,0x15,0x32,0x4f,0x6c,
0x89,0xa6,0xc3,0xe0,0xfd,0x1a,0x37,0x54,0x71,0x8e,0xab,0xc8,
0xe5,0x02,0x1f,0x3c,0x59,0x76,0x93,0xb0,0xcd,0xea,0x07,0x24,
0x41,0x5e,0x7b,0x98,0xb5,0xd2,0xef,0x0c,0x29,0x46,0x63,0x80,
0x9d,0xba,0xd7,0xf4,0x11,0x2e,0x4b,0x68,0x85,0xa2,0xbf,0xdc,
0xf9,0x16,0x33,0x50,0x6d,0x8a,0xa7,0xc4,0xe1,0xfe,0x1b,0x38,
0x55,0x72,0x8f,0xac,0xc9,0xe6,0x03,0x20,0x3d,0x5a,0x77,0x94,
0xb1,0xce,0xeb,0x08,0x25,0x42,0x5f,0x7c,0x99,0xb6,0xd3,0xf0,
0x0d,0x2a,0x47,0x64,0x81,0x9e,0xbb,0xd8,0xf5,0x12,0x2f,0x4c,
0x69,0x86,0xa3,0xc0,0xdd,0xfa,0x17,0x34,0x51,0x6e,0x8b,0xa8,
0xc5,0xe2,0xff,0x1c,0x39,0x56,0x73,0x90,0xad,0xca,0xe7,0x04,
0x21,0x3e,0x5b,0x78,0x95,0xb2,0xcf,0xec,0x09,0x26,0x43,0x60,
0x7d,0x9a,0xb7,0xd4,0xf1,0x0e,0x2b,0x48,0x65,0x82,0x9f,0xbc,
0xd9,0xf6,0x13,0x30,0x4d,0x6a,0x87,0xa4,0xc1,0xde,0xfb,0x18,
0x35,0x52,0x6f,0x8c,0xa9,0xc6,0xe3,0x00,0x1d,0x3a,0x57,0x74,
0x91,0xae,0xcb,0xe8,0x05,0x22,0x3f,0x5c,0x79,0x96,0xb3,0xd0,
0xed,0x0a,0x27,0x44,0x61,0x7e,0x9b,0xb8,0xd5,0xf2,0x0f,0x2c,
0x49,0x66,0x83,0xa0,0xbd,0xda,0xf7,0x14,0x31,0x4e,0x6b,0x88,
0xa5,0xc2,0xdf,0xfc,0x19,0x36,0x53,0x70,0x8d,0xaa,0xc7,0xe4,
0x01,0x1e,0x3b,0x58,0x75,0x92,0xaf,0xcc,0xe9,0x06,0x23,0x40,
0x5d,0x7a,0x97,0xb4,0xd1,0xee,0x0b,0x28,0x45,0x62,0x7f,0x9c,
0xb9,0xd6,0xf3,0x10,0x2d,0x4a,0x67,0x84,0xa1,0xbe,0xdb,0xf8,
0x15,0x32,0x4f,0x6c,0x89,0xa6,0xc3,0xe0,0xfd,0x1a,0x37,0x54,
0x71,0x8e,0xab,0xc8,0xe5,0x02,0x1f,0x3c,0x59,0x76,0x93,0xb0,
0xcd,0xea,0x07,0x24,0x41,0x5e,0x7b,0x98,0xb5,0xd2,0xef,0x0c,
0x29,0x46,0x63,0x80,0x9d,0xba,0xd7,0xf4,0x11,0x2e,0x4b,0x68,
0x85,0xa2,0xbf,0xdc,0xf9,0x16,0x33,0x50,0x6d,0x8a,0xa7,0xc4,
0xe1,0xfe,0x1b,0x38,0x55,0x72,0x8f,0xac,0xc9,0xe6,0x03,0x20,
0x3d,0x5a,0x77,0x94,0xb1,0xce,0xeb,0x08,0x25,0x42,0x5f,0x7c,
0x99,0xb6,0xd3,0xf0,0x0d,0x2a,0x47,0x64,0x81,0x9e,0xbb,0xd8,
0xf5,0x12,0x2f,0x4c,0x69,0x86,0xa3,0xc0,0xdd,0xfa,0x17,0x34,
0x51,0x6e,0x8b,0xa8,0xc5,0xe2,0xff,0x1c,0x39,0x56,0x73,0x90,
0xad,0xca,0xe7,0x04,0x21,0x3e,0x5b,0x78,0x95,0xb2,0xcf,0xec,
0x09,0x26,0x43,0x60,0x7d,0x9a,0xb7,0xd4,0xf1,0x0e,0x2b,0x48,
0x65,0x82,0x9f,0xbc,0xd9,0xf6,0x13,0x30,0x4d,0x6a,0x87,0xa4,
0xc1,0xde,0xfb,0x18,0x35,0x52,0x6f,0x8c,0xa9,0xc6,0xe3,0x00,
0x1d,0x3a,0x57,0x74,0x91,0xae,0xcb,0xe8,0x05,0x22,0x3f,0x5c,
0x79,0x96,0xb3,0xd0,0xed,0x0a,0x27,0x44,0x61,0x7e,0x9b,0xb8,
0xd5,0xf2,0x0f,0x2c,0x49,0x66,0x83,0xa0,0xbd,0xda,0xf7,0x14,
0x31,0x4e,0x6b,0x88,0xa5,0xc2,0xdf,0xfc,0x19,0x36,0x53,0x70,
0x8d,0xaa,0xc7,0xe4,0x01,0x1e,0x3b,0x58,0x75,0x92,0xaf,0xcc,
0xe9,0x06,0x23,0x40,0x5d,0x7a,0x97,0xb4,0xd1,0xee,0x0b,0x28,
0x45,0x62,0x7f,0x9c,0xb9,0xd6,0xf3,0x10,0x2d,0x4a,0x67,0x84,
0xa1,0xbe,0xdb,0xf8,0x15,0x32,0x4f,0x6c,0x89,0xa6,0xc3,0xe0,
0xfd,0x1a,0x37,0x54,0x71,0x8e,0xab,0xc8,0xe5,0x02,0x1f,0x3c,
0x59,0x76,0x93,0xb0,0xcd,0xea,0x07,0x24,0x41,0x5e,0x7b,0x98,
0xb5,0xd2,0xef,0x0c,0x29,0x46,0x63,0x80,0x9d,0xba,0xd7,0xf4,
0x11,0x2e,0x4b,0x68,0x85,0xa2,0xbf,0xdc,0xf9,0x16,0x33,0x50,
0x6d,0x8a,0xa7,0xc4,0xe1,0xfe,0x1b,0x38,0x55,0x72,0x8f,0xac,
0xc9,0xe6,0x03,0x20,0x3d,0x5a,0x77,0x94,0xb1,0xce,0xeb,0x08,
0x25,0x42,0x5f,0x7c,0x99,0xb6,0xd3,0xf0,0x0d,0x2a,0x47,0x64,
0x81,0x9e,0xbb,0xd8,0xf5,0x12,0x2f,0x4c,0x69,0x86,0xa3,0xc0,
0xdd,0xfa,0x17,0x34,0x51,0x6e,0x8b,0xa8,0xc5,0xe2,0xff,0x1c,
0x39,0x56,0x73,0x90,0xad,0xca,0xe7,0x04,0x21,0x3e,0x5b,0x78,
0x95,0xb2,0xcf,0xec,0x09,0x26,0x43,0x60,0x7d,0x9a,0xb7,0xd4,
0xf1,0x0e,0x2b,0x48,0x65,0x82,0x9f,0xbc,0xd9,0xf6,0x13,0x30,
0x4d,0x6a,0x87,0xa4,0xc1,0xde,0xfb,0x18,0x35,0x52,0x6f,0x8c,
0xa9,0xc6,0xe3,0x00,0x1d,0x3a,0x57,0x74,0x91,0xae,0xcb,0xe8,
0x05,0x22,0x3f,0x5c,0x79,0x96,0xb3,0xd0,0xed,0x0a,0x27,0x44,
0x61,0x7e,0x9b,0xb8,0xd5,0xf2,0x0f,0x2c,0x49,0x66,0x83,0xa0,
0xbd,0xda,0xf7,0x14,0x31,0x4e,0x6b,0x88,0xa5,0xc2,0xdf,0xfc,
0x19,0x36,0x53,0x70,0x8d,0xaa,0xc7,0xe4,0x01,0x1e,0x3b,0x58,
0x75,0x92,0xaf,0xcc,0xe9,0x06,0x23,0x40,0x5d,0x7a,0x97,0xb4,
0xd1,0xee,0x0b,0x28,0x45,0x62,0x7f,0x9c,0xb9,0xd6,0xf3,0x10,
0x2d,0x4a,0x67,0x84,0xa1,0xbe,0xdb,0xf8,0x15,0x32,0x4f,0x6c,
0x89,0xa6,0xc3,0xe0,0xfd,0x1a,0x37,0x54,0x71,0x8e,0xab,0xc8,
0xe5,0x02,0x1f,0x3c,0x59,0x76,0x93,0xb0,0xcd,0xea,0x07,0x24,
0x41,0x5e,0x7b,0x98,0xb5,0xd2,0xef,0x0c,0x29,0x46,0x63,0x80,
0x9d,0xba,0xd7,0xf4,0x11,0x2e,0x4b,0x68,0x85,0xa2,0xbf,0xdc,
0xf9,0x16,0x33,0x50,0x6d,0x8a,0xa7,0xc4,0xe1,0xfe,0x1b,0x38,
0x55,0x72,0x8f,0xac,0xc9,0xe6,0x03,0x20,0x3d,0x5a,0x77,0x94,
0xb1,0xce,0xeb,0x08,0x25,0x42,0x5f,0x7c,0x99,0xb6,0xd3,0xf0,
0x0d,0x2a,0x47,0x64,0x81,0x9e,0xbb,0xd8,0xf5,0x12,0x2f,0x4c,
0x69,0x86,0xa3,0xc0,0xdd,0xfa,0x17,0x34,0x51,0x6e,0x8b,0xa8,
0xc5,0xe2,0xff,0x1c,0x39,0x56,0x73,0x90,0xad,0xca,0xe7,0x04,
0x21,0x3e,0x5b,0x78,0x95,0xb2,0xcf,0xec,0x09,0x26,0x43,0x60,
0x7d,0x9a,0xb7,0xd4,0xf1,0x0e,0x2b,0x48,0x65,0x82,0x9f,0xbc,
0xd9,0xf6,0x13,0x30,0x4d,0x6a,0x87,0xa4,0xc1,0xde,0xfb,0x18,
0x35,0x52,0x6f,0x8c,0xa9,0xc6,0xe3,0x00,0x1d,0x3a,0x57,0x74,
0x91,0xae,0xcb,0xe8,0x05,0x22,0x3f,0x5c,0x79,0x96,0xb3,0xd0,
0xed,0x0a,0x27,0x44,0x61,0x7e,0x9b,0xb8,0xd5,0xf2,0x0f,0x2c,
0x49,0x66,0x83,0xa0,0xbd,0xda,0xf7,0x14,0x31,0x4e,0x6b,0x88,
0xa5,0xc2,0xdf,0xfc,0x19,0x36,0x53,0x70,0x8d,0xaa,0xc7,0xe4,
0x01,0x1e,0x3b,0x58,0x75,0x92,0xaf,0xcc,0xe9,0x06,0x23,0x40,
0x5d,0x7a,0x97,0xb4,0xd1,0xee,0x0b,0x28,0x45,0x62,0x7f,0x9c,
0xb9,0xd6,0xf3,0x10,0x2d,0x4a,0x67,0x84,0xa1,0xbe,0xdb,0xf8,
0x15,0x32,0x4f,0x6c,0x89,0xa6,0xc3,0xe0,0xfd,0x1a,0x37,0x54,
0x71,0x8e,0xab,0xc8,0xe5,0x02,0x1f,0x3c,0x59,0x76,0x93,0xb0,
0xcd,0xea,0x07,0x24,0x41,0x5e,0x7b,0x98,0xb5,0xd2,0xef,0x0c,
0x29,0x46,0x63,0x80,0x9d,0xba,0xd7,0xf4,0x11,0x2e,0x4b,0x68,
0x85,0xa2,0xbf,0xdc,0xf9,0x16,0x33,0x50,0x6d,0x8a,0xa7,0xc4,
0xe1,0xfe,0x1b,0x38,0x55,0x72,0x8f,0xac,0xc9,0xe6,0x03,0x20,
0x3d,0x5a,0x77,0x94,0xb1,0xce,0xeb,0x08,0x25,0x42,0x5f,0x7c,
0x99,0xb6,0xd3,0xf0,0x0d,0x2a,0x47,0x64,0x81,0x9e,0xbb,0xd8,
0xf5,0x12,0x2f,0x4c,0x69,0x86,0xa3,0xc0,0xdd,0xfa,0x17,0x34,
0x51,0x6e,0x8b,0xa8,0xc5,0xe2,0xff,0x1c,0x39,0x56,0x73,0x90,
0xad,0xca,0xe7,0x04,0x21,0x3e,0x5b,0x78,0x95,0xb2,0xcf,0xec,
0x09,0x26,0x43,0x60,0x7d,0x9a,0xb7,0xd4,0xf1,0x0e,0x2b,0x48,
0x65,0x82,0x9f,0xbc,0xd9,0xf6,0x13,0x30,0x4d,0x6a,0x87,0xa4,
0xc1,0xde,0xfb,0x18,0x35,0x52,0x6f,0x8c,0xa9,0xc6,0xe3,0x00,
0x1d,0x3a,0x57,0x74,0x91,0xae,0xcb,0xe8,0x05,0x22,0x3f,0x5c,
0x79,0x96,0xb3,0xd0,0xed,0x0a,0x27,0x44,0x61,0x7e,0x9b,0xb8,
0xd5,0xf2,0x0f,0x2c,0x49,0x66,0x83,0xa0,0xbd,0xda,0xf7,0x14,
0x31,0x4e,0x6b,0x88,0xa5,0xc2,0xdf,0xfc,0x19,0x36,0x53,0x70,
0x8d,0xaa,0xc7,0xe4,0x01,0x1e,0x3b,0x58,0x75,0x92,0xaf,0xcc,
0xe9,0x06,0x23,0x40,0x5d,0x7a,0x97,0xb4,0xd1,0xee,0x0b,0x28,
0x45,0x62,0x7f,0x9c,0xb9,0xd6,0xf3,0x10,0x2d,0x4a,0x67,0x84,
0xa1,0xbe,0xdb,0xf8,0x15,0x32,0x4f,0x6c,0x89,0xa6,0xc3,0xe0,
0xfd,0x1a,0x37,0x54,0x71,0x8e,0xab,0xc8,0xe5,0x02,0x1f,0x3c,
0x59,0x76,0x93,0xb0,0xcd,0xea,0x07,0x24,0x41,0x5e,0x7b,0x98,
0xb5,0xd2,0xef,0x0c,0x29,0x46,0x63,0x80,0x9d,0xba,0xd7,0xf4,
0x11,0x2e,0x4b,0x68,0x85,0xa2,0xbf,0xdc,0xf9,0x16,0x33,0x50,
0x6d,0x8a,0xa7,0xc4,0xe1,0xfe,0x1b,0x38,0x55,0x72,0x8f,0xac,
0xc9,0xe6,0x03,0x20,0x3d,0x5a,0x77,0x94,0xb1,0xce,0xeb,0x08,
0x25,0x42,0x5f,0x7c,0x99,0xb6,0xd3,0xf0,0x0d,0x2a,0x47,0x64,
0x81,0x9e,0xbb,0xd8,0xf5,0x12,0x2f,0x4c,0x69,0x86,0xa3,0xc0,
0xdd,0xfa,0x17,0x34,0x51,0x6e,0x8b,0xa8,0xc5,0xe2,0xff,0x1c,
0x39,0x56,0x73,0x90,0xad,0xca,0xe7,0x04,0x21,0x3e,0x5b,0x78,
0x95,0xb2,0xcf,0xec,0x09,0x26,0x43,0x60,0x7d,0x9a,0xb7,0xd4,
0xf1,0x0e,0x2b,0x48,0x65,0x82,0x9f,0xbc,0xd9,0xf6,0x13,0x30,
0x4d,0x6a,0x87,0xa4,0xc1,0xde,0xfb,0x18,0x35,0x52,0x6f,0x8c,
0xa9,0xc6,0xe3,0x00,0x1d,0x3a,0x57,0x74,0x91,0xae,0xcb,0xe8,
0x05,0x22,0x3f,0x5c,0x79,0x96,0xb3,0xd0,0xed,0x0a,0x27,0x44,
0x61,0x7e,0x9b,0xb8,0xd5,0xf2,0x0f,0x2c,0x49,0x66,0x83,0xa0,
0xbd,0xda,0xf7,0x14,0x31,0x4e,0x6b,0x88,0xa5,0xc2,0xdf,0xfc,
0x19,0x36,0x53,0x70,0x8d,0xaa,0xc7,0xe4,0x01,0x1e,0x3b,0x58,
0x75,0x92,0xaf,0xcc,0xe9,0x06,0x23,0x40,0x5d,0x7a,0x97,0xb4,
0xd1,0xee,0x0b,0x28,0x45,0x62,0x7f,0x9c,0xb9,0xd6,0xf3,0x10,
0x2d,0x4a,0x67,0x84,0xa1,0xbe,0xdb,0xf8,0x15,0x32,0x4f,0x6c,
0x89,0xa6,0xc3,0xe0,0xfd,0x1a,0x37,0x54,0x71,0x8e,0xab,0xc8,
0xe5,0x02,0x1f,0x3c,0x59,0x76,0x93,0xb0,0xcd,0xea,0x07,0x24,
0x41,0x5e,0x7b,0x98,0xb5,0xd2,0xef,0x0c,0x29,0x46,0x63,0x80,
0x9d,0xba,0xd7,0xf4,0x11,0x2e,0x4b,0x68,0x85,0xa2,0xbf,0xdc,
0xf9,0x16,0x33,0x50,0x6d,0x8a,0xa7,0xc4,0xe1,0xfe,0x1b,0x38,
0x55,0x72,0x8f,0xac,0xc9,0xe6,0x03,0x20,0x3d,0x5a,0x77,0x94,
0xb1,0xce,0xeb,0x08,0x25,0x42,0x5f,0x7c,0x99,0xb6,0xd3,0xf0,
0x0d,0x2a,0x47,0x64,0x81,0x9e,0xbb,0xd8,0xf5,0x12,0x2f,0x4c,
0x69,0x86,0xa3,0xc0,0xdd,0xfa,0x17,0x34,0x51,0x6e,0x8b,0xa8,
0xc5,0xe2,0xff,0x1c,0x39,0x56,0x73,0x90,0xad,0xca,0xe7,0x04,
0x21,0x3e,0x5b,0x78,0x95,0xb2,0xcf,0xec,0x09,0x26,0x43,0x60,
0x7d,0x9a,0xb7,0xd4,0xf1,0x0e,0x2b,0x48,0x65,0x82,0x9f,0xbc,
0xd9,0xf6,0x13,0x30,0x4d,0x6a,0x87,0xa4,0xc1,0xde,0xfb,0x18,
0x35,0x52,0x6f,0x8c,0xa9,0xc6,0xe3,0x00,0x1d,0x3a,0x57,0x74,
0x91,0xae,0xcb,0xe8,0x05,0x22,0x3f,0x5c,0x79,0x96,0xb3,0xd0,
0xed,0x0a,0x27,0x44,0x61,0x7e,0x9b,0xb8,0xd5,0xf2,0x0f,0x2c,
0x49,0x66,0x83,0xa0,0xbd,0xda,0xf7,0x14,0x31,0x4e,0x6b,0x88,
0xa5,0xc2,0xdf,0xfc,0x19,0x36,0x53,0x70,0x8d,0xaa,0xc7,0xe4,
0x01,0x1e,0x3b,0x58,0x75,0x92,0xaf,0xcc,0xe9,0x06,0x23,0x40,
0x5d,0x7a,0x97,0xb4,0xd1,0xee,0x0b,0x28,0x45,0x62,0x7f,0x9c,
0xb9,0xd6,0xf3,0x10,0x2d,0x4a,0x67,0x84,0xa1,0xbe,0xdb,0xf8,
0x15,0x32,0x4f,0x6c,0x89,0xa6,0xc3,0xe0,0xfd,0x1a,0x37,0x54,
0x71,0x8e,0xab,0xc8,0xe5,0x02,0x1f,0x3c,0x59,0x76,0x93,0xb0,
0xcd,0xea,0x07,0x24,0x41,0x5e,0x7b,0x98,0xb5,0xd2,0xef,0x0c,
0x29,0x46,0x63,0x80,0x9d,0xba,0xd7,0xf4,0x11,0x2e,0x4b,0x68,
0x85,0xa2,0xbf,0xdc,0xf9,0x16,0x33,0x50,0x6d,0x8a,0xa7,0xc4,
0xe1,0xfe,0x1b,0x38,0x55,0x72,0x8f,0xac,0xc9,0xe6,0x03,0x20,
0x3d,0x5a,0x77,0x94,0xb1,0xce,0xeb,0x08,0x25,0x42,0x5f,0x7c,
0x99,0xb6,0xd3,0xf0,0x0d,0x2a,0x47,0x64,0x81,0x9e,0xbb,0xd8,
0xf5,0x12,0x2f,0x4c,0x69,0x86,0xa3,0xc0,0xdd,0xfa,0x17,0x34,
0x51,0x6e,0x8b,0xa8,0xc5,0xe2,0xff,0x1c,0x39,0x56,0x73,0x90,
0xad,0xca,0xe7,0x04,0x21,0x3e,0x5b,0x78,0x95,0xb2,0xcf,0xec,
0x09,0x26,0x43,0x60,0x7d,0x9a,0xb7,0xd4,0xf1,0x0e,0x2b,0x48,
0x65,0x82,0x9f,0xbc,0xd9,0xf6,0x13,0x30,0x4d,0x6a,0x87,0xa4,
0xc1,0xde,0xfb,0x18,0x35,0x52,0x6f,0x8c,0xa9,0xc6,0xe3,0x00,
0x1d,0x3a,0x57,0x74,0x91,0xae,0xcb,0xe8,0x05,0x22,0x3f,0x5c,
0x79,0x96,0xb3,0xd0,0xed,0x0a,0x27,0x44,0x61,0x7e,0x9b,0xb8,
0xd5,0xf2,0x0f,0x2c,0x49,0x66,0x83,0xa0,0xbd,0xda,0xf7,0x14,
0x31,0x4e,0x6b,0x88,0xa5,0xc2,0xdf,0xfc,0x19,0x36,0x53,0x70,
0x8d,0xaa,0xc7,0xe4,0x01,0x1e,0x3b,0x58,0x75,0x92,0xaf,0xcc,
0xe9,0x06,0x23,0x40,0x5d,0x7a,0x97,0xb4,0xd1,0xee,0x0b,0x28,
0x45,0x62,0x7f,0x9c,0xb9,0xd6,0xf3,0x10,0x2d,0x4a,0x67,0x84,
0xa1,0xbe,0xdb,0xf8,0x15,0x32,0x4f,0x6c,0x89,0xa6,0xc3,0xe0,
0xfd,0x1a,0x37,0x54,0x71,0x8e,0xab,0xc8,0xe5,0x02,0x1f,0x3c,
0x59,0x76,0x93,0xb0,0xcd,0xea,0x07,0x24,0x41,0x5e,0x7b,0x98,
0xb5,0xd2,0xef,0x0c,0x29,0x46,0x63,0x80,0x9d,0xba,0xd7,0xf4,
0x11,0x2e,0x4b,0x68,0x85,0xa2,0xbf,0xdc,0xf9,0x16,0x33,0x50,
0x6d,0x8a,0xa7,0xc4,0xe1,0xfe,0x1b,0x38,0x55,0x72,0x8f,0xac,
0xc9,0xe6,0x03,0x20,0x3d,0x5a,0x77,0x94,0xb1,0xce,0xeb,0x08,
0x25,0x42,0x5f,0x7c,0x99,0xb6,0xd3,0xf0,0x0d,0x2a,0x47,0x64,
0x81,0x9e,0xbb,0xd8,0xf5,0x12,0x2f,0x4c,0x69,0x86,0xa3,0xc0,
0xdd,0xfa,0x17,0x34,0x51,0x6e,0x8b,0xa8,0xc5,0xe2,0xff,0x1c,
0x39,0x56,0x73,0x90,0xad,0xca,0xe7,0x04,0x21,0x3e,0x5b,0x78,
0x95,0xb2,0xcf,0xec,0x09,0x26,0x43,0x60,0x7d,0x9a,0xb7,0xd4,
0xf1,0x0e,0x2b,0x48,0x65,0x82,0x9f,0xbc,0xd9,0xf6,0x13,0x30,
0x4d,0x6a,0x87,0xa4,0xc1,0xde,0xfb,0x18,0x35,0x52,0x6f,0x8c,
0xa9,0xc6,0xe3,0x00,0x1d,0x3a,0x57,0x74,0x91,0xae,0xcb,0xe8,
0x05,0x22,0x3f,0x5c,0x79,0x96,0xb3,0xd0,0xed,0x0a,0x27,0x44,
0x61,0x7e,0x9b,0xb8,0xd5,0xf2,0x0f,0x2c,0x49,0x66,0x83,0xa0,
0xbd,0xda,0xf7,0x14,0x31,0x4e,0x6b,0x88,0xa5,0xc2,0xdf,0xfc,
0x19,0x36,0x53,0x70,0x8d,0xaa,0xc7,0xe4,0x01,0x1e,0x3b,0x58,
0x75,0x92,0xaf,0xcc,0xe9,0x06,0x23,0x40,0x5d,0x7a,0x97,0xb4,
0xd1,0xee,0x0b,0x28,0x45,0x62,0x7f,0x9c,0xb9,0xd6,0xf3,0x10,
0x2d,0x4a,0x67,0x84,0xa1,0xbe,0xdb,0xf8,0x15,0x32,0x4f,0x6c,
0x89,0xa6,0xc3,0xe0,0xfd,0x1a,0x37,0x54,0x71,0x8e,0xab,0xc8,
0xe5,0x02,0x1f,0x3c,0x59,0x76,0x93,0xb0,0xcd,0xea,0x07,0x24,
0x41,0x5e,0x7b,0x98,0xb5,0xd2,0xef,0x0c,0x29,0x46,0x63,0x80,
0x9d,0xba,0xd7,0xf4,0x11,0x2e,0x4b,0x68,0x85,0xa2,0xbf,0xdc,
0xf9,0x16,0x33,0x50,0x6d,0x8a,0xa7,0xc4,0xe1,0xfe,0x1b,0x38,
0x55,0x72,0x8f,0xac,0xc9,0xe6,0x03,0x20,0x3d,0x5a,0x77,0x94,
0xb1,0xce,0xeb,0x08,0x25,0x42,0x5f,0x7c,0x99,0xb6,0xd3,0xf0,
0x0d,0x2a,0x47,0x64,0x81,0x9e,0xbb,0xd8,0xf5,0x12,0x2f,0x4c,
0x69,0x86,0xa3,0xc0,0xdd,0xfa,0x17,0x34,0x51,0x6e,0x8b,0xa8,
0xc5,0xe2,0xff,0x1c,0x39,0x56,0x73,0x90,0xad,0xca,0xe7,0x04,
0x21,0x3e,0x5b,0x78,0x95,0xb2,0xcf,0xec,0x09,0x26,0x43,0x60,
0x7d,0x9a,0xb7,0xd4,0xf1,0x0e,0x2b,0x48,0x65,0x82,0x9f,0xbc,
0xd9,0xf6,0x13,0x30,0x4d,0x6a,0x87,0xa4,0xc1,0xde,0xfb,0x18,
0x35,0x52,0x6f,0x8c,0xa9,0xc6,0xe3,0x00,0x1d,0x3a,0x57,0x74,
0x91,0xae,0xcb,0xe8,0x05,0x22,0x3f,0x5c,0x79,0x96,0xb3,0xd0,
0xed,0x0a,0x27,0x44,0x61,0x7e,0x9b,0xb8,0xd5,0xf2,0x0f,0x2c,
0x49,0x66,0x83,0xa0,0xbd,0xda,0xf7,0x14,0x31,0x4e,0x6b,0x88,
0xa5,0xc2,0xdf,0xfc,0x19,0x36,0x53,0x70,0x8d,0xaa,0xc7,0xe4,
0x01,0x1e,0x3b,0x58,0x75,0x92,0xaf,0xcc,0xe9,0x06,0x23,0x40,
0x5d,0x7a,0x97,0xb4,0xd1,0xee,0x0b,0x28,0x45,0x62,0x7f,0x9c,
0xb9,0xd6,0xf3,0x10,0x2d,0x4a,0x67,0x84,0xa1,0xbe,0xdb,0xf8,
0x15,0x32,0x4f,0x6c,0x89,0xa6,0xc3,0xe0,0xfd,0x1a,0x37,0x54,
0x71,0x8e,0xab,0xc8,0xe5,0x02,0x1f,0x3c,0x59,0x76,0x93,0xb0,
0xcd,0xea,0x07,0x24,0x41,0x5e,0x7b,0x98,0xb5,0xd2,0xef,0x0c,
0x29,0x46,0x63,0x80,0x9d,0xba,0xd7,0xf4,0x11,0x2e,0x4b,0x68,
0x85,0xa2,0xbf,0xdc,0xf9,0x16,0x33,0x50,0x6d,0x8a,0xa7,0xc4,
0xe1,0xfe,0x1b,0x38,0x55,0x72,0x8f,0xac,0xc9,0xe6,0x03,0x20,
0x3d,0x5a,0x77,0x94,0xb1,0xce,0xeb,0x08,0x25,0x42,0x5f,0x7c,
0x99,0xb6,0xd3,0xf0,0x0d,0x2a,0x47,0x64,0x81,0x9e,0xbb,0xd8,
0xf5,0x12,0x2f,0x4c,0x69,0x86,0xa3,0xc0,0xdd,0xfa,0x17,0x34,
0x51,0x6e,0x8b,0xa8,0xc5,0xe2,0xff,0x1c,0x39,0x56,0x73,0x90,
0xad,0xca,0xe7,0x04,0x21,0x3e,0x5b,0x78,0x95,0xb2,0xcf,0xec,
0x09,0x26,0x43,0x60,0x7d,0x9a,0xb7,0xd4,0xf1,0x0e,0x2b,0x48,
0x65,0x82,0x9f,0xbc,0xd9,0xf6,0x13,0x30,0x4d,0x6a,0x87,0xa4,
0xc1,0xde,0xfb,0x18,0x35,0x52,0x6f,0x8c,0xa9,0xc6,0xe3,0x00,
0x1d,0x3a,0x57,0x74,0x91,0xae,0xcb,0xe8,0x05,0x22,0x3f,0x5c,
0x79,0x96,0xb3,0xd0,0xed,0x0a,0x27,0x44,0x61,0x7e,0x9b,0xb8,
0xd5,0xf2,0x0f,0x2c,0x49,0x66,0x83,0xa0,0xbd,0xda,0xf7,0x14,
0x31,0x4e,0x6b,0x88,0xa5,0xc2,0xdf,0xfc,0x19,0x36,0x53,0x70,
0x8d,0xaa,0xc7,0xe4,0x01,0x1e,0x3b,0x58,0x75,0x92,0xaf,0xcc,
0xe9,0x06,0x23,0x40,0x5d,0x7a,0x97,0xb4,0xd1,0xee,0x0b,0x28,
0x45,0x62,0x7f,0x9c,0xb9,0xd6,0xf3,0x10,0x2d,0x4a,0x67,0x84,
0xa1,0xbe,0xdb,0xf8,0x15,0x32,0x4f,0x6c,0x89,0xa6,0xc3,0xe0,
0xfd,0x1a,0x37,0x54,0x71,0x8e,0xab,0xc8,0xe5,0x02,0x1f,0x3c,
0x59,0x76,0x93,0xb0,0xcd,0xea,0x07,0x24,0x41,0x5e,0x7b,0x98,
0xb5,0xd2,0xef,0x0c,0x29,0x46,0x63,0x80,0x9d,0xba,0xd7,0xf4,
0x11,0x2e,0x4b,0x68,0x85,0xa2,0xbf,0xdc,0xf9,0x16,0x33,0x50,
0x6d,0x8a,0xa7,0xc4,0xe1,0xfe,0x1b,0x38,0x55,0x72,0x8f,0xac,
0xc9,0xe6,0x03,0x20,0x3d,0x5a,0x77,0x94,0xb1,0xce,0xeb,0x08,
0x25,0x42,0x5f,0x7c,0x99,0xb6,0xd3,0xf0,0x0d,0x2a,0x47,0x64,
0x81,0x9e,0xbb,0xd8,0xf5,0x12,0x2f,0x4c,0x69,0x86,0xa3,0xc0,
0xdd,0xfa,0x17,0x34,0x51,0x6e,0x8b,0xa8,0xc5,0xe2,0xff,0x1c,
0x39,0x56,0x73,0x90,0xad,0xca,0xe7,0x04,0x21,0x3e,0x5b,0x78,
0x95,0xb2,0xcf,0xec,0x09,0x26,0x43,0x60,0x7d,0x9a,0xb7,0xd4,
0xf1,0x0e,0x2b,0x48,0x65,0x82,0x9f,0xbc,0xd9,0xf6,0x13,0x30,
0x4d,0x6a,0x87,0xa4,0xc1,0xde,0xfb,0x18,0x35,0x52,0x6f,0x8c,
0xa9,0xc6,0xe3,0x00,0x1d,0x3a,0x57,0x74,0x91,0xae,0xcb,0xe8,
0x05,0x22,0x3f,0x5c,0x79,0x96,0xb3,0xd0,0xed,0x0a,0x27,0x44,
0x61,0x7e,0x9b,0xb8,0xd5,0xf2,0x0f,0x2c,0x49,0x66,0x83,0xa0,
0xbd,0xda,0xf7,0x14,0x31,0x4e,0x6b,0x88,0xa5,0xc2,0xdf,0xfc,
0x19,0x36,0x53,0x70,0x8d,0xaa,0xc7,0xe4,0x01,0x1e,0x3b,0x58,
0x75,0x92,0xaf,0xcc,0xe9,0x06,0x23,0x40,0x5d,0x7a,0x97,0xb4,
0xd1,0xee,0x0b,0x28,0x45,0x62,0x7f,0x9c,0xb9,0xd6,0xf3,0x10,
0x2d,0x4a,0x67,0x84,0xa1,0xbe,0xdb,0xf8,0x15,0x32,0x4f,0x6c,
0x89,0xa6,0xc3,0xe0,0xfd,0x1a,0x37,0x54,0x71,0x8e,0xab,0xc8,
0xe5,0x02,0x1f,0x3c,0x59,0x76,0x93,0xb0,0xcd,0xea,0x07,0x24,
0x41,0x5e,0x7b,0x98,0xb5,0xd2,0xef,0x0c,0x29,0x46,0x63,0x80,
0x9d,0xba,0xd7,0xf4,0x11,0x2e,0x4b,0x68,0x85,0xa2,0xbf,0xdc,
0xf9,0x16,0x33,0x50,0x6d,0x8a,0xa7,0xc4,0xe1,0xfe,0x1b,0x38,
0x55,0x72,0x8f,0xac,0xc9,0xe6,0x03,0x20,0x3d,0x5a,0x77,0x94,
0xb1,0xce,0xeb,0x08,0x25,0x42,0x5f,0x7c,0x99,0xb6,0xd3,0xf0,
0x0d,0x2a,0x47,0x64,0x81,0x9e,0xbb,0xd8,0xf5,0x12,0x2f,0x4c,
0x69,0x86,0xa3,0xc0,0xdd,0xfa,0x17,0x34,0x51,0x6e,0x8b,0xa8,
0xc5,0xe2,0xff,0x1c,0x39,0x56,0x73,0x90,0xad,0xca,0xe7,0x04,
0x21,0x3e,0x5b,0x78,0x95,0xb2,0xcf,0xec,0x09,0x26,0x43,0x60,
0x7d,0x9a,0xb7,0xd4,0xf1,0x0e,0x2b,0x48,0x65,0x82,0x9f,0xbc,
0xd9,0xf6,0x13,0x30,0x4d,0x6a,0x87,0xa4,0xc1,0xde,0xfb,0x18,
0x35,0x52,0x6f,0x8c,0xa9,0xc6,0xe3,0x00,0x1d,0x3a,0x57,0x74,
0x91,0xae,0xcb,0xe8,0x05,0x22,0x3f,0x5c,0x79,0x96,0xb3,0xd0,
0xed,0x0a,0x27,0x44,0x61,0x7e,0x9b,0xb8,0xd5,0xf2,0x0f,0x2c,
0x49,0x66,0x83,0xa0,0xbd,0xda,0xf7,0x14,0x31,0x4e,0x6b,0x88,
0xa5,0xc2,0xdf,0xfc,0x19,0x36,0x53,0x70,0x8d,0xaa,0xc7,0xe4,
0x01,0x1e,0x3b,0x58,0x75,0x92,0xaf,0xcc,0xe9,0x06,0x23,0x40,
0x5d,0x7a,0x97,0xb4,0xd1,0xee,0x0b,0x28,0x45,0x62,0x7f,0x9c,
0xb9,0xd6,0xf3,0x10,0x2d,0x4a,0x67,0x84,0xa1,0xbe,0xdb,0xf8,
0x15,0x32,0x4f,0x6c,0x89,0xa6,0xc3,0xe0,0xfd,0x1a,0x37,0x54,
0x71,0x8e,0xab,0xc8,0xe5,0x02,0x1f,0x3c,0x59,0x76,0x93,0xb0,
0xcd,0xea,0x07,0x24,0x41,0x5e,0x7b,0x98,0xb5,0xd2,0xef,0x0c,
0x29,0x46,0x63,0x80,0x9d,0xba,0xd7,0xf4,0x11,0x2e,0x4b,0x68,
0x85,0xa2,0xbf,0xdc,0xf9,0x16,0x33,0x50,0x6d,0x8a,0xa7,0xc4,
0xe1,0xfe,0x1b,0x38,0x55,0x72,0x8f,0xac,0xc9,0xe6,0x03,0x20,
0x3d,0x5a,0x77,0x94,0xb1,0xce,0xeb,0x08,0x25,0x42,0x5f,0x7c,
0x99,0xb6,0xd3,0xf0,0x0d,0x2a,0x47,0x64,0x81,0x9e,0xbb,0xd8,
0xf5,0x12,0x2f,0x4c,0x69,0x86,0xa3,0xc0,0xdd,0xfa,0x17,0x34,
0x51,0x6e,0x8b,0xa8,0xc5,0xe2,0xff,0x1c,0x39,0x56,0x73,0x90,
0xad,0xca,0xe7,0x04,0x21,0x3e,0x5b,0x78,0x95,0xb2,0xcf,0xec,
0x09,0x26,0x43,0x60,0x7d,0x9a,0xb7,0xd4,0xf1,0x0e,0x2b,0x48,
0x65,0x82,0x9f,0xbc,0xd9,0xf6,0x13,0x30,0x4d,0x6a,0x87,0xa4,
0xc1,0xde,0xfb,0x18,0x35,0x52,0x6f,0x8c,0xa9,0xc6,0xe3,0x00,
0x1d,0x3a,0x57,0x74,0x91,0xae,0xcb,0xe8,0x05,0x22,0x3f,0x5c,
0x79,0x96,0xb3,0xd0,0xed,0x0a,0x27,0x44,0x61,0x7e,0x9b,0xb8,
0xd5,0xf2,0x0f,0x2c,0x49,0x66,0x83,0xa0,0xbd,0xda,0xf7,0x14,
0x31,0x4e,0x6b,0x88,0xa5,0xc2,0xdf,0xfc,0x19,0x36,0x53,0x70,
0x8d,0xaa,0xc7,0xe4,0x01,0x1e,0x3b,0x58,0x75,0x92,0xaf,0xcc,
0xe9,0x06,0x23,0x40,0x5d,0x7a,0x97,0xb4,0xd1,0xee,0x0b,0x28,
0x45,0x62,0x7f,0x9c,0xb9,0xd6,0xf3,0x10,0x2d,0x4a,0x67,0x84,
0xa1,0xbe,0xdb,0xf8,0x15,0x32,0x4f,0x6c,0x89,0xa6,0xc3,0xe0,
0xfd,0x1a,0x37,0x54,0x71,0x8e,0xab,0xc8,0xe5,0x02,0x1f,0x3c,
0x59,0x76,0x93,0xb0,0xcd,0xea,0x07,0x24,0x41,0x5e,0x7b,0x98,
0xb5,0xd2,0xef,0x0c,0x29,0x46,0x63,0x80,0x9d,0xba,0xd7,0xf4,
0x11,0x2e,0x4b,0x68,0x85,0xa2,0xbf,0xdc,0xf9,0x16,0x33,0x50,
0x6d,0x8a,0xa7,0xc4,0xe1,0xfe,0x1b,0x38,0x55,0x72,0x8f,0xac,
0xc9,0xe6,0x03,0x20,0x3d,0x5a,0x77,0x94,0xb1,0xce,0xeb,0x08,
0x25,0x42,0x5f,0x7c,0x99,0xb6,0xd3,0xf0,0x0d,0x2a,0x47,0x64,
0x81,0x9e,0xbb,0xd8,0xf5,0x12,0x2f,0x4c,0x69,0x86,0xa3,0xc0,
0xdd,0xfa,0x17,0x34,0x51,0x6e,0x8b,0xa8,0xc5,0xe2,0xff,0x1c,
0x39,0x56,0x73,0x90,0xad,0xca,0xe7,0x04,0x21,0x3e,0x5b,0x78,
0x95,0xb2,0xcf,0xec,0x09,0x26,0x43,0x60,0x7d,0x9a,0xb7,0xd4,
0xf1,0x0e,0x2b,0x48,0x65,0x82,0x9f,0xbc,0xd9,0xf6,0x13,0x30,
0x4d,0x6a,0x87,0xa4,0xc1,0xde,0xfb,0x18,0x35,0x52,0x6f,0x8c,
0xa9,0xc6,0xe3,0x00,0x1d,0x3a,0x57,0x74,0x91,0xae,0xcb,0xe8,
0x05,0x22,0x3f,0x5c,0x79,0x96,0xb3,0xd0,0xed,0x0a,0x27,0x44,
0x61,0x7e,0x9b,0xb8,0xd5,0xf2,0x0f,0x2c,0x49,0x66,0x83,0xa0,
0xbd,0xda,0xf7,0x14,0x31,0x4e,0x6b,0x88,0xa5,0xc2,0xdf,0xfc,
0x19,0x36,0x53,0x70,0x8d,0xaa,0xc7,0xe4,0x01,0x1e,0x3b,0x58,
0x75,0x92,0xaf,0xcc,0xe9,0x06,0x23,0x40,0x5d,0x7a,0x97,0xb4,
0xd1,0xee,0x0b,0x28,0x45,0x62,0x7f,0x9c,0xb9,0xd6,0xf3,0x10,
0x2d,0x4a,0x67,0x84,0xa1,0xbe,0xdb,0xf8,0x15,0x32,0x4f,0x6c,
0x89,0xa6,0xc3,0xe0,0xfd,0x1a,0x37,0x54,0x71,0x8e,0xab,0xc8,
0xe5,0x02,0x1f,0x3c,0x59,0x76,0x93,0xb0,0xcd,0xea,0x07,0x24,
0x41,0x5e,0x7b,0x98,0xb5,0xd2,0xef,0x0c,0x29,0x46,0x63,0x80,
0x9d,0xba,0xd7,0xf4,0x11,0x2e,0x4b,0x68,0x85,0xa2,0xbf,0xdc,
0xf9,0x16,0x33,0x50,0x6d,0x8a,0xa7,0xc4,0xe1,0xfe,0x1b,0x38,
0x55,0x72,0x8f,0xac,0xc9,0xe6,0x03,0x20,0x3d,0x5a,0x77,0x94,
0xb1,0xce,0xeb,0x08,0x25,0x42,0x5f,0x7c,0x99,0xb6,0xd3,0xf0,
0x0d,0x2a,0x47,0x64,0x81,0x9e,0xbb,0xd8,0xf5,0x12,0x2f,0x4c,
0x69,0x86,0xa3,0xc0,0xdd,0xfa,0x17,0x34,0x51,0x6e,0x8b,0xa8,
0xc5,0xe2,0xff,0x1c,0x39,0x56,0x73,0x90,0xad,0xca,0xe7,0x04,
0x21,0x3e,0x5b,0x78,0x95,0xb2,0xcf,0xec,0x09,0x26,0x43,0x60,
0x7d,0x9a,0xb7,0xd4,0xf1,0x0e,0x2b,0x48,0x65,0x82,0x9f,0xbc,
0xd9,0xf6,0x13,0x30,0x4d,0x6a,0x87,0xa4,0xc1,0xde,0xfb,0x18,
0x35,0x52,0x6f,0x8c,0xa9,0xc6,0xe3,0x00,0x1d,0x3a,0x57,0x74,
0x91,0xae,0xcb,0xe8,0x05,0x22,0x3f,0x5c,0x79,0x96,0xb3,0xd0,
0xed,0x0a,0x27,0x44,0x61,0x7e,0x9b,0xb8,0xd5,0xf2,0x0f,0x2c,
0x49,0x66,0x83,0xa0,0xbd,0xda,0xf7,0x14,0x31,0x4e,0x6b,0x88,
0xa5,0xc2,0xdf,0xfc,0x19,0x36,0x53,0x70,0x8d,0xaa,0xc7,0xe4,
0x01,0x1e,0x3b,0x58,0x75,0x92,0xaf,0xcc,0xe9,0x06,0x23,0x40,
0x5d,0x7a,0x97,0xb4,0xd1,0xee,0x0b,0x28,0x45,0x62,0x7f,0x9c,
0xb9,0xd6,0xf3,0x10,0x2d,0x4a,0x67,0x84,0xa1,0xbe,0xdb,0xf8,
0x15,0x32,0x4f,0x6c,0x89,0xa6,0xc3,0xe0,0xfd,0x1a,0x37,0x54,
0x71,0x8e,0xab,0xc8,0xe5,0x02,0x1f,0x3c,0x59,0x76,0x93,0xb0,
0xcd,0xea,0x07,0x24,0x41,0x5e,0x7b,0x98,0xb5,0xd2,0xef,0x0c,
0x29,0x46,0x63,0x80,0x9d,0xba,0xd7,0xf4,0x11,0x2e,0x4b,0x68,
0x85,0xa2,0xbf,0xdc,0xf9,0x16,0x33,0x50,0x6d,0x8a,0xa7,0xc4,
0xe1,0xfe,0x1b,0x38,0x55,0x72,0x8f,0xac,0xc9,0xe6,0x03,0x20,
0x3d,0x5a,0x77,0x94,0xb1,0xce,0xeb,0x08,0x25,0x42,0x5f,0x7c,
0x99,0xb6,0xd3,0xf0,0x0d,0x2a,0x47,0x64,0x81,0x9e,0xbb,0xd8,
0xf5,0x12,0x2f,0x4c,0x69,0x86,0xa3,0xc0,0xdd,0xfa,0x17,0x34,
0x51,0x6e,0x8b,0xa8,0xc5,0xe2,0xff,0x1c,0x39,0x56,0x73,0x90,
0xad,0xca,0xe7,0x04,0x21,0x3e,0x5b,0x78,0x95,0xb2,0xcf,0xec,
0x09,0x26,0x43,0x60,0x7d,0x9a,0xb7,0xd4,0xf1,0x0e,0x2b,0x48,
0x65,0x82,0x9f,0xbc,0xd9,0xf6,0x13,0x30,0x4d,0x6a,0x87,0xa4,
0xc1,0xde,0xfb,0x18,0x35,0x52,0x6f,0x8c,0xa9,0xc6,0xe3,0x00,
0x1d,0x3a,0x57,0x74,0x91,0xae,0xcb,0xe8,0x05,0x22,0x3f,0x5c,
0x79,0x96,0xb3,0xd0,0xed,0x0a,0x27,0x44,0x61,0x7e,0x9b,0xb8,
0xd5,0xf2,0x0f,0x2c,0x49,0x66,0x83,0xa0,0xbd,0xda,0xf7,0x14,
0x31,0x4e,0x6b,0x88,0xa5,0xc2,0xdf,0xfc,0x19,0x36,0x53,0x70,
0x8d,0xaa,0xc7,0xe4,0x01,0x1e,0x3b,0x58,0x75,0x92,0xaf,0xcc,
0xe9,0x06,0x23,0x40,0x5d,0x7a,0x97,0xb4,0xd1,0xee,0x0b,0x28,
0x45,0x62,0x7f,0x9c,0xb9,0xd6,0xf3,0x10,0x2d,0x4a,0x67,0x84,
0xa1,0xbe,0xdb,0xf8,0x15,0x32,0x4f,0x6c,0x89,0xa6,0xc3,0xe0,
0xfd,0x1a,0x37,0x54,0x71,0x8e,0xab,0xc8,0xe5,0x02,0x1f,0x3c,
0x59,0x76,0x93,0xb0,0xcd,0xea,0x07,0x24,0x41,0x5e,0x7b,0x98,
0xb5,0xd2,0xef,0x0c,0x29,0x46,0x63,0x80,0x9d,0xba,0xd7,0xf4,
0x11,0x2e,0x4b,0x68,0x85,0xa2,0xbf,0xdc,0xf9,0x16,0x33,0x50,
0x6d,0x8a,0xa7,0xc4,0xe1,0xfe,0x1b,0x38,0x55,0x72,0x8f,0xac,
0xc9,0xe6,0x03,0x20,0x3d,0x5a,0x77,0x94,0xb1,0xce,0xeb,0x08,
0x25,0x42,0x5f,0x7c,0x99,0xb6,0xd3,0xf0,0x0d,0x2a,0x47,0x64,
0x81,0x9e,0xbb,0xd8,0xf5,0x12,0x2f,0x4c,0x69,0x86,0xa3,0xc0,
0xdd,0xfa,0x17,0x34,0x51,0x6e,0x8b,0xa8,0xc5,0xe2,0xff,0x1c,
0x39,0x56,0x73,0x90,0xad,0xca,0xe7,0x04,0x21,0x3e,0x5b,0x78,
0x95,0xb2,0xcf,0xec,0x09,0x26,0x43,0x60,0x7d,0x9a,0xb7,0xd4,
0xf1,0x0e,0x2b,0x48,0x65,0x82,0x9f,0xbc,0xd9,0xf6,0x13,0x30,
0x4d,0x6a,0x87,0xa4,0xc1,0xde,0xfb,0x18,0x35,0x52,0x6f,0x8c,
0xa9,0xc6,0xe3,0x00,0x1d,0x3a,0x57,0x74,0x91,0xae,0xcb,0xe8,
0x05,0x22,0x3f,0x5c,0x79,0x96,0xb3,0xd0,0xed,0x0a,0x27,0x44,
0x61,0x7e,0x9b,0xb8,0xd5,0xf2,0x0f,0x2c,0x49,0x66,0x83,0xa0,
0xbd,0xda,0xf7,0x14,0x31,0x4e,0x6b,0x88,0xa5,0xc2,0xdf,0xfc,
0x19,0x36,0x53,0x70,0x8d,0xaa,0xc7,0xe4,0x01,0x1e,0x3b,0x58,
0x75,0x92,0xaf,0xcc,0xe9,0x06,0x23,0x40,0x5d,0x7a,0x97,0xb4,
0xd1,0xee,0x0b,0x28,0x45,0x62,0x7f,0x9c,0xb9,0xd6,0xf3,0x10,
0x2d,0x4a,0x67,0x84,0xa1,0xbe,0xdb,0xf8,0x15,0x32,0x4f,0x6c,
0x89,0xa6,0xc3,0xe0,0xfd,0x1a,0x37,0x54,0x71,0x8e,0xab,0xc8,
0xe5,0x02,0x1f,0x3c,0x59,0x76,0x93,0xb0,0xcd,0xea,0x07,0x24,
0x41,0x5e,0x7b,0x98,0xb5,0xd2,0xef,0x0c,0x29,0x46,0x63,0x80,
0x9d,0xba,0xd7,0xf4,0x11,0x2e,0x4b,0x68,0x85,0xa2,0xbf,0xdc,
0xf9,0x16,0x33,0x50,0x6d,0x8a,0xa7,0xc4,0xe1,0xfe,0x1b,0x38,
0x55,0x72,0x8f,0xac,0xc9,0xe6,0x03,0x20,0x3d,0x5a,0x77,0x94,
0xb1,0xce,0xeb,0x08,0x25,0x42,0x5f,0x7c,0x99,0xb6,0xd3,0xf0,
0x0d,0x2a,0x47,0x64,0x81,0x9e,0xbb,0xd8,0xf5,0x12,0x2f,0x4c,
0x69,0x86,0xa3,0xc0,0xdd,0xfa,0x17,0x34,0x51,0x6e,0x8b,0xa8,
0xc5,0xe2,0xff,0x1c,0x39,0x56,0x73,0x90,0xad,0xca,0xe7,0x04,
0x21,0x3e,0x5b,0x78,0x95,0xb2,0xcf,0xec,0x09,0x26,0x43,0x60,
0x7d,0x9a,0xb7,0xd4,0xf1,0x0e,0x2b,0x48,0x65,0x82,0x9f,0xbc,
0xd9,0xf6,0x13,0x30,0x4d,0x6a,0x87,0xa4,0xc1,0xde,0xfb,0x18,
0x35,0x52,0x6f,0x8c,0xa9,0xc6,0xe3,0x00,0x1d,0x3a,0x57,0x74,
0x91,0xae,0xcb,0xe8,0x05,0x22,0x3f,0x5c,0x79,0x96,0xb3,0xd0,
0xed,0x0a,0x27,0x44,0x61,0x7e,0x9b,0xb8,0xd5,0xf2,0x0f,0x2c,
0x49,0x66,0x83,0xa0,0xbd,0xda,0xf7,0x14,0x31,0x4e,0x6b,0x88,
0xa5,0xc2,0xdf,0xfc,0x19,0x36,0x53,0x70,0x8d,0xaa,0xc7,0xe4,
0x01,0x1e,0x3b,0x58,0x75,0x92,0xaf,0xcc,0xe9,0x06,0x23,0x40,
0x5d,0x7a,0x97,0xb4,0xd1,0xee,0x0b,0x28,0x45,0x62,0x7f,0x9c,
0xb9,0xd6,0xf3,0x10,0x2d,0x4a,0x67,0x84,0xa1,0xbe,0xdb,0xf8,
0x15,0x32,0x4f,0x6c,0x89,0xa6,0xc3,0xe0,0xfd,0x1a,0x37,0x54,
0x71,0x8e,0xab,0xc8,0xe5,0x02,0x1f,0x3c,0x59,0x76,0x93,0xb0,
0xcd,0xea,0x07,0x24,0x41,0x5e,0x7b,0x98,0xb5,0xd2,0xef,0x0c,
0x29,0x46,0x63,0x80,0x9d,0xba,0xd7,0xf4,0x11,0x2e,0x4b,0x68,
0x85,0xa2,0xbf,0xdc,0xf9,0x16,0x33,0x50,0x6d,0x8a,0xa7,0xc4,
0xe1,0xfe,0x1b,0x38,0x55,0x72,0x8f,0xac,0xc9,0xe6,0x03,0x20,
0x3d,0x5a,0x77,0x94,0xb1,0xce,0xeb,0x08,0x25,0x42,0x5f,0x7c,
0x99,0xb6,0xd3,0xf0,0x0d,0x2a,0x47,0x64,0x81,0x9e,0xbb,0xd8,
0xf5,0x12,0x2f,0x4c,0x69,0x86,0xa3,0xc0,0xdd,0xfa,0x17,0x34,
0x51,0x6e,0x8b,0xa8,0xc5,0xe2,0xff,0x1c,0x39,0x56,0x73,0x90,
0xad,0xca,0xe7,0x04,0x21,0x3e,0x5b,0x78,0x95,0xb2,0xcf,0xec,
0x09,0x26,0x43,0x60,0x7d,0x9a,0xb7,0xd4,0xf1,0x0e,0x2b,0x48,
0x65,0x82,0x9f,0xbc,0xd9,0xf6,0x13,0x30,0x4d,0x6a,0x87,0xa4,
0xc1,0xde,0xfb,0x18,0x35,0x52,0x6f,0x8c,0xa9,0xc6,0xe3,0x00,
0x1d,0x3a,0x57,0x74,0x91,0xae,0xcb,0xe8,0x05,0x22,0x3f,0x5c,
0x79,0x96,0xb3,0xd0,0xed,0x0a,0x27,0x44,0x61,0x7e,0x9b,0xb8,
0xd5,0xf2,0x0f,0x2c,0x49,0x66,0x83,0xa0,0xbd,0xda,0xf7,0x14,
0x31,0x4e,0x6b,0x88,0xa5,0xc2,0xdf,0xfc,0x19,0x36,0x53,0x70,
0x8d,0xaa,0xc7,0xe4,0x01,0x1e,0x3b,0x58,0x75,0x92,0xaf,0xcc,
0xe9,0x06,0x23,0x40,0x5d,0x7a,0x97,0xb4,0xd1,0xee,0x0b,0x28,
0x45,0x62,0x7f,0x9c,0xb9,0xd6,0xf3,0x10,0x2d,0x4a,0x67,0x84,
0xa1,0xbe,0xdb,0xf8,0x15,0x32,0x4f,0x6c,0x89,0xa6,0xc3,0xe0,
0xfd,0x1a,0x37,0x54,0x71,0x8e,0xab,0xc8,0xe5,0x02,0x1f,0x3c,
0x59,0x76,0x93,0xb0,0xcd,0xea,0x07,0x24,0x41,0x5e,0x7b,0x98,
0xb5,0xd2,0xef,0x0c,0x29,0x46,0x63,0x80,0x9d,0xba,0xd7,0xf4,
0x11,0x2e,0x4b,0x68,0x85,0xa2,0xbf,0xdc,0xf9,0x16,0x33,0x50,
0x6d,0x8a,0xa7,0xc4,0xe1,0xfe,0x1b,0x38,0x55,0x72,0x8f,0xac,
0xc9,0xe6,0x03,0x20,0x3d,0x5a,0x77,0x94,0xb1,0xce,0xeb,0x08,
0x25,0x42,0x5f,0x7c,0x99,0xb6,0xd3,0xf0,0x0d,0x2a,0x47,0x64,
0x81,0x9e,0xbb,0xd8,0xf5,0x12,0x2f,0x4c,0x69,0x86,0xa3,0xc0,
0xdd,0xfa,0x17,0x34,0x51,0x6e,0x8b,0xa8,0xc5,0xe2,0xff,0x1c,
0x39,0x56,0x73,0x90,0xad,0xca,0xe7,0x04,0x21,0x3e,0x5b,0x78,
0x95,0xb2,0xcf,0xec,0x09,0x26,0x43,0x60,0x7d,0x9a,0xb7,0xd4,
0xf1,0x0e,0x2b,0x48,0x65,0x82,0x9f,0xbc,0xd9,0xf6,0x13,0x30,
0x4d,0x6a,0x87,0xa4,0xc1,0xde,0xfb,0x18,0x35,0x52,0x6f,0x8c,
0xa9,0xc6,0xe3,0x00,0x1d,0x3a,0x57,0x74,0x91,0xae,0xcb,0xe8,
0x05,0x22,0x3f,0x5c,0x79,0x96,0xb3,0xd0,0xed,0x0a,0x27,0x44,
0x61,0x7e,0x9b,0xb8,0xd5,0xf2,0x0f,0x2c,0x49,0x66,0x83,0xa0,
};
static const unsigned char xd_pat[85] = {
0xd6,0xc3,0xc4,0x00,0x00,0x01,0xa4,0x7e,0x00,0x4b,0xae,0x70,
0x00,0x29,0x14,0x08,0x58,0x5f,0x66,0x6d,0x74,0x7b,0x82,0x89,
0x90,0x97,0x9e,0xa5,0xac,0xb3,0xba,0xc1,0xc8,0xcf,0xd6,0xdd,
0xe4,0xeb,0xf2,0xf9,0x00,0x07,0x0e,0x15,0x1c,0x23,0x2a,0x31,
0x38,0x3f,0x46,0x4d,0x54,0x5b,0x62,0x69,0x3c,0x13,0x87,0x68,
0x01,0x28,0x13,0x87,0x40,0x43,0x97,0x38,0x43,0x81,0x48,0x00,
0x84,0x58,0x63,0x81,0x48,0x00,0x8a,0x10,0x83,0x36,0x78,0x82,
0x20,
};
static const unsigned char xd_tgt[6000] = {
0x0d,0x2a,0x47,0x64,0x81,0x9e,0xbb,0xd8,0xf5,0x12,0x2f,0x4c,
0x69,0x86,0xa3,0xc0,0xdd,0xfa,0x17,0x34,0x51,0x6e,0x8b,0xa8,
0xc5,0xe2,0xff,0x1c,0x39,0x56,0x73,0x90,0xad,0xca,0xe7,0x04,
0x21,0x3e,0x5b,0x78,0x95,0xb2,0xcf,0xec,0x09,0x26,0x43,0x60,
0x7d,0x9a,0xb7,0xd4,0xf1,0x0e,0x2b,0x48,0x65,0x82,0x9f,0xbc,
0xd9,0xf6,0x13,0x30,0x4d,0x6a,0x87,0xa4,0xc1,0xde,0xfb,0x18,
0x35,0x52,0x6f,0x8c,0xa9,0xc6,0xe3,0x00,0x1d,0x3a,0x57,0x74,
0x91,0xae,0xcb,0xe8,0x05,0x22,0x3f,0x5c,0x79,0x96,0xb3,0xd0,
0xed,0x0a,0x27,0x44,0x61,0x7e,0x9b,0xb8,0xd5,0xf2,0x0f,0x2c,
0x49,0x66,0x83,0xa0,0xbd,0xda,0xf7,0x14,0x31,0x4e,0x6b,0x88,
0xa5,0xc2,0xdf,0xfc,0x19,0x36,0x53,0x70,0x8d,0xaa,0xc7,0xe4,
0x01,0x1e,0x3b,0x58,0x75,0x92,0xaf,0xcc,0xe9,0x06,0x23,0x40,
0x5d,0x7a,0x97,0xb4,0xd1,0xee,0x0b,0x28,0x45,0x62,0x7f,0x9c,
0xb9,0xd6,0xf3,0x10,0x2d,0x4a,0x67,0x84,0xa1,0xbe,0xdb,0xf8,
0x15,0x32,0x4f,0x6c,0x89,0xa6,0xc3,0xe0,0xfd,0x1a,0x37,0x54,
0x71,0x8e,0xab,0xc8,0xe5,0x02,0x1f,0x3c,0x59,0x76,0x93,0xb0,
0xcd,0xea,0x07,0x24,0x41,0x5e,0x7b,0x98,0xb5,0xd2,0xef,0x0c,
0x29,0x46,0x63,0x80,0x9d,0xba,0xd7,0xf4,0x11,0x2e,0x4b,0x68,
0x85,0xa2,0xbf,0xdc,0xf9,0x16,0x33,0x50,0x6d,0x8a,0xa7,0xc4,
0xe1,0xfe,0x1b,0x38,0x55,0x72,0x8f,0xac,0xc9,0xe6,0x03,0x20,
0x3d,0x5a,0x77,0x94,0xb1,0xce,0xeb,0x08,0x25,0x42,0x5f,0x7c,
0x99,0xb6,0xd3,0xf0,0x0d,0x2a,0x47,0x64,0x81,0x9e,0xbb,0xd8,
0xf5,0x12,0x2f,0x4c,0x69,0x86,0xa3,0xc0,0xdd,0xfa,0x17,0x34,
0x51,0x6e,0x8b,0xa8,0xc5,0xe2,0xff,0x1c,0x39,0x56,0x73,0x90,
0xad,0xca,0xe7,0x04,0x21,0x3e,0x5b,0x78,0x95,0xb2,0xcf,0xec,
0x09,0x26,0x43,0x60,0x7d,0x9a,0xb7,0xd4,0xf1,0x0e,0x2b,0x48,
0x65,0x82,0x9f,0xbc,0xd9,0xf6,0x13,0x30,0x4d,0x6a,0x87,0xa4,
0xc1,0xde,0xfb,0x18,0x35,0x52,0x6f,0x8c,0xa9,0xc6,0xe3,0x00,
0x1d,0x3a,0x57,0x74,0x91,0xae,0xcb,0xe8,0x05,0x22,0x3f,0x5c,
0x79,0x96,0xb3,0xd0,0xed,0x0a,0x27,0x44,0x61,0x7e,0x9b,0xb8,
0xd5,0xf2,0x0f,0x2c,0x49,0x66,0x83,0xa0,0xbd,0xda,0xf7,0x14,
0x31,0x4e,0x6b,0x88,0xa5,0xc2,0xdf,0xfc,0x19,0x36,0x53,0x70,
0x8d,0xaa,0xc7,0xe4,0x01,0x1e,0x3b,0x58,0x75,0x92,0xaf,0xcc,
0xe9,0x06,0x23,0x40,0x5d,0x7a,0x97,0xb4,0xd1,0xee,0x0b,0x28,
0x45,0x62,0x7f,0x9c,0xb9,0xd6,0xf3,0x10,0x2d,0x4a,0x67,0x84,
0xa1,0xbe,0xdb,0xf8,0x15,0x32,0x4f,0x6c,0x89,0xa6,0xc3,0xe0,
0xfd,0x1a,0x37,0x54,0x71,0x8e,0xab,0xc8,0xe5,0x02,0x1f,0x3c,
0x59,0x76,0x93,0xb0,0xcd,0xea,0x07,0x24,0x41,0x5e,0x7b,0x98,
0xb5,0xd2,0xef,0x0c,0x29,0x46,0x63,0x80,0x9d,0xba,0xd7,0xf4,
0x11,0x2e,0x4b,0x68,0x85,0xa2,0xbf,0xdc,0xf9,0x16,0x33,0x50,
0x6d,0x8a,0xa7,0xc4,0xe1,0xfe,0x1b,0x38,0x55,0x72,0x8f,0xac,
0xc9,0xe6,0x03,0x20,0x3d,0x5a,0x77,0x94,0xb1,0xce,0xeb,0x08,
0x25,0x42,0x5f,0x7c,0x99,0xb6,0xd3,0xf0,0x0d,0x2a,0x47,0x64,
0x81,0x9e,0xbb,0xd8,0xf5,0x12,0x2f,0x4c,0x69,0x86,0xa3,0xc0,
0xdd,0xfa,0x17,0x34,0x51,0x6e,0x8b,0xa8,0xc5,0xe2,0xff,0x1c,
0x39,0x56,0x73,0x90,0xad,0xca,0xe7,0x04,0x21,0x3e,0x5b,0x78,
0x95,0xb2,0xcf,0xec,0x09,0x26,0x43,0x60,0x7d,0x9a,0xb7,0xd4,
0xf1,0x0e,0x2b,0x48,0x65,0x82,0x9f,0xbc,0xd9,0xf6,0x13,0x30,
0x4d,0x6a,0x87,0xa4,0xc1,0xde,0xfb,0x18,0x35,0x52,0x6f,0x8c,
0xa9,0xc6,0xe3,0x00,0x1d,0x3a,0x57,0x74,0x91,0xae,0xcb,0xe8,
0x05,0x22,0x3f,0x5c,0x79,0x96,0xb3,0xd0,0xed,0x0a,0x27,0x44,
0x61,0x7e,0x9b,0xb8,0xd5,0xf2,0x0f,0x2c,0x49,0x66,0x83,0xa0,
0xbd,0xda,0xf7,0x14,0x31,0x4e,0x6b,0x88,0xa5,0xc2,0xdf,0xfc,
0x19,0x36,0x53,0x70,0x8d,0xaa,0xc7,0xe4,0x01,0x1e,0x3b,0x58,
0x75,0x92,0xaf,0xcc,0xe9,0x06,0x23,0x40,0x5d,0x7a,0x97,0xb4,
0xd1,0xee,0x0b,0x28,0x45,0x62,0x7f,0x9c,0xb9,0xd6,0xf3,0x10,
0x2d,0x4a,0x67,0x84,0xa1,0xbe,0xdb,0xf8,0x15,0x32,0x4f,0x6c,
0x89,0xa6,0xc3,0xe0,0xfd,0x1a,0x37,0x54,0x71,0x8e,0xab,0xc8,
0xe5,0x02,0x1f,0x3c,0x59,0x76,0x93,0xb0,0xcd,0xea,0x07,0x24,
0x41,0x5e,0x7b,0x98,0xb5,0xd2,0xef,0x0c,0x29,0x46,0x63,0x80,
0x9d,0xba,0xd7,0xf4,0x11,0x2e,0x4b,0x68,0x85,0xa2,0xbf,0xdc,
0xf9,0x16,0x33,0x50,0x6d,0x8a,0xa7,0xc4,0xe1,0xfe,0x1b,0x38,
0x55,0x72,0x8f,0xac,0xc9,0xe6,0x03,0x20,0x3d,0x5a,0x77,0x94,
0xb1,0xce,0xeb,0x08,0x25,0x42,0x5f,0x7c,0x99,0xb6,0xd3,0xf0,
0x0d,0x2a,0x47,0x64,0x81,0x9e,0xbb,0xd8,0xf5,0x12,0x2f,0x4c,
0x69,0x86,0xa3,0xc0,0xdd,0xfa,0x17,0x34,0x51,0x6e,0x8b,0xa8,
0xc5,0xe2,0xff,0x1c,0x39,0x56,0x73,0x90,0xad,0xca,0xe7,0x04,
0x21,0x3e,0x5b,0x78,0x95,0xb2,0xcf,0xec,0x09,0x26,0x43,0x60,
0x7d,0x9a,0xb7,0xd4,0xf1,0x0e,0x2b,0x48,0x65,0x82,0x9f,0xbc,
0xd9,0xf6,0x13,0x30,0x4d,0x6a,0x87,0xa4,0xc1,0xde,0xfb,0x18,
0x35,0x52,0x6f,0x8c,0xa9,0xc6,0xe3,0x00,0x1d,0x3a,0x57,0x74,
0x91,0xae,0xcb,0xe8,0x05,0x22,0x3f,0x5c,0x79,0x96,0xb3,0xd0,
0xed,0x0a,0x27,0x44,0x61,0x7e,0x9b,0xb8,0xd5,0xf2,0x0f,0x2c,
0x49,0x66,0x83,0xa0,0xbd,0xda,0xf7,0x14,0x31,0x4e,0x6b,0x88,
0xa5,0xc2,0xdf,0xfc,0x19,0x36,0x53,0x70,0x8d,0xaa,0xc7,0xe4,
0x01,0x1e,0x3b,0x58,0x75,0x92,0xaf,0xcc,0xe9,0x06,0x23,0x40,
0x5d,0x7a,0x97,0xb4,0xd1,0xee,0x0b,0x28,0x45,0x62,0x7f,0x9c,
0xb9,0xd6,0xf3,0x10,0x2d,0x4a,0x67,0x84,0xa1,0xbe,0xdb,0xf8,
0x15,0x32,0x4f,0x6c,0x89,0xa6,0xc3,0xe0,0xfd,0x1a,0x37,0x54,
0x71,0x8e,0xab,0xc8,0xe5,0x02,0x1f,0x3c,0x59,0x76,0x93,0xb0,
0xcd,0xea,0x07,0x24,0x41,0x5e,0x7b,0x98,0xb5,0xd2,0xef,0x0c,
0x29,0x46,0x63,0x80,0x9d,0xba,0xd7,0xf4,0x11,0x2e,0x4b,0x68,
0x85,0xa2,0xbf,0xdc,0xf9,0x16,0x33,0x50,0x6d,0x8a,0xa7,0xc4,
0xe1,0xfe,0x1b,0x38,0x58,0x5f,0x66,0x6d,0x74,0x7b,0x82,0x89,
0x90,0x97,0x9e,0xa5,0xac,0xb3,0xba,0xc1,0xc8,0xcf,0xd6,0xdd,
0xe4,0xeb,0xf2,0xf9,0x00,0x07,0x0e,0x15,0x1c,0x23,0x2a,0x31,
0x38,0x3f,0x46,0x4d,0x54,0x5b,0x62,0x69,0xdd,0xfa,0x17,0x34,
0x51,0x6e,0x8b,0xa8,0xc5,0xe2,0xff,0x1c,0x39,0x56,0x73,0x90,
0xad,0xca,0xe7,0x04,0x21,0x3e,0x5b,0x78,0x95,0xb2,0xcf,0xec,
0x09,0x26,0x43,0x60,0x7d,0x9a,0xb7,0xd4,0xf1,0x0e,0x2b,0x48,
0x65,0x82,0x9f,0xbc,0xd9,0xf6,0x13,0x30,0x4d,0x6a,0x87,0xa4,
0xc1,0xde,0xfb,0x18,0x35,0x52,0x6f,0x8c,0xa9,0xc6,0xe3,0x00,
0x1d,0x3a,0x57,0x74,0x91,0xae,0xcb,0xe8,0x05,0x22,0x3f,0x5c,
0x79,0x96,0xb3,0xd0,0xed,0x0a,0x27,0x44,0x61,0x7e,0x9b,0xb8,
0xd5,0xf2,0x0f,0x2c,0x49,0x66,0x83,0xa0,0xbd,0xda,0xf7,0x14,
0x31,0x4e,0x6b,0x88,0xa5,0xc2,0xdf,0xfc,0x19,0x36,0x53,0x70,
0x8d,0xaa,0xc7,0xe4,0x01,0x1e,0x3b,0x58,0x75,0x92,0xaf,0xcc,
0xe9,0x06,0x23,0x40,0x5d,0x7a,0x97,0xb4,0xd1,0xee,0x0b,0x28,
0x45,0x62,0x7f,0x9c,0xb9,0xd6,0xf3,0x10,0x2d,0x4a,0x67,0x84,
0xa1,0xbe,0xdb,0xf8,0x15,0x32,0x4f,0x6c,0x89,0xa6,0xc3,0xe0,
0xfd,0x1a,0x37,0x54,0x71,0x8e,0xab,0xc8,0xe5,0x02,0x1f,0x3c,
0x59,0x76,0x93,0xb0,0xcd,0xea,0x07,0x24,0x41,0x5e,0x7b,0x98,
0xb5,0xd2,0xef,0x0c,0x29,0x46,0x63,0x80,0x9d,0xba,0xd7,0xf4,
0x11,0x2e,0x4b,0x68,0x85,0xa2,0xbf,0xdc,0xf9,0x16,0x33,0x50,
0x6d,0x8a,0xa7,0xc4,0xe1,0xfe,0x1b,0x38,0x55,0x72,0x8f,0xac,
0xc9,0xe6,0x03,0x20,0x3d,0x5a,0x77,0x94,0xb1,0xce,0xeb,0x08,
0x25,0x42,0x5f,0x7c,0x99,0xb6,0xd3,0xf0,0x0d,0x2a,0x47,0x64,
0x81,0x9e,0xbb,0xd8,0xf5,0x12,0x2f,0x4c,0x69,0x86,0xa3,0xc0,
0xdd,0xfa,0x17,0x34,0x51,0x6e,0x8b,0xa8,0xc5,0xe2,0xff,0x1c,
0x39,0x56,0x73,0x90,0xad,0xca,0xe7,0x04,0x21,0x3e,0x5b,0x78,
0x95,0xb2,0xcf,0xec,0x09,0x26,0x43,0x60,0x7d,0x9a,0xb7,0xd4,
0xf1,0x0e,0x2b,0x48,0x65,0x82,0x9f,0xbc,0xd9,0xf6,0x13,0x30,
0x4d,0x6a,0x87,0xa4,0xc1,0xde,0xfb,0x18,0x35,0x52,0x6f,0x8c,
0xa9,0xc6,0xe3,0x00,0x1d,0x3a,0x57,0x74,0x91,0xae,0xcb,0xe8,
0x05,0x22,0x3f,0x5c,0x79,0x96,0xb3,0xd0,0xed,0x0a,0x27,0x44,
0x61,0x7e,0x9b,0xb8,0xd5,0xf2,0x0f,0x2c,0x49,0x66,0x83,0xa0,
0xbd,0xda,0xf7,0x14,0x31,0x4e,0x6b,0x88,0xa5,0xc2,0xdf,0xfc,
0x19,0x36,0x53,0x70,0x8d,0xaa,0xc7,0xe4,0x01,0x1e,0x3b,0x58,
0x75,0x92,0xaf,0xcc,0xe9,0x06,0x23,0x40,0x5d,0x7a,0x97,0xb4,
0xd1,0xee,0x0b,0x28,0x45,0x62,0x7f,0x9c,0xb9,0xd6,0xf3,0x10,
0x2d,0x4a,0x67,0x84,0xa1,0xbe,0xdb,0xf8,0x15,0x32,0x4f,0x6c,
0x89,0xa6,0xc3,0xe0,0xfd,0x1a,0x37,0x54,0x71,0x8e,0xab,0xc8,
0xe5,0x02,0x1f,0x3c,0x59,0x76,0x93,0xb0,0xcd,0xea,0x07,0x24,
0x41,0x5e,0x7b,0x98,0xb5,0xd2,0xef,0x0c,0x29,0x46,0x63,0x80,
0x9d,0xba,0xd7,0xf4,0x11,0x2e,0x4b,0x68,0x85,0xa2,0xbf,0xdc,
0xf9,0x16,0x33,0x50,0x6d,0x8a,0xa7,0xc4,0xe1,0xfe,0x1b,0x38,
0x55,0x72,0x8f,0xac,0xc9,0xe6,0x03,0x20,0x3d,0x5a,0x77,0x94,
0xb1,0xce,0xeb,0x08,0x25,0x42,0x5f,0x7c,0x99,0xb6,0xd3,0xf0,
0x0d,0x2a,0x47,0x64,0x81,0x9e,0xbb,0xd8,0xf5,0x12,0x2f,0x4c,
0x69,0x86,0xa3,0xc0,0xdd,0xfa,0x17,0x34,0x51,0x6e,0x8b,0xa8,
0xc5,0xe2,0xff,0x1c,0x39,0x56,0x73,0x90,0xad,0xca,0xe7,0x04,
0x21,0x3e,0x5b,0x78,0x95,0xb2,0xcf,0xec,0x09,0x26,0x43,0x60,
0x7d,0x9a,0xb7,0xd4,0xf1,0x0e,0x2b,0x48,0x65,0x82,0x9f,0xbc,
0xd9,0xf6,0x13,0x30,0x4d,0x6a,0x87,0xa4,0xc1,0xde,0xfb,0x18,
0x35,0x52,0x6f,0x8c,0xa9,0xc6,0xe3,0x00,0x1d,0x3a,0x57,0x74,
0x91,0xae,0xcb,0xe8,0x05,0x22,0x3f,0x5c,0x79,0x96,0xb3,0xd0,
0xed,0x0a,0x27,0x44,0x61,0x7e,0x9b,0xb8,0xd5,0xf2,0x0f,0x2c,
0x49,0x66,0x83,0xa0,0xbd,0xda,0xf7,0x14,0x31,0x4e,0x6b,0x88,
0xa5,0xc2,0xdf,0xfc,0x19,0x36,0x53,0x70,0x8d,0xaa,0xc7,0xe4,
0x01,0x1e,0x3b,0x58,0x75,0x92,0xaf,0xcc,0xe9,0x06,0x23,0x40,
0x5d,0x7a,0x97,0xb4,0xd1,0xee,0x0b,0x28,0x45,0x62,0x7f,0x9c,
0xb9,0xd6,0xf3,0x10,0x2d,0x4a,0x67,0x84,0xa1,0xbe,0xdb,0xf8,
0x15,0x32,0x4f,0x6c,0x89,0xa6,0xc3,0xe0,0xfd,0x1a,0x37,0x54,
0x71,0x8e,0xab,0xc8,0xe5,0x02,0x1f,0x3c,0x59,0x76,0x93,0xb0,
0xcd,0xea,0x07,0x24,0x41,0x5e,0x7b,0x98,0xb5,0xd2,0xef,0x0c,
0x29,0x46,0x63,0x80,0x9d,0xba,0xd7,0xf4,0x11,0x2e,0x4b,0x68,
0x85,0xa2,0xbf,0xdc,0xf9,0x16,0x33,0x50,0x6d,0x8a,0xa7,0xc4,
0xe1,0xfe,0x1b,0x38,0x55,0x72,0x8f,0xac,0xc9,0xe6,0x03,0x20,
0x3d,0x5a,0x77,0x94,0xb1,0xce,0xeb,0x08,0x25,0x42,0x5f,0x7c,
0x99,0xb6,0xd3,0xf0,0x0d,0x2a,0x47,0x64,0x81,0x9e,0xbb,0xd8,
0xf5,0x12,0x2f,0x4c,0x69,0x86,0xa3,0xc0,0xdd,0xfa,0x17,0x34,
0x51,0x6e,0x8b,0xa8,0xc5,0xe2,0xff,0x1c,0x39,0x56,0x73,0x90,
0xad,0xca,0xe7,0x04,0x21,0x3e,0x5b,0x78,0x95,0xb2,0xcf,0xec,
0x09,0x26,0x43,0x60,0x7d,0x9a,0xb7,0xd4,0xf1,0x0e,0x2b,0x48,
0x65,0x82,0x9f,0xbc,0xd9,0xf6,0x13,0x30,0x4d,0x6a,0x87,0xa4,
0xc1,0xde,0xfb,0x18,0x35,0x52,0x6f,0x8c,0xa9,0xc6,0xe3,0x00,
0x1d,0x3a,0x57,0x74,0x91,0xae,0xcb,0xe8,0x05,0x22,0x3f,0x5c,
0x79,0x96,0xb3,0xd0,0xed,0x0a,0x27,0x44,0x61,0x7e,0x9b,0xb8,
0xd5,0xf2,0x0f,0x2c,0x49,0x66,0x83,0xa0,0xbd,0xda,0xf7,0x14,
0x31,0x4e,0x6b,0x88,0xa5,0xc2,0xdf,0xfc,0x19,0x36,0x53,0x70,
0x8d,0xaa,0xc7,0xe4,0x01,0x1e,0x3b,0x58,0x75,0x92,0xaf,0xcc,
0xe9,0x06,0x23,0x40,0x5d,0x7a,0x97,0xb4,0xd1,0xee,0x0b,0x28,
0x45,0x62,0x7f,0x9c,0xb9,0xd6,0xf3,0x10,0x2d,0x4a,0x67,0x84,
0xa1,0xbe,0xdb,0xf8,0x15,0x32,0x4f,0x6c,0x89,0xa6,0xc3,0xe0,
0xfd,0x1a,0x37,0x54,0x71,0x8e,0xab,0xc8,0xe5,0x02,0x1f,0x3c,
0x59,0x76,0x93,0xb0,0xcd,0xea,0x07,0x24,0x41,0x5e,0x7b,0x98,
0xb5,0xd2,0xef,0x0c,0x29,0x46,0x63,0x80,0x7b,0x98,0xb5,0xd2,
0xef,0x0c,0x29,0x46,0x63,0x80,0x9d,0xba,0xd7,0xf4,0x11,0x2e,
0x4b,0x68,0x85,0xa2,0xbf,0xdc,0xf9,0x16,0x33,0x50,0x6d,0x8a,
0xa7,0xc4,0xe1,0xfe,0x1b,0x38,0x55,0x72,0x8f,0xac,0xc9,0xe6,
0x03,0x20,0x3d,0x5a,0x77,0x94,0xb1,0xce,0xeb,0x08,0x25,0x42,
0x5f,0x7c,0x99,0xb6,0xd3,0xf0,0x0d,0x2a,0x47,0x64,0x81,0x9e,
0xbb,0xd8,0xf5,0x12,0x2f,0x4c,0x69,0x86,0xa3,0xc0,0xdd,0xfa,
0x17,0x34,0x51,0x6e,0x8b,0xa8,0xc5,0xe2,0xff,0x1c,0x39,0x56,
0x73,0x90,0xad,0xca,0xe7,0x04,0x21,0x3e,0x5b,0x78,0x95,0xb2,
0xcf,0xec,0x09,0x26,0x43,0x60,0x7d,0x9a,0xb7,0xd4,0xf1,0x0e,
0x2b,0x48,0x65,0x82,0x9f,0xbc,0xd9,0xf6,0x13,0x30,0x4d,0x6a,
0x87,0xa4,0xc1,0xde,0xfb,0x18,0x35,0x52,0x6f,0x8c,0xa9,0xc6,
0xe3,0x00,0x1d,0x3a,0x57,0x74,0x91,0xae,0xcb,0xe8,0x05,0x22,
0x3f,0x5c,0x79,0x96,0xb3,0xd0,0xed,0x0a,0x27,0x44,0x61,0x7e,
0x9b,0xb8,0xd5,0xf2,0x0f,0x2c,0x49,0x66,0x83,0xa0,0xbd,0xda,
0xf7,0x14,0x31,0x4e,0x6b,0x88,0xa5,0xc2,0xdf,0xfc,0x19,0x36,
0x53,0x70,0x8d,0xaa,0xc7,0xe4,0x01,0x1e,0x3b,0x58,0x75,0x92,
0xaf,0xcc,0xe9,0x06,0x23,0x40,0x5d,0x7a,0x97,0xb4,0xd1,0xee,
0x0b,0x28,0x45,0x62,0x7f,0x9c,0xb9,0xd6,0xf3,0x10,0x2d,0x4a,
0x67,0x84,0xa1,0xbe,0xdb,0xf8,0x15,0x32,0x4f,0x6c,0x89,0xa6,
0xc3,0xe0,0xfd,0x1a,0x37,0x54,0x71,0x8e,0xab,0xc8,0xe5,0x02,
0x1f,0x3c,0x59,0x76,0x93,0xb0,0xcd,0xea,0x07,0x24,0x41,0x5e,
0x7b,0x98,0xb5,0xd2,0xef,0x0c,0x29,0x46,0x63,0x80,0x9d,0xba,
0xd7,0xf4,0x11,0x2e,0x4b,0x68,0x85,0xa2,0xbf,0xdc,0xf9,0x16,
0x33,0x50,0x6d,0x8a,0xa7,0xc4,0xe1,0xfe,0x1b,0x38,0x55,0x72,
0x8f,0xac,0xc9,0xe6,0x03,0x20,0x3d,0x5a,0x77,0x94,0xb1,0xce,
0xeb,0x08,0x25,0x42,0x5f,0x7c,0x99,0xb6,0xd3,0xf0,0x0d,0x2a,
0x47,0x64,0x81,0x9e,0xbb,0xd8,0xf5,0x12,0x2f,0x4c,0x69,0x86,
0xa3,0xc0,0xdd,0xfa,0x17,0x34,0x51,0x6e,0x8b,0xa8,0xc5,0xe2,
0xff,0x1c,0x39,0x56,0x73,0x90,0xad,0xca,0xe7,0x04,0x21,0x3e,
0x5b,0x78,0x95,0xb2,0xcf,0xec,0x09,0x26,0x43,0x60,0x7d,0x9a,
0xb7,0xd4,0xf1,0x0e,0x2b,0x48,0x65,0x82,0x9f,0xbc,0xd9,0xf6,
0x13,0x30,0x4d,0x6a,0x87,0xa4,0xc1,0xde,0xfb,0x18,0x35,0x52,
0x6f,0x8c,0xa9,0xc6,0xe3,0x00,0x1d,0x3a,0x57,0x74,0x91,0xae,
0xcb,0xe8,0x05,0x22,0x3f,0x5c,0x79,0x96,0xb3,0xd0,0xed,0x0a,
0x27,0x44,0x61,0x7e,0x9b,0xb8,0xd5,0xf2,0x0f,0x2c,0x49,0x66,
0x83,0xa0,0xbd,0xda,0xf7,0x14,0x31,0x4e,0x6b,0x88,0xa5,0xc2,
0xdf,0xfc,0x19,0x36,0x53,0x70,0x8d,0xaa,0xc7,0xe4,0x01,0x1e,
0x3b,0x58,0x75,0x92,0xaf,0xcc,0xe9,0x06,0x23,0x40,0x5d,0x7a,
0x97,0xb4,0xd1,0xee,0x0b,0x28,0x45,0x62,0x7f,0x9c,0xb9,0xd6,
0xf3,0x10,0x2d,0x4a,0x67,0x84,0xa1,0xbe,0xdb,0xf8,0x15,0x32,
0x4f,0x6c,0x89,0xa6,0xc3,0xe0,0xfd,0x1a,0x37,0x54,0x71,0x8e,
0xab,0xc8,0xe5,0x02,0x1f,0x3c,0x59,0x76,0x93,0xb0,0xcd,0xea,
0x07,0x24,0x41,0x5e,0x7b,0x98,0xb5,0xd2,0xef,0x0c,0x29,0x46,
0x63,0x80,0x9d,0xba,0xd7,0xf4,0x11,0x2e,0x4b,0x68,0x85,0xa2,
0xbf,0xdc,0xf9,0x16,0x33,0x50,0x6d,0x8a,0xa7,0xc4,0xe1,0xfe,
0x1b,0x38,0x55,0x72,0x8f,0xac,0xc9,0xe6,0x03,0x20,0x3d,0x5a,
0x77,0x94,0xb1,0xce,0xeb,0x08,0x25,0x42,0x5f,0x7c,0x99,0xb6,
0xd3,0xf0,0x0d,0x2a,0x47,0x64,0x81,0x9e,0xbb,0xd8,0xf5,0x12,
0x2f,0x4c,0x69,0x86,0xa3,0xc0,0xdd,0xfa,0x17,0x34,0x51,0x6e,
0x8b,0xa8,0xc5,0xe2,0xff,0x1c,0x39,0x56,0x73,0x90,0xad,0xca,
0xe7,0x04,0x21,0x3e,0x5b,0x78,0x95,0xb2,0xcf,0xec,0x09,0x26,
0x43,0x60,0x7d,0x9a,0xb7,0xd4,0xf1,0x0e,0x2b,0x48,0x65,0x82,
0x9f,0xbc,0xd9,0xf6,0x13,0x30,0x4d,0x6a,0x87,0xa4,0xc1,0xde,
0xfb,0x18,0x35,0x52,0x6f,0x8c,0xa9,0xc6,0xe3,0x00,0x1d,0x3a,
0x57,0x74,0x91,0xae,0xcb,0xe8,0x05,0x22,0x3f,0x5c,0x79,0x96,
0xb3,0xd0,0xed,0x0a,0x27,0x44,0x61,0x7e,0x9b,0xb8,0xd5,0xf2,
0x0f,0x2c,0x49,0x66,0x83,0xa0,0xbd,0xda,0xf7,0x14,0x31,0x4e,
0x6b,0x88,0xa5,0xc2,0xdf,0xfc,0x19,0x36,0x53,0x70,0x8d,0xaa,
0xc7,0xe4,0x01,0x1e,0x3b,0x58,0x75,0x92,0xaf,0xcc,0xe9,0x06,
0x23,0x40,0x5d,0x7a,0x97,0xb4,0xd1,0xee,0x0b,0x28,0x45,0x62,
0x7f,0x9c,0xb9,0xd6,0xf3,0x10,0x2d,0x4a,0x67,0x84,0xa1,0xbe,
0xdb,0xf8,0x15,0x32,0x4f,0x6c,0x89,0xa6,0xc3,0xe0,0xfd,0x1a,
0x37,0x54,0x71,0x8e,0xab,0xc8,0xe5,0x02,0x1f,0x3c,0x59,0x76,
0x93,0xb0,0xcd,0xea,0x07,0x24,0x41,0x5e,0x7b,0x98,0xb5,0xd2,
0xef,0x0c,0x29,0x46,0x63,0x80,0x9d,0xba,0xd7,0xf4,0x11,0x2e,
0x4b,0x68,0x85,0xa2,0xbf,0xdc,0xf9,0x16,0x33,0x50,0x6d,0x8a,
0xa7,0xc4,0xe1,0xfe,0x1b,0x38,0x55,0x72,0x8f,0xac,0xc9,0xe6,
0x03,0x20,0x3d,0x5a,0x77,0x94,0xb1,0xce,0xeb,0x08,0x25,0x42,
0x5f,0x7c,0x99,0xb6,0xd3,0xf0,0x0d,0x2a,0x47,0x64,0x81,0x9e,
0xbb,0xd8,0xf5,0x12,0x2f,0x4c,0x69,0x86,0xa3,0xc0,0xdd,0xfa,
0x17,0x34,0x51,0x6e,0x8b,0xa8,0xc5,0xe2,0xff,0x1c,0x39,0x56,
0x73,0x90,0xad,0xca,0xe7,0x04,0x21,0x3e,0x5b,0x78,0x95,0xb2,
0xcf,0xec,0x09,0x26,0x43,0x60,0x7d,0x9a,0xb7,0xd4,0xf1,0x0e,
0x2b,0x48,0x65,0x82,0x9f,0xbc,0xd9,0xf6,0x13,0x30,0x4d,0x6a,
0x87,0xa4,0xc1,0xde,0xfb,0x18,0x35,0x52,0x6f,0x8c,0xa9,0xc6,
0xe3,0x00,0x1d,0x3a,0x57,0x74,0x91,0xae,0xcb,0xe8,0x05,0x22,
0x3f,0x5c,0x79,0x96,0xb3,0xd0,0xed,0x0a,0x27,0x44,0x61,0x7e,
0x9b,0xb8,0xd5,0xf2,0x0f,0x2c,0x49,0x66,0x83,0xa0,0xbd,0xda,
0xf7,0x14,0x31,0x4e,0x6b,0x88,0xa5,0xc2,0xdf,0xfc,0x19,0x36,
0x53,0x70,0x8d,0xaa,0xc7,0xe4,0x01,0x1e,0x3b,0x58,0x75,0x92,
0xaf,0xcc,0xe9,0x06,0x23,0x40,0x5d,0x7a,0x97,0xb4,0xd1,0xee,
0x0b,0x28,0x45,0x62,0x7f,0x9c,0xb9,0xd6,0xf3,0x10,0x2d,0x4a,
0x67,0x84,0xa1,0xbe,0xdb,0xf8,0x15,0x32,0x4f,0x6c,0x89,0xa6,
0xc3,0xe0,0xfd,0x1a,0x37,0x54,0x71,0x8e,0xab,0xc8,0xe5,0x02,
0x1f,0x3c,0x59,0x76,0x93,0xb0,0xcd,0xea,0x07,0x24,0x41,0x5e,
0x7b,0x98,0xb5,0xd2,0xef,0x0c,0x29,0x46,0x63,0x80,0x9d,0xba,
0xd7,0xf4,0x11,0x2e,0x4b,0x68,0x85,0xa2,0xbf,0xdc,0xf9,0x16,
0x33,0x50,0x6d,0x8a,0xa7,0xc4,0xe1,0xfe,0x1b,0x38,0x55,0x72,
0x8f,0xac,0xc9,0xe6,0x03,0x20,0x3d,0x5a,0x77,0x94,0xb1,0xce,
0xeb,0x08,0x25,0x42,0x5f,0x7c,0x99,0xb6,0xd3,0xf0,0x0d,0x2a,
0x47,0x64,0x81,0x9e,0xbb,0xd8,0xf5,0x12,0x2f,0x4c,0x69,0x86,
0xa3,0xc0,0xdd,0xfa,0x17,0x34,0x51,0x6e,0x8b,0xa8,0xc5,0xe2,
0xff,0x1c,0x39,0x56,0x73,0x90,0xad,0xca,0xe7,0x04,0x21,0x3e,
0x5b,0x78,0x95,0xb2,0xcf,0xec,0x09,0x26,0x43,0x60,0x7d,0x9a,
0xb7,0xd4,0xf1,0x0e,0x2b,0x48,0x65,0x82,0x9f,0xbc,0xd9,0xf6,
0x13,0x30,0x4d,0x6a,0x87,0xa4,0xc1,0xde,0xfb,0x18,0x35,0x52,
0x6f,0x8c,0xa9,0xc6,0xe3,0x00,0x1d,0x3a,0x57,0x74,0x91,0xae,
0xcb,0xe8,0x05,0x22,0x3f,0x5c,0x79,0x96,0xb3,0xd0,0xed,0x0a,
0x27,0x44,0x61,0x7e,0x9b,0xb8,0xd5,0xf2,0x0f,0x2c,0x49,0x66,
0x83,0xa0,0xbd,0xda,0xf7,0x14,0x31,0x4e,0x6b,0x88,0xa5,0xc2,
0xdf,0xfc,0x19,0x36,0x53,0x70,0x8d,0xaa,0xc7,0xe4,0x01,0x1e,
0x3b,0x58,0x75,0x92,0xaf,0xcc,0xe9,0x06,0x23,0x40,0x5d,0x7a,
0x97,0xb4,0xd1,0xee,0x0b,0x28,0x45,0x62,0x7f,0x9c,0xb9,0xd6,
0xf3,0x10,0x2d,0x4a,0x67,0x84,0xa1,0xbe,0xdb,0xf8,0x15,0x32,
0x4f,0x6c,0x89,0xa6,0xc3,0xe0,0xfd,0x1a,0x37,0x54,0x71,0x8e,
0xab,0xc8,0xe5,0x02,0x1f,0x3c,0x59,0x76,0x93,0xb0,0xcd,0xea,
0x07,0x24,0x41,0x5e,0x7b,0x98,0xb5,0xd2,0xef,0x0c,0x29,0x46,
0x63,0x80,0x9d,0xba,0xd7,0xf4,0x11,0x2e,0x4b,0x68,0x85,0xa2,
0xbf,0xdc,0xf9,0x16,0x33,0x50,0x6d,0x8a,0xa7,0xc4,0xe1,0xfe,
0x1b,0x38,0x55,0x72,0x8f,0xac,0xc9,0xe6,0x03,0x20,0x3d,0x5a,
0x77,0x94,0xb1,0xce,0xeb,0x08,0x25,0x42,0x5f,0x7c,0x99,0xb6,
0xd3,0xf0,0x0d,0x2a,0x47,0x64,0x81,0x9e,0xbb,0xd8,0xf5,0x12,
0x2f,0x4c,0x69,0x86,0xa3,0xc0,0xdd,0xfa,0x17,0x34,0x51,0x6e,
0x8b,0xa8,0xc5,0xe2,0xff,0x1c,0x39,0x56,0x73,0x90,0xad,0xca,
0xe7,0x04,0x21,0x3e,0x5b,0x78,0x95,0xb2,0xcf,0xec,0x09,0x26,
0x43,0x60,0x7d,0x9a,0xb7,0xd4,0xf1,0x0e,0x2b,0x48,0x65,0x82,
0x9f,0xbc,0xd9,0xf6,0x13,0x30,0x4d,0x6a,0x87,0xa4,0xc1,0xde,
0xfb,0x18,0x35,0x52,0x6f,0x8c,0xa9,0xc6,0xe3,0x00,0x1d,0x3a,
0x57,0x74,0x91,0xae,0xcb,0xe8,0x05,0x22,0x3f,0x5c,0x79,0x96,
0xb3,0xd0,0xed,0x0a,0x27,0x44,0x61,0x7e,0x9b,0xb8,0xd5,0xf2,
0x0f,0x2c,0x49,0x66,0x83,0xa0,0xbd,0xda,0xf7,0x14,0x31,0x4e,
0x6b,0x88,0xa5,0xc2,0xdf,0xfc,0x19,0x36,0x53,0x70,0x8d,0xaa,
0xc7,0xe4,0x01,0x1e,0x3b,0x58,0x75,0x92,0xaf,0xcc,0xe9,0x06,
0x23,0x40,0x5d,0x7a,0x97,0xb4,0xd1,0xee,0x0b,0x28,0x45,0x62,
0x7f,0x9c,0xb9,0xd6,0xf3,0x10,0x2d,0x4a,0x67,0x84,0xa1,0xbe,
0xdb,0xf8,0x15,0x32,0x4f,0x6c,0x89,0xa6,0xc3,0xe0,0xfd,0x1a,
0x37,0x54,0x71,0x8e,0xab,0xc8,0xe5,0x02,0x1f,0x3c,0x59,0x76,
0x93,0xb0,0xcd,0xea,0x07,0x24,0x41,0x5e,0x7b,0x98,0xb5,0xd2,
0xef,0x0c,0x29,0x46,0x63,0x80,0x9d,0xba,0xd7,0xf4,0x11,0x2e,
0x4b,0x68,0x85,0xa2,0xbf,0xdc,0xf9,0x16,0x33,0x50,0x6d,0x8a,
0xa7,0xc4,0xe1,0xfe,0x1b,0x38,0x55,0x72,0x8f,0xac,0xc9,0xe6,
0x03,0x20,0x3d,0x5a,0x77,0x94,0xb1,0xce,0xeb,0x08,0x25,0x42,
0x5f,0x7c,0x99,0xb6,0xd3,0xf0,0x0d,0x2a,0x47,0x64,0x81,0x9e,
0xbb,0xd8,0xf5,0x12,0x2f,0x4c,0x69,0x86,0xa3,0xc0,0xdd,0xfa,
0x17,0x34,0x51,0x6e,0x8b,0xa8,0xc5,0xe2,0xff,0x1c,0x39,0x56,
0x73,0x90,0xad,0xca,0xe7,0x04,0x21,0x3e,0x5b,0x78,0x95,0xb2,
0xcf,0xec,0x09,0x26,0x43,0x60,0x7d,0x9a,0xb7,0xd4,0xf1,0x0e,
0x2b,0x48,0x65,0x82,0x9f,0xbc,0xd9,0xf6,0x13,0x30,0x4d,0x6a,
0x87,0xa4,0xc1,0xde,0xfb,0x18,0x35,0x52,0x6f,0x8c,0xa9,0xc6,
0xe3,0x00,0x1d,0x3a,0x57,0x74,0x91,0xae,0xcb,0xe8,0x05,0x22,
0x3f,0x5c,0x79,0x96,0xb3,0xd0,0xed,0x0a,0x27,0x44,0x61,0x7e,
0x9b,0xb8,0xd5,0xf2,0x0f,0x2c,0x49,0x66,0x83,0xa0,0xbd,0xda,
0xf7,0x14,0x31,0x4e,0x6b,0x88,0xa5,0xc2,0xdf,0xfc,0x19,0x36,
0x53,0x70,0x8d,0xaa,0xc7,0xe4,0x01,0x1e,0x3b,0x58,0x75,0x92,
0xaf,0xcc,0xe9,0x06,0x23,0x40,0x5d,0x7a,0x97,0xb4,0xd1,0xee,
0x0b,0x28,0x45,0x62,0x7f,0x9c,0xb9,0xd6,0xf3,0x10,0x2d,0x4a,
0x67,0x84,0xa1,0xbe,0xdb,0xf8,0x15,0x32,0x4f,0x6c,0x89,0xa6,
0xc3,0xe0,0xfd,0x1a,0x37,0x54,0x71,0x8e,0xab,0xc8,0xe5,0x02,
0x1f,0x3c,0x59,0x76,0x93,0xb0,0xcd,0xea,0x07,0x24,0x41,0x5e,
0x7b,0x98,0xb5,0xd2,0xef,0x0c,0x29,0x46,0x63,0x80,0x9d,0xba,
0xd7,0xf4,0x11,0x2e,0x4b,0x68,0x85,0xa2,0xbf,0xdc,0xf9,0x16,
0x33,0x50,0x6d,0x8a,0xa7,0xc4,0xe1,0xfe,0x1b,0x38,0x55,0x72,
0x8f,0xac,0xc9,0xe6,0x03,0x20,0x3d,0x5a,0x77,0x94,0xb1,0xce,
0xeb,0x08,0x25,0x42,0x5f,0x7c,0x99,0xb6,0xd3,0xf0,0x0d,0x2a,
0x47,0x64,0x81,0x9e,0xbb,0xd8,0xf5,0x12,0x2f,0x4c,0x69,0x86,
0xa3,0xc0,0xdd,0xfa,0x17,0x34,0x51,0x6e,0x8b,0xa8,0xc5,0xe2,
0xff,0x1c,0x39,0x56,0x73,0x90,0xad,0xca,0xe7,0x04,0x21,0x3e,
0x5b,0x78,0x95,0xb2,0xcf,0xec,0x09,0x26,0x43,0x60,0x7d,0x9a,
0xb7,0xd4,0xf1,0x0e,0x2b,0x48,0x65,0x82,0x9f,0xbc,0xd9,0xf6,
0x13,0x30,0x4d,0x6a,0x87,0xa4,0xc1,0xde,0xfb,0x18,0x35,0x52,
0x6f,0x8c,0xa9,0xc6,0xe3,0x00,0x1d,0x3a,0x57,0x74,0x91,0xae,
0xcb,0xe8,0x05,0x22,0x3f,0x5c,0x79,0x96,0xb3,0xd0,0xed,0x0a,
0x27,0x44,0x61,0x7e,0x9b,0xb8,0xd5,0xf2,0x0f,0x2c,0x49,0x66,
0x83,0xa0,0xbd,0xda,0xf7,0x14,0x31,0x4e,0x6b,0x88,0xa5,0xc2,
0xdf,0xfc,0x19,0x36,0x53,0x70,0x8d,0xaa,0xc7,0xe4,0x01,0x1e,
0x3b,0x58,0x75,0x92,0xaf,0xcc,0xe9,0x06,0x23,0x40,0x5d,0x7a,
0x97,0xb4,0xd1,0xee,0x0b,0x28,0x45,0x62,0x7f,0x9c,0xb9,0xd6,
0xf3,0x10,0x2d,0x4a,0x67,0x84,0xa1,0xbe,0xdb,0xf8,0x15,0x32,
0x4f,0x6c,0x89,0xa6,0xc3,0xe0,0xfd,0x1a,0x37,0x54,0x71,0x8e,
0xab,0xc8,0xe5,0x02,0x1f,0x3c,0x59,0x76,0x93,0xb0,0xcd,0xea,
0x07,0x24,0x41,0x5e,0x7b,0x98,0xb5,0xd2,0xef,0x0c,0x29,0x46,
0x63,0x80,0x9d,0xba,0xd7,0xf4,0x11,0x2e,0x4b,0x68,0x85,0xa2,
0xbf,0xdc,0xf9,0x16,0x33,0x50,0x6d,0x8a,0xa7,0xc4,0xe1,0xfe,
0x1b,0x38,0x55,0x72,0x8f,0xac,0xc9,0xe6,0x03,0x20,0x3d,0x5a,
0x77,0x94,0xb1,0xce,0xeb,0x08,0x25,0x42,0x5f,0x7c,0x99,0xb6,
0xd3,0xf0,0x0d,0x2a,0x47,0x64,0x81,0x9e,0xbb,0xd8,0xf5,0x12,
0x2f,0x4c,0x69,0x86,0xa3,0xc0,0xdd,0xfa,0x17,0x34,0x51,0x6e,
0x8b,0xa8,0xc5,0xe2,0xff,0x1c,0x39,0x56,0x73,0x90,0xad,0xca,
0xe7,0x04,0x21,0x3e,0x5b,0x78,0x95,0xb2,0xcf,0xec,0x09,0x26,
0x43,0x60,0x7d,0x9a,0xb7,0xd4,0xf1,0x0e,0x2b,0x48,0x65,0x82,
0x9f,0xbc,0xd9,0xf6,0x13,0x30,0x4d,0x6a,0x87,0xa4,0xc1,0xde,
0xfb,0x18,0x35,0x52,0x6f,0x8c,0xa9,0xc6,0xe3,0x00,0x1d,0x3a,
0x57,0x74,0x91,0xae,0xcb,0xe8,0x05,0x22,0x3f,0x5c,0x79,0x96,
0xb3,0xd0,0xed,0x0a,0x27,0x44,0x61,0x7e,0x9b,0xb8,0xd5,0xf2,
0x0f,0x2c,0x49,0x66,0x83,0xa0,0xbd,0xda,0xf7,0x14,0x31,0x4e,
0x6b,0x88,0xa5,0xc2,0xdf,0xfc,0x19,0x36,0x53,0x70,0x8d,0xaa,
0xc7,0xe4,0x01,0x1e,0x3b,0x58,0x75,0x92,0xaf,0xcc,0xe9,0x06,
0x23,0x40,0x5d,0x7a,0x97,0xb4,0xd1,0xee,0x0b,0x28,0x45,0x62,
0x7f,0x9c,0xb9,0xd6,0xf3,0x10,0x2d,0x4a,0x67,0x84,0xa1,0xbe,
0xdb,0xf8,0x15,0x32,0x4f,0x6c,0x89,0xa6,0xc3,0xe0,0xfd,0x1a,
0x37,0x54,0x71,0x8e,0xab,0xc8,0xe5,0x02,0x1f,0x3c,0x59,0x76,
0x93,0xb0,0xcd,0xea,0x07,0x24,0x41,0x5e,0x7b,0x98,0xb5,0xd2,
0xef,0x0c,0x29,0x46,0x63,0x80,0x9d,0xba,0xd7,0xf4,0x11,0x2e,
0x4b,0x68,0x85,0xa2,0xbf,0xdc,0xf9,0x16,0x33,0x50,0x6d,0x8a,
0xa7,0xc4,0xe1,0xfe,0x1b,0x38,0x55,0x72,0x8f,0xac,0xc9,0xe6,
0x03,0x20,0x3d,0x5a,0x77,0x94,0xb1,0xce,0xeb,0x08,0x25,0x42,
0x5f,0x7c,0x99,0xb6,0xd3,0xf0,0x0d,0x2a,0x47,0x64,0x81,0x9e,
0xbb,0xd8,0xf5,0x12,0x2f,0x4c,0x69,0x86,0xa3,0xc0,0xdd,0xfa,
0x17,0x34,0x51,0x6e,0x8b,0xa8,0xc5,0xe2,0xff,0x1c,0x39,0x56,
0x73,0x90,0xad,0xca,0xe7,0x04,0x21,0x3e,0x5b,0x78,0x95,0xb2,
0xcf,0xec,0x09,0x26,0x43,0x60,0x7d,0x9a,0xb7,0xd4,0xf1,0x0e,
0x2b,0x48,0x65,0x82,0x9f,0xbc,0xd9,0xf6,0x13,0x30,0x4d,0x6a,
0x87,0xa4,0xc1,0xde,0xfb,0x18,0x35,0x52,0x6f,0x8c,0xa9,0xc6,
0xe3,0x00,0x1d,0x3a,0x57,0x74,0x91,0xae,0xcb,0xe8,0x05,0x22,
0x3f,0x5c,0x79,0x96,0xb3,0xd0,0xed,0x0a,0x27,0x44,0x61,0x7e,
0x9b,0xb8,0xd5,0xf2,0x0f,0x2c,0x49,0x66,0x83,0xa0,0xbd,0xda,
0xf7,0x14,0x31,0x4e,0x6b,0x88,0xa5,0xc2,0xdf,0xfc,0x19,0x36,
0x53,0x70,0x8d,0xaa,0xc7,0xe4,0x01,0x1e,0x3b,0x58,0x75,0x92,
0xaf,0xcc,0xe9,0x06,0x23,0x40,0x5d,0x7a,0x97,0xb4,0xd1,0xee,
0x0b,0x28,0x45,0x62,0x7f,0x9c,0xb9,0xd6,0xf3,0x10,0x2d,0x4a,
0x67,0x84,0xa1,0xbe,0xdb,0xf8,0x15,0x32,0x4f,0x6c,0x89,0xa6,
0xc3,0xe0,0xfd,0x1a,0x37,0x54,0x71,0x8e,0xab,0xc8,0xe5,0x02,
0x1f,0x3c,0x59,0x76,0x93,0xb0,0xcd,0xea,0x07,0x24,0x41,0x5e,
0x7b,0x98,0xb5,0xd2,0xef,0x0c,0x29,0x46,0x63,0x80,0x9d,0xba,
0xd7,0xf4,0x11,0x2e,0x4b,0x68,0x85,0xa2,0xbf,0xdc,0xf9,0x16,
0x33,0x50,0x6d,0x8a,0xa7,0xc4,0xe1,0xfe,0x1b,0x38,0x55,0x72,
0x8f,0xac,0xc9,0xe6,0x03,0x20,0x3d,0x5a,0x77,0x94,0xb1,0xce,
0xeb,0x08,0x25,0x42,0x5f,0x7c,0x99,0xb6,0xd3,0xf0,0x0d,0x2a,
0x47,0x64,0x81,0x9e,0xbb,0xd8,0xf5,0x12,0x2f,0x4c,0x69,0x86,
0xa3,0xc0,0xdd,0xfa,0x17,0x34,0x51,0x6e,0x8b,0xa8,0xc5,0xe2,
0xff,0x1c,0x39,0x56,0x73,0x90,0xad,0xca,0xe7,0x04,0x21,0x3e,
0x5b,0x78,0x95,0xb2,0xcf,0xec,0x09,0x26,0x43,0x60,0x7d,0x9a,
0xb7,0xd4,0xf1,0x0e,0x2b,0x48,0x65,0x82,0x9f,0xbc,0xd9,0xf6,
0x13,0x30,0x4d,0x6a,0x87,0xa4,0xc1,0xde,0xfb,0x18,0x35,0x52,
0x6f,0x8c,0xa9,0xc6,0xe3,0x00,0x1d,0x3a,0x57,0x74,0x91,0xae,
0xcb,0xe8,0x05,0x22,0x3f,0x5c,0x79,0x96,0xb3,0xd0,0xed,0x0a,
0x27,0x44,0x61,0x7e,0x9b,0xb8,0xd5,0xf2,0x0f,0x2c,0x49,0x66,
0x83,0xa0,0xbd,0xda,0xf7,0x14,0x31,0x4e,0x6b,0x88,0xa5,0xc2,
0xdf,0xfc,0x19,0x36,0x53,0x70,0x8d,0xaa,0xc7,0xe4,0x01,0x1e,
0x3b,0x58,0x75,0x92,0xaf,0xcc,0xe9,0x06,0x23,0x40,0x5d,0x7a,
0x97,0xb4,0xd1,0xee,0x0b,0x28,0x45,0x62,0x7f,0x9c,0xb9,0xd6,
0xf3,0x10,0x2d,0x4a,0x67,0x84,0xa1,0xbe,0xdb,0xf8,0x15,0x32,
0x4f,0x6c,0x89,0xa6,0xc3,0xe0,0xfd,0x1a,0x37,0x54,0x71,0x8e,
0xab,0xc8,0xe5,0x02,0x1f,0x3c,0x59,0x76,0x93,0xb0,0xcd,0xea,
0x07,0x24,0x41,0x5e,0x7b,0x98,0xb5,0xd2,0xef,0x0c,0x29,0x46,
0x63,0x80,0x9d,0xba,0xd7,0xf4,0x11,0x2e,0x4b,0x68,0x85,0xa2,
0xbf,0xdc,0xf9,0x16,0x33,0x50,0x6d,0x8a,0xa7,0xc4,0xe1,0xfe,
0x1b,0x38,0x55,0x72,0x8f,0xac,0xc9,0xe6,0x03,0x20,0x3d,0x5a,
0x77,0x94,0xb1,0xce,0xeb,0x08,0x25,0x42,0x5f,0x7c,0x99,0xb6,
0xd3,0xf0,0x0d,0x2a,0x47,0x64,0x81,0x9e,0xbb,0xd8,0xf5,0x12,
0x2f,0x4c,0x69,0x86,0xa3,0xc0,0xdd,0xfa,0x17,0x34,0x51,0x6e,
0x8b,0xa8,0xc5,0xe2,0xff,0x1c,0x39,0x56,0x73,0x90,0xad,0xca,
0xe7,0x04,0x21,0x3e,0x5b,0x78,0x95,0xb2,0xcf,0xec,0x09,0x26,
0x43,0x60,0x7d,0x9a,0xb7,0xd4,0xf1,0x0e,0x2b,0x48,0x65,0x82,
0x9f,0xbc,0xd9,0xf6,0x13,0x30,0x4d,0x6a,0x87,0xa4,0xc1,0xde,
0xfb,0x18,0x35,0x52,0x6f,0x8c,0xa9,0xc6,0xe3,0x00,0x1d,0x3a,
0x57,0x74,0x91,0xae,0xcb,0xe8,0x05,0x22,0x3f,0x5c,0x79,0x96,
0xb3,0xd0,0xed,0x0a,0x27,0x44,0x61,0x7e,0x9b,0xb8,0xd5,0xf2,
0x0f,0x2c,0x49,0x66,0x83,0xa0,0xbd,0xda,0xf7,0x14,0x31,0x4e,
0x6b,0x88,0xa5,0xc2,0xdf,0xfc,0x19,0x36,0x75,0x92,0xaf,0xcc,
0xe9,0x06,0x23,0x40,0x5d,0x7a,0x97,0xb4,0xd1,0xee,0x0b,0x28,
0x45,0x62,0x7f,0x9c,0xb9,0xd6,0xf3,0x10,0x2d,0x4a,0x67,0x84,
0xa1,0xbe,0xdb,0xf8,0x15,0x32,0x4f,0x6c,0x89,0xa6,0xc3,0xe0,
0xfd,0x1a,0x37,0x54,0x71,0x8e,0xab,0xc8,0xe5,0x02,0x1f,0x3c,
0x59,0x76,0x93,0xb0,0xcd,0xea,0x07,0x24,0x41,0x5e,0x7b,0x98,
0xb5,0xd2,0xef,0x0c,0x29,0x46,0x63,0x80,0x9d,0xba,0xd7,0xf4,
0x11,0x2e,0x4b,0x68,0x85,0xa2,0xbf,0xdc,0xf9,0x16,0x33,0x50,
0x6d,0x8a,0xa7,0xc4,0xe1,0xfe,0x1b,0x38,0x55,0x72,0x8f,0xac,
0xc9,0xe6,0x03,0x20,0x3d,0x5a,0x77,0x94,0xb1,0xce,0xeb,0x08,
0x25,0x42,0x5f,0x7c,0x99,0xb6,0xd3,0xf0,0x0d,0x2a,0x47,0x64,
0x81,0x9e,0xbb,0xd8,0xf5,0x12,0x2f,0x4c,0x69,0x86,0xa3,0xc0,
0xdd,0xfa,0x17,0x34,0x51,0x6e,0x8b,0xa8,0xc5,0xe2,0xff,0x1c,
0x39,0x56,0x73,0x90,0xad,0xca,0xe7,0x04,0x21,0x3e,0x5b,0x78,
0x95,0xb2,0xcf,0xec,0x09,0x26,0x43,0x60,0x7d,0x9a,0xb7,0xd4,
0xf1,0x0e,0x2b,0x48,0x65,0x82,0x9f,0xbc,0xd9,0xf6,0x13,0x30,
0x4d,0x6a,0x87,0xa4,0xc1,0xde,0xfb,0x18,0x35,0x52,0x6f,0x8c,
0xa9,0xc6,0xe3,0x00,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,
0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,
0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,
0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,
0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,
0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,
0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,
0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,
0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,
0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,
0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,
0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,
0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,
0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,
0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,
0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,
0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,
0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,
0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,
0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,
0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,
0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,
0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,
0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,
0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,
0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,
0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,
0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,
0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,
0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,
0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,
0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,
0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,
0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,
0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,
0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,
0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,
0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,
0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,
0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,
0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,
0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,
0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,
0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,
0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,
0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,
0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,
0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,
0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,
0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,
0x3c,0x3c,0x3c,0x3c,0x15,0x32,0x4f,0x6c,0x89,0xa6,0xc3,0xe0,
0xfd,0x1a,0x37,0x54,0x71,0x8e,0xab,0xc8,0xe5,0x02,0x1f,0x3c,
0x59,0x76,0x93,0xb0,0xcd,0xea,0x07,0x24,0x41,0x5e,0x7b,0x98,
0xb5,0xd2,0xef,0x0c,0x29,0x46,0x63,0x80,0x9d,0xba,0xd7,0xf4,
0x11,0x2e,0x4b,0x68,0x85,0xa2,0xbf,0xdc,0xf9,0x16,0x33,0x50,
0x6d,0x8a,0xa7,0xc4,0xe1,0xfe,0x1b,0x38,0x55,0x72,0x8f,0xac,
0xc9,0xe6,0x03,0x20,0x3d,0x5a,0x77,0x94,0xb1,0xce,0xeb,0x08,
0x25,0x42,0x5f,0x7c,0x99,0xb6,0xd3,0xf0,0x0d,0x2a,0x47,0x64,
0x81,0x9e,0xbb,0xd8,0xf5,0x12,0x2f,0x4c,0x69,0x86,0xa3,0xc0,
0xdd,0xfa,0x17,0x34,0x51,0x6e,0x8b,0xa8,0xc5,0xe2,0xff,0x1c,
0x39,0x56,0x73,0x90,0xad,0xca,0xe7,0x04,0x21,0x3e,0x5b,0x78,
0x95,0xb2,0xcf,0xec,0x09,0x26,0x43,0x60,0x7d,0x9a,0xb7,0xd4,
0xf1,0x0e,0x2b,0x48,0x65,0x82,0x9f,0xbc,0xd9,0xf6,0x13,0x30,
0x4d,0x6a,0x87,0xa4,0xc1,0xde,0xfb,0x18,0x35,0x52,0x6f,0x8c,
0xa9,0xc6,0xe3,0x00,0x1d,0x3a,0x57,0x74,0x91,0xae,0xcb,0xe8,
0x05,0x22,0x3f,0x5c,0x79,0x96,0xb3,0xd0,0xed,0x0a,0x27,0x44,
0x61,0x7e,0x9b,0xb8,0xd5,0xf2,0x0f,0x2c,0x49,0x66,0x83,0xa0,
};
static int run_xdelta(void)
{
static const size_t chunks[] = { 1, 3, 64, 1024, 65536 };
#define NCHUNK (sizeof(chunks) / sizeof(chunks[0]))
unsigned char *whole = NULL;
size_t whole_len = 0;
size_t c;
int bad = 0;
if (!vcdiff_decode(xd_pat, sizeof(xd_pat), xd_src, sizeof(xd_src),
&whole, &whole_len))
{ printf("[FAIL] xdelta: whole-buffer decode refused\n"); return 1; }
if (whole_len != sizeof(xd_tgt) || memcmp(whole, xd_tgt, whole_len))
{ printf("[FAIL] xdelta: whole-buffer decode is wrong\n");
free(whole); return 1; }
/* every chunk size in each feed mode */
for (c = 0; c < 3 * NCHUNK; c++)
{
size_t chunk = chunks[c % NCHUNK];
patch_stream_t *ps = patch_stream_xdelta_open(xd_pat, sizeof(xd_pat),
sizeof(xd_src));
unsigned char *got = NULL;
size_t got_len = 0;
if (!ps)
{ printf("[FAIL] xdelta: open refused (chunk %lu)\n",
(unsigned long)chunk); bad = 1; continue; }
if (!run_stream(ps, xd_src, sizeof(xd_src), chunk, (int)(c / NCHUNK),
&got, &got_len))
{ printf("[FAIL] xdelta: finish refused (chunk %lu)\n",
(unsigned long)chunk); bad = 1; }
else if (got_len != whole_len || memcmp(got, whole, whole_len))
{ printf("[FAIL] xdelta: chunk %lu differs from whole-buffer\n",
(unsigned long)chunk); bad = 1; }
free(got);
patch_stream_free(ps);
}
/* a feed that stops short must be refused, not answered */
{
patch_stream_t *ps = patch_stream_xdelta_open(xd_pat, sizeof(xd_pat),
sizeof(xd_src));
unsigned char *got = NULL;
size_t got_len = 0;
patch_stream_feed(ps, xd_src, sizeof(xd_src) / 3);
if (patch_stream_finish(ps, &got, &got_len))
{ printf("[FAIL] xdelta: short feed accepted\n"); bad = 1; free(got); }
patch_stream_free(ps);
}
if (!bad)
printf("PASS: xdelta streamed at 5 chunk sizes, copied, in place and"
" falling back, matches whole-buffer,"
" short feed refused\n");
free(whole);
return bad;
}
#else
static int run_xdelta(void)
{
printf("[skip] xdelta: built without HAVE_XDELTA\n");
return 0;
}
#endif
/* --------------------------------------------------------------------
* refusal parity: both appliers must reject the same patches
* -------------------------------------------------------------------- */
/* Applying a patch to content it was not built against is the ordinary
* way patching goes wrong - the wrong dump, the wrong revision - and
* the source checksum is what the formats carry to catch it. Comparing
* output bytes cannot test it, because when a patch is refused there is
* no output to compare; the verdicts have to be compared instead. Both
* the UPS and the BPS streaming appliers once accepted these and
* returned a plausible target. */
static int run_refusal_parity(void)
{
static uint8_t src[8192], bad[8192], tgt[8192], pat[65536];
size_t i, pl;
int t, bad_count = 0, checked = 0;
for (t = 0; t < 200; t++)
{
size_t sl = 512 + (xr() % 4096);
size_t k;
for (i = 0; i < sl; i++)
src[i] = (uint8_t)xr();
memcpy(tgt, src, sl);
for (k = 0; k < 1 + sl / 256; k++)
{ size_t at = xr() % sl; tgt[at] = (uint8_t)xr(); }
/* the same content, one byte different: a different revision */
memcpy(bad, src, sl);
bad[xr() % sl] ^= 0xFF;
/* UPS */
pl = make_ups(pat, src, sl, tgt, sl);
{
uint8_t *o = NULL, *m = NULL; uint64_t ol = 0; size_t ml = 0;
int ora, mine;
patch_stream_t *ps;
ora = (oracle_ups(pat, pl, bad, sl, &o, &ol) == PATCH_SUCCESS);
free(o); o = NULL;
ps = patch_stream_ups_open(pat, pl, sl);
patch_stream_feed(ps, bad, sl);
mine = patch_stream_finish(ps, &m, &ml) ? 1 : 0;
free(m); patch_stream_free(ps);
checked++;
if (ora != mine)
{ printf("[FAIL] UPS on wrong source: oracle %s, streamed %s\n",
ora ? "accepted" : "refused", mine ? "accepted" : "refused");
bad_count++; }
}
/* BPS */
pl = make_bps(pat, src, sl, tgt, sl);
{
uint8_t *o = NULL, *m = NULL; uint64_t ol = 0; size_t ml = 0;
int ora, mine;
patch_stream_t *ps;
ora = (oracle_bps(pat, pl, bad, sl, &o, &ol) == PATCH_SUCCESS);
free(o); o = NULL;
ps = patch_stream_bps_open(pat, pl, sl);
patch_stream_feed(ps, bad, sl);
mine = patch_stream_finish(ps, &m, &ml) ? 1 : 0;
free(m); patch_stream_free(ps);
checked++;
if (ora != mine)
{ printf("[FAIL] BPS on wrong source: oracle %s, streamed %s\n",
ora ? "accepted" : "refused", mine ? "accepted" : "refused");
bad_count++; }
}
}
if (!bad_count)
printf("PASS: %d wrong-source patches, verdicts agree (all refused)\n",
checked);
return bad_count != 0;
}
/* --------------------------------------------------------------------
* in place: a source fed where it lies is not copied
* -------------------------------------------------------------------- */
#if defined(__GLIBC__) && (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 33))
#include <malloc.h>
/* heap the stream takes while it is fed the whole source */
static size_t fed_heap(patch_stream_t *ps, const uint8_t *src, size_t sl, int mode)
{
struct mallinfo2 a = mallinfo2(), b;
feed_src(ps, src, sl, 65536, mode);
b = mallinfo2();
return (b.uordblks + b.hblkhd) - (a.uordblks + a.hblkhd);
}
static int run_in_place(void)
{
const size_t sl = 4u << 20;
uint8_t *src = malloc(sl), *tgt = malloc(sl), *pat = malloc(4 * sl + 64);
size_t pl, k, heap[3];
int mode, bad = 0;
for (k = 0; k < sl; k++)
src[k] = (uint8_t)xr2();
pl = make_bps(pat, src, sl, tgt, sl);
for (mode = 0; mode < 3; mode++)
{
uint8_t *got = NULL;
size_t got_len = 0;
patch_stream_t *ps = patch_stream_bps_open(pat, pl, sl);
heap[mode] = fed_heap(ps, src, sl, mode);
if ( !patch_stream_finish(ps, &got, &got_len)
|| got_len != sl || memcmp(got, tgt, sl))
{ printf("[FAIL] BPS fed in mode %d is wrong\n", mode); bad = 1; }
free(got);
patch_stream_free(ps);
}
/* the copy is the whole source; in place there is none, and the
* fallback copies only once it has to. A sanitizer's allocator
* leaves glibc's counters at nothing: only the results count there */
if (!heap[0])
{
printf("[skip] in place: the heap counters see no allocator\n");
free(src); free(tgt); free(pat);
return bad;
}
if (heap[0] < heap[1] + sl)
{ printf("[FAIL] BPS in place still took %lu bytes, copying %lu\n",
(unsigned long)heap[1], (unsigned long)heap[0]); bad = 1; }
if (heap[2] < heap[1] + sl)
{ printf("[FAIL] BPS fallback took %lu bytes, a copy is %lu\n",
(unsigned long)heap[2], (unsigned long)heap[0]); bad = 1; }
/* IPS: no target either, the records go on the source itself */
{
uint8_t *want = NULL;
uint64_t want_len = 0;
size_t wtl;
pl = make_ips(pat, src, sl, &wtl);
oracle_ips(pat, pl, src, sl, &want, &want_len);
for (mode = 0; mode < 2; mode++)
{
uint8_t *own = malloc(sl), *was = own;
size_t len = sl;
patch_stream_t *ps = patch_stream_ips_open(pat, pl, sl);
memcpy(own, src, sl);
heap[mode] = fed_heap(ps, own, sl, mode);
if ( !patch_stream_finish_into(ps, &own, &len)
|| len != want_len || memcmp(own, want, len))
{ printf("[FAIL] IPS fed in mode %d is wrong\n", mode); bad = 1; }
if (mode && wtl <= sl && own != was)
{ printf("[FAIL] IPS in place moved the source\n"); bad = 1; }
free(own);
patch_stream_free(ps);
}
free(want);
if (heap[0] < heap[1] + sl)
{ printf("[FAIL] IPS in place still took %lu bytes, copying %lu\n",
(unsigned long)heap[1], (unsigned long)heap[0]); bad = 1; }
}
#ifdef HAVE_XDELTA
for (mode = 0; mode < 2; mode++)
{
patch_stream_t *ps = patch_stream_xdelta_open(xd_pat, sizeof(xd_pat),
sizeof(xd_src));
heap[mode] = fed_heap(ps, xd_src, sizeof(xd_src), mode);
patch_stream_free(ps);
}
if (heap[0] < heap[1] + sizeof(xd_src))
{ printf("[FAIL] xdelta in place still took %lu bytes, copying %lu\n",
(unsigned long)heap[1], (unsigned long)heap[0]); bad = 1; }
#endif
if (!bad)
printf("PASS: a 4 MiB BPS and IPS source and the xdelta source read in"
" place, no copy kept, IPS patched where it lies\n");
free(src); free(tgt); free(pat);
return bad;
}
#else
static int run_in_place(void)
{
printf("[skip] in place: no glibc heap counters\n");
return 0;
}
#endif
int main(void)
{
int a, b, x, r, i;
printf("--- IPS / UPS ---\n");
a = run_ips_ups();
printf("--- BPS ---\n");
b = run_bps();
printf("--- xdelta ---\n");
x = run_xdelta();
printf("--- refusal parity ---\n");
r = run_refusal_parity();
printf("--- in place ---\n");
i = run_in_place();
r |= i;
printf("%s\n", (a || b || x || r) ? "FAILED" : "OK");
return (a || b || x || r) ? 1 : 0;
}