From 67583b4bda38190952a9cb3e76ace2a4eb0b40af Mon Sep 17 00:00:00 2001 From: Saeed Haghtalab Date: Wed, 4 Sep 2019 10:58:20 +0200 Subject: [PATCH 1/2] Update compressRecord.dbd.pod based on Wiki + Content update --- src/std/rec/Makefile | 6 + src/std/rec/compressRecord.dbd.pod | 386 +++++++++++++++++++++++++++-- src/std/rec/image/compress-1.jpg | Bin 0 -> 16781 bytes src/std/rec/image/compress-2.gif | Bin 0 -> 4136 bytes 4 files changed, 371 insertions(+), 21 deletions(-) create mode 100644 src/std/rec/image/compress-1.jpg create mode 100644 src/std/rec/image/compress-2.gif diff --git a/src/std/rec/Makefile b/src/std/rec/Makefile index 7515d769c..307662ebb 100644 --- a/src/std/rec/Makefile +++ b/src/std/rec/Makefile @@ -53,3 +53,9 @@ stdRecords_DBD = $(patsubst %,%.dbd,$(stdRecords)) dbRecStd_SRCS += $(patsubst %,%.c,$(stdRecords)) HTMLS += $(patsubst %.dbd.pod,%.html,$(notdir $(wildcard ../rec/*Record.dbd.pod))) + +vpath %.jpg $(USR_VPATH) .. $(SRC_DIRS) ../rec/image +vpath %.gif $(USR_VPATH) .. $(SRC_DIRS) ../rec/image + +HTMLS += compress-1.jpg +HTMLS += compress-2.gif diff --git a/src/std/rec/compressRecord.dbd.pod b/src/std/rec/compressRecord.dbd.pod index a67e12d3c..90cacb77d 100644 --- a/src/std/rec/compressRecord.dbd.pod +++ b/src/std/rec/compressRecord.dbd.pod @@ -7,43 +7,387 @@ # in file LICENSE that is included with this distribution. #************************************************************************* -=title Compress Record (compress) +=title Compression Record (compress) -... +The data compression record is used to collect and compress data from arrays. +When the INP field references a data array field, it immediately compresses the +entire array into an element of an array using one of several algorithms, +overwriting the previous element. If the INP field obtains its value from a +scalar-value field, the compression record will collect a new sample each time +the record is processed and add it to the compressed data array as a circular +buffer. -=head2 Record-specific Menus - -=head3 Menu compressALG - -The ALG field which uses this menu controls the compression algorithm used. - -... - -=menu compressALG - -... - -=head2 Parameter Fields - -The record-specific fields are described below. +The INP link can also specify a constant; however, if this is the case, the +compression algorithms are ignored, and the record support routines merely +return after checking the FLNK field. =recordtype compress -... - =cut menu(compressALG) { choice(compressALG_N_to_1_Low_Value,"N to 1 Low Value") choice(compressALG_N_to_1_High_Value,"N to 1 High Value") choice(compressALG_N_to_1_Average,"N to 1 Average") + choice(compressALG_N_to_1_Median,"N to 1 Median") choice(compressALG_Average,"Average") choice(compressALG_Circular_Buffer,"Circular Buffer") - choice(compressALG_N_to_1_Median,"N to 1 Median") } recordtype(compress) { -=fields VAL +=head2 Contents + +=over + +=item * L + +=over + +=item * L + +=item * L + +=item * L + +=item * L + +=back + +=item * L + +=over + +=item * L + +=item * L + +=back + +=back + +=begin html + +
+
+
+ +=end html + +=head2 Parameter Fields + +=head3 Scanning Parameters + +The compression record has the standard fields for specifying under what +circumstances the record will be processed. These fields are listed in +L. In addition, +L +explains how these fields are used. Since the compression record supports no +direct interfaces to hardware, its SCAN field cannot specify C<<< I/O Intr >>>. + +=head3 Algorithms and Related Parameters + +The user specifies the algorithm to be used in the ALG field. There are six possible +algorithms which can be specified as follows: + +=head4 Menu compressALG + +=menu compressALG + +The following fields determine what channel to read and how to compress the data: + +=fields ALG, INP, NSAM, N, ILIL, IHIL, OFF, RES + +As stated above, the ALG field specifies which algorithm to be performed on the data. + +The INP should be a database or channel access link. Though INP can be a constant, +the data compression algorithms are supported only when INP is a database link. See +L
+for information on specifying links. + + +IHIL and ILIL can be set to provide an initial value filter on the input array. +If ILIL E IHIL, the input elements will be skipped until a value is found +that is in the range of ILIL to IHIL. Note that ILIL and IHIL are used only in +C<<< N to 1 >>> algorithms. + +OFF provides the offset to the current beginning of the array data. +Note that OFF is used only in C<<< N to 1 >>> algorithms. + +The RES field can be accessed at run time to cause the algorithm to reset +itself before the maximum number of samples are reached. + +=head4 Algorithms + +B algorithm keeps a circular buffer of length NSAM. +Each time the record is processed, it gets the data referenced by INP and puts +it into the circular buffer referenced by VAL. The INP can refer to both scalar or +array data and VAL is just a time ordered circular buffer of values obtained +from INP. +Note that N, ILIL, IHIL and OFF are not used in C<<< Circular Buffer >>> algorithm. + +B takes an average of every element of the array obtained from +INP over time; that is, the entire array referenced by INP is retrieved, and for +each element, the new average is calculated and placed in the corresponding +element of the value buffer. The retrieved array is truncated to be of length +NSAM. N successive arrays are averaged and placed in the buffer. Thus, VAL[0] +holds the average of the first element of INP over N samples, VAL[1] holds the +average of the next element of INP over N samples, and so on. The following +shows the equation: + +=begin html + + + +=end html + +B If any of the C<<< N to 1 >>> algorithms are chosen, then VAL is a circular +buffer of NSAM samples. +The actual algorithm depends on whether INP references a scalar or an array. + +If INP refers to a scalar, then N successive time ordered samples of INP are taken. +After the Nth sample is obtained, a new value determined by the algorithm +(Lowest, Highest, or Average), is written to the circular buffer referenced by +VAL. If C<<< Low Value >>> the lowest value of all the samples is written; if +C<<< High Value >>> the highest value is written; and if C<<< Average >>>, the +average of all the samples are written. The C<<< Median >>> setting behaves +like C<<< Average >>> with scalar input data. + +If INP refers to an array, then the following applies: + +=over + +=item C<<< N to 1 Low Value >>> + +Compress N to 1 samples, keeping the lowest value. + +=item C<<< N to 1 High Value >>> + +Compress N to 1 samples, keeping the highest value. + +=item C<<< N to 1 Average >>> + +Compress N to 1 samples, taking the average value. + +=item C<<< N to 1 Median >>> + +Compress N to 1 samples, taking the median value. + +=back + +The compression record keeps NSAM data samples. + +The field N determines the number of elements to compress into each result. + +Thus, if NSAM was 3, and N was also equal to 3, then the algorithms would work +as in the following diagram: + +=begin html + + + +=end html + + +=head3 Operator Display Parameters + +These parameters are used to present meaningful data to the operator. They +display the value and other parameters of the record either textually or +graphically. + +=fields EGU, HOPR, LOPR, PREC, NAME, DESC + +The EGU field should be given a string that describes the value of VAL, but is +used whenever the C<<< get_units >>> record support routine is called. + +The HOPR and LOPR fields only specify the upper and lower display limits for +VAL, HIHI, HIGH, LOLO and LOW fields. + +PREC controls the floating-point precision whenever C<<< get_precision >>> is +called, and the field being referenced is the VAL field (i.e., one of the values +contained in the circular buffer). + +See L +for more on the record name (NAME) and description (DESC) fields. + + +=head3 Alarm Parameters + +The compression record has the alarm parameters common to all record types described in +L. + +=head3 Run-time Parameters + +These parameters are used by the run-time code for processing the data +compression algorithm. They are not configurable by the user, though some are +accessible at run-time. They can represent the current state of the waveform or +of the record whose field is referenced by the INP field. + +=fields NUSE, OUSE, BPTR, SPTR, WPTR, CVB, INPN, INX + +NUSE and OUSE hold the current and previous number of elements stored in VAL. + +BPTR is a pointer that refers to the buffer referenced by VAL. + +SPTR points to an array that is used for array averages. + +WPTR is used by the dbGetlinks routines. + +=begin html + +
+
+
+ +=end html + +=head2 Record Support + +=head3 Record Support Routines (compressRecord.c) + +=head4 init_record + + static long init_record(compressRecord *prec, int pass) + +Space for all necessary arrays is allocated. The addresses are stored in the +appropriate fields in the record. + +=head4 process + + static long process(compressRecord *prec) + +See L + +=head4 special + + static long special(DBADDR *paddr, int after) + +This routine is called when RSET, ALG, or N are set. It performs a reset. + +=head4 cvt_dbaddr + + static long cvt_dbaddr(DBADDR *paddr) + +This is called by dbNameToAddr. It makes the dbAddr structure refer to the +actual buffer holding the result. + +=head4 get_array_info + + static long get_array_info(DBADDR *paddr, long *no_elements, long *offset) + +Obtains values from the circular buffer referenced by VAL. + +=head4 put_array_info + + static long put_array_info(DBADDR *paddr, long nNew) + +Writes values into the circular buffer referenced by VAL. + +=head4 get_units + + static long get_units(DBADDR *paddr, char *units) + +Retrieves EGU. + +=head4 get_precision + + static long get_precision(DBADDR *paddr, long *precision) + +Retrieves PREC. + +=head4 get_graphic_double + + static long get_graphic_double(DBADDR *paddr, struct dbr_grDouble *pgd) + +Sets the upper display and lower display limits for a field. If the field is +VAL, the limits are set to HOPR and LOPR, else if the field has upper and lower +limits defined they will be used, else the upper and lower maximum values for +the field type will be used. + +=head4 get_control_double + + static long get_control_double(DBADDR *paddr, struct dbr_ctrlDouble *pcd) + +Sets the upper control and the lower control limits for a field. If the field is +VAL, the limits are set to HOPR and LOPR, else if the field has upper and lower +limits defined they will be used, else the upper and lower maximum values for +the field type will be used. + +=head3 Record Processing + +Routine process implements the following algorithm: + +=over + +=item 1. + +If INP is not a database link, check monitors and the forward link and return. + +=item 2. + +Get the current data referenced by INP. + +=item 3. + +Perform the appropriate algorithm: + +=over + +=item * + +Average: Read N successive instances of INP and perform an element by element +average. Until N instances have been obtained it just return without checking +monitors or the forward link. When N instances have been obtained complete the +algorithm, store the result in the VAL array, check monitors and the forward +link, and return. + +=item * + +Circular Buffer: Write the values obtained from INP into the VAL array as a +circular buffer, check monitors and the forward link, and return. + +=item * + +N to 1 xxx when INP refers to a scalar: Obtain N successive values from INP and +apply the N to 1 xxx algorithm to these values. Until N values are obtained +monitors and forward links are not triggered. When N successive values have been +obtained, complete the algorithm, check monitors and trigger the forward link, +and return. + +=item * + +N to 1 xxx when INP refers to an array: The ILIL and IHIL are honored if ILIL +E IHIL. The input array is divided into subarrays of length N. The specified +N to 1 xxx compression algorithm is applied to each sub-array and the result +stored in the array referenced by VAL. The monitors and forward link are +checked. + +=back + +=item 4. + +If success, set UDF to FALSE. + +=item 5. + +Check to see if monitors should be invoked: + +=over + +=item * + +Alarm monitors are invoked if the alarm status or severity has changed. + +=item * + +NSEV and NSTA are reset to 0. + +=back + +=item 6. + +Scan forward link if necessary, set PACT FALSE, and return. + +=back =cut diff --git a/src/std/rec/image/compress-1.jpg b/src/std/rec/image/compress-1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9ce8f4145887e0361016b4cf3c7543d00d83cbc5 GIT binary patch literal 16781 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 literal 0 HcmV?d00001 diff --git a/src/std/rec/image/compress-2.gif b/src/std/rec/image/compress-2.gif new file mode 100644 index 0000000000000000000000000000000000000000..e4cbf62a7f500e418fe548c9785fa24831703ac6 GIT binary patch literal 4136 zcmeH``9BkmqjSBh8Vk z8k?(JIlt237$H|k=KJ{k5#L`vkMHvzcs-u4$Kz=Uu`n?7__lBVzF85Gy}dn=|L4Ex zfxSK9f051qxr*}kfqfz(6cMfeEd8em5ecD)zT`=8WnLRrLRQ0-SDF7l@tBGg6#Qvse)UKZX6_so*k9>8Q0g{5@YAuzVziTH z&C!O`IlpqQ?c%)p(sF1eqp9>n<=6MP(RV$aTY=v?UZ_~QT^p(T(M7y6>`Kk9nfaJ! zmZarsuw-A(bSQh+(@?uGTkC@WI)|dlwzEc>9Q-B+>NA!qOu~HViycikBt-N@EoPC!EDx5te@V^LPc?jom0~8tXC)Y%D#_2V){(rC zY$XR_Wt|g^JezgRew&$d|AOFLu0|~IY!1|D)HCaX7^EoOo524{Hf-3=rvl#@7Lsl= z@d`2FL3mY~QWXDO-q|)2UVQ87sfcv;_WsQI#K$?9iy z`x4Zh0cwuQFYmYODlcm}>%UO+$+SK%reg-^K`=P*p}l1P+Xc+QS9d0L}uFBc-ztIh!2SN7ol`_~BCqHyR;* zF^C>&Q=uFEPq)hRkX5dk^!hp((TkcAtpNn}p-+E&vI$QsL-$-tmELKaage&aHG9}! zdjnj3@yhQZQARl(shy_vhHFRgU+xw-W>=dRY{uhb4wf@^V>Yh;*;u|i*vSz6I;?e| zx&*_KnIdY{o!>9@3*)dlMKu^XFQRRURXN}xt_uEF!s1T+^|2iCt*xto1bo7ivmUR5 ziN<1jT^QkT|L4PS0LcCLN=#el8EJULb)nJ<)+~@IEepQB_h5zapqnYT>%av?tt34< z!UB9`eYi|sN%pnzjE=i6BP->l5mXL7iO}i552mLeyIH3;c^#&IR?=c#OZzVIJOdA(#S~7~cX?!Oie*d+e;sSF}suWh%4l*xB| zIS+S!e$%k=GI+ND8fpL8CufZoQOiHMVCC3kzoCNMEwdCw-H%(U)h$p?g4Hrdnoh*4 z7ejcCZiEqzu3i=G=}#EY_zj=_x;nW>%NrE%5AP79`f$p37b`{Q!WZGSMe4#Nuh&L0 zLo?>DU!ntpYzF|Nt2u8T{?i2y>l$nSmc!w|lS43+J40f;%gu|R&|;JV3nX6|Z(b4Z zY3(L(l=q^i_&YU~P5dCs*B7BHZqm9Y)ufSv$(pzOtn5G>Zo`KIS72f@(>j#MCdAcwA?c{6m!!*3B}{3B zGVN-w`@B{qn)b?O@!G817m`Y(9h|y5;d4!zoQIiQrkiEV?c0OW1H`)TN}6~iHq`fD z>O&Mr2F_Uq6!e|(Lzw;pI$`@gYmg%Mge`s4*U{5($Q;coz9Q;x^xk>sjrK;NeAB!O zg4``r688A=*`EV4e38>I8DRv2FWv z1gbfiF6C3u=pRtx5~)A;?|US0bTNXZTq z{Wk2ge^=ts8*+xqAs%d znp?5b*nE(11?pp%X^nb3Xl8Q5Fb(cyuN8H*5w*dDn~dR`kq1uIW6@e$IintPKi zPnS(%5{<{FzUOYAY|(4WXM|L0wzL=q3G>y3EJTKr;tCEFJ%4$5<*!l8dz@4KqM6+j zg6iqtGc)0wn!TY53rL}|SVOO7MWoP$&TjKYif%<|OdEE$yVJ}glHBMOTVeGVb;Eh#m@@2W>mWX-zJ78`cQ2tr)uksT5G z#oR?%EO7!BJrsewq>p;WLj?UBEd=5e2w(t?XeHYbmokS-;NfbW;u*6*1QC+!i<^|Q zqSV1iBN(Oup#T|vy3Wh3Bf)($ycidI9!F62MXPVc-|GlhQ44$dAX=53#CZ@`Bazf- z5cP_OYMCRH_$I;h6S%x2zFKULTGD%7a_wC5fJ90MIK?k9<$)7nVkBj9D`g6h`pqEq z2ivYsEqPc1+xFl|JubD1i2cZpJ$4_X?VG%2;P*=+$XG3ch6L>TVy4xg>vQsZYJU5- zQx4*7#G&BBqbZV*7e`CL$Dsu2QTc!PFXGvEWl0f02viAwUl9mVE&-^FV&whgRn^l^ z``M`T!RJfxnubCf5I=ozJwwqT^DHoP6Y$~>(N+%+zD~mZE5IAo$C?2#29OMM^+anR z7!nDw+y>t*K{}AE?n_!ak)ol7Ko^L$8!2k2>b3{ad$27N5}xSkm;-}Y>@&=HY>0S* z&-pQz+;2tlsUmna7&ewQFdY-imnAtp(Z@ajZ^ zj@&vml9+&q_92<$NQX*DX%JHM4-!M2jP=XO7GzRKbIbUsylrBs9~pIvd~B5L?oH85 zq=XhyEVz`>-{f1+%xXhQGsKdMmuL(zrpO0nmVEa`bx9ibTg|BfQ z5on}7bqsHPtRqobKkOlZ&hn$_eMSj#DaSf!mN>*t1ohl+x^o1LL8K0!gY9dlf7_&N zl8~)F?!W8kqVu$7-4OLzMyq&^Zjn4HHg6VB{Vth54GsAv8FrkE7n1Tn;PSgR-UC`bVD&^y;x3_Efb?a4I-0Fplm_|J9&(a JQaC1J{J)wmzxn_G literal 0 HcmV?d00001 From 31811e53b33f944ef5fbba52c3b0a5c6d81f721f Mon Sep 17 00:00:00 2001 From: Saeed Haghtalab Date: Wed, 4 Sep 2019 21:14:11 +0200 Subject: [PATCH 2/2] Compress record pod update after review - Revert "N to 1 Median" choice entry place - Convert images to PNG and update Makefile - Update record support routins definition based on epics7 recSup.h --- src/std/rec/Makefile | 8 +++----- src/std/rec/compressRecord.dbd.pod | 28 +++++++++++++++------------- src/std/rec/image/compress-1.jpg | Bin 16781 -> 0 bytes src/std/rec/image/compress-1.png | Bin 0 -> 2126 bytes src/std/rec/image/compress-2.gif | Bin 4136 -> 0 bytes src/std/rec/image/compress-2.png | Bin 0 -> 7608 bytes 6 files changed, 18 insertions(+), 18 deletions(-) delete mode 100644 src/std/rec/image/compress-1.jpg create mode 100644 src/std/rec/image/compress-1.png delete mode 100644 src/std/rec/image/compress-2.gif create mode 100644 src/std/rec/image/compress-2.png diff --git a/src/std/rec/Makefile b/src/std/rec/Makefile index 307662ebb..3f9c763b5 100644 --- a/src/std/rec/Makefile +++ b/src/std/rec/Makefile @@ -54,8 +54,6 @@ dbRecStd_SRCS += $(patsubst %,%.c,$(stdRecords)) HTMLS += $(patsubst %.dbd.pod,%.html,$(notdir $(wildcard ../rec/*Record.dbd.pod))) -vpath %.jpg $(USR_VPATH) .. $(SRC_DIRS) ../rec/image -vpath %.gif $(USR_VPATH) .. $(SRC_DIRS) ../rec/image - -HTMLS += compress-1.jpg -HTMLS += compress-2.gif +vpath %.png $(SRC_DIRS) +HTMLS += image/compress-1.png +HTMLS += image/compress-2.png diff --git a/src/std/rec/compressRecord.dbd.pod b/src/std/rec/compressRecord.dbd.pod index 90cacb77d..f0a586baa 100644 --- a/src/std/rec/compressRecord.dbd.pod +++ b/src/std/rec/compressRecord.dbd.pod @@ -29,9 +29,9 @@ menu(compressALG) { choice(compressALG_N_to_1_Low_Value,"N to 1 Low Value") choice(compressALG_N_to_1_High_Value,"N to 1 High Value") choice(compressALG_N_to_1_Average,"N to 1 Average") - choice(compressALG_N_to_1_Median,"N to 1 Median") choice(compressALG_Average,"Average") choice(compressALG_Circular_Buffer,"Circular Buffer") + choice(compressALG_N_to_1_Median,"N to 1 Median") } recordtype(compress) { @@ -134,9 +134,11 @@ holds the average of the first element of INP over N samples, VAL[1] holds the average of the next element of INP over N samples, and so on. The following shows the equation: +=for comment Latex form of equation bellow : VAL[i] \leftarrow \frac{1}{N}\sum_{n=1}^NINP_{n}[i] + =begin html - + =end html @@ -183,7 +185,7 @@ as in the following diagram: =begin html - + =end html @@ -246,57 +248,57 @@ WPTR is used by the dbGetlinks routines. =head4 init_record - static long init_record(compressRecord *prec, int pass) + long (*init_record)(struct dbCommon *precord, int pass) Space for all necessary arrays is allocated. The addresses are stored in the appropriate fields in the record. =head4 process - static long process(compressRecord *prec) + long (*process)(struct dbCommon *precord) See L =head4 special - static long special(DBADDR *paddr, int after) + long (*special)(struct dbAddr *paddr, int after) This routine is called when RSET, ALG, or N are set. It performs a reset. =head4 cvt_dbaddr - static long cvt_dbaddr(DBADDR *paddr) + long (*cvt_dbaddr)(struct dbAddr *paddr) This is called by dbNameToAddr. It makes the dbAddr structure refer to the actual buffer holding the result. =head4 get_array_info - static long get_array_info(DBADDR *paddr, long *no_elements, long *offset) + long (*get_array_info)(struct dbAddr *paddr, long *no_elements, long *offset) Obtains values from the circular buffer referenced by VAL. =head4 put_array_info - static long put_array_info(DBADDR *paddr, long nNew) + long (*put_array_info)(struct dbAddr *paddr, long nNew); Writes values into the circular buffer referenced by VAL. =head4 get_units - static long get_units(DBADDR *paddr, char *units) + long (*get_units)(struct dbAddr *paddr, char *units); Retrieves EGU. =head4 get_precision - static long get_precision(DBADDR *paddr, long *precision) + long (*get_precision)(const struct dbAddr *paddr, long *precision); Retrieves PREC. =head4 get_graphic_double - static long get_graphic_double(DBADDR *paddr, struct dbr_grDouble *pgd) + long (*get_graphic_double)(struct dbAddr *paddr, struct dbr_grDouble *p); Sets the upper display and lower display limits for a field. If the field is VAL, the limits are set to HOPR and LOPR, else if the field has upper and lower @@ -305,7 +307,7 @@ the field type will be used. =head4 get_control_double - static long get_control_double(DBADDR *paddr, struct dbr_ctrlDouble *pcd) + long (*get_control_double)(struct dbAddr *paddr, struct dbr_ctrlDouble *p); Sets the upper control and the lower control limits for a field. If the field is VAL, the limits are set to HOPR and LOPR, else if the field has upper and lower diff --git a/src/std/rec/image/compress-1.jpg b/src/std/rec/image/compress-1.jpg deleted file mode 100644 index 9ce8f4145887e0361016b4cf3c7543d00d83cbc5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16781 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 diff --git a/src/std/rec/image/compress-1.png b/src/std/rec/image/compress-1.png new file mode 100644 index 0000000000000000000000000000000000000000..3001ce9f548d1c1761ddb5e3aa9d7bff8951ac90 GIT binary patch literal 2126 zcmV-U2(kBxP)KaTLv5q{=E;Kw8Ub%ei<@GBRLG1q}05ho(d{BndJ{`=Dyb0w^X-yeZh zlT|YE+y9@&n2V8{%Bo3-SeV8Be<~MUmEiyN~_}cL@_DAOb7iP7ppWvoRkFMjl;744!MOPG`V{ zl`sis^UF|2|4*PB!U}?s5_$%J(Gjoq{^wnhd#teg9oXGseT|~U8DNKb?6I-ZL_yqG z=hAp$GtpkjyR-$!Hb=gES5Q4xwhyQ6lR~LfPdqf1%w{29@*icSE-=#YJY!p!Ut#>? ziR#RxyPMIm2Z=KqcZ9q~MAa&n{OO-rac;3s3MRBz5v7)B8a~o6Dn(o>*keUx7G@ds zyTUV0RASA70CW{3F3_!M5*DF$wa`w@tIlaEFjG@_g+^)|Hb_#{dEe;#go;CHop3 zua?cRC~<#f?6=sb8kZyUeZ_^1nahVSRU|?h;*AB`S;Wif zYve{yjs}dfO0(dXhIgP}$Y*wPdUxnQ#)5Fgep6#V($B=r^~tuw=g2rS5s(hAkUSK$ zqMd0s`JA>-DnJFJE3x9j(y^qYU{^-{bRK;Y%e@OS_Us})g5KCiYNC_KsCP-cB_7$nZT6`dk_5HJ zw`i>l5X-%{{X^nlRHwKLNXkJ<@dW#TtL>z>i%WtLM zW}ifwIq;!E5*&es=1MZSF%AvW@=sjKQwI_F&i&H$Oig6Or7gM9a7LJC(!L9f39A4` z_(*DFPakJwXVi;$*idO~Mafno*jFxhq`f&Fwm_X~Ty38(!%8FGso@wwoYYG7X5!O| zgOM=kd2*ZqgKh1b?hO4K-EI0w6G_Pp|8)DTa+iinoP5?mP-g@QCOy!VKJ@;Tm{}v$jX4U1uOYhIUrmnXC4xkA`u`E;1es{Z@0U?_i%r?$B`Ri&&^L z!YsL&+&d!x3=21{Ci+##_fv$q!fl1gjKwUE8`nE(Cob{ie!L4&h}uhLB;FMy_+J0b zLcXnokvnh)`@Ahtn5;mED7#Lphc((a?OfHEAgE7mbvNeiVdl)D!Qh!yBdnOSARtz> zm9!ZIPCeO!Q9p&p!~WMI!^%tulaU3_%neVj2DQrce%?jcM>xnqxLj2Wb~zl^YlL!2x7OJmF; zy~7hdIx)sP7**0ocWn$B)=l|D)5-Z@7x;mA|Ociy#zllG3Lc!-)mtS^I}+- z#!SMV6<3o_Tu)vEAnbe|YGE2P34%m895BU$CBDa>eQ~hF0ZuQJ4yPQ07Z#>53n0SyldSk^pROa`(l1MLuq$iK2K4Kc2qHpE zyqg;Zy9)VOn8r+i0P`C|xV5a9rPXf+{n`alBL3_$n?e2sgQV5yZ9L070000vbVXQn zY+-a|cmP&GOj~JPAY5!^W^`e4a&LDaTxN1%V|y`udro~^b9HTBdu}~3eO^vUPEcQa zZhc#6UHK97cmMzZ4s=CWbaG{LZ)|mRX>V=-F*PuXMnC2N000bhMObuWZ)|UJ05C8x zFfcH}pZ1{u000(rMObuGZ)S9NVRB^vY+-a|crtKqXD(xJZAt~H3IG5A07*qoM6N<$ Ef^+cjn*aa+ literal 0 HcmV?d00001 diff --git a/src/std/rec/image/compress-2.gif b/src/std/rec/image/compress-2.gif deleted file mode 100644 index e4cbf62a7f500e418fe548c9785fa24831703ac6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4136 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 JQaC1J{J)wmzxn_G diff --git a/src/std/rec/image/compress-2.png b/src/std/rec/image/compress-2.png new file mode 100644 index 0000000000000000000000000000000000000000..5ce46e0413c9c606467ac552a9b7a07630dc0113 GIT binary patch literal 7608 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