1
0
mirror of https://github.com/gryf/wmtemp.git synced 2026-05-10 16:33:03 +02:00

1 Commits

Author SHA1 Message Date
gryf fc28caa211 New branch for nouveau driver 2013-10-21 22:20:36 +02:00
12 changed files with 392 additions and 884 deletions
+4
View File
@@ -0,0 +1,4 @@
This is dead simple Window Wmaker app for monitoring CPU and GPU temperature.
Hardcoded Core2 and Nvidia GPU support. Based on WMTempMon dockapp.
Depends on lmsensors and optionally on nvidia-settings packages.
-69
View File
@@ -1,69 +0,0 @@
wmtemp
======
This is dead simple Window Maker app for monitoring CPU and GPU temperature.
Based on WMTempMon dockapp, although it was heavily reworked.
.. image:: /images/wmtemp.gif?raw=true
:alt: wmtemp transitions
Compile
-------
To build the dockapp, perform the commands:
.. code:: shell-session
$ cd wmtemp
$ make
$ sudo make install
Binary will be installed in ``/usr/local/bin`` directory.
Configuration
-------------
To use the dockapp, you'll need to prepare configuration file, otherwise you'll
see 0 values for every core/gpu.
Wmtemp will look for configuration file in home directory. Here is sample
content of such file:
.. code:: shell-session
$ cat ~/.wmtemp
# wmtemp conf file
cpu1_path = /sys/devices/platform/coretemp.0/hwmon/hwmon2/temp2_input
cpu1_critical = 80
cpu1_warning = 65
cpu2_path = /sys/devices/platform/coretemp.0/hwmon/hwmon2/temp3_input
cpu2_critical = 80
cpu2_warning = 65
cpu3_path = /sys/devices/platform/coretemp.0/hwmon/hwmon2/temp4_input
cpu3_critical = 80
cpu3_warning = 65
cpu4_path = /sys/devices/platform/coretemp.0/hwmon/hwmon2/temp5_input
cpu4_critical = 80
cpu4_warning = 65
gpu_path = /sys/devices/virtual/hwmon/hwmon1/temp4_input
gpu_critical = 70
gpu_warning = 60
Every core have three options to change:
* ``[core]_path`` - path to temperature file to read from. The content of such
file contains a number of temperature in mili-Celsius.
* ``[core]_critical`` - temperature in °C, on which (and beyond) red color would
be used for highlight the entry.
* ``[core]_warninf`` - temperature in °C, on which (and beyond) orange color
would be used for highlight the entry.
In main directory there is a ``wmtemp_sample`` file, which can be copied to
``~/.wmtemp`` and tweaked according to the needs and hardware.
Licence
-------
This software is licensed under GPL2 license. See COPYING file for details.
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.3 KiB

-363
View File
@@ -1,363 +0,0 @@
/*
* wmtemp: a temperature monitor for WindowMaker. This little app is mainly
* based on wmsensormon and other simple dockapps, although it doesn't use
* lmsensors, just provided information from kernel via /sys filesystem.
*
* version = 0.5
*
* licence: GPL2
*/
#include <ctype.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <string.h>
#include <sys/param.h>
#include <sys/types.h>
#include "standards.h"
#include <X11/Xlib.h>
#include <X11/xpm.h>
#include <X11/extensions/shape.h>
#include "../wmgeneral/wmgeneral.h"
#include "../wmgeneral/misc.h"
#include "../wmgeneral/misc.h"
#include "wmtemp_master.xpm"
#include "wmtemp_mask.xbm"
#define MAXLEN 200
#define MAXFNAME 70
#define MAXCORENUM 4
struct entry {
char *path;
long critical;
long warning;
};
struct config {
struct entry cpu1;
struct entry cpu2;
struct entry cpu3;
struct entry cpu4;
struct entry gpu;
};
char cpu1_path[100];
int cpu1_warn = 0;
int cpu1_crit = 0;
char cpu2_path[100];
int cpu2_warn = 0;
int cpu2_crit = 0;
char cpu3_path[100];
int cpu3_warn = 0;
int cpu3_crit = 0;
char cpu4_path[100];
int cpu4_warn = 0;
int cpu4_crit = 0;
char gpu1_path[100];
int gpu1_warn = 0;
int gpu1_crit = 0;
typedef struct _core {
int temp;
/* offset is one of 0 (normal), 7 (critical), 14 (warning) */
short offset;
} core;
Display *display;
char *vcopy(char *str);
int get_gpu_temp(char *path, Display *disp);
int get_temp(struct entry *etr);
short get_offset(short temp, struct entry *etr);
void conf_read(char *filename);
void display_help(char *progname);
void display_values(int, short, short);
void draw_cpu_temp(short core_no, core *cpu);
void draw_gpu_temp(core *gpu);
void read_file_into(char *filepath, int *output);
void set_defaults(struct config *conf);
char *strip(char * string);
void parse_config(struct config *conf);
int main(int argc, char **argv){
int i;
short counter = 0;
struct config conf;
set_defaults(&conf);
parse_config(&conf);
display = XOpenDisplay(NULL);
core gpu, *cpus = malloc(MAXCORENUM * sizeof (core));
if (argc > 1) {
if (argc > 2) {
display_help(argv[0]);
exit(2);
}
if (argc == 2 &&
(strcmp(argv[1], "--help") == 0 ||
strcmp(argv[1], "-h") == 0)) {
display_help(argv[0]);
exit(0);
}
}
openXwindow(argc, argv, wmtemp_master, wmtemp_mask_bits,
wmtemp_mask_width, wmtemp_mask_height);
while(TRUE){
if (counter < 1){
counter = 5;
cpus[0].temp = get_temp(&conf.cpu1);
cpus[0].offset = get_offset(cpus[0].temp, &conf.cpu1);
cpus[1].temp = get_temp(&conf.cpu2);
cpus[1].offset = get_offset(cpus[1].temp, &conf.cpu2);
cpus[2].temp = get_temp(&conf.cpu3);
cpus[2].offset = get_offset(cpus[2].temp, &conf.cpu3);
cpus[3].temp = get_temp(&conf.cpu4);
cpus[3].offset = get_offset(cpus[3].temp, &conf.cpu4);
gpu.temp = get_temp(&conf.gpu);
gpu.offset = get_offset(gpu.temp, &conf.gpu);
}
// cpu's
for (i=0; i < 4; i++){
draw_cpu_temp(i, &cpus[i]);
}
// gpu
draw_gpu_temp(&gpu);
RedrawWindow();
counter--;
usleep(100000);
}
free(conf.cpu1.path);
free(conf.cpu2.path);
free(conf.cpu3.path);
free(conf.cpu4.path);
free(conf.gpu.path);
}
void set_defaults(struct config *conf) {
struct config configuration;
configuration = *conf;
configuration.cpu1.critical = 80;
configuration.cpu1.warning = 65;
configuration.cpu2.critical = 80;
configuration.cpu2.warning = 65;
configuration.cpu3.critical = 80;
configuration.cpu3.warning = 65;
configuration.cpu4.critical = 80;
configuration.cpu4.warning = 65;
configuration.gpu.critical = 80;
configuration.gpu.warning = 65;
configuration.cpu1.path = malloc(sizeof(char));
strcpy(configuration.cpu1.path, "");
configuration.cpu2.path = malloc(sizeof(char));
strcpy(configuration.cpu2.path, "");
configuration.cpu3.path = malloc(sizeof(char));
strcpy(configuration.cpu3.path, "");
configuration.cpu4.path = malloc(sizeof(char));
strcpy(configuration.cpu4.path, "");
configuration.gpu.path = malloc(sizeof(char));
strcpy(configuration.gpu.path, "");
*conf = configuration;
}
char *strip(char * string) {
char *string1 = string,
*string2 = &string[strlen (string) - 1];
/* Strip right side */
while ((isspace(*string2)) && (string2 >= string1))
string2--;
*(string2+1) = '\0';
/* Strip left side */
while ((isspace(*string1)) && (string1 < string2))
string1++;
strcpy (string, string1);
return string;
}
void parse_config(struct config *conf) {
char *item,
*conf_file,
buff[256],
name[MAXLEN],
value[MAXLEN];
struct config cfg;
FILE *fp;
conf_file = malloc(strlen(getenv("HOME")) + strlen("/.wmtemp") + 1);
sprintf(conf_file, "%s/.wmtemp", getenv("HOME"));
cfg = *conf;
fp = fopen (conf_file, "r");
if (fp == NULL) {
return;
}
while ((item = fgets (buff, sizeof buff, fp)) != NULL) {
if (buff[0] == '\n' || buff[0] == '#')
continue;
/* Parse name/value pair from item */
item = strtok(buff, "=");
strip(item);
if (item == NULL)
continue;
else
strncpy (name, item, MAXLEN);
item = strtok (NULL, "=");
if (item == NULL)
continue;
else
strncpy (value, item, MAXLEN);
strip(value);
if (!strcmp(name, "cpu1_path")){
free(cfg.cpu1.path);
cfg.cpu1.path = malloc(sizeof(value) + 1);
strcpy(cfg.cpu1.path, value);
}
if (!strcmp(name, "cpu2_path")){
free(cfg.cpu2.path);
cfg.cpu2.path = malloc(sizeof(value) + 1);
strcpy(cfg.cpu2.path, value);
}
if (!strcmp(name, "cpu1_path")){
free(cfg.cpu3.path);
cfg.cpu3.path = malloc(sizeof(value) + 1);
strcpy(cfg.cpu3.path, value);
}
if (!strcmp(name, "cpu1_path")){
free(cfg.cpu4.path);
cfg.cpu4.path = malloc(sizeof(value) + 1);
strcpy(cfg.cpu4.path, value);
}
if (!strcmp(name, "gpu_path")){
free(cfg.gpu.path);
cfg.gpu.path = malloc(sizeof(value) + 1);
strcpy(cfg.gpu.path, value);
}
if (!strcmp(name, "cpu1_critical"))
cfg.cpu1.critical = atoi(value);
if (!strcmp(name, "cpu2_critical"))
cfg.cpu2.critical = atoi(value);
if (!strcmp(name, "cpu3_critical"))
cfg.cpu3.critical = atoi(value);
if (!strcmp(name, "cpu4_critical"))
cfg.cpu4.critical = atoi(value);
if (!strcmp(name, "gpu_critical"))
cfg.gpu.critical = atoi(value);
if (!strcmp(name, "cpu1_warning"))
cfg.cpu1.warning = atoi(value);
if (!strcmp(name, "cpu2_warning"))
cfg.cpu2.warning = atoi(value);
if (!strcmp(name, "cpu3_warning"))
cfg.cpu3.warning = atoi(value);
if (!strcmp(name, "cpu4_warning"))
cfg.cpu4.warning = atoi(value);
if (!strcmp(name, "gpu_warning"))
cfg.gpu.warning = atoi(value);
}
*conf = cfg;
fclose (fp);
free(conf_file);
}
short get_offset(short temp, struct entry *etr){
if(temp >= etr->critical){
return 7; // Alert
}else if(temp >= etr->warning){
return 14; // Warning
}else{
return 0; // Normal
}
}
void display_values(int temp, short offset, short core2_offset){
char text[5], num1, num2, num3, num4;
sprintf(text, "%03d", temp);
num1 = (text[0] - '0');
num2 = (text[1] - '0');
num3 = (text[2] - '0');
num4 = (text[3] - '0');
if(num1)
copyXPMArea(5 * num1, 65 + core2_offset, 5, 7, 31, 7 + offset);
else
copyXPMArea(60, 65 + core2_offset, 5, 7, 31, 7 + offset);
copyXPMArea(5 * num2, 65 + core2_offset, 5, 7, 38, 7 + offset);
copyXPMArea(5 * num3, 65 + core2_offset, 5, 7, 45, 7 + offset);
copyXPMArea(5 * num4, 65 + core2_offset, 5, 7, 51, 7 + offset);
}
int get_temp(struct entry *etr){
int core_temp = 0;
read_file_into(etr->path, &core_temp);
return core_temp;
}
void read_file_into(char *filepath, int *output) {
// Read an integer from the provided filepath and write it in the address
FILE *fp;
if((fp = fopen(filepath, "r")) != NULL){
if(fscanf(fp, "%d", output) != EOF){
*output = *output / 1000;
fclose(fp);
}
}else{
*output = 0;
}
}
void draw_cpu_temp(short core_no, core *cpu) {
// Copy prepared bitmap for the core. Cores are enumerated from 0. offset
// is warning/critical (orange/red) shift in the bitmap
short y_offset = core_no * 9;
copyXPMArea(0, 87 + cpu->offset, 23, 7, 4, 7 + y_offset); // "CPU"
// number of cpu
copyXPMArea(5 + core_no * 5, 65 + cpu->offset, 5, 7, 22, 7 + y_offset);
copyXPMArea(66, 65 + cpu->offset, 9, 7, 51, 7 + y_offset); // "°C"
display_values(cpu->temp, y_offset, cpu->offset); // temp
}
void draw_gpu_temp(core *gpu) {
copyXPMArea(23, 87 + gpu->offset, 23, 7, 4, 49);
copyXPMArea(66, 65 + gpu->offset , 9, 7, 51, 49);
display_values(gpu->temp, 42, gpu->offset);
}
void display_help(char *progname){
printf("Dockapp for monitoring CPU and Nvidia GPU temperatures.\n");
printf("Usage:\n\t%s [full path for temp in sysfs]\n\n", progname);
printf("As an optional parameter you can provide `temp_input' ");
printf("full path from sysfs,\ncorresponding to your gfx card ");
printf("to read temperature from. Otherwise\nfunctionality of ");
printf("nv-control will be used (package nvidia-settings).\n");
}
-46
View File
@@ -1,46 +0,0 @@
#define wmtemp_mask_width 64
#define wmtemp_mask_height 64
static char wmtemp_mask_bits[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F,
0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xFC, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0x3F, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F,
0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xFC, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0x3F, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F,
0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xFC, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0x3F, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F,
0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xFC, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0x3F, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F,
0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xFC, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0x3F, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F,
0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xFC, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0x3F, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F,
0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xFC, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0x3F, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F,
0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xFC, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0x3F, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F,
0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xFC, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0x3F, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F,
0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xFC, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0x3F, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F,
0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xFC, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0x3F, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F,
0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xFC, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0x3F, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F,
0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F,
0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xFC, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0x3F, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F,
0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xFC, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0x3F, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F,
0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xFC, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0x3F, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F,
0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xFC, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, };
-384
View File
@@ -1,384 +0,0 @@
/* XPM */
static char *wmtemp_master[] = {
/* columns rows colors chars-per-pixel */
"93 122 256 2 ",
" c black",
". c #0A3F00",
"X c #202020",
"o c #440000",
"O c #660000",
"+ c #542A00",
"@ c #177700",
"# c #7F7F07",
"$ c #004941",
"% c #007D71",
"& c #A50000",
"* c #A80000",
"= c #BF3F03",
"- c #C90000",
"; c #DF1F01",
": c #E00000",
"> c red",
", c #FA0400",
"< c #F50900",
"1 c #F10D00",
"2 c #EC1201",
"3 c #E81601",
"4 c #E31B01",
"5 c #DA2402",
"6 c #D62802",
"7 c #D12D02",
"8 c #CC3203",
"9 c #C83603",
"0 c #C33B03",
"q c #9F5F05",
"w c #BA4404",
"e c #B64804",
"r c #B14D04",
"t c #A85500",
"y c #AD5105",
"u c #A85605",
"i c #A35B05",
"p c #9A6406",
"a c #966806",
"s c #916D06",
"d c #8D7107",
"f c #887607",
"g c #847A07",
"h c #27B500",
"j c #3FBF0B",
"k c #5F9F09",
"l c #7A8408",
"z c #768808",
"x c #718D08",
"c c #6D9109",
"v c #689609",
"b c #649A09",
"n c #5BA30A",
"m c #56A80A",
"M c #51AD0A",
"N c #4DB10B",
"B c #48B60B",
"V c #44BA0B",
"C c #1FDF0D",
"Z c #3BC30C",
"A c #36C80C",
"S c #32CC0C",
"D c #2DD10D",
"F c #28D60D",
"G c #24DA0D",
"H c #1BE30E",
"J c #16E80E",
"K c #12EC0E",
"L c #0DF10F",
"P c #09F50F",
"I c #04FA0F",
"U c #00FF0F",
"Y c #3FFF00",
"T c #FF8200",
"R c blue",
"E c #188A86",
"W c #20B2AE",
"Q c #20B6AE",
"! c gray78",
"~ c black",
"^ c black",
"/ c black",
"( c black",
") c black",
"_ c black",
"` c black",
"' c black",
"] c black",
"[ c black",
"{ c black",
"} c black",
"| c black",
" . c black",
".. c black",
"X. c black",
"o. c black",
"O. c black",
"+. c black",
"@. c black",
"#. c black",
"$. c black",
"%. c black",
"&. c black",
"*. c black",
"=. c black",
"-. c black",
";. c black",
":. c black",
">. c black",
",. c black",
"<. c black",
"1. c black",
"2. c black",
"3. c black",
"4. c black",
"5. c black",
"6. c black",
"7. c black",
"8. c black",
"9. c black",
"0. c black",
"q. c black",
"w. c black",
"e. c black",
"r. c black",
"t. c black",
"y. c black",
"u. c black",
"i. c black",
"p. c black",
"a. c black",
"s. c black",
"d. c black",
"f. c black",
"g. c black",
"h. c black",
"j. c black",
"k. c black",
"l. c black",
"z. c black",
"x. c black",
"c. c black",
"v. c black",
"b. c black",
"n. c black",
"m. c black",
"M. c black",
"N. c black",
"B. c black",
"V. c black",
"C. c black",
"Z. c black",
"A. c black",
"S. c black",
"D. c black",
"F. c black",
"G. c black",
"H. c black",
"J. c black",
"K. c black",
"L. c black",
"P. c black",
"I. c black",
"U. c black",
"Y. c black",
"T. c black",
"R. c black",
"E. c black",
"W. c black",
"Q. c black",
"!. c black",
"~. c black",
"^. c black",
"/. c black",
"(. c black",
"). c black",
"_. c black",
"`. c black",
"'. c black",
"]. c black",
"[. c black",
"{. c black",
"}. c black",
"|. c black",
" X c black",
".X c black",
"XX c black",
"oX c black",
"OX c black",
"+X c black",
"@X c black",
"#X c black",
"$X c black",
"%X c black",
"&X c black",
"*X c black",
"=X c black",
"-X c black",
";X c black",
":X c black",
">X c black",
",X c black",
"<X c black",
"1X c black",
"2X c black",
"3X c black",
"4X c black",
"5X c black",
"6X c black",
"7X c black",
"8X c black",
"9X c black",
"0X c black",
"qX c black",
"wX c black",
"eX c black",
"rX c black",
"tX c black",
"yX c black",
"uX c black",
"iX c black",
"pX c black",
"aX c black",
"sX c black",
"dX c black",
"fX c black",
"gX c black",
"hX c black",
"jX c black",
"kX c black",
"lX c black",
"zX c black",
"xX c black",
"cX c black",
"vX c black",
"bX c black",
"nX c black",
"mX c black",
"MX c black",
"NX c black",
"BX c black",
"VX c black",
"CX c black",
"ZX c black",
"AX c black",
"SX c black",
"DX c black",
"FX c black",
"GX c black",
"HX c black",
"JX c black",
"KX c black",
"LX c black",
"PX c #57627A",
"IX c #B4B4B4",
"UX c white",
/* pixels */
"R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"R R X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X ! R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"R R X X Q Q Q X X % Q Q Q X X % $ $ $ % X X $ $ $ % X X X X X $ $ $ X X X X $ $ $ X X X X $ $ $ X X X Q X X X Q Q Q X X ! R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"R R X Q X X X Q X Q X X X Q X Q X X X Q X $ X X X Q X X X X $ X X X $ X X $ X X X $ X X $ X X X $ X Q X Q X Q X X X Q X ! R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"R R X Q X X X $ X Q X X X Q X Q X X X Q X $ X X X Q X X X X $ X X X $ X X $ X X X $ X X $ X X X $ X X Q X X Q X X X $ X ! R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"R R X % $ $ $ X X % Q Q Q X X % $ $ $ % X X $ $ $ % X X X X X $ $ $ X X X X $ $ $ X X X X $ $ $ X X X X X X % $ $ $ X X ! R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"R R X Q X X X $ X Q X X X $ X Q X X X Q X $ X X X Q X X X X $ X X X $ X X $ X X X $ X X $ X X X $ X X X X X Q X X X $ X ! R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"R R X Q X X X Q X Q X X X $ X Q X X X Q X $ X X X Q X X X X $ X X X $ X X $ X X X $ X X $ X X X $ X X X X X Q X X X Q X ! R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"R R X X Q Q Q X X % $ $ $ X X % Q Q Q % X X $ $ $ % X X X X X $ $ $ X X X X $ $ $ X X X X $ $ $ X X X X X X X Q Q Q X X ! R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"R R X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X ! R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"R R X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X ! R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"R R X X Q Q Q X X % Q Q Q X X % $ $ $ % X % Q Q Q % X X X X X $ $ $ X X X X $ $ $ X X X X $ $ $ X X X Q X X X Q Q Q X X ! R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"R R X Q X X X Q X Q X X X Q X Q X X X Q X $ X X X Q X X X X $ X X X $ X X $ X X X $ X X $ X X X $ X Q X Q X Q X X X Q X ! R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"R R X Q X X X $ X Q X X X Q X Q X X X Q X $ X X X Q X X X X $ X X X $ X X $ X X X $ X X $ X X X $ X X Q X X Q X X X $ X ! R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"R R X % $ $ $ X X % Q Q Q X X % $ $ $ % X % Q Q Q % X X X X X $ $ $ X X X X $ $ $ X X X X $ $ $ X X X X X X % $ $ $ X X ! R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"R R X Q X X X $ X Q X X X $ X Q X X X Q X Q X X X $ X X X X $ X X X $ X X $ X X X $ X X $ X X X $ X X X X X Q X X X $ X ! R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"R R X Q X X X Q X Q X X X $ X Q X X X Q X Q X X X $ X X X X $ X X X $ X X $ X X X $ X X $ X X X $ X X X X X Q X X X Q X ! R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"R R X X Q Q Q X X % $ $ $ X X X Q Q Q X X % Q Q Q % X X X X X $ $ $ X X X X $ $ $ X X X X $ $ $ X X X X X X X Q Q Q X X ! R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"R R X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X ! R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"R R X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X ! R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"R R X X Q Q Q X X % Q Q Q X X % $ $ $ % X % Q Q Q % X X X X X $ $ $ X X X X $ $ $ X X X X $ $ $ X X X Q X X X Q Q Q X X ! R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"R R X Q X X X Q X Q X X X Q X Q X X X Q X $ X X X Q X X X X $ X X X $ X X $ X X X $ X X $ X X X $ X Q X Q X Q X X X Q X ! R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"R R X Q X X X $ X Q X X X Q X Q X X X Q X $ X X X Q X X X X $ X X X $ X X $ X X X $ X X $ X X X $ X X Q X X Q X X X $ X ! R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"R R X % $ $ $ X X % Q Q Q X X % $ $ $ % X % Q Q Q % X X X X X $ $ $ X X X X $ $ $ X X X X $ $ $ X X X X X X % $ $ $ X X ! R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"R R X Q X X X $ X Q X X X $ X Q X X X Q X $ X X X Q X X X X $ X X X $ X X $ X X X $ X X $ X X X $ X X X X X Q X X X $ X ! R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"R R X Q X X X Q X Q X X X $ X Q X X X Q X $ X X X Q X X X X $ X X X $ X X $ X X X $ X X $ X X X $ X X X X X Q X X X Q X ! R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"R R X X Q Q Q X X % $ $ $ X X X Q Q Q X X % Q Q Q % X X X X X $ $ $ X X X X $ $ $ X X X X $ $ $ X X X X X X X Q Q Q X X ! R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"R R X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X ! R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"R R X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X ! R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"R R X X Q Q Q X X % Q Q Q X X % $ $ $ % X % $ $ $ % X X X X X $ $ $ X X X X $ $ $ X X X X $ $ $ X X X Q X X X Q Q Q X X ! R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"R R X Q X X X Q X Q X X X Q X Q X X X Q X Q X X X Q X X X X $ X X X $ X X $ X X X $ X X $ X X X $ X Q X Q X Q X X X Q X ! R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"R R X Q X X X $ X Q X X X Q X Q X X X Q X Q X X X Q X X X X $ X X X $ X X $ X X X $ X X $ X X X $ X X Q X X Q X X X $ X ! R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"R R X % $ $ $ X X % Q Q Q X X % $ $ $ % X % Q Q Q % X X X X X $ $ $ X X X X $ $ $ X X X X $ $ $ X X X X X X % $ $ $ X X ! R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"R R X Q X X X $ X Q X X X $ X Q X X X Q X $ X X X Q X X X X $ X X X $ X X $ X X X $ X X $ X X X $ X X X X X Q X X X $ X ! R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"R R X Q X X X Q X Q X X X $ X Q X X X Q X $ X X X Q X X X X $ X X X $ X X $ X X X $ X X $ X X X $ X X X X X Q X X X Q X ! R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"R R X X Q Q Q X X % $ $ $ X X X Q Q Q X X X $ $ $ % X X X X X $ $ $ X X X X $ $ $ X X X X $ $ $ X X X X X X X Q Q Q X X ! R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"R R X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X ! R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"R R ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"R R X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X ! R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"R R X X Q Q Q % X % Q Q Q X X % $ $ $ % X X $ $ $ X X X X X X $ $ $ X X X X $ $ $ X X X X $ $ $ X X X Q X X X Q Q Q X X ! R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"R R X Q X X X $ X Q X X X Q X Q X X X Q X $ X X X $ X X X X $ X X X $ X X $ X X X $ X X $ X X X $ X Q X Q X Q X X X Q X ! R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"R R X Q X X X $ X Q X X X Q X Q X X X Q X $ X X X $ X X X X $ X X X $ X X $ X X X $ X X $ X X X $ X X Q X X Q X X X $ X ! R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"R R X % $ $ Q Q X % Q Q Q X X % $ $ $ % X X $ $ $ X X X X X X $ $ $ X X X X $ $ $ X X X X $ $ $ X X X X X X % $ $ $ X X ! R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"R R X Q X X X Q X Q X X X $ X Q X X X Q X $ X X X $ X X X X $ X X X $ X X $ X X X $ X X $ X X X $ X X X X X Q X X X $ X ! R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"R R X Q X X X Q X Q X X X $ X Q X X X Q X $ X X X $ X X X X $ X X X $ X X $ X X X $ X X $ X X X $ X X X X X Q X X X Q X ! R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"R R X X Q Q Q X X % $ $ $ X X X Q Q Q X X X $ $ $ X X X X X X $ $ $ X X X X $ $ $ X X X X $ $ $ X X X X X X X Q Q Q X X ! R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"R R X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X ! R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"R R X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X ! R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"R R ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X . . . X X O O O X X X X X X R X X X X X X X X X X X X X X X X X X X X X X X X X R R ",
"X W W W X X $ $ $ E E W W W E E W W W E W $ $ $ W E W W W E E W W W E E W W W E E W W W E E W W W E . @ h @ . O & - & O X $ $ $ X R X Q X X X Q Q Q X X % Q % X % $ $ $ % X X W W W X R R ",
"W X X X W $ X X X W $ X X X W $ X X X W W X X X W W X X X $ W X X X $ $ X X X W W X X X W W X X X W . h Y h . O - > - O $ X X X $ R Q X Q X Q X X X Q X Q X $ X Q X X X Q X W X X X W R R ",
"W X X X W $ X X X W $ X X X W $ X X X W W X X X W W X X X $ W X X X $ $ X X X W W X X X W W X X X W . @ h @ . O & - & O $ X X X $ R X Q X X Q X X X $ X Q X $ X Q X X X Q X W X X X W R R ",
"E $ $ $ E X $ $ $ E E W W W E X W W W E E W W W E W W W W E E W W W E X $ $ $ E E W W W E E W W W E X . . . X X O O O X X $ $ $ X R X X X X % $ $ $ X X % Q % X % $ $ $ % X E $ $ $ E R R ",
"W X X X W $ X X X W W X X X $ $ X X X W $ X X X W $ X X X W W X X X W $ X X X W W X X X W $ X X X W R R R R R R R R R R $ X X X $ R X X X X Q X X X $ X Q X $ X Q X X X Q X W X X X W R R ",
"W X X X W $ X X X W W X X X $ $ X X X W $ X X X W $ X X X W W X X X W $ X X X W W X X X W $ X X X W R X W R X X R R R R $ X X X $ R X X X X Q X X X Q X Q X $ X % Q X Q % X W X X X W R R ",
"X W W W X X $ $ $ E E W W W E E W W W E X $ $ $ E E W W W E E W W W E X $ $ $ W E W W W E E W W W E R E W R X X R R R R X $ $ $ X R X X X X X Q Q Q X X X $ X X X % Q % X X X W W W X R R ",
"X : : : X X o o o * * : : : * * : : : * : o o o : * : : : * * : : : * * : : : * * : : : * * : : : * R R R R R R R R R R X o o o X R X : X X X : : : X X * : * X R R R R R R R R R R R R R ",
": X X X : o X X X : o X X X : o X X X : : X X X : : X X X o : X X X o o X X X : : X X X : : X X X : R R R R R R R R R R o X X X o R : X : X : X X X : X : X o X R R R R R R R R R R R R R ",
": X X X : o X X X : o X X X : o X X X : : X X X : : X X X o : X X X o o X X X : : X X X : : X X X : R R R R R R R R R R o X X X o R X : X X : X X X o X : X o X R R R R R R R R R R R R R ",
"* o o o * X o o o * * : : : * X : : : * * : : : * : : : : * * : : : * X o o o * * : : : * * : : : * R R R R R R R R R R X o o o X R X X X X * o o o X X * : * X R R R R R R R R R R R R R ",
": X X X : o X X X : : X X X o o X X X : o X X X : o X X X : : X X X : o X X X : : X X X : o X X X : R R R R R R R R R R o X X X o R X X X X : X X X o X : X o X R R R R R R R R R R R R R ",
": X X X : o X X X : : X X X o o X X X : o X X X : o X X X : : X X X : o X X X : : X X X : o X X X : R X : R X X R R R R o X X X o R X X X X : X X X : X : X o X R R R R R R R R R R R R R ",
"X : : : X X o o o * * : : : * * : : : * X o o o * * : : : * * : : : * X o o o : * : : : * * : : : * R * : R X X R R R R X o o o X R X X X X X : : : X X X o X X R R R R R R R R R R R R R ",
"X T T T X X + + + t t T T T t t T T T t T + + + T t T T T t t T T T t t T T T t t T T T t t T T T t R R R R R R R R R R X + + + X R X T X X X T T T X X t T t X R R R R R R R R R R R R R ",
"T X X X T + X X X T + X X X T + X X X T T X X X T T X X X + T X X X + + X X X T T X X X T T X X X T R R R R R R R R R R + X X X + R T X T X T X X X T X T X + X R R R R R R R R R R R R R ",
"T X X X T + X X X T + X X X T + X X X T T X X X T T X X X + T X X X + + X X X T T X X X T T X X X T R R R R R R R R R R + X X X + R X T X X T X X X + X T X + X R R R R R R R R R R R R R ",
"t + + + t X + + + t t T T T t X T T T t t T T T t T T T T t t T T T t X + + + t t T T T t t T T T t R R R R R R R R R R X + + + X R X X X X t + + + X X t T t X R R R R R R R R R R R R R ",
"T X X X T + X X X T T X X X + + X X X T + X X X T + X X X T T X X X T + X X X T T X X X T + X X X T R R R R R R R R R R + X X X + R X X X X T X X X + X T X + X R R R R R R R R R R R R R ",
"T X X X T + X X X T T X X X + + X X X T + X X X T + X X X T T X X X T + X X X T T X X X T + X X X T R X T R X X R R R R + X X X + R X X X X T X X X T X T X + X R R R R R R R R R R R R R ",
"X T T T X X + + + t t T T T t t T T T t X + + + t t T T T t t T T T t X + + + T t T T T t t T T T t R t T R X X R R R R X + + + X R X X X X X T T T X X X + X X R R R R R R R R R R R R R ",
"R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"X Q Q Q X X % Q Q Q X X % $ $ $ % X X $ $ $ X X Q Q Q % X % Q Q Q X X % $ $ $ % X X $ $ $ X % Q Q Q % X X Q Q Q X X % $ $ $ % X X $ $ $ X X $ $ $ E X E W W W E R R R R R R R R R R R R R ",
"Q X X X Q X Q X X X Q X Q X X X Q X $ X X X $ Q X X X $ X Q X X X Q X Q X X X Q X $ X X X $ Q X X X $ X Q X X X Q X Q X X X Q X $ X X X $ $ X X X W X $ X X X W R R R R R R R R R R R R R ",
"Q X X X $ X Q X X X Q X Q X X X Q X $ X X X $ Q X X X $ X Q X X X Q X Q X X X Q X $ X X X $ Q X X X $ X Q X X X Q X Q Q X X Q X $ X X X $ $ X X X W X $ X X X W R R R R R R R R R R R R R ",
"% $ $ $ X X % Q Q Q X X % $ $ $ % X X $ $ $ X % $ $ Q Q X % Q Q Q X X % $ $ $ % X X $ $ $ X % Q Q Q X X % Q Q Q % X % $ Q $ % X X $ $ $ X X $ $ $ E X E W W W E R R R R R R R R R R R R R ",
"Q X X X $ X Q X X X $ X Q X X X Q X $ X X X $ Q X X X Q X Q X X X $ X Q X X X Q X $ X X X $ Q X X X $ X Q X X X Q X Q X X Q Q X $ X X X $ $ X X X W X W X X X $ R R R R R R R R R R R R R ",
"Q X X X Q X Q X X X $ X Q X X X Q X $ X X X $ Q X X X Q X Q X X X $ X Q X X X Q X $ X X X $ Q X X X $ X Q X X X Q X Q X X X Q X $ X X X $ $ X X X W X W X X X $ R R R R R R R R R R R R R ",
"X Q Q Q X X % $ $ $ X X % Q Q Q % X X $ $ $ X X Q Q Q X X % $ $ $ X X X Q Q Q X X X $ $ $ X % $ $ $ X X % $ $ $ % X % $ $ $ % X X $ $ $ X X $ $ $ E X E W W W E R R R R R R R R R R R R R ",
"X : : : X X * : : : X X * o o o * X X o o o X X : : : * X * : : : X X * o o o * X X o o o X * : : : * X X : : : X X * o o o * X X o o o X X o o o * X * : : : * R R R R R R R R R R R R R ",
": X X X o X : X X X : X : X X X : X o X X X o : X X X o X : X X X : X : X X X : X o X X X o : X X X o X : X X X : X : X X X : X o X X X o o X X X : X o X X X : R R R R R R R R R R R R R ",
": X X X o X : X X X : X : X X X : X o X X X o : X X X o X : X X X : X : X X X : X o X X X o : X X X o X : X X X : X : : X X : X o X X X o o X X X : X o X X X : R R R R R R R R R R R R R ",
"* o o o X X * : : : X X * o o o * X X o o o X * o o : : X * : : : X X * o o o * X X o o o X * : : : X X * : : : * X * o : o * X X o o o X X o o o * X * : : : * R R R R R R R R R R R R R ",
": X X X o X : X X X o X : X X X : X o X X X o : X X X : X : X X X o X : X X X : X o X X X o : X X X o X : X X X : X : X X : : X o X X X o o X X X : X : X X X o R R R R R R R R R R R R R ",
": X X X o X : X X X o X : X X X : X o X X X o : X X X : X : X X X o X : X X X : X o X X X o : X X X o X : X X X : X : X X X : X o X X X o o X X X : X : X X X o R R R R R R R R R R R R R ",
"X : : : X X * o o o X X X : : : X X X o o o X X : : : X X * o o o X X X : : : X X X o o o X * o o o X X * o o o * X * o o o * X X o o o X X o o o * X * : : : * R R R R R R R R R R R R R ",
"X T T T X X t T T T X X t + + + t X X + + + X X T T T t X t T T T X X t + + + t X X + + + X t T T T t X X T T T X X t + + + t X X + + + X X + + + t X t T T T t R R R R R R R R R R R R R ",
"T X X X + X T X X X T X T X X X T X + X X X + T X X X + X T X X X T X T X X X T X + X X X + T X X X + X T X X X T X T X X X T X + X X X + + X X X T X + X X X T R R R R R R R R R R R R R ",
"T X X X + X T X X X T X T X X X T X + X X X + T X X X + X T X X X T X T X X X T X + X X X + T X X X + X T X X X T X T T X X T X + X X X + + X X X T X + X X X T R R R R R R R R R R R R R ",
"t + + + X X t T T T X X t + + + t X X + + + X t + + T T X t T T T X X t + + + t X X + + + X t T T T X X t T T T t X t + T + t X X + + + X X + + + t X t T T T t R R R R R R R R R R R R R ",
"T X X X + X T X X X + X T X X X T X + X X X + T X X X T X T X X X + X T X X X T X + X X X + T X X X + X T X X X T X T X X T T X + X X X + + X X X T X T X X X + R R R R R R R R R R R R R ",
"T X X X + X T X X X + X T X X X T X + X X X + T X X X T X T X X X + X T X X X T X + X X X + T X X X + X T X X X T X T X X X T X + X X X + + X X X T X T X X X + R R R R R R R R R R R R R ",
"X T T T X X t + + + X X X T T T X X X + + + X X T T T X X t + + + X X X T T T X X X + + + X t + + + X X t + + + t X t + + + t X X + + + X X + + + t X t T T T t R R R R R R R R R R R R R ",
"R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"U U I P L K J H C G F D S A Z j V B N M m n k b v c x z l # g f d s a p q i u y r e w = 0 9 8 7 6 5 ; 4 3 2 1 < , > R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"U U I P L K J H C G F D S A Z j V B N M m n k b v c x z l # g f d s a p q i u y r e w = 0 9 8 7 6 5 ; 4 3 2 1 < , > R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"U U I P L K J H C G F D S A Z j V B N M m n k b v c x z l # g f d s a p q i u y r e w = 0 9 8 7 6 5 ; 4 3 2 1 < , > R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"U U I P L K J H C G F D S A Z j V B N M m n k b v c x z l # g f d s a p q i u y r e w = 0 9 8 7 6 5 ; 4 3 2 1 < , > R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"U U I P L K J H C G F D S A Z j V B N M m n k b v c x z l # g f d s a p q i u y r e w = 0 9 8 7 6 5 ; 4 3 2 1 < , > R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"U U I P L K J H C G F D S A Z j V B N M m n k b v c x z l # g f d s a p q i u y r e w = 0 9 8 7 6 5 ; 4 3 2 1 < , > R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R ",
"X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R "
};
-17
View File
@@ -1,17 +0,0 @@
# wmtemp conf file
cpu1_path = /sys/devices/platform/coretemp.0/hwmon/hwmon2/temp2_input
cpu1_critical = 80
cpu1_warning = 65
cpu2_path = /sys/devices/platform/coretemp.0/hwmon/hwmon2/temp3_input
cpu2_critical = 80
cpu2_warning = 65
cpu3_path = /sys/devices/platform/coretemp.0/hwmon/hwmon2/temp4_input
cpu3_critical = 80
cpu3_warning = 65
cpu4_path = /sys/devices/platform/coretemp.0/hwmon/hwmon2/temp5_input
cpu4_critical = 80
cpu4_warning = 65
gpu_path = /sys/devices/virtual/hwmon/hwmon1/temp4_input
gpu_critical = 70
gpu_warning = 60
+5 -5
View File
@@ -1,25 +1,25 @@
# By RedSeb 1999, Liverbugg 2002
SRC = wmtemp.c ../wmgeneral/wmgeneral.c ../wmgeneral/misc.c ../wmgeneral/list.c
SRC = wmtempnv.c ../wmgeneral/wmgeneral.c ../wmgeneral/misc.c ../wmgeneral/list.c
EXE = wmtemp
EXE = wmtempnv
OBJ = $(SRC:.c=.o)
CFLAGS = -Wall -O3
LIB = -L/usr/X11R6/lib -lXpm -lXext -lX11
LIB = -L/usr/X11R6/lib -lXpm -lXext -lX11 -lsensors
INSTALL = /usr/bin/install
CC = gcc
all: $(OBJ)
$(CC) $(CFLAGS) -o $(EXE) $(OBJ) $(LIB)
$(CC) -o $(EXE) $(OBJ) $(LIB)
strip $(EXE)
$(OBJ): %.o : %.c
$(OBJ): %.o : %.c
$(CC) $(CFLAGS) -c -o $@ $<
clean:
+132
View File
@@ -0,0 +1,132 @@
/*
* wmtempnv: a sensor monitor for WindowMaker. this little app is mainly based
* on wmsensormon and other simple dockapps.
*
* version = 0.4
*
* requirements: configured lm_sensors, sensor program and nouveau
*
* licence: gpl
*/
#include <sys/param.h>
#include <sys/types.h>
#include "standards.h"
#include <X11/Xlib.h>
#include <X11/xpm.h>
#include <X11/extensions/shape.h>
#include <string.h>
#include "../wmgeneral/wmgeneral.h"
#include "../wmgeneral/misc.h"
#include "wmtempnv_master2.xpm"
#include "wmtempnv_mask.xbm"
#define MAXSTRLEN 8
#define TEMP 40
#define TEMP_OVER 47
#define GPU_T 70
#define GPU_T_OVER 85
void display_values(int, int, int);
int get_temp(int core_number);
int get_offset(int temp, int cpu);
int main(int argc, char **argv){
int temp1=0, temp2=0, temp3=0;
/* offset is one of 0 (normal), 7 (alert), 14 (warning) */
int offset1=0, offset2=0, offset3=0;
int counter = 0;
openXwindow(argc, argv, wmtempnv_master2_xpm, wmtempnv_mask_bits, wmtempnv_mask_width, wmtempnv_mask_height);
while(TRUE){
if(counter==0){
temp1 = get_temp(0);
offset1 = get_offset(temp1, 1);
temp2 = get_temp(1);
offset2 = get_offset(temp2, 1);
temp3 = get_temp(2) / 1000;
offset3 = get_offset(temp3, 0);
counter = 200;
}
// core 1
copyXPMArea(0, 87 + offset1, 23, 7, 4, 7); // LCD: "CPU"
copyXPMArea(69, 87 + offset1, 5, 7, 22, 7); // LCD: number of cpu
copyXPMArea(66, 65 + offset1, 9, 7, 51, 7); // LCD: "°C"
display_values(temp1, 0, offset1);
// core 2
copyXPMArea(0, 87 + offset2, 23, 7, 4, 21);
copyXPMArea(75, 87 + offset2, 5, 7, 22, 21);
copyXPMArea(66, 65 + offset2, 9, 7, 51, 21);
display_values(temp2, 14, offset2);
// gpu
copyXPMArea(23, 87 + offset3, 23, 7, 4, 35);
copyXPMArea(66, 65 + offset3, 9, 7, 51, 35);
display_values(temp3, 28, offset3);
RedrawWindow();
counter--;
usleep(5000);
}
}
int get_offset(int temp, int cpu){
int alt, wrn;
if(cpu == 1){
wrn = TEMP;
alt = TEMP_OVER;
}else{
wrn = GPU_T;
alt = GPU_T_OVER;
}
if(temp >= alt){
return 7; // Alert
}else if(temp >= wrn){
return 14; // Warning
}else{
return 0; // Normal
}
}
void display_values(int temp, int offset, int offset2){
char text[5], num1, num2, num3, num4;
sprintf(text, "%03d", temp);
num1 = (text[0] - '0');
num2 = (text[1] - '0');
num3 = (text[2] - '0');
num4 = (text[3] - '0');
if(num1)
copyXPMArea(5 * num1, 65 + offset2, 5, 7, 31, 7 + offset);
else
copyXPMArea(60, 65 + offset2, 5, 7, 31, 7 + offset);
copyXPMArea(5 * num2, 65 + offset2, 5, 7, 38, 7 + offset);
copyXPMArea(5 * num3, 65 + offset2, 5, 7, 45, 7 + offset);
copyXPMArea(5 * num4, 65 + offset2, 5, 7, 51, 7 + offset);
}
int get_temp(int core_number){
// Core temperature. argument is core number. core no.2 is GPU
FILE *file;
int core=0;
char cmd[] = " ";
if(core_number==2){
sprintf(cmd, "echo `cat /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/hwmon/hwmon0/temp1_input`");
}else{
sprintf(cmd, "echo `sensors |grep 'Core %d'|cut -d ':' -f 2|cut -d '.' -f 1`", core_number);
}
file = popen(cmd, "r");
while (! feof(file)) {
char line[MAXSTRLEN + 1];
bzero(line, MAXSTRLEN + 1);
fgets(line, MAXSTRLEN, file);
if(line[0] != 0){
sscanf(line, "%d", &core);
}
}
pclose(file);
return core;
}
+46
View File
@@ -0,0 +1,46 @@
#define wmtempnv_mask_width 64
#define wmtempnv_mask_height 64
static const char wmtempnv_mask_bits[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f,
0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xfc, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0x3f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f,
0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xfc, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0x3f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f,
0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xfc, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0x3f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f,
0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xfc, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0x3f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f,
0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xfc, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0x3f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f,
0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xfc, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0x3f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f,
0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xfc, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0x3f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f,
0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xfc, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0x3f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f,
0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xfc, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0x3f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f,
0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xfc, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0x3f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f,
0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xfc, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0x3f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f,
0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xfc, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0x3f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f,
0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xfc, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0x3f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f,
0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xfc, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0x3f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f,
0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xfc, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
+205
View File
@@ -0,0 +1,205 @@
/* XPM */
static char * wmtempnv_master2_xpm[] = {
"93 122 80 1",
" c None",
". c #0000FF",
"+ c #000000",
"@ c #202020",
"# c #C7C7C7",
"$ c #20B6AE",
"% c #007D71",
"& c #004941",
"* c #0A3F00",
"= c #660000",
"- c #20B2AE",
"; c #188A86",
"> c #177700",
", c #27B500",
"' c #A50000",
") c #C90000",
"! c #3FFF00",
"~ c #FF0000",
"{ c #E00000",
"] c #440000",
"^ c #A80000",
"/ c #FF8200",
"( c #542A00",
"_ c #A85500",
": c #00FF0F",
"< c #04FA0F",
"[ c #09F50F",
"} c #0DF10F",
"| c #12EC0E",
"1 c #16E80E",
"2 c #1BE30E",
"3 c #1FDF0D",
"4 c #24DA0D",
"5 c #28D60D",
"6 c #2DD10D",
"7 c #32CC0C",
"8 c #36C80C",
"9 c #3BC30C",
"0 c #3FBF0B",
"a c #44BA0B",
"b c #48B60B",
"c c #4DB10B",
"d c #51AD0A",
"e c #56A80A",
"f c #5BA30A",
"g c #5F9F09",
"h c #649A09",
"i c #689609",
"j c #6D9109",
"k c #718D08",
"l c #768808",
"m c #7A8408",
"n c #7F7F07",
"o c #847A07",
"p c #887607",
"q c #8D7107",
"r c #916D06",
"s c #966806",
"t c #9A6406",
"u c #9F5F05",
"v c #A35B05",
"w c #A85605",
"x c #AD5105",
"y c #B14D04",
"z c #B64804",
"A c #BA4404",
"B c #BF3F03",
"C c #C33B03",
"D c #C83603",
"E c #CC3203",
"F c #D12D02",
"G c #D62802",
"H c #DA2402",
"I c #DF1F01",
"J c #E31B01",
"K c #E81601",
"L c #EC1201",
"M c #F10D00",
"N c #F50900",
"O c #FA0400",
"................................................................+............................",
"................................................................+............................",
"................................................................+............................",
"................................................................+............................",
"................................................................+............................",
"..++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++..+............................",
"..+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#..+............................",
"..+@@$$$@@%$$$@@%&&&%@@&&&%@@@@@&&&@@@@&&&@@@@&&&@@@$@@@$$$@@#..+............................",
"..+@$@@@$@$@@@$@$@@@$@&@@@$@@@@&@@@&@@&@@@&@@&@@@&@$@$@$@@@$@#..+............................",
"..+@$@@@&@$@@@$@$@@@$@&@@@$@@@@&@@@&@@&@@@&@@&@@@&@@$@@$@@@&@#..+............................",
"..+@%&&&@@%$$$@@%&&&%@@&&&%@@@@@&&&@@@@&&&@@@@&&&@@@@@@%&&&@@#..+............................",
"..+@$@@@&@$@@@&@$@@@$@&@@@$@@@@&@@@&@@&@@@&@@&@@@&@@@@@$@@@&@#..+............................",
"..+@$@@@$@$@@@&@$@@@$@&@@@$@@@@&@@@&@@&@@@&@@&@@@&@@@@@$@@@$@#..+............................",
"..+@@$$$@@%&&&@@%$$$%@@&&&%@@@@@&&&@@@@&&&@@@@&&&@@@@@@@$$$@@#..+............................",
"..+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#..+............................",
"..+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#..+............................",
"..############################################################..+............................",
"................................................................+............................",
"................................................................+............................",
"..++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++..+............................",
"..+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#..+............................",
"..+@@$$$@@%$$$@@%&&&%@%$$$%@@@@@&&&@@@@&&&@@@@&&&@@@$@@@$$$@@#..+............................",
"..+@$@@@$@$@@@$@$@@@$@&@@@$@@@@&@@@&@@&@@@&@@&@@@&@$@$@$@@@$@#..+............................",
"..+@$@@@&@$@@@$@$@@@$@&@@@$@@@@&@@@&@@&@@@&@@&@@@&@@$@@$@@@&@#..+............................",
"..+@%&&&@@%$$$@@%&&&%@%$$$%@@@@@&&&@@@@&&&@@@@&&&@@@@@@%&&&@@#..+............................",
"..+@$@@@&@$@@@&@$@@@$@$@@@&@@@@&@@@&@@&@@@&@@&@@@&@@@@@$@@@&@#..+............................",
"..+@$@@@$@$@@@&@$@@@$@$@@@&@@@@&@@@&@@&@@@&@@&@@@&@@@@@$@@@$@#..+............................",
"..+@@$$$@@%&&&@@@$$$@@%$$$%@@@@@&&&@@@@&&&@@@@&&&@@@@@@@$$$@@#..+............................",
"..+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#..+............................",
"..+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#..+............................",
"..############################################################..+............................",
"................................................................+............................",
"................................................................+............................",
"..++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++..+............................",
"..+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#..+............................",
"..+@@$$$%@%$$$@@%&&&%@@&&&@@@@@@&&&@@@@&&&@@@@&&&@@@$@@@$$$@@#..+............................",
"..+@$@@@&@$@@@$@$@@@$@&@@@&@@@@&@@@&@@&@@@&@@&@@@&@$@$@$@@@$@#..+............................",
"..+@$@@@&@$@@@$@$@@@$@&@@@&@@@@&@@@&@@&@@@&@@&@@@&@@$@@$@@@&@#..+............................",
"..+@%&&$$@%$$$@@%&&&%@@&&&@@@@@@&&&@@@@&&&@@@@&&&@@@@@@%&&&@@#..+............................",
"..+@$@@@$@$@@@&@$@@@$@&@@@&@@@@&@@@&@@&@@@&@@&@@@&@@@@@$@@@&@#..+............................",
"..+@$@@@$@$@@@&@$@@@$@&@@@&@@@@&@@@&@@&@@@&@@&@@@&@@@@@$@@@$@#..+............................",
"..+@@$$$@@%&&&@@@$$$@@@&&&@@@@@@&&&@@@@&&&@@@@&&&@@@@@@@$$$@@#..+............................",
"..+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#..+............................",
"..+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#..+............................",
"..############################################################..+............................",
"................................................................+............................",
"................................................................+............................",
"..++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++..+............................",
"..+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#..+............................",
"..+@@@&&&@@@&&&@@@&&&@@@&&&@@@@@@@&&&@@@@&&&@@@@&&&@@@@&&&@@@#..+............................",
"..+@@&@@@&@&@@@&@&@@@&@&@@@&@@@@@&@@@&@@&@@@&@@&@@@&@@&@@@&@@#..+............................",
"..+@@&@@@&@&@@@&@&@@@&@&@@@&@@@@@&@@@&@@&@@@&@@&@@@&@@&@@@&@@#..+............................",
"..+@@@&&&@@@&&&@@@&&&@@@&&&@@@@@@@&&&@@@@&&&@@@@&&&@@@@&&&@@@#..+............................",
"..+@@&@@@&@&@@@&@&@@@&@&@@@&@@@@@&@@@&@@&@@@&@@&@@@&@@&@@@&@@#..+............................",
"..+@@&@@@&@&@@@&@&@@@&@&@@@&@@@@@&@@@&@@&@@@&@@&@@@&@@&@@@&@@#..+............................",
"..+@@@&&&@@@&&&@@@&&&@@@&&&@@@@@@@&&&@@@@&&&@@@@&&&@@@@&&&@@@#..+............................",
"..+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#..+............................",
"..+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#..+............................",
"..############################################################..+............................",
"................................................................+............................",
"................................................................+............................",
"................................................................+............................",
"................................................................+............................",
"................................................................+............................",
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@***@@===@@@@@@.@@@@@@@@@@@@@@@@@@@@@@@@@..",
"@---@@&&&;;---;;---;-&&&-;---;;---;;---;;---;;---;*>,>*=')'=@&&&@.@$@@@$$$@@%$%@%&&&%@@---@..",
"-@@@-&@@@-&@@@-&@@@--@@@--@@@&-@@@&&@@@--@@@--@@@-*,!,*=)~)=&@@@&.$@$@$@@@$@$@&@$@@@$@-@@@-..",
"-@@@-&@@@-&@@@-&@@@--@@@--@@@&-@@@&&@@@--@@@--@@@-*>,>*=')'=&@@@&.@$@@$@@@&@$@&@$@@@$@-@@@-..",
";&&&;@&&&;;---;@---;;---;----;;---;@&&&;;---;;---;@***@@===@@&&&@.@@@@%&&&@@%$%@%&&&%@;&&&;..",
"-@@@-&@@@--@@@&&@@@-&@@@-&@@@--@@@-&@@@--@@@-&@@@-..........&@@@&.@@@@$@@@&@$@&@$@@@$@-@@@-..",
"-@@@-&@@@--@@@&&@@@-&@@@-&@@@--@@@-&@@@--@@@-&@@@-.@-.@@....&@@@&.@@@@$@@@$@$@&@%$@$%@-@@@-..",
"@---@@&&&;;---;;---;@&&&;;---;;---;@&&&-;---;;---;.;-.@@....@&&&@.@@@@@$$$@@@&@@@%$%@@@---@..",
"@{{{@@]]]^^{{{^^{{{^{]]]{^{{{^^{{{^^{{{^^{{{^^{{{^..........@]]]@.@{@@@{{{@@^{^@.............",
"{@@@{]@@@{]@@@{]@@@{{@@@{{@@@]{@@@]]@@@{{@@@{{@@@{..........]@@@].{@{@{@@@{@{@]@.............",
"{@@@{]@@@{]@@@{]@@@{{@@@{{@@@]{@@@]]@@@{{@@@{{@@@{..........]@@@].@{@@{@@@]@{@]@.............",
"^]]]^@]]]^^{{{^@{{{^^{{{^{{{{^^{{{^@]]]^^{{{^^{{{^..........@]]]@.@@@@^]]]@@^{^@.............",
"{@@@{]@@@{{@@@]]@@@{]@@@{]@@@{{@@@{]@@@{{@@@{]@@@{..........]@@@].@@@@{@@@]@{@]@.............",
"{@@@{]@@@{{@@@]]@@@{]@@@{]@@@{{@@@{]@@@{{@@@{]@@@{.@{.@@....]@@@].@@@@{@@@{@{@]@.............",
"@{{{@@]]]^^{{{^^{{{^@]]]^^{{{^^{{{^@]]]{^{{{^^{{{^.^{.@@....@]]]@.@@@@@{{{@@@]@@.............",
"@///@@(((__///__///_/(((/_///__///__///__///__///_..........@(((@.@/@@@///@@_/_@.............",
"/@@@/(@@@/(@@@/(@@@//@@@//@@@(/@@@((@@@//@@@//@@@/..........(@@@(./@/@/@@@/@/@(@.............",
"/@@@/(@@@/(@@@/(@@@//@@@//@@@(/@@@((@@@//@@@//@@@/..........(@@@(.@/@@/@@@(@/@(@.............",
"_(((_@(((__///_@///__///_////__///_@(((__///__///_..........@(((@.@@@@_(((@@_/_@.............",
"/@@@/(@@@//@@@((@@@/(@@@/(@@@//@@@/(@@@//@@@/(@@@/..........(@@@(.@@@@/@@@(@/@(@.............",
"/@@@/(@@@//@@@((@@@/(@@@/(@@@//@@@/(@@@//@@@/(@@@/.@/.@@....(@@@(.@@@@/@@@/@/@(@.............",
"@///@@(((__///__///_@(((__///__///_@(((/_///__///_._/.@@....@(((@.@@@@@///@@@(@@.............",
".............................................................................................",
"@$$$@@%$$$@@%&&&%@@&&&@@$$$%@%$$$@@%&&&%@@&&&@%$$$%@@$$$@@%&&&%@@&&&@@&&&;@;---;.............",
"$@@@$@$@@@$@$@@@$@&@@@&$@@@&@$@@@$@$@@@$@&@@@&$@@@&@$@@@$@$@@@$@&@@@&&@@@-@&@@@-.............",
"$@@@&@$@@@$@$@@@$@&@@@&$@@@&@$@@@$@$@@@$@&@@@&$@@@&@$@@@$@$$@@$@&@@@&&@@@-@&@@@-.............",
"%&&&@@%$$$@@%&&&%@@&&&@%&&$$@%$$$@@%&&&%@@&&&@%$$$@@%$$$%@%&$&%@@&&&@@&&&;@;---;.............",
"$@@@&@$@@@&@$@@@$@&@@@&$@@@$@$@@@&@$@@@$@&@@@&$@@@&@$@@@$@$@@$$@&@@@&&@@@-@-@@@&.............",
"$@@@$@$@@@&@$@@@$@&@@@&$@@@$@$@@@&@$@@@$@&@@@&$@@@&@$@@@$@$@@@$@&@@@&&@@@-@-@@@&.............",
"@$$$@@%&&&@@%$$$%@@&&&@@$$$@@%&&&@@@$$$@@@&&&@%&&&@@%&&&%@%&&&%@@&&&@@&&&;@;---;.............",
"@{{{@@^{{{@@^]]]^@@]]]@@{{{^@^{{{@@^]]]^@@]]]@^{{{^@@{{{@@^]]]^@@]]]@@]]]^@^{{{^.............",
"{@@@]@{@@@{@{@@@{@]@@@]{@@@]@{@@@{@{@@@{@]@@@]{@@@]@{@@@{@{@@@{@]@@@]]@@@{@]@@@{.............",
"{@@@]@{@@@{@{@@@{@]@@@]{@@@]@{@@@{@{@@@{@]@@@]{@@@]@{@@@{@{{@@{@]@@@]]@@@{@]@@@{.............",
"^]]]@@^{{{@@^]]]^@@]]]@^]]{{@^{{{@@^]]]^@@]]]@^{{{@@^{{{^@^]{]^@@]]]@@]]]^@^{{{^.............",
"{@@@]@{@@@]@{@@@{@]@@@]{@@@{@{@@@]@{@@@{@]@@@]{@@@]@{@@@{@{@@{{@]@@@]]@@@{@{@@@].............",
"{@@@]@{@@@]@{@@@{@]@@@]{@@@{@{@@@]@{@@@{@]@@@]{@@@]@{@@@{@{@@@{@]@@@]]@@@{@{@@@].............",
"@{{{@@^]]]@@@{{{@@@]]]@@{{{@@^]]]@@@{{{@@@]]]@^]]]@@^]]]^@^]]]^@@]]]@@]]]^@^{{{^.............",
"@///@@_///@@_(((_@@(((@@///_@_///@@_(((_@@(((@_///_@@///@@_(((_@@(((@@(((_@_///_.............",
"/@@@(@/@@@/@/@@@/@(@@@(/@@@(@/@@@/@/@@@/@(@@@(/@@@(@/@@@/@/@@@/@(@@@((@@@/@(@@@/.............",
"/@@@(@/@@@/@/@@@/@(@@@(/@@@(@/@@@/@/@@@/@(@@@(/@@@(@/@@@/@//@@/@(@@@((@@@/@(@@@/.............",
"_(((@@_///@@_(((_@@(((@_((//@_///@@_(((_@@(((@_///@@_///_@_(/(_@@(((@@(((_@_///_.............",
"/@@@(@/@@@(@/@@@/@(@@@(/@@@/@/@@@(@/@@@/@(@@@(/@@@(@/@@@/@/@@//@(@@@((@@@/@/@@@(.............",
"/@@@(@/@@@(@/@@@/@(@@@(/@@@/@/@@@(@/@@@/@(@@@(/@@@(@/@@@/@/@@@/@(@@@((@@@/@/@@@(.............",
"@///@@_(((@@@///@@@(((@@///@@_(((@@@///@@@(((@_(((@@_(((_@_(((_@@(((@@(((_@_///_.............",
".............................................................................................",
"::<[}|1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNO~...................................",
"::<[}|1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNO~...................................",
"::<[}|1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNO~...................................",
"::<[}|1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNO~...................................",
"::<[}|1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNO~...................................",
"::<[}|1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNO~...................................",
".............................................................................................",
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..................................",
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..................................",
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..................................",
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..................................",
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..................................",
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.................................."};