Advanced Batch features via auxiliary .exe programs

Discussion forum for all Windows batch related topics.

Moderator: DosItHelp

Message
Author
zpimp
Posts: 12
Joined: 14 Jun 2013 12:58

Re: Advanced Batch features via auxiliary .exe programs

#16 Post by zpimp » 31 Dec 2013 12:37

most useful programs i used for batch are the gnuwin32 utilities grep/sed/awk

foxidrive
Expert
Posts: 6031
Joined: 10 Feb 2012 02:20

Re: Advanced Batch features via auxiliary .exe programs

#17 Post by foxidrive » 10 Feb 2016 07:17

Antonio, are the CR LF tokens inside colorshow.exe?
In my Win 8.1 32 bit system they don't seem to give a crlf

Code: Select all

@echo off
ColorShow /1f "White on blue" CR LF
pause & goto :EOF


White on bluePress any key to continue . . .

Aacini
Expert
Posts: 1885
Joined: 06 Dec 2011 22:15
Location: México City, México
Contact:

Re: Advanced Batch features via auxiliary .exe programs

#18 Post by Aacini » 10 Feb 2016 08:37

@foxidrive:

Not directly. You may use Ascii code numbers to use any character:

Code: Select all

ColorShow /1f "White on blue" 13 10

... or previously assign these characters to variables and then use their names, like in this example that appear in the description of Show.exe program:

Code: Select all

@echo off
setlocal

set LF=^


for /F "tokens=1-4 delims= " %%a in ('ColorShow 7 32 8 32 9 32 13 32') do (
   set "BEL=%%a" & set "BS=%%b" & set "TAB=%%c" & set "CR=%%d"
)

ColorShow /1f "White on blue" CR LF
pause & goto :EOF

It seems that most readers ignore this phrase in the description of ColorShow.exe:

on ColorShow.exe description Aacini wrote:ColorShow.exe show characters in the same way of Show.exe program, but in color.

This means that in order to know the basic capabilities of ColorShow.exe (besides the use of color attributes), you must review the description of Show.exe.

Antonio

foxidrive
Expert
Posts: 6031
Joined: 10 Feb 2012 02:20

Re: Advanced Batch features via auxiliary .exe programs

#19 Post by foxidrive » 10 Feb 2016 08:47

Aacini wrote:@foxidrive:

Not directly. You may use Ascii code numbers to use any character:

Code: Select all

ColorShow /1f "White on blue" 13 10



Thank you Antonio.

... or previously assign these characters to variables and then use their names, like in this example that appear in the description of Show.exe program:

Code: Select all

@echo off
setlocal

set LF=^


for /F "tokens=1-4 delims= " %%a in ('ColorShow 7 32 8 32 9 32 13 32') do (
   set "BEL=%%a" & set "BS=%%b" & set "TAB=%%c" & set "CR=%%d"
)

ColorShow /1f "White on blue" CR LF
pause & goto :EOF

It seems that most readers ignore this phrase in the description of ColorShow.exe:

I was a little confused because your examples show things which don't work: for example this sample in your document requires variables that aren't set in the sample code:

Code: Select all

ColorShow /%Blue%%White% "White on blue" CR LF /%Yellow% "Yellow on black" CR LF

and as you've pasted above, the CR and LF don't have percent signs.
I was wondering if my binary was an old version so I made a new one. Oops.

It's just typos and creating small samples from larger scripts, I guess.

Aacini
Expert
Posts: 1885
Joined: 06 Dec 2011 22:15
Location: México City, México
Contact:

Re: Advanced Batch features via auxiliary .exe programs

#20 Post by Aacini » 10 Feb 2016 09:42

Ok, these additional explanations may help. This is the description of Show.exe command:

on Show.exe description Aacini wrote:Show characters from Ascii codes, string literals and Batch variables.

Show code[*times] | "literal" | variable[:[±]wide] ...

<code>, <times> and <wide> must be decimal numbers up to 255 each.

Times repeat the previous Ascii code character that number of times.
Wide define a width to show the variable value: justified at left, or justified at rigth if <wide> have minus sign, or centered if <wide> have plus sign.

At end, the number of displayed characters is returned in ERRORLEVEL.

For example:

Code: Select all

Show "Result one: " Num1 9 9 "Result two: " Num2 13 10 "Next line" 13 10

In previous example Num1 and Num2 are variables, "Next line" is a literal string and 9, 13 and 10 are Ascii codes representing TAB, CR and LF control chars, respectively.

If an Ascii code is followed by an asterisk and counter, the character is repeated that number of times. For example, the Batch subroutine below show a frame in the screen given the width and height:

Code: Select all

:ShowFrame width height
set /A width=%1-2, height=%2-2
Show 218 196*%width% 191  13 10
for /L %%i in (1,1,%height%) do Show 179 32*%width% 179  13 10
Show 192 196*%width% 217  13 10
exit /B

In this example the %width% variable must be necessarily expanded because the description of Show.exe program indicate that "<code>, <times> and <wide> must be decimal numbers up to 255 each". The CR and LF variables defined in my previous reply must not be expanded because then they interfere with the parsing of cmd.exe (unless they are enclosed in quotes).

About the color variables you mentioned, in the same post that includes 9-Ascii.exe.hex, 10-CursorSize.exe.hex, 11-TextColor.exe.hex and 12-ColorShow.exe.hex, immediately before TextColor.exe program this example appears:

before 11-TextColor.exe.hex Aacini wrote:The following Batch subroutine define several values useful to write color attributes:

Code: Select all

:DefineColorCodes
set HexDigit=0123456789ABCDEF
set c=-1
for %%c in ( Black Blue  Green  Aqua  Red  Purple  Brown  White
             Grey  LBlue LGreen LAqua LRed LPurple Yellow BWhite ) do (
   set /A c+=1
   for %%C in (!c!) do set %%c=!HexDigit:~%%C,1!
)
exit /B


Although the first example of TextColor use these variables with no previous explanation that the DefineColorCodes subroutine must be previously called:

Code: Select all

TextColor %Blue%%White%

... such subroutine and its variables appears just one page above this example.

This topic is extensive, so I tried to not include superfluous data that just made it even larger. Most of the small examples does not include the initial lines of a Batch file that may even avoid they works, like "setlocal". In despite of this detail, if you read complete replies you should have not problems knowing what are the values/switches/subroutines/etc. that should be included in each case. As a matter of fact, this is the reason because each reply is relatively big and include several programs: each reply comprise a sub-theme that must be entirely read as a unit.

Antonio

mirrormirror
Posts: 129
Joined: 08 Feb 2016 20:25

Re: Advanced Batch features via auxiliary .exe programs

#21 Post by mirrormirror » 10 Feb 2016 16:53

Do other readers have any opinion about this? Please chime in if you agree with me.

Put it this way - I may never have tried out Antonio's great little utilities if you hadn't compiled them for us :)
I'd appreciate it if you report any problem you may find.

I have found an issue with your "Textcolor.exe" program. It seems that it is case-sensitive when entering certain color codes where the "ColorShow.exe" program works in either upper or lower case. You can run this to see what I mean:

Code: Select all

@ECHO off
colorshow /0e "hello" 13 10
textcolor 0e
@ECHO hello
textcolor 07
colorshow /0E "hello" 13 10
textcolor 0E
@ECHO hello
textcolor 07

miskox
Posts: 553
Joined: 28 Jun 2010 03:46

Re: Advanced Batch features via auxiliary .exe programs

#22 Post by miskox » 11 Feb 2016 12:10

foxidrive wrote:That is what I was trying to say - the method to create your executable files is complicated and needs too many steps.
Why not create a single script for each binary?

Do other readers have any opinion about this? Please chime in if you agree with me.


I agree with you on this, Foxi.

I really like Aacini's solutions. But his method to create .exe files is too time consuming/complicated for me. So I make this step once and then I prefer Carlos' EXPAND method to make .exe files (I then pack Aacini's .exe file into .cab file).

Just now I decided to test his ColorShow.exe in my batch program. I was using Carlos' color function with FINDSTR but it is too slow for one task I have. I am sure Aacini's ColorShow.exe will be better option.

Aacini: thank you very much for your contribution to this site. I really appreciate it (and many do I am sure).

Saso

mirrormirror
Posts: 129
Joined: 08 Feb 2016 20:25

Re: Advanced Batch features via auxiliary .exe programs

#23 Post by mirrormirror » 13 Feb 2016 00:55

Aacini, I found another issue with colorshow.exe (in addition to the one mentioned above).
It does not properly display color from variables containing [TABS]
This code produces the results below:

Code: Select all

@ECHO/
set "str1=   drive\path\file.txt"
set "str2=      drive\path\file.txt"
set "str3=      drive\path\file.txt"
colorshow /3f str1 13 10
colorshow /3f str2 13 10
colorshow /3f str3 13 10
@ECHO/

Image
The in the code above:
"str1=[TAB]drive\path\file.txt"
"str2=[TAB][TAB]drive\path\file.txt"
str3 contains NO [TAB]s - only [SPACES]

aGerman
Expert
Posts: 4654
Joined: 22 Jan 2010 18:01
Location: Germany

Re: Advanced Batch features via auxiliary .exe programs

#24 Post by aGerman » 13 Feb 2016 09:32

While a tab is actually a single character, it separates a line in a console window into parts that are dividable by 8. The tab character itself isn't displayed but an appropriate number of spaces between 1 and 8. Certainly it is possible to change Aacini's program (I don't know the source code though). In the meantime you could perform your own formatting based on spaces.

Regards
aGerman

Aacini
Expert
Posts: 1885
Joined: 06 Dec 2011 22:15
Location: México City, México
Contact:

Re: Advanced Batch features via auxiliary .exe programs

#25 Post by Aacini » 13 Feb 2016 13:11

mirrormirror wrote:
Aacini wrote:I'd appreciate it if you report any problem you may find.


I have found an issue with your "Textcolor.exe" program. It seems that it is case-sensitive when entering certain color codes where the "ColorShow.exe" program works in either upper or lower case. You can run this to see what I mean:

First of all, I really appreciate your report about the TextColor.exe program bug. Thanks a lot! However...

I posted the TextColor.exe program on July/2012; this means that you are the first person that reported this bug in more than 3 and a half years! This caused me conflicting feelings ("Thank you for reporting it" :) "Why nobody reported it before?" :( ). This type of details give me a measure of how much some of my programs are really used and is one of the reasons that discourage me from making updates to the already posted utilities, documentation, method of use they, etc.

As I said in the original post, TextColor program did not correctly worked in all computers (including my own), so I had not a chance to test it at that time; however, it correctly works now on my recent Windows 8.1 computer. Effectively: there is a small bug when the color attribute is given with lowercase letters, but I also discovered that the possibility of set different colors for Stdout and Stderr handles will never work. I will modify both the program and the documentation and post the new version here ASAP.

For those of you that didn't realized what TextColor is about: the popular ColorShow.exe program just show text in color and that is it, but the underestimated TextColor.exe set the color that will be used by all posterior text output commands including the standard cmd.exe ones, like ECHO, DIR, etc. Try this:

Code: Select all

TextColor 1F & set /P "=Hello " < NUL & TextColor 4E & echo World& TextColor 7




mirrormirror wrote:Aacini, I found another issue with colorshow.exe (in addition to the one mentioned above).
It does not properly display color from variables containing [TABS]

ColorShow program use a different method to show text in color that use two buffers: one for the characters and another one for the color attributes; for this reason some control-chars must be explicitly processed, otherwise the colors and characters are shown out of sync. Each TAB character is expanded into the corresponding number of spaces as aGerman said, but this is done only when its Ascii code is explicitly given. The individual characters inside variables or strings are not procesed this way, not only because it is unusual that Batch variables contain such control-chars, but also because doing that will over-complicate the justification of variables allowed by the [+|-]width option.

Antonio

mirrormirror
Posts: 129
Joined: 08 Feb 2016 20:25

Re: Advanced Batch features via auxiliary .exe programs

#26 Post by mirrormirror » 13 Feb 2016 19:02

you are the first person that reported this bug in more than 3 and a half years!

Maybe your code is so good that there are no other bugs :)
I found the bug because I realized how useful your utilities actually were - and I started using them. I, for one, am very grateful that you did make them available for us - thank you!
I actually have a couple of feature requests for you to consider...

colorshow has the useful ability to display text from a variable within another block of text like this:
colorshow MyVar:+100
It would be nice to be able to also do this using a literal string like:
colorshow "hello world":+100
Also in this mode, it always displays the text within a block of [SPACES]. It would be nice to be able to choose another character instead of a space. For examle. In order to display something like this:
---------- Hello World ----------
I would need to add "----------" both before and after my Text. I currently do this using your cursorpos.exe utility but it would be nice if colorshow could do it natively.

Thanks for considering.

foxidrive
Expert
Posts: 6031
Joined: 10 Feb 2012 02:20

Re: Advanced Batch features via auxiliary .exe programs

#27 Post by foxidrive » 14 Feb 2016 02:21

mirrormirror wrote:I, for one, am very grateful that you did make them available for us - thank you!


Make that two. I have made suggestions, but never actually said that I am grateful also.

Thanks Antonio.


foxi

aGerman
Expert
Posts: 4654
Joined: 22 Jan 2010 18:01
Location: Germany

Re: Advanced Batch features via auxiliary .exe programs

#28 Post by aGerman » 14 Feb 2016 10:22

I second that. Thanks Antonio!

mirrormirror wrote:but it would be nice if colorshow could do it natively

You are looking for a panacea to meet exactly your needs. I fully agree with Antonio that it would absolutely overcomplicate the tool. Keep in mind that the program is named "colorshow" which tells you something about its purpose.

@Antonio
18.5K views is nothing to sneeze at :wink: Maybe somebody did already find the bug but not every viewer/user bekame a member at DosTips.
It might be off topic or not, it might also be useful for you or not - I wrote my own little tool years ago which is able to display colored tabs in a proper way. Also it behaves like ECHO with extended ASCII characters (such as box-drawing characters). I achieved that by a funny conversation from wchar_t* to char* using CharToOemW().
C/WinAPI:

Code: Select all

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#define WIN32_LEAN_AND_MEAN
#include <windows.h>

void help(const wchar_t *const me)
{
  wprintf(  L"Sets the console foreground and background colors for a\n"
            L" specified text in the console window.\n\n"
            L"Syntax:\n"
            L" %s bf text [/n]\n\n"
            L"        bf      Background and foreground color as HEX digits.\n"
            L"                        0 = Black       8 = Gray\n"
            L"                        1 = Blue        9 = Light Blue\n"
            L"                        2 = Green       A = Light Green\n"
            L"                        3 = Aqua        B = Light Aqua\n"
            L"                        4 = Red         C = Light Red\n"
            L"                        5 = Purple      D = Light Purple\n"
            L"                        6 = Yellow      E = Light Yellow\n"
            L"                        7 = White       F = Bright White\n\n"
            L"        text    Text to print. Has to be enclosed in double\n"
            L"                 quotes if it contains white spaces.\n"
            L"                 Literally printed quotation marks have to be\n"
            L"                 escaped with a backslash.\n\n"
            L"        /n      Optional to start a new line after the string\n"
            L"                 was printed.\n\n"
            , me );
}


// Working around missing wmain() support using compilers other than VC++.
typedef struct __startupinfo
{
  int newmode;
} _startupinfo;

extern
#ifdef __cplusplus
"C"
#endif
int __cdecl __wgetmainargs(int *_Argc, wchar_t ***_Argv, wchar_t ***_Env, int _DoWildCard, _startupinfo *_StartInfo);

int w_main(int argc, wchar_t *argv[]);

int main(void)
{
  _startupinfo si;
  int argc = 0;
  wchar_t **argv = NULL, **env = NULL;
  si.newmode = 0;

  if (__wgetmainargs(&argc, &argv, &env, 0, &si))
    return 1;
  else
    return w_main(argc, argv);
}


// Own w_main() to get passed arguments as string of wide characters.
int w_main(int argc, wchar_t **argv)
{
  CONSOLE_SCREEN_BUFFER_INFO csbi;
  HANDLE hOut = NULL;
  unsigned long col = 0u;
  wchar_t *endptr = NULL;
  char *buf = NULL;

  errno = 0;
  if (argc < 3
      || argc > 4
      || (hOut = GetStdHandle(STD_OUTPUT_HANDLE)) == INVALID_HANDLE_VALUE
      || (argc == 4 && wcscmp(argv[3], L"/n"))
      || (col = wcstoul(argv[1], &endptr, 16)) > 255u
      || *endptr
      || errno
      || !GetConsoleScreenBufferInfo(hOut, &csbi)
      || !(buf = (char*)malloc(wcslen(argv[2]) + 1)))
  {
    help(argv[0]);
    return 1;
  }

  if (!CharToOemW(argv[2], buf) // This conversion from wchar_t* to char* makes the tool behave the same as ECHO for characters ASCII >127 (like box-drawing characters)
      || !SetConsoleTextAttribute(hOut, col))
  {
    free(buf);
    return 1;
  }

  printf(argc == 4 ? "%s\n" : "%s", buf);
  free(buf);

  if (!SetConsoleTextAttribute(hOut, csbi.wAttributes))
    return 1;

  return 0;
}

I remember you uses a lightweigt C compiler. Thus I revised the code to be as C89 compliant as I can. (Unfortunately I lost the link to your homepage.) Feel free to utilize it in either way. Maybe there is some food for thought in the code.

Regards
aGerman

aGerman
Expert
Posts: 4654
Joined: 22 Jan 2010 18:01
Location: Germany

Re: Advanced Batch features via auxiliary .exe programs

#29 Post by aGerman » 14 Feb 2016 11:59

Addendum for not being that much off topic:
Batch file to create the tool

Code: Select all

@echo off
>"col.b64" (
echo(-----BEGIN CERTIFICATE-----
echo(TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo(AAAAAAAAAAAAAAAAgAAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5v
echo(dCBiZSBydW4gaW4gRE9TIG1vZGUuDQ0KJAAAAAAAAABQRQAATAEHADCnwFYAAAAA
echo(AAAAAOAADwMLAQIZABoAAAA0AAAABAAA4BQAAAAQAAAAMAAAAABAAAAQAAAAAgAA
echo(BAAAAAEAAAAEAAAAAAAAAACQAAAABAAAbrcAAAMAAAAAACAAABAAAAAAEAAAEAAA
echo(AAAAABAAAAAAAAAAAAAAAABgAADgBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEgAAAGAAAAAAAAAAAAAAA
echo(AAAAAAAAAABIYQAA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC50ZXh0AAAA
echo(xBkAAAAQAAAAGgAAAAQAAAAAAAAAAAAAAAAAAGAAUGAuZGF0YQAAADAAAAAAMAAA
echo(AAIAAAAeAAAAAAAAAAAAAAAAAABAADDALnJkYXRhAADcCwAAAEAAAAAMAAAAIAAA
echo(AAAAAAAAAAAAAAAAQAAwQC5ic3MAAAAAAAQAAABQAAAAAAAAAAAAAAAAAAAAAAAA
echo(AAAAAIAAYMAuaWRhdGEAAOAGAAAAYAAAAAgAAAAsAAAAAAAAAAAAAAAAAABAADDA
echo(LkNSVAAAAAA0AAAAAHAAAAACAAAANAAAAAAAAAAAAAAAAAAAQAAwwC50bHMAAAAA
echo(IAAAAACAAAAAAgAAADYAAAAAAAAAAAAAAAAAAEAAMMAAAAAAAAAAAAAAAAAAAAAA
echo(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo(AAAAAAAAAAAAAAAAAAAAAPPDjbQmAAAAAI28JwAAAACD7BwxwGaBPQAAQABNWscF
echo(jFNAAAEAAADHBYhTQAABAAAAxwWEU0AAAQAAAMcFJFBAAAEAAAB0aKMIUEAAoZhT
echo(QACFwHRKxwQkAgAAAOh6GAAAxwQk/////+hiCwAAixWoU0AAo+BTQACj5FNAAKHY
echo(YUAAiRDoNggAAIM9GDBAAAF0bTHAg8Qcw420JgAAAADHBCQBAAAA6DAYAADrtGaQ
echo(ixU8AEAAgboAAEAAUEUAAI2KAABAAHWAD7dRGGaB+gsBdD9mgfoLAg+Fav///4O5
echo(hAAAAA4Phl3///+LkfgAAAAxwIXSD5XA6Uv///+NdgDHBCRQG0AA6DQKAAAxwIPE
echo(HMODeXQOD4Ys////i4noAAAAMcCFyQ+VwOka////ZpCD7CyhgFNAAMdEJBAAUEAA
echo(x0QkCBBQQADHRCQEFFBAAMcEJBhQQACjAFBAAKEgUEAAiUQkDOh6FwAAg8Qsw2aQ
echo(VTHAuREAAACJ5VdWjVWkU4nXg+x886u4MAAAAOhfFgAAKcSNRCQbg+DwxwDMzMzM
echo(x0AEzMzMzMdACMzMzMzHQAzMzMzMx0AQzMzMzMdAFMzMzMzHQBjMzMzMx0AczMzM
echo(zIPk8Is1mFNAAIX2D4WOAgAAZKEYAAAAMfaLWASLPZBhQADrFDnDD4QUAgAAxwQk
echo(6AMAAP/Xg+wEifDwD7Ed6FNAAIXAdd6h7FNAADHbg/gBD4T9AQAAoexTQACFwA+E
echo(TQIAAMcFBFBAAAEAAACh7FNAAIP4AQ+E8gEAAIXbD4QQAgAAoZBHQACFwHQcx0Qk
echo(CAAAAADHRCQEAgAAAMcEJAAAAAD/0IPsDOgCCwAAxwQkMCBAAP8VjGFAAIPsBKOs
echo(U0AAxwQkABBAAOhxFgAA6AwJAAChyGFAAMcF3FNAAAAAQACLAIXAdFsxyesUjXYA
echo(hNJ0LIPhAXQnuQEAAACDwAEPthCA+iB+54nLg/MBgPoiD0TL6+iNdgCNvCcAAAAA
echo(hNJ1EesZjXYAjbwnAAAAAID6IH8Kg8ABD7YQhNJ18aPYU0AAix2YU0AAhdt0FQ+3
echo(VdT2RdABuAoAAAAPRcKjADBAAKEYUEAAiUWQicaNBIUEAAAAiUWMiQQk6C0VAACF
echo(9olFlIs9FFBAAA+ORAEAADHbif6LBJ6JBCTo7RQAAI14AYk8JOgCFQAAi02UiQSZ
echo(iwyeg8MBiXwkCIkEJIlMJATo3hQAADldkHXJi0WMg+gEi3WUxwQGAAAAAIk1FFBA
echo(AOjaBAAAobRhQACLFRBQQACJEKEQUEAAiUQkCKEUUEAAiUQkBKEYUEAAiQQk6D4V
echo(AACLDQhQQACjDFBAAIXJD4S2AAAAixUEUEAAhdJ1Cui4FAAAoQxQQACNZfRbXl9d
echo(w6HsU0AAuwEAAACD+AEPhQP+///HBCQfAAAA6JQUAACh7FNAAIP4AQ+FDv7//8dE
echo(JAQIcEAAxwQkAHBAAOhiFAAAhdvHBexTQAACAAAAD4Xw/f//hx3oU0AA6eX9//+Q
echo(iRQk/xVsYUAAg+wE6WH9///HBexTQAABAAAAx0QkBBhwQADHBCQMcEAA6BUUAADp
echo(mv3//zHA6fb+//+JBCTo6RMAAI22AAAAAI28JwAAAACD7AzHBZhTQAABAAAA6P4D
echo(AACDxAzplvz//422AAAAAIPsDMcFmFNAAAAAAADo3gMAAIPEDOl2/P//kJCQkJCQ
echo(VYnlg+wYoSwwQACFwHQ8xwQkAEBAAP8VZGFAAIPsBIXAugAAAAB0FsdEJAQOQEAA
echo(iQQk/xVoYUAAg+wIicKF0nQJxwQkLDBAAP/SxwQkYBVAAOiZAgAAycONtCYAAAAA
echo(VYnlXcOQkJCQkJCQkJCQkIPsHItEJCDHBCQkQEAAiUQkBOiVEgAAg8Qcw5CNdCYA
echo(VVdWU4PsTIs91GFAAIt0JGCLXCRkx0QkJAAAAAD/18cAAAAAAI1G/YP4AXYjiwPH
echo(BCQkQEAAiUQkBOhNEgAAuAEAAACDxExbXl9dw410JgDHBCT1/////xVwYUAAg+wE
echo(g/j/icV0xoP+BA+E8AAAAI1EJCTHRCQIEAAAAIlEJASLQwSJBCToCRIAAD3/AAAA
echo(icJ3mYtEJCRmgzgAdY+JVCQc/9eLAIXAdYONRCQqiSwkiUQkBP8VUGFAAIPsCIXA
echo(D4Rn////i0MIiQQk6MsRAACDwAGJBCToEBIAAIXAiccPhEf///+JRCQEi0MIiQQk
echo(/xU4YkAAg+wIhcCLVCQcdH+JVCQEiSwkix2IYUAA/9OD7AiFwHRpg/4Eun5HQAC4
echo(ekdAAA9Fwol8JASJBCToqREAAIk8JOjBEQAAD7dEJDKJLCSJRCQE/9OD7AiFwA+U
echo(wA+2wOnr/v//jbQmAAAAAMdEJASCR0AAi0MMiQQk6DERAACFwA+E9f7//+mt/v//
echo(iTwk6HQRAAC4AQAAAOmy/v//kJCQkJCQkJCQkJCQkJBTg+wooeRTQACJBCTofwQA
echo(AIP4/4lEJBgPhIIAAADHBCQIAAAA6FIRAACh5FNAAIkEJOhZBAAAiUQkGKHgU0AA
echo(iQQk6EgEAACJRCQcjUQkHIlEJAiNRCQYiUQkBItEJDCJBCToVBEAAInDi0QkGIkE
echo(JOgqBAAAo+RTQACLRCQciQQk6BkEAADHBCQIAAAAo+BTQADohBAAAIPEKInYW8OQ
echo(i0QkMIkEJP8V6GFAAIPEKFvDjbQmAAAAAI28JwAAAACD7ByLRCQgiQQk6DH///+F
echo(wA+UwIPEHA+2wPfYw5CQkKEEMEAAiwCFwHQfg+wMZpD/0KEEMEAAjVAEi0AEiRUE
echo(MEAAhcB16YPEDPPDjXQmAFOD7BiLHbApQACD+/90IYXbdAz/FJ2wKUAAg+sBdfTH
echo(BCQQGEAA6IX///+DxBhbwzHb6wKJw41DAYsUhbApQACF0nXw68mNdgCNvCcAAAAA
echo(oRxQQACFwHQH88OQjXQmAMcFHFBAAAEAAADrlJCQkJD/JbhhQACQkJCQkJCQkJCQ
echo(McDDkJCQkJCQkJCQkJCQkFVXVlOD7CyhJDBAAMdEJBAAAAAAx0QkFAAAAAA9TuZA
echo(u3QP99CjKDBAAIPELFteX13DjUQkEIkEJP8VdGFAAIPsBItcJBAzXCQU/xVYYUAA
echo(icX/FVxhQACJx/8VeGFAAInGjUQkGIkEJP8VhGFAAIPsBDNcJBgzXCQcMesx3zH+
echo(gf5O5kC7dBiJ8PfQiTUkMEAAoygwQACDxCxbXl9dw5C4sBm/RL5P5kC76+CNdCYA
echo(VYnlg+woxwUgU0AACQQAwItFBI1VBMcFJFNAAAEAAADHBCQAAAAAiRUEUUAAo/hQ
echo(QACjLFNAAItFCKPsUEAAoSQwQACJRfChKDBAAIlF9P8VjGFAAIPsBMcEJIhHQAD/
echo(FZxhQACD7AT/FVRhQADHRCQECQQAwIkEJP8VlGFAAIPsCOg9DgAAkJCQkJCQkJCQ
echo(g+wci0QkJIP4A3QUhcB0ELgBAAAAg8QcwgwAkI10JgCLVCQoiUQkBItEJCCJVCQI
echo(iQQk6BgJAAC4AQAAAIPEHMIMAI22AAAAAI28JwAAAABTg+wYgz0UMEAAAotEJCR0
echo(CscFFDBAAAIAAACD+AJ0EYP4AXQ7g8QYuAEAAABbwgwAuzBwQACB+zBwQAB052aQ
echo(iwOFwHQC/9CDwwSB+zBwQAB17YPEGLgBAAAAW8IMAJCLRCQox0QkBAEAAACJRCQI
echo(i0QkIIkEJOiECAAA66dmkDHAw5CQkJCQkJCQkJCQkJCD7DyhlFNAAN1EJEjdRCRQ
echo(hcDdRCRYdCnZyotUJEDdXCQY3VwkIIlUJBCLVCRE3VwkKIlUJBSNVCQQiRQk/9Dr
echo(Bt3Y3djd2IPEPMOQjXQmAItEJASjlFNAAOmGDQAAZpCD7Dy5lEdAAItEJECLEIPq
echo(AYP6BXcHiwyVsEhAAN1AGN1cJCDdQBDdXCQY3UAI3VwkEItABIlMJAjHRCQEpEdA
echo(AIlEJAyh4GFAAIPAQIkEJOjvDAAAMcCDxDzDkJCQkJDb48OQkJCQkJCQkJCQkJCQ
echo(i0QkBMONdCYAjbwnAAAAAItEJATDkJCQkJCQkJCQkJBTg+wYoeBhQADHRCQIGwAA
echo(AMdEJAQBAAAAjVwkJMcEJMhIQACDwECJRCQM6HQMAACLRCQgiVwkCIlEJASh4GFA
echo(AIPAQIkEJOgQDAAA6BMMAADrDZCQkJCQkJCQkJCQkJBXVlOD7DCLNaBTQACF9g+O
echo(2QAAAIs9pFNAADHbjVcEkIsKOcF3Dot6BANPCDnID4KyAAAAg8MBg8IMOfN14okE
echo(JInD6NgIAACFwInHD4TYAAAAjRx2izWkU0AAweMCAd6JRgjHBgAAAADo4gkAAANH
echo(DIlGBI1EJBTHRCQIHAAAAIlEJAShpFNAAItEGASJBCT/FaRhQACD7AyFwHRti0Qk
echo(KI1Q/IPi+3Q2g+hAg+C/dC6LRCQgAx2kU0AAx0QkCEAAAACJRCQEi0QkFIlcJAyJ
echo(BCT/FaBhQACD7BCFwHQVgwWgU0AAAYPEMFteX8Mx9ulK/////xVgYUAAxwQkOElA
echo(AIlEJATolv7//6GkU0AAi0QYBIlEJAiLRwjHBCQESUAAiUQkBOh2/v//iVwkBMcE
echo(JORIQADoZv7//422AAAAAKGcU0AAhcB0B8ONtgAAAABVieVXVlOD7EzHBZxTQAAB
echo(AAAA6DgIAACNBECNBIUeAAAAwegEweAE6DMKAADHBaBTQAAAAAAAKcSNRCQfg+Dw
echo(o6RTQAC43EtAAC3cS0AAg/gHD46bAAAAg/gLD45fAQAAodxLQACFwA+FjQAAAKHg
echo(S0AAhcAPhYAAAACLPeRLQAC76EtAAIX/D4Q3AQAAu9xLQACLQwiD+AEPhewBAACD
echo(wwyB+9xLQABzSYsDD7ZTCIt7BI2IAABAAIuAAABAAIP6EI23AABAAIlFxA+EDgEA
echo(AIP6IA+EdQEAAIP6CA+ERQEAAIlUJATHBCSUSUAA6F39//+NZfRbXl9dw7vcS0AA
echo(gfvcS0AAc+uQjbQmAAAAAItzBIs7g8MIA74AAEAAjYYAAEAA6If9//+B+9xLQACJ
echo(vgAAQABy2aGgU0AAMduFwH8N66+DwwE7HaBTQAB9pI08W6GkU0AAjTS9AAAAAAHw
echo(ixCF0nTejU3Mx0QkCBwAAACJTCQEi0AEiQQk/xWkYUAAg+wMhcAPhNoAAACNRciJ
echo(RCQMoaRTQACLBLiJRCQIi0XYiUQkBItFzIkEJP8VoGFAAIPsEOuNifaNvCcAAAAA
echo(u9xLQACLM4X2D4Ux////i0sEhckPhLn+///pIf///w+3lwAAQACJ0A0AAP//ZoO/
echo(AABAAAAPSNCLRcQpygHQiUXMifDop/z//w+3RcxmiYcAAEAAg8MMgfvcS0AAD4KH
echo(/v//6Q////8PthaJ14HPAP///4A+AA9I1ynKAdCJRcyJ8Ohp/P//D7ZFzIgG68WL
echo(RcQpyAMGiceJRcyJ8OhO/P//iT7rrosNpFNAAAHxi0EEiUQkCItBCItACMcEJARJ
echo(QACJRCQE6MX7//+JRCQExwQkYElAAOi1+///kJCQkJBVieVTg+wUi10IiwOLAD2R
echo(AADAd0s9jQAAwA+DsAAAAD0FAADAD4XZAAAAx0QkBAAAAADHBCQLAAAA6PUHAACD
echo(+AEPhBgBAACFwHQtxwQkCwAAAP/Q62OJ9o28JwAAAAA9lAAAwHQpPZYAAMAPhJ0A
echo(AAA9kwAAwHRXoaxTQACFwHQ9iV0Ii138yf/gkI10JgDHRCQEAAAAAMcEJAgAAADo
echo(kAcAAIP4AQ+EkwAAAIXAdMjHBCQIAAAA/9C4/////4td/MnCBACNdgCNvCcAAAAA
echo(x0QkBAAAAADHBCQIAAAA6FAHAACD+AF1xMdEJAQBAAAAxwQkCAAAAOg3BwAA6H76
echo(///rtj0dAADAD4Vq////x0QkBAAAAADHBCQEAAAA6BEHAACD+AF0WIXAD4RJ////
echo(xwQkBAAAAP/Q6Xz///9mkMdEJAQBAAAAxwQkCAAAAOjgBgAA6WH///+NtCYAAAAA
echo(x0QkBAEAAADHBCQLAAAA6MAGAADpQf///420JgAAAADHRCQEAQAAAMcEJAQAAADo
echo(oAYAAOkh////kJCQkJCQkFVXVlOD7BzHBCS4U0AA/xVMYUAAix2wU0AAg+wEiy2Y
echo(YUAAiz1gYUAAhdt0KI12AIsDiQQk/9WD7ASJxv/XhcB1DIX2dAiLQwSJNCT/0Itb
echo(CIXbddvHBCS4U0AA/xWAYUAAg+wEg8QcW15fXcONdgChtFNAAIXAdQfDjbYAAAAA
echo(U4PsGMdEJAQMAAAAxwQkAQAAAOg8BgAAhcCJw3RCi0QkIMcEJLhTQACJA4tEJCSJ
echo(QwT/FUxhQAChsFNAAIPsBIkdsFNAAMcEJLhTQACJQwj/FYBhQAAxwIPsBIPEGFvD
echo(uP/////r9In2jbwnAAAAAFOD7BihtFNAAItcJCCFwHUPg8QYMcBbw5CNtCYAAAAA
echo(xwQkuFNAAP8VTGFAAIsVsFNAAIPsBIXSdBeLAjnDdQrrTosIOdl0KInCi0IIhcB1
echo(8ccEJLhTQAD/FYBhQACD7ASDxBgxwFvDkI20JgAAAACLSAiJSgiJBCToTgUAAMcE
echo(JLhTQAD/FYBhQACD7ATr0YtCCKOwU0AAidDr2o10JgBTg+wYi0QkJIP4AQ+EfwAA
echo(AHIdg/gDdQ2htFNAAIXAD4WdAAAAg8QYuAEAAABbw5ChtFNAAIXAD4WTAAAAobRT
echo(QACD+AF13qGwU0AAhcB0EYtYCIkEJOjRBAAAhduJ2HXvxwWwU0AAAAAAAMcFtFNA
echo(AAAAAADHBCS4U0AA/xVIYUAAg+wE656J9o28JwAAAAChtFNAAIXAdBfHBbRTQAAB
echo(AAAAg8QYuAEAAABbw412AMcEJLhTQAD/FXxhQACD7ATr1+ip/f//6Vn///+NdCYA
echo(6Jv9///pY////5CQkJCQkANAPIE4UEUAAHQFMcDDZpBmgXgYCwEPlMAPtsDDjXYA
echo(i0QkBGaBOE1adAUxwMNmkOvOjbQmAAAAAI28JwAAAABWU4tUJAyLXCQQA1I8D7dy
echo(Bg+3QhSF9o1EAhh0GzHJkItQDDnadwcDUAg503IMg8EBg8AoOfF16DHAW17DjXYA
echo(VVdWU4PsHIt8JDCJPCToiQMAADHSg/gIdwtmgT0AAEAATVp0C4PEHInQW15fXcOQ
echo(uAAAQADoRv///4XAdOehPABAAA+3iBQAQAAFAABAAA+3aAaNXAgYhe10yjH26wuQ
echo(g8YBg8MoOe50JsdEJAgIAAAAiXwkBIkcJOgWAwAAhcB13oPEHInaidBbXl9dw2aQ
echo(g8QcMdJbidBeX13DjXQmADHJZoE9AABAAE1adAOJyMNWU7gAAEAA6MT+//+FwHRK
echo(oTwAQACLXCQMjZAAAEAAD7eAFABAAIHrAABAAA+3cgaNRAIYhfZ0IjHJjbYAAAAA
echo(i1AMOdNyBwNQCDnTchKDwQGDwCg58XXoMcmJyFtew5CJwYnIW17DifaNvCcAAAAA
echo(McBmgT0AAEAATVp0A/PDkLgAAEAA6Eb+//+FwHTvoTwAQAAPt4AGAEAAw5CNdCYA
echo(VjH2ZoE9AABAAE1aU4tMJAx0DYnwW17DkI20JgAAAAC4AABAAOgG/v//hcB05aE8
echo(AEAAjZAAAEAAD7eAFABAAA+3WgaNRAIYhdt0xzHSZpD2QCcgdAeFyXQWg+kBg8IB
echo(g8AoOdp16TH2ifBbXsNmkInGifBbXsOJ9o28JwAAAAAx0maBPQAAQABNWnQDidDD
echo(uAAAQADolv3//4XAuAAAQAAPRdCJ0MOJ9o28JwAAAAAxwGaBPQAAQABNWnQDw2aQ
echo(VlO4AABAAOhk/f//hcB0SqE8AEAAi1wkDI2QAABAAA+3gBQAQACB6wAAQAAPt3IG
echo(jUQCGIX2dCAxyY22AAAAAItQDDnTcgcDUAg503ISg8EBg8AoOfF16DHAW17zw2aQ
echo(i0AkW1730MHoH+vwjXQmAFdWMfZmgT0AAEAATVpTi1wkEHQMifBbXl/DjbYAAAAA
echo(uAAAQADo1vz//4XAdOahPABAAI2IAABAAIuAgABAAIXAdNEPt3kGD7dRFIX/jVQR
echo(GHTBi0oMOchyBwNKCDnIchKDxgGDwig5/nXoMfaJ8FteX8MFAABAAHUM6++NdCYA
echo(g+sBg8AUi0gEhcl1B4tQDIXSdNeF23/oi3AMW4HGAABAAInwXl/DkJCQkJCQkJCQ
echo(UVA9ABAAAI1MJAxyFYHpABAAAIMJAC0AEAAAPQAQAAB36ynBgwkAWFnDkJD/JTBi
echo(QACQkP8lLGJAAJCQ/yUoYkAAkJD/JSRiQACQkP8lIGJAAJCQ/yUcYkAAkJD/JRhi
echo(QACQkP8lFGJAAJCQ/yUQYkAAkJD/JQxiQACQkP8lCGJAAJCQ/yUEYkAAkJD/JQBi
echo(QACQkP8l/GFAAJCQ/yX4YUAAkJD/JfRhQACQkP8l8GFAAJCQ/yXsYUAAkJD/JeRh
echo(QACQkP8l3GFAAJCQ/yXQYUAAkJD/JcxhQACQkP8lxGFAAJCQ/yXAYUAAkJD/Jbxh
echo(QACQkP8lsGFAAJCQ/yWsYUAAkJBmkGaQZpBmkGaQZpCh1FNAAMONdgCNvCcAAAAA
echo(i0QkBIcF1FNAAMOQkJCQkFWJ5YPk8IPsMOhi7///jUQkIMdEJAwAAAAAx0QkJAAA
echo(AADHRCQoAAAAAMdEJCwAAAAAiUQkEI1EJCzHRCQgAAAAAIlEJAiNRCQoiUQkBI1E
echo(JCSJBCToUv///4XAugEAAAB1FotEJCiJRCQEi0QkJIkEJOj56///icKJ0MnDkJCQ
echo(VYnlXelX6///kJCQkJCQkP////+gKUAAAAAAAP////8AAAAAAAAAAAAAAAAAAAAA
echo(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo(CgAAAMApQAD///////////8AAAACAAAA/////wApQAAQKUAATuZAu7EZv0QAAAAA
echo(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABsaWJnY2otMTYuZGxsAF9K
echo(dl9SZWdpc3RlckNsYXNzZXMAAABTAGUAdABzACAAdABoAGUAIABjAG8AbgBzAG8A
echo(bABlACAAZgBvAHIAZQBnAHIAbwB1AG4AZAAgAGEAbgBkACAAYgBhAGMAawBnAHIA
echo(bwB1AG4AZAAgAGMAbwBsAG8AcgBzACAAZgBvAHIAIABhAAoAIABzAHAAZQBjAGkA
echo(ZgBpAGUAZAAgAHQAZQB4AHQAIABpAG4AIAB0AGgAZQAgAGMAbwBuAHMAbwBsAGUA
echo(IAB3AGkAbgBkAG8AdwAuAAoACgBTAHkAbgB0AGEAeAA6AAoAIAAlAHMAIABiAGYA
echo(IAB0AGUAeAB0ACAAWwAvAG4AXQAKAAoAIAAgACAAIAAgACAAIAAgAGIAZgAgACAA
echo(IAAgACAAIABCAGEAYwBrAGcAcgBvAHUAbgBkACAAYQBuAGQAIABmAG8AcgBlAGcA
echo(cgBvAHUAbgBkACAAYwBvAGwAbwByACAAYQBzACAASABFAFgAIABkAGkAZwBpAHQA
echo(cwAuAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA
echo(IAAgACAAMAAgAD0AIABCAGwAYQBjAGsAIAAgACAAIAAgACAAIAA4ACAAPQAgAEcA
echo(cgBhAHkACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA
echo(IAAgACAAIAAxACAAPQAgAEIAbAB1AGUAIAAgACAAIAAgACAAIAAgADkAIAA9ACAA
echo(TABpAGcAaAB0ACAAQgBsAHUAZQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA
echo(IAAgACAAIAAgACAAIAAgACAAIAAgADIAIAA9ACAARwByAGUAZQBuACAAIAAgACAA
echo(IAAgACAAQQAgAD0AIABMAGkAZwBoAHQAIABHAHIAZQBlAG4ACgAgACAAIAAgACAA
echo(IAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAzACAAPQAgAEEA
echo(cQB1AGEAIAAgACAAIAAgACAAIAAgAEIAIAA9ACAATABpAGcAaAB0ACAAQQBxAHUA
echo(YQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA
echo(IAAgADQAIAA9ACAAUgBlAGQAIAAgACAAIAAgACAAIAAgACAAQwAgAD0AIABMAGkA
echo(ZwBoAHQAIABSAGUAZAAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA
echo(IAAgACAAIAAgACAAIAAgADUAIAA9ACAAUAB1AHIAcABsAGUAIAAgACAAIAAgACAA
echo(RAAgAD0AIABMAGkAZwBoAHQAIABQAHUAcgBwAGwAZQAKACAAIAAgACAAIAAgACAA
echo(IAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgADYAIAA9ACAAWQBlAGwA
echo(bABvAHcAIAAgACAAIAAgACAARQAgAD0AIABMAGkAZwBoAHQAIABZAGUAbABsAG8A
echo(dwAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA
echo(IAAgADcAIAA9ACAAVwBoAGkAdABlACAAIAAgACAAIAAgACAARgAgAD0AIABCAHIA
echo(aQBnAGgAdAAgAFcAaABpAHQAZQAKAAoAIAAgACAAIAAgACAAIAAgAHQAZQB4AHQA
echo(IAAgACAAIABUAGUAeAB0ACAAdABvACAAcAByAGkAbgB0AC4AIABIAGEAcwAgAHQA
echo(bwAgAGIAZQAgAGUAbgBjAGwAbwBzAGUAZAAgAGkAbgAgAGQAbwB1AGIAbABlAAoA
echo(IAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAHEAdQBvAHQAZQBzACAA
echo(aQBmACAAaQB0ACAAYwBvAG4AdABhAGkAbgBzACAAdwBoAGkAdABlACAAcwBwAGEA
echo(YwBlAHMALgAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIABMAGkA
echo(dABlAHIAYQBsAGwAeQAgAHAAcgBpAG4AdABlAGQAIABxAHUAbwB0AGEAdABpAG8A
echo(bgAgAG0AYQByAGsAcwAgAGgAYQB2AGUAIAB0AG8AIABiAGUACgAgACAAIAAgACAA
echo(IAAgACAAIAAgACAAIAAgACAAIAAgACAAZQBzAGMAYQBwAGUAZAAgAHcAaQB0AGgA
echo(IABhACAAYgBhAGMAawBzAGwAYQBzAGgALgAKAAoAIAAgACAAIAAgACAAIAAgAC8A
echo(bgAgACAAIAAgACAAIABPAHAAdABpAG8AbgBhAGwAIAB0AG8AIABzAHQAYQByAHQA
echo(IABhACAAbgBlAHcAIABsAGkAbgBlACAAYQBmAHQAZQByACAAdABoAGUAIABzAHQA
echo(cgBpAG4AZwAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAB3AGEA
echo(cwAgAHAAcgBpAG4AdABlAGQALgAKAAoAAAAlcwoAJXMAAC8AbgAAACBTQABAUEAA
echo(YBpAAFVua25vd24gZXJyb3IAAABfbWF0aGVycigpOiAlcyBpbiAlcyglZywgJWcp
echo(ICAocmV0dmFsPSVnKQoAAEFyZ3VtZW50IGRvbWFpbiBlcnJvciAoRE9NQUlOKQBB
echo(cmd1bWVudCBzaW5ndWxhcml0eSAoU0lHTikAAE92ZXJmbG93IHJhbmdlIGVycm9y
echo(IChPVkVSRkxPVykAVGhlIHJlc3VsdCBpcyB0b28gc21hbGwgdG8gYmUgcmVwcmVz
echo(ZW50ZWQgKFVOREVSRkxPVykAAABUb3RhbCBsb3NzIG9mIHNpZ25pZmljYW5jZSAo
echo(VExPU1MpAABQYXJ0aWFsIGxvc3Mgb2Ygc2lnbmlmaWNhbmNlIChQTE9TUykAAAAA
echo(0EdAAO9HQAAMSEAALEhAAGRIQACISEAATWluZ3ctdzY0IHJ1bnRpbWUgZmFpbHVy
echo(ZToKAEFkZHJlc3MgJXAgaGFzIG5vIGltYWdlLXNlY3Rpb24AICBWaXJ0dWFsUXVl
echo(cnkgZmFpbGVkIGZvciAlZCBieXRlcyBhdCBhZGRyZXNzICVwAAAAACAgVmlydHVh
echo(bFByb3RlY3QgZmFpbGVkIHdpdGggY29kZSAweCV4AAAgIFVua25vd24gcHNldWRv
echo(IHJlbG9jYXRpb24gcHJvdG9jb2wgdmVyc2lvbiAlZC4KAAAAICBVbmtub3duIHBz
echo(ZXVkbyByZWxvY2F0aW9uIGJpdCBzaXplICVkLgoAAABHQ0M6IChHTlUpIDUuMi4w
echo(AAAAAEdDQzogKEdOVSkgNS4yLjAAAAAAR0NDOiAoR05VKSA1LjIuMAAAAABHQ0M6
echo(IChHTlUpIDUuMi4wAAAAAEdDQzogKEdOVSkgNS4yLjAAAAAAR0NDOiAoR05VKSA1
echo(LjIuMAAAAABHQ0M6IChHTlUpIDUuMi4wAAAAAEdDQzogKEdOVSkgNS4yLjAAAAAA
echo(R0NDOiAoR05VKSA1LjIuMAAAAABHQ0M6IChHTlUpIDUuMi4wAAAAAEdDQzogKEdO
echo(VSkgNS4yLjAAAAAAR0NDOiAoR05VKSA1LjIuMAAAAABHQ0M6IChHTlUpIDUuMi4w
echo(AAAAAEdDQzogKEdOVSkgNS4yLjAAAAAAR0NDOiAoR05VKSA1LjIuMAAAAABHQ0M6
echo(IChHTlUpIDUuMi4wAAAAAEdDQzogKEdOVSkgNS4yLjAAAAAAR0NDOiAoR05VKSA1
echo(LjIuMAAAAABHQ0M6IChHTlUpIDUuMi4wAAAAAEdDQzogKEdOVSkgNS4yLjAAAAAA
echo(R0NDOiAoR05VKSA1LjIuMAAAAABHQ0M6IChHTlUpIDUuMi4wAAAAAEdDQzogKEdO
echo(VSkgNS4yLjAAAAAAR0NDOiAoR05VKSA1LjIuMAAAAABHQ0M6IChHTlUpIDUuMi4w
echo(AAAAAEdDQzogKEdOVSkgNS4yLjAAAAAAR0NDOiAoR05VKSA1LjIuMAAAAAAAAAAA
echo(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQYAAAAAAAAAAAAAAsZgAA
echo(SGEAALRgAAAAAAAAAAAAAMRmAACsYQAAQGEAAAAAAAAAAAAA1GYAADhiAAAAAAAA
echo(AAAAAAAAAAAAAAAAAAAAAEBiAABYYgAAcGIAAI5iAACiYgAAuGIAAM5iAADeYgAA
echo(8mIAAARjAAAWYwAAJmMAAEBjAABQYwAAbGMAAIRjAACeYwAAuGMAANZjAADeYwAA
echo(8mMAAABkAAAcZAAALmQAAAAAAAA+ZAAATGQAAFxkAABoZAAAeGQAAIpkAACeZAAA
echo(sGQAALpkAADIZAAA0mQAANxkAADmZAAA8mQAAPpkAAACZQAADGUAABZlAAAeZQAA
echo(KGUAADBlAAA6ZQAARGUAAE5lAABYZQAAYmUAAGxlAAB2ZQAAgGUAAIhlAACUZQAA
echo(nmUAAKhlAACyZQAAAAAAALxlAAAAAAAAQGIAAFhiAABwYgAAjmIAAKJiAAC4YgAA
echo(zmIAAN5iAADyYgAABGMAABZjAAAmYwAAQGMAAFBjAABsYwAAhGMAAJ5jAAC4YwAA
echo(1mMAAN5jAADyYwAAAGQAABxkAAAuZAAAAAAAAD5kAABMZAAAXGQAAGhkAAB4ZAAA
echo(imQAAJ5kAACwZAAAumQAAMhkAADSZAAA3GQAAOZkAADyZAAA+mQAAAJlAAAMZQAA
echo(FmUAAB5lAAAoZQAAMGUAADplAABEZQAATmUAAFhlAABiZQAAbGUAAHZlAACAZQAA
echo(iGUAAJRlAACeZQAAqGUAALJlAAAAAAAAvGUAAAAAAADUAERlbGV0ZUNyaXRpY2Fs
echo(U2VjdGlvbgDvAEVudGVyQ3JpdGljYWxTZWN0aW9uAAC2AUdldENvbnNvbGVTY3Jl
echo(ZW5CdWZmZXJJbmZvAADEAUdldEN1cnJlbnRQcm9jZXNzAMUBR2V0Q3VycmVudFBy
echo(b2Nlc3NJZADJAUdldEN1cnJlbnRUaHJlYWRJZAAAAwJHZXRMYXN0RXJyb3IAABUC
echo(R2V0TW9kdWxlSGFuZGxlQQAARQJHZXRQcm9jQWRkcmVzcwAAZAJHZXRTdGFydHVw
echo(SW5mb0EAZgJHZXRTdGRIYW5kbGUAAHsCR2V0U3lzdGVtVGltZUFzRmlsZVRpbWUA
echo(lwJHZXRUaWNrQ291bnQAAOsCSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbgAmA0xl
echo(YXZlQ3JpdGljYWxTZWN0aW9uAACTA1F1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyAAoE
echo(U2V0Q29uc29sZVRleHRBdHRyaWJ1dGUAZwRTZXRVbmhhbmRsZWRFeGNlcHRpb25G
echo(aWx0ZXIAdARTbGVlcACCBFRlcm1pbmF0ZVByb2Nlc3MAAIkEVGxzR2V0VmFsdWUA
echo(lgRVbmhhbmRsZWRFeGNlcHRpb25GaWx0ZXIAALYEVmlydHVhbFByb3RlY3QAALkE
echo(VmlydHVhbFF1ZXJ5AAA3AF9fZGxsb25leGl0ADoAX19nZXRtYWluYXJncwA7AF9f
echo(aW5pdGVudgBEAF9fbGNvbnZfaW5pdAAAaABfX3NldF9hcHBfdHlwZQAAawBfX3Nl
echo(dHVzZXJtYXRoZXJyAAB1AF9fd2dldG1haW5hcmdzAAB5AF9hY21kbG4AjgBfYW1z
echo(Z19leGl0AACfAF9jZXhpdAAAzwBfZXJybm8AAPIAX2Ztb2RlAAAwAV9pbml0dGVy
echo(bQA0AV9pb2IAAJUBX2xvY2sAMgJfb25leGl0AEYDY2FsbG9jAABQA2V4aXQAAGAD
echo(ZnByaW50ZgBnA2ZyZWUAAHIDZndyaXRlAACeA21hbGxvYwAApgNtZW1jcHkAAK0D
echo(cHJpbnRmAADBA3NpZ25hbAAA0wNzdHJsZW4AANYDc3RybmNtcADqA191bmxvY2sA
echo(OwRhYm9ydABXBHZmcHJpbnRmAABmBHdjc2NtcAAAbAR3Y3NsZW4AAH4Ed2NzdG91
echo(bACCBHdwcmludGYAMABDaGFyVG9PZW1XAAAAAABgAAAAYAAAAGAAAABgAAAAYAAA
echo(AGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAA
echo(AGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAEtFUk5FTDMyLmRsbAAAAAAUYAAA
echo(FGAAABRgAAAUYAAAFGAAABRgAAAUYAAAFGAAABRgAAAUYAAAFGAAABRgAAAUYAAA
echo(FGAAABRgAAAUYAAAFGAAABRgAAAUYAAAFGAAABRgAAAUYAAAFGAAABRgAAAUYAAA
echo(FGAAABRgAAAUYAAAFGAAABRgAAAUYAAAFGAAABRgAAAUYAAAbXN2Y3J0LmRsbAAA
echo(KGAAAFVTRVIzMi5kbGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo(AAAAAAAAAAAAAAAAAAAAAAAAAAAwEUAAAAAAAAAAAAAQEEAAsBhAAAAAAAAAAAAA
echo(YBpAABAaQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo(AAAAAACAQAAcgEAAkFNAACBwQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
echo(-----END CERTIFICATE-----
)
certutil.exe -f -decode "col.b64" "col.exe"
del "col.b64"


Test code (script saved with codepage 1252, my default console codepage is 850 -- these are the conditions where the box drawing characters of this example are displayed correctly)

Code: Select all

@echo off
color f0
mode con cols=50 lines=10

echo(
col f0 "    "
col 1e "ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿" /n
col f0 "    "
col 1e "³ The "
col 4e "\"Hello World\""
col 1e " Test. ³" /n
col f0 "    "
col 1e "ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ" /n
echo(
echo(
echo   Did it work?
echo(
pause

miskox
Posts: 553
Joined: 28 Jun 2010 03:46

Re: Advanced Batch features via auxiliary .exe programs

#30 Post by miskox » 07 Mar 2016 02:52

I finally managed to do some tests with COLORSHOW.EXE. Looks great!

I have this problem:

Code: Select all

@echo off
echo.
echo.
echo.

set part1=       &rem
set part2=1&rem
set part3=    ł==  ł   6   5&rem these characters are 0xB3 (vertical graphic bar in CP852)

echo %part1%%part2%%part3%
colorshow.exe /07 "%part1%" /E0 "%part2%" /07 "%part3%"

echo.
echo.

set part1=       &rem
set part2=1&rem
set part3=    !==  !   6   5&rem

echo %part1%%part2%%part3%
colorshow.exe /07 "%part1%" /E0 "%part2%" /07 "%part3%"

echo.
echo.

set part1=       &rem
set part2=1&rem
set part3=    ^|==  ^|   6   5&rem these characters are 0x7C

REM if REM is removed echo fails
REM echo %part1%%part2%%part3%
colorshow.exe /07 "%part1%" /E0 "%part2%" /07 "%part3%"


Output:

Code: Select all

       1    │==  │   6   5
       [color=#FFFF00]1[/color]    -==  -   6   5

       1    !==  !   6   5
       [color=#FFFF00]1[/color]    !==  !   6   5

       [color=#FFFF00]1[/color]    |==  |   6   5


Any ideas why first colorshow.exe shows "-" instead of "|"?

Thanks.
Saso

Post Reply